From be5f17ee22c2f090adbd459e57a92995275fb87e Mon Sep 17 00:00:00 2001 From: Yaohaixiao Date: Wed, 4 Sep 2024 16:53:33 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E8=B0=83=E6=95=B4=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=E7=BB=93=E6=9E=84=EF=BC=8C=E6=A8=A1=E5=9D=97=E5=8C=96=E7=BB=84?= =?UTF-8?q?=E7=BB=87=E5=AD=90=E7=BB=84=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- anchors.css | 34 - anchors.min.css | 2 - anchors.min.js | 2 - anchors.min.js.map | 1 - anchors/anchors.css | 1 + anchors.js => anchors/anchors.js | 51 +- anchors/anchors.less | 42 + anchors/anchors.min.css | 6 + anchors/anchors.min.js | 2 + anchors/anchors.min.js.map | 1 + .../utils/_removeHeading.js | 6 +- .../utils/_updateHeading.js | 10 +- api/js/observeResize.js | 4 +- api/pug/examples/anchors.pug | 21 - assets/asset-d4ef3ced | 6 + build/rollup.config.api.js | 91 +- build/rollup.config.lib.js | 52 +- build/rollup.plugin.config.js | 52 + .../_getChapterParentIdByDiffer.js | 0 .../_getChaptersWithCode.js | 2 +- getChapters.js => chapters/getChapters.js | 8 +- .../getChaptersByHeadings.js | 6 +- base.js => component.js | 200 +- docs/css/docs.css | 224 +- docs/css/docs.min.css | 4 +- docs/css/example.css | 224 +- docs/css/example.min.css | 4 +- docs/examples/anchors.html | 61 - docs/js/anchors.min.js | 2 - docs/js/anchors.min.js.map | 1 - docs/js/docs.min.js | 2 +- docs/js/docs.min.js.map | 2 +- docs/js/drawer.min.js | 2 - docs/js/drawer.min.js.map | 1 - docs/js/message.min.js | 2 - docs/js/message.min.js.map | 1 - docs/js/navigator.min.js | 2 - docs/js/navigator.min.js.map | 1 - docs/js/outline.min.js | 2 +- docs/js/outline.min.js.map | 2 +- docs/js/reader.min.js | 2 - docs/js/reader.min.js.map | 1 - docs/js/toolbar.min.js | 2 - docs/js/toolbar.min.js.map | 1 - drawer.css | 324 -- drawer.min.css | 2 - drawer.min.js | 2 - drawer.min.js.map | 1 - drawer/drawer.css | 1 + drawer.js => drawer/drawer.js | 40 +- drawer/drawer.less | 427 ++ drawer/drawer.min.css | 6 + drawer/drawer.min.js | 2 + drawer/drawer.min.js.map | 1 + gulpfile.js | 57 +- jsconfig.json | 2 +- message.css | 239 - message.min.css | 2 - message.min.js.map | 1 - message/message.css | 1 + message.js => message/message.js | 1169 ++--- message/message.less | 233 + message/message.min.css | 6 + message.min.js => message/message.min.js | 2 +- message/message.min.js.map | 1 + navigator.css | 153 - navigator.min.css | 2 - navigator.min.js | 2 - navigator.min.js.map | 1 - navigator/navigator.css | 1 + navigator.js => navigator/navigator.js | 54 +- navigator/navigator.less | 150 + navigator/navigator.min.css | 6 + navigator/navigator.min.js | 2 + navigator/navigator.min.js.map | 1 + .../utils}/_getScrollElement.js | 4 +- .../utils/_paintChapters.js | 4 +- outline.css | 1147 +---- outline.js | 22 +- outline.min.css | 4 +- outline.min.js | 2 +- outline.min.js.map | 2 +- package-lock.json | 3935 +++++++++++++---- package.json | 15 +- reader.min.js | 2 - reader.min.js.map | 1 - reader/reader.css | 3 + reader.js => reader/reader.js | 928 ++-- reader/reader.less | 259 ++ reader/reader.min.css | 6 + reader/reader.min.js | 2 + reader/reader.min.js.map | 1 + .../utils/_updateSiblingElements.js | 2 +- theme/outline.less | 12 +- toolbar.css | 160 - toolbar.min.css | 2 - toolbar.min.js.map | 1 - toolbar/toolbar.css | 1 + toolbar.js => toolbar/toolbar.js | 48 +- toolbar/toolbar.less | 175 + toolbar/toolbar.min.css | 6 + toolbar.min.js => toolbar/toolbar.min.js | 2 +- toolbar/toolbar.min.js.map | 1 + .../utils/_createButton.js | 6 +- utils/dom/getScrollElement.js | 33 + utils/dom/scrollTo.js | 18 +- zIndex.js => utils/dom/zIndex.js | 2 +- utils/event/at.js | 2 +- utils/event/getListeners.js | 2 +- utils/event/getTarget.js | 2 +- utils/event/on.js | 2 +- utils/event/purgeElement.js | 4 +- utils/icons/add.js | 4 +- utils/icons/createElement.js | 8 +- utils/icons/getSymbols.js | 2 +- utils/icons/remove.js | 2 +- utils/lang/cloneDeep.js | 4 +- utils/lang/later.js | 2 +- utils/lang/stripTags.js | 2 +- utils/lang/timeSlice.js | 2 +- utils/lang/trim.js | 2 +- utils/observer/_hasDirectSubscribersFor.js | 2 +- utils/observer/_removeSubscriber.js | 2 +- utils/observer/emit.js | 4 +- utils/observer/on.js | 5 +- utils/types/isArray.js | 2 +- utils/types/isFragment.js | 2 +- utils/types/isFunction.js | 2 +- utils/types/isHTML.js | 2 +- utils/types/isHTMLCollection.js | 2 +- utils/types/isTextNode.js | 2 +- utils/types/isTypedArray.js | 2 +- 132 files changed, 5864 insertions(+), 5043 deletions(-) delete mode 100644 anchors.css delete mode 100644 anchors.min.css delete mode 100644 anchors.min.js delete mode 100644 anchors.min.js.map create mode 100644 anchors/anchors.css rename anchors.js => anchors/anchors.js (87%) create mode 100644 anchors/anchors.less create mode 100644 anchors/anchors.min.css create mode 100644 anchors/anchors.min.js create mode 100644 anchors/anchors.min.js.map rename _removeHeading.js => anchors/utils/_removeHeading.js (85%) rename _updateHeading.js => anchors/utils/_updateHeading.js (85%) delete mode 100644 api/pug/examples/anchors.pug create mode 100644 assets/asset-d4ef3ced create mode 100644 build/rollup.plugin.config.js rename _getChapterParentIdByDiffer.js => chapters/_getChapterParentIdByDiffer.js (100%) rename _getChaptersWithCode.js => chapters/_getChaptersWithCode.js (93%) rename getChapters.js => chapters/getChapters.js (87%) rename getChaptersByHeadings.js => chapters/getChaptersByHeadings.js (95%) rename base.js => component.js (92%) delete mode 100644 docs/examples/anchors.html delete mode 100644 docs/js/anchors.min.js delete mode 100644 docs/js/anchors.min.js.map delete mode 100644 docs/js/drawer.min.js delete mode 100644 docs/js/drawer.min.js.map delete mode 100644 docs/js/message.min.js delete mode 100644 docs/js/message.min.js.map delete mode 100644 docs/js/navigator.min.js delete mode 100644 docs/js/navigator.min.js.map delete mode 100644 docs/js/reader.min.js delete mode 100644 docs/js/reader.min.js.map delete mode 100644 docs/js/toolbar.min.js delete mode 100644 docs/js/toolbar.min.js.map delete mode 100644 drawer.css delete mode 100644 drawer.min.css delete mode 100644 drawer.min.js delete mode 100644 drawer.min.js.map create mode 100644 drawer/drawer.css rename drawer.js => drawer/drawer.js (90%) create mode 100644 drawer/drawer.less create mode 100644 drawer/drawer.min.css create mode 100644 drawer/drawer.min.js create mode 100644 drawer/drawer.min.js.map delete mode 100644 message.css delete mode 100644 message.min.css delete mode 100644 message.min.js.map create mode 100644 message/message.css rename message.js => message/message.js (87%) create mode 100644 message/message.less create mode 100644 message/message.min.css rename message.min.js => message/message.min.js (72%) create mode 100644 message/message.min.js.map delete mode 100644 navigator.css delete mode 100644 navigator.min.css delete mode 100644 navigator.min.js delete mode 100644 navigator.min.js.map create mode 100644 navigator/navigator.css rename navigator.js => navigator/navigator.js (93%) create mode 100644 navigator/navigator.less create mode 100644 navigator/navigator.min.css create mode 100644 navigator/navigator.min.js create mode 100644 navigator/navigator.min.js.map rename {utils/dom => navigator/utils}/_getScrollElement.js (89%) rename _paintChapters.js => navigator/utils/_paintChapters.js (95%) delete mode 100644 reader.min.js delete mode 100644 reader.min.js.map create mode 100644 reader/reader.css rename reader.js => reader/reader.js (86%) create mode 100644 reader/reader.less create mode 100644 reader/reader.min.css create mode 100644 reader/reader.min.js create mode 100644 reader/reader.min.js.map rename _updateSiblingElements.js => reader/utils/_updateSiblingElements.js (90%) delete mode 100644 toolbar.css delete mode 100644 toolbar.min.css delete mode 100644 toolbar.min.js.map create mode 100644 toolbar/toolbar.css rename toolbar.js => toolbar/toolbar.js (92%) create mode 100644 toolbar/toolbar.less create mode 100644 toolbar/toolbar.min.css rename toolbar.min.js => toolbar/toolbar.min.js (66%) create mode 100644 toolbar/toolbar.min.js.map rename _createButton.js => toolbar/utils/_createButton.js (83%) create mode 100644 utils/dom/getScrollElement.js rename zIndex.js => utils/dom/zIndex.js (79%) diff --git a/anchors.css b/anchors.css deleted file mode 100644 index 13ac3253..00000000 --- a/anchors.css +++ /dev/null @@ -1,34 +0,0 @@ -/* ========== colors.theme - 基础颜色变量集合 ========== */ -.outline-heading { - position: relative; - z-index: 1; - overflow: hidden; -} -.outline-heading__anchor { - display: none; -} -.outline-heading__anchor:link, -.outline-heading__anchor:visited, -.outline-heading__anchor:hover { - color: #999; - text-decoration: none; -} -.outline-heading__anchor:hover { - color: #507afe; -} -.outline-heading:hover .outline-heading__anchor { - display: inline-block; -} -.outline-heading_start:hover { - overflow: visible; -} -.outline-heading_start .outline-heading__anchor { - position: absolute; - z-index: 2; - top: 50%; - -webkit-transform: translateY(-50%); - transform: translateY(-50%); - left: -1em; -} - -/*# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLzxpbnB1dCBjc3MgMT4iLCJhbmNob3JzLmxlc3MiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsbURBQW1EO0FDRW5EO0VBQ0UsbUJBQUE7RUFDQSxXQUFBO0VBQ0EsaUJBQUE7Q0RBRDtBQ0VDO0VBQ0UsY0FBQTtDREFIO0FDRUc7OztFQUdFLFlBQUE7RUFDQSxzQkFBQTtDREFMO0FDR0c7RUFDRSxlQUFBO0NEREw7QUNLQztFQUVJLHNCQUFBO0NESkw7QUNTRztFQUNFLGtCQUFBO0NEUEw7QUNLQztFQU1JLG1CQUFBO0VBQ0EsV0FBQTtFQUNBLFNBQUE7RUFDQSxvQ0FBQTtVQUFBLDRCQUFBO0VBQ0EsV0FBQTtDRFJMIiwiZmlsZSI6ImFuY2hvcnMuY3NzIiwic291cmNlc0NvbnRlbnQiOlsiLyogPT09PT09PT09PSBjb2xvcnMudGhlbWUgLSDln7rnoYDpopzoibLlj5jph4/pm4blkIggPT09PT09PT09PSAqL1xuLm91dGxpbmUtaGVhZGluZyB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgei1pbmRleDogMTtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi5vdXRsaW5lLWhlYWRpbmdfX2FuY2hvciB7XG4gIGRpc3BsYXk6IG5vbmU7XG59XG4ub3V0bGluZS1oZWFkaW5nX19hbmNob3I6bGluayxcbi5vdXRsaW5lLWhlYWRpbmdfX2FuY2hvcjp2aXNpdGVkLFxuLm91dGxpbmUtaGVhZGluZ19fYW5jaG9yOmhvdmVyIHtcbiAgY29sb3I6ICM5OTk7XG4gIHRleHQtZGVjb3JhdGlvbjogbm9uZTtcbn1cbi5vdXRsaW5lLWhlYWRpbmdfX2FuY2hvcjpob3ZlciB7XG4gIGNvbG9yOiAjNTA3YWZlO1xufVxuLm91dGxpbmUtaGVhZGluZzpob3ZlciAub3V0bGluZS1oZWFkaW5nX19hbmNob3Ige1xuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG59XG4ub3V0bGluZS1oZWFkaW5nX3N0YXJ0OmhvdmVyIHtcbiAgb3ZlcmZsb3c6IHZpc2libGU7XG59XG4ub3V0bGluZS1oZWFkaW5nX3N0YXJ0IC5vdXRsaW5lLWhlYWRpbmdfX2FuY2hvciB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgei1pbmRleDogMjtcbiAgdG9wOiA1MCU7XG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtNTAlKTtcbiAgbGVmdDogLTFlbTtcbn1cbiIsIkBpbXBvcnQgJ2NvbG9ycyc7XHJcblxyXG4ub3V0bGluZS1oZWFkaW5nIHtcclxuICBwb3NpdGlvbjogcmVsYXRpdmU7XHJcbiAgei1pbmRleDogMTtcclxuICBvdmVyZmxvdzogaGlkZGVuO1xyXG5cclxuICAmX19hbmNob3Ige1xyXG4gICAgZGlzcGxheTogbm9uZTtcclxuXHJcbiAgICAmOmxpbmssXHJcbiAgICAmOnZpc2l0ZWQsXHJcbiAgICAmOmhvdmVyIHtcclxuICAgICAgY29sb3I6IEBmb3VydGhfdGV4dF9jb2xvcjtcclxuICAgICAgdGV4dC1kZWNvcmF0aW9uOiBub25lO1xyXG4gICAgfVxyXG5cclxuICAgICY6aG92ZXIge1xyXG4gICAgICBjb2xvcjogQHByaW1hcnlfY29sb3I7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAmOmhvdmVyIHtcclxuICAgIC5vdXRsaW5lLWhlYWRpbmdfX2FuY2hvciB7XHJcbiAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcclxuICAgIH1cclxuICB9XHJcblxyXG4gICZfc3RhcnQge1xyXG4gICAgJjpob3ZlciB7XHJcbiAgICAgIG92ZXJmbG93OiB2aXNpYmxlO1xyXG4gICAgfVxyXG5cclxuICAgIC5vdXRsaW5lLWhlYWRpbmdfX2FuY2hvciB7XHJcbiAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcclxuICAgICAgei1pbmRleDogMjtcclxuICAgICAgdG9wOiA1MCU7XHJcbiAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtNTAlKTtcclxuICAgICAgbGVmdDogLTFlbTtcclxuICAgIH1cclxuICB9XHJcbn1cclxuIl19 */ diff --git a/anchors.min.css b/anchors.min.css deleted file mode 100644 index 840e126f..00000000 --- a/anchors.min.css +++ /dev/null @@ -1,2 +0,0 @@ -.outline-heading{position:relative;z-index:1;overflow:hidden}.outline-heading__anchor{display:none}.outline-heading__anchor:hover,.outline-heading__anchor:link,.outline-heading__anchor:visited{color:#999;text-decoration:none}.outline-heading__anchor:hover{color:#507afe}.outline-heading:hover .outline-heading__anchor{display:inline-block}.outline-heading_start:hover{overflow:visible}.outline-heading_start .outline-heading__anchor{position:absolute;z-index:2;top:50%;-webkit-transform:translateY(-50%);transform:translateY(-50%);left:-1em} -/*# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlcyI6WyJhbmNob3JzLmNzcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiA9PT09PT09PT09IGNvbG9ycy50aGVtZSAtIOWfuuehgOminOiJsuWPmOmHj+mbhuWQiCA9PT09PT09PT09ICovXG4ub3V0bGluZS1oZWFkaW5nIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICB6LWluZGV4OiAxO1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLm91dGxpbmUtaGVhZGluZ19fYW5jaG9yIHtcbiAgZGlzcGxheTogbm9uZTtcbn1cbi5vdXRsaW5lLWhlYWRpbmdfX2FuY2hvcjpsaW5rLFxuLm91dGxpbmUtaGVhZGluZ19fYW5jaG9yOnZpc2l0ZWQsXG4ub3V0bGluZS1oZWFkaW5nX19hbmNob3I6aG92ZXIge1xuICBjb2xvcjogIzk5OTtcbiAgdGV4dC1kZWNvcmF0aW9uOiBub25lO1xufVxuLm91dGxpbmUtaGVhZGluZ19fYW5jaG9yOmhvdmVyIHtcbiAgY29sb3I6ICM1MDdhZmU7XG59XG4ub3V0bGluZS1oZWFkaW5nOmhvdmVyIC5vdXRsaW5lLWhlYWRpbmdfX2FuY2hvciB7XG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbn1cbi5vdXRsaW5lLWhlYWRpbmdfc3RhcnQ6aG92ZXIge1xuICBvdmVyZmxvdzogdmlzaWJsZTtcbn1cbi5vdXRsaW5lLWhlYWRpbmdfc3RhcnQgLm91dGxpbmUtaGVhZGluZ19fYW5jaG9yIHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB6LWluZGV4OiAyO1xuICB0b3A6IDUwJTtcbiAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTUwJSk7XG4gICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC01MCUpO1xuICBsZWZ0OiAtMWVtO1xufVxuXG4vKiMgc291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247Y2hhcnNldD11dGY4O2Jhc2U2NCxleUoyWlhKemFXOXVJam96TENKemIzVnlZMlZ6SWpwYklpNHVMenhwYm5CMWRDQmpjM01nTVQ0aUxDSmhibU5vYjNKekxteGxjM01pWFN3aWJtRnRaWE1pT2x0ZExDSnRZWEJ3YVc1bmN5STZJa0ZCUVVFc2JVUkJRVzFFTzBGRFJXNUVPMFZCUTBVc2JVSkJRVUU3UlVGRFFTeFhRVUZCTzBWQlEwRXNhVUpCUVVFN1EwUkJSRHRCUTBWRE8wVkJRMFVzWTBGQlFUdERSRUZJTzBGRFJVYzdPenRGUVVkRkxGbEJRVUU3UlVGRFFTeHpRa0ZCUVR0RFJFRk1PMEZEUjBjN1JVRkRSU3hsUVVGQk8wTkVSRXc3UVVOTFF6dEZRVVZKTEhOQ1FVRkJPME5FU2t3N1FVTlRSenRGUVVORkxHdENRVUZCTzBORVVFdzdRVU5MUXp0RlFVMUpMRzFDUVVGQk8wVkJRMEVzVjBGQlFUdEZRVU5CTEZOQlFVRTdSVUZEUVN4dlEwRkJRVHRWUVVGQkxEUkNRVUZCTzBWQlEwRXNWMEZCUVR0RFJGSk1JaXdpWm1sc1pTSTZJbUZ1WTJodmNuTXVZM056SWl3aWMyOTFjbU5sYzBOdmJuUmxiblFpT2xzaUx5b2dQVDA5UFQwOVBUMDlQU0JqYjJ4dmNuTXVkR2hsYldVZ0xTRGxuN3Jub1lEcG9wem9pYkxsajVqcGg0L3BtNGJsa0lnZ1BUMDlQVDA5UFQwOVBTQXFMMXh1TG05MWRHeHBibVV0YUdWaFpHbHVaeUI3WEc0Z0lIQnZjMmwwYVc5dU9pQnlaV3hoZEdsMlpUdGNiaUFnZWkxcGJtUmxlRG9nTVR0Y2JpQWdiM1psY21ac2IzYzZJR2hwWkdSbGJqdGNibjFjYmk1dmRYUnNhVzVsTFdobFlXUnBibWRmWDJGdVkyaHZjaUI3WEc0Z0lHUnBjM0JzWVhrNklHNXZibVU3WEc1OVhHNHViM1YwYkdsdVpTMW9aV0ZrYVc1blgxOWhibU5vYjNJNmJHbHVheXhjYmk1dmRYUnNhVzVsTFdobFlXUnBibWRmWDJGdVkyaHZjanAyYVhOcGRHVmtMRnh1TG05MWRHeHBibVV0YUdWaFpHbHVaMTlmWVc1amFHOXlPbWh2ZG1WeUlIdGNiaUFnWTI5c2IzSTZJQ001T1RrN1hHNGdJSFJsZUhRdFpHVmpiM0poZEdsdmJqb2dibTl1WlR0Y2JuMWNiaTV2ZFhSc2FXNWxMV2hsWVdScGJtZGZYMkZ1WTJodmNqcG9iM1psY2lCN1hHNGdJR052Ykc5eU9pQWpOVEEzWVdabE8xeHVmVnh1TG05MWRHeHBibVV0YUdWaFpHbHVaenBvYjNabGNpQXViM1YwYkdsdVpTMW9aV0ZrYVc1blgxOWhibU5vYjNJZ2UxeHVJQ0JrYVhOd2JHRjVPaUJwYm14cGJtVXRZbXh2WTJzN1hHNTlYRzR1YjNWMGJHbHVaUzFvWldGa2FXNW5YM04wWVhKME9taHZkbVZ5SUh0Y2JpQWdiM1psY21ac2IzYzZJSFpwYzJsaWJHVTdYRzU5WEc0dWIzVjBiR2x1WlMxb1pXRmthVzVuWDNOMFlYSjBJQzV2ZFhSc2FXNWxMV2hsWVdScGJtZGZYMkZ1WTJodmNpQjdYRzRnSUhCdmMybDBhVzl1T2lCaFluTnZiSFYwWlR0Y2JpQWdlaTFwYm1SbGVEb2dNanRjYmlBZ2RHOXdPaUExTUNVN1hHNGdJSFJ5WVc1elptOXliVG9nZEhKaGJuTnNZWFJsV1NndE5UQWxLVHRjYmlBZ2JHVm1kRG9nTFRGbGJUdGNibjFjYmlJc0lrQnBiWEJ2Y25RZ0oyTnZiRzl5Y3ljN1hISmNibHh5WEc0dWIzVjBiR2x1WlMxb1pXRmthVzVuSUh0Y2NseHVJQ0J3YjNOcGRHbHZiam9nY21Wc1lYUnBkbVU3WEhKY2JpQWdlaTFwYm1SbGVEb2dNVHRjY2x4dUlDQnZkbVZ5Wm14dmR6b2dhR2xrWkdWdU8xeHlYRzVjY2x4dUlDQW1YMTloYm1Ob2IzSWdlMXh5WEc0Z0lDQWdaR2x6Y0d4aGVUb2dibTl1WlR0Y2NseHVYSEpjYmlBZ0lDQW1PbXhwYm1zc1hISmNiaUFnSUNBbU9uWnBjMmwwWldRc1hISmNiaUFnSUNBbU9taHZkbVZ5SUh0Y2NseHVJQ0FnSUNBZ1kyOXNiM0k2SUVCbWIzVnlkR2hmZEdWNGRGOWpiMnh2Y2p0Y2NseHVJQ0FnSUNBZ2RHVjRkQzFrWldOdmNtRjBhVzl1T2lCdWIyNWxPMXh5WEc0Z0lDQWdmVnh5WEc1Y2NseHVJQ0FnSUNZNmFHOTJaWElnZTF4eVhHNGdJQ0FnSUNCamIyeHZjam9nUUhCeWFXMWhjbmxmWTI5c2IzSTdYSEpjYmlBZ0lDQjlYSEpjYmlBZ2ZWeHlYRzVjY2x4dUlDQW1PbWh2ZG1WeUlIdGNjbHh1SUNBZ0lDNXZkWFJzYVc1bExXaGxZV1JwYm1kZlgyRnVZMmh2Y2lCN1hISmNiaUFnSUNBZ0lHUnBjM0JzWVhrNklHbHViR2x1WlMxaWJHOWphenRjY2x4dUlDQWdJSDFjY2x4dUlDQjlYSEpjYmx4eVhHNGdJQ1pmYzNSaGNuUWdlMXh5WEc0Z0lDQWdKanBvYjNabGNpQjdYSEpjYmlBZ0lDQWdJRzkyWlhKbWJHOTNPaUIyYVhOcFlteGxPMXh5WEc0Z0lDQWdmVnh5WEc1Y2NseHVJQ0FnSUM1dmRYUnNhVzVsTFdobFlXUnBibWRmWDJGdVkyaHZjaUI3WEhKY2JpQWdJQ0FnSUhCdmMybDBhVzl1T2lCaFluTnZiSFYwWlR0Y2NseHVJQ0FnSUNBZ2VpMXBibVJsZURvZ01qdGNjbHh1SUNBZ0lDQWdkRzl3T2lBMU1DVTdYSEpjYmlBZ0lDQWdJSFJ5WVc1elptOXliVG9nZEhKaGJuTnNZWFJsV1NndE5UQWxLVHRjY2x4dUlDQWdJQ0FnYkdWbWREb2dMVEZsYlR0Y2NseHVJQ0FnSUgxY2NseHVJQ0I5WEhKY2JuMWNjbHh1SWwxOSAqL1xuIl0sImZpbGUiOiJhbmNob3JzLm1pbi5jc3MifQ== */ diff --git a/anchors.min.js b/anchors.min.js deleted file mode 100644 index 0a554700..00000000 --- a/anchors.min.js +++ /dev/null @@ -1,2 +0,0 @@ -!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(t="undefined"!=typeof globalThis?globalThis:t||self).Anchors=e()}(this,(function(){"use strict";function t(t,e){(null==e||e>t.length)&&(e=t.length);for(var r=0,n=Array(e);r"string"==typeof t,s=t=>Object.prototype.toString.apply(t),o=t=>"function"==typeof t||"[object Function]"===s(t),i=t=>("[object Object]"===s(t)||"object"==typeof t||o(t))&&null!==t,l=t=>!!(i(t)&&t.nodeName&&t.tagName&&1===t.nodeType),c=t=>Array.isArray?Array.isArray(t):"[object Array]"===s(t),a=t=>{let e={};return null===t?null:(c(t)?e=Array.from(t):(e=Object.assign({},t),Object.keys(e).forEach((r=>e[r]=i(t[r])?a(t[r]):t[r]))),e)},h=(t,e=300)=>!!o(t)&&setTimeout((()=>{t()}),e),u=[];let d,m;function p(t){for(;t.timeRemaining()>0&&u.length;){const t=u.shift();if(!o(t))return!1;t()}u.length?d=requestIdleCallback(p):(d=0,o(m)&&(m(),m=null))}void 0===window.requestIdleCallback&&(window.requestIdleCallback=function(t){const e=Date.now();return h((function(){t({didTimeout:!1,timeRemaining:function(){return Math.max(0,50-(Date.now()-e))}})}),10)},window.cancelIdleCallback=function(t){clearTimeout(t)});const f=(t,e=null)=>{u.push(t),o(e)&&(m=e),d||requestIdleCallback(p)},y=t=>t*t,b=(t=null)=>{let e,r;return t?n(t)?r=document.querySelector(t):l(t)&&(r=t):(e=document.querySelectorAll("html,body"),r=e[0].scrollTop-e[1].scrollTop>=0?e[0]:e[1]),r},g=t=>{let e=t.offsetTop;return null!==t.offsetParent&&(e+=g(t.offsetParent)),e},v=(t,e="")=>{const r=e.replace(/^>/i,"");return!!(e&&r&&t)&&(t.matches?t.matches(r):!!t.msMatchesSelector&&t.msMatchesSelector(r))},z=t=>t.host&&t!==document&&t.host.nodeType?t.host:t.parentNode,x=["focusout","blur","focusin","focus","load","unload","mouseenter","mouseleave"],M=(t,e,r)=>{const n=x.indexOf(e)>-1;r._delegateListener&&delete(r=r._delegateListener)._delegateListener,function(t,e,r){const n=t._listeners;let s=-1;if(n.length<1)return!1;n.forEach(((t,n)=>{const o=t.fn;e===t.type&&(s=n,o===r&&(s=n))})),s>-1&&n.splice(s,1)}(t,e,r),t.removeEventListener(e,r,n)},w=function(t,e,r=!1){const s=n(t)?document.querySelector(t):t,o=s.childNodes,i=((t,e)=>{let r=t._listeners||[];return n(e)&&e&&(r=r.filter((t=>t.type===e))),r})(s,e);i.forEach((t=>{M(s,t.type,t.fn)})),(r||!0===e||1===arguments.length)&&s&&o&&o.forEach((t=>{l(t)&&w(t,e,r)}))},A=(t,e,r)=>{if(!o(r))return w(t,e),!1;M(t,e,r)},L=(t,e,r,n,s,o,i=!1)=>{const l=x.indexOf(r)>-1,c=function(l){const a=function(t){const e=t.target;return(r=e)&&3===r.nodeType?r.parentNode:r;var r}(l),h=((t,e,r,n)=>{const s=r||document;if(!t)return null;do{if(null!=e&&(e.startsWith(">")?t.parentNode===s&&v(t,e):v(t,e))||n&&t===s)return t;if(t===s)break}while(t=z(t))})(a,e,t);let u=o||t;l.delegateTarget=h,!0===o&&(u=s),h&&(!0===i&&A(t,r,c),n.call(u,l,s))};if(!t)return!1;t._listeners||(t._listeners=[]),t._listeners.push({el:t,selector:e,type:r,fn:c,data:s,context:o,capture:l}),n._delegateListener=c,t.addEventListener(r,c,l)},$=e(r,['','','','','','','','','','','','','','','','','','','','']),T=(t,s="icon")=>n(t)?((t,e="icon")=>{const r=/id="(.*?)"/,n=/^(\w+)-/;return $.find((s=>{const o=r.exec(s)[1];return n.exec(o)[1]===e&&o===("icon"===e?`${e}-${t}`:`${e}-icon-${t}`)}))})(t,s):e(r,$),E=(t="")=>{const e=document.body;let r=document.querySelector("#outline-icons"),s=[];(t=>{if(!t)return!1;c(t)&&t.length>0?t.forEach((t=>{-1===$.indexOf(t)&&n(t)&&$.push(t)})):n(t)&&$.push(t)})(t),s=T(),r?r.innerHTML=s.join(""):(r=document.createElement("div"),r.innerHTML=``,e.insertBefore(r.firstChild,e.firstChild))},S=t=>!!n(t)&&t.replace(/(^\s+)|(\s+$)/g,""),C=t=>{return!(!i(t)||!(l(t)||(t=>!(!i(t)||"[object NodeList]"!==s(t)))(t)||(e=t,i(e)&&"[object DocumentFragment]"===s(e))||(t=>!(!i(t)||!("[object Text]"===s(t)||t.tagName&&3===t.nodeType)))(t)));var e},k=(t,e)=>{const r=Object.prototype.hasOwnProperty;return t&&r.call(t,e)},j=(t,e)=>{const r=new RegExp("(\\s|^)"+e+"(\\s|$)");let n,s;return!!l(t)&&(n=t.className,!!n&&(s=t.classList,s&&s.contains?t.classList.contains(e):!!r.exec(n)))},H=(t,e,r)=>{let n=t.tagName.toLowerCase();switch(e){case"style":t.style.cssText=r;break;case"value":"input"===n||"textarea"===n?t.value=r:t.setAttribute(e,r);break;case"htmlFor":t.setAttribute("for",r);break;case"className":((t,e)=>{var r;let n,s;if(j(t,e))return!1;n=t.classList,null!==(r=n)&&void 0!==r&&r.add?e.indexOf(" ")>-1?e.split(" ").forEach((t=>{n.add(t)})):n.add(e):(s=t.className,s+=s.length>0?" "+e:e,t.className=s)})(t,r);break;case"innerHTML":t.innerHTML=r;break;case"innerText":t.innerText=r;break;default:t.setAttribute(e,r)}},N=(t,e)=>{if(!t||!i(e))return!1;Object.keys(e).forEach((r=>{const n=e[r];k(e,r)&&H(t,r,n)}))},_=(t,e={})=>{const r="outline-icon",s=e.size||0,o=e.color||"",i=e.iconSet||"",l=c(s)?s[0]:s,a=c(s)?s[1]:s,h=s?`width:${l}px;height:${a}px;`:"",u=o?h+`color:${o}`:h,d=e.attrs||{},m=document.createElement("i");let p,f="",y="";return n(t)?((t=>{const e=new RegExp("^\\s*(?:<\\?xml[^>]*>\\s*)?(?:<\\!doctype svg[^>]*\\s*(?:\\[?(?:\\s*]*>\\s*)*\\]?)*[^>]*>\\s*)?]*>[^]*<\\/svg>\\s*$\\s*$","i");return n(t)&&e.test(t)})(t)?y=t:(f=i&&"icon"!==i?`xlink:href="#${i}-icon-${t}"`:`xlink:href="#icon-${t}"`,y=``),m.innerHTML=y,d.className?d.className=`${r} ${d.className}`:d.className=r,N(m,d),p=m.querySelector("svg"),N(p,{"aria-hidden":!0,xmlns:"http://www.w3.org/2000/svg",class:"outline-icon__svg",width:200,height:200,style:u}),m):null},B=(t,e,r)=>{const s="outline-heading",l=r.hasAnchor||!0,a=r.isAtStart||!0,h=r.showCode||!1,u=r.chapterCode||"",d=r.anchorURL||"",m=r.anchorLinkFilter||null,p=`heading-${e}`,f={id:p,className:a?`${s} ${s}_start`:s,"data-id":e},y=S(t.innerHTML);let b,g,v;if(h&&(f.innerHTML=u+" "+y,f["data-code"]=u),N(t,f),!l)return!1;b=d||(o(m)?m(t.tagName.toLowerCase(),y,e):`#${p}`),v=((t,e={})=>_(t,e))("hash",{iconSet:"outline"}),g=((t,e,r)=>{const s=document.createDocumentFragment(),o=document.createElement(t),l=t=>C(t)||n(t),a=t=>{let e;if(!l(t))return!1;C(t)?e=t:n(t)&&(e=document.createTextNode(t)),s.appendChild(e)};return i(e)?N(o,e):c(e)&&e.every((t=>l(t)))?e.forEach((t=>{a(t)})):C(e)?a(e):n(e)&&a(document.createTextNode(e)),c(r)?r.forEach((t=>{a(t)})):a(r),o.appendChild(s),o})("a",{id:`anchor-${e}`,className:`${s}__anchor anchor-${e}`,href:b,target:d?"_blank":"self","data-id":e},v),t.appendChild(g)},O=(t,e)=>{var r;let n,s=t.className;if(!s||!j(t,e))return!1;n=t.classList,null!==(r=n)&&void 0!==r&&r.remove?n.remove(e):(s=S(s.replace(e,"")),t.className=s)},q=(t,e=!0,r=!0)=>{const s="outline-heading",o=t.innerHTML;let i;if(t.innerHTML=o.replace(/^\d+(\.?\d+)*\s?/gi,""),t.removeAttribute("id"),t.removeAttribute("data-id"),O(t,s),!e)return!1;var l;i=t.querySelector(`.${s}__anchor`),r&&O(t,`${s}_start`),l=S(t.className),n(l)&&""===l&&t.removeAttribute("class"),i&&t.removeChild(i)},F=(t,e=!1,r=null)=>{const s=/^\d(\.|(\.\d+)*)\s?/gi,i=[];let l=1,a=0,h="";return t.forEach(((t,c)=>{const u=t.tagName,d=u.replace(/h/i,"");let m=parseInt(d,10),p=-1;var f;m>l?(a+=1,p=1===a?-1:c-1):m===l||ma?1===m?(a=1,p=-1):p=i[c-1].pid:m<=a&&(1===m?a=1:(a-=l-m,a<=1&&(a=1)),p=1===a?-1:((t,e,r)=>{let n,s,o=t[r-1];for(s=0;s]+(>|$)/g,""):"")),e&&(h=S(h.replace(s,""))),o(r)&&(h=r(h)),i.push({id:c,pid:p,level:a,rel:`heading-${c}`,text:h,tagName:u})})),e?(t=>{const e={};return t.forEach((t=>{const r=JSON.stringify((t=>[t.pid])(t));e[r]=e[r]||[],e[r].push(t),t.index=e[r].length,-1===t.pid&&(t.code=String(t.index))})),Object.keys(e).forEach((t=>{e[t].forEach((t=>{const r=e[`[${t.id}]`];if(!r||!c(r))return!1;r.forEach((e=>{e.code=t.code+"."+e.index}))}))})),t})(i):i},I=t=>{const{articleElement:s,selector:i,showCode:c,chapterTextFilter:a,isTreeStructured:h}=t;let u=document.querySelector("#article"),d=[],m=[],p=null;return n(s)?u=document.querySelector(s):l(s)&&(u=s),u?(o(a)?p=a:!0===a&&(p=t=>t.replace(/\(.*?\)/,"()")),d=e(r,u.querySelectorAll(i||"h1,h2,h3,h4,h5,h6")),m=F(d,c,p),!0===h?((t,e,r)=>{const n={},s=[];return t.forEach(((t,r)=>{n[t[e]]=r,t.children=[]})),t.forEach((e=>{const o=t[n[e[r]]];-1!==e[r]?o.children.push(e):s.push(e)})),s})(m,"id","pid"):m):m},U={},R=t=>k(U,t)&&U[t].length>0,D=(t,e=!0)=>e?R(t):(t=>{let e=R(t),r=t.lastIndexOf(".");for(;!e&&-1!==r;)r=(t=t.substring(0,r)).lastIndexOf("."),e=R(t);return e})(t),V=(t,e,r=!0)=>{const n=t=>{if(!R(t))return!1;U[t].forEach((t=>{const r=["[object Int8Array]","[object Uint8Array]","[object Uint8ClampedArray]","[object Int16Array]","[object Uint16Array]","[object Int32Array]","[object Uint32Array]","[object Float32Array]","[object Float64Array]","[object BigInt64Array]","[object BigUint64Array]"].indexOf(s(e))>-1?e.toString():e;t.callback.call(t.context||t,r)}))},o=()=>{let e=t,r=t.lastIndexOf(".");for(;-1!==r;)e=e.substring(0,r),r=e.lastIndexOf("."),n(e);n(t),n("*")};if(!D(t))return!1;r?setTimeout(o,10):o()},P=(()=>{let t=0;return e=>(t+=1,e?e+"-"+t:"guid-"+t)})(),J=t=>{if(!k(U,t))return!1;delete U[t]},W=(t,e)=>{if(!D(t))return!1;e?(t=>{const e=Object.keys(U);if(!t||e.length<1)return!1;e.forEach((e=>{const r=U[e];let n;r.forEach(((e,s)=>{e.callback!==t&&e.token!==t||(n=e.topic,r.splice(-1,s))})),r.length<1&&J(n)}))})(e):J(t)};class G{constructor(t){this.attrs={},t&&this.initialize(t)}initialize(t){return this.attr(t).render().addListeners(),this}attr(t,e){const r=this.attrs;return n(t)?e&&k(r,t)?(r[t]=e,this):r[t]:i(t)?(s=r,o=t,Object.keys(o).forEach((t=>{k(o,t)&&(s[t]=o[t])})),this):0===arguments.length?r:this;var s,o}render(){return this}refresh(){return this}destroy(){return this.removeListeners(),this}reload(t){let e=this.attr();return t&&(e=this.attr(t)),this.destroy().initialize(e),this}$emit(t,e){return V(t,e),this}$on(t,e){return((t,e,r=null)=>{const n=P();let s="symbol"==typeof t?t.toString():t;o(e)&&(U[s]||(U[s]=[]),U[s].push({topic:s,callback:e,context:r,token:n}))})(t,e,this),this}$off(t,e){return W(t,e),this}addListeners(){return this}removeListeners(){return this}}class K extends G{constructor(t){super(),this._default(),t&&this.initialize(t)}_default(){return this.attrs=a(K.DEFAULTS),this.$articleElement=null,this.$scrollElement=null,this.$headings=[],this}initialize(t){let e,r,s,i;return this.attr(t),i=this.attr("articleElement"),r=this.attr("scrollElement"),e=this.attr("created"),n(i)?s=document.querySelector(i):l(i)&&(s=i),s?(this.$articleElement=s,this.$scrollElement=b(r),this.$headings=this.getHeadings(),this.$headings.length<1||(o(e)&&e.call(this),this.render().addListeners()),this):this}getHeadings(){const t=this.$articleElement,n=this.attr("selector");return e(r,t.querySelectorAll(n))}count(){return this.getHeadings().length}render(){const t=this.attr("articleElement"),e=this.attr("selector"),r=this.attr("showCode"),n=this.attr("chapterTextFilter"),s=this.attr("mounted"),i=I({articleElement:t,selector:e,showCode:r,chapterTextFilter:n});return E(),this._paint(i),o(s)&&s.call(this),this}erase(){return this._remove(),this}_paint(t){const n=400,s=this.attr("hasAnchor"),o=this.attr("isAtStart"),i=this.attr("showCode"),l=this.attr("anchorURL"),c=this.attr("anchorLinkFilter"),a=this.count(),h=e(r,this.$headings),u=(e,r)=>{e.forEach(((e,a)=>{const h=a+r*n,u=t[h].code;B(e,h,{hasAnchor:s,isAtStart:o,showCode:i,chapterCode:u,anchorURL:l,anchorLinkFilter:c})}))};let d=-1;if(a>n)for(d+=1,u(h.splice(0,n),0);h.length>0;){const t=h.splice(0,n);f((()=>{u(t,d+=1)}),(()=>{this.$emit("anchors:all:paint")}))}else u(h,0);return this}_remove(){const t=this.attr("hasAnchor"),e=this.attr("isAtStart");return this.$headings.forEach((r=>{q(r,t,e)})),this}refresh(t){const e=this.attr("articleElement"),r=this.attr("selector"),n=this.attr("showCode"),s=this.attr("chapterTextFilter");return this.$headings=this.getHeadings(),this.erase()._paint(t||I({articleElement:e,selector:r,showCode:n,chapterTextFilter:s})),this}scrollTo(t,e){return((t,e,r)=>{const n=b(t);let s=n.scrollTop,i=0;const l=e-s,c=n.scrollHeight,a=e-c<=0?e:c,h=t=>(o(r)&&r(t),!1),u=()=>{if(i+=1,l<0){if(s-=y(i),n.scrollTop=s,console.log("$scrollElement up",t,n,s,n.scrollTop),s<=e)return n.scrollTop=e,h(e)}else if(s+=y(i),n.scrollTop=s,console.log("$scrollElement down",t,n,s,n.scrollTop),s>=a)return n.scrollTop=a,h(a);requestAnimationFrame(u)};requestAnimationFrame(u)})(this.$scrollElement,t,e),this}destroy(){const t=this.attr("beforeDestroy"),e=this.attr("afterDestroy");return o(t)&&t.call(this),this.removeListeners()._remove()._default(),o(e)&&e.call(this),this}onAnchorTrigger(t){const e=this.attr("anchorURL"),r=this.attr("afterScroll"),n=this.attr("stickyHeight"),s=t.delegateTarget.parentNode,i=g(s)-(n+10),l=this.$scrollElement,c=l.scrollHeight-l.clientHeight;return this.scrollTo(i,(()=>{o(r)&&r.call(this,"anchor"),h((()=>{this.$emit("toolbar:update",{top:i,min:0,max:c})}))})),e||function(t){t.stopPropagation(),t.preventDefault()}(t),this}onRefresh(t){return this.refresh(t),this}addListeners(){const t=this.$articleElement;return this.count()<1||(L(t,".outline-heading__anchor","click",this.onAnchorTrigger,this,!0),this.$on("anchors:refresh",this.onRefresh)),this}removeListeners(){const t=this.$articleElement;return this.count()<1||(A(t,"click",this.onAnchorTrigger),this.$off("anchors:refresh",this.onRefresh)),this}}return K.DEFAULTS=a({scrollElement:"html,body",articleElement:"#article",selector:"h1,h2,h3,h4,h5,h6",stickyHeight:0,anchorURL:"",hasAnchor:!0,isAtStart:!0,showCode:!1,created:null,mounted:null,afterScroll:null,beforeDestroy:null,afterDestroy:null,chapterTextFilter:null,anchorLinkFilter:null}),K})); -//# sourceMappingURL=anchors.min.js.map diff --git a/anchors.min.js.map b/anchors.min.js.map deleted file mode 100644 index dc6bfd5d..00000000 --- a/anchors.min.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"anchors.min.js","sources":["utils/types/isString.js","utils/lang/toString.js","utils/types/isFunction.js","utils/types/isObject.js","utils/types/isElement.js","utils/types/isArray.js","utils/lang/cloneDeep.js","utils/lang/later.js","utils/lang/timeSlice.js","utils/lang/easeInQuad.js","utils/dom/_getScrollElement.js","utils/dom/offsetTop.js","utils/dom/matches.js","utils/dom/getParentOrHost.js","utils/event/enum.js","utils/event/_off.js","utils/event/_delete.js","utils/event/purgeElement.js","utils/event/getListeners.js","utils/event/off.js","utils/event/on.js","utils/event/getTarget.js","utils/dom/resolveTextNode.js","utils/dom/closest.js","utils/icons/symbols.js","utils/icons/defaults.js","utils/icons/getSymbols.js","utils/icons/getSymbol.js","utils/icons/paint.js","utils/icons/add.js","utils/lang/trim.js","utils/types/isDOM.js","utils/types/isHTMLCollection.js","utils/types/isFragment.js","utils/types/isTextNode.js","utils/lang/hasOwn.js","utils/dom/hasClass.js","utils/dom/setAttribute.js","utils/dom/addClass.js","utils/dom/setAttributes.js","utils/icons/createElement.js","utils/types/isSVG.js","_updateHeading.js","utils/icons/icon.js","utils/dom/createElement.js","utils/dom/removeClass.js","_removeHeading.js","utils/types/isEmpty.js","getChaptersByHeadings.js","utils/lang/stripTags.js","_getChapterParentIdByDiffer.js","_getChaptersWithCode.js","getChapters.js","utils/lang/toTree.js","utils/observer/_subscribers.js","utils/observer/_hasDirectSubscribersFor.js","utils/observer/has.js","utils/observer/_hasSubscribers.js","utils/observer/emit.js","utils/types/isTypedArray.js","utils/lang/guid.js","utils/observer/_removeSubscriber.js","utils/observer/off.js","utils/observer/_removeSubscriberByToken.js","base.js","utils/lang/extend.js","utils/observer/on.js","anchors.js","utils/dom/scrollTo.js","utils/event/stop.js"],"sourcesContent":["/**\r\n * 检测数据是否为 String 类型\r\n * ========================================================================\r\n * @method isArray\r\n * @param {*} str\r\n * @returns {boolean}\r\n */\r\nconst isString = (str) => {\r\n return typeof str === 'string'\r\n}\r\n\r\nexport default isString\r\n","/**\r\n * Object 对象原型上的 toString 方法\r\n * ========================================================================\r\n * @method toString\r\n * @param {*} val\r\n * @returns {string}\r\n */\r\nconst toString = (val) => {\r\n return Object.prototype.toString.apply(val)\r\n}\r\n\r\nexport default toString\r\n","import toString from '../lang/toString'\r\n\r\n/**\r\n * 检测测试数据是否为 Function 类型\r\n * ========================================================================\r\n * @method isFunction\r\n * @param {*} val - (必须)待检测的数据\r\n * @returns {boolean} 'val' 是 Function 类型返回 true,否则返回 false\r\n */\r\nconst isFunction = (val) => {\r\n return typeof val === 'function' || toString(val) === '[object Function]'\r\n}\r\n\r\nexport default isFunction\r\n","import toString from '../lang/toString'\r\nimport isFunction from './isFunction'\r\n\r\n/**\r\n * 检测数据是否为 Object 类型\r\n * ========================================================================\r\n * @method isObject\r\n * @param {*} o\r\n * @returns {boolean}\r\n */\r\nconst isObject = (o) => {\r\n return (\r\n (toString(o) === '[object Object]' ||\r\n typeof o === 'object' ||\r\n isFunction(o)) &&\r\n o !== null\r\n )\r\n}\r\n\r\nexport default isObject\r\n","import isObject from './isObject'\r\n\r\n/**\r\n * 检测数据是否为 HTMLElement DOM 节点\r\n * ========================================================================\r\n * @method isElement\r\n * @param {*} o\r\n * @returns {boolean}\r\n */\r\nconst isElement = (o) => {\r\n return !!(isObject(o) && o.nodeName && o.tagName && o.nodeType === 1)\r\n}\r\n\r\nexport default isElement\r\n","import toString from '../lang/toString'\r\n\r\n/**\r\n * 检测数据是否为 Array 类型\r\n * ========================================================================\r\n * @method isArray\r\n * @param {*} o\r\n * @returns {boolean}\r\n */\r\nconst isArray = (o) => {\r\n if (Array.isArray) {\r\n return Array.isArray(o)\r\n } else {\r\n return toString(o) === '[object Array]'\r\n }\r\n}\r\n\r\nexport default isArray\r\n","import isObject from '../types/isObject'\r\nimport isArray from '../types/isArray'\r\n\r\n/**\r\n * 深拷贝对象函数\r\n * ========================================================================\r\n * @methods cloneDeep\r\n * @param {Object} obj - 深拷贝的对象\r\n * @returns {Array|Object|*}\r\n *\r\n * @example\r\n * const arr = cloneDeep([2,3,4,6])\r\n * => [2,3,4,6]\r\n */\r\nconst cloneDeep = (obj) => {\r\n let clone = {}\r\n\r\n if (obj === null) {\r\n return null\r\n }\r\n\r\n if (isArray(obj)) {\r\n clone = Array.from(obj)\r\n } else {\r\n clone = Object.assign({}, obj)\r\n Object.keys(clone).forEach((key) => {\r\n return (clone[key] = isObject(obj[key]) ? cloneDeep(obj[key]) : obj[key])\r\n })\r\n }\r\n\r\n return clone\r\n}\r\n\r\nexport default cloneDeep\r\n","import isFunction from '../types/isFunction'\r\n\r\n/**\r\n * later - 延迟执行方法\r\n * ========================================================================\r\n * @method later\r\n * @param {Function} fn\r\n * @param {Number} [delay]\r\n * @returns {number|boolean}\r\n */\r\nconst later = (fn, delay = 300) => {\r\n if (!isFunction(fn)) {\r\n return false\r\n }\r\n\r\n return setTimeout(() => {\r\n fn()\r\n }, delay)\r\n}\r\n\r\nexport default later\r\n","/**\r\n * timeSlice.js 时间切片功能函数\r\n * ====================================================\r\n * Created By: Yaohaixiao\r\n * Update: 2023.09.04\r\n */\r\nimport isFunction from '../types/isFunction'\r\nimport later from './later'\r\n\r\nconst queue = []\r\nlet isHandling\r\nlet done\r\n\r\n// Shim from https://developers.google.com/web/updates/2015/08/using-requestidlecallback\r\nif (typeof window.requestIdleCallback === 'undefined') {\r\n window.requestIdleCallback = function (cb) {\r\n const start = Date.now()\r\n return later(function () {\r\n cb({\r\n didTimeout: false,\r\n timeRemaining: function () {\r\n return Math.max(0, 50 - (Date.now() - start))\r\n }\r\n })\r\n }, 10)\r\n }\r\n\r\n window.cancelIdleCallback = function (id) {\r\n clearTimeout(id)\r\n }\r\n}\r\n\r\nfunction runIdle(idleDeadline) {\r\n while (idleDeadline.timeRemaining() > 0 && queue.length) {\r\n const fn = queue.shift()\r\n\r\n if (!isFunction(fn)) {\r\n return false\r\n }\r\n\r\n fn()\r\n }\r\n\r\n if (queue.length) {\r\n isHandling = requestIdleCallback(runIdle)\r\n } else {\r\n isHandling = 0\r\n\r\n if (isFunction(done)) {\r\n done()\r\n done = null\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * 时间切片功能函数:主要用于优化长时任务的性能,将长时任务分解成\r\n * 多个短时间任务\r\n * ====================================================\r\n * @param {Function} fn - 需要在空闲时执行的回调函数\r\n * @param {Function} afterComplete - queen 的\r\n * @return {(function(): (boolean|undefined))|*|boolean}\r\n */\r\nconst timeSlice = (fn, afterComplete = null) => {\r\n queue.push(fn)\r\n\r\n if (isFunction(afterComplete)) {\r\n done = afterComplete\r\n }\r\n\r\n if (!isHandling) {\r\n requestIdleCallback(runIdle)\r\n }\r\n}\r\n\r\nexport default timeSlice\r\n","/**\r\n * 返回给定值的平方值\r\n * ========================================================================\r\n * @method easeInQuad\r\n * @param {Number} x\r\n * @returns {number}\r\n */\r\nconst easeInQuad = (x) => {\r\n return x * x\r\n}\r\n\r\nexport default easeInQuad\r\n","import isString from '../types/isString'\r\nimport isElement from '../types/isElement'\r\n\r\n/**\r\n * 通过给的 scrollElement 参数,获取滚动 DOM 元素\r\n * ========================================================================\r\n * @method _getScrollElement\r\n * @param {String|HTMLElement} scrollElement\r\n * @returns {Element}\r\n * @private\r\n */\r\nconst _getScrollElement = (scrollElement = null) => {\r\n let $rootElements\r\n let $scrollElement\r\n\r\n if (!scrollElement) {\r\n $rootElements = document.querySelectorAll('html,body')\r\n $scrollElement =\r\n $rootElements[0].scrollTop - $rootElements[1].scrollTop >= 0\r\n ? $rootElements[0]\r\n : $rootElements[1]\r\n } else {\r\n if (isString(scrollElement)) {\r\n $scrollElement = document.querySelector(scrollElement)\r\n } else if (isElement(scrollElement)) {\r\n $scrollElement = scrollElement\r\n }\r\n }\r\n\r\n return $scrollElement\r\n}\r\n\r\nexport default _getScrollElement\r\n","/**\r\n * 获取 DOM 节点相对于窗口的 left (纵坐标)值\r\n * ========================================================================\r\n * @method offsetTop\r\n * @param {HTMLElement} el - DOM 节点\r\n * @returns {Number}\r\n */\r\nconst offsetTop = (el) => {\r\n let top = el.offsetTop\r\n\r\n if (el.offsetParent !== null) {\r\n top += offsetTop(el.offsetParent)\r\n }\r\n\r\n return top\r\n}\r\n\r\nexport default offsetTop\r\n","/**\r\n * 获取 options 节点下匹配 selector 选择器的 DOM 节点\r\n * ========================================================================\r\n * Element.matches() 方法可以用来判断 DOM 元素是否与给定的选择器匹配,事件代理判断是\r\n * 否触发绑定的代理事件回调函数,关键就是使用 Element.matches() 辨别当前事件触发的目\r\n * 标 DOM 元素是否为事件代理所期望触发的目标。\r\n * ========================================================================\r\n * @method matches\r\n * @see https://developer.mozilla.org/en-US/docs/web/api/element/matches\r\n * @param {HTMLElement} el - (必须)DOM 元素\r\n * @param {String} selector - (必须)匹配 DOM 元素的选择器\r\n * @returns {Boolean}\r\n */\r\nconst matches = (el, selector = '') => {\r\n const sel = selector.replace(/^>/i, '')\r\n\r\n if (!selector || !sel || !el) {\r\n return false\r\n }\r\n\r\n /* istanbul ignore else */\r\n if (el.matches) {\r\n return el.matches(sel)\r\n } else if (el.msMatchesSelector) {\r\n return el.msMatchesSelector(sel)\r\n } else {\r\n return false\r\n }\r\n}\r\n\r\nexport default matches\r\n","/**\r\n * 获取 DOM 元素的父节点\r\n * ========================================================================\r\n * @method getParentOrHost\r\n * @param {*|HTMLElement} el - (必须)要获取父节点的 DOM 元素\r\n * @returns {*|HTMLElement}\r\n */\r\nconst getParentOrHost = (el) => {\r\n return el.host && el !== document && el.host.nodeType\r\n ? el.host\r\n : el.parentNode\r\n}\r\n\r\nexport default getParentOrHost\r\n","export const CAPTURE_EVENTS = [\r\n 'focusout',\r\n 'blur',\r\n 'focusin',\r\n 'focus',\r\n 'load',\r\n 'unload',\r\n 'mouseenter',\r\n 'mouseleave'\r\n]\r\n","import { CAPTURE_EVENTS } from './enum'\r\nimport _delete from './_delete'\r\n\r\n/**\r\n * (私有方法)取消 type 类型的代理事件绑定\r\n * ========================================================================\r\n * 如果没有设置 handler,则销毁 this.$options 绑定的所有符合 type 事件类型的事件绑定\r\n * ========================================================================\r\n * @method _off\r\n * @param {HTMLElement} el - (必须)取消事件绑定的 DOM 元素\r\n * @param {String} type - (必须)事件类型\r\n * @param {Function} fn - (必须)事件处理器回调函数\r\n * @private\r\n */\r\nconst _off = (el, type, fn) => {\r\n const capture = CAPTURE_EVENTS.indexOf(type) > -1\r\n\r\n /* istanbul ignore else */\r\n if (fn._delegateListener) {\r\n fn = fn._delegateListener\r\n delete fn._delegateListener\r\n }\r\n\r\n // 移除缓存的 _listeners 数据\r\n _delete(el, type, fn)\r\n\r\n el.removeEventListener(type, fn, capture)\r\n}\r\n\r\nexport default _off\r\n","/**\r\n * 删除 DOM 元素缓存的 _listeners 数据\r\n * ========================================================================\r\n * @method _delete\r\n * @param {HTMLElement} el - 要删除 listener 的 DOM 元素\r\n * @param {String} type - 事件类型(名称)\r\n * @param {Function} [fn] - 事件处理器回调函数\r\n */\r\nconst _delete = function (el, type, fn) {\r\n const listeners = el._listeners\r\n let index = -1\r\n\r\n if (listeners.length < 1) {\r\n return false\r\n }\r\n\r\n // 移除缓存的 _listeners 数据\r\n listeners.forEach((listener, i) => {\r\n const handler = listener.fn\r\n\r\n if (type === listener.type) {\r\n index = i\r\n\r\n if (handler === fn) {\r\n index = i\r\n }\r\n }\r\n })\r\n\r\n /* istanbul ignore else */\r\n if (index > -1) {\r\n listeners.splice(index, 1)\r\n }\r\n}\r\n\r\nexport default _delete\r\n","import isString from '../types/isString'\r\nimport isElement from '../types/isElement'\r\nimport getListeners from './getListeners'\r\nimport _off from './_off'\r\n\r\n/**\r\n * 销毁(type 类型的)代理事件绑定\r\n * ========================================================================\r\n * 1. 设置了事件类型 type,则销毁指定类型的事件绑定,否则清除所有代理事件绑定\r\n * 2. recurse 设置为 true,递归销毁子节点全部事件绑定\r\n * ========================================================================\r\n * @method purgeElement\r\n * @param {HTMLElement|String} el - (必须)DOM 元素或者其选择器\r\n * @param {String|Boolean} type - (必须)事件类型\r\n * @param {Boolean} [recurse] - (可选)是否递归销毁子节点所有事件绑定\r\n */\r\nconst purgeElement = function (el, type, recurse = false) {\r\n const $element = isString(el) ? document.querySelector(el) : el\r\n const $children = $element.childNodes\r\n const listeners = getListeners($element, type)\r\n\r\n listeners.forEach((listener) => {\r\n _off($element, listener.type, listener.fn)\r\n })\r\n\r\n if (\r\n (recurse || type === true || arguments.length === 1) &&\r\n $element &&\r\n $children\r\n ) {\r\n $children.forEach(($child) => {\r\n if (isElement($child)) {\r\n purgeElement($child, type, recurse)\r\n }\r\n })\r\n }\r\n}\r\n\r\nexport default purgeElement\r\n","import isString from '../types/isString'\r\n\r\n/**\r\n * 获取 DOM 元素(type 事件类型)事件绑定信息\r\n * ========================================================================\r\n * 如果设置了事件类型 type, 则返回指定类型的事件绑定信息,否则返回所有事件绑定信息\r\n * ========================================================================\r\n * @methods getListeners\r\n * @param {HTMLElement} el - (必须)要获取事件绑定信息的 DOM 元素\r\n * @param {String} [type] - (可选)事件类型\r\n * @returns {Array} - 已绑定的事件信息\r\n */\r\nconst getListeners = (el, type) => {\r\n let listeners = el._listeners || []\r\n\r\n if (isString(type) && type) {\r\n listeners = listeners.filter((listener) => {\r\n return listener.type === type\r\n })\r\n }\r\n\r\n return listeners\r\n}\r\n\r\nexport default getListeners\r\n","import purgeElement from './purgeElement'\r\nimport isFunction from '../types/isFunction'\r\nimport _off from './_off'\r\n\r\n/**\r\n * 取消 type 类型的代理事件绑定\r\n * ========================================================================\r\n * 如果没有设置 handler,则销毁 this.$options 绑定的所有符合 type 事件类型的事件绑定\r\n * ========================================================================\r\n * @method off\r\n * @param {HTMLElement|Object} el - (必须)取消事件绑定的 DOM 元素\r\n * @param {String} type - (必须)事件类型\r\n * @param {Function} [fn] - (可选)事件处理器回调函数\r\n */\r\nconst off = (el, type, fn) => {\r\n // 如果不设置 fn 参数,默认清除 el 元素上绑定的所有事件处理器\r\n if (!isFunction(fn)) {\r\n purgeElement(el, type)\r\n return false\r\n }\r\n\r\n _off(el, type, fn)\r\n}\r\n\r\nexport default off\r\n","import closest from '../dom/closest'\r\nimport off from './off'\r\nimport getTarget from './getTarget'\r\n\r\nimport { CAPTURE_EVENTS } from './enum'\r\n\r\n/**\r\n * 绑定代理事件\r\n * ========================================================================\r\n * @method on\r\n * @param {HTMLElement|String|Object} el - (必须)绑定代理事件的 DOM 节点\r\n * @param {String} selector - (必须)事件代理目标 DOM 元素的选择器\r\n * @param {String|Function} type - (必须)事件类型或者事件处理器回调函数\r\n * @param {Function|Object} fn - (可选) 事件处理器回调函数或者传递给事件处理器回调函数的数据对象\r\n * @param {Object|Boolean} [data] - (可选)传递给事件处理器回调函数的数据对象或者事件处理器回调函数的 this 上下文指向,\r\n * @param {Object|Boolean} [context] - (可选)事件处理器回调函数的 this 上下文指向,或者是否仅触发一次\r\n * 当设置为 true 时,则事件处理器回调函数的 this 上下文指向为 data 对象\r\n * @param {Boolean} once - (可选)是否仅触发一次\r\n */\r\nconst on = (el, selector, type, fn, data, context, once = false) => {\r\n // CAPTURE_EVENTS 中的特殊事件,采用事件捕获模型\r\n const capture = CAPTURE_EVENTS.indexOf(type) > -1\r\n\r\n const listener = function (evt) {\r\n const target = getTarget(evt)\r\n // 通过 Element.matches 方法获得点击的目标元素\r\n const delegateTarget = closest(target, selector, el)\r\n let overrideContext = context || el\r\n\r\n evt.delegateTarget = delegateTarget\r\n\r\n // 当设置为 true 时,则事件处理器回调函数的\r\n // this 上下文指向为 data 对象\r\n if (context === true) {\r\n overrideContext = data\r\n }\r\n\r\n /* istanbul ignore else */\r\n if (delegateTarget) {\r\n // 仅触发一次\r\n /* istanbul ignore else */\r\n if (once === true) {\r\n off(el, type, listener)\r\n }\r\n\r\n fn.call(overrideContext, evt, data)\r\n }\r\n }\r\n\r\n if (!el) {\r\n return false\r\n }\r\n\r\n if (!el._listeners) {\r\n el._listeners = []\r\n }\r\n\r\n // 缓存 options 元素绑定的事件处理器\r\n el._listeners.push({\r\n el,\r\n selector,\r\n type,\r\n fn: listener,\r\n data,\r\n context,\r\n capture\r\n })\r\n\r\n // 缓存包装后的事件处理器\r\n fn._delegateListener = listener\r\n\r\n el.addEventListener(type, listener, capture)\r\n}\r\n\r\nexport default on\r\n","import resolveTextNode from '../dom/resolveTextNode'\r\n\r\n/**\r\n * 返回触发事件的 target DOM 元素\r\n * ========================================================================\r\n * @method getTarget\r\n * @param {Event} evt - Event 对象\r\n * @return {HTMLElement} - Event 对象的 target DOM 元素\r\n */\r\nconst getTarget = function (evt) {\r\n const target = evt.target\r\n\r\n return resolveTextNode(target)\r\n}\r\n\r\nexport default getTarget\r\n","/**\r\n * 在某些情况下,某些浏览器(例如:Safari 浏览器)会返回实际的目标元素内部的文本节点。\r\n * resolveTextNode() 方法则会返回实际的目标节点。\r\n * ========================================================================\r\n * @method resolveTextNode\r\n * @param {HTMLElement|Text} el - 要解析的节点\r\n * @return {*|HTMLElement} - 实际的目标 DOM 节点\r\n */\r\nconst resolveTextNode = function (el) {\r\n if (el && el.nodeType === 3) {\r\n return el.parentNode\r\n }\r\n\r\n return el\r\n}\r\n\r\nexport default resolveTextNode\r\n","import matches from './matches'\r\nimport getParentOrHost from './getParentOrHost'\r\n\r\n/**\r\n * 获取 options 元素父元素最近的包含 selector 选择器的元素\r\n * ========================================================================\r\n * @method closest\r\n * @param {HTMLElement} el - (必须)DOM 元素\r\n * @param {String} selector - (必须)DOM 元素的选择其\r\n * @param {HTMLElement} [ctx] - (必须)比对的 DOM 元素\r\n * @param {Boolean} [includeCTX] - (必须)是否包含 context DOM 元素\r\n * @returns {null|HTMLElement} - 返回最接近的 DOM 元素\r\n */\r\nconst closest = (el, selector, ctx, includeCTX) => {\r\n const context = ctx || document\r\n\r\n if (!el) {\r\n return null\r\n }\r\n\r\n do {\r\n /* istanbul ignore else */\r\n if (\r\n (selector != null &&\r\n (selector.startsWith('>')\r\n ? el.parentNode === context && matches(el, selector)\r\n : matches(el, selector))) ||\r\n (includeCTX && el === context)\r\n ) {\r\n return el\r\n }\r\n\r\n /* istanbul ignore else */\r\n if (el === context) {\r\n break\r\n }\r\n\r\n /* jshint boss:true */\r\n } while ((el = getParentOrHost(el)))\r\n}\r\n\r\nexport default closest\r\n","import DEFAULTS from './defaults'\r\n\r\nconst SYMBOLS = [...DEFAULTS]\r\n\r\nexport default SYMBOLS\r\n","const DEFAULTS = [\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n ''\r\n]\r\n\r\nexport default DEFAULTS\r\n","import isString from '../types/isString'\r\nimport getSymbol from './getSymbol'\r\nimport SYMBOLS from './symbols'\r\n\r\n/**\r\n *\r\n * @method getSymbols\r\n * @param {String} [name]\r\n * @param {String} [iconSet]\r\n * @returns {string[]|*}\r\n */\r\nconst getSymbols = (name, iconSet = 'icon') => {\r\n if (isString(name)) {\r\n return getSymbol(name, iconSet)\r\n }\r\n\r\n return [...SYMBOLS]\r\n}\r\n\r\nexport default getSymbols\r\n","import SYMBOLS from './symbols'\r\n\r\n/**\r\n * @method getSymbol\r\n * @param {String} name\r\n * @param {String} [iconSet]\r\n * @returns {String}\r\n */\r\nconst getSymbol = (name, iconSet = 'icon') => {\r\n const patternName = /id=\"(.*?)\"/\r\n const patternSet = /^(\\w+)-/\r\n const symbols = SYMBOLS\r\n\r\n return symbols.find((symbol) => {\r\n const names = patternName.exec(symbol)\r\n const fullName = names[1]\r\n const sets = patternSet.exec(fullName)\r\n const setName = sets[1]\r\n const iconName =\r\n iconSet === 'icon' ? `${iconSet}-${name}` : `${iconSet}-icon-${name}`\r\n\r\n return setName === iconSet && fullName === iconName\r\n })\r\n}\r\n\r\nexport default getSymbol\r\n","import add from './add'\r\nimport getSymbols from './getSymbols'\r\n\r\n/**\r\n * 绘制 SVG 图标集\r\n * ========================================================================\r\n * @method paint\r\n * @param {String|Array} symbol\r\n */\r\nconst paint = (symbol = '') => {\r\n const $body = document.body\r\n let $icons = document.querySelector('#outline-icons')\r\n let symbols = []\r\n\r\n add(symbol)\r\n symbols = getSymbols()\r\n\r\n if ($icons) {\r\n $icons.innerHTML = symbols.join('')\r\n } else {\r\n $icons = document.createElement('div')\r\n $icons.innerHTML =\r\n ``\r\n $body.insertBefore($icons.firstChild, $body.firstChild)\r\n }\r\n}\r\n\r\nexport default paint\r\n","import isArray from '../types/isArray'\r\nimport isString from '../types/isString'\r\nimport SYMBOLS from './symbols'\r\n\r\n/**\r\n * @method add\r\n * @param {Array|String} symbols\r\n * @return {Boolean}\r\n */\r\nconst add = (symbols) => {\r\n if (!symbols) {\r\n return false\r\n }\r\n\r\n if (isArray(symbols) && symbols.length > 0) {\r\n symbols.forEach((symbol) => {\r\n /* istanbul ignore else */\r\n if (SYMBOLS.indexOf(symbol) === -1 && isString(symbol)) {\r\n SYMBOLS.push(symbol)\r\n }\r\n })\r\n } else {\r\n /* istanbul ignore else */\r\n if (isString(symbols)) {\r\n SYMBOLS.push(symbols)\r\n }\r\n }\r\n}\r\n\r\nexport default add\r\n","import isString from '../types/isString'\r\n\r\n/**\r\n * 清楚字符串起始位置所有的空格\r\n * ========================================================================\r\n * @method trim\r\n * @param {string} str\r\n * @returns {string|Boolean}\r\n */\r\nconst trim = (str) => {\r\n if (!isString(str)) {\r\n return false\r\n }\r\n return str.replace(/(^\\s+)|(\\s+$)/g, '')\r\n}\r\n\r\nexport default trim\r\n","import isObject from './isObject'\r\nimport isElement from './isElement'\r\nimport isHTMLCollection from './isHTMLCollection'\r\nimport isFragment from './isFragment'\r\nimport isTextNode from './isTextNode'\r\n\r\nconst isDOM = (el) => {\r\n return !!(\r\n isObject(el) &&\r\n (isElement(el) || isHTMLCollection(el) || isFragment(el) || isTextNode(el))\r\n )\r\n}\r\n\r\nexport default isDOM\r\n","import toString from '../lang/toString'\r\nimport isObject from './isObject'\r\n\r\nconst isHTMLCollection = (el) => {\r\n return !!(isObject(el) && toString(el) === '[object NodeList]')\r\n}\r\n\r\nexport default isHTMLCollection\r\n","import toString from '../lang/toString'\r\nimport isObject from './isObject'\r\n\r\nconst isFragment = (fragment) => {\r\n return !!(\r\n isObject(fragment) && toString(fragment) === '[object DocumentFragment]'\r\n )\r\n}\r\n\r\nexport default isFragment\r\n","import toString from '../lang/toString'\r\nimport isObject from './isObject'\r\n\r\nconst isTextNode = (el) => {\r\n return !!(\r\n isObject(el) &&\r\n (toString(el) === '[object Text]' || (el.tagName && el.nodeType === 3))\r\n )\r\n}\r\n\r\nexport default isTextNode\r\n","/**\r\n * 检测对象自身属性中是否具有指定的属性。\r\n * ========================================================================\r\n * @method hasOwn\r\n * @param {Object} obj - (必须)检测的目标对象\r\n * @param {String} prop - (必须)属性名\r\n * @returns {Boolean}\r\n */\r\nconst hasOwn = (obj, prop) => {\r\n const hasOwnProperty = Object.prototype.hasOwnProperty\r\n return obj && hasOwnProperty.call(obj, prop)\r\n}\r\n\r\nexport default hasOwn\r\n","import isElement from '../types/isElement'\r\n/**\r\n * 检测 DOM 节点是否包含名为 className 的样式\r\n * ========================================================================\r\n * @method hasClass\r\n * @param {HTMLElement} el - DOM 节点\r\n * @param {String} className - 样式名称\r\n * @returns {Boolean}\r\n */\r\nconst hasClass = (el, className) => {\r\n const pattern = new RegExp('(\\\\s|^)' + className + '(\\\\s|$)')\r\n let allClass\r\n let classList\r\n\r\n if (!isElement(el)) {\r\n return false\r\n }\r\n\r\n allClass = el.className\r\n\r\n if (!allClass) {\r\n return false\r\n }\r\n\r\n classList = el.classList\r\n\r\n if (classList && classList.contains) {\r\n return el.classList.contains(className)\r\n }\r\n\r\n return !!pattern.exec(allClass)\r\n}\r\n\r\nexport default hasClass\r\n","import addClass from './addClass.js'\r\n\r\n/**\r\n * 给 DOM 节点设置属性/值\r\n * ========================================================================\r\n * @method setAttribute\r\n * @param {HTMLElement} el - DOM 节点\r\n * @param {String} attr - 属性名称\r\n * @param {String|Number|Boolean} value - 属性值\r\n */\r\nconst setAttribute = (el, attr, value) => {\r\n let tagName = el.tagName.toLowerCase()\r\n\r\n switch (attr) {\r\n case 'style':\r\n el.style.cssText = value\r\n break\r\n case 'value':\r\n if (tagName === 'input' || tagName === 'textarea') {\r\n el.value = value\r\n } else {\r\n el.setAttribute(attr, value)\r\n }\r\n break\r\n case 'htmlFor':\r\n el.setAttribute('for', value)\r\n break\r\n case 'className':\r\n addClass(el, value)\r\n break\r\n case 'innerHTML':\r\n el.innerHTML = value\r\n break\r\n case 'innerText':\r\n el.innerText = value\r\n break\r\n default:\r\n el.setAttribute(attr, value)\r\n break\r\n }\r\n}\r\n\r\nexport default setAttribute\r\n","import hasClass from './hasClass'\r\n\r\n/**\r\n * 给 DOM 节点添加名为 className 的样式\r\n * ========================================================================\r\n * @method addClass\r\n * @param {HTMLElement} el - DOM 节点\r\n * @param {String} className - 样式名称\r\n * @returns {Boolean}\r\n */\r\nconst addClass = (el, className) => {\r\n let classList\r\n let allClass\r\n\r\n if (hasClass(el, className)) {\r\n return false\r\n }\r\n\r\n classList = el.classList\r\n\r\n if (classList?.add) {\r\n if (className.indexOf(' ') > -1) {\r\n className.split(' ').forEach((name) => {\r\n classList.add(name)\r\n })\r\n } else {\r\n classList.add(className)\r\n }\r\n } else {\r\n allClass = el.className\r\n allClass += allClass.length > 0 ? ' ' + className : className\r\n el.className = allClass\r\n }\r\n}\r\n\r\nexport default addClass\r\n","import isObject from '../types/isObject'\r\nimport hasOwn from '../lang/hasOwn'\r\nimport setAttribute from './setAttribute'\r\n\r\nconst setAttributes = (el, attrs) => {\r\n if (!el || !isObject(attrs)) {\r\n return false\r\n }\r\n\r\n Object.keys(attrs).forEach((attr) => {\r\n const value = attrs[attr]\r\n if (hasOwn(attrs, attr)) {\r\n setAttribute(el, attr, value)\r\n }\r\n })\r\n}\r\n\r\nexport default setAttributes\r\n","import isArray from '../types/isArray'\r\nimport isString from '../types/isString'\r\nimport isSVG from '../types/isSVG'\r\nimport setAttributes from '../dom/setAttributes'\r\n\r\n/**\r\n * 创建 SVG 图标 DOM 元素\r\n * ========================================================================\r\n * @method createElement\r\n * @param {String} name\r\n * @param {Object} [options]\r\n * @param {Number|Array} [options.size]\r\n * @param {String} [options.color]\r\n * @param {String} [options.iconSet]\r\n * @param {Object} [options.attrs]\r\n * @returns {HTMLElement}\r\n */\r\nconst createElement = (name, options = {}) => {\r\n const ICON = 'outline-icon'\r\n const size = options.size || 0\r\n const color = options.color || ''\r\n const iconSet = options.iconSet || ''\r\n const width = isArray(size) ? size[0] : size\r\n const height = isArray(size) ? size[1] : size\r\n const defaultRules = size ? `width:${width}px;height:${height}px;` : ''\r\n const cssRules = color ? defaultRules + `color:${color}` : defaultRules\r\n const attrs = options.attrs || {}\r\n const $icon = document.createElement('i')\r\n let binds = ''\r\n let svg = ''\r\n let $svg\r\n\r\n if (!isString(name)) {\r\n return null\r\n }\r\n\r\n if (isSVG(name)) {\r\n svg = name\r\n } else {\r\n binds =\r\n iconSet && iconSet !== 'icon'\r\n ? `xlink:href=\"#${iconSet}-icon-${name}\"`\r\n : `xlink:href=\"#icon-${name}\"`\r\n svg = ``\r\n }\r\n\r\n $icon.innerHTML = svg\r\n\r\n if (attrs.className) {\r\n attrs.className = `${ICON} ${attrs.className}`\r\n } else {\r\n attrs.className = ICON\r\n }\r\n\r\n setAttributes($icon, attrs)\r\n\r\n $svg = $icon.querySelector('svg')\r\n setAttributes($svg, {\r\n 'aria-hidden': true,\r\n xmlns: 'http://www.w3.org/2000/svg',\r\n class: 'outline-icon__svg',\r\n width: 200,\r\n height: 200,\r\n style: cssRules\r\n })\r\n\r\n return $icon\r\n}\r\n\r\nexport default createElement\r\n","import isString from './isString'\r\n\r\nconst isSVG = (str) => {\r\n const declaration = '(?:<\\\\?xml[^>]*>\\\\s*)?'\r\n const doctype =\r\n '(?:<\\\\!doctype svg[^>]*\\\\s*(?:\\\\[?(?:\\\\s*]*>\\\\s*)*\\\\]?)*[^>]*>\\\\s*)?'\r\n const content = ']*>[^]*<\\\\/svg>\\\\s*$'\r\n const svg = `^\\\\s*${declaration}${doctype}${content}\\\\s*$`\r\n const pattern = new RegExp(svg, 'i')\r\n\r\n return isString(str) && pattern.test(str)\r\n}\r\n\r\nexport default isSVG\r\n","import isFunction from './utils/types/isFunction'\r\nimport trim from './utils/lang/trim'\r\nimport createElement from './utils/dom/createElement'\r\nimport setAttributes from './utils/dom/setAttributes'\r\n\r\nimport icon from './utils/icons/icon'\r\n\r\nconst _updateHeading = ($heading, i, options) => {\r\n const CLS_HEADING = 'outline-heading'\r\n const hasAnchor = options.hasAnchor || true\r\n const isAtStart = options.isAtStart || true\r\n const showCode = options.showCode || false\r\n const chapterCode = options.chapterCode || ''\r\n const anchorURL = options.anchorURL || ''\r\n const anchorLinkFilter = options.anchorLinkFilter || null\r\n const headingId = `heading-${i}`\r\n const attrs = {\r\n id: headingId,\r\n className: isAtStart ? `${CLS_HEADING} ${CLS_HEADING}_start` : CLS_HEADING,\r\n 'data-id': i\r\n }\r\n const text = trim($heading.innerHTML)\r\n let url\r\n let $anchor\r\n let $icon\r\n\r\n if (showCode) {\r\n attrs.innerHTML = chapterCode + ' ' + text\r\n attrs['data-code'] = chapterCode\r\n }\r\n setAttributes($heading, attrs)\r\n\r\n if (!hasAnchor) {\r\n return false\r\n }\r\n\r\n if (anchorURL) {\r\n url = anchorURL\r\n } else {\r\n if (isFunction(anchorLinkFilter)) {\r\n url = anchorLinkFilter($heading.tagName.toLowerCase(), text, i)\r\n } else {\r\n url = `#${headingId}`\r\n }\r\n }\r\n\r\n $icon = icon('hash', { iconSet: 'outline' })\r\n $anchor = createElement(\r\n 'a',\r\n {\r\n id: `anchor-${i}`,\r\n className: `${CLS_HEADING}__anchor anchor-${i}`,\r\n href: url,\r\n target: anchorURL ? '_blank' : 'self',\r\n 'data-id': i\r\n },\r\n $icon\r\n )\r\n $heading.appendChild($anchor)\r\n}\r\n\r\nexport default _updateHeading\r\n","import createElement from './createElement'\r\n\r\n/**\r\n * 创建 SVG 图标 DOM 元素\r\n * ========================================================================\r\n * @method icon\r\n * @alias createElement\r\n * @see createElement\r\n * @param {String} name\r\n * @param {Object} [options]\r\n * @param {Number|Array} [options.size]\r\n * @param {String} [options.color]\r\n * @param {String} [options.iconSet]\r\n * @returns {HTMLElement}\r\n */\r\nconst icon = (name, options = {}) => {\r\n return createElement(name, options)\r\n}\r\n\r\nexport default icon\r\n","import isObject from '../types/isObject'\r\nimport isString from '../types/isString'\r\nimport isArray from '../types/isArray'\r\nimport isDOM from '../types/isDOM'\r\nimport setAttributes from './setAttributes'\r\n\r\n/**\r\n * 创建 DOM 节点,并添加属性和子节点\r\n * ========================================================================\r\n * @method createElement\r\n * @param {String} tagName - 标签名称\r\n * @param {Object|Array|HTMLElement|DocumentFragment|String} attrs - 属性对象或者子节点\r\n * @param {Array|HTMLElement|DocumentFragment|String} [children] - 子节点数组\r\n * @returns {HTMLElement}\r\n */\r\nconst createElement = (tagName, attrs, children) => {\r\n const $fragment = document.createDocumentFragment()\r\n const $el = document.createElement(tagName)\r\n const isValidChild = (child) => {\r\n return isDOM(child) || isString(child)\r\n }\r\n const append = (child) => {\r\n let $child\r\n\r\n if (!isValidChild(child)) {\r\n return false\r\n }\r\n\r\n if (isDOM(child)) {\r\n $child = child\r\n } else if (isString(child)) {\r\n $child = document.createTextNode(child)\r\n }\r\n\r\n $fragment.appendChild($child)\r\n }\r\n\r\n if (isObject(attrs)) {\r\n setAttributes($el, attrs)\r\n } else if (isArray(attrs) && attrs.every((attr) => isValidChild(attr))) {\r\n attrs.forEach((child) => {\r\n append(child)\r\n })\r\n } else if (isDOM(attrs)) {\r\n append(attrs)\r\n } else if (isString(attrs)) {\r\n append(document.createTextNode(attrs))\r\n }\r\n\r\n if (isArray(children)) {\r\n children.forEach((child) => {\r\n append(child)\r\n })\r\n } else {\r\n append(children)\r\n }\r\n\r\n $el.appendChild($fragment)\r\n\r\n return $el\r\n}\r\n\r\nexport default createElement\r\n","import trim from '../lang/trim'\r\nimport hasClass from './hasClass'\r\n\r\n/**\r\n * 移除 DOM 节点的 className 样式\r\n * ========================================================================\r\n * @method removeClass\r\n * @param {HTMLElement} el - DOM 节点\r\n * @param {String} className - 样式名称\r\n * @returns {Boolean}\r\n */\r\nconst removeClass = (el, className) => {\r\n let allClass = el.className\r\n let classList\r\n\r\n if (!allClass || !hasClass(el, className)) {\r\n return false\r\n }\r\n\r\n classList = el.classList\r\n\r\n if (classList?.remove) {\r\n classList.remove(className)\r\n } else {\r\n allClass = trim(allClass.replace(className, ''))\r\n el.className = allClass\r\n }\r\n}\r\n\r\nexport default removeClass\r\n","import removeClass from './utils/dom/removeClass'\r\nimport isEmpty from './utils/types/isEmpty'\r\nimport trim from './utils/lang/trim'\r\n\r\nconst _removeHeading = ($heading, hasAnchor = true, isAtStart = true) => {\r\n const CLS_HEADING = 'outline-heading'\r\n const text = $heading.innerHTML\r\n const pattern = /^\\d+(\\.?\\d+)*\\s?/gi\r\n let $anchor\r\n\r\n $heading.innerHTML = text.replace(pattern, '')\r\n $heading.removeAttribute('id')\r\n $heading.removeAttribute('data-id')\r\n\r\n removeClass($heading, CLS_HEADING)\r\n\r\n if (!hasAnchor) {\r\n return false\r\n }\r\n\r\n $anchor = $heading.querySelector(`.${CLS_HEADING}__anchor`)\r\n\r\n if (isAtStart) {\r\n removeClass($heading, `${CLS_HEADING}_start`)\r\n }\r\n\r\n if (isEmpty(trim($heading.className))) {\r\n $heading.removeAttribute('class')\r\n }\r\n\r\n // 存在锚点才移除\r\n if ($anchor) {\r\n $heading.removeChild($anchor)\r\n }\r\n}\r\n\r\nexport default _removeHeading\r\n","import isString from './isString'\r\n/**\r\n * 检测数据是否为空字符串\r\n * ========================================================================\r\n * @method isEmpty\r\n * @param {String} str\r\n * @returns {boolean}\r\n */\r\nconst isEmpty = (str) => {\r\n return isString(str) && str === ''\r\n}\r\n\r\nexport default isEmpty\r\n","import trim from './utils/lang/trim'\r\nimport stripTags from './utils/lang/stripTags'\r\nimport isFunction from './utils/types/isFunction'\r\n\r\nimport _getChapterParentIdByDiffer from './_getChapterParentIdByDiffer'\r\nimport _getChaptersWithCode from './_getChaptersWithCode'\r\n\r\n/**\r\n * 根据文章中的 h1~h6 标签,自动分析返回文章章节数据\r\n * ========================================================================\r\n * @method getChaptersByHeadings\r\n * @param {Array} headings\r\n * @param {Boolean} [showCode]\r\n * @param {Function} [chapterTextFilter]\r\n * @return {*|*[]}\r\n */\r\nconst getChaptersByHeadings = (\r\n headings,\r\n showCode = false,\r\n chapterTextFilter = null\r\n) => {\r\n const pattern = /^\\d(\\.|(\\.\\d+)*)\\s?/gi\r\n const chapters = []\r\n let previous = 1\r\n let level = 0\r\n let text = ''\r\n\r\n headings.forEach((heading, i) => {\r\n const tagName = heading.tagName\r\n const headingLevel = tagName.replace(/h/i, '')\r\n let current = parseInt(headingLevel, 10)\r\n let pid = -1\r\n\r\n // 场景1:当前标题是前一个标题的子标题\r\n // 当前标题的(标题标签)序号 > 前一个标题的序号:两个相连的标题是父标题 -> 子标题关系;\r\n // h2 (前一个标题)\r\n // h3 (当前标题)\r\n if (current > previous) {\r\n level += 1\r\n\r\n // 第一层级的 pid 是 -1\r\n if (level === 1) {\r\n pid = -1\r\n } else {\r\n pid = i - 1\r\n }\r\n }\r\n // 场景2:当前标题和前一个标题层级相同\r\n // 当前标题的(标题标签)序号 = 前一个标题的序号\r\n // h2 (前一个标题)\r\n // h2 (当前标题)\r\n // 当前标题的(标题标签)序号 < 前一个标题的序号,并且当前标题序号 > 当前的级别\r\n // h2\r\n // h4 (前一个标题)\r\n // h3 (当前标题:这种情况我们还是任务 h3 是 h2 的下一级章节)\r\n else if (current === previous || (current < previous && current > level)) {\r\n // H1 的层级肯定是 1\r\n if (current === 1) {\r\n level = 1\r\n pid = -1\r\n } else {\r\n pid = chapters[i - 1].pid\r\n }\r\n }\r\n // 场景3:当前标题比前一个标题层级高\r\n else if (current <= level) {\r\n // H1 的层级肯定是 1\r\n if (current === 1) {\r\n level = 1\r\n } else {\r\n level = level - (previous - current)\r\n\r\n if (level <= 1) {\r\n level = 1\r\n }\r\n }\r\n\r\n // 第一级的标题\r\n if (level === 1) {\r\n pid = -1\r\n } else {\r\n // 通过当前标题和前一个标题之间的等级差,获得当前标题的父标题ID\r\n pid = _getChapterParentIdByDiffer(chapters, previous - current, i)\r\n }\r\n }\r\n\r\n previous = current\r\n\r\n text = trim(stripTags(heading.innerHTML))\r\n\r\n // 如果自动生成章节编号,则去掉标题中自带的编号文本\r\n if (showCode) {\r\n text = trim(text.replace(pattern, ''))\r\n }\r\n\r\n if (isFunction(chapterTextFilter)) {\r\n text = chapterTextFilter(text)\r\n }\r\n\r\n chapters.push({\r\n id: i,\r\n pid: pid,\r\n level: level,\r\n rel: `heading-${i}`,\r\n text,\r\n tagName\r\n })\r\n })\r\n\r\n return showCode ? _getChaptersWithCode(chapters) : chapters\r\n}\r\n\r\nexport default getChaptersByHeadings\r\n","import isString from '../types/isString'\r\n\r\n/**\r\n * 过滤所有 HTML 标签\r\n * ========================================================================\r\n * @method stripTags\r\n * @param {string} str\r\n * @returns {string}\r\n */\r\nconst stripTags = (str) => {\r\n if (!isString(str)) {\r\n return ''\r\n }\r\n return str.replace(/<\\/?[^>]+(>|$)/g, '')\r\n}\r\n\r\nexport default stripTags\r\n","const _getChapterParentIdByDiffer = (chapters, differ, index) => {\r\n let previous = chapters[index - 1]\r\n let pid\r\n let i\r\n\r\n for (i = 0; i < differ; i += 1) {\r\n pid = previous.pid\r\n previous = chapters[pid]\r\n }\r\n\r\n pid = previous.pid\r\n\r\n return pid\r\n}\r\n\r\nexport default _getChapterParentIdByDiffer\r\n","import isArray from './utils/types/isArray'\r\n\r\nconst _getChaptersWithCode = (chapters) => {\r\n const groups = {}\r\n const cb = (o) => {\r\n return [o.pid]\r\n }\r\n\r\n chapters.forEach((o) => {\r\n const group = JSON.stringify(cb(o))\r\n\r\n groups[group] = groups[group] || []\r\n groups[group].push(o)\r\n\r\n o.index = groups[group].length\r\n\r\n if (o.pid === -1) {\r\n o.code = String(o.index)\r\n }\r\n })\r\n\r\n Object.keys(groups).forEach((group) => {\r\n groups[group].forEach((c) => {\r\n const subjects = groups[`[${c.id}]`]\r\n\r\n if (!subjects || !isArray(subjects)) {\r\n return false\r\n }\r\n\r\n subjects.forEach((o) => {\r\n o.code = c.code + '.' + o.index\r\n })\r\n })\r\n })\r\n\r\n return chapters\r\n}\r\n\r\nexport default _getChaptersWithCode\r\n","import isString from './utils/types/isString'\r\nimport isFunction from './utils/types/isFunction'\r\nimport isElement from './utils/types/isElement'\r\nimport toTree from './utils/lang/toTree'\r\n\r\nimport getChaptersByHeadings from './getChaptersByHeadings'\r\n\r\n/**\r\n *\r\n * @param {Object} [options]\r\n * @param {String|HTMLElement} [options.articleElement]\r\n * @param {String} [options.selector]\r\n * @param {Boolean} [options.showCode]\r\n * @param {Function} [options.chapterTextFilter]\r\n * @param {Boolean} [options.isTreeStructured]\r\n * @returns {Array}\r\n */\r\nconst getChapters = (options) => {\r\n const {\r\n articleElement,\r\n selector,\r\n showCode,\r\n chapterTextFilter,\r\n isTreeStructured\r\n } = options\r\n let $article = document.querySelector('#article')\r\n let $headings = []\r\n let chapters = []\r\n let filter = null\r\n\r\n if (isString(articleElement)) {\r\n $article = document.querySelector(articleElement)\r\n } else if (isElement(articleElement)) {\r\n $article = articleElement\r\n }\r\n\r\n if (!$article) {\r\n return chapters\r\n }\r\n\r\n if (isFunction(chapterTextFilter)) {\r\n filter = chapterTextFilter\r\n } else {\r\n if (chapterTextFilter === true) {\r\n filter = (text) => {\r\n return text.replace(/\\(.*?\\)/, '()')\r\n }\r\n }\r\n }\r\n\r\n $headings = [...$article.querySelectorAll(selector || 'h1,h2,h3,h4,h5,h6')]\r\n chapters = getChaptersByHeadings($headings, showCode, filter)\r\n\r\n return isTreeStructured === true ? toTree(chapters, 'id', 'pid') : chapters\r\n}\r\n\r\nexport default getChapters\r\n","const toTree = (list, nodeKey, parentKey) => {\r\n const map = {}\r\n const roots = []\r\n\r\n list.forEach((item, i) => {\r\n // initialize the map\r\n map[item[nodeKey]] = i\r\n // initialize the children\r\n item.children = []\r\n })\r\n\r\n list.forEach((item) => {\r\n const node = list[map[item[parentKey]]]\r\n\r\n if (item[parentKey] !== -1) {\r\n // if you have dangling branches check that map[node.parentId] exists\r\n node.children.push(item)\r\n } else {\r\n roots.push(item)\r\n }\r\n })\r\n\r\n return roots\r\n}\r\n\r\nexport default toTree\r\n","/**\r\n * 存储订阅者(主题和处理器的)私有对象\r\n * ========================================================================\r\n * @type {{}}\r\n * @private\r\n */\r\nconst _subscribers = {}\r\n\r\nexport default _subscribers\r\n","import _subscribers from './_subscribers'\r\nimport hasOwn from '../lang/hasOwn'\r\n\r\n/**\r\n * 判断是否存在与给定 topic 完全匹配的订阅者信息\r\n * ========================================================================\r\n * @method _hasDirectSubscribersFor\r\n * @param {String} topic - (必须)订阅主题字符串\r\n * @returns {Boolean}\r\n */\r\nconst _hasDirectSubscribersFor = (topic) => {\r\n return hasOwn(_subscribers, topic) && _subscribers[topic].length > 0\r\n}\r\n\r\nexport default _hasDirectSubscribersFor\r\n","import _hasDirectSubscribersFor from './_hasDirectSubscribersFor'\r\nimport _hasSubscribers from './_hasSubscribers'\r\n\r\n/**\r\n * 判断是否存在包含 topic 指定的订阅者信息\r\n * ========================================================================\r\n * @method has\r\n * @param {String} topic - (必须)主题名称\r\n * @param {Boolean} [isDirect] - (可选)是否为直接的主题,默认值:true\r\n * @returns {Boolean}\r\n */\r\nconst has = (topic, isDirect = true) => {\r\n return isDirect ? _hasDirectSubscribersFor(topic) : _hasSubscribers(topic)\r\n}\r\n\r\nexport default has\r\n","import _hasDirectSubscribersFor from './_hasDirectSubscribersFor'\r\n\r\n/**\r\n * 判断是否存在包含给定 topic 相关的订阅者信息\r\n * ========================================================================\r\n * @method _hasSubscribers\r\n * @param {String} topic - (必须)订阅主题字符串\r\n * @returns {Boolean}\r\n */\r\nconst _hasSubscribers = (topic) => {\r\n let found = _hasDirectSubscribersFor(topic)\r\n let position = topic.lastIndexOf('.')\r\n\r\n while (!found && position !== -1) {\r\n topic = topic.substring(0, position)\r\n position = topic.lastIndexOf('.')\r\n found = _hasDirectSubscribersFor(topic)\r\n }\r\n\r\n return found\r\n}\r\n\r\nexport default _hasSubscribers\r\n","import isTypedArray from '../types/isTypedArray'\r\nimport _subscribers from './_subscribers'\r\nimport has from './has'\r\nimport _hasDirectSubscribersFor from './_hasDirectSubscribersFor'\r\n\r\n/**\r\n * (异步)发布订阅主题信息\r\n * ========================================================================\r\n * 主题默认是异步发布的。确保在消费者处理主题时,主题的发起者不会被阻止。\r\n * ========================================================================\r\n * @method emit\r\n * @param {String} topic - (必须)主题名称\r\n * @param {Object} [data] - (可选)数据对象\r\n * @param {Boolean} [async] - (可选) 是否异步发布\r\n */\r\nconst emit = (topic, data, async = true) => {\r\n const execute = (topic) => {\r\n if (!_hasDirectSubscribersFor(topic)) {\r\n return false\r\n }\r\n\r\n _subscribers[topic].forEach((subscriber) => {\r\n // 针对 mqtt 消息服务返回的 Uint8Array 类似的 typed arrays 格式的数据\r\n // 采用 toString() 方法转化为普通(JSON)字符串\r\n const message = isTypedArray(data) ? data.toString() : data\r\n\r\n subscriber.callback.call(subscriber.context || subscriber, message)\r\n })\r\n }\r\n const deliver = () => {\r\n let subscriber = topic\r\n let position = topic.lastIndexOf('.')\r\n\r\n while (position !== -1) {\r\n subscriber = subscriber.substring(0, position)\r\n position = subscriber.lastIndexOf('.')\r\n\r\n execute(subscriber)\r\n }\r\n\r\n // 执行 topic 对应的处理器\r\n execute(topic)\r\n // 执行特殊 topic:'*'(监听全部消息的发布)\r\n execute('*')\r\n }\r\n\r\n if (!has(topic)) {\r\n return false\r\n }\r\n\r\n if (async) {\r\n setTimeout(deliver, 10)\r\n } else {\r\n deliver()\r\n }\r\n}\r\n\r\nexport default emit\r\n","import toString from '../lang/toString'\r\n/**\r\n * 判断检测数据是否为 Typed Arrays 类型的数据\r\n * ========================================================================\r\n * @param {*} val\r\n * @returns {boolean}\r\n */\r\nconst isTypedArray = (val) => {\r\n const TYPES = [\r\n '[object Int8Array]',\r\n '[object Uint8Array]',\r\n '[object Uint8ClampedArray]',\r\n '[object Int16Array]',\r\n '[object Uint16Array]',\r\n '[object Int32Array]',\r\n '[object Uint32Array]',\r\n '[object Float32Array]',\r\n '[object Float64Array]',\r\n '[object BigInt64Array]',\r\n '[object BigUint64Array]'\r\n ]\r\n\r\n return TYPES.indexOf(toString(val)) > -1\r\n}\r\n\r\nexport default isTypedArray\r\n","/**\r\n * 生成唯一 id 字符串的函数\r\n * ========================================================================\r\n * @method guid\r\n * @param {String} [prefix] - 生成 id 的前缀字符串\r\n * @return {String} 返回一个表示唯一 id 的字符串\r\n */\r\nconst guid = (() => {\r\n let uuid = 0\r\n\r\n return (prefix) => {\r\n uuid += 1\r\n\r\n return prefix ? prefix + '-' + uuid : 'guid-' + uuid\r\n }\r\n})()\r\n\r\nexport default guid\r\n","import _subscribers from './_subscribers'\r\nimport hasOwn from '../lang/hasOwn'\r\n\r\n/**\r\n * 删除与给定 topic 相同的订阅者信息\r\n * ========================================================================\r\n * @method _removeSubscriber\r\n * @param {String} topic - (必须)订阅主题字符串\r\n * @returns {Boolean}\r\n */\r\nconst _removeSubscriber = (topic) => {\r\n if (!hasOwn(_subscribers, topic)) {\r\n return false\r\n }\r\n\r\n delete _subscribers[topic]\r\n}\r\n\r\nexport default _removeSubscriber\r\n","import has from './has'\r\nimport _removeSubscriber from './_removeSubscriber'\r\nimport _removeSubscriberByToken from './_removeSubscriberByToken'\r\n\r\n/**\r\n * 取消订阅主题\r\n * ========================================================================\r\n * @method off\r\n * @param {String} topic - (必须)订阅的主题\r\n * @param {Function|String} [token] - (可选)订阅主题的处理器函数或者唯一 Id 值\r\n */\r\nconst off = (topic, token) => {\r\n if (!has(topic)) {\r\n return false\r\n }\r\n\r\n if (token) {\r\n _removeSubscriberByToken(token)\r\n } else {\r\n _removeSubscriber(topic)\r\n }\r\n}\r\n\r\nexport default off\r\n","import _subscribers from './_subscribers'\r\nimport _removeSubscriber from './_removeSubscriber'\r\n\r\n/**\r\n * 通过订阅者 token 值删除订阅者信息\r\n * ========================================================================\r\n * @method _removeSubscriberByToken\r\n * @param {String} token - 订阅者 token 字符串\r\n * @returns {boolean}\r\n * @private\r\n */\r\nconst _removeSubscriberByToken = (token) => {\r\n const keys = Object.keys(_subscribers)\r\n let index = -1\r\n\r\n if (!token || keys.length < 1) {\r\n return false\r\n }\r\n\r\n keys.forEach((subject) => {\r\n const subscriber = _subscribers[subject]\r\n let topic\r\n\r\n subscriber.forEach((execution, j) => {\r\n if (execution.callback === token || execution.token === token) {\r\n topic = execution.topic\r\n subscriber.splice(index, j)\r\n }\r\n })\r\n\r\n /* istanbul ignore else */\r\n if (subscriber.length < 1) {\r\n _removeSubscriber(topic)\r\n }\r\n })\r\n}\r\n\r\nexport default _removeSubscriberByToken\r\n","import isString from './utils/types/isString'\r\nimport hasOwn from './utils/lang/hasOwn'\r\nimport isObject from './utils/types/isObject'\r\nimport extend from './utils/lang/extend'\r\nimport publish from './utils/observer/emit'\r\nimport subscribe from './utils/observer/on'\r\nimport unsubscribe from './utils/observer/off'\r\n\r\nclass Base {\r\n constructor(options) {\r\n this.attrs = {}\r\n\r\n if (options) {\r\n this.initialize(options)\r\n }\r\n }\r\n\r\n initialize(options) {\r\n this.attr(options).render().addListeners()\r\n return this\r\n }\r\n\r\n attr(prop, value) {\r\n const attrs = this.attrs\r\n\r\n if (isString(prop)) {\r\n // 只能扩展 attrs 中已有的属性\r\n if (value && hasOwn(attrs, prop)) {\r\n // 更新单个配置信息\r\n attrs[prop] = value\r\n return this\r\n }\r\n\r\n // 只传递 prop 参数,则返回对应的属性值\r\n return attrs[prop]\r\n } else if (isObject(prop)) {\r\n // 批量更新配置信息\r\n extend(attrs, prop)\r\n\r\n return this\r\n } else if (arguments.length === 0) {\r\n // 不传递参数,直接返回整个\r\n return attrs\r\n }\r\n\r\n return this\r\n }\r\n\r\n render() {\r\n return this\r\n }\r\n\r\n refresh() {\r\n return this\r\n }\r\n\r\n destroy() {\r\n this.removeListeners()\r\n return this\r\n }\r\n\r\n reload(options) {\r\n let attrs = this.attr()\r\n\r\n if (options) {\r\n attrs = this.attr(options)\r\n }\r\n\r\n this.destroy().initialize(attrs)\r\n\r\n return this\r\n }\r\n\r\n $emit(event, data) {\r\n publish(event, data)\r\n return this\r\n }\r\n\r\n $on(event, callback) {\r\n subscribe(event, callback, this)\r\n return this\r\n }\r\n\r\n $off(event, callback) {\r\n unsubscribe(event, callback)\r\n return this\r\n }\r\n\r\n addListeners() {\r\n return this\r\n }\r\n\r\n removeListeners() {\r\n return this\r\n }\r\n}\r\n\r\nexport default Base\r\n","import hasOwn from './hasOwn'\r\n\r\n/**\r\n * 扩展对象\r\n * ========================================================================\r\n * @method extend\r\n * @param {Object} origin\r\n * @param {Object} source\r\n */\r\nconst extend = (origin, source) => {\r\n const keys = Object.keys(source)\r\n\r\n keys.forEach((prop) => {\r\n if (hasOwn(source, prop)) {\r\n origin[prop] = source[prop]\r\n }\r\n })\r\n}\r\n\r\nexport default extend\r\n","import _subscribers from './_subscribers'\r\nimport isFunction from '../types/isFunction'\r\nimport guid from '../lang/guid'\r\n\r\n/**\r\n * 订阅主题,并给出处理器函数\r\n * ========================================================================\r\n * @method on\r\n * @param {String} topic - (必须)主题名称\r\n * @param {Function} handler - (必须)主题的处理器函数\r\n * @param {Object} [context] - (可选)指定 this 执行上下文\r\n * @return {String} - 唯一的 token 字符串,例如:'guid-1'。\r\n */\r\nconst on = (topic, handler, context = null) => {\r\n const token = guid()\r\n let subject = typeof topic === 'symbol' ? topic.toString() : topic\r\n\r\n if (!isFunction(handler)) {\r\n return ''\r\n }\r\n\r\n /* istanbul ignore else */\r\n if (!_subscribers[subject]) {\r\n _subscribers[subject] = []\r\n }\r\n\r\n _subscribers[subject].push({\r\n topic: subject,\r\n callback: handler,\r\n context,\r\n token\r\n })\r\n\r\n return token\r\n}\r\n\r\nexport default on\r\n","import isString from './utils/types/isString'\r\nimport isFunction from './utils/types/isFunction'\r\nimport isElement from './utils/types/isElement'\r\nimport cloneDeep from './utils/lang/cloneDeep'\r\nimport timeSlice from './utils/lang/timeSlice'\r\nimport later from './utils/lang/later'\r\nimport scrollTo from './utils/dom/scrollTo'\r\nimport _getScrollElement from './utils/dom/_getScrollElement'\r\nimport offsetTop from './utils/dom/offsetTop'\r\nimport on from './utils/event/on'\r\nimport off from './utils/event/off'\r\nimport stop from './utils/event/stop'\r\nimport paint from './utils/icons/paint'\r\n\r\nimport _updateHeading from './_updateHeading'\r\nimport _removeHeading from './_removeHeading'\r\nimport getChapters from './getChapters'\r\n\r\nimport Base from './base'\r\n\r\nclass Anchors extends Base {\r\n constructor(options) {\r\n super()\r\n\r\n this._default()\r\n\r\n if (options) {\r\n this.initialize(options)\r\n }\r\n }\r\n\r\n _default() {\r\n this.attrs = cloneDeep(Anchors.DEFAULTS)\r\n\r\n this.$articleElement = null\r\n this.$scrollElement = null\r\n this.$headings = []\r\n\r\n return this\r\n }\r\n\r\n initialize(options) {\r\n let created\r\n let scrollElement\r\n let $articleElement\r\n let articleElement\r\n\r\n this.attr(options)\r\n\r\n articleElement = this.attr('articleElement')\r\n scrollElement = this.attr('scrollElement')\r\n created = this.attr('created')\r\n\r\n if (isString(articleElement)) {\r\n $articleElement = document.querySelector(articleElement)\r\n } else if (isElement(articleElement)) {\r\n $articleElement = articleElement\r\n }\r\n\r\n if (!$articleElement) {\r\n return this\r\n }\r\n\r\n this.$articleElement = $articleElement\r\n this.$scrollElement = _getScrollElement(scrollElement)\r\n this.$headings = this.getHeadings()\r\n\r\n if (this.$headings.length < 1) {\r\n return this\r\n }\r\n\r\n if (isFunction(created)) {\r\n created.call(this)\r\n }\r\n\r\n this.render().addListeners()\r\n\r\n return this\r\n }\r\n\r\n getHeadings() {\r\n const $articleElement = this.$articleElement\r\n const selector = this.attr('selector')\r\n\r\n return [...$articleElement.querySelectorAll(selector)]\r\n }\r\n\r\n count() {\r\n return this.getHeadings().length\r\n }\r\n\r\n render() {\r\n const articleElement = this.attr('articleElement')\r\n const selector = this.attr('selector')\r\n const showCode = this.attr('showCode')\r\n const chapterTextFilter = this.attr('chapterTextFilter')\r\n const mounted = this.attr('mounted')\r\n const chapters = getChapters({\r\n articleElement,\r\n selector,\r\n showCode,\r\n chapterTextFilter\r\n })\r\n\r\n paint()\r\n\r\n this._paint(chapters)\r\n\r\n if (isFunction(mounted)) {\r\n mounted.call(this)\r\n }\r\n\r\n return this\r\n }\r\n\r\n erase() {\r\n this._remove()\r\n\r\n return this\r\n }\r\n\r\n _paint(chapters) {\r\n const LIMIT = 400\r\n const hasAnchor = this.attr('hasAnchor')\r\n const isAtStart = this.attr('isAtStart')\r\n const showCode = this.attr('showCode')\r\n const anchorURL = this.attr('anchorURL')\r\n const anchorLinkFilter = this.attr('anchorLinkFilter')\r\n const count = this.count()\r\n const $headings = [...this.$headings]\r\n const update = (headings, group) => {\r\n headings.forEach(($heading, i) => {\r\n const id = i + group * LIMIT\r\n const chapterCode = chapters[id].code\r\n _updateHeading($heading, id, {\r\n hasAnchor,\r\n isAtStart,\r\n showCode,\r\n chapterCode,\r\n anchorURL,\r\n anchorLinkFilter\r\n })\r\n })\r\n }\r\n let groupIndex = -1\r\n\r\n // 针对超长的文章,进行 timeSlice 处理\r\n if (count > LIMIT) {\r\n groupIndex += 1\r\n // 同步绘制 Limit 以内的标题链接(可以确保 50ms 完成绘制)\r\n update($headings.splice(0, LIMIT), 0)\r\n // 采用 timeSlice 处理机制绘制剩余的标题\r\n while ($headings.length > 0) {\r\n const once = $headings.splice(0, LIMIT)\r\n timeSlice(\r\n () => {\r\n update(once, (groupIndex += 1))\r\n },\r\n () => {\r\n this.$emit('anchors:all:paint')\r\n }\r\n )\r\n }\r\n } else {\r\n update($headings, 0)\r\n }\r\n\r\n return this\r\n }\r\n\r\n _remove() {\r\n const hasAnchor = this.attr('hasAnchor')\r\n const isAtStart = this.attr('isAtStart')\r\n const $headings = this.$headings\r\n\r\n $headings.forEach(($heading) => {\r\n _removeHeading($heading, hasAnchor, isAtStart)\r\n })\r\n\r\n return this\r\n }\r\n\r\n refresh(chapters) {\r\n const articleElement = this.attr('articleElement')\r\n const selector = this.attr('selector')\r\n const showCode = this.attr('showCode')\r\n const chapterTextFilter = this.attr('chapterTextFilter')\r\n\r\n this.$headings = this.getHeadings()\r\n\r\n this.erase()._paint(\r\n chapters ||\r\n getChapters({\r\n articleElement,\r\n selector,\r\n showCode,\r\n chapterTextFilter\r\n })\r\n )\r\n\r\n return this\r\n }\r\n\r\n scrollTo(top, after) {\r\n const el = this.$scrollElement\r\n\r\n scrollTo(el, top, after)\r\n\r\n return this\r\n }\r\n\r\n destroy() {\r\n const beforeDestroy = this.attr('beforeDestroy')\r\n const afterDestroy = this.attr('afterDestroy')\r\n\r\n if (isFunction(beforeDestroy)) {\r\n beforeDestroy.call(this)\r\n }\r\n\r\n this.removeListeners()._remove()._default()\r\n\r\n if (isFunction(afterDestroy)) {\r\n afterDestroy.call(this)\r\n }\r\n\r\n return this\r\n }\r\n\r\n onAnchorTrigger(evt) {\r\n const anchorURL = this.attr('anchorURL')\r\n const afterScroll = this.attr('afterScroll')\r\n const stickyHeight = this.attr('stickyHeight')\r\n const $anchor = evt.delegateTarget\r\n const $heading = $anchor.parentNode\r\n const top = offsetTop($heading) - (stickyHeight + 10)\r\n const $scrollElement = this.$scrollElement\r\n const min = 0\r\n const max = $scrollElement.scrollHeight - $scrollElement.clientHeight\r\n const after = () => {\r\n if (isFunction(afterScroll)) {\r\n afterScroll.call(this, 'anchor')\r\n }\r\n\r\n later(() => {\r\n this.$emit('toolbar:update', {\r\n top,\r\n min,\r\n max\r\n })\r\n })\r\n }\r\n\r\n this.scrollTo(top, after)\r\n\r\n if (!anchorURL) {\r\n stop(evt)\r\n }\r\n\r\n return this\r\n }\r\n\r\n onRefresh(chapters) {\r\n this.refresh(chapters)\r\n\r\n return this\r\n }\r\n\r\n addListeners() {\r\n const $articleElement = this.$articleElement\r\n\r\n if (this.count() < 1) {\r\n return this\r\n }\r\n\r\n on(\r\n $articleElement,\r\n '.outline-heading__anchor',\r\n 'click',\r\n this.onAnchorTrigger,\r\n this,\r\n true\r\n )\r\n\r\n this.$on('anchors:refresh', this.onRefresh)\r\n\r\n return this\r\n }\r\n\r\n removeListeners() {\r\n const $articleElement = this.$articleElement\r\n\r\n if (this.count() < 1) {\r\n return this\r\n }\r\n\r\n off($articleElement, 'click', this.onAnchorTrigger)\r\n this.$off('anchors:refresh', this.onRefresh)\r\n\r\n return this\r\n }\r\n}\r\n\r\nAnchors.DEFAULTS = (() => {\r\n const OPTIONS = {\r\n scrollElement: 'html,body',\r\n articleElement: '#article',\r\n selector: 'h1,h2,h3,h4,h5,h6',\r\n stickyHeight: 0,\r\n anchorURL: '',\r\n hasAnchor: true,\r\n isAtStart: true,\r\n showCode: false,\r\n created: null,\r\n mounted: null,\r\n afterScroll: null,\r\n beforeDestroy: null,\r\n afterDestroy: null,\r\n chapterTextFilter: null,\r\n anchorLinkFilter: null\r\n }\r\n\r\n return cloneDeep(OPTIONS)\r\n})()\r\n\r\nexport default Anchors\r\n","import easeInQuad from '../lang/easeInQuad'\r\nimport isFunction from '../types/isFunction'\r\nimport _getScrollElement from './_getScrollElement'\r\n\r\n/**\r\n * 指定 rootElement DOM 节点滚动到指定 top 位置\r\n * ========================================================================\r\n * @method scrollTo\r\n * @param {HTMLElement|Object} [scrollElement] - (必须)要滚动的 DOM 节点\r\n * @param {Number} top - (必须)滚动的 scrollTop 数值\r\n * @param {Function} [afterStop] - (可选)滚动完成的回调函数\r\n */\r\nconst scrollTo = (scrollElement, top, afterStop) => {\r\n const $scrollElement = _getScrollElement(scrollElement)\r\n let scrollTop = $scrollElement.scrollTop\r\n let step = 0\r\n const distance = top - scrollTop\r\n const MAX_HEIGHT = $scrollElement.scrollHeight\r\n const MAX_TOP = top - MAX_HEIGHT <= 0 ? top : MAX_HEIGHT\r\n const stop = (top) => {\r\n if (isFunction(afterStop)) {\r\n afterStop(top)\r\n }\r\n\r\n return false\r\n }\r\n const play = () => {\r\n step += 1\r\n\r\n // 向上滚动\r\n if (distance < 0) {\r\n scrollTop -= easeInQuad(step)\r\n $scrollElement.scrollTop = scrollTop\r\n\r\n console.log(\r\n '$scrollElement up',\r\n scrollElement,\r\n $scrollElement,\r\n scrollTop,\r\n $scrollElement.scrollTop\r\n )\r\n\r\n if (scrollTop <= top) {\r\n $scrollElement.scrollTop = top\r\n return stop(top)\r\n }\r\n } else {\r\n scrollTop += easeInQuad(step)\r\n $scrollElement.scrollTop = scrollTop\r\n\r\n console.log(\r\n '$scrollElement down',\r\n scrollElement,\r\n $scrollElement,\r\n scrollTop,\r\n $scrollElement.scrollTop\r\n )\r\n\r\n if (scrollTop >= MAX_TOP) {\r\n $scrollElement.scrollTop = MAX_TOP\r\n return stop(MAX_TOP)\r\n }\r\n }\r\n\r\n // eslint-disable-next-line compat/compat\r\n requestAnimationFrame(play)\r\n }\r\n\r\n // eslint-disable-next-line compat/compat\r\n requestAnimationFrame(play)\r\n}\r\n\r\nexport default scrollTo\r\n","/**\r\n * 停止事件(阻止默认行为和阻止事件的捕获或冒泡)\r\n * ========================================================================\r\n * @method stop\r\n * @param {Event} evt - 事件对象\r\n *\r\n * @example\r\n *
\r\n * Service\r\n * Help\r\n *
\r\n *\r\n * const $nav = document.querySelector('#nav')\r\n * const $service = document.querySelector('.anchor')\r\n *\r\n * on($nav, 'click', function(evt) {\r\n * console.log('你点击了导航栏')\r\n * })\r\n *\r\n * on($anchor, 'click', function(evt) {\r\n * console.log('tagName', this.tagName)\r\n *\r\n * // 工作台输出:'a'\r\n * // 不会触发事件冒泡,输出:'你点击了导航栏'\r\n * // 也不会切换到 href 属性的页面,阻止了点击链接的默认行为\r\n * stopEvent(evt)\r\n * })\r\n */\r\nconst stop = function (evt) {\r\n evt.stopPropagation()\r\n evt.preventDefault()\r\n}\r\n\r\nexport default stop\r\n"],"names":["isString","str","toString","val","Object","prototype","apply","isFunction","isObject","o","isElement","nodeName","tagName","nodeType","isArray","Array","cloneDeep","obj","clone","from","assign","keys","forEach","key","later","fn","delay","setTimeout","queue","isHandling","done","runIdle","idleDeadline","timeRemaining","length","shift","requestIdleCallback","window","cb","start","Date","now","didTimeout","Math","max","cancelIdleCallback","id","clearTimeout","timeSlice","afterComplete","push","easeInQuad","x","_getScrollElement","scrollElement","$rootElements","$scrollElement","document","querySelector","querySelectorAll","scrollTop","offsetTop","el","top","offsetParent","matches","selector","sel","replace","msMatchesSelector","getParentOrHost","host","parentNode","CAPTURE_EVENTS","_off","type","capture","indexOf","_delegateListener","listeners","_listeners","index","listener","i","handler","splice","_delete","removeEventListener","purgeElement","recurse","$element","$children","childNodes","getListeners","filter","arguments","$child","off","on","data","context","once","evt","target","getTarget","delegateTarget","closest","ctx","includeCTX","startsWith","overrideContext","call","addEventListener","SYMBOLS","_maybeArrayLike","_toConsumableArray","getSymbols","name","iconSet","getSymbol","patternName","patternSet","find","symbol","fullName","exec","paint","$body","body","$icons","symbols","add","innerHTML","join","createElement","insertBefore","firstChild","trim","isDOM","isHTMLCollection","fragment","isTextNode","hasOwn","prop","hasOwnProperty","hasClass","className","pattern","RegExp","allClass","classList","contains","setAttribute","attr","value","toLowerCase","style","cssText","addClass","_classList","split","innerText","setAttributes","attrs","options","ICON","size","color","width","height","defaultRules","cssRules","$icon","$svg","binds","svg","test","isSVG","xmlns","class","_updateHeading","$heading","CLS_HEADING","hasAnchor","isAtStart","showCode","chapterCode","anchorURL","anchorLinkFilter","headingId","text","url","$anchor","icon","children","$fragment","createDocumentFragment","$el","isValidChild","child","append","createTextNode","appendChild","every","href","removeClass","remove","_removeHeading","removeAttribute","removeChild","getChaptersByHeadings","headings","chapterTextFilter","chapters","previous","level","heading","headingLevel","current","parseInt","pid","_getChapterParentIdByDiffer","differ","rel","groups","group","JSON","stringify","code","String","c","subjects","_getChaptersWithCode","getChapters","articleElement","isTreeStructured","$article","$headings","toTree","list","nodeKey","parentKey","map","roots","item","node","_subscribers","_hasDirectSubscribersFor","topic","has","isDirect","found","position","lastIndexOf","substring","_hasSubscribers","emit","async","execute","subscriber","message","callback","deliver","guid","uuid","prefix","_removeSubscriber","token","subject","execution","j","_removeSubscriberByToken","Base","constructor","this","initialize","render","addListeners","origin","source","extend","refresh","destroy","removeListeners","reload","$emit","event","publish","$on","subscribe","$off","unsubscribe","Anchors","super","_default","DEFAULTS","$articleElement","created","getHeadings","count","mounted","_paint","erase","_remove","LIMIT","update","groupIndex","scrollTo","after","afterStop","step","distance","MAX_HEIGHT","scrollHeight","MAX_TOP","stop","play","console","log","requestAnimationFrame","beforeDestroy","afterDestroy","onAnchorTrigger","afterScroll","stickyHeight","clientHeight","min","stopPropagation","preventDefault","onRefresh"],"mappings":"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"} \ No newline at end of file diff --git a/anchors/anchors.css b/anchors/anchors.css new file mode 100644 index 00000000..9d328fb7 --- /dev/null +++ b/anchors/anchors.css @@ -0,0 +1 @@ +.outline-heading{overflow:hidden;position:relative;z-index:1}.outline-heading__anchor{display:none}.outline-heading__anchor:hover,.outline-heading__anchor:link,.outline-heading__anchor:visited{color:#999;text-decoration:none}.outline-heading__anchor:hover{color:#507afe}.outline-heading:hover .outline-heading__anchor{display:inline-block}.outline-heading_start:hover{overflow:visible}.outline-heading_start .outline-heading__anchor{left:-1em;position:absolute;top:50%;transform:translateY(-50%);z-index:2} \ No newline at end of file diff --git a/anchors.js b/anchors/anchors.js similarity index 87% rename from anchors.js rename to anchors/anchors.js index 35456fae..02f7fc4c 100644 --- a/anchors.js +++ b/anchors/anchors.js @@ -1,24 +1,31 @@ -import isString from './utils/types/isString' -import isFunction from './utils/types/isFunction' -import isElement from './utils/types/isElement' -import cloneDeep from './utils/lang/cloneDeep' -import timeSlice from './utils/lang/timeSlice' -import later from './utils/lang/later' -import scrollTo from './utils/dom/scrollTo' -import _getScrollElement from './utils/dom/_getScrollElement' -import offsetTop from './utils/dom/offsetTop' -import on from './utils/event/on' -import off from './utils/event/off' -import stop from './utils/event/stop' -import paint from './utils/icons/paint' - -import _updateHeading from './_updateHeading' -import _removeHeading from './_removeHeading' -import getChapters from './getChapters' - -import Base from './base' - -class Anchors extends Base { +import isString from '@/utils/types/isString' +import isFunction from '@/utils/types/isFunction' +import isElement from '@/utils/types/isElement' + +import cloneDeep from '@/utils/lang/cloneDeep' +import timeSlice from '@/utils/lang/timeSlice' +import later from '@/utils/lang/later' + +import scrollTo from '@/utils/dom/scrollTo' +import getScrollElement from '@/utils/dom/getScrollElement' +import offsetTop from '@/utils/dom/offsetTop' + +import on from '@/utils/event/on' +import off from '@/utils/event/off' +import stop from '@/utils/event/stop' + +import paint from '@/utils/icons/paint' + +import getChapters from '@/chapters/getChapters' + +import Component from '@/component' + +import _updateHeading from './utils/_updateHeading' +import _removeHeading from './utils/_removeHeading' + +import './anchors.less' + +class Anchors extends Component { constructor(options) { super() @@ -62,7 +69,7 @@ class Anchors extends Base { } this.$articleElement = $articleElement - this.$scrollElement = _getScrollElement(scrollElement) + this.$scrollElement = getScrollElement(scrollElement) this.$headings = this.getHeadings() if (this.$headings.length < 1) { diff --git a/anchors/anchors.less b/anchors/anchors.less new file mode 100644 index 00000000..1e375e22 --- /dev/null +++ b/anchors/anchors.less @@ -0,0 +1,42 @@ +@import '../theme/colors'; + +.outline-heading { + position: relative; + z-index: 1; + overflow: hidden; + + &__anchor { + display: none; + + &:link, + &:visited, + &:hover { + color: @fourth_text_color; + text-decoration: none; + } + + &:hover { + color: @primary_color; + } + } + + &:hover { + .outline-heading__anchor { + display: inline-block; + } + } + + &_start { + &:hover { + overflow: visible; + } + + .outline-heading__anchor { + position: absolute; + z-index: 2; + top: 50%; + transform: translateY(-50%); + left: -1em; + } + } +} diff --git a/anchors/anchors.min.css b/anchors/anchors.min.css new file mode 100644 index 00000000..a0ae84cd --- /dev/null +++ b/anchors/anchors.min.css @@ -0,0 +1,6 @@ +:root{--outline-zIndex:2000;--outline-sticky-height:100%;--outline-navigator-width:100%}.outline-navigator{margin:0;overflow:auto;position:relative;width:var(--outline-navigator-width);z-index:1}.outline-navigator-parent{transition:.3s ease-in-out}.outline-navigator__title{border-bottom:1px solid #dcdfe6;font-size:16px;font-weight:400;height:40px;line-height:40px;margin:0 16px;overflow:hidden;padding:0 16px}.outline-navigator__main{margin:0;overflow:hidden;position:relative;z-index:1}.outline-navigator__item,.outline-navigator__list,.outline-navigator__subject{list-style-type:none;margin:0;overflow:hidden;padding:0;position:relative;z-index:2}.outline-navigator__list{padding:.5em 0}.outline-navigator__subject{padding-left:1em}.outline-navigator__item{font-size:13px;line-height:30px;margin:0;overflow:hidden}.outline-navigator__placeholder{background-color:#f7f8f9;border-left:2px solid #058942;box-sizing:border-box;height:30px;left:0;overflow:hidden;position:absolute;top:0;transition-duration:.2s;width:100%;z-index:1}.outline-navigator__anchor{display:block;overflow:hidden;padding:0 1.5em;text-overflow:ellipsis;white-space:nowrap}.outline-navigator__anchor:hover,.outline-navigator__anchor:link,.outline-navigator__anchor:visited{color:#555;text-decoration:none}.outline-navigator__anchor:hover{color:#058942}.outline-navigator__code{padding-right:.5em}.outline-navigator_highlight.outline-navigator__anchor:hover,.outline-navigator_highlight.outline-navigator__anchor:link,.outline-navigator_highlight.outline-navigator__anchor:visited{color:#058942;font-weight:700}.outline-navigator_fixed,.outline-navigator_sticky{display:flex;flex-direction:column;flex-wrap:nowrap;overflow:hidden;top:0;z-index:var(--outline-zIndex)}.outline-navigator_fixed .outline-navigator__main,.outline-navigator_fixed .outline-navigator__title,.outline-navigator_sticky .outline-navigator__main,.outline-navigator_sticky .outline-navigator__title{box-sizing:border-box}.outline-navigator_fixed .outline-navigator__title,.outline-navigator_sticky .outline-navigator__title{flex-shrink:0}.outline-navigator_fixed .outline-navigator__main,.outline-navigator_sticky .outline-navigator__main{flex:1;overflow:auto}.outline-navigator_sticky{max-height:var(--outline-sticky-height);position:sticky}.outline-navigator_fixed{max-height:100%;position:fixed}.outline-navigator_hidden{display:none}.outline-navigator_folded{overflow:hidden;width:0} +:root{--outline-zIndex:2000;--outline-sticky-height:100%;--outline-navigator-width:100%}.outline-drawer{box-sizing:border-box;height:100%;left:0;margin:0;overflow:hidden;position:relative;top:0;visibility:hidden;width:100%;z-index:-1}.outline-drawer__modal{background-color:#fff;box-shadow:0 0 6px 1px #dcdfe6;display:flex;flex-direction:column;flex-wrap:nowrap;height:100%;overflow:hidden;position:absolute;transition-duration:.4s;z-index:21}.outline-drawer__footer,.outline-drawer__header,.outline-drawer__main{box-sizing:border-box;width:100%}.outline-drawer__footer,.outline-drawer__header{flex-shrink:0}.outline-drawer__footer,.outline-drawer__main,.outline-drawer__title{padding:0 16px}.outline-drawer__header,.outline-drawer__title{height:52px;line-height:52px;margin:0 auto;overflow:hidden;position:relative;z-index:1}.outline-drawer__title{border-bottom:1px solid #dcdfe6;box-sizing:border-box;font-size:16px;font-weight:400;margin:0 16px}.outline-drawer__close{color:#999;cursor:pointer;font-size:20px;height:20px;line-height:20px;overflow:hidden;position:absolute;right:12px;text-align:center;top:50%;transform:translateY(-50%);width:20px;z-index:2}.outline-drawer__close .outline-icon{left:0;position:absolute;top:0;z-index:2}.outline-drawer__close:hover{color:#666}.outline-drawer__main{flex:1;overflow:auto}.outline-drawer__main.overflow-hidden{overflow:hidden}.outline-drawer__footer{margin:0 auto;overflow:hidden;text-align:right}.outline-drawer__overlay{background-color:#fff;content:"";height:100%;left:0;opacity:.1;overflow:hidden;position:relative;top:0;width:100%;z-index:1}.outline-drawer_ltr.outline-drawer_tiny,.outline-drawer_rtl.outline-drawer_tiny{width:280px}.outline-drawer_ltr.outline-drawer_mini,.outline-drawer_rtl.outline-drawer_mini{width:480px}.outline-drawer_ltr.outline-drawer_small,.outline-drawer_rtl.outline-drawer_small{width:540px}.outline-drawer_ltr.outline-drawer_regular,.outline-drawer_rtl.outline-drawer_regular{width:680px}.outline-drawer_ltr.outline-drawer_medium,.outline-drawer_rtl.outline-drawer_medium{width:720px}.outline-drawer_ltr.outline-drawer_large,.outline-drawer_rtl.outline-drawer_large{width:960px}.outline-drawer_rtl{border-left:1px solid #dcdfe6}.outline-drawer_rtl.outline-drawer_tiny.outline-drawer_closed{right:-290px}.outline-drawer_rtl.outline-drawer_mini.outline-drawer_closed{right:-490px}.outline-drawer_rtl.outline-drawer_small.outline-drawer_closed{right:-550px}.outline-drawer_rtl.outline-drawer_regular.outline-drawer_closed{right:-690px}.outline-drawer_rtl.outline-drawer_medium.outline-drawer_closed{right:-730px}.outline-drawer_rtl.outline-drawer_large.outline-drawer_closed{right:-970px}.outline-drawer_ltr{border-right:1px solid #dcdfe6}.outline-drawer_ltr.outline-drawer_tiny.outline-drawer_closed{left:-290px}.outline-drawer_ltr.outline-drawer_mini.outline-drawer_closed{left:-490px}.outline-drawer_ltr.outline-drawer_small.outline-drawer_closed{left:-550px}.outline-drawer_ltr.outline-drawer_regular.outline-drawer_closed{left:-690px}.outline-drawer_ltr.outline-drawer_medium.outline-drawer_closed{left:-730px}.outline-drawer_ltr.outline-drawer_large.outline-drawer_closed{left:-970px}.outline-drawer_btt,.outline-drawer_ttb{left:0;width:100%}.outline-drawer_btt.outline-drawer_tiny,.outline-drawer_ttb.outline-drawer_tiny{height:240px}.outline-drawer_btt.outline-drawer_mini,.outline-drawer_ttb.outline-drawer_mini{height:320px}.outline-drawer_btt.outline-drawer_small,.outline-drawer_ttb.outline-drawer_small{height:360px}.outline-drawer_btt.outline-drawer_regular,.outline-drawer_ttb.outline-drawer_regular{height:400px}.outline-drawer_btt.outline-drawer_medium,.outline-drawer_ttb.outline-drawer_medium{height:440px}.outline-drawer_btt.outline-drawer_large,.outline-drawer_ttb.outline-drawer_large{height:480px}.outline-drawer_ttb{border-bottom:1px solid #dcdfe6}.outline-drawer_ttb.outline-drawer_tiny.outline-drawer_closed{top:-250px}.outline-drawer_ttb.outline-drawer_mini.outline-drawer_closed{top:-330px}.outline-drawer_ttb.outline-drawer_small.outline-drawer_closed{top:-370px}.outline-drawer_ttb.outline-drawer_regular.outline-drawer_closed{top:-410px}.outline-drawer_ttb.outline-drawer_medium.outline-drawer_closed{top:-450px}.outline-drawer_ttb.outline-drawer_large.outline-drawer_closed{top:-490px}.outline-drawer_btt{border-top:1px solid #dcdfe6;top:auto}.outline-drawer_btt.outline-drawer_tiny.outline-drawer_closed{bottom:-250px}.outline-drawer_btt.outline-drawer_mini.outline-drawer_closed{bottom:-330px}.outline-drawer_btt.outline-drawer_small.outline-drawer_closed{bottom:-370px}.outline-drawer_btt.outline-drawer_regular.outline-drawer_closed{bottom:-410px}.outline-drawer_btt.outline-drawer_medium.outline-drawer_closed{bottom:-450px}.outline-drawer_btt.outline-drawer_large.outline-drawer_closed{bottom:-490px}.outline-drawer_opened{visibility:visible;z-index:var(--outline-zIndex)}.outline-drawer_opened.outline-drawer{position:fixed}.outline-drawer_opened.outline-drawer_rtl{right:0}.outline-drawer_opened.outline-drawer_ltr{left:0}.outline-drawer_opened.outline-drawer_ttb{top:0}.outline-drawer_opened.outline-drawer_btt{bottom:0}.outline-drawer_offset.outline-drawer_ltr,.outline-drawer_offset.outline-drawer_rtl{height:calc(100% - 4em);top:50%;transform:translateY(-50%)}.outline-drawer_offset.outline-drawer_btt,.outline-drawer_offset.outline-drawer_ttb{left:50%;transform:translateX(-50%);width:calc(100% - 4em)}.outline-drawer_offset.outline-drawer_opened.outline-drawer_rtl{right:2em}.outline-drawer_offset.outline-drawer_opened.outline-drawer_ltr{left:2em}.outline-drawer_offset.outline-drawer_opened.outline-drawer_ttb{top:2em}.outline-drawer_offset.outline-drawer_opened.outline-drawer_btt{bottom:2em}.outline-drawer_auto.outline-drawer_ltr,.outline-drawer_auto.outline-drawer_rtl{height:auto;max-height:calc(100% - 4em)}.outline-drawer_full{padding:0} +.outline-toolbar{margin:0;overflow:hidden;position:fixed;transition-duration:.3s;z-index:99999}.outline-toolbar__button{background-color:#fff;border:1px solid #dcdfe6;border-radius:3px;box-shadow:0 0 6px 1px #dcdfe6;box-sizing:border-box;color:#999;cursor:pointer;height:36px;margin:10px;overflow:hidden;position:relative;text-align:center;transition:all .3s ease-in-out .1s;width:36px;z-index:1}.outline-toolbar__button:hover{border-color:#058942;color:#058942;transform:scale(1.35)}.outline-toolbar__button.hide{display:none}.outline-toolbar__anchor:hover,.outline-toolbar__anchor:link,.outline-toolbar__anchor:visited{color:#999;text-decoration:none}.outline-toolbar__anchor:hover{color:#058942}.outline-toolbar__icon{height:20px;left:50%;position:absolute;top:50%;transform:translate(-50%,-50%);width:20px;z-index:2;fill:currentcolor;overflow:hidden}.outline-toolbar_active.outline-toolbar__button{background-color:#058942;border-color:#058942;color:#fff}.outline-toolbar_active.outline-toolbar__button:hover{color:#fff}.outline-toolbar_active .outline-toolbar__anchor:hover,.outline-toolbar_active .outline-toolbar__anchor:link,.outline-toolbar_active .outline-toolbar__anchor:visited{color:#fff}.outline-toolbar_rounded.outline-toolbar__button{border-radius:18px}.outline-toolbar_disabled .outline-toolbar__anchor:hover,.outline-toolbar_disabled .outline-toolbar__anchor:link,.outline-toolbar_disabled .outline-toolbar__anchor:visited,.outline-toolbar_disabled .outline-toolbar__button,.outline-toolbar_disabled.outline-toolbar__anchor:hover,.outline-toolbar_disabled.outline-toolbar__anchor:link,.outline-toolbar_disabled.outline-toolbar__anchor:visited,.outline-toolbar_disabled.outline-toolbar__button{border-color:#999;color:#999;cursor:not-allowed}.outline-toolbar_disabled .outline-toolbar__anchor:hover:hover,.outline-toolbar_disabled .outline-toolbar__anchor:link:hover,.outline-toolbar_disabled .outline-toolbar__anchor:visited:hover,.outline-toolbar_disabled .outline-toolbar__button:hover,.outline-toolbar_disabled.outline-toolbar__anchor:hover:hover,.outline-toolbar_disabled.outline-toolbar__anchor:link:hover,.outline-toolbar_disabled.outline-toolbar__anchor:visited:hover,.outline-toolbar_disabled.outline-toolbar__button:hover{border-color:#999;color:#999}.outline-toolbar_disabled .outline-toolbar__button,.outline-toolbar_disabled.outline-toolbar__button{background-color:#f5f5f5}.outline-toolbar_btt,.outline-toolbar_ttb{left:50%;transform:translateX(-50%)}.outline-toolbar_btt .outline-toolbar__button,.outline-toolbar_ttb .outline-toolbar__button{display:inline-block}.outline-toolbar_ttb{top:12px}.outline-toolbar_ttb.outline-toolbar_hidden{top:-56px}.outline-toolbar_btt{bottom:12px}.outline-toolbar_btt.outline-toolbar_hidden{bottom:-56px}.outline-toolbar_ltr,.outline-toolbar_rtl{transform:translateY(-50%);width:56px}.outline-toolbar_rtl{right:12px;top:50%}.outline-toolbar_rtl.outline-toolbar_hidden{right:-86px}.outline-toolbar_ltr{left:12px;top:50%}.outline-toolbar_ltr.outline-toolbar_hidden{left:-86px}.outline-toolbar_btt .outline-toolbar__button.outline-toolbar_hidden,.outline-toolbar_ltr .outline-toolbar__button.outline-toolbar_hidden,.outline-toolbar_rtl .outline-toolbar__button.outline-toolbar_hidden,.outline-toolbar_ttb .outline-toolbar__button.outline-toolbar_hidden{display:none} +.outline-reader__progress{animation:outline-reader-progress linear;background-color:#507afe;height:4px;left:0;position:fixed;scale:0 1;top:0;transform-origin:left;width:100%;z-index:3;animation-timeline:--ProgressTimeline}.outline-reader__paper{background-color:#fff;box-shadow:0 0 6px 1px #ddd;box-sizing:border-box;margin:2em auto;max-width:1200px;overflow:hidden;padding:3.2em}.outline-reader__title{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Helvetica Neue,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Helvetica,Arial,sans-serif;font-size:4.2em;font-weight:400;line-height:1.3em;margin:.67em 0;overflow:hidden;text-align:center}.outline-reader__article .outline-reader__progress,.outline-reader_hidden{display:none}.outline-reader_hidden.outline-reader_sibling{display:none!important}.outline-reader_hidden.outline-reader_sibling.wrapper.post{display:none}.outline-reader--reading{background-color:#fafafa;box-sizing:border-box;display:block;height:100%;left:0;margin:0;padding:3em 4em;position:fixed;top:0;width:100%;z-index:2;scroll-timeline-name:--ProgressTimeline;overflow:scroll}@keyframes outline-reader-progress{to{scale:1 1}}@media (max-width:500px){.outline-reader{overflow:hidden}.outline-reader .outline-toolbar{align-items:center;align-self:auto;background-color:#fff;border-top:1px solid #ddd;box-sizing:border-box;display:flex;flex-direction:row;flex-wrap:nowrap;height:48px;padding:0 16px;right:0;top:100%;transform:translateY(-48px);width:100%}.outline-reader .outline-toolbar__button{border:none;border-radius:0;box-shadow:none;flex:1}.outline-reader--reading{background-color:#fff;box-sizing:border-box;padding:0}.outline-reader__paper{box-shadow:none;height:100%;margin:0;overflow:hidden;padding:0;position:relative;z-index:1}.outline-reader__title{background-color:#fff;border-bottom:1px solid #ddd;font-size:1.8em;font-weight:400;height:48px;left:0;line-height:48px;margin:0;overflow:hidden;position:absolute;text-overflow:ellipsis;top:0;white-space:nowrap;width:100%;z-index:3}.outline-reader__article{height:calc(100% - 96px);margin:48px 0;padding:0 1.25em;scroll-timeline-name:--MobileProgressTimeline;overflow-x:hidden;overflow-y:scroll}.outline-reader__article .outline-reader__progress{animation:outline-reader-progress linear;z-index:4;animation-timeline:--MobileProgressTimeline;display:block}}@media print{body,html{background-color:#fff;color:#333;font-size:12pt;height:auto!important}a:hover,a:link,a:visited{color:#507afe;text-decoration:underline!important}audio,video{display:none!important}table{border-collapse:collapse;width:100%}td,th{border:1px solid #dcdfe6;padding:8px 20px}.outline-message,.outline-toolbar{display:none!important}.outline-reader{display:block!important;overflow:hidden}.outline-reader__title{font-size:32pt!important;margin:13.4pt 0 28pt!important;text-align:center!important}.outline-reader--reading{background-color:#fff;height:auto!important;overflow:hidden!important;padding:0!important;position:relative!important}.outline-reader__progress{display:none!important}.outline-reader__paper{box-shadow:none}.outline-reader pre{border:1px solid #ddd!important;border-radius:4px!important;padding:1em!important}.outline-reader code,.outline-reader pre{background-color:#fff!important}.outline-reader img,.outline-reader svg,.outline-reader table{break-inside:avoid}.outline-reader_sibling{display:none!important}} +.outline-icon{display:inline-block;position:relative;vertical-align:middle;z-index:1}.outline-icon,.outline-icon__svg{height:1em;overflow:hidden;width:1em}.outline-icon__svg{left:50%;position:absolute;top:50%;z-index:2;fill:currentcolor;transform:translate(-50%,-50%)}.outline-icon_hidden{display:none}.outline-message{background-color:#fff;border-radius:3px;box-shadow:0 0 6px 1px #dcdfe6;left:50%;opacity:.1;padding:0 50px;position:fixed;top:-50px;transform:translateX(-50%);transition:all .5s ease-in-out;z-index:9999}.outline-message,.outline-message__content{color:#666;font-size:13px;height:40px;line-height:40px;margin:0;overflow:hidden}.outline-message__content{max-width:700px;text-overflow:ellipsis;white-space:nowrap}.outline-message__close,.outline-message__icon{height:40px;line-height:40px;overflow:hidden;position:absolute;text-align:center;top:0;width:40px;z-index:2}.outline-message__icon{color:#fff;left:0}.outline-message__icon .outline-icon{left:50%;position:absolute;top:50%;transform:translate(-50%,-50%);z-index:2}.outline-message__close{color:#999;cursor:pointer;right:0}.outline-message__close .outline-icon{left:50%;position:absolute;top:50%;transform:translate(-50%,-50%);z-index:2}.outline-message__close:hover{color:#666}.outline-message_info .outline-message__icon{background-color:#507afe}.outline-message_warning .outline-message__icon{background-color:#ff9901}.outline-message_success .outline-message__icon{background-color:#058942}.outline-message_error .outline-message__icon{background-color:#ff5d5d}.outline-message_plain{min-width:190px;padding:0 50px 0 15px}.outline-message_plain.outline-message_info{background-color:#ecf8ff;border-left:5px solid #507afe}.outline-message_plain.outline-message_warning{background-color:#fffbe6;border-left:5px solid #ff9901}.outline-message_plain.outline-message_success{background-color:#e1f6eb;border-left:5px solid #058942}.outline-message_plain.outline-message_error{background-color:#fff1f0;border-left:5px solid #ff5d5d}.outline-message_plain .outline-message__icon{display:none;width:0}.outline-message_plain .outline-message__icon .outline-icon{display:none}.outline-message_light{min-width:180px;padding:0 40px}.outline-message_light.outline-message_info .outline-message__icon{color:#507afe}.outline-message_light.outline-message_warning .outline-message__icon{color:#ff9901}.outline-message_light.outline-message_success .outline-message__icon{color:#058942}.outline-message_light.outline-message_error .outline-message__icon{color:#ff5d5d}.outline-message_light .outline-message__icon{background-color:#fff}.outline-message_round{border-radius:20px}.outline-message_round.outline-message_default{min-width:180px;padding:0 40px}.outline-message_round.outline-message_default .outline-message__icon{border-radius:10px;height:20px;left:10px;line-height:20px;top:10px;width:20px}.outline-message_round.outline-message_default.outline-message_full-width{min-width:200px;padding:0 20px 0 40px}.outline-message_round.outline-message_plain{min-width:195px;padding:0 40px 0 20px}.outline-message_round.outline-message_plain.outline-message_full-width{min-width:215px;padding:0 20px}.outline-message_full-width{min-width:200px;padding:0 10px 0 50px}.outline-message_full-width.outline-message_plain{min-width:230px;padding:0 10px 0 15px}.outline-message_full-width.outline-message_light{min-width:210px;padding:0 10px 0 40px}.outline-message_visible{opacity:1}.outline-message_hidden{display:none} +.outline-heading{overflow:hidden;position:relative;z-index:1}.outline-heading__anchor{display:none}.outline-heading__anchor:hover,.outline-heading__anchor:link,.outline-heading__anchor:visited{color:#999;text-decoration:none}.outline-heading__anchor:hover{color:#507afe}.outline-heading:hover .outline-heading__anchor{display:inline-block}.outline-heading_start:hover{overflow:visible}.outline-heading_start .outline-heading__anchor{left:-1em;position:absolute;top:50%;transform:translateY(-50%);z-index:2} \ No newline at end of file diff --git a/anchors/anchors.min.js b/anchors/anchors.min.js new file mode 100644 index 00000000..9a3ab37e --- /dev/null +++ b/anchors/anchors.min.js @@ -0,0 +1,2 @@ +!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(t="undefined"!=typeof globalThis?globalThis:t||self).Anchors=e()}(this,(function(){"use strict";function t(t,e){(null==e||e>t.length)&&(e=t.length);for(var r=0,n=Array(e);r"string"==typeof t,s=t=>Object.prototype.toString.apply(t),o=t=>"function"==typeof t||"[object Function]"===s(t),i=t=>("[object Object]"===s(t)||"object"==typeof t||o(t))&&null!==t,l=t=>!!(i(t)&&t.nodeName&&t.tagName&&1===t.nodeType),c=t=>Array.isArray?Array.isArray(t):"[object Array]"===s(t),a=t=>{let e={};return null===t?null:(c(t)?e=Array.from(t):(e=Object.assign({},t),Object.keys(e).forEach((r=>e[r]=i(t[r])?a(t[r]):t[r]))),e)},h=(t,e=300)=>!!o(t)&&setTimeout((()=>{t()}),e),u=[];let d,m;function p(t){for(;t.timeRemaining()>0&&u.length;){const t=u.shift();if(!o(t))return!1;t()}u.length?d=requestIdleCallback(p):(d=0,o(m)&&(m(),m=null))}void 0===window.requestIdleCallback&&(window.requestIdleCallback=function(t){const e=Date.now();return h((function(){t({didTimeout:!1,timeRemaining:function(){return Math.max(0,50-(Date.now()-e))}})}),10)},window.cancelIdleCallback=function(t){clearTimeout(t)});const f=(t,e=null)=>{u.push(t),o(e)&&(m=e),d||requestIdleCallback(p)},y=t=>t*t,b=(t,e,r)=>{const s=((t=null)=>{let e,r;return t?n(t)?r=document.querySelector(t):l(t)&&(r=t):(e=document.querySelectorAll("html,body"),r=e[0].scrollTop-e[1].scrollTop>=0?e[0]:e[1]),r})(t);let i=s.scrollTop,c=0;const a=e-i,h=s.scrollHeight,u=e-h<=0?e:h,d=t=>(o(r)&&r(t),!1),m=()=>{if(c+=1,a<0){if(i-=y(c),s.scrollTop=i,i<=e)return s.scrollTop=e,d(e)}else if(i+=y(c),s.scrollTop=i,i>=u)return s.scrollTop=u,d(u);requestAnimationFrame(m)};requestAnimationFrame(m)},g=t=>{let e=t.offsetTop;return null!==t.offsetParent&&(e+=g(t.offsetParent)),e},v=(t,e="")=>{const r=e.replace(/^>/i,"");return!!(e&&r&&t)&&(t.matches?t.matches(r):!!t.msMatchesSelector&&t.msMatchesSelector(r))},z=t=>t.host&&t!==document&&t.host.nodeType?t.host:t.parentNode,x=["focusout","blur","focusin","focus","load","unload","mouseenter","mouseleave"],M=(t,e,r)=>{const n=x.indexOf(e)>-1;r._delegateListener&&delete(r=r._delegateListener)._delegateListener,function(t,e,r){const n=t._listeners;let s=-1;if(n.length<1)return!1;n.forEach(((t,n)=>{const o=t.fn;e===t.type&&(s=n,o===r&&(s=n))})),s>-1&&n.splice(s,1)}(t,e,r),t.removeEventListener(e,r,n)},w=function(t,e,r=!1){const s=n(t)?document.querySelector(t):t,o=s.childNodes,i=((t,e)=>{let r=t._listeners||[];return n(e)&&e&&(r=r.filter((t=>t.type===e))),r})(s,e);i.forEach((t=>{M(s,t.type,t.fn)})),(r||!0===e||1===arguments.length)&&s&&o&&o.forEach((t=>{l(t)&&w(t,e,r)}))},A=(t,e,r)=>{if(!o(r))return w(t,e),!1;M(t,e,r)},L=(t,e,r,n,s,o,i=!1)=>{const l=x.indexOf(r)>-1,c=function(l){const a=function(t){const e=t.target;return(r=e)&&3===r.nodeType?r.parentNode:r;var r}(l),h=((t,e,r,n)=>{const s=r||document;if(!t)return null;do{if(null!=e&&(e.startsWith(">")?t.parentNode===s&&v(t,e):v(t,e))||n&&t===s)return t;if(t===s)break}while(t=z(t))})(a,e,t);let u=o||t;l.delegateTarget=h,!0===o&&(u=s),h&&(!0===i&&A(t,r,c),n.call(u,l,s))};if(!t)return!1;t._listeners||(t._listeners=[]),t._listeners.push({el:t,selector:e,type:r,fn:c,data:s,context:o,capture:l}),n._delegateListener=c,t.addEventListener(r,c,l)},T=e(r,['','','','','','','','','','','','','','','','','','','','']),$=(t,s="icon")=>n(t)?((t,e="icon")=>{const r=/id="(.*?)"/,n=/^(\w+)-/;return T.find((s=>{const o=r.exec(s)[1];return n.exec(o)[1]===e&&o===("icon"===e?`${e}-${t}`:`${e}-icon-${t}`)}))})(t,s):e(r,T),E=(t="")=>{const e=document.body;let r=document.querySelector("#outline-icons"),s=[];(t=>{if(!t)return!1;c(t)&&t.length>0?t.forEach((t=>{-1===T.indexOf(t)&&n(t)&&T.push(t)})):n(t)&&T.push(t)})(t),s=$(),r?r.innerHTML=s.join(""):(r=document.createElement("div"),r.innerHTML=``,e.insertBefore(r.firstChild,e.firstChild))},S=t=>!!n(t)&&t.replace(/(^\s+)|(\s+$)/g,""),C=(t,e=!1,r=null)=>{const s=/^\d(\.|(\.\d+)*)\s?/gi,i=[];let l=1,a=0,h="";return t.forEach(((t,c)=>{const u=t.tagName,d=u.replace(/h/i,"");let m=parseInt(d,10),p=-1;var f;m>l?(a+=1,p=1===a?-1:c-1):m===l||ma?1===m?(a=1,p=-1):p=i[c-1].pid:m<=a&&(1===m?a=1:(a-=l-m,a<=1&&(a=1)),p=1===a?-1:((t,e,r)=>{let n,s,o=t[r-1];for(s=0;s]+(>|$)/g,""):"")),e&&(h=S(h.replace(s,""))),o(r)&&(h=r(h)),i.push({id:c,pid:p,level:a,rel:`heading-${c}`,text:h,tagName:u})})),e?(t=>{const e={};return t.forEach((t=>{const r=JSON.stringify((t=>[t.pid])(t));e[r]=e[r]||[],e[r].push(t),t.index=e[r].length,-1===t.pid&&(t.code=String(t.index))})),Object.keys(e).forEach((t=>{e[t].forEach((t=>{const r=e[`[${t.id}]`];if(!r||!c(r))return!1;r.forEach((e=>{e.code=t.code+"."+e.index}))}))})),t})(i):i},k=t=>{const{articleElement:s,selector:i,showCode:c,chapterTextFilter:a,isTreeStructured:h}=t;let u=document.querySelector("#article"),d=[],m=[],p=null;return n(s)?u=document.querySelector(s):l(s)&&(u=s),u?(o(a)?p=a:!0===a&&(p=t=>t.replace(/\(.*?\)/,"()")),d=e(r,u.querySelectorAll(i||"h1,h2,h3,h4,h5,h6")),m=C(d,c,p),!0===h?((t,e,r)=>{const n={},s=[];return t.forEach(((t,r)=>{n[t[e]]=r,t.children=[]})),t.forEach((e=>{const o=t[n[e[r]]];-1!==e[r]?o.children.push(e):s.push(e)})),s})(m,"id","pid"):m):m},j=(t,e)=>{const r=Object.prototype.hasOwnProperty;return t&&r.call(t,e)},H={},N=t=>j(H,t)&&H[t].length>0,_=(t,e=!0)=>e?N(t):(t=>{let e=N(t),r=t.lastIndexOf(".");for(;!e&&-1!==r;)r=(t=t.substring(0,r)).lastIndexOf("."),e=N(t);return e})(t),B=(t,e,r=!0)=>{const n=t=>{if(!N(t))return!1;H[t].forEach((t=>{const r=["[object Int8Array]","[object Uint8Array]","[object Uint8ClampedArray]","[object Int16Array]","[object Uint16Array]","[object Int32Array]","[object Uint32Array]","[object Float32Array]","[object Float64Array]","[object BigInt64Array]","[object BigUint64Array]"].indexOf(s(e))>-1?e.toString():e;t.callback.call(t.context||t,r)}))},o=()=>{let e=t,r=t.lastIndexOf(".");for(;-1!==r;)e=e.substring(0,r),r=e.lastIndexOf("."),n(e);n(t),n("*")};if(!_(t))return!1;r?setTimeout(o,10):o()},q=(()=>{let t=0;return e=>(t+=1,e?e+"-"+t:"guid-"+t)})(),O=t=>{if(!j(H,t))return!1;delete H[t]},F=(t,e)=>{if(!_(t))return!1;e?(t=>{const e=Object.keys(H);if(!t||e.length<1)return!1;e.forEach((e=>{const r=H[e];let n;r.forEach(((e,s)=>{e.callback!==t&&e.token!==t||(n=e.topic,r.splice(-1,s))})),r.length<1&&O(n)}))})(e):O(t)};class I{constructor(t){this.attrs={},this.name="component",t&&this.initialize(t)}initialize(t){return this.attr(t).render().addListeners(),this}attr(t,e){const r=this.attrs;return n(t)?e&&j(r,t)?(r[t]=e,this):r[t]:i(t)?(s=r,o=t,Object.keys(o).forEach((t=>{j(o,t)&&(s[t]=o[t])})),this):0===arguments.length?r:this;var s,o}render(){return this}refresh(){return this}destroy(){return this.removeListeners(),this}reload(t){let e=this.attr();return t&&(e=this.attr(t)),this.destroy().initialize(e),this}$emit(t,e){return B(t,e),this}$on(t,e){return((t,e,r=null)=>{const n=q();let s="symbol"==typeof t?t.toString():t;o(e)&&(H[s]||(H[s]=[]),H[s].push({topic:s,callback:e,context:r,token:n}))})(t,e,this),this}$off(t,e){return F(t,e),this}addListeners(){return this}removeListeners(){return this}}const U=t=>{return!(!i(t)||!(l(t)||(t=>!(!i(t)||"[object NodeList]"!==s(t)))(t)||(e=t,i(e)&&"[object DocumentFragment]"===s(e))||(t=>!(!i(t)||!("[object Text]"===s(t)||t.tagName&&3===t.nodeType)))(t)));var e},R=(t,e)=>{const r=new RegExp("(\\s|^)"+e+"(\\s|$)");let n,s;return!!l(t)&&(n=t.className,!!n&&(s=t.classList,s&&s.contains?t.classList.contains(e):!!r.exec(n)))},D=(t,e,r)=>{let n=t.tagName.toLowerCase();switch(e){case"style":t.style.cssText=r;break;case"value":"input"===n||"textarea"===n?t.value=r:t.setAttribute(e,r);break;case"htmlFor":t.setAttribute("for",r);break;case"className":((t,e)=>{var r;let n,s;if(R(t,e))return!1;n=t.classList,null!==(r=n)&&void 0!==r&&r.add?e.indexOf(" ")>-1?e.split(" ").forEach((t=>{n.add(t)})):n.add(e):(s=t.className,s+=s.length>0?" "+e:e,t.className=s)})(t,r);break;case"innerHTML":t.innerHTML=r;break;case"innerText":t.innerText=r;break;default:t.setAttribute(e,r)}},V=(t,e)=>{if(!t||!i(e))return!1;Object.keys(e).forEach((r=>{const n=e[r];j(e,r)&&D(t,r,n)}))},P=(t,e={})=>{const r="outline-icon",s=e.size||0,o=e.color||"",i=e.iconSet||"",l=c(s)?s[0]:s,a=c(s)?s[1]:s,h=s?`width:${l}px;height:${a}px;`:"",u=o?h+`color:${o}`:h,d=e.attrs||{},m=document.createElement("i");let p,f="",y="";return n(t)?((t=>{const e=new RegExp("^\\s*(?:<\\?xml[^>]*>\\s*)?(?:<\\!doctype svg[^>]*\\s*(?:\\[?(?:\\s*]*>\\s*)*\\]?)*[^>]*>\\s*)?]*>[^]*<\\/svg>\\s*$\\s*$","i");return n(t)&&e.test(t)})(t)?y=t:(f=i&&"icon"!==i?`xlink:href="#${i}-icon-${t}"`:`xlink:href="#icon-${t}"`,y=``),m.innerHTML=y,d.className?d.className=`${r} ${d.className}`:d.className=r,V(m,d),p=m.querySelector("svg"),V(p,{"aria-hidden":!0,xmlns:"http://www.w3.org/2000/svg",class:"outline-icon__svg",width:200,height:200,style:u}),m):null},J=(t,e,r)=>{const s="outline-heading",l=r.hasAnchor||!0,a=r.isAtStart||!0,h=r.showCode||!1,u=r.chapterCode||"",d=r.anchorURL||"",m=r.anchorLinkFilter||null,p=`heading-${e}`,f={id:p,className:a?`${s} ${s}_start`:s,"data-id":e},y=S(t.innerHTML);let b,g,v;if(h&&(f.innerHTML=u+" "+y,f["data-code"]=u),V(t,f),!l)return!1;b=d||(o(m)?m(t.tagName.toLowerCase(),y,e):`#${p}`),v=((t,e={})=>P(t,e))("hash",{iconSet:"outline"}),g=((t,e,r)=>{const s=document.createDocumentFragment(),o=document.createElement(t),l=t=>U(t)||n(t),a=t=>{let e;if(!l(t))return!1;U(t)?e=t:n(t)&&(e=document.createTextNode(t)),s.appendChild(e)};return i(e)?V(o,e):c(e)&&e.every((t=>l(t)))?e.forEach((t=>{a(t)})):U(e)?a(e):n(e)&&a(document.createTextNode(e)),c(r)?r.forEach((t=>{a(t)})):a(r),o.appendChild(s),o})("a",{id:`anchor-${e}`,className:`${s}__anchor anchor-${e}`,href:b,target:d?"_blank":"self","data-id":e},v),t.appendChild(g)},W=(t,e)=>{var r;let n,s=t.className;if(!s||!R(t,e))return!1;n=t.classList,null!==(r=n)&&void 0!==r&&r.remove?n.remove(e):(s=S(s.replace(e,"")),t.className=s)},G=(t,e=!0,r=!0)=>{const s="outline-heading",o=t.innerHTML;let i;if(t.innerHTML=o.replace(/^\d+(\.?\d+)*\s?/gi,""),t.removeAttribute("id"),t.removeAttribute("data-id"),W(t,s),!e)return!1;var l;i=t.querySelector(`.${s}__anchor`),r&&W(t,`${s}_start`),l=S(t.className),n(l)&&""===l&&t.removeAttribute("class"),i&&t.removeChild(i)};class K extends I{constructor(t){super(),this._default(),t&&this.initialize(t)}_default(){return this.attrs=a(K.DEFAULTS),this.$articleElement=null,this.$scrollElement=null,this.$headings=[],this}initialize(t){let e,r,s,i;return this.attr(t),i=this.attr("articleElement"),r=this.attr("scrollElement"),e=this.attr("created"),n(i)?s=document.querySelector(i):l(i)&&(s=i),s?(this.$articleElement=s,this.$scrollElement=((t=null)=>{let e,r;return t?n(t)?r=document.querySelector(t):l(t)&&(r=t):(e=document.querySelectorAll("html,body"),r=e[0].scrollTop-e[1].scrollTop>=0?e[0]:e[1]),r})(r),this.$headings=this.getHeadings(),this.$headings.length<1||(o(e)&&e.call(this),this.render().addListeners()),this):this}getHeadings(){const t=this.$articleElement,n=this.attr("selector");return e(r,t.querySelectorAll(n))}count(){return this.getHeadings().length}render(){const t=this.attr("articleElement"),e=this.attr("selector"),r=this.attr("showCode"),n=this.attr("chapterTextFilter"),s=this.attr("mounted"),i=k({articleElement:t,selector:e,showCode:r,chapterTextFilter:n});return E(),this._paint(i),o(s)&&s.call(this),this}erase(){return this._remove(),this}_paint(t){const n=400,s=this.attr("hasAnchor"),o=this.attr("isAtStart"),i=this.attr("showCode"),l=this.attr("anchorURL"),c=this.attr("anchorLinkFilter"),a=this.count(),h=e(r,this.$headings),u=(e,r)=>{e.forEach(((e,a)=>{const h=a+r*n,u=t[h].code;J(e,h,{hasAnchor:s,isAtStart:o,showCode:i,chapterCode:u,anchorURL:l,anchorLinkFilter:c})}))};let d=-1;if(a>n)for(d+=1,u(h.splice(0,n),0);h.length>0;){const t=h.splice(0,n);f((()=>{u(t,d+=1)}),(()=>{this.$emit("anchors:all:paint")}))}else u(h,0);return this}_remove(){const t=this.attr("hasAnchor"),e=this.attr("isAtStart");return this.$headings.forEach((r=>{G(r,t,e)})),this}refresh(t){const e=this.attr("articleElement"),r=this.attr("selector"),n=this.attr("showCode"),s=this.attr("chapterTextFilter");return this.$headings=this.getHeadings(),this.erase()._paint(t||k({articleElement:e,selector:r,showCode:n,chapterTextFilter:s})),this}scrollTo(t,e){const r=this.$scrollElement;return b(r,t,e),this}destroy(){const t=this.attr("beforeDestroy"),e=this.attr("afterDestroy");return o(t)&&t.call(this),this.removeListeners()._remove()._default(),o(e)&&e.call(this),this}onAnchorTrigger(t){const e=this.attr("anchorURL"),r=this.attr("afterScroll"),n=this.attr("stickyHeight"),s=t.delegateTarget.parentNode,i=g(s)-(n+10),l=this.$scrollElement,c=l.scrollHeight-l.clientHeight;return this.scrollTo(i,(()=>{o(r)&&r.call(this,"anchor"),h((()=>{this.$emit("toolbar:update",{top:i,min:0,max:c})}))})),e||function(t){t.stopPropagation(),t.preventDefault()}(t),this}onRefresh(t){return this.refresh(t),this}addListeners(){const t=this.$articleElement;return this.count()<1||(L(t,".outline-heading__anchor","click",this.onAnchorTrigger,this,!0),this.$on("anchors:refresh",this.onRefresh)),this}removeListeners(){const t=this.$articleElement;return this.count()<1||(A(t,"click",this.onAnchorTrigger),this.$off("anchors:refresh",this.onRefresh)),this}}return K.DEFAULTS=a({scrollElement:"html,body",articleElement:"#article",selector:"h1,h2,h3,h4,h5,h6",stickyHeight:0,anchorURL:"",hasAnchor:!0,isAtStart:!0,showCode:!1,created:null,mounted:null,afterScroll:null,beforeDestroy:null,afterDestroy:null,chapterTextFilter:null,anchorLinkFilter:null}),K})); +//# sourceMappingURL=anchors.min.js.map diff --git a/anchors/anchors.min.js.map b/anchors/anchors.min.js.map new file mode 100644 index 00000000..0b0fea85 --- /dev/null +++ b/anchors/anchors.min.js.map @@ -0,0 +1 @@ +{"version":3,"file":"anchors.min.js","sources":["../utils/types/isString.js","../utils/lang/toString.js","../utils/types/isFunction.js","../utils/types/isObject.js","../utils/types/isElement.js","../utils/types/isArray.js","../utils/lang/cloneDeep.js","../utils/lang/later.js","../utils/lang/timeSlice.js","../utils/lang/easeInQuad.js","../utils/dom/scrollTo.js","../navigator/utils/_getScrollElement.js","../utils/dom/offsetTop.js","../utils/dom/matches.js","../utils/dom/getParentOrHost.js","../utils/event/enum.js","../utils/event/_off.js","../utils/event/_delete.js","../utils/event/purgeElement.js","../utils/event/getListeners.js","../utils/event/off.js","../utils/event/on.js","../utils/event/getTarget.js","../utils/dom/resolveTextNode.js","../utils/dom/closest.js","../utils/icons/symbols.js","../utils/icons/defaults.js","../utils/icons/getSymbols.js","../utils/icons/getSymbol.js","../utils/icons/paint.js","../utils/icons/add.js","../utils/lang/trim.js","../chapters/getChaptersByHeadings.js","../utils/lang/stripTags.js","../chapters/_getChapterParentIdByDiffer.js","../chapters/_getChaptersWithCode.js","../chapters/getChapters.js","../utils/lang/toTree.js","../utils/lang/hasOwn.js","../utils/observer/_subscribers.js","../utils/observer/_hasDirectSubscribersFor.js","../utils/observer/has.js","../utils/observer/_hasSubscribers.js","../utils/observer/emit.js","../utils/types/isTypedArray.js","../utils/lang/guid.js","../utils/observer/_removeSubscriber.js","../utils/observer/off.js","../utils/observer/_removeSubscriberByToken.js","../component.js","../utils/lang/extend.js","../utils/observer/on.js","../utils/types/isHTMLCollection.js","../utils/types/isDOM.js","../utils/types/isFragment.js","../utils/types/isTextNode.js","../utils/dom/hasClass.js","../utils/dom/setAttribute.js","../utils/dom/addClass.js","../utils/dom/setAttributes.js","../utils/icons/createElement.js","../utils/types/isSVG.js","utils/_updateHeading.js","../utils/icons/icon.js","../utils/dom/createElement.js","../utils/dom/removeClass.js","utils/_removeHeading.js","../utils/types/isEmpty.js","anchors.js","../utils/dom/getScrollElement.js","../utils/event/stop.js"],"sourcesContent":["/**\r\n * 检测数据是否为 String 类型\r\n * ========================================================================\r\n * @method isArray\r\n * @param {*} str\r\n * @returns {boolean}\r\n */\r\nconst isString = (str) => {\r\n return typeof str === 'string'\r\n}\r\n\r\nexport default isString\r\n","/**\r\n * Object 对象原型上的 toString 方法\r\n * ========================================================================\r\n * @method toString\r\n * @param {*} val\r\n * @returns {string}\r\n */\r\nconst toString = (val) => {\r\n return Object.prototype.toString.apply(val)\r\n}\r\n\r\nexport default toString\r\n","import toString from '@/utils/lang/toString'\r\n\r\n/**\r\n * 检测测试数据是否为 Function 类型\r\n * ========================================================================\r\n * @method isFunction\r\n * @param {*} val - (必须)待检测的数据\r\n * @returns {boolean} 'val' 是 Function 类型返回 true,否则返回 false\r\n */\r\nconst isFunction = (val) => {\r\n return typeof val === 'function' || toString(val) === '[object Function]'\r\n}\r\n\r\nexport default isFunction\r\n","import toString from '../lang/toString'\r\nimport isFunction from './isFunction'\r\n\r\n/**\r\n * 检测数据是否为 Object 类型\r\n * ========================================================================\r\n * @method isObject\r\n * @param {*} o\r\n * @returns {boolean}\r\n */\r\nconst isObject = (o) => {\r\n return (\r\n (toString(o) === '[object Object]' ||\r\n typeof o === 'object' ||\r\n isFunction(o)) &&\r\n o !== null\r\n )\r\n}\r\n\r\nexport default isObject\r\n","import isObject from './isObject'\r\n\r\n/**\r\n * 检测数据是否为 HTMLElement DOM 节点\r\n * ========================================================================\r\n * @method isElement\r\n * @param {*} o\r\n * @returns {boolean}\r\n */\r\nconst isElement = (o) => {\r\n return !!(isObject(o) && o.nodeName && o.tagName && o.nodeType === 1)\r\n}\r\n\r\nexport default isElement\r\n","import toString from '@/utils/lang/toString'\r\n\r\n/**\r\n * 检测数据是否为 Array 类型\r\n * ========================================================================\r\n * @method isArray\r\n * @param {*} o\r\n * @returns {boolean}\r\n */\r\nconst isArray = (o) => {\r\n if (Array.isArray) {\r\n return Array.isArray(o)\r\n } else {\r\n return toString(o) === '[object Array]'\r\n }\r\n}\r\n\r\nexport default isArray\r\n","import isObject from '@/utils/types/isObject'\r\nimport isArray from '@/utils/types/isArray'\r\n\r\n/**\r\n * 深拷贝对象函数\r\n * ========================================================================\r\n * @methods cloneDeep\r\n * @param {Object} obj - 深拷贝的对象\r\n * @returns {Array|Object|*}\r\n *\r\n * @example\r\n * const arr = cloneDeep([2,3,4,6])\r\n * => [2,3,4,6]\r\n */\r\nconst cloneDeep = (obj) => {\r\n let clone = {}\r\n\r\n if (obj === null) {\r\n return null\r\n }\r\n\r\n if (isArray(obj)) {\r\n clone = Array.from(obj)\r\n } else {\r\n clone = Object.assign({}, obj)\r\n Object.keys(clone).forEach((key) => {\r\n return (clone[key] = isObject(obj[key]) ? cloneDeep(obj[key]) : obj[key])\r\n })\r\n }\r\n\r\n return clone\r\n}\r\n\r\nexport default cloneDeep\r\n","import isFunction from '@/utils/types/isFunction'\r\n\r\n/**\r\n * later - 延迟执行方法\r\n * ========================================================================\r\n * @method later\r\n * @param {Function} fn\r\n * @param {Number} [delay]\r\n * @returns {number|boolean}\r\n */\r\nconst later = (fn, delay = 300) => {\r\n if (!isFunction(fn)) {\r\n return false\r\n }\r\n\r\n return setTimeout(() => {\r\n fn()\r\n }, delay)\r\n}\r\n\r\nexport default later\r\n","/**\r\n * timeSlice.js 时间切片功能函数\r\n * ====================================================\r\n * Created By: Yaohaixiao\r\n * Update: 2023.09.04\r\n */\r\nimport isFunction from '@/utils/types/isFunction'\r\nimport later from './later'\r\n\r\nconst queue = []\r\nlet isHandling\r\nlet done\r\n\r\n// Shim from https://developers.google.com/web/updates/2015/08/using-requestidlecallback\r\nif (typeof window.requestIdleCallback === 'undefined') {\r\n window.requestIdleCallback = function (cb) {\r\n const start = Date.now()\r\n return later(function () {\r\n cb({\r\n didTimeout: false,\r\n timeRemaining: function () {\r\n return Math.max(0, 50 - (Date.now() - start))\r\n }\r\n })\r\n }, 10)\r\n }\r\n\r\n window.cancelIdleCallback = function (id) {\r\n clearTimeout(id)\r\n }\r\n}\r\n\r\nfunction runIdle(idleDeadline) {\r\n while (idleDeadline.timeRemaining() > 0 && queue.length) {\r\n const fn = queue.shift()\r\n\r\n if (!isFunction(fn)) {\r\n return false\r\n }\r\n\r\n fn()\r\n }\r\n\r\n if (queue.length) {\r\n isHandling = requestIdleCallback(runIdle)\r\n } else {\r\n isHandling = 0\r\n\r\n if (isFunction(done)) {\r\n done()\r\n done = null\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * 时间切片功能函数:主要用于优化长时任务的性能,将长时任务分解成\r\n * 多个短时间任务\r\n * ====================================================\r\n * @param {Function} fn - 需要在空闲时执行的回调函数\r\n * @param {Function} afterComplete - queen 的\r\n * @return {(function(): (boolean|undefined))|*|boolean}\r\n */\r\nconst timeSlice = (fn, afterComplete = null) => {\r\n queue.push(fn)\r\n\r\n if (isFunction(afterComplete)) {\r\n done = afterComplete\r\n }\r\n\r\n if (!isHandling) {\r\n requestIdleCallback(runIdle)\r\n }\r\n}\r\n\r\nexport default timeSlice\r\n","/**\r\n * 返回给定值的平方值\r\n * ========================================================================\r\n * @method easeInQuad\r\n * @param {Number} x\r\n * @returns {number}\r\n */\r\nconst easeInQuad = (x) => {\r\n return x * x\r\n}\r\n\r\nexport default easeInQuad\r\n","import easeInQuad from '../lang/easeInQuad'\r\nimport isFunction from '../types/isFunction'\r\nimport _getScrollElement from '../../navigator/utils/_getScrollElement'\r\n\r\n/**\r\n * 指定 rootElement DOM 节点滚动到指定 top 位置\r\n * ========================================================================\r\n * @method scrollTo\r\n * @param {HTMLElement|Object} [scrollElement] - (必须)要滚动的 DOM 节点\r\n * @param {Number} top - (必须)滚动的 scrollTop 数值\r\n * @param {Function} [afterStop] - (可选)滚动完成的回调函数\r\n */\r\nconst scrollTo = (scrollElement, top, afterStop) => {\r\n const $scrollElement = _getScrollElement(scrollElement)\r\n let scrollTop = $scrollElement.scrollTop\r\n let step = 0\r\n const distance = top - scrollTop\r\n const MAX_HEIGHT = $scrollElement.scrollHeight\r\n const MAX_TOP = top - MAX_HEIGHT <= 0 ? top : MAX_HEIGHT\r\n const stop = (top) => {\r\n if (isFunction(afterStop)) {\r\n afterStop(top)\r\n }\r\n\r\n return false\r\n }\r\n const play = () => {\r\n step += 1\r\n\r\n // 向上滚动\r\n if (distance < 0) {\r\n scrollTop -= easeInQuad(step)\r\n $scrollElement.scrollTop = scrollTop\r\n\r\n if (scrollTop <= top) {\r\n $scrollElement.scrollTop = top\r\n return stop(top)\r\n }\r\n } else {\r\n scrollTop += easeInQuad(step)\r\n $scrollElement.scrollTop = scrollTop\r\n\r\n if (scrollTop >= MAX_TOP) {\r\n $scrollElement.scrollTop = MAX_TOP\r\n return stop(MAX_TOP)\r\n }\r\n }\r\n\r\n // eslint-disable-next-line compat/compat\r\n requestAnimationFrame(play)\r\n }\r\n\r\n // eslint-disable-next-line compat/compat\r\n requestAnimationFrame(play)\r\n}\r\n\r\nexport default scrollTo\r\n","import isString from '../../utils/types/isString'\r\nimport isElement from '../../utils/types/isElement'\r\n\r\n/**\r\n * 通过给的 scrollElement 参数,获取滚动 DOM 元素\r\n * ========================================================================\r\n * @method _getScrollElement\r\n * @param {String|HTMLElement} scrollElement\r\n * @returns {Element}\r\n * @private\r\n */\r\nconst _getScrollElement = (scrollElement = null) => {\r\n let $rootElements\r\n let $scrollElement\r\n\r\n if (!scrollElement) {\r\n $rootElements = document.querySelectorAll('html,body')\r\n $scrollElement =\r\n $rootElements[0].scrollTop - $rootElements[1].scrollTop >= 0\r\n ? $rootElements[0]\r\n : $rootElements[1]\r\n } else {\r\n if (isString(scrollElement)) {\r\n $scrollElement = document.querySelector(scrollElement)\r\n } else if (isElement(scrollElement)) {\r\n $scrollElement = scrollElement\r\n }\r\n }\r\n\r\n return $scrollElement\r\n}\r\n\r\nexport default _getScrollElement\r\n","/**\r\n * 获取 DOM 节点相对于窗口的 left (纵坐标)值\r\n * ========================================================================\r\n * @method offsetTop\r\n * @param {HTMLElement} el - DOM 节点\r\n * @returns {Number}\r\n */\r\nconst offsetTop = (el) => {\r\n let top = el.offsetTop\r\n\r\n if (el.offsetParent !== null) {\r\n top += offsetTop(el.offsetParent)\r\n }\r\n\r\n return top\r\n}\r\n\r\nexport default offsetTop\r\n","/**\r\n * 获取 options 节点下匹配 selector 选择器的 DOM 节点\r\n * ========================================================================\r\n * Element.matches() 方法可以用来判断 DOM 元素是否与给定的选择器匹配,事件代理判断是\r\n * 否触发绑定的代理事件回调函数,关键就是使用 Element.matches() 辨别当前事件触发的目\r\n * 标 DOM 元素是否为事件代理所期望触发的目标。\r\n * ========================================================================\r\n * @method matches\r\n * @see https://developer.mozilla.org/en-US/docs/web/api/element/matches\r\n * @param {HTMLElement} el - (必须)DOM 元素\r\n * @param {String} selector - (必须)匹配 DOM 元素的选择器\r\n * @returns {Boolean}\r\n */\r\nconst matches = (el, selector = '') => {\r\n const sel = selector.replace(/^>/i, '')\r\n\r\n if (!selector || !sel || !el) {\r\n return false\r\n }\r\n\r\n /* istanbul ignore else */\r\n if (el.matches) {\r\n return el.matches(sel)\r\n } else if (el.msMatchesSelector) {\r\n return el.msMatchesSelector(sel)\r\n } else {\r\n return false\r\n }\r\n}\r\n\r\nexport default matches\r\n","/**\r\n * 获取 DOM 元素的父节点\r\n * ========================================================================\r\n * @method getParentOrHost\r\n * @param {*|HTMLElement} el - (必须)要获取父节点的 DOM 元素\r\n * @returns {*|HTMLElement}\r\n */\r\nconst getParentOrHost = (el) => {\r\n return el.host && el !== document && el.host.nodeType\r\n ? el.host\r\n : el.parentNode\r\n}\r\n\r\nexport default getParentOrHost\r\n","export const CAPTURE_EVENTS = [\r\n 'focusout',\r\n 'blur',\r\n 'focusin',\r\n 'focus',\r\n 'load',\r\n 'unload',\r\n 'mouseenter',\r\n 'mouseleave'\r\n]\r\n","import { CAPTURE_EVENTS } from './enum'\r\nimport _delete from './_delete'\r\n\r\n/**\r\n * (私有方法)取消 type 类型的代理事件绑定\r\n * ========================================================================\r\n * 如果没有设置 handler,则销毁 this.$options 绑定的所有符合 type 事件类型的事件绑定\r\n * ========================================================================\r\n * @method _off\r\n * @param {HTMLElement} el - (必须)取消事件绑定的 DOM 元素\r\n * @param {String} type - (必须)事件类型\r\n * @param {Function} fn - (必须)事件处理器回调函数\r\n * @private\r\n */\r\nconst _off = (el, type, fn) => {\r\n const capture = CAPTURE_EVENTS.indexOf(type) > -1\r\n\r\n /* istanbul ignore else */\r\n if (fn._delegateListener) {\r\n fn = fn._delegateListener\r\n delete fn._delegateListener\r\n }\r\n\r\n // 移除缓存的 _listeners 数据\r\n _delete(el, type, fn)\r\n\r\n el.removeEventListener(type, fn, capture)\r\n}\r\n\r\nexport default _off\r\n","/**\r\n * 删除 DOM 元素缓存的 _listeners 数据\r\n * ========================================================================\r\n * @method _delete\r\n * @param {HTMLElement} el - 要删除 listener 的 DOM 元素\r\n * @param {String} type - 事件类型(名称)\r\n * @param {Function} [fn] - 事件处理器回调函数\r\n */\r\nconst _delete = function (el, type, fn) {\r\n const listeners = el._listeners\r\n let index = -1\r\n\r\n if (listeners.length < 1) {\r\n return false\r\n }\r\n\r\n // 移除缓存的 _listeners 数据\r\n listeners.forEach((listener, i) => {\r\n const handler = listener.fn\r\n\r\n if (type === listener.type) {\r\n index = i\r\n\r\n if (handler === fn) {\r\n index = i\r\n }\r\n }\r\n })\r\n\r\n /* istanbul ignore else */\r\n if (index > -1) {\r\n listeners.splice(index, 1)\r\n }\r\n}\r\n\r\nexport default _delete\r\n","import isString from '@/utils/types/isString'\r\nimport isElement from '@/utils/types/isElement'\r\nimport getListeners from './getListeners'\r\nimport _off from './_off'\r\n\r\n/**\r\n * 销毁(type 类型的)代理事件绑定\r\n * ========================================================================\r\n * 1. 设置了事件类型 type,则销毁指定类型的事件绑定,否则清除所有代理事件绑定\r\n * 2. recurse 设置为 true,递归销毁子节点全部事件绑定\r\n * ========================================================================\r\n * @method purgeElement\r\n * @param {HTMLElement|String} el - (必须)DOM 元素或者其选择器\r\n * @param {String|Boolean} type - (必须)事件类型\r\n * @param {Boolean} [recurse] - (可选)是否递归销毁子节点所有事件绑定\r\n */\r\nconst purgeElement = function (el, type, recurse = false) {\r\n const $element = isString(el) ? document.querySelector(el) : el\r\n const $children = $element.childNodes\r\n const listeners = getListeners($element, type)\r\n\r\n listeners.forEach((listener) => {\r\n _off($element, listener.type, listener.fn)\r\n })\r\n\r\n if (\r\n (recurse || type === true || arguments.length === 1) &&\r\n $element &&\r\n $children\r\n ) {\r\n $children.forEach(($child) => {\r\n if (isElement($child)) {\r\n purgeElement($child, type, recurse)\r\n }\r\n })\r\n }\r\n}\r\n\r\nexport default purgeElement\r\n","import isString from '@/utils/types/isString'\r\n\r\n/**\r\n * 获取 DOM 元素(type 事件类型)事件绑定信息\r\n * ========================================================================\r\n * 如果设置了事件类型 type, 则返回指定类型的事件绑定信息,否则返回所有事件绑定信息\r\n * ========================================================================\r\n * @methods getListeners\r\n * @param {HTMLElement} el - (必须)要获取事件绑定信息的 DOM 元素\r\n * @param {String} [type] - (可选)事件类型\r\n * @returns {Array} - 已绑定的事件信息\r\n */\r\nconst getListeners = (el, type) => {\r\n let listeners = el._listeners || []\r\n\r\n if (isString(type) && type) {\r\n listeners = listeners.filter((listener) => {\r\n return listener.type === type\r\n })\r\n }\r\n\r\n return listeners\r\n}\r\n\r\nexport default getListeners\r\n","import purgeElement from './purgeElement'\r\nimport isFunction from '../types/isFunction'\r\nimport _off from './_off'\r\n\r\n/**\r\n * 取消 type 类型的代理事件绑定\r\n * ========================================================================\r\n * 如果没有设置 handler,则销毁 this.$options 绑定的所有符合 type 事件类型的事件绑定\r\n * ========================================================================\r\n * @method off\r\n * @param {HTMLElement|Object} el - (必须)取消事件绑定的 DOM 元素\r\n * @param {String} type - (必须)事件类型\r\n * @param {Function} [fn] - (可选)事件处理器回调函数\r\n */\r\nconst off = (el, type, fn) => {\r\n // 如果不设置 fn 参数,默认清除 el 元素上绑定的所有事件处理器\r\n if (!isFunction(fn)) {\r\n purgeElement(el, type)\r\n return false\r\n }\r\n\r\n _off(el, type, fn)\r\n}\r\n\r\nexport default off\r\n","import closest from '@/utils/dom/closest'\r\nimport off from './off'\r\nimport getTarget from './getTarget'\r\n\r\nimport { CAPTURE_EVENTS } from './enum'\r\n\r\n/**\r\n * 绑定代理事件\r\n * ========================================================================\r\n * @method on\r\n * @param {HTMLElement|String|Object} el - (必须)绑定代理事件的 DOM 节点\r\n * @param {String} selector - (必须)事件代理目标 DOM 元素的选择器\r\n * @param {String|Function} type - (必须)事件类型或者事件处理器回调函数\r\n * @param {Function|Object} fn - (可选) 事件处理器回调函数或者传递给事件处理器回调函数的数据对象\r\n * @param {Object|Boolean} [data] - (可选)传递给事件处理器回调函数的数据对象或者事件处理器回调函数的 this 上下文指向,\r\n * @param {Object|Boolean} [context] - (可选)事件处理器回调函数的 this 上下文指向,或者是否仅触发一次\r\n * 当设置为 true 时,则事件处理器回调函数的 this 上下文指向为 data 对象\r\n * @param {Boolean} once - (可选)是否仅触发一次\r\n */\r\nconst on = (el, selector, type, fn, data, context, once = false) => {\r\n // CAPTURE_EVENTS 中的特殊事件,采用事件捕获模型\r\n const capture = CAPTURE_EVENTS.indexOf(type) > -1\r\n\r\n const listener = function (evt) {\r\n const target = getTarget(evt)\r\n // 通过 Element.matches 方法获得点击的目标元素\r\n const delegateTarget = closest(target, selector, el)\r\n let overrideContext = context || el\r\n\r\n evt.delegateTarget = delegateTarget\r\n\r\n // 当设置为 true 时,则事件处理器回调函数的\r\n // this 上下文指向为 data 对象\r\n if (context === true) {\r\n overrideContext = data\r\n }\r\n\r\n /* istanbul ignore else */\r\n if (delegateTarget) {\r\n // 仅触发一次\r\n /* istanbul ignore else */\r\n if (once === true) {\r\n off(el, type, listener)\r\n }\r\n\r\n fn.call(overrideContext, evt, data)\r\n }\r\n }\r\n\r\n if (!el) {\r\n return false\r\n }\r\n\r\n if (!el._listeners) {\r\n el._listeners = []\r\n }\r\n\r\n // 缓存 options 元素绑定的事件处理器\r\n el._listeners.push({\r\n el,\r\n selector,\r\n type,\r\n fn: listener,\r\n data,\r\n context,\r\n capture\r\n })\r\n\r\n // 缓存包装后的事件处理器\r\n fn._delegateListener = listener\r\n\r\n el.addEventListener(type, listener, capture)\r\n}\r\n\r\nexport default on\r\n","import resolveTextNode from '@/utils/dom/resolveTextNode'\r\n\r\n/**\r\n * 返回触发事件的 target DOM 元素\r\n * ========================================================================\r\n * @method getTarget\r\n * @param {Event} evt - Event 对象\r\n * @return {HTMLElement} - Event 对象的 target DOM 元素\r\n */\r\nconst getTarget = function (evt) {\r\n const target = evt.target\r\n\r\n return resolveTextNode(target)\r\n}\r\n\r\nexport default getTarget\r\n","/**\r\n * 在某些情况下,某些浏览器(例如:Safari 浏览器)会返回实际的目标元素内部的文本节点。\r\n * resolveTextNode() 方法则会返回实际的目标节点。\r\n * ========================================================================\r\n * @method resolveTextNode\r\n * @param {HTMLElement|Text} el - 要解析的节点\r\n * @return {*|HTMLElement} - 实际的目标 DOM 节点\r\n */\r\nconst resolveTextNode = function (el) {\r\n if (el && el.nodeType === 3) {\r\n return el.parentNode\r\n }\r\n\r\n return el\r\n}\r\n\r\nexport default resolveTextNode\r\n","import matches from './matches'\r\nimport getParentOrHost from './getParentOrHost'\r\n\r\n/**\r\n * 获取 options 元素父元素最近的包含 selector 选择器的元素\r\n * ========================================================================\r\n * @method closest\r\n * @param {HTMLElement} el - (必须)DOM 元素\r\n * @param {String} selector - (必须)DOM 元素的选择其\r\n * @param {HTMLElement} [ctx] - (必须)比对的 DOM 元素\r\n * @param {Boolean} [includeCTX] - (必须)是否包含 context DOM 元素\r\n * @returns {null|HTMLElement} - 返回最接近的 DOM 元素\r\n */\r\nconst closest = (el, selector, ctx, includeCTX) => {\r\n const context = ctx || document\r\n\r\n if (!el) {\r\n return null\r\n }\r\n\r\n do {\r\n /* istanbul ignore else */\r\n if (\r\n (selector != null &&\r\n (selector.startsWith('>')\r\n ? el.parentNode === context && matches(el, selector)\r\n : matches(el, selector))) ||\r\n (includeCTX && el === context)\r\n ) {\r\n return el\r\n }\r\n\r\n /* istanbul ignore else */\r\n if (el === context) {\r\n break\r\n }\r\n\r\n /* jshint boss:true */\r\n } while ((el = getParentOrHost(el)))\r\n}\r\n\r\nexport default closest\r\n","import DEFAULTS from './defaults'\r\n\r\nconst SYMBOLS = [...DEFAULTS]\r\n\r\nexport default SYMBOLS\r\n","const DEFAULTS = [\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n ''\r\n]\r\n\r\nexport default DEFAULTS\r\n","import isString from '@/utils/types/isString'\r\nimport getSymbol from './getSymbol'\r\nimport SYMBOLS from './symbols'\r\n\r\n/**\r\n *\r\n * @method getSymbols\r\n * @param {String} [name]\r\n * @param {String} [iconSet]\r\n * @returns {string[]|*}\r\n */\r\nconst getSymbols = (name, iconSet = 'icon') => {\r\n if (isString(name)) {\r\n return getSymbol(name, iconSet)\r\n }\r\n\r\n return [...SYMBOLS]\r\n}\r\n\r\nexport default getSymbols\r\n","import SYMBOLS from './symbols'\r\n\r\n/**\r\n * @method getSymbol\r\n * @param {String} name\r\n * @param {String} [iconSet]\r\n * @returns {String}\r\n */\r\nconst getSymbol = (name, iconSet = 'icon') => {\r\n const patternName = /id=\"(.*?)\"/\r\n const patternSet = /^(\\w+)-/\r\n const symbols = SYMBOLS\r\n\r\n return symbols.find((symbol) => {\r\n const names = patternName.exec(symbol)\r\n const fullName = names[1]\r\n const sets = patternSet.exec(fullName)\r\n const setName = sets[1]\r\n const iconName =\r\n iconSet === 'icon' ? `${iconSet}-${name}` : `${iconSet}-icon-${name}`\r\n\r\n return setName === iconSet && fullName === iconName\r\n })\r\n}\r\n\r\nexport default getSymbol\r\n","import add from './add'\r\nimport getSymbols from './getSymbols'\r\n\r\n/**\r\n * 绘制 SVG 图标集\r\n * ========================================================================\r\n * @method paint\r\n * @param {String|Array} symbol\r\n */\r\nconst paint = (symbol = '') => {\r\n const $body = document.body\r\n let $icons = document.querySelector('#outline-icons')\r\n let symbols = []\r\n\r\n add(symbol)\r\n symbols = getSymbols()\r\n\r\n if ($icons) {\r\n $icons.innerHTML = symbols.join('')\r\n } else {\r\n $icons = document.createElement('div')\r\n $icons.innerHTML =\r\n ``\r\n $body.insertBefore($icons.firstChild, $body.firstChild)\r\n }\r\n}\r\n\r\nexport default paint\r\n","import isArray from '@/utils/types/isArray'\r\nimport isString from '@/utils/types/isString'\r\nimport SYMBOLS from './symbols'\r\n\r\n/**\r\n * @method add\r\n * @param {Array|String} symbols\r\n * @return {Boolean}\r\n */\r\nconst add = (symbols) => {\r\n if (!symbols) {\r\n return false\r\n }\r\n\r\n if (isArray(symbols) && symbols.length > 0) {\r\n symbols.forEach((symbol) => {\r\n /* istanbul ignore else */\r\n if (SYMBOLS.indexOf(symbol) === -1 && isString(symbol)) {\r\n SYMBOLS.push(symbol)\r\n }\r\n })\r\n } else {\r\n /* istanbul ignore else */\r\n if (isString(symbols)) {\r\n SYMBOLS.push(symbols)\r\n }\r\n }\r\n}\r\n\r\nexport default add\r\n","import isString from '@/utils/types/isString'\r\n\r\n/**\r\n * 清楚字符串起始位置所有的空格\r\n * ========================================================================\r\n * @method trim\r\n * @param {string} str\r\n * @returns {string|Boolean}\r\n */\r\nconst trim = (str) => {\r\n if (!isString(str)) {\r\n return false\r\n }\r\n return str.replace(/(^\\s+)|(\\s+$)/g, '')\r\n}\r\n\r\nexport default trim\r\n","import trim from '../utils/lang/trim'\r\nimport stripTags from '../utils/lang/stripTags'\r\nimport isFunction from '../utils/types/isFunction'\r\n\r\nimport _getChapterParentIdByDiffer from './_getChapterParentIdByDiffer'\r\nimport _getChaptersWithCode from './_getChaptersWithCode'\r\n\r\n/**\r\n * 根据文章中的 h1~h6 标签,自动分析返回文章章节数据\r\n * ========================================================================\r\n * @method getChaptersByHeadings\r\n * @param {Array} headings\r\n * @param {Boolean} [showCode]\r\n * @param {Function} [chapterTextFilter]\r\n * @return {*|*[]}\r\n */\r\nconst getChaptersByHeadings = (\r\n headings,\r\n showCode = false,\r\n chapterTextFilter = null\r\n) => {\r\n const pattern = /^\\d(\\.|(\\.\\d+)*)\\s?/gi\r\n const chapters = []\r\n let previous = 1\r\n let level = 0\r\n let text = ''\r\n\r\n headings.forEach((heading, i) => {\r\n const tagName = heading.tagName\r\n const headingLevel = tagName.replace(/h/i, '')\r\n let current = parseInt(headingLevel, 10)\r\n let pid = -1\r\n\r\n // 场景1:当前标题是前一个标题的子标题\r\n // 当前标题的(标题标签)序号 > 前一个标题的序号:两个相连的标题是父标题 -> 子标题关系;\r\n // h2 (前一个标题)\r\n // h3 (当前标题)\r\n if (current > previous) {\r\n level += 1\r\n\r\n // 第一层级的 pid 是 -1\r\n if (level === 1) {\r\n pid = -1\r\n } else {\r\n pid = i - 1\r\n }\r\n }\r\n // 场景2:当前标题和前一个标题层级相同\r\n // 当前标题的(标题标签)序号 = 前一个标题的序号\r\n // h2 (前一个标题)\r\n // h2 (当前标题)\r\n // 当前标题的(标题标签)序号 < 前一个标题的序号,并且当前标题序号 > 当前的级别\r\n // h2\r\n // h4 (前一个标题)\r\n // h3 (当前标题:这种情况我们还是任务 h3 是 h2 的下一级章节)\r\n else if (current === previous || (current < previous && current > level)) {\r\n // H1 的层级肯定是 1\r\n if (current === 1) {\r\n level = 1\r\n pid = -1\r\n } else {\r\n pid = chapters[i - 1].pid\r\n }\r\n }\r\n // 场景3:当前标题比前一个标题层级高\r\n else if (current <= level) {\r\n // H1 的层级肯定是 1\r\n if (current === 1) {\r\n level = 1\r\n } else {\r\n level = level - (previous - current)\r\n\r\n if (level <= 1) {\r\n level = 1\r\n }\r\n }\r\n\r\n // 第一级的标题\r\n if (level === 1) {\r\n pid = -1\r\n } else {\r\n // 通过当前标题和前一个标题之间的等级差,获得当前标题的父标题ID\r\n pid = _getChapterParentIdByDiffer(chapters, previous - current, i)\r\n }\r\n }\r\n\r\n previous = current\r\n\r\n text = trim(stripTags(heading.innerHTML))\r\n\r\n // 如果自动生成章节编号,则去掉标题中自带的编号文本\r\n if (showCode) {\r\n text = trim(text.replace(pattern, ''))\r\n }\r\n\r\n if (isFunction(chapterTextFilter)) {\r\n text = chapterTextFilter(text)\r\n }\r\n\r\n chapters.push({\r\n id: i,\r\n pid: pid,\r\n level: level,\r\n rel: `heading-${i}`,\r\n text,\r\n tagName\r\n })\r\n })\r\n\r\n return showCode ? _getChaptersWithCode(chapters) : chapters\r\n}\r\n\r\nexport default getChaptersByHeadings\r\n","import isString from '@/utils/types/isString'\r\n\r\n/**\r\n * 过滤所有 HTML 标签\r\n * ========================================================================\r\n * @method stripTags\r\n * @param {string} str\r\n * @returns {string}\r\n */\r\nconst stripTags = (str) => {\r\n if (!isString(str)) {\r\n return ''\r\n }\r\n return str.replace(/<\\/?[^>]+(>|$)/g, '')\r\n}\r\n\r\nexport default stripTags\r\n","const _getChapterParentIdByDiffer = (chapters, differ, index) => {\r\n let previous = chapters[index - 1]\r\n let pid\r\n let i\r\n\r\n for (i = 0; i < differ; i += 1) {\r\n pid = previous.pid\r\n previous = chapters[pid]\r\n }\r\n\r\n pid = previous.pid\r\n\r\n return pid\r\n}\r\n\r\nexport default _getChapterParentIdByDiffer\r\n","import isArray from '../utils/types/isArray'\r\n\r\nconst _getChaptersWithCode = (chapters) => {\r\n const groups = {}\r\n const cb = (o) => {\r\n return [o.pid]\r\n }\r\n\r\n chapters.forEach((o) => {\r\n const group = JSON.stringify(cb(o))\r\n\r\n groups[group] = groups[group] || []\r\n groups[group].push(o)\r\n\r\n o.index = groups[group].length\r\n\r\n if (o.pid === -1) {\r\n o.code = String(o.index)\r\n }\r\n })\r\n\r\n Object.keys(groups).forEach((group) => {\r\n groups[group].forEach((c) => {\r\n const subjects = groups[`[${c.id}]`]\r\n\r\n if (!subjects || !isArray(subjects)) {\r\n return false\r\n }\r\n\r\n subjects.forEach((o) => {\r\n o.code = c.code + '.' + o.index\r\n })\r\n })\r\n })\r\n\r\n return chapters\r\n}\r\n\r\nexport default _getChaptersWithCode\r\n","import isString from '../utils/types/isString'\r\nimport isFunction from '../utils/types/isFunction'\r\nimport isElement from '../utils/types/isElement'\r\nimport toTree from '../utils/lang/toTree'\r\n\r\nimport getChaptersByHeadings from './getChaptersByHeadings'\r\n\r\n/**\r\n *\r\n * @param {Object} [options]\r\n * @param {String|HTMLElement} [options.articleElement]\r\n * @param {String} [options.selector]\r\n * @param {Boolean} [options.showCode]\r\n * @param {Function} [options.chapterTextFilter]\r\n * @param {Boolean} [options.isTreeStructured]\r\n * @returns {Array}\r\n */\r\nconst getChapters = (options) => {\r\n const {\r\n articleElement,\r\n selector,\r\n showCode,\r\n chapterTextFilter,\r\n isTreeStructured\r\n } = options\r\n let $article = document.querySelector('#article')\r\n let $headings = []\r\n let chapters = []\r\n let filter = null\r\n\r\n if (isString(articleElement)) {\r\n $article = document.querySelector(articleElement)\r\n } else if (isElement(articleElement)) {\r\n $article = articleElement\r\n }\r\n\r\n if (!$article) {\r\n return chapters\r\n }\r\n\r\n if (isFunction(chapterTextFilter)) {\r\n filter = chapterTextFilter\r\n } else {\r\n if (chapterTextFilter === true) {\r\n filter = (text) => {\r\n return text.replace(/\\(.*?\\)/, '()')\r\n }\r\n }\r\n }\r\n\r\n $headings = [...$article.querySelectorAll(selector || 'h1,h2,h3,h4,h5,h6')]\r\n chapters = getChaptersByHeadings($headings, showCode, filter)\r\n\r\n return isTreeStructured === true ? toTree(chapters, 'id', 'pid') : chapters\r\n}\r\n\r\nexport default getChapters\r\n","const toTree = (list, nodeKey, parentKey) => {\r\n const map = {}\r\n const roots = []\r\n\r\n list.forEach((item, i) => {\r\n // initialize the map\r\n map[item[nodeKey]] = i\r\n // initialize the children\r\n item.children = []\r\n })\r\n\r\n list.forEach((item) => {\r\n const node = list[map[item[parentKey]]]\r\n\r\n if (item[parentKey] !== -1) {\r\n // if you have dangling branches check that map[node.parentId] exists\r\n node.children.push(item)\r\n } else {\r\n roots.push(item)\r\n }\r\n })\r\n\r\n return roots\r\n}\r\n\r\nexport default toTree\r\n","/**\r\n * 检测对象自身属性中是否具有指定的属性。\r\n * ========================================================================\r\n * @method hasOwn\r\n * @param {Object} obj - (必须)检测的目标对象\r\n * @param {String} prop - (必须)属性名\r\n * @returns {Boolean}\r\n */\r\nconst hasOwn = (obj, prop) => {\r\n const hasOwnProperty = Object.prototype.hasOwnProperty\r\n return obj && hasOwnProperty.call(obj, prop)\r\n}\r\n\r\nexport default hasOwn\r\n","/**\r\n * 存储订阅者(主题和处理器的)私有对象\r\n * ========================================================================\r\n * @type {{}}\r\n * @private\r\n */\r\nconst _subscribers = {}\r\n\r\nexport default _subscribers\r\n","import hasOwn from '@/utils/lang/hasOwn'\r\nimport _subscribers from './_subscribers'\r\n\r\n/**\r\n * 判断是否存在与给定 topic 完全匹配的订阅者信息\r\n * ========================================================================\r\n * @method _hasDirectSubscribersFor\r\n * @param {String} topic - (必须)订阅主题字符串\r\n * @returns {Boolean}\r\n */\r\nconst _hasDirectSubscribersFor = (topic) => {\r\n return hasOwn(_subscribers, topic) && _subscribers[topic].length > 0\r\n}\r\n\r\nexport default _hasDirectSubscribersFor\r\n","import _hasDirectSubscribersFor from './_hasDirectSubscribersFor'\r\nimport _hasSubscribers from './_hasSubscribers'\r\n\r\n/**\r\n * 判断是否存在包含 topic 指定的订阅者信息\r\n * ========================================================================\r\n * @method has\r\n * @param {String} topic - (必须)主题名称\r\n * @param {Boolean} [isDirect] - (可选)是否为直接的主题,默认值:true\r\n * @returns {Boolean}\r\n */\r\nconst has = (topic, isDirect = true) => {\r\n return isDirect ? _hasDirectSubscribersFor(topic) : _hasSubscribers(topic)\r\n}\r\n\r\nexport default has\r\n","import _hasDirectSubscribersFor from './_hasDirectSubscribersFor'\r\n\r\n/**\r\n * 判断是否存在包含给定 topic 相关的订阅者信息\r\n * ========================================================================\r\n * @method _hasSubscribers\r\n * @param {String} topic - (必须)订阅主题字符串\r\n * @returns {Boolean}\r\n */\r\nconst _hasSubscribers = (topic) => {\r\n let found = _hasDirectSubscribersFor(topic)\r\n let position = topic.lastIndexOf('.')\r\n\r\n while (!found && position !== -1) {\r\n topic = topic.substring(0, position)\r\n position = topic.lastIndexOf('.')\r\n found = _hasDirectSubscribersFor(topic)\r\n }\r\n\r\n return found\r\n}\r\n\r\nexport default _hasSubscribers\r\n","import isTypedArray from '@/utils/types/isTypedArray'\r\nimport has from './has'\r\nimport _hasDirectSubscribersFor from './_hasDirectSubscribersFor'\r\nimport _subscribers from './_subscribers'\r\n\r\n/**\r\n * (异步)发布订阅主题信息\r\n * ========================================================================\r\n * 主题默认是异步发布的。确保在消费者处理主题时,主题的发起者不会被阻止。\r\n * ========================================================================\r\n * @method emit\r\n * @param {String} topic - (必须)主题名称\r\n * @param {Object} [data] - (可选)数据对象\r\n * @param {Boolean} [async] - (可选) 是否异步发布\r\n */\r\nconst emit = (topic, data, async = true) => {\r\n const execute = (topic) => {\r\n if (!_hasDirectSubscribersFor(topic)) {\r\n return false\r\n }\r\n\r\n _subscribers[topic].forEach((subscriber) => {\r\n // 针对 mqtt 消息服务返回的 Uint8Array 类似的 typed arrays 格式的数据\r\n // 采用 toString() 方法转化为普通(JSON)字符串\r\n const message = isTypedArray(data) ? data.toString() : data\r\n\r\n subscriber.callback.call(subscriber.context || subscriber, message)\r\n })\r\n }\r\n const deliver = () => {\r\n let subscriber = topic\r\n let position = topic.lastIndexOf('.')\r\n\r\n while (position !== -1) {\r\n subscriber = subscriber.substring(0, position)\r\n position = subscriber.lastIndexOf('.')\r\n\r\n execute(subscriber)\r\n }\r\n\r\n // 执行 topic 对应的处理器\r\n execute(topic)\r\n // 执行特殊 topic:'*'(监听全部消息的发布)\r\n execute('*')\r\n }\r\n\r\n if (!has(topic)) {\r\n return false\r\n }\r\n\r\n if (async) {\r\n setTimeout(deliver, 10)\r\n } else {\r\n deliver()\r\n }\r\n}\r\n\r\nexport default emit\r\n","import toString from '@/utils/lang/toString'\r\n/**\r\n * 判断检测数据是否为 Typed Arrays 类型的数据\r\n * ========================================================================\r\n * @param {*} val\r\n * @returns {boolean}\r\n */\r\nconst isTypedArray = (val) => {\r\n const TYPES = [\r\n '[object Int8Array]',\r\n '[object Uint8Array]',\r\n '[object Uint8ClampedArray]',\r\n '[object Int16Array]',\r\n '[object Uint16Array]',\r\n '[object Int32Array]',\r\n '[object Uint32Array]',\r\n '[object Float32Array]',\r\n '[object Float64Array]',\r\n '[object BigInt64Array]',\r\n '[object BigUint64Array]'\r\n ]\r\n\r\n return TYPES.indexOf(toString(val)) > -1\r\n}\r\n\r\nexport default isTypedArray\r\n","/**\r\n * 生成唯一 id 字符串的函数\r\n * ========================================================================\r\n * @method guid\r\n * @param {String} [prefix] - 生成 id 的前缀字符串\r\n * @return {String} 返回一个表示唯一 id 的字符串\r\n */\r\nconst guid = (() => {\r\n let uuid = 0\r\n\r\n return (prefix) => {\r\n uuid += 1\r\n\r\n return prefix ? prefix + '-' + uuid : 'guid-' + uuid\r\n }\r\n})()\r\n\r\nexport default guid\r\n","import hasOwn from '@/utils/lang/hasOwn'\r\nimport _subscribers from './_subscribers'\r\n\r\n/**\r\n * 删除与给定 topic 相同的订阅者信息\r\n * ========================================================================\r\n * @method _removeSubscriber\r\n * @param {String} topic - (必须)订阅主题字符串\r\n * @returns {Boolean}\r\n */\r\nconst _removeSubscriber = (topic) => {\r\n if (!hasOwn(_subscribers, topic)) {\r\n return false\r\n }\r\n\r\n delete _subscribers[topic]\r\n}\r\n\r\nexport default _removeSubscriber\r\n","import has from './has'\r\nimport _removeSubscriber from './_removeSubscriber'\r\nimport _removeSubscriberByToken from './_removeSubscriberByToken'\r\n\r\n/**\r\n * 取消订阅主题\r\n * ========================================================================\r\n * @method off\r\n * @param {String} topic - (必须)订阅的主题\r\n * @param {Function|String} [token] - (可选)订阅主题的处理器函数或者唯一 Id 值\r\n */\r\nconst off = (topic, token) => {\r\n if (!has(topic)) {\r\n return false\r\n }\r\n\r\n if (token) {\r\n _removeSubscriberByToken(token)\r\n } else {\r\n _removeSubscriber(topic)\r\n }\r\n}\r\n\r\nexport default off\r\n","import _subscribers from './_subscribers'\r\nimport _removeSubscriber from './_removeSubscriber'\r\n\r\n/**\r\n * 通过订阅者 token 值删除订阅者信息\r\n * ========================================================================\r\n * @method _removeSubscriberByToken\r\n * @param {String} token - 订阅者 token 字符串\r\n * @returns {boolean}\r\n * @private\r\n */\r\nconst _removeSubscriberByToken = (token) => {\r\n const keys = Object.keys(_subscribers)\r\n let index = -1\r\n\r\n if (!token || keys.length < 1) {\r\n return false\r\n }\r\n\r\n keys.forEach((subject) => {\r\n const subscriber = _subscribers[subject]\r\n let topic\r\n\r\n subscriber.forEach((execution, j) => {\r\n if (execution.callback === token || execution.token === token) {\r\n topic = execution.topic\r\n subscriber.splice(index, j)\r\n }\r\n })\r\n\r\n /* istanbul ignore else */\r\n if (subscriber.length < 1) {\r\n _removeSubscriber(topic)\r\n }\r\n })\r\n}\r\n\r\nexport default _removeSubscriberByToken\r\n","import isString from './utils/types/isString'\r\n\r\nimport extend from './utils/lang/extend'\r\nimport hasOwn from './utils/lang/hasOwn'\r\n\r\nimport isObject from './utils/types/isObject'\r\n\r\nimport publish from './utils/observer/emit'\r\nimport subscribe from './utils/observer/on'\r\nimport unsubscribe from './utils/observer/off'\r\n\r\nclass Component {\r\n constructor(options) {\r\n this.attrs = {}\r\n this.name = 'component'\r\n\r\n if (options) {\r\n this.initialize(options)\r\n }\r\n }\r\n\r\n initialize(options) {\r\n this.attr(options).render().addListeners()\r\n return this\r\n }\r\n\r\n attr(prop, value) {\r\n const attrs = this.attrs\r\n\r\n if (isString(prop)) {\r\n // 只能扩展 attrs 中已有的属性\r\n if (value && hasOwn(attrs, prop)) {\r\n // 更新单个配置信息\r\n attrs[prop] = value\r\n return this\r\n }\r\n\r\n // 只传递 prop 参数,则返回对应的属性值\r\n return attrs[prop]\r\n } else if (isObject(prop)) {\r\n // 批量更新配置信息\r\n extend(attrs, prop)\r\n\r\n return this\r\n } else if (arguments.length === 0) {\r\n // 不传递参数,直接返回整个\r\n return attrs\r\n }\r\n\r\n return this\r\n }\r\n\r\n render() {\r\n return this\r\n }\r\n\r\n refresh() {\r\n return this\r\n }\r\n\r\n destroy() {\r\n this.removeListeners()\r\n return this\r\n }\r\n\r\n reload(options) {\r\n let attrs = this.attr()\r\n\r\n if (options) {\r\n attrs = this.attr(options)\r\n }\r\n\r\n this.destroy().initialize(attrs)\r\n\r\n return this\r\n }\r\n\r\n $emit(event, data) {\r\n publish(event, data)\r\n return this\r\n }\r\n\r\n $on(event, callback) {\r\n subscribe(event, callback, this)\r\n return this\r\n }\r\n\r\n $off(event, callback) {\r\n unsubscribe(event, callback)\r\n return this\r\n }\r\n\r\n addListeners() {\r\n return this\r\n }\r\n\r\n removeListeners() {\r\n return this\r\n }\r\n}\r\n\r\nexport default Component\r\n","import hasOwn from './hasOwn'\r\n\r\n/**\r\n * 扩展对象\r\n * ========================================================================\r\n * @method extend\r\n * @param {Object} origin\r\n * @param {Object} source\r\n */\r\nconst extend = (origin, source) => {\r\n const keys = Object.keys(source)\r\n\r\n keys.forEach((prop) => {\r\n if (hasOwn(source, prop)) {\r\n origin[prop] = source[prop]\r\n }\r\n })\r\n}\r\n\r\nexport default extend\r\n","import isFunction from '@/utils/types/isFunction'\r\nimport guid from '@/utils/lang/guid'\r\n\r\nimport _subscribers from './_subscribers'\r\n\r\n/**\r\n * 订阅主题,并给出处理器函数\r\n * ========================================================================\r\n * @method on\r\n * @param {String} topic - (必须)主题名称\r\n * @param {Function} handler - (必须)主题的处理器函数\r\n * @param {Object} [context] - (可选)指定 this 执行上下文\r\n * @return {String} - 唯一的 token 字符串,例如:'guid-1'。\r\n */\r\nconst on = (topic, handler, context = null) => {\r\n const token = guid()\r\n let subject = typeof topic === 'symbol' ? topic.toString() : topic\r\n\r\n if (!isFunction(handler)) {\r\n return ''\r\n }\r\n\r\n /* istanbul ignore else */\r\n if (!_subscribers[subject]) {\r\n _subscribers[subject] = []\r\n }\r\n\r\n _subscribers[subject].push({\r\n topic: subject,\r\n callback: handler,\r\n context,\r\n token\r\n })\r\n\r\n return token\r\n}\r\n\r\nexport default on\r\n","import toString from '@/utils/lang/toString'\r\nimport isObject from './isObject'\r\n\r\nconst isHTMLCollection = (el) => {\r\n return !!(isObject(el) && toString(el) === '[object NodeList]')\r\n}\r\n\r\nexport default isHTMLCollection\r\n","import isObject from './isObject'\r\nimport isElement from './isElement'\r\nimport isHTMLCollection from './isHTMLCollection'\r\nimport isFragment from './isFragment'\r\nimport isTextNode from './isTextNode'\r\n\r\nconst isDOM = (el) => {\r\n return !!(\r\n isObject(el) &&\r\n (isElement(el) || isHTMLCollection(el) || isFragment(el) || isTextNode(el))\r\n )\r\n}\r\n\r\nexport default isDOM\r\n","import toString from '@/utils/lang/toString'\r\nimport isObject from './isObject'\r\n\r\nconst isFragment = (fragment) => {\r\n return !!(\r\n isObject(fragment) && toString(fragment) === '[object DocumentFragment]'\r\n )\r\n}\r\n\r\nexport default isFragment\r\n","import toString from '@/utils/lang/toString'\r\nimport isObject from './isObject'\r\n\r\nconst isTextNode = (el) => {\r\n return !!(\r\n isObject(el) &&\r\n (toString(el) === '[object Text]' || (el.tagName && el.nodeType === 3))\r\n )\r\n}\r\n\r\nexport default isTextNode\r\n","import isElement from '../types/isElement'\r\n/**\r\n * 检测 DOM 节点是否包含名为 className 的样式\r\n * ========================================================================\r\n * @method hasClass\r\n * @param {HTMLElement} el - DOM 节点\r\n * @param {String} className - 样式名称\r\n * @returns {Boolean}\r\n */\r\nconst hasClass = (el, className) => {\r\n const pattern = new RegExp('(\\\\s|^)' + className + '(\\\\s|$)')\r\n let allClass\r\n let classList\r\n\r\n if (!isElement(el)) {\r\n return false\r\n }\r\n\r\n allClass = el.className\r\n\r\n if (!allClass) {\r\n return false\r\n }\r\n\r\n classList = el.classList\r\n\r\n if (classList && classList.contains) {\r\n return el.classList.contains(className)\r\n }\r\n\r\n return !!pattern.exec(allClass)\r\n}\r\n\r\nexport default hasClass\r\n","import addClass from './addClass.js'\r\n\r\n/**\r\n * 给 DOM 节点设置属性/值\r\n * ========================================================================\r\n * @method setAttribute\r\n * @param {HTMLElement} el - DOM 节点\r\n * @param {String} attr - 属性名称\r\n * @param {String|Number|Boolean} value - 属性值\r\n */\r\nconst setAttribute = (el, attr, value) => {\r\n let tagName = el.tagName.toLowerCase()\r\n\r\n switch (attr) {\r\n case 'style':\r\n el.style.cssText = value\r\n break\r\n case 'value':\r\n if (tagName === 'input' || tagName === 'textarea') {\r\n el.value = value\r\n } else {\r\n el.setAttribute(attr, value)\r\n }\r\n break\r\n case 'htmlFor':\r\n el.setAttribute('for', value)\r\n break\r\n case 'className':\r\n addClass(el, value)\r\n break\r\n case 'innerHTML':\r\n el.innerHTML = value\r\n break\r\n case 'innerText':\r\n el.innerText = value\r\n break\r\n default:\r\n el.setAttribute(attr, value)\r\n break\r\n }\r\n}\r\n\r\nexport default setAttribute\r\n","import hasClass from './hasClass'\r\n\r\n/**\r\n * 给 DOM 节点添加名为 className 的样式\r\n * ========================================================================\r\n * @method addClass\r\n * @param {HTMLElement} el - DOM 节点\r\n * @param {String} className - 样式名称\r\n * @returns {Boolean}\r\n */\r\nconst addClass = (el, className) => {\r\n let classList\r\n let allClass\r\n\r\n if (hasClass(el, className)) {\r\n return false\r\n }\r\n\r\n classList = el.classList\r\n\r\n if (classList?.add) {\r\n if (className.indexOf(' ') > -1) {\r\n className.split(' ').forEach((name) => {\r\n classList.add(name)\r\n })\r\n } else {\r\n classList.add(className)\r\n }\r\n } else {\r\n allClass = el.className\r\n allClass += allClass.length > 0 ? ' ' + className : className\r\n el.className = allClass\r\n }\r\n}\r\n\r\nexport default addClass\r\n","import isObject from '../types/isObject'\r\nimport hasOwn from '../lang/hasOwn'\r\nimport setAttribute from './setAttribute'\r\n\r\nconst setAttributes = (el, attrs) => {\r\n if (!el || !isObject(attrs)) {\r\n return false\r\n }\r\n\r\n Object.keys(attrs).forEach((attr) => {\r\n const value = attrs[attr]\r\n if (hasOwn(attrs, attr)) {\r\n setAttribute(el, attr, value)\r\n }\r\n })\r\n}\r\n\r\nexport default setAttributes\r\n","import isArray from '@/utils/types/isArray'\r\nimport isString from '@/utils/types/isString'\r\nimport isSVG from '@/utils/types/isSVG'\r\nimport setAttributes from '@/utils/dom/setAttributes'\r\n\r\n/**\r\n * 创建 SVG 图标 DOM 元素\r\n * ========================================================================\r\n * @method createElement\r\n * @param {String} name\r\n * @param {Object} [options]\r\n * @param {Number|Array} [options.size]\r\n * @param {String} [options.color]\r\n * @param {String} [options.iconSet]\r\n * @param {Object} [options.attrs]\r\n * @returns {HTMLElement}\r\n */\r\nconst createElement = (name, options = {}) => {\r\n const ICON = 'outline-icon'\r\n const size = options.size || 0\r\n const color = options.color || ''\r\n const iconSet = options.iconSet || ''\r\n const width = isArray(size) ? size[0] : size\r\n const height = isArray(size) ? size[1] : size\r\n const defaultRules = size ? `width:${width}px;height:${height}px;` : ''\r\n const cssRules = color ? defaultRules + `color:${color}` : defaultRules\r\n const attrs = options.attrs || {}\r\n const $icon = document.createElement('i')\r\n let binds = ''\r\n let svg = ''\r\n let $svg\r\n\r\n if (!isString(name)) {\r\n return null\r\n }\r\n\r\n if (isSVG(name)) {\r\n svg = name\r\n } else {\r\n binds =\r\n iconSet && iconSet !== 'icon'\r\n ? `xlink:href=\"#${iconSet}-icon-${name}\"`\r\n : `xlink:href=\"#icon-${name}\"`\r\n svg = ``\r\n }\r\n\r\n $icon.innerHTML = svg\r\n\r\n if (attrs.className) {\r\n attrs.className = `${ICON} ${attrs.className}`\r\n } else {\r\n attrs.className = ICON\r\n }\r\n\r\n setAttributes($icon, attrs)\r\n\r\n $svg = $icon.querySelector('svg')\r\n setAttributes($svg, {\r\n 'aria-hidden': true,\r\n xmlns: 'http://www.w3.org/2000/svg',\r\n class: 'outline-icon__svg',\r\n width: 200,\r\n height: 200,\r\n style: cssRules\r\n })\r\n\r\n return $icon\r\n}\r\n\r\nexport default createElement\r\n","import isString from './isString'\r\n\r\nconst isSVG = (str) => {\r\n const declaration = '(?:<\\\\?xml[^>]*>\\\\s*)?'\r\n const doctype =\r\n '(?:<\\\\!doctype svg[^>]*\\\\s*(?:\\\\[?(?:\\\\s*]*>\\\\s*)*\\\\]?)*[^>]*>\\\\s*)?'\r\n const content = ']*>[^]*<\\\\/svg>\\\\s*$'\r\n const svg = `^\\\\s*${declaration}${doctype}${content}\\\\s*$`\r\n const pattern = new RegExp(svg, 'i')\r\n\r\n return isString(str) && pattern.test(str)\r\n}\r\n\r\nexport default isSVG\r\n","import isFunction from '@/utils/types/isFunction'\r\nimport trim from '@/utils/lang/trim'\r\nimport createElement from '@/utils/dom/createElement'\r\nimport setAttributes from '@/utils/dom/setAttributes'\r\n\r\nimport icon from '@/utils/icons/icon'\r\n\r\nconst _updateHeading = ($heading, i, options) => {\r\n const CLS_HEADING = 'outline-heading'\r\n const hasAnchor = options.hasAnchor || true\r\n const isAtStart = options.isAtStart || true\r\n const showCode = options.showCode || false\r\n const chapterCode = options.chapterCode || ''\r\n const anchorURL = options.anchorURL || ''\r\n const anchorLinkFilter = options.anchorLinkFilter || null\r\n const headingId = `heading-${i}`\r\n const attrs = {\r\n id: headingId,\r\n className: isAtStart ? `${CLS_HEADING} ${CLS_HEADING}_start` : CLS_HEADING,\r\n 'data-id': i\r\n }\r\n const text = trim($heading.innerHTML)\r\n let url\r\n let $anchor\r\n let $icon\r\n\r\n if (showCode) {\r\n attrs.innerHTML = chapterCode + ' ' + text\r\n attrs['data-code'] = chapterCode\r\n }\r\n setAttributes($heading, attrs)\r\n\r\n if (!hasAnchor) {\r\n return false\r\n }\r\n\r\n if (anchorURL) {\r\n url = anchorURL\r\n } else {\r\n if (isFunction(anchorLinkFilter)) {\r\n url = anchorLinkFilter($heading.tagName.toLowerCase(), text, i)\r\n } else {\r\n url = `#${headingId}`\r\n }\r\n }\r\n\r\n $icon = icon('hash', { iconSet: 'outline' })\r\n $anchor = createElement(\r\n 'a',\r\n {\r\n id: `anchor-${i}`,\r\n className: `${CLS_HEADING}__anchor anchor-${i}`,\r\n href: url,\r\n target: anchorURL ? '_blank' : 'self',\r\n 'data-id': i\r\n },\r\n $icon\r\n )\r\n $heading.appendChild($anchor)\r\n}\r\n\r\nexport default _updateHeading\r\n","import createElement from './createElement'\r\n\r\n/**\r\n * 创建 SVG 图标 DOM 元素\r\n * ========================================================================\r\n * @method icon\r\n * @alias createElement\r\n * @see createElement\r\n * @param {String} name\r\n * @param {Object} [options]\r\n * @param {Number|Array} [options.size]\r\n * @param {String} [options.color]\r\n * @param {String} [options.iconSet]\r\n * @returns {HTMLElement}\r\n */\r\nconst icon = (name, options = {}) => {\r\n return createElement(name, options)\r\n}\r\n\r\nexport default icon\r\n","import isObject from '../types/isObject'\r\nimport isString from '../types/isString'\r\nimport isArray from '../types/isArray'\r\nimport isDOM from '../types/isDOM'\r\nimport setAttributes from './setAttributes'\r\n\r\n/**\r\n * 创建 DOM 节点,并添加属性和子节点\r\n * ========================================================================\r\n * @method createElement\r\n * @param {String} tagName - 标签名称\r\n * @param {Object|Array|HTMLElement|DocumentFragment|String} attrs - 属性对象或者子节点\r\n * @param {Array|HTMLElement|DocumentFragment|String} [children] - 子节点数组\r\n * @returns {HTMLElement}\r\n */\r\nconst createElement = (tagName, attrs, children) => {\r\n const $fragment = document.createDocumentFragment()\r\n const $el = document.createElement(tagName)\r\n const isValidChild = (child) => {\r\n return isDOM(child) || isString(child)\r\n }\r\n const append = (child) => {\r\n let $child\r\n\r\n if (!isValidChild(child)) {\r\n return false\r\n }\r\n\r\n if (isDOM(child)) {\r\n $child = child\r\n } else if (isString(child)) {\r\n $child = document.createTextNode(child)\r\n }\r\n\r\n $fragment.appendChild($child)\r\n }\r\n\r\n if (isObject(attrs)) {\r\n setAttributes($el, attrs)\r\n } else if (isArray(attrs) && attrs.every((attr) => isValidChild(attr))) {\r\n attrs.forEach((child) => {\r\n append(child)\r\n })\r\n } else if (isDOM(attrs)) {\r\n append(attrs)\r\n } else if (isString(attrs)) {\r\n append(document.createTextNode(attrs))\r\n }\r\n\r\n if (isArray(children)) {\r\n children.forEach((child) => {\r\n append(child)\r\n })\r\n } else {\r\n append(children)\r\n }\r\n\r\n $el.appendChild($fragment)\r\n\r\n return $el\r\n}\r\n\r\nexport default createElement\r\n","import trim from '../lang/trim'\r\nimport hasClass from './hasClass'\r\n\r\n/**\r\n * 移除 DOM 节点的 className 样式\r\n * ========================================================================\r\n * @method removeClass\r\n * @param {HTMLElement} el - DOM 节点\r\n * @param {String} className - 样式名称\r\n * @returns {Boolean}\r\n */\r\nconst removeClass = (el, className) => {\r\n let allClass = el.className\r\n let classList\r\n\r\n if (!allClass || !hasClass(el, className)) {\r\n return false\r\n }\r\n\r\n classList = el.classList\r\n\r\n if (classList?.remove) {\r\n classList.remove(className)\r\n } else {\r\n allClass = trim(allClass.replace(className, ''))\r\n el.className = allClass\r\n }\r\n}\r\n\r\nexport default removeClass\r\n","import removeClass from '@/utils/dom/removeClass'\r\nimport isEmpty from '@/utils/types/isEmpty'\r\nimport trim from '@/utils/lang/trim'\r\n\r\nconst _removeHeading = ($heading, hasAnchor = true, isAtStart = true) => {\r\n const CLS_HEADING = 'outline-heading'\r\n const text = $heading.innerHTML\r\n const pattern = /^\\d+(\\.?\\d+)*\\s?/gi\r\n let $anchor\r\n\r\n $heading.innerHTML = text.replace(pattern, '')\r\n $heading.removeAttribute('id')\r\n $heading.removeAttribute('data-id')\r\n\r\n removeClass($heading, CLS_HEADING)\r\n\r\n if (!hasAnchor) {\r\n return false\r\n }\r\n\r\n $anchor = $heading.querySelector(`.${CLS_HEADING}__anchor`)\r\n\r\n if (isAtStart) {\r\n removeClass($heading, `${CLS_HEADING}_start`)\r\n }\r\n\r\n if (isEmpty(trim($heading.className))) {\r\n $heading.removeAttribute('class')\r\n }\r\n\r\n // 存在锚点才移除\r\n if ($anchor) {\r\n $heading.removeChild($anchor)\r\n }\r\n}\r\n\r\nexport default _removeHeading\r\n","import isString from './isString'\r\n/**\r\n * 检测数据是否为空字符串\r\n * ========================================================================\r\n * @method isEmpty\r\n * @param {String} str\r\n * @returns {boolean}\r\n */\r\nconst isEmpty = (str) => {\r\n return isString(str) && str === ''\r\n}\r\n\r\nexport default isEmpty\r\n","import isString from '@/utils/types/isString'\r\nimport isFunction from '@/utils/types/isFunction'\r\nimport isElement from '@/utils/types/isElement'\r\n\r\nimport cloneDeep from '@/utils/lang/cloneDeep'\r\nimport timeSlice from '@/utils/lang/timeSlice'\r\nimport later from '@/utils/lang/later'\r\n\r\nimport scrollTo from '@/utils/dom/scrollTo'\r\nimport getScrollElement from '@/utils/dom/getScrollElement'\r\nimport offsetTop from '@/utils/dom/offsetTop'\r\n\r\nimport on from '@/utils/event/on'\r\nimport off from '@/utils/event/off'\r\nimport stop from '@/utils/event/stop'\r\n\r\nimport paint from '@/utils/icons/paint'\r\n\r\nimport getChapters from '@/chapters/getChapters'\r\n\r\nimport Component from '@/component'\r\n\r\nimport _updateHeading from './utils/_updateHeading'\r\nimport _removeHeading from './utils/_removeHeading'\r\n\r\nimport './anchors.less'\r\n\r\nclass Anchors extends Component {\r\n constructor(options) {\r\n super()\r\n\r\n this._default()\r\n\r\n if (options) {\r\n this.initialize(options)\r\n }\r\n }\r\n\r\n _default() {\r\n this.attrs = cloneDeep(Anchors.DEFAULTS)\r\n\r\n this.$articleElement = null\r\n this.$scrollElement = null\r\n this.$headings = []\r\n\r\n return this\r\n }\r\n\r\n initialize(options) {\r\n let created\r\n let scrollElement\r\n let $articleElement\r\n let articleElement\r\n\r\n this.attr(options)\r\n\r\n articleElement = this.attr('articleElement')\r\n scrollElement = this.attr('scrollElement')\r\n created = this.attr('created')\r\n\r\n if (isString(articleElement)) {\r\n $articleElement = document.querySelector(articleElement)\r\n } else if (isElement(articleElement)) {\r\n $articleElement = articleElement\r\n }\r\n\r\n if (!$articleElement) {\r\n return this\r\n }\r\n\r\n this.$articleElement = $articleElement\r\n this.$scrollElement = getScrollElement(scrollElement)\r\n this.$headings = this.getHeadings()\r\n\r\n if (this.$headings.length < 1) {\r\n return this\r\n }\r\n\r\n if (isFunction(created)) {\r\n created.call(this)\r\n }\r\n\r\n this.render().addListeners()\r\n\r\n return this\r\n }\r\n\r\n getHeadings() {\r\n const $articleElement = this.$articleElement\r\n const selector = this.attr('selector')\r\n\r\n return [...$articleElement.querySelectorAll(selector)]\r\n }\r\n\r\n count() {\r\n return this.getHeadings().length\r\n }\r\n\r\n render() {\r\n const articleElement = this.attr('articleElement')\r\n const selector = this.attr('selector')\r\n const showCode = this.attr('showCode')\r\n const chapterTextFilter = this.attr('chapterTextFilter')\r\n const mounted = this.attr('mounted')\r\n const chapters = getChapters({\r\n articleElement,\r\n selector,\r\n showCode,\r\n chapterTextFilter\r\n })\r\n\r\n paint()\r\n\r\n this._paint(chapters)\r\n\r\n if (isFunction(mounted)) {\r\n mounted.call(this)\r\n }\r\n\r\n return this\r\n }\r\n\r\n erase() {\r\n this._remove()\r\n\r\n return this\r\n }\r\n\r\n _paint(chapters) {\r\n const LIMIT = 400\r\n const hasAnchor = this.attr('hasAnchor')\r\n const isAtStart = this.attr('isAtStart')\r\n const showCode = this.attr('showCode')\r\n const anchorURL = this.attr('anchorURL')\r\n const anchorLinkFilter = this.attr('anchorLinkFilter')\r\n const count = this.count()\r\n const $headings = [...this.$headings]\r\n const update = (headings, group) => {\r\n headings.forEach(($heading, i) => {\r\n const id = i + group * LIMIT\r\n const chapterCode = chapters[id].code\r\n _updateHeading($heading, id, {\r\n hasAnchor,\r\n isAtStart,\r\n showCode,\r\n chapterCode,\r\n anchorURL,\r\n anchorLinkFilter\r\n })\r\n })\r\n }\r\n let groupIndex = -1\r\n\r\n // 针对超长的文章,进行 timeSlice 处理\r\n if (count > LIMIT) {\r\n groupIndex += 1\r\n // 同步绘制 Limit 以内的标题链接(可以确保 50ms 完成绘制)\r\n update($headings.splice(0, LIMIT), 0)\r\n // 采用 timeSlice 处理机制绘制剩余的标题\r\n while ($headings.length > 0) {\r\n const once = $headings.splice(0, LIMIT)\r\n timeSlice(\r\n () => {\r\n update(once, (groupIndex += 1))\r\n },\r\n () => {\r\n this.$emit('anchors:all:paint')\r\n }\r\n )\r\n }\r\n } else {\r\n update($headings, 0)\r\n }\r\n\r\n return this\r\n }\r\n\r\n _remove() {\r\n const hasAnchor = this.attr('hasAnchor')\r\n const isAtStart = this.attr('isAtStart')\r\n const $headings = this.$headings\r\n\r\n $headings.forEach(($heading) => {\r\n _removeHeading($heading, hasAnchor, isAtStart)\r\n })\r\n\r\n return this\r\n }\r\n\r\n refresh(chapters) {\r\n const articleElement = this.attr('articleElement')\r\n const selector = this.attr('selector')\r\n const showCode = this.attr('showCode')\r\n const chapterTextFilter = this.attr('chapterTextFilter')\r\n\r\n this.$headings = this.getHeadings()\r\n\r\n this.erase()._paint(\r\n chapters ||\r\n getChapters({\r\n articleElement,\r\n selector,\r\n showCode,\r\n chapterTextFilter\r\n })\r\n )\r\n\r\n return this\r\n }\r\n\r\n scrollTo(top, after) {\r\n const el = this.$scrollElement\r\n\r\n scrollTo(el, top, after)\r\n\r\n return this\r\n }\r\n\r\n destroy() {\r\n const beforeDestroy = this.attr('beforeDestroy')\r\n const afterDestroy = this.attr('afterDestroy')\r\n\r\n if (isFunction(beforeDestroy)) {\r\n beforeDestroy.call(this)\r\n }\r\n\r\n this.removeListeners()._remove()._default()\r\n\r\n if (isFunction(afterDestroy)) {\r\n afterDestroy.call(this)\r\n }\r\n\r\n return this\r\n }\r\n\r\n onAnchorTrigger(evt) {\r\n const anchorURL = this.attr('anchorURL')\r\n const afterScroll = this.attr('afterScroll')\r\n const stickyHeight = this.attr('stickyHeight')\r\n const $anchor = evt.delegateTarget\r\n const $heading = $anchor.parentNode\r\n const top = offsetTop($heading) - (stickyHeight + 10)\r\n const $scrollElement = this.$scrollElement\r\n const min = 0\r\n const max = $scrollElement.scrollHeight - $scrollElement.clientHeight\r\n const after = () => {\r\n if (isFunction(afterScroll)) {\r\n afterScroll.call(this, 'anchor')\r\n }\r\n\r\n later(() => {\r\n this.$emit('toolbar:update', {\r\n top,\r\n min,\r\n max\r\n })\r\n })\r\n }\r\n\r\n this.scrollTo(top, after)\r\n\r\n if (!anchorURL) {\r\n stop(evt)\r\n }\r\n\r\n return this\r\n }\r\n\r\n onRefresh(chapters) {\r\n this.refresh(chapters)\r\n\r\n return this\r\n }\r\n\r\n addListeners() {\r\n const $articleElement = this.$articleElement\r\n\r\n if (this.count() < 1) {\r\n return this\r\n }\r\n\r\n on(\r\n $articleElement,\r\n '.outline-heading__anchor',\r\n 'click',\r\n this.onAnchorTrigger,\r\n this,\r\n true\r\n )\r\n\r\n this.$on('anchors:refresh', this.onRefresh)\r\n\r\n return this\r\n }\r\n\r\n removeListeners() {\r\n const $articleElement = this.$articleElement\r\n\r\n if (this.count() < 1) {\r\n return this\r\n }\r\n\r\n off($articleElement, 'click', this.onAnchorTrigger)\r\n this.$off('anchors:refresh', this.onRefresh)\r\n\r\n return this\r\n }\r\n}\r\n\r\nAnchors.DEFAULTS = (() => {\r\n const OPTIONS = {\r\n scrollElement: 'html,body',\r\n articleElement: '#article',\r\n selector: 'h1,h2,h3,h4,h5,h6',\r\n stickyHeight: 0,\r\n anchorURL: '',\r\n hasAnchor: true,\r\n isAtStart: true,\r\n showCode: false,\r\n created: null,\r\n mounted: null,\r\n afterScroll: null,\r\n beforeDestroy: null,\r\n afterDestroy: null,\r\n chapterTextFilter: null,\r\n anchorLinkFilter: null\r\n }\r\n\r\n return cloneDeep(OPTIONS)\r\n})()\r\n\r\nexport default Anchors\r\n","import isString from '../types/isString'\r\nimport isElement from '../types/isElement'\r\n\r\n/**\r\n * 通过给的 scrollElement 参数,获取滚动 DOM 元素\r\n * ========================================================================\r\n * @method getScrollElement\r\n * @param {String|HTMLElement} scrollElement\r\n * @returns {Element}\r\n * @private\r\n */\r\nconst getScrollElement = (scrollElement = null) => {\r\n let $rootElements\r\n let $scrollElement\r\n\r\n if (!scrollElement) {\r\n $rootElements = document.querySelectorAll('html,body')\r\n $scrollElement =\r\n $rootElements[0].scrollTop - $rootElements[1].scrollTop >= 0\r\n ? $rootElements[0]\r\n : $rootElements[1]\r\n } else {\r\n if (isString(scrollElement)) {\r\n $scrollElement = document.querySelector(scrollElement)\r\n } else if (isElement(scrollElement)) {\r\n $scrollElement = scrollElement\r\n }\r\n }\r\n\r\n return $scrollElement\r\n}\r\n\r\nexport default getScrollElement\r\n","/**\r\n * 停止事件(阻止默认行为和阻止事件的捕获或冒泡)\r\n * ========================================================================\r\n * @method stop\r\n * @param {Event} evt - 事件对象\r\n *\r\n * @example\r\n *
\r\n * Service\r\n * Help\r\n *
\r\n *\r\n * const $nav = document.querySelector('#nav')\r\n * const $service = document.querySelector('.anchor')\r\n *\r\n * on($nav, 'click', function(evt) {\r\n * console.log('你点击了导航栏')\r\n * })\r\n *\r\n * on($anchor, 'click', function(evt) {\r\n * console.log('tagName', this.tagName)\r\n *\r\n * // 工作台输出:'a'\r\n * // 不会触发事件冒泡,输出:'你点击了导航栏'\r\n * // 也不会切换到 href 属性的页面,阻止了点击链接的默认行为\r\n * stopEvent(evt)\r\n * })\r\n */\r\nconst stop = function (evt) {\r\n evt.stopPropagation()\r\n evt.preventDefault()\r\n}\r\n\r\nexport default stop\r\n"],"names":["isString","str","toString","val","Object","prototype","apply","isFunction","isObject","o","isElement","nodeName","tagName","nodeType","isArray","Array","cloneDeep","obj","clone","from","assign","keys","forEach","key","later","fn","delay","setTimeout","queue","isHandling","done","runIdle","idleDeadline","timeRemaining","length","shift","requestIdleCallback","window","cb","start","Date","now","didTimeout","Math","max","cancelIdleCallback","id","clearTimeout","timeSlice","afterComplete","push","easeInQuad","x","scrollTo","scrollElement","top","afterStop","$scrollElement","_getScrollElement","$rootElements","document","querySelector","querySelectorAll","scrollTop","step","distance","MAX_HEIGHT","scrollHeight","MAX_TOP","stop","play","requestAnimationFrame","offsetTop","el","offsetParent","matches","selector","sel","replace","msMatchesSelector","getParentOrHost","host","parentNode","CAPTURE_EVENTS","_off","type","capture","indexOf","_delegateListener","listeners","_listeners","index","listener","i","handler","splice","_delete","removeEventListener","purgeElement","recurse","$element","$children","childNodes","getListeners","filter","arguments","$child","off","on","data","context","once","evt","target","getTarget","delegateTarget","closest","ctx","includeCTX","startsWith","overrideContext","call","addEventListener","SYMBOLS","_maybeArrayLike","_toConsumableArray","getSymbols","name","iconSet","getSymbol","patternName","patternSet","find","symbol","fullName","exec","paint","$body","body","$icons","symbols","add","innerHTML","join","createElement","insertBefore","firstChild","trim","getChaptersByHeadings","headings","showCode","chapterTextFilter","pattern","chapters","previous","level","text","heading","headingLevel","current","parseInt","pid","_getChapterParentIdByDiffer","differ","rel","groups","group","JSON","stringify","code","String","c","subjects","_getChaptersWithCode","getChapters","options","articleElement","isTreeStructured","$article","$headings","toTree","list","nodeKey","parentKey","map","roots","item","children","node","hasOwn","prop","hasOwnProperty","_subscribers","_hasDirectSubscribersFor","topic","has","isDirect","found","position","lastIndexOf","substring","_hasSubscribers","emit","async","execute","subscriber","message","callback","deliver","guid","uuid","prefix","_removeSubscriber","token","subject","execution","j","_removeSubscriberByToken","Component","constructor","this","attrs","initialize","attr","render","addListeners","value","origin","source","extend","refresh","destroy","removeListeners","reload","$emit","event","publish","$on","subscribe","$off","unsubscribe","isDOM","isHTMLCollection","fragment","isTextNode","hasClass","className","RegExp","allClass","classList","contains","setAttribute","toLowerCase","style","cssText","addClass","_classList","split","innerText","setAttributes","ICON","size","color","width","height","defaultRules","cssRules","$icon","$svg","binds","svg","test","isSVG","xmlns","class","_updateHeading","$heading","CLS_HEADING","hasAnchor","isAtStart","chapterCode","anchorURL","anchorLinkFilter","headingId","url","$anchor","icon","$fragment","createDocumentFragment","$el","isValidChild","child","append","createTextNode","appendChild","every","href","removeClass","remove","_removeHeading","removeAttribute","removeChild","Anchors","super","_default","DEFAULTS","$articleElement","created","getScrollElement","getHeadings","count","mounted","_paint","erase","_remove","LIMIT","update","groupIndex","after","beforeDestroy","afterDestroy","onAnchorTrigger","afterScroll","stickyHeight","clientHeight","min","stopPropagation","preventDefault","onRefresh"],"mappings":"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"} \ No newline at end of file diff --git a/_removeHeading.js b/anchors/utils/_removeHeading.js similarity index 85% rename from _removeHeading.js rename to anchors/utils/_removeHeading.js index 20302f4b..271806e7 100644 --- a/_removeHeading.js +++ b/anchors/utils/_removeHeading.js @@ -1,6 +1,6 @@ -import removeClass from './utils/dom/removeClass' -import isEmpty from './utils/types/isEmpty' -import trim from './utils/lang/trim' +import removeClass from '@/utils/dom/removeClass' +import isEmpty from '@/utils/types/isEmpty' +import trim from '@/utils/lang/trim' const _removeHeading = ($heading, hasAnchor = true, isAtStart = true) => { const CLS_HEADING = 'outline-heading' diff --git a/_updateHeading.js b/anchors/utils/_updateHeading.js similarity index 85% rename from _updateHeading.js rename to anchors/utils/_updateHeading.js index 26854ace..5319a161 100644 --- a/_updateHeading.js +++ b/anchors/utils/_updateHeading.js @@ -1,9 +1,9 @@ -import isFunction from './utils/types/isFunction' -import trim from './utils/lang/trim' -import createElement from './utils/dom/createElement' -import setAttributes from './utils/dom/setAttributes' +import isFunction from '@/utils/types/isFunction' +import trim from '@/utils/lang/trim' +import createElement from '@/utils/dom/createElement' +import setAttributes from '@/utils/dom/setAttributes' -import icon from './utils/icons/icon' +import icon from '@/utils/icons/icon' const _updateHeading = ($heading, i, options) => { const CLS_HEADING = 'outline-heading' diff --git a/api/js/observeResize.js b/api/js/observeResize.js index 3d92d55b..8889a5ca 100644 --- a/api/js/observeResize.js +++ b/api/js/observeResize.js @@ -1,6 +1,6 @@ import debounce from './debounce' -import isFunction from '../../utils/types/isFunction' -import isElement from '../../utils/types/isElement' +import isFunction from '@/utils/types/isFunction' +import isElement from '@/utils/types/isElement' /** * 通用的 ResizeObserver 观察者处理器 diff --git a/api/pug/examples/anchors.pug b/api/pug/examples/anchors.pug deleted file mode 100644 index 56829bd4..00000000 --- a/api/pug/examples/anchors.pug +++ /dev/null @@ -1,21 +0,0 @@ -doctype html -html(lang='en') - head - include ../meta - title outline.js - 自动生成文章导读(Table of Contents)导航的 JavaScript 工具 - link(href="../css/example.min.css" rel="stylesheet") - body - .paper - header#header.header - h1.title Outline.js - article#article.article - main#main.article__main - include ./article - h2 License - p JavaScript Code Licensed under MIT License. - p API Documentation Licensed under CC BY 3.0 - footer.footer - include ../footer - script(src="../js/anchors.min.js") - script. - new Anchors(Anchors.DEFAULTS) diff --git a/assets/asset-d4ef3ced b/assets/asset-d4ef3ced new file mode 100644 index 00000000..51f1bc48 --- /dev/null +++ b/assets/asset-d4ef3ced @@ -0,0 +1,6 @@ +.outline-heading{overflow:hidden;position:relative;z-index:1}.outline-heading__anchor{display:none}.outline-heading__anchor:hover,.outline-heading__anchor:link,.outline-heading__anchor:visited{color:#999;text-decoration:none}.outline-heading__anchor:hover{color:#507afe}.outline-heading:hover .outline-heading__anchor{display:inline-block}.outline-heading_start:hover{overflow:visible}.outline-heading_start .outline-heading__anchor{left:-1em;position:absolute;top:50%;transform:translateY(-50%);z-index:2} +:root{--outline-zIndex:2000;--outline-sticky-height:100%;--outline-navigator-width:100%}.outline-drawer{box-sizing:border-box;height:100%;left:0;margin:0;overflow:hidden;position:relative;top:0;visibility:hidden;width:100%;z-index:-1}.outline-drawer__modal{background-color:#fff;box-shadow:0 0 6px 1px #dcdfe6;display:flex;flex-direction:column;flex-wrap:nowrap;height:100%;overflow:hidden;position:absolute;transition-duration:.4s;z-index:21}.outline-drawer__footer,.outline-drawer__header,.outline-drawer__main{box-sizing:border-box;width:100%}.outline-drawer__footer,.outline-drawer__header{flex-shrink:0}.outline-drawer__footer,.outline-drawer__main,.outline-drawer__title{padding:0 16px}.outline-drawer__header,.outline-drawer__title{height:52px;line-height:52px;margin:0 auto;overflow:hidden;position:relative;z-index:1}.outline-drawer__title{border-bottom:1px solid #dcdfe6;box-sizing:border-box;font-size:16px;font-weight:400;margin:0 16px}.outline-drawer__close{color:#999;cursor:pointer;font-size:20px;height:20px;line-height:20px;overflow:hidden;position:absolute;right:12px;text-align:center;top:50%;transform:translateY(-50%);width:20px;z-index:2}.outline-drawer__close .outline-icon{left:0;position:absolute;top:0;z-index:2}.outline-drawer__close:hover{color:#666}.outline-drawer__main{flex:1;overflow:auto}.outline-drawer__main.overflow-hidden{overflow:hidden}.outline-drawer__footer{margin:0 auto;overflow:hidden;text-align:right}.outline-drawer__overlay{background-color:#fff;content:"";height:100%;left:0;opacity:.1;overflow:hidden;position:relative;top:0;width:100%;z-index:1}.outline-drawer_ltr.outline-drawer_tiny,.outline-drawer_rtl.outline-drawer_tiny{width:280px}.outline-drawer_ltr.outline-drawer_mini,.outline-drawer_rtl.outline-drawer_mini{width:480px}.outline-drawer_ltr.outline-drawer_small,.outline-drawer_rtl.outline-drawer_small{width:540px}.outline-drawer_ltr.outline-drawer_regular,.outline-drawer_rtl.outline-drawer_regular{width:680px}.outline-drawer_ltr.outline-drawer_medium,.outline-drawer_rtl.outline-drawer_medium{width:720px}.outline-drawer_ltr.outline-drawer_large,.outline-drawer_rtl.outline-drawer_large{width:960px}.outline-drawer_rtl{border-left:1px solid #dcdfe6}.outline-drawer_rtl.outline-drawer_tiny.outline-drawer_closed{right:-290px}.outline-drawer_rtl.outline-drawer_mini.outline-drawer_closed{right:-490px}.outline-drawer_rtl.outline-drawer_small.outline-drawer_closed{right:-550px}.outline-drawer_rtl.outline-drawer_regular.outline-drawer_closed{right:-690px}.outline-drawer_rtl.outline-drawer_medium.outline-drawer_closed{right:-730px}.outline-drawer_rtl.outline-drawer_large.outline-drawer_closed{right:-970px}.outline-drawer_ltr{border-right:1px solid #dcdfe6}.outline-drawer_ltr.outline-drawer_tiny.outline-drawer_closed{left:-290px}.outline-drawer_ltr.outline-drawer_mini.outline-drawer_closed{left:-490px}.outline-drawer_ltr.outline-drawer_small.outline-drawer_closed{left:-550px}.outline-drawer_ltr.outline-drawer_regular.outline-drawer_closed{left:-690px}.outline-drawer_ltr.outline-drawer_medium.outline-drawer_closed{left:-730px}.outline-drawer_ltr.outline-drawer_large.outline-drawer_closed{left:-970px}.outline-drawer_btt,.outline-drawer_ttb{left:0;width:100%}.outline-drawer_btt.outline-drawer_tiny,.outline-drawer_ttb.outline-drawer_tiny{height:240px}.outline-drawer_btt.outline-drawer_mini,.outline-drawer_ttb.outline-drawer_mini{height:320px}.outline-drawer_btt.outline-drawer_small,.outline-drawer_ttb.outline-drawer_small{height:360px}.outline-drawer_btt.outline-drawer_regular,.outline-drawer_ttb.outline-drawer_regular{height:400px}.outline-drawer_btt.outline-drawer_medium,.outline-drawer_ttb.outline-drawer_medium{height:440px}.outline-drawer_btt.outline-drawer_large,.outline-drawer_ttb.outline-drawer_large{height:480px}.outline-drawer_ttb{border-bottom:1px solid #dcdfe6}.outline-drawer_ttb.outline-drawer_tiny.outline-drawer_closed{top:-250px}.outline-drawer_ttb.outline-drawer_mini.outline-drawer_closed{top:-330px}.outline-drawer_ttb.outline-drawer_small.outline-drawer_closed{top:-370px}.outline-drawer_ttb.outline-drawer_regular.outline-drawer_closed{top:-410px}.outline-drawer_ttb.outline-drawer_medium.outline-drawer_closed{top:-450px}.outline-drawer_ttb.outline-drawer_large.outline-drawer_closed{top:-490px}.outline-drawer_btt{border-top:1px solid #dcdfe6;top:auto}.outline-drawer_btt.outline-drawer_tiny.outline-drawer_closed{bottom:-250px}.outline-drawer_btt.outline-drawer_mini.outline-drawer_closed{bottom:-330px}.outline-drawer_btt.outline-drawer_small.outline-drawer_closed{bottom:-370px}.outline-drawer_btt.outline-drawer_regular.outline-drawer_closed{bottom:-410px}.outline-drawer_btt.outline-drawer_medium.outline-drawer_closed{bottom:-450px}.outline-drawer_btt.outline-drawer_large.outline-drawer_closed{bottom:-490px}.outline-drawer_opened{visibility:visible;z-index:var(--outline-zIndex)}.outline-drawer_opened.outline-drawer{position:fixed}.outline-drawer_opened.outline-drawer_rtl{right:0}.outline-drawer_opened.outline-drawer_ltr{left:0}.outline-drawer_opened.outline-drawer_ttb{top:0}.outline-drawer_opened.outline-drawer_btt{bottom:0}.outline-drawer_offset.outline-drawer_ltr,.outline-drawer_offset.outline-drawer_rtl{height:calc(100% - 4em);top:50%;transform:translateY(-50%)}.outline-drawer_offset.outline-drawer_btt,.outline-drawer_offset.outline-drawer_ttb{left:50%;transform:translateX(-50%);width:calc(100% - 4em)}.outline-drawer_offset.outline-drawer_opened.outline-drawer_rtl{right:2em}.outline-drawer_offset.outline-drawer_opened.outline-drawer_ltr{left:2em}.outline-drawer_offset.outline-drawer_opened.outline-drawer_ttb{top:2em}.outline-drawer_offset.outline-drawer_opened.outline-drawer_btt{bottom:2em}.outline-drawer_auto.outline-drawer_ltr,.outline-drawer_auto.outline-drawer_rtl{height:auto;max-height:calc(100% - 4em)}.outline-drawer_full{padding:0} +:root{--outline-zIndex:2000;--outline-sticky-height:100%;--outline-navigator-width:100%}.outline-navigator{margin:0;overflow:auto;position:relative;width:var(--outline-navigator-width);z-index:1}.outline-navigator-parent{transition:.3s ease-in-out}.outline-navigator__title{border-bottom:1px solid #dcdfe6;font-size:16px;font-weight:400;height:40px;line-height:40px;margin:0 16px;overflow:hidden;padding:0 16px}.outline-navigator__main{margin:0;overflow:hidden;position:relative;z-index:1}.outline-navigator__item,.outline-navigator__list,.outline-navigator__subject{list-style-type:none;margin:0;overflow:hidden;padding:0;position:relative;z-index:2}.outline-navigator__list{padding:.5em 0}.outline-navigator__subject{padding-left:1em}.outline-navigator__item{font-size:13px;line-height:30px;margin:0;overflow:hidden}.outline-navigator__placeholder{background-color:#f7f8f9;border-left:2px solid #058942;box-sizing:border-box;height:30px;left:0;overflow:hidden;position:absolute;top:0;transition-duration:.2s;width:100%;z-index:1}.outline-navigator__anchor{display:block;overflow:hidden;padding:0 1.5em;text-overflow:ellipsis;white-space:nowrap}.outline-navigator__anchor:hover,.outline-navigator__anchor:link,.outline-navigator__anchor:visited{color:#555;text-decoration:none}.outline-navigator__anchor:hover{color:#058942}.outline-navigator__code{padding-right:.5em}.outline-navigator_highlight.outline-navigator__anchor:hover,.outline-navigator_highlight.outline-navigator__anchor:link,.outline-navigator_highlight.outline-navigator__anchor:visited{color:#058942;font-weight:700}.outline-navigator_fixed,.outline-navigator_sticky{display:flex;flex-direction:column;flex-wrap:nowrap;overflow:hidden;top:0;z-index:var(--outline-zIndex)}.outline-navigator_fixed .outline-navigator__main,.outline-navigator_fixed .outline-navigator__title,.outline-navigator_sticky .outline-navigator__main,.outline-navigator_sticky .outline-navigator__title{box-sizing:border-box}.outline-navigator_fixed .outline-navigator__title,.outline-navigator_sticky .outline-navigator__title{flex-shrink:0}.outline-navigator_fixed .outline-navigator__main,.outline-navigator_sticky .outline-navigator__main{flex:1;overflow:auto}.outline-navigator_sticky{max-height:var(--outline-sticky-height);position:sticky}.outline-navigator_fixed{max-height:100%;position:fixed}.outline-navigator_hidden{display:none}.outline-navigator_folded{overflow:hidden;width:0} +.outline-icon{display:inline-block;position:relative;vertical-align:middle;z-index:1}.outline-icon,.outline-icon__svg{height:1em;overflow:hidden;width:1em}.outline-icon__svg{left:50%;position:absolute;top:50%;z-index:2;fill:currentcolor;transform:translate(-50%,-50%)}.outline-icon_hidden{display:none}.outline-message{background-color:#fff;border-radius:3px;box-shadow:0 0 6px 1px #dcdfe6;left:50%;opacity:.1;padding:0 50px;position:fixed;top:-50px;transform:translateX(-50%);transition:all .5s ease-in-out;z-index:9999}.outline-message,.outline-message__content{color:#666;font-size:13px;height:40px;line-height:40px;margin:0;overflow:hidden}.outline-message__content{max-width:700px;text-overflow:ellipsis;white-space:nowrap}.outline-message__close,.outline-message__icon{height:40px;line-height:40px;overflow:hidden;position:absolute;text-align:center;top:0;width:40px;z-index:2}.outline-message__icon{color:#fff;left:0}.outline-message__icon .outline-icon{left:50%;position:absolute;top:50%;transform:translate(-50%,-50%);z-index:2}.outline-message__close{color:#999;cursor:pointer;right:0}.outline-message__close .outline-icon{left:50%;position:absolute;top:50%;transform:translate(-50%,-50%);z-index:2}.outline-message__close:hover{color:#666}.outline-message_info .outline-message__icon{background-color:#507afe}.outline-message_warning .outline-message__icon{background-color:#ff9901}.outline-message_success .outline-message__icon{background-color:#058942}.outline-message_error .outline-message__icon{background-color:#ff5d5d}.outline-message_plain{min-width:190px;padding:0 50px 0 15px}.outline-message_plain.outline-message_info{background-color:#ecf8ff;border-left:5px solid #507afe}.outline-message_plain.outline-message_warning{background-color:#fffbe6;border-left:5px solid #ff9901}.outline-message_plain.outline-message_success{background-color:#e1f6eb;border-left:5px solid #058942}.outline-message_plain.outline-message_error{background-color:#fff1f0;border-left:5px solid #ff5d5d}.outline-message_plain .outline-message__icon{display:none;width:0}.outline-message_plain .outline-message__icon .outline-icon{display:none}.outline-message_light{min-width:180px;padding:0 40px}.outline-message_light.outline-message_info .outline-message__icon{color:#507afe}.outline-message_light.outline-message_warning .outline-message__icon{color:#ff9901}.outline-message_light.outline-message_success .outline-message__icon{color:#058942}.outline-message_light.outline-message_error .outline-message__icon{color:#ff5d5d}.outline-message_light .outline-message__icon{background-color:#fff}.outline-message_round{border-radius:20px}.outline-message_round.outline-message_default{min-width:180px;padding:0 40px}.outline-message_round.outline-message_default .outline-message__icon{border-radius:10px;height:20px;left:10px;line-height:20px;top:10px;width:20px}.outline-message_round.outline-message_default.outline-message_full-width{min-width:200px;padding:0 20px 0 40px}.outline-message_round.outline-message_plain{min-width:195px;padding:0 40px 0 20px}.outline-message_round.outline-message_plain.outline-message_full-width{min-width:215px;padding:0 20px}.outline-message_full-width{min-width:200px;padding:0 10px 0 50px}.outline-message_full-width.outline-message_plain{min-width:230px;padding:0 10px 0 15px}.outline-message_full-width.outline-message_light{min-width:210px;padding:0 10px 0 40px}.outline-message_visible{opacity:1}.outline-message_hidden{display:none} +.outline-toolbar{margin:0;overflow:hidden;position:fixed;transition-duration:.3s;z-index:99999}.outline-toolbar__button{background-color:#fff;border:1px solid #dcdfe6;border-radius:3px;box-shadow:0 0 6px 1px #dcdfe6;box-sizing:border-box;color:#999;cursor:pointer;height:36px;margin:10px;overflow:hidden;position:relative;text-align:center;transition:all .3s ease-in-out .1s;width:36px;z-index:1}.outline-toolbar__button:hover{border-color:#058942;color:#058942;transform:scale(1.35)}.outline-toolbar__button.hide{display:none}.outline-toolbar__anchor:hover,.outline-toolbar__anchor:link,.outline-toolbar__anchor:visited{color:#999;text-decoration:none}.outline-toolbar__anchor:hover{color:#058942}.outline-toolbar__icon{height:20px;left:50%;position:absolute;top:50%;transform:translate(-50%,-50%);width:20px;z-index:2;fill:currentcolor;overflow:hidden}.outline-toolbar_active.outline-toolbar__button{background-color:#058942;border-color:#058942;color:#fff}.outline-toolbar_active.outline-toolbar__button:hover{color:#fff}.outline-toolbar_active .outline-toolbar__anchor:hover,.outline-toolbar_active .outline-toolbar__anchor:link,.outline-toolbar_active .outline-toolbar__anchor:visited{color:#fff}.outline-toolbar_rounded.outline-toolbar__button{border-radius:18px}.outline-toolbar_disabled .outline-toolbar__anchor:hover,.outline-toolbar_disabled .outline-toolbar__anchor:link,.outline-toolbar_disabled .outline-toolbar__anchor:visited,.outline-toolbar_disabled .outline-toolbar__button,.outline-toolbar_disabled.outline-toolbar__anchor:hover,.outline-toolbar_disabled.outline-toolbar__anchor:link,.outline-toolbar_disabled.outline-toolbar__anchor:visited,.outline-toolbar_disabled.outline-toolbar__button{border-color:#999;color:#999;cursor:not-allowed}.outline-toolbar_disabled .outline-toolbar__anchor:hover:hover,.outline-toolbar_disabled .outline-toolbar__anchor:link:hover,.outline-toolbar_disabled .outline-toolbar__anchor:visited:hover,.outline-toolbar_disabled .outline-toolbar__button:hover,.outline-toolbar_disabled.outline-toolbar__anchor:hover:hover,.outline-toolbar_disabled.outline-toolbar__anchor:link:hover,.outline-toolbar_disabled.outline-toolbar__anchor:visited:hover,.outline-toolbar_disabled.outline-toolbar__button:hover{border-color:#999;color:#999}.outline-toolbar_disabled .outline-toolbar__button,.outline-toolbar_disabled.outline-toolbar__button{background-color:#f5f5f5}.outline-toolbar_btt,.outline-toolbar_ttb{left:50%;transform:translateX(-50%)}.outline-toolbar_btt .outline-toolbar__button,.outline-toolbar_ttb .outline-toolbar__button{display:inline-block}.outline-toolbar_ttb{top:12px}.outline-toolbar_ttb.outline-toolbar_hidden{top:-56px}.outline-toolbar_btt{bottom:12px}.outline-toolbar_btt.outline-toolbar_hidden{bottom:-56px}.outline-toolbar_ltr,.outline-toolbar_rtl{transform:translateY(-50%);width:56px}.outline-toolbar_rtl{right:12px;top:50%}.outline-toolbar_rtl.outline-toolbar_hidden{right:-86px}.outline-toolbar_ltr{left:12px;top:50%}.outline-toolbar_ltr.outline-toolbar_hidden{left:-86px}.outline-toolbar_btt .outline-toolbar__button.outline-toolbar_hidden,.outline-toolbar_ltr .outline-toolbar__button.outline-toolbar_hidden,.outline-toolbar_rtl .outline-toolbar__button.outline-toolbar_hidden,.outline-toolbar_ttb .outline-toolbar__button.outline-toolbar_hidden{display:none} +.outline-reader__progress{animation:outline-reader-progress linear;background-color:#507afe;height:4px;left:0;position:fixed;scale:0 1;top:0;transform-origin:left;width:100%;z-index:3;animation-timeline:--ProgressTimeline}.outline-reader__paper{background-color:#fff;box-shadow:0 0 6px 1px #ddd;box-sizing:border-box;margin:2em auto;max-width:1200px;overflow:hidden;padding:3.2em}.outline-reader__title{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Helvetica Neue,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Helvetica,Arial,sans-serif;font-size:4.2em;font-weight:400;line-height:1.3em;margin:.67em 0;overflow:hidden;text-align:center}.outline-reader__article .outline-reader__progress,.outline-reader_hidden{display:none}.outline-reader_hidden.outline-reader_sibling{display:none!important}.outline-reader_hidden.outline-reader_sibling.wrapper.post{display:none}.outline-reader--reading{background-color:#fafafa;box-sizing:border-box;display:block;height:100%;left:0;margin:0;padding:3em 4em;position:fixed;top:0;width:100%;z-index:2;scroll-timeline-name:--ProgressTimeline;overflow:scroll}@keyframes outline-reader-progress{to{scale:1 1}}@media (max-width:500px){.outline-reader{overflow:hidden}.outline-reader .outline-toolbar{align-items:center;align-self:auto;background-color:#fff;border-top:1px solid #ddd;box-sizing:border-box;display:flex;flex-direction:row;flex-wrap:nowrap;height:48px;padding:0 16px;right:0;top:100%;transform:translateY(-48px);width:100%}.outline-reader .outline-toolbar__button{border:none;border-radius:0;box-shadow:none;flex:1}.outline-reader--reading{background-color:#fff;box-sizing:border-box;padding:0}.outline-reader__paper{box-shadow:none;height:100%;margin:0;overflow:hidden;padding:0;position:relative;z-index:1}.outline-reader__title{background-color:#fff;border-bottom:1px solid #ddd;font-size:1.8em;font-weight:400;height:48px;left:0;line-height:48px;margin:0;overflow:hidden;position:absolute;text-overflow:ellipsis;top:0;white-space:nowrap;width:100%;z-index:3}.outline-reader__article{height:calc(100% - 96px);margin:48px 0;padding:0 1.25em;scroll-timeline-name:--MobileProgressTimeline;overflow-x:hidden;overflow-y:scroll}.outline-reader__article .outline-reader__progress{animation:outline-reader-progress linear;z-index:4;animation-timeline:--MobileProgressTimeline;display:block}}@media print{body,html{background-color:#fff;color:#333;font-size:12pt;height:auto!important}a:hover,a:link,a:visited{color:#507afe;text-decoration:underline!important}audio,video{display:none!important}table{border-collapse:collapse;width:100%}td,th{border:1px solid #dcdfe6;padding:8px 20px}.outline-message,.outline-toolbar{display:none!important}.outline-reader{display:block!important;overflow:hidden}.outline-reader__title{font-size:32pt!important;margin:13.4pt 0 28pt!important;text-align:center!important}.outline-reader--reading{background-color:#fff;height:auto!important;overflow:hidden!important;padding:0!important;position:relative!important}.outline-reader__progress{display:none!important}.outline-reader__paper{box-shadow:none}.outline-reader pre{border:1px solid #ddd!important;border-radius:4px!important;padding:1em!important}.outline-reader code,.outline-reader pre{background-color:#fff!important}.outline-reader img,.outline-reader svg,.outline-reader table{break-inside:avoid}.outline-reader_sibling{display:none!important}} \ No newline at end of file diff --git a/build/rollup.config.api.js b/build/rollup.config.api.js index d27bceac..674d7d92 100644 --- a/build/rollup.config.api.js +++ b/build/rollup.config.api.js @@ -1,97 +1,24 @@ -import { nodeResolve } from '@rollup/plugin-node-resolve' -import { babel } from '@rollup/plugin-babel' -import commonjs from '@rollup/plugin-commonjs' -import terser from '@rollup/plugin-terser' - -const PLUGIN_CONFIG = [ - nodeResolve({ - mainFields: ['module', 'jsnext', 'main', 'browser'] - }), - commonjs(), - babel({ babelHelpers: 'bundled' }), - terser() -] +import getRollupPluginConfig from './rollup.plugin.config' export default [ - // build for documentation - { - input: './outline.js', - output: { - name: 'Outline', - file: './docs/js/outline.min.js', - format: 'umd', - sourcemap: true - }, - plugins: PLUGIN_CONFIG - }, - { - input: './anchors.js', - output: { - name: 'Anchors', - file: './docs/js/anchors.min.js', - format: 'umd', - sourcemap: true - }, - plugins: PLUGIN_CONFIG - }, - { - input: './navigator.js', - output: { - name: 'Navigator', - file: './docs/js/navigator.min.js', - format: 'umd', - sourcemap: true - }, - plugins: PLUGIN_CONFIG - }, - { - input: './drawer.js', - output: { - name: 'Drawer', - file: './docs/js/drawer.min.js', - format: 'umd', - sourcemap: true - }, - plugins: PLUGIN_CONFIG - }, { - input: './reader.js', - output: { - name: 'Reader', - file: './docs/js/reader.min.js', - format: 'umd', - sourcemap: true - }, - plugins: PLUGIN_CONFIG - }, - { - input: './toolbar.js', - output: { - name: 'Toolbar', - file: './docs/js/toolbar.min.js', - format: 'umd', - sourcemap: true - }, - plugins: PLUGIN_CONFIG - }, - { - input: './message.js', + input: './api/js/main.js', output: { - name: 'Message', - file: './docs/js/message.min.js', + name: 'outline', + file: './docs/js/docs.min.js', format: 'umd', sourcemap: true }, - plugins: PLUGIN_CONFIG + plugins: getRollupPluginConfig('docs', true) }, { - input: './api/js/main.js', + input: './outline.js', output: { - name: 'outline', - file: './docs/js/docs.min.js', + name: 'Outline', + file: './docs/js/outline.min.js', format: 'umd', sourcemap: true }, - plugins: PLUGIN_CONFIG + plugins: getRollupPluginConfig('outline', true) } ] diff --git a/build/rollup.config.lib.js b/build/rollup.config.lib.js index 195c77cf..6fc27930 100644 --- a/build/rollup.config.lib.js +++ b/build/rollup.config.lib.js @@ -1,16 +1,4 @@ -import { nodeResolve } from '@rollup/plugin-node-resolve' -import { babel } from '@rollup/plugin-babel' -import commonjs from '@rollup/plugin-commonjs' -import terser from '@rollup/plugin-terser' - -const PLUGIN_CONFIG = [ - nodeResolve({ - mainFields: ['module', 'jsnext', 'main', 'browser'] - }), - commonjs(), - babel({ babelHelpers: 'bundled' }), - terser() -] +import getRollupPluginConfig from './rollup.plugin.config' export default [ // For full functions module @@ -22,66 +10,66 @@ export default [ format: 'umd', sourcemap: true }, - plugins: PLUGIN_CONFIG + plugins: getRollupPluginConfig('outline') }, { - input: './anchors.js', + input: './anchors/anchors.js', output: { name: 'Anchors', - file: './anchors.min.js', + file: './anchors/anchors.min.js', format: 'umd', sourcemap: true }, - plugins: PLUGIN_CONFIG + plugins: getRollupPluginConfig('anchors') }, { - input: './navigator.js', + input: './navigator/navigator.js', output: { name: 'Navigator', - file: './navigator.min.js', + file: './navigator/navigator.min.js', format: 'umd', sourcemap: true }, - plugins: PLUGIN_CONFIG + plugins: getRollupPluginConfig('navigator') }, { - input: './drawer.js', + input: './drawer/drawer.js', output: { name: 'Drawer', - file: './drawer.min.js', + file: './drawer/drawer.min.js', format: 'umd', sourcemap: true }, - plugins: PLUGIN_CONFIG + plugins: getRollupPluginConfig('drawer') }, { - input: './reader.js', + input: './reader/reader.js', output: { name: 'Reader', - file: './reader.min.js', + file: './reader/reader.min.js', format: 'umd', sourcemap: true }, - plugins: PLUGIN_CONFIG + plugins: getRollupPluginConfig('reader') }, { - input: './toolbar.js', + input: './toolbar/toolbar.js', output: { name: 'Toolbar', - file: './toolbar.min.js', + file: './toolbar/toolbar.min.js', format: 'umd', sourcemap: true }, - plugins: PLUGIN_CONFIG + plugins: getRollupPluginConfig('toolbar') }, { - input: './message.js', + input: './message/message.js', output: { name: 'Message', - file: './message.min.js', + file: './message/message.min.js', format: 'umd', sourcemap: true }, - plugins: PLUGIN_CONFIG + plugins: getRollupPluginConfig('message') } ] diff --git a/build/rollup.plugin.config.js b/build/rollup.plugin.config.js new file mode 100644 index 00000000..57df8b67 --- /dev/null +++ b/build/rollup.plugin.config.js @@ -0,0 +1,52 @@ +import alias from '@rollup/plugin-alias' +import { nodeResolve } from '@rollup/plugin-node-resolve' +import { babel } from '@rollup/plugin-babel' +import commonjs from '@rollup/plugin-commonjs' +import terser from '@rollup/plugin-terser' +import postcss from 'rollup-plugin-postcss' +import cssnano from 'cssnano' +import less from 'less' +import path from 'path' + +const getRollupPluginConfig = (name, isApi = false) => { + const dirPath = name === 'outline' ? './' : `./${name}` + + return [ + alias({ + entries: [ + { + find: '@', + replacement: path.resolve('./') + } + ] + }), + postcss({ + extract: isApi ? false : path.resolve(dirPath, `${name}.css`), + // 将 CSS 提取到一个单独的文件 + extensions: ['.less'], + plugins: [ + // 使用 cssnano 进行压缩 + cssnano() + ], + process: (context) => { + return new Promise((resolve, reject) => { + less.render(context, (err, result) => { + if (err) { + reject(err) + } else { + resolve(result.css) + } + }) + }) + } + }), + nodeResolve({ + mainFields: ['module', 'jsnext', 'main', 'browser'] + }), + commonjs(), + babel({ babelHelpers: 'bundled' }), + terser() + ] +} + +export default getRollupPluginConfig diff --git a/_getChapterParentIdByDiffer.js b/chapters/_getChapterParentIdByDiffer.js similarity index 100% rename from _getChapterParentIdByDiffer.js rename to chapters/_getChapterParentIdByDiffer.js diff --git a/_getChaptersWithCode.js b/chapters/_getChaptersWithCode.js similarity index 93% rename from _getChaptersWithCode.js rename to chapters/_getChaptersWithCode.js index 921e3401..aafb8e15 100644 --- a/_getChaptersWithCode.js +++ b/chapters/_getChaptersWithCode.js @@ -1,4 +1,4 @@ -import isArray from './utils/types/isArray' +import isArray from '../utils/types/isArray' const _getChaptersWithCode = (chapters) => { const groups = {} diff --git a/getChapters.js b/chapters/getChapters.js similarity index 87% rename from getChapters.js rename to chapters/getChapters.js index 4c7ae569..d902d536 100644 --- a/getChapters.js +++ b/chapters/getChapters.js @@ -1,7 +1,7 @@ -import isString from './utils/types/isString' -import isFunction from './utils/types/isFunction' -import isElement from './utils/types/isElement' -import toTree from './utils/lang/toTree' +import isString from '../utils/types/isString' +import isFunction from '../utils/types/isFunction' +import isElement from '../utils/types/isElement' +import toTree from '../utils/lang/toTree' import getChaptersByHeadings from './getChaptersByHeadings' diff --git a/getChaptersByHeadings.js b/chapters/getChaptersByHeadings.js similarity index 95% rename from getChaptersByHeadings.js rename to chapters/getChaptersByHeadings.js index 79402c09..2d78a7fa 100644 --- a/getChaptersByHeadings.js +++ b/chapters/getChaptersByHeadings.js @@ -1,6 +1,6 @@ -import trim from './utils/lang/trim' -import stripTags from './utils/lang/stripTags' -import isFunction from './utils/types/isFunction' +import trim from '../utils/lang/trim' +import stripTags from '../utils/lang/stripTags' +import isFunction from '../utils/types/isFunction' import _getChapterParentIdByDiffer from './_getChapterParentIdByDiffer' import _getChaptersWithCode from './_getChaptersWithCode' diff --git a/base.js b/component.js similarity index 92% rename from base.js rename to component.js index cbee3238..9b36e072 100644 --- a/base.js +++ b/component.js @@ -1,98 +1,102 @@ -import isString from './utils/types/isString' -import hasOwn from './utils/lang/hasOwn' -import isObject from './utils/types/isObject' -import extend from './utils/lang/extend' -import publish from './utils/observer/emit' -import subscribe from './utils/observer/on' -import unsubscribe from './utils/observer/off' - -class Base { - constructor(options) { - this.attrs = {} - - if (options) { - this.initialize(options) - } - } - - initialize(options) { - this.attr(options).render().addListeners() - return this - } - - attr(prop, value) { - const attrs = this.attrs - - if (isString(prop)) { - // 只能扩展 attrs 中已有的属性 - if (value && hasOwn(attrs, prop)) { - // 更新单个配置信息 - attrs[prop] = value - return this - } - - // 只传递 prop 参数,则返回对应的属性值 - return attrs[prop] - } else if (isObject(prop)) { - // 批量更新配置信息 - extend(attrs, prop) - - return this - } else if (arguments.length === 0) { - // 不传递参数,直接返回整个 - return attrs - } - - return this - } - - render() { - return this - } - - refresh() { - return this - } - - destroy() { - this.removeListeners() - return this - } - - reload(options) { - let attrs = this.attr() - - if (options) { - attrs = this.attr(options) - } - - this.destroy().initialize(attrs) - - return this - } - - $emit(event, data) { - publish(event, data) - return this - } - - $on(event, callback) { - subscribe(event, callback, this) - return this - } - - $off(event, callback) { - unsubscribe(event, callback) - return this - } - - addListeners() { - return this - } - - removeListeners() { - return this - } -} - -export default Base +import isString from './utils/types/isString' + +import extend from './utils/lang/extend' +import hasOwn from './utils/lang/hasOwn' + +import isObject from './utils/types/isObject' + +import publish from './utils/observer/emit' +import subscribe from './utils/observer/on' +import unsubscribe from './utils/observer/off' + +class Component { + constructor(options) { + this.attrs = {} + this.name = 'component' + + if (options) { + this.initialize(options) + } + } + + initialize(options) { + this.attr(options).render().addListeners() + return this + } + + attr(prop, value) { + const attrs = this.attrs + + if (isString(prop)) { + // 只能扩展 attrs 中已有的属性 + if (value && hasOwn(attrs, prop)) { + // 更新单个配置信息 + attrs[prop] = value + return this + } + + // 只传递 prop 参数,则返回对应的属性值 + return attrs[prop] + } else if (isObject(prop)) { + // 批量更新配置信息 + extend(attrs, prop) + + return this + } else if (arguments.length === 0) { + // 不传递参数,直接返回整个 + return attrs + } + + return this + } + + render() { + return this + } + + refresh() { + return this + } + + destroy() { + this.removeListeners() + return this + } + + reload(options) { + let attrs = this.attr() + + if (options) { + attrs = this.attr(options) + } + + this.destroy().initialize(attrs) + + return this + } + + $emit(event, data) { + publish(event, data) + return this + } + + $on(event, callback) { + subscribe(event, callback, this) + return this + } + + $off(event, callback) { + unsubscribe(event, callback) + return this + } + + addListeners() { + return this + } + + removeListeners() { + return this + } +} + +export default Component diff --git a/docs/css/docs.css b/docs/css/docs.css index 9a11ec2e..b8de78df 100644 --- a/docs/css/docs.css +++ b/docs/css/docs.css @@ -813,6 +813,29 @@ code { .outline-icon_hidden { display: none; } +/* ===== Scrollbar ===== */ +::-webkit-scrollbar { + width: 7px; + height: 7px; + -webkit-border-radius: 5px; +} +::-webkit-scrollbar-track-piece { + -webkit-border-radius: 5px; +} +::-webkit-scrollbar-thumb:vertical { + background-color: rgba(0, 0, 0, 0.25); + -webkit-border-radius: 5px; +} +::-webkit-scrollbar-thumb:horizontal { + background-color: rgba(0, 0, 0, 0.25); + -webkit-border-radius: 5px; +} +::-webkit-scrollbar-thumb:hover { + background-color: rgba(0, 0, 0, 0.35); +} +::-webkit-scrollbar:hover { + background-color: rgba(0, 0, 0, 0.15); +} .outline-heading { position: relative; z-index: 1; @@ -1559,7 +1582,6 @@ code { display: none !important; } } -/* ========== buttons.theme - 按钮导航样式 ========== */ .outline-toolbar { position: fixed; z-index: 99999; @@ -1709,203 +1731,5 @@ code { .outline-toolbar_ltr .outline-toolbar__button.outline-toolbar_hidden { display: none; } -.outline-message { - border-radius: 3px; - -webkit-box-shadow: 0 0 6px 1px #dcdfe6; - box-shadow: 0 0 6px 1px #dcdfe6; - position: fixed; - z-index: 9999; - opacity: 0.1; - top: -50px; - left: 50%; - height: 40px; - margin: 0; - padding: 0 50px; - line-height: 40px; - font-size: 13px; - background-color: #fff; - color: #666; - -webkit-transition: all 0.5s ease-in-out; - transition: all 0.5s ease-in-out; - -webkit-transform: translateX(-50%); - transform: translateX(-50%); - overflow: hidden; -} -.outline-message__content { - white-space: nowrap; - text-overflow: ellipsis; - margin: 0; - max-width: 700px; - height: 40px; - line-height: 40px; - font-size: 13px; - color: #666; - overflow: hidden; -} -.outline-message__close, -.outline-message__icon { - position: absolute; - z-index: 2; - top: 0; - width: 40px; - height: 40px; - line-height: 40px; - text-align: center; - overflow: hidden; -} -.outline-message__icon { - left: 0; - color: #fff; -} -.outline-message__icon .outline-icon { - position: absolute; - z-index: 2; - top: 50%; - left: 50%; - -webkit-transform: translate(-50%, -50%); - transform: translate(-50%, -50%); -} -.outline-message__close { - right: 0; - cursor: pointer; - color: #999; -} -.outline-message__close .outline-icon { - position: absolute; - z-index: 2; - top: 50%; - left: 50%; - -webkit-transform: translate(-50%, -50%); - transform: translate(-50%, -50%); -} -.outline-message__close:hover { - color: #666; -} -.outline-message_info .outline-message__icon { - background-color: #507afe; -} -.outline-message_warning .outline-message__icon { - background-color: #ff9901; -} -.outline-message_success .outline-message__icon { - background-color: #058942; -} -.outline-message_error .outline-message__icon { - background-color: #ff5d5d; -} -.outline-message_plain { - min-width: 190px; - padding: 0 50px 0 15px; -} -.outline-message_plain.outline-message_info { - border-left: 5px solid #507afe; - background-color: #ecf8ff; -} -.outline-message_plain.outline-message_warning { - border-left: 5px solid #ff9901; - background-color: #fffbe6; -} -.outline-message_plain.outline-message_success { - border-left: 5px solid #058942; - background-color: #e1f6eb; -} -.outline-message_plain.outline-message_error { - border-left: 5px solid #ff5d5d; - background-color: #fff1f0; -} -.outline-message_plain .outline-message__icon { - width: 0; - display: none; -} -.outline-message_plain .outline-message__icon .outline-icon { - display: none; -} -.outline-message_light { - min-width: 180px; - padding: 0 40px; -} -.outline-message_light.outline-message_info .outline-message__icon { - color: #507afe; -} -.outline-message_light.outline-message_warning .outline-message__icon { - color: #ff9901; -} -.outline-message_light.outline-message_success .outline-message__icon { - color: #058942; -} -.outline-message_light.outline-message_error .outline-message__icon { - color: #ff5d5d; -} -.outline-message_light .outline-message__icon { - background-color: #fff; -} -.outline-message_round { - border-radius: 20px; -} -.outline-message_round.outline-message_default { - min-width: 180px; - padding: 0 40px; -} -.outline-message_round.outline-message_default .outline-message__icon { - border-radius: 10px; - top: 10px; - left: 10px; - width: 20px; - height: 20px; - line-height: 20px; -} -.outline-message_round.outline-message_default.outline-message_full-width { - min-width: 200px; - padding: 0 20px 0 40px; -} -.outline-message_round.outline-message_plain { - min-width: 195px; - padding: 0 40px 0 20px; -} -.outline-message_round.outline-message_plain.outline-message_full-width { - min-width: 215px; - padding: 0 20px; -} -.outline-message_full-width { - min-width: 200px; - padding: 0 10px 0 50px; -} -.outline-message_full-width.outline-message_plain { - min-width: 230px; - padding: 0 10px 0 15px; -} -.outline-message_full-width.outline-message_light { - min-width: 210px; - padding: 0 10px 0 40px; -} -.outline-message_visible { - opacity: 1; -} -.outline-message_hidden { - display: none; -} -/* ===== Scrollbar ===== */ -::-webkit-scrollbar { - width: 7px; - height: 7px; - -webkit-border-radius: 5px; -} -::-webkit-scrollbar-track-piece { - -webkit-border-radius: 5px; -} -::-webkit-scrollbar-thumb:vertical { - background-color: rgba(0, 0, 0, 0.25); - -webkit-border-radius: 5px; -} -::-webkit-scrollbar-thumb:horizontal { - background-color: rgba(0, 0, 0, 0.25); - -webkit-border-radius: 5px; -} -::-webkit-scrollbar-thumb:hover { - background-color: rgba(0, 0, 0, 0.35); -} -::-webkit-scrollbar:hover { - background-color: rgba(0, 0, 0, 0.15); -} -/*# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLzxpbnB1dCBjc3MgMT4iLCJub3JtYWxpemUubGVzcyIsImJhc2UubGVzcyIsInNjcm9sbGJhci5sZXNzIiwibGF5b3V0Lmxlc3MiLCJhc2lkZS5sZXNzIiwibWFpbi5sZXNzIiwic2VjdGlvbi5sZXNzIiwiY2FzZS5sZXNzIiwiLi4vLi4vdGhlbWUvdmFyaWFibGVzLmxlc3MiLCIuLi8uLi90aGVtZS9pY29ucy5sZXNzIiwiLi4vLi4vdGhlbWUvYW5jaG9ycy5sZXNzIiwiLi4vLi4vdGhlbWUvZHJhd2VyLmxlc3MiLCIuLi8uLi90aGVtZS9zaGFkb3cubGVzcyIsIi4uLy4uL3RoZW1lL25hdmlnYXRvci5sZXNzIiwiLi4vLi4vdGhlbWUvZWxsaXBzaXMubGVzcyIsIi4uLy4uL3RoZW1lL3JlYWRlci5sZXNzIiwiLi4vLi4vdGhlbWUvcmFkaXVzLmxlc3MiLCIuLi8uLi90aGVtZS90b29sYmFyLmxlc3MiLCIuLi8uLi90aGVtZS9tZXNzYWdlLmxlc3MiLCIuLi8uLi90aGVtZS9zY3JvbGxiYXIubGVzcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSw0RUFBNEU7QUFDNUU7Z0ZBQ2dGO0FBQ2hGOzs7R0FHRztBQ0lIO0VBQ0Usa0JBQUE7RURGQSxPQUFPO0VDR1AsK0JBQUE7RUREQSxPQUFPO0NBQ1I7QUFDRDtnRkFDZ0Y7QUFDaEY7O0dBRUc7QUNLSDtFQUNFLFVBQUE7Q0RIRDtBQUNEOztHQUVHO0FDT0g7RUFDRSxlQUFBO0NETEQ7QUFDRDs7O0dBR0c7QUNTSDtFQUNFLGVBQUE7RUFDQSxpQkFBQTtDRFBEO0FBQ0Q7Z0ZBQ2dGO0FBQ2hGOzs7R0FHRztBQ1lIO0VBQ0UsZ0NBQUE7VUFBQSx3QkFBQTtFRFZBLE9BQU87RUNXUCxVQUFBO0VEVEEsT0FBTztFQ1VQLGtCQUFBO0VEUkEsT0FBTztDQUNSO0FBQ0Q7OztHQUdHO0FDV0g7RUFDRSxrQ0FBQTtFRFRBLE9BQU87RUNVUCxlQUFBO0VEUkEsT0FBTztDQUNSO0FBQ0Q7Z0ZBQ2dGO0FB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MkJBQUE7Q3BCa3ZESDtBb0I5dURHO0VBQ0Usc0NBQUE7RUFDQSwyQkFBQTtDcEJndkRMO0FvQjd1REc7RUFDRSxzQ0FBQTtFQUNBLDJCQUFBO0NwQit1REw7QW9CNXVERztFQUNFLHNDQUFBO0NwQjh1REw7QW9CMXVEQztFQUNFLHNDQUFBO0NwQjR1REgiLCJmaWxlIjoiZG9jcy5jc3MiLCJzb3VyY2VzQ29udGVudCI6WyIvKiEgbm9ybWFsaXplLmNzcyB2OC4wLjEgfCBNSVQgTGljZW5zZSB8IGdpdGh1Yi5jb20vbmVjb2xhcy9ub3JtYWxpemUuY3NzICovXG4vKiBEb2N1bWVudFxuICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cbi8qKlxuICogMS4gQ29ycmVjdCB0aGUgbGluZSBoZWlnaHQgaW4gYWxsIGJyb3dzZXJzLlxuICogMi4gUHJldmVudCBhZGp1c3RtZW50cyBvZiBmb250IHNpemUgYWZ0ZXIgb3JpZW50YXRpb24gY2hhbmdlcyBpbiBpT1MuXG4gKi9cbmh0bWwge1xuICBsaW5lLWhlaWdodDogMS4xNTtcbiAgLyogMSAqL1xuICAtd2Via2l0LXRleHQtc2l6ZS1hZGp1c3Q6IDEwMCU7XG4gIC8qIDIgKi9cbn1cbi8qIFNlY3Rpb25zXG4gICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xuLyoqXG4gKiBSZW1vdmUgdGhlIG1hcmdpbiBpbiBhbGwgYnJvd3NlcnMuXG4gKi9cbmJvZHkge1xuICBtYXJnaW46IDA7XG59XG4vKipcbiAqIFJlbmRlciB0aGUgYG1haW5gIGVsZW1lbnQgY29uc2lzdGVudGx5IGluIElFLlxuICovXG5tYWluIHtcbiAgZGlzcGxheTogYmxvY2s7XG59XG4vKipcbiAqIENvcnJlY3QgdGhlIGZvbnQgc2l6ZSBhbmQgbWFyZ2luIG9uIGBoMWAgZWxlbWVudHMgd2l0aGluIGBzZWN0aW9uYCBhbmRcbiAqIGBhcnRpY2xlYCBjb250ZXh0cyBpbiBDaHJvbWUsIEZpcmVmb3gsIGFuZCBTYWZhcmkuXG4gKi9cbmgxIHtcbiAgZm9udC1zaXplOiAyZW07XG4gIG1hcmdpbjogMC42N2VtIDA7XG59XG4vKiBHcm91cGluZyBjb250ZW50XG4gICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xuLyoqXG4gKiAxLiBBZGQgdGhlIGNvcnJlY3QgYm94IHNpemluZyBpbiBGaXJlZm94LlxuICogMi4gU2hvdyB0aGUgb3ZlcmZsb3cgaW4gRWRnZSBhbmQgSUUuXG4gKi9cbmhyIHtcbiAgYm94LXNpemluZzogY29udGVudC1ib3g7XG4gIC8qIDEgKi9cbiAgaGVpZ2h0OiAwO1xuICAvKiAxICovXG4gIG92ZXJmbG93OiB2aXNpYmxlO1xuICAvKiAyICovXG59XG4vKipcbiAqIDEuIENvcnJlY3QgdGhlIGluaGVyaXRhbmNlIGFuZCBzY2FsaW5nIG9mIGZvbnQgc2l6ZSBpbiBhbGwgYnJvd3NlcnMuXG4gKiAyLiBDb3JyZWN0IHRoZSBvZGQgYGVtYCBmb250IHNpemluZyBpbiBhbGwgYnJvd3NlcnMuXG4gKi9cbnByZSB7XG4gIGZvbnQtZmFtaWx5OiBtb25vc3BhY2UsIG1vbm9zcGFjZTtcbiAgLyogMSAqL1xuICBmb250LXNpemU6IDFlbTtcbiAgLyogMiAqL1xufVxuLyogVGV4dC1sZXZlbCBzZW1hbnRpY3NcbiAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXG4vKipcbiAqIFJlbW92ZSB0aGUgZ3JheSBiYWNrZ3JvdW5kIG9uIGFjdGl2ZSBsaW5rcyBpbiBJRSAxMC5cbiAqL1xuYSB7XG4gIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50O1xufVxuLyoqXG4gKiAxLiBSZW1vdmUgdGhlIGJvdHRvbSBib3JkZXIgaW4gQ2hyb21lIDU3LVxuICogMi4gQWRkIHRoZSBjb3JyZWN0IHRleHQgZGVjb3JhdGlvbiBpbiBDaHJvbWUsIEVkZ2UsIElFLCBPcGVyYSwgYW5kIFNhZmFyaS5cbiAqL1xuYWJiclt0aXRsZV0ge1xuICBib3JkZXItYm90dG9tOiBub25lO1xuICAvKiAxICovXG4gIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lO1xuICAvKiAyICovXG4gIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lIGRvdHRlZDtcbiAgLyogMiAqL1xufVxuLyoqXG4gKiBBZGQgdGhlIGNvcnJlY3QgZm9udCB3ZWlnaHQgaW4gQ2hyb21lLCBFZGdlLCBhbmQgU2FmYXJpLlxuICovXG5iLFxuc3Ryb25nIHtcbiAgZm9udC13ZWlnaHQ6IGJvbGRlcjtcbn1cbi8qKlxuICogMS4gQ29ycmVjdCB0aGUgaW5oZXJpdGFuY2UgYW5kIHNjYWxpbmcgb2YgZm9udCBzaXplIGluIGFsbCBicm93c2Vycy5cbiAqIDIuIENvcnJlY3QgdGhlIG9kZCBgZW1gIGZvbnQgc2l6aW5nIGluIGFsbCBicm93c2Vycy5cbiAqL1xuY29kZSxcbmtiZCxcbnNhbXAge1xuICBmb250LWZhbWlseTogbW9ub3NwYWNlLCBtb25vc3BhY2U7XG4gIC8qIDEgKi9cbiAgZm9udC1zaXplOiAxZW07XG4gIC8qIDIgKi9cbn1cbi8qKlxuICogQWRkIHRoZSBjb3JyZWN0IGZvbnQgc2l6ZSBpbiBhbGwgYnJvd3NlcnMuXG4gKi9cbnNtYWxsIHtcbiAgZm9udC1zaXplOiA4MCU7XG59XG4vKipcbiAqIFByZXZlbnQgYHN1YmAgYW5kIGBzdXBgIGVsZW1lbnRzIGZyb20gYWZmZWN0aW5nIHRoZSBsaW5lIGhlaWdodCBpblxuICogYWxsIGJyb3dzZXJzLlxuICovXG5zdWIsXG5zdXAge1xuICBmb250LXNpemU6IDc1JTtcbiAgbGluZS1oZWlnaHQ6IDA7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgdmVydGljYWwtYWxpZ246IGJhc2VsaW5lO1xufVxuc3ViIHtcbiAgYm90dG9tOiAtMC4yNWVtO1xufVxuc3VwIHtcbiAgdG9wOiAtMC41ZW07XG59XG4vKiBFbWJlZGRlZCBjb250ZW50XG4gICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xuLyoqXG4gKiBSZW1vdmUgdGhlIGJvcmRlciBvbiBpbWFnZXMgaW5zaWRlIGxpbmtzIGluIElFIDEwLlxuICovXG5pbWcge1xuICBib3JkZXItc3R5bGU6IG5vbmU7XG59XG4vKiBGb3Jtc1xuICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cbi8qKlxuICogMS4gQ2hhbmdlIHRoZSBmb250IHN0eWxlcyBpbiBhbGwgYnJvd3NlcnMuXG4gKiAyLiBSZW1vdmUgdGhlIG1hcmdpbiBpbiBGaXJlZm94IGFuZCBTYWZhcmkuXG4gKi9cbmJ1dHRvbixcbmlucHV0LFxub3B0Z3JvdXAsXG5zZWxlY3QsXG50ZXh0YXJlYSB7XG4gIGZvbnQtZmFtaWx5OiBpbmhlcml0O1xuICAvKiAxICovXG4gIGZvbnQtc2l6ZTogMTAwJTtcbiAgLyogMSAqL1xuICBsaW5lLWhlaWdodDogMS4xNTtcbiAgLyogMSAqL1xuICBtYXJnaW46IDA7XG4gIC8qIDIgKi9cbn1cbi8qKlxuICogU2hvdyB0aGUgb3ZlcmZsb3cgaW4gSUUuXG4gKiAxLiBTaG93IHRoZSBvdmVyZmxvdyBpbiBFZGdlLlxuICovXG5idXR0b24sXG5pbnB1dCB7XG4gIC8qIDEgKi9cbiAgb3ZlcmZsb3c6IHZpc2libGU7XG59XG4vKipcbiAqIFJlbW92ZSB0aGUgaW5oZXJpdGFuY2Ugb2YgdGV4dCB0cmFuc2Zvcm0gaW4gRWRnZSwgRmlyZWZveCwgYW5kIElFLlxuICogMS4gUmVtb3ZlIHRoZSBpbmhlcml0YW5jZSBvZiB0ZXh0IHRyYW5zZm9ybSBpbiBGaXJlZm94LlxuICovXG5idXR0b24sXG5zZWxlY3Qge1xuICAvKiAxICovXG4gIHRleHQtdHJhbnNmb3JtOiBub25lO1xufVxuLyoqXG4gKiBDb3JyZWN0IHRoZSBpbmFiaWxpdHkgdG8gc3R5bGUgY2xpY2thYmxlIHR5cGVzIGluIGlPUyBhbmQgU2FmYXJpLlxuICovXG5idXR0b24sXG5bdHlwZT0nYnV0dG9uJ10sXG5bdHlwZT0ncmVzZXQnXSxcblt0eXBlPSdzdWJtaXQnXSB7XG4gIC13ZWJraXQtYXBwZWFyYW5jZTogYnV0dG9uO1xufVxuLyoqXG4gKiBSZW1vdmUgdGhlIGlubmVyIGJvcmRlciBhbmQgcGFkZGluZyBpbiBGaXJlZm94LlxuICovXG5idXR0b246Oi1tb3otZm9jdXMtaW5uZXIsXG5bdHlwZT0nYnV0dG9uJ106Oi1tb3otZm9jdXMtaW5uZXIsXG5bdHlwZT0ncmVzZXQnXTo6LW1vei1mb2N1cy1pbm5lcixcblt0eXBlPSdzdWJtaXQnXTo6LW1vei1mb2N1cy1pbm5lciB7XG4gIGJvcmRlci1zdHlsZTogbm9uZTtcbiAgcGFkZGluZzogMDtcbn1cbi8qKlxuICogUmVzdG9yZSB0aGUgZm9jdXMgc3R5bGVzIHVuc2V0IGJ5IHRoZSBwcmV2aW91cyBydWxlLlxuICovXG5idXR0b246LW1vei1mb2N1c3JpbmcsXG5bdHlwZT0nYnV0dG9uJ106LW1vei1mb2N1c3JpbmcsXG5bdHlwZT0ncmVzZXQnXTotbW96LWZvY3VzcmluZyxcblt0eXBlPSdzdWJtaXQnXTotbW96LWZvY3VzcmluZyB7XG4gIG91dGxpbmU6IDFweCBkb3R0ZWQgQnV0dG9uVGV4dDtcbn1cbi8qKlxuICogQ29ycmVjdCB0aGUgcGFkZGluZyBpbiBGaXJlZm94LlxuICovXG5maWVsZHNldCB7XG4gIHBhZGRpbmc6IDAuMzVlbSAwLjc1ZW0gMC42MjVlbTtcbn1cbi8qKlxuICogMS4gQ29ycmVjdCB0aGUgdGV4dCB3cmFwcGluZyBpbiBFZGdlIGFuZCBJRS5cbiAqIDIuIENvcnJlY3QgdGhlIGNvbG9yIGluaGVyaXRhbmNlIGZyb20gYGZpZWxkc2V0YCBlbGVtZW50cyBpbiBJRS5cbiAqIDMuIFJlbW92ZSB0aGUgcGFkZGluZyBzbyBkZXZlbG9wZXJzIGFyZSBub3QgY2F1Z2h0IG91dCB3aGVuIHRoZXkgemVybyBvdXRcbiAqICAgIGBmaWVsZHNldGAgZWxlbWVudHMgaW4gYWxsIGJyb3dzZXJzLlxuICovXG5sZWdlbmQge1xuICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAvKiAxICovXG4gIGNvbG9yOiBpbmhlcml0O1xuICAvKiAyICovXG4gIGRpc3BsYXk6IHRhYmxlO1xuICAvKiAxICovXG4gIG1heC13aWR0aDogMTAwJTtcbiAgLyogMSAqL1xuICBwYWRkaW5nOiAwO1xuICAvKiAzICovXG4gIHdoaXRlLXNwYWNlOiBub3JtYWw7XG4gIC8qIDEgKi9cbn1cbi8qKlxuICogQWRkIHRoZSBjb3JyZWN0IHZlcnRpY2FsIGFsaWdubWVudCBpbiBDaHJvbWUsIEZpcmVmb3gsIGFuZCBPcGVyYS5cbiAqL1xucHJvZ3Jlc3Mge1xuICB2ZXJ0aWNhbC1hbGlnbjogYmFzZWxpbmU7XG59XG4vKipcbiAqIFJlbW92ZSB0aGUgZGVmYXVsdCB2ZXJ0aWNhbCBzY3JvbGxiYXIgaW4gSUUgMTArLlxuICovXG50ZXh0YXJlYSB7XG4gIG92ZXJmbG93OiBhdXRvO1xufVxuLyoqXG4gKiAxLiBBZGQgdGhlIGNvcnJlY3QgYm94IHNpemluZyBpbiBJRSAxMC5cbiAqIDIuIFJlbW92ZSB0aGUgcGFkZGluZyBpbiBJRSAxMC5cbiAqL1xuW3R5cGU9J2NoZWNrYm94J10sXG5bdHlwZT0ncmFkaW8nXSB7XG4gIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gIC8qIDEgKi9cbiAgcGFkZGluZzogMDtcbiAgLyogMiAqL1xufVxuLyoqXG4gKiBDb3JyZWN0IHRoZSBjdXJzb3Igc3R5bGUgb2YgaW5jcmVtZW50IGFuZCBkZWNyZW1lbnQgYnV0dG9ucyBpbiBDaHJvbWUuXG4gKi9cblt0eXBlPSdudW1iZXInXTo6LXdlYmtpdC1pbm5lci1zcGluLWJ1dHRvbixcblt0eXBlPSdudW1iZXInXTo6LXdlYmtpdC1vdXRlci1zcGluLWJ1dHRvbiB7XG4gIGhlaWdodDogYXV0bztcbn1cbi8qKlxuICogMS4gQ29ycmVjdCB0aGUgb2RkIGFwcGVhcmFuY2UgaW4gQ2hyb21lIGFuZCBTYWZhcmkuXG4gKiAyLiBDb3JyZWN0IHRoZSBvdXRsaW5lIHN0eWxlIGluIFNhZmFyaS5cbiAqL1xuW3R5cGU9J3NlYXJjaCddIHtcbiAgLXdlYmtpdC1hcHBlYXJhbmNlOiB0ZXh0ZmllbGQ7XG4gIC8qIDEgKi9cbiAgb3V0bGluZS1vZmZzZXQ6IC0ycHg7XG4gIC8qIDIgKi9cbn1cbi8qKlxuICogUmVtb3ZlIHRoZSBpbm5lciBwYWRkaW5nIGluIENocm9tZSBhbmQgU2FmYXJpIG9uIG1hY09TLlxuICovXG5bdHlwZT0nc2VhcmNoJ106Oi13ZWJraXQtc2VhcmNoLWRlY29yYXRpb24ge1xuICAtd2Via2l0LWFwcGVhcmFuY2U6IG5vbmU7XG59XG4vKipcbiAqIDEuIENvcnJlY3QgdGhlIGluYWJpbGl0eSB0byBzdHlsZSBjbGlja2FibGUgdHlwZXMgaW4gaU9TIGFuZCBTYWZhcmkuXG4gKiAyLiBDaGFuZ2UgZm9udCBwcm9wZXJ0aWVzIHRvIGBpbmhlcml0YCBpbiBTYWZhcmkuXG4gKi9cbjo6LXdlYmtpdC1maWxlLXVwbG9hZC1idXR0b24ge1xuICAtd2Via2l0LWFwcGVhcmFuY2U6IGJ1dHRvbjtcbiAgLyogMSAqL1xuICBmb250OiBpbmhlcml0O1xuICAvKiAyICovXG59XG4vKiBJbnRlcmFjdGl2ZVxuICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cbi8qXG4gKiBBZGQgdGhlIGNvcnJlY3QgZGlzcGxheSBpbiBFZGdlLCBJRSAxMCssIGFuZCBGaXJlZm94LlxuICovXG5kZXRhaWxzIHtcbiAgZGlzcGxheTogYmxvY2s7XG59XG4vKlxuICogQWRkIHRoZSBjb3JyZWN0IGRpc3BsYXkgaW4gYWxsIGJyb3dzZXJzLlxuICovXG5zdW1tYXJ5IHtcbiAgZGlzcGxheTogbGlzdC1pdGVtO1xufVxuLyogTWlzY1xuICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cbi8qKlxuICogQWRkIHRoZSBjb3JyZWN0IGRpc3BsYXkgaW4gSUUgMTArLlxuICovXG50ZW1wbGF0ZSB7XG4gIGRpc3BsYXk6IG5vbmU7XG59XG4vKipcbiAqIEFkZCB0aGUgY29ycmVjdCBkaXNwbGF5IGluIElFIDEwLlxuICovXG5baGlkZGVuXSB7XG4gIGRpc3BsYXk6IG5vbmU7XG59XG4vKiA9PT09PSBCYXNlID09PT09ICovXG5odG1sLFxuYm9keSB7XG4gIGhlaWdodDogMTAwJTtcbiAgYmFja2dyb3VuZDogI2ZhZmFmYTtcbiAgY29sb3I6ICMzMzM7XG4gIGZvbnQtc2l6ZTogMTRweDtcbiAgbGluZS1oZWlnaHQ6IDE1MCU7XG4gIGZvbnQtZmFtaWx5OiAnTWljcm9zb2Z0IFlhSGVpIFVJJywgQXJpYWwsIHNhbnMtc2VyaWY7XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG5hOmxpbmssXG5hOnZpc2l0ZWQsXG5hOmhvdmVyIHtcbiAgY29sb3I6ICMwNTg5NDI7XG4gIHRleHQtZGVjb3JhdGlvbjogbm9uZTtcbn1cbmE6aG92ZXIge1xuICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTtcbn1cbmNvZGUge1xuICBmb250LWZhbWlseTogJ1NvdXJjZSBDb2RlIFBybycsIENvbnNvbGFzLCBHZW9yZ2lhLCBNb25hY28sIG1vbm9zcGFjZSwgQXJpYWwsIHNhbnMtc2VyaWY7XG59XG4vKiA9PT09PSBTY3JvbGxiYXIgPT09PT0gKi9cbjo6LXdlYmtpdC1zY3JvbGxiYXIge1xuICB3aWR0aDogN3B4O1xuICBoZWlnaHQ6IDdweDtcbiAgLXdlYmtpdC1ib3JkZXItcmFkaXVzOiA1cHg7XG59XG46Oi13ZWJraXQtc2Nyb2xsYmFyLXRyYWNrLXBpZWNlIHtcbiAgLXdlYmtpdC1ib3JkZXItcmFkaXVzOiA1cHg7XG59XG46Oi13ZWJraXQtc2Nyb2xsYmFyLXRodW1iOnZlcnRpY2FsIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjI1KTtcbiAgLXdlYmtpdC1ib3JkZXItcmFkaXVzOiA1cHg7XG59XG46Oi13ZWJraXQtc2Nyb2xsYmFyLXRodW1iOmhvcml6b250YWwge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuMjUpO1xuICAtd2Via2l0LWJvcmRlci1yYWRpdXM6IDVweDtcbn1cbjo6LXdlYmtpdC1zY3JvbGxiYXI6aG92ZXIge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuMTUpO1xufVxuOjotd2Via2l0LXNjcm9sbGJhci10aHVtYjpob3ZlciB7XG4gIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMCwgMCwgMCwgMC4zNSk7XG59XG4vKiBMYXlvdXQgKi9cbi5kb2NzIHtcbiAgZGlzcGxheTogZmxleDtcbiAgZmxleC1kaXJlY3Rpb246IHJvdztcbiAgZmxleC13cmFwOiBub3dyYXA7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgei1pbmRleDogMTtcbiAgaGVpZ2h0OiAxMDAlO1xuICB3aWR0aDogMTAwJTtcbiAgbWFyZ2luOiAwO1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLyogQXNpZGUgKi9cbi5hc2lkZSB7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGZsZXgtc2hyaW5rOiAwO1xuICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICBmbGV4LXdyYXA6IG5vd3JhcDtcbiAgd2lkdGg6IDI2MHB4O1xuICBtYXJnaW46IDA7XG4gIGhlaWdodDogMTAwJTtcbiAgYmFja2dyb3VuZC1jb2xvcjogIzMzMztcbiAgY29sb3I6ICNkZGQ7XG4gIGJveC1zaGFkb3c6IDAgMCA1cHggMnB4ICNkZGQ7XG4gIHRyYW5zaXRpb24tZHVyYXRpb246IDAuM3M7XG4gIG92ZXJmbG93OiBhdXRvO1xufVxuLyogTWFpbiAqL1xuLm1haW4ge1xuICBmbGV4OiAxO1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIHotaW5kZXg6IDE7XG4gIGhlaWdodDogMTAwJTtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjtcbiAgb3ZlcmZsb3c6IGF1dG87XG59XG5AbWVkaWEgKG1heC13aWR0aDogNTAwcHgpIHtcbiAgLmRvY3Mge1xuICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gIH1cbiAgLmFzaWRlLFxuICAubWFpbiB7XG4gICAgd2lkdGg6IDEwMCU7XG4gIH1cbiAgLmFzaWRlIHtcbiAgICBwb3NpdGlvbjogZml4ZWQ7XG4gICAgei1pbmRleDogMztcbiAgICB0b3A6IDA7XG4gIH1cbiAgLmFzaWRlLm91dGxpbmUtbmF2aWdhdG9yX2ZvbGRlZCB7XG4gICAgbGVmdDogLTEwMCU7XG4gIH1cbiAgLmFzaWRlLm91dGxpbmUtbmF2aWdhdG9yX2V4cGFuZGVkIHtcbiAgICBsZWZ0OiAwO1xuICB9XG59XG4uYXNpZGUge1xuICBmb250LWZhbWlseTogJ1NvdXJjZSBDb2RlIFBybycsIENvbnNvbGFzLCBHZW9yZ2lhLCBNb25hY28sIG1vbm9zcGFjZSwgQXJpYWwsIHNhbnMtc2VyaWY7XG59XG4uYXNpZGVfX2hlYWRlciB7XG4gIG1hcmdpbjogMCBhdXRvO1xuICBmbGV4LXNocmluazogMDtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi5hc2lkZV9fbmF2IHtcbiAgZmxleDogMTtcbiAgb3ZlcmZsb3c6IGF1dG87XG59XG4uYXNpZGVfX2gyIHtcbiAgbWFyZ2luOiAwIGF1dG87XG4gIGhlaWdodDogNTRweDtcbiAgbGluZS1oZWlnaHQ6IDU0cHg7XG4gIGZvbnQtc2l6ZTogMjBweDtcbiAgZm9udC13ZWlnaHQ6IG5vcm1hbDtcbiAgZm9udC1mYW1pbHk6IEdlb3JnaWEsIENvbnNvbGFzLCBBcmlhbCwgc2Fucy1zZXJpZjtcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLmFzaWRlX19oMyB7XG4gIG1hcmdpbjogMCBhdXRvO1xuICBwYWRkaW5nOiAwIDIwcHg7XG4gIGZvbnQtc2l6ZTogMTZweDtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi5hc2lkZV9fbGlzdCB7XG4gIG1hcmdpbjogMDtcbiAgcGFkZGluZzogMTBweCAwO1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLmFzaWRlX19pdGVtIHtcbiAgaGVpZ2h0OiAzMnB4O1xuICBsaW5lLWhlaWdodDogMzJweDtcbiAgcGFkZGluZzogMCAzMHB4O1xuICBjdXJzb3I6IHBvaW50ZXI7XG4gIGZvbnQtc2l6ZTogMTNweDtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi5hc2lkZS1uYXZpZ2F0b3Ige1xuICBmbGV4OiAxO1xufVxuLmFzaWRlLW5hdmlnYXRvciAub3V0bGluZS1uYXZpZ2F0b3JfX21haW46Oi13ZWJraXQtc2Nyb2xsYmFyLXRodW1iIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogIzY2Njtcbn1cbi5hc2lkZS1uYXZpZ2F0b3IgLm91dGxpbmUtbmF2aWdhdG9yX19tYWluOjotd2Via2l0LXNjcm9sbGJhci10aHVtYjpob3ZlciB7XG4gIGJhY2tncm91bmQtY29sb3I6ICM5OTk7XG59XG4uYXNpZGUtbmF2aWdhdG9yIC5vdXRsaW5lLW5hdmlnYXRvcl9fcGxhY2Vob2xkZXIge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjNTU1O1xuICBib3JkZXItbGVmdDogM3B4IHNvbGlkICNmZmY7XG59XG4uYXNpZGUtbmF2aWdhdG9yIC5vdXRsaW5lLW5hdmlnYXRvcl9fYW5jaG9yOmxpbmsge1xuICBjb2xvcjogI2RkZDtcbiAgdGV4dC1kZWNvcmF0aW9uOiBub25lO1xufVxuLmFzaWRlLW5hdmlnYXRvciAub3V0bGluZS1uYXZpZ2F0b3JfX2FuY2hvcjp2aXNpdGVkIHtcbiAgY29sb3I6ICNkZGQ7XG4gIHRleHQtZGVjb3JhdGlvbjogbm9uZTtcbn1cbi5hc2lkZS1uYXZpZ2F0b3IgLm91dGxpbmUtbmF2aWdhdG9yX19hbmNob3I6aG92ZXIge1xuICBjb2xvcjogI2RkZDtcbiAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7XG59XG4uYXNpZGUtbmF2aWdhdG9yIC5vdXRsaW5lLW5hdmlnYXRvcl9hY3RpdmUub3V0bGluZS1uYXZpZ2F0b3JfX2FuY2hvcjpsaW5rLFxuLmFzaWRlLW5hdmlnYXRvciAub3V0bGluZS1uYXZpZ2F0b3JfYWN0aXZlLm91dGxpbmUtbmF2aWdhdG9yX19hbmNob3I6dmlzaXRlZCxcbi5hc2lkZS1uYXZpZ2F0b3IgLm91dGxpbmUtbmF2aWdhdG9yX2FjdGl2ZS5vdXRsaW5lLW5hdmlnYXRvcl9fYW5jaG9yOmhvdmVyIHtcbiAgY29sb3I6ICNmZmY7XG59XG4ubWFpbl9faGVhZGVyLFxuLm1haW5fX2Zvb3RlciB7XG4gIG1hcmdpbjogMCBhdXRvO1xuICBwYWRkaW5nOiAxZW07XG4gIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi5tYWluX19oMSB7XG4gIG1hcmdpbjogMCBhdXRvO1xuICBwYWRkaW5nLXRvcDogMWVtO1xuICBmb250LXNpemU6IDVlbTtcbiAgZm9udC13ZWlnaHQ6IG5vcm1hbDtcbiAgbGluZS1oZWlnaHQ6IDJlbTtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi5tYWluX19uYW1lIHtcbiAgY29sb3I6ICM1MDdhZmU7XG4gIGZvbnQtd2VpZ2h0OiBub3JtYWw7XG59XG4ubWFpbl9fdGFnbGluZSB7XG4gIG1hcmdpbjogMWVtIGF1dG87XG4gIG1heC13aWR0aDogOTYwcHg7XG4gIGxpbmUtaGVpZ2h0OiAxLjNlbTtcbiAgZm9udC1zaXplOiAyZW07XG4gIGNvbG9yOiAjOTk5O1xuICBmb250LXdlaWdodDogMTAwO1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLm1haW5fX2NkbiB7XG4gIG1hcmdpbjogMmVtIDA7XG4gIHBhZGRpbmc6IDJlbTtcbiAgZm9udC1zaXplOiAxNnB4O1xuICBsaW5lLWhlaWdodDogMTUwJTtcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmFmYWZhO1xuICBib3JkZXItdG9wOiAxcHggc29saWQgI2RkZDtcbiAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNkZGQ7XG4gIGNvbG9yOiAjNjY2O1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLm1haW5fX2Rvd25sb2FkIHtcbiAgbWFyZ2luOiAxZW0gYXV0bztcbiAgd2lkdGg6IDIwMHB4O1xuICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4ubWFpbl9fYnV0dG9uIHtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICBib3JkZXItcmFkaXVzOiA0cHg7XG4gIHBhZGRpbmc6IDE0cHggMjlweDtcbiAgZm9udC1zaXplOiAxOHB4O1xuICBmb250LWZhbWlseTogJ1NvdXJjZSBDb2RlIFBybycsIENvbnNvbGFzLCBHZW9yZ2lhLCBNb25hY28sIG1vbm9zcGFjZSwgQXJpYWwsIHNhbnMtc2VyaWY7XG4gIGJhY2tncm91bmQtY29sb3I6ICMwNTg5NDI7XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4ubWFpbl9fYnV0dG9uOmxpbmssXG4ubWFpbl9fYnV0dG9uOnZpc2l0ZWQsXG4ubWFpbl9fYnV0dG9uOmhvdmVyIHtcbiAgY29sb3I6ICNmZmY7XG4gIHRleHQtZGVjb3JhdGlvbjogbm9uZTtcbn1cbi5tYWluX19mb290ZXIge1xuICBtYXJnaW46IDAgM2VtO1xuICBib3JkZXItdG9wOiAxcHggc29saWQgI2RkZDtcbn1cbi5zZWN0aW9uIHtcbiAgbWFyZ2luOiAxZW0gMDtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi5zZWN0aW9uX19oZWFkZXIsXG4uc2VjdGlvbl9fY29udGVudCxcbi5zZWN0aW9uX19mb290ZXIge1xuICBtYXJnaW46IDA7XG4gIHBhZGRpbmc6IDAgM2VtO1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLnNlY3Rpb25fX3RpdGxlIHtcbiAgY29sb3I6ICM2NjY7XG59XG4uc2VjdGlvbl9faDMge1xuICBjb2xvcjogIzUwN2FmZTtcbiAgZm9udC1zaXplOiAxLjM1ZW07XG59XG4uc2VjdGlvbl9faDQge1xuICBmb250LXNpemU6IDEuMWVtO1xuICBjb2xvcjogIzY2Njtcbn1cbi5zZWN0aW9uX19oNSB7XG4gIGZvbnQtc2l6ZTogMWVtO1xuICBjb2xvcjogIzk5OTtcbn1cbi5zZWN0aW9uX19kbCxcbi5zZWN0aW9uX19kdCxcbi5zZWN0aW9uX19kZCB7XG4gIG1hcmdpbjogMDtcbiAgcGFkZGluZzogMDtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi5zZWN0aW9uX19kbCB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgei1pbmRleDogMTtcbn1cbi5zZWN0aW9uX19kdCB7XG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbn1cbi5zZWN0aW9uX19kZCB7XG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgY29sb3I6ICMwNTg5NDI7XG59XG4uc2VjdGlvbl9fcHJlIHtcbiAgbWFyZ2luOiAyZW0gMDtcbiAgcGFkZGluZzogMWVtO1xuICBmb250LXNpemU6IDE0cHg7XG4gIGxpbmUtaGVpZ2h0OiAxNTAlO1xuICB0ZXh0LWFsaWduOiBsZWZ0O1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmFmYWZhO1xuICBib3JkZXI6IDFweCBzb2xpZCAjZGRkO1xuICBib3JkZXItcmFkaXVzOiA0cHg7XG4gIGNvbG9yOiAjNjY2O1xuICBvdmVyZmxvdzogYXV0bztcbn1cbi5zZWN0aW9uX19jb2RlIHtcbiAgZGlzcGxheTogYmxvY2s7XG4gIG1hcmdpbjogMCBhdXRvO1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLnNlY3Rpb25fX2Zvb3RlciB7XG4gIGJvcmRlci10b3A6IDFweCBzb2xpZCAjZGRkO1xuICBtYXJnaW4tdG9wOiAzZW07XG4gIGJhY2tncm91bmQtY29sb3I6ICNmYWZhZmE7XG4gIGNvbG9yOiAjOTk5O1xufVxuLnNlY3Rpb25fX3RhYmxlIHtcbiAgbWFyZ2luOiAxZW0gYXV0bztcbiAgd2lkdGg6IDEwMCU7XG4gIGJvcmRlci10b3A6IDFweCBzb2xpZCAjZGRkO1xufVxuLnNlY3Rpb25fX3RoLFxuLnNlY3Rpb25fX3RkIHtcbiAgcGFkZGluZzogNXB4IDE2cHg7XG4gIGxpbmUtaGVpZ2h0OiAyNnB4O1xuICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI2RkZDtcbn1cbi5zZWN0aW9uX190aCB7XG4gIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ZhZmFmYTtcbn1cbkBtZWRpYSAobWF4LXdpZHRoOiA1MDBweCkge1xuICAuc2VjdGlvbl9faGVhZGVyLFxuICAuc2VjdGlvbl9fY29udGVudCB7XG4gICAgcGFkZGluZzogMCAxZW07XG4gIH1cbn1cbi5jYXNlIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICB6LWluZGV4OiAxO1xuICBkaXNwbGF5OiBncmlkO1xuICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IHJlcGVhdCgyLCAxZnIpO1xuICBnYXA6IDQwcHg7XG4gIHBhZGRpbmc6IDFlbTtcbiAgYm9yZGVyLXRvcDogMXB4IHNvbGlkICNkZGQ7XG4gIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjZGRkO1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLmNhc2U6YWZ0ZXIge1xuICBjb250ZW50OiAnJztcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB6LWluZGV4OiAyO1xuICB0b3A6IDA7XG4gIGxlZnQ6IDUwJTtcbiAgaGVpZ2h0OiAxMDAlO1xuICB3aWR0aDogMDtcbiAgYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjZGRkO1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLmNhc2VfX3ByZSxcbi5jYXNlX190ZXh0YXJlYSB7XG4gIGZvbnQtc2l6ZTogMTNweDtcbiAgbGluZS1oZWlnaHQ6IDE1MCU7XG59XG4uY2FzZV9fcHJlLFxuLmNhc2VfX2NvZGUsXG4uY2FzZV9fdGV4dGFyZWEge1xuICBmb250LWZhbWlseTogJ0NvdXJpZXIgTmV3JywgQ29uc29sYXMsIEdlb3JnaWEsIEFyaWFsLCBzYW5zLXNlcmlmO1xufVxuLmNhc2VfX3ByZSB7XG4gIG1hcmdpbjogMDtcbiAgcGFkZGluZzogMWVtO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmFmYWZhO1xuICBoZWlnaHQ6IDEwMCU7XG4gIGJvcmRlci1yYWRpdXM6IDRweDtcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgb3ZlcmZsb3c6IGF1dG87XG59XG4uY2FzZV9fdG9vbGJhciB7XG4gIG1hcmdpbjogMCBhdXRvO1xuICBoZWlnaHQ6IDM2cHg7XG4gIGxpbmUtaGVpZ2h0OiAzNnB4O1xuICBmb250LXNpemU6IDE0cHg7XG4gIHBhZGRpbmc6IDAgMTZweDtcbiAgdGV4dC1hbGlnbjogcmlnaHQ7XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4uY2FzZV9fYWN0aW9uLFxuLmNhc2VfX3JlbW92ZSB7XG4gIGN1cnNvcjogcG9pbnRlcjtcbiAgY29sb3I6ICMwNTg5NDI7XG4gIHVzZXItc2VsZWN0OiBub25lO1xufVxuLmNhc2VfX2FjdGlvbiB7XG4gIGZvbnQtc2l6ZTogMTNweDtcbiAgcGFkZGluZy1sZWZ0OiAxMHB4O1xufVxuLmNhc2VfX2FjdGlvbjpmaXJzdC1jaGlsZCB7XG4gIHBhZGRpbmctbGVmdDogMDtcbn1cbi5jYXNlX19yZW1vdmUge1xuICBmbG9hdDogcmlnaHQ7XG59XG4uY2FzZV9fY29uc29sZSB7XG4gIG1hcmdpbjogMCBhdXRvO1xuICBoZWlnaHQ6IDE4MHB4O1xuICBib3JkZXI6IDFweCBzb2xpZCAjZGRkO1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLmNhc2VfX3RleHRhcmVhIHtcbiAgbWFyZ2luOiAwIGF1dG87XG4gIHdpZHRoOiAxMDAlO1xuICBoZWlnaHQ6IDEwMCU7XG4gIGJvcmRlcjogbm9uZTtcbiAgb3V0bGluZTogbm9uZTtcbiAgcGFkZGluZzogMWVtO1xuICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICBvdmVyZmxvdzogYXV0bztcbn1cbi5jYXNlX19saXN0LFxuLmNhc2VfX2l0ZW0ge1xuICBtYXJnaW46IDA7XG4gIHBhZGRpbmc6IDA7XG4gIGxpc3Qtc3R5bGUtdHlwZTogbm9uZTtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi5jYXNlX19saXN0IHtcbiAgaGVpZ2h0OiAzNjBweDtcbiAgYm9yZGVyLXRvcDogMXB4IHNvbGlkICNkZGQ7XG4gIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjZGRkO1xuICBmb250LXNpemU6IDEzcHg7XG4gIG92ZXJmbG93OiBhdXRvO1xufVxuLmNhc2VfX2l0ZW0ge1xuICBoZWlnaHQ6IDM2cHg7XG4gIGxpbmUtaGVpZ2h0OiAzNnB4O1xuICBjdXJzb3I6IHBvaW50ZXI7XG4gIHBhZGRpbmc6IDAgMTZweDtcbn1cbi5jYXNlX19pdGVtOmhvdmVyIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2Y3ZjhmOTtcbn1cbjpyb290IHtcbiAgLS1vdXRsaW5lLXpJbmRleDogMjAwMDtcbiAgLS1vdXRsaW5lLXN0aWNreS1oZWlnaHQ6IDEwMCU7XG4gIC0tb3V0bGluZS1uYXZpZ2F0b3Itd2lkdGg6IDEwMCU7XG59XG4vKiA9PT09PT09PT09IGNvbG9ycy50aGVtZSAtIOWfuuehgOminOiJsuWPmOmHj+mbhuWQiCA9PT09PT09PT09ICovXG4vKipcbiAqIGVsbGlwc2lzLmxlc3MgLSDmlofmnKznnIHnlaUgbWl4aW54IOWHveaVsFxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogQ3JlYXRlZCBCeTogWWFvaGFpeGlhb1xuICogVXBkYXRlOiAyMDIyLjMuMTFcbiAqL1xuLyogPT09PT09IOaWh+acrOecgeeVpeWHveaVsCA9PT09PT0gKi9cbi8qKlxuICogc2hhZG93Lmxlc3MgLSDpmLTlvbHmoLflvI/orr7nva4gbWl4aW54IOWHveaVsFxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogQ3JlYXRlZCBCeTogWWFvaGFpeGlhb1xuICogVXBkYXRlOiAyMDIyLjMuMjBcbiAqL1xuLyogPT09PT09IOmYtOW9seagt+W8j+iuvue9ruWHveaVsCA9PT09PT0gKi9cbi8qID09PT09PT09PT0gaWNvbi50aGVtZSAtIHN2ZyDlm77moIfnmoTmoLflvI8gPT09PT09PT09PSAqL1xuLm91dGxpbmUtaWNvbiB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgei1pbmRleDogMTtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO1xuICB3aWR0aDogMWVtO1xuICBoZWlnaHQ6IDFlbTtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi5vdXRsaW5lLWljb25fX3N2ZyB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgei1pbmRleDogMjtcbiAgdG9wOiA1MCU7XG4gIGxlZnQ6IDUwJTtcbiAgd2lkdGg6IDFlbTtcbiAgaGVpZ2h0OiAxZW07XG4gIGZpbGw6IGN1cnJlbnRjb2xvcjtcbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgLTUwJSk7XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4ub3V0bGluZS1pY29uX2hpZGRlbiB7XG4gIGRpc3BsYXk6IG5vbmU7XG59XG4ub3V0bGluZS1oZWFkaW5nIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICB6LWluZGV4OiAxO1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLm91dGxpbmUtaGVhZGluZ19fYW5jaG9yIHtcbiAgZGlzcGxheTogbm9uZTtcbn1cbi5vdXRsaW5lLWhlYWRpbmdfX2FuY2hvcjpsaW5rLFxuLm91dGxpbmUtaGVhZGluZ19fYW5jaG9yOnZpc2l0ZWQsXG4ub3V0bGluZS1oZWFkaW5nX19hbmNob3I6aG92ZXIge1xuICBjb2xvcjogIzk5OTtcbiAgdGV4dC1kZWNvcmF0aW9uOiBub25lO1xufVxuLm91dGxpbmUtaGVhZGluZ19fYW5jaG9yOmhvdmVyIHtcbiAgY29sb3I6ICM1MDdhZmU7XG59XG4ub3V0bGluZS1oZWFkaW5nOmhvdmVyIC5vdXRsaW5lLWhlYWRpbmdfX2FuY2hvciB7XG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbn1cbi5vdXRsaW5lLWhlYWRpbmdfc3RhcnQ6aG92ZXIge1xuICBvdmVyZmxvdzogdmlzaWJsZTtcbn1cbi5vdXRsaW5lLWhlYWRpbmdfc3RhcnQgLm91dGxpbmUtaGVhZGluZ19fYW5jaG9yIHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB6LWluZGV4OiAyO1xuICB0b3A6IDUwJTtcbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC01MCUpO1xuICBsZWZ0OiAtMWVtO1xufVxuLm91dGxpbmUtZHJhd2VyIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICB6LWluZGV4OiAtMTtcbiAgdG9wOiAwO1xuICBsZWZ0OiAwO1xuICBtYXJnaW46IDA7XG4gIHdpZHRoOiAxMDAlO1xuICBoZWlnaHQ6IDEwMCU7XG4gIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gIHZpc2liaWxpdHk6IGhpZGRlbjtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi5vdXRsaW5lLWRyYXdlcl9fbW9kYWwge1xuICBib3gtc2hhZG93OiAwIDAgNnB4IDFweCAjZGNkZmU2O1xuICBkaXNwbGF5OiBmbGV4O1xuICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICBmbGV4LXdyYXA6IG5vd3JhcDtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB6LWluZGV4OiAyMTtcbiAgaGVpZ2h0OiAxMDAlO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmO1xuICB0cmFuc2l0aW9uLWR1cmF0aW9uOiAwLjRzO1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLm91dGxpbmUtZHJhd2VyX19oZWFkZXIsXG4ub3V0bGluZS1kcmF3ZXJfX21haW4sXG4ub3V0bGluZS1kcmF3ZXJfX2Zvb3RlciB7XG4gIHdpZHRoOiAxMDAlO1xuICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xufVxuLm91dGxpbmUtZHJhd2VyX19oZWFkZXIsXG4ub3V0bGluZS1kcmF3ZXJfX2Zvb3RlciB7XG4gIGZsZXgtc2hyaW5rOiAwO1xufVxuLm91dGxpbmUtZHJhd2VyX190aXRsZSxcbi5vdXRsaW5lLWRyYXdlcl9fbWFpbixcbi5vdXRsaW5lLWRyYXdlcl9fZm9vdGVyIHtcbiAgcGFkZGluZzogMCAxNnB4O1xufVxuLm91dGxpbmUtZHJhd2VyX19oZWFkZXIsXG4ub3V0bGluZS1kcmF3ZXJfX3RpdGxlIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICB6LWluZGV4OiAxO1xuICBtYXJnaW46IDAgYXV0bztcbiAgaGVpZ2h0OiA1MnB4O1xuICBsaW5lLWhlaWdodDogNTJweDtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi5vdXRsaW5lLWRyYXdlcl9fdGl0bGUge1xuICBmb250LXNpemU6IDE2cHg7XG4gIGZvbnQtd2VpZ2h0OiA0MDA7XG4gIG1hcmdpbjogMCAxNnB4O1xuICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI2RjZGZlNjtcbn1cbi5vdXRsaW5lLWRyYXdlcl9fY2xvc2Uge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHotaW5kZXg6IDI7XG4gIHRvcDogNTAlO1xuICByaWdodDogMTJweDtcbiAgd2lkdGg6IDIwcHg7XG4gIGhlaWdodDogMjBweDtcbiAgbGluZS1oZWlnaHQ6IDIwcHg7XG4gIGNvbG9yOiAjOTk5O1xuICBmb250LXNpemU6IDIwcHg7XG4gIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgY3Vyc29yOiBwb2ludGVyO1xuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTUwJSk7XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4ub3V0bGluZS1kcmF3ZXJfX2Nsb3NlIC5vdXRsaW5lLWljb24ge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHotaW5kZXg6IDI7XG4gIHRvcDogMDtcbiAgbGVmdDogMDtcbn1cbi5vdXRsaW5lLWRyYXdlcl9fY2xvc2U6aG92ZXIge1xuICBjb2xvcjogIzY2Njtcbn1cbi5vdXRsaW5lLWRyYXdlcl9fbWFpbiB7XG4gIGZsZXg6IDE7XG4gIG92ZXJmbG93OiBhdXRvO1xufVxuLm91dGxpbmUtZHJhd2VyX19tYWluLm92ZXJmbG93LWhpZGRlbiB7XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4ub3V0bGluZS1kcmF3ZXJfX2Zvb3RlciB7XG4gIG1hcmdpbjogMCBhdXRvO1xuICB0ZXh0LWFsaWduOiByaWdodDtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi5vdXRsaW5lLWRyYXdlcl9fb3ZlcmxheSB7XG4gIGNvbnRlbnQ6ICcnO1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIHotaW5kZXg6IDE7XG4gIHRvcDogMDtcbiAgbGVmdDogMDtcbiAgd2lkdGg6IDEwMCU7XG4gIGhlaWdodDogMTAwJTtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjtcbiAgb3BhY2l0eTogMC4xO1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLm91dGxpbmUtZHJhd2VyX3J0bC5vdXRsaW5lLWRyYXdlcl90aW55LFxuLm91dGxpbmUtZHJhd2VyX2x0ci5vdXRsaW5lLWRyYXdlcl90aW55IHtcbiAgd2lkdGg6IDI4MHB4O1xufVxuLm91dGxpbmUtZHJhd2VyX3J0bC5vdXRsaW5lLWRyYXdlcl9taW5pLFxuLm91dGxpbmUtZHJhd2VyX2x0ci5vdXRsaW5lLWRyYXdlcl9taW5pIHtcbiAgd2lkdGg6IDQ4MHB4O1xufVxuLm91dGxpbmUtZHJhd2VyX3J0bC5vdXRsaW5lLWRyYXdlcl9zbWFsbCxcbi5vdXRsaW5lLWRyYXdlcl9sdHIub3V0bGluZS1kcmF3ZXJfc21hbGwge1xuICB3aWR0aDogNTQwcHg7XG59XG4ub3V0bGluZS1kcmF3ZXJfcnRsLm91dGxpbmUtZHJhd2VyX3JlZ3VsYXIsXG4ub3V0bGluZS1kcmF3ZXJfbHRyLm91dGxpbmUtZHJhd2VyX3JlZ3VsYXIge1xuICB3aWR0aDogNjgwcHg7XG59XG4ub3V0bGluZS1kcmF3ZXJfcnRsLm91dGxpbmUtZHJhd2VyX21lZGl1bSxcbi5vdXRsaW5lLWRyYXdlcl9sdHIub3V0bGluZS1kcmF3ZXJfbWVkaXVtIHtcbiAgd2lkdGg6IDcyMHB4O1xufVxuLm91dGxpbmUtZHJhd2VyX3J0bC5vdXRsaW5lLWRyYXdlcl9sYXJnZSxcbi5vdXRsaW5lLWRyYXdlcl9sdHIub3V0bGluZS1kcmF3ZXJfbGFyZ2Uge1xuICB3aWR0aDogOTYwcHg7XG59XG4ub3V0bGluZS1kcmF3ZXJfcnRsIHtcbiAgYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjZGNkZmU2O1xufVxuLm91dGxpbmUtZHJhd2VyX3J0bC5vdXRsaW5lLWRyYXdlcl90aW55Lm91dGxpbmUtZHJhd2VyX2Nsb3NlZCB7XG4gIHJpZ2h0OiAtMjkwcHg7XG59XG4ub3V0bGluZS1kcmF3ZXJfcnRsLm91dGxpbmUtZHJhd2VyX21pbmkub3V0bGluZS1kcmF3ZXJfY2xvc2VkIHtcbiAgcmlnaHQ6IC00OTBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl9ydGwub3V0bGluZS1kcmF3ZXJfc21hbGwub3V0bGluZS1kcmF3ZXJfY2xvc2VkIHtcbiAgcmlnaHQ6IC01NTBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl9ydGwub3V0bGluZS1kcmF3ZXJfcmVndWxhci5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xuICByaWdodDogLTY5MHB4O1xufVxuLm91dGxpbmUtZHJhd2VyX3J0bC5vdXRsaW5lLWRyYXdlcl9tZWRpdW0ub3V0bGluZS1kcmF3ZXJfY2xvc2VkIHtcbiAgcmlnaHQ6IC03MzBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl9ydGwub3V0bGluZS1kcmF3ZXJfbGFyZ2Uub3V0bGluZS1kcmF3ZXJfY2xvc2VkIHtcbiAgcmlnaHQ6IC05NzBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl9sdHIge1xuICBib3JkZXItcmlnaHQ6IDFweCBzb2xpZCAjZGNkZmU2O1xufVxuLm91dGxpbmUtZHJhd2VyX2x0ci5vdXRsaW5lLWRyYXdlcl90aW55Lm91dGxpbmUtZHJhd2VyX2Nsb3NlZCB7XG4gIGxlZnQ6IC0yOTBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl9sdHIub3V0bGluZS1kcmF3ZXJfbWluaS5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xuICBsZWZ0OiAtNDkwcHg7XG59XG4ub3V0bGluZS1kcmF3ZXJfbHRyLm91dGxpbmUtZHJhd2VyX3NtYWxsLm91dGxpbmUtZHJhd2VyX2Nsb3NlZCB7XG4gIGxlZnQ6IC01NTBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl9sdHIub3V0bGluZS1kcmF3ZXJfcmVndWxhci5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xuICBsZWZ0OiAtNjkwcHg7XG59XG4ub3V0bGluZS1kcmF3ZXJfbHRyLm91dGxpbmUtZHJhd2VyX21lZGl1bS5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xuICBsZWZ0OiAtNzMwcHg7XG59XG4ub3V0bGluZS1kcmF3ZXJfbHRyLm91dGxpbmUtZHJhd2VyX2xhcmdlLm91dGxpbmUtZHJhd2VyX2Nsb3NlZCB7XG4gIGxlZnQ6IC05NzBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl90dGIsXG4ub3V0bGluZS1kcmF3ZXJfYnR0IHtcbiAgbGVmdDogMDtcbiAgd2lkdGg6IDEwMCU7XG59XG4ub3V0bGluZS1kcmF3ZXJfdHRiLm91dGxpbmUtZHJhd2VyX3RpbnksXG4ub3V0bGluZS1kcmF3ZXJfYnR0Lm91dGxpbmUtZHJhd2VyX3Rpbnkge1xuICBoZWlnaHQ6IDI0MHB4O1xufVxuLm91dGxpbmUtZHJhd2VyX3R0Yi5vdXRsaW5lLWRyYXdlcl9taW5pLFxuLm91dGxpbmUtZHJhd2VyX2J0dC5vdXRsaW5lLWRyYXdlcl9taW5pIHtcbiAgaGVpZ2h0OiAzMjBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl90dGIub3V0bGluZS1kcmF3ZXJfc21hbGwsXG4ub3V0bGluZS1kcmF3ZXJfYnR0Lm91dGxpbmUtZHJhd2VyX3NtYWxsIHtcbiAgaGVpZ2h0OiAzNjBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl90dGIub3V0bGluZS1kcmF3ZXJfcmVndWxhcixcbi5vdXRsaW5lLWRyYXdlcl9idHQub3V0bGluZS1kcmF3ZXJfcmVndWxhciB7XG4gIGhlaWdodDogNDAwcHg7XG59XG4ub3V0bGluZS1kcmF3ZXJfdHRiLm91dGxpbmUtZHJhd2VyX21lZGl1bSxcbi5vdXRsaW5lLWRyYXdlcl9idHQub3V0bGluZS1kcmF3ZXJfbWVkaXVtIHtcbiAgaGVpZ2h0OiA0NDBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl90dGIub3V0bGluZS1kcmF3ZXJfbGFyZ2UsXG4ub3V0bGluZS1kcmF3ZXJfYnR0Lm91dGxpbmUtZHJhd2VyX2xhcmdlIHtcbiAgaGVpZ2h0OiA0ODBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl90dGIge1xuICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI2RjZGZlNjtcbn1cbi5vdXRsaW5lLWRyYXdlcl90dGIub3V0bGluZS1kcmF3ZXJfdGlueS5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xuICB0b3A6IC0yNTBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl90dGIub3V0bGluZS1kcmF3ZXJfbWluaS5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xuICB0b3A6IC0zMzBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl90dGIub3V0bGluZS1kcmF3ZXJfc21hbGwub3V0bGluZS1kcmF3ZXJfY2xvc2VkIHtcbiAgdG9wOiAtMzcwcHg7XG59XG4ub3V0bGluZS1kcmF3ZXJfdHRiLm91dGxpbmUtZHJhd2VyX3JlZ3VsYXIub3V0bGluZS1kcmF3ZXJfY2xvc2VkIHtcbiAgdG9wOiAtNDEwcHg7XG59XG4ub3V0bGluZS1kcmF3ZXJfdHRiLm91dGxpbmUtZHJhd2VyX21lZGl1bS5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xuICB0b3A6IC00NTBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl90dGIub3V0bGluZS1kcmF3ZXJfbGFyZ2Uub3V0bGluZS1kcmF3ZXJfY2xvc2VkIHtcbiAgdG9wOiAtNDkwcHg7XG59XG4ub3V0bGluZS1kcmF3ZXJfYnR0IHtcbiAgdG9wOiBpbml0aWFsO1xuICBib3JkZXItdG9wOiAxcHggc29saWQgI2RjZGZlNjtcbn1cbi5vdXRsaW5lLWRyYXdlcl9idHQub3V0bGluZS1kcmF3ZXJfdGlueS5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xuICBib3R0b206IC0yNTBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl9idHQub3V0bGluZS1kcmF3ZXJfbWluaS5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xuICBib3R0b206IC0zMzBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl9idHQub3V0bGluZS1kcmF3ZXJfc21hbGwub3V0bGluZS1kcmF3ZXJfY2xvc2VkIHtcbiAgYm90dG9tOiAtMzcwcHg7XG59XG4ub3V0bGluZS1kcmF3ZXJfYnR0Lm91dGxpbmUtZHJhd2VyX3JlZ3VsYXIub3V0bGluZS1kcmF3ZXJfY2xvc2VkIHtcbiAgYm90dG9tOiAtNDEwcHg7XG59XG4ub3V0bGluZS1kcmF3ZXJfYnR0Lm91dGxpbmUtZHJhd2VyX21lZGl1bS5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xuICBib3R0b206IC00NTBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl9idHQub3V0bGluZS1kcmF3ZXJfbGFyZ2Uub3V0bGluZS1kcmF3ZXJfY2xvc2VkIHtcbiAgYm90dG9tOiAtNDkwcHg7XG59XG4ub3V0bGluZS1kcmF3ZXJfb3BlbmVkIHtcbiAgdmlzaWJpbGl0eTogdmlzaWJsZTtcbiAgei1pbmRleDogdmFyKC0tb3V0bGluZS16SW5kZXgpO1xufVxuLm91dGxpbmUtZHJhd2VyX29wZW5lZC5vdXRsaW5lLWRyYXdlciB7XG4gIHBvc2l0aW9uOiBmaXhlZDtcbn1cbi5vdXRsaW5lLWRyYXdlcl9vcGVuZWQub3V0bGluZS1kcmF3ZXJfcnRsIHtcbiAgcmlnaHQ6IDA7XG59XG4ub3V0bGluZS1kcmF3ZXJfb3BlbmVkLm91dGxpbmUtZHJhd2VyX2x0ciB7XG4gIGxlZnQ6IDA7XG59XG4ub3V0bGluZS1kcmF3ZXJfb3BlbmVkLm91dGxpbmUtZHJhd2VyX3R0YiB7XG4gIHRvcDogMDtcbn1cbi5vdXRsaW5lLWRyYXdlcl9vcGVuZWQub3V0bGluZS1kcmF3ZXJfYnR0IHtcbiAgYm90dG9tOiAwO1xufVxuLm91dGxpbmUtZHJhd2VyX29mZnNldC5vdXRsaW5lLWRyYXdlcl9ydGwsXG4ub3V0bGluZS1kcmF3ZXJfb2Zmc2V0Lm91dGxpbmUtZHJhd2VyX2x0ciB7XG4gIGhlaWdodDogY2FsYygxMDAlIC0gNGVtKTtcbiAgdG9wOiA1MCU7XG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtNTAlKTtcbn1cbi5vdXRsaW5lLWRyYXdlcl9vZmZzZXQub3V0bGluZS1kcmF3ZXJfdHRiLFxuLm91dGxpbmUtZHJhd2VyX29mZnNldC5vdXRsaW5lLWRyYXdlcl9idHQge1xuICB3aWR0aDogY2FsYygxMDAlIC0gNGVtKTtcbiAgbGVmdDogNTAlO1xuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTUwJSk7XG59XG4ub3V0bGluZS1kcmF3ZXJfb2Zmc2V0Lm91dGxpbmUtZHJhd2VyX29wZW5lZC5vdXRsaW5lLWRyYXdlcl9ydGwge1xuICByaWdodDogMmVtO1xufVxuLm91dGxpbmUtZHJhd2VyX29mZnNldC5vdXRsaW5lLWRyYXdlcl9vcGVuZWQub3V0bGluZS1kcmF3ZXJfbHRyIHtcbiAgbGVmdDogMmVtO1xufVxuLm91dGxpbmUtZHJhd2VyX29mZnNldC5vdXRsaW5lLWRyYXdlcl9vcGVuZWQub3V0bGluZS1kcmF3ZXJfdHRiIHtcbiAgdG9wOiAyZW07XG59XG4ub3V0bGluZS1kcmF3ZXJfb2Zmc2V0Lm91dGxpbmUtZHJhd2VyX29wZW5lZC5vdXRsaW5lLWRyYXdlcl9idHQge1xuICBib3R0b206IDJlbTtcbn1cbi5vdXRsaW5lLWRyYXdlcl9hdXRvLm91dGxpbmUtZHJhd2VyX3J0bCxcbi5vdXRsaW5lLWRyYXdlcl9hdXRvLm91dGxpbmUtZHJhd2VyX2x0ciB7XG4gIGhlaWdodDogYXV0bztcbiAgbWF4LWhlaWdodDogY2FsYygxMDAlIC0gNGVtKTtcbn1cbi5vdXRsaW5lLWRyYXdlcl9mdWxsIHtcbiAgcGFkZGluZzogMDtcbn1cbi5vdXRsaW5lLW5hdmlnYXRvciB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgei1pbmRleDogMTtcbiAgbWFyZ2luOiAwO1xuICB3aWR0aDogdmFyKC0tb3V0bGluZS1uYXZpZ2F0b3Itd2lkdGgpO1xuICBvdmVyZmxvdzogYXV0bztcbn1cbi5vdXRsaW5lLW5hdmlnYXRvci1wYXJlbnQge1xuICB0cmFuc2l0aW9uOiAwLjNzIGVhc2UtaW4tb3V0O1xufVxuLm91dGxpbmUtbmF2aWdhdG9yX190aXRsZSB7XG4gIG1hcmdpbjogMCAxNnB4O1xuICBoZWlnaHQ6IDQwcHg7XG4gIGxpbmUtaGVpZ2h0OiA0MHB4O1xuICBwYWRkaW5nOiAwIDE2cHg7XG4gIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjZGNkZmU2O1xuICBmb250LXNpemU6IDE2cHg7XG4gIGZvbnQtd2VpZ2h0OiA0MDA7XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4ub3V0bGluZS1uYXZpZ2F0b3JfX21haW4ge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIHotaW5kZXg6IDE7XG4gIG1hcmdpbjogMDtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi5vdXRsaW5lLW5hdmlnYXRvcl9fbGlzdCxcbi5vdXRsaW5lLW5hdmlnYXRvcl9fc3ViamVjdCxcbi5vdXRsaW5lLW5hdmlnYXRvcl9faXRlbSB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgei1pbmRleDogMjtcbiAgbWFyZ2luOiAwO1xuICBwYWRkaW5nOiAwO1xuICBsaXN0LXN0eWxlLXR5cGU6IG5vbmU7XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4ub3V0bGluZS1uYXZpZ2F0b3JfX2xpc3Qge1xuICBwYWRkaW5nOiAwLjVlbSAwO1xufVxuLm91dGxpbmUtbmF2aWdhdG9yX19zdWJqZWN0IHtcbiAgcGFkZGluZy1sZWZ0OiAxZW07XG59XG4ub3V0bGluZS1uYXZpZ2F0b3JfX2l0ZW0ge1xuICBtYXJnaW46IDA7XG4gIGxpbmUtaGVpZ2h0OiAzMHB4O1xuICBmb250LXNpemU6IDEzcHg7XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4ub3V0bGluZS1uYXZpZ2F0b3JfX3BsYWNlaG9sZGVyIHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB6LWluZGV4OiAxO1xuICB0b3A6IDA7XG4gIGxlZnQ6IDA7XG4gIHdpZHRoOiAxMDAlO1xuICBoZWlnaHQ6IDMwcHg7XG4gIGJhY2tncm91bmQtY29sb3I6ICNmN2Y4Zjk7XG4gIGJvcmRlci1sZWZ0OiAycHggc29saWQgIzA1ODk0MjtcbiAgdHJhbnNpdGlvbi1kdXJhdGlvbjogMC4ycztcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi5vdXRsaW5lLW5hdmlnYXRvcl9fYW5jaG9yIHtcbiAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbiAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7XG4gIG92ZXJmbG93OiBoaWRkZW47XG4gIGRpc3BsYXk6IGJsb2NrO1xuICBwYWRkaW5nOiAwIDEuNWVtO1xufVxuLm91dGxpbmUtbmF2aWdhdG9yX19hbmNob3I6bGluayxcbi5vdXRsaW5lLW5hdmlnYXRvcl9fYW5jaG9yOnZpc2l0ZWQsXG4ub3V0bGluZS1uYXZpZ2F0b3JfX2FuY2hvcjpob3ZlciB7XG4gIHRleHQtZGVjb3JhdGlvbjogbm9uZTtcbiAgY29sb3I6ICM1NTU7XG59XG4ub3V0bGluZS1uYXZpZ2F0b3JfX2FuY2hvcjpob3ZlciB7XG4gIGNvbG9yOiAjMDU4OTQyO1xufVxuLm91dGxpbmUtbmF2aWdhdG9yX19jb2RlIHtcbiAgcGFkZGluZy1yaWdodDogMC41ZW07XG59XG4ub3V0bGluZS1uYXZpZ2F0b3JfaGlnaGxpZ2h0Lm91dGxpbmUtbmF2aWdhdG9yX19hbmNob3I6bGluayxcbi5vdXRsaW5lLW5hdmlnYXRvcl9oaWdobGlnaHQub3V0bGluZS1uYXZpZ2F0b3JfX2FuY2hvcjp2aXNpdGVkLFxuLm91dGxpbmUtbmF2aWdhdG9yX2hpZ2hsaWdodC5vdXRsaW5lLW5hdmlnYXRvcl9fYW5jaG9yOmhvdmVyIHtcbiAgY29sb3I6ICMwNTg5NDI7XG4gIGZvbnQtd2VpZ2h0OiBib2xkO1xufVxuLm91dGxpbmUtbmF2aWdhdG9yX3N0aWNreSxcbi5vdXRsaW5lLW5hdmlnYXRvcl9maXhlZCB7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGZsZXgtd3JhcDogbm93cmFwO1xuICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICB6LWluZGV4OiB2YXIoLS1vdXRsaW5lLXpJbmRleCk7XG4gIHRvcDogMDtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi5vdXRsaW5lLW5hdmlnYXRvcl9zdGlja3kgLm91dGxpbmUtbmF2aWdhdG9yX190aXRsZSxcbi5vdXRsaW5lLW5hdmlnYXRvcl9maXhlZCAub3V0bGluZS1uYXZpZ2F0b3JfX3RpdGxlLFxuLm91dGxpbmUtbmF2aWdhdG9yX3N0aWNreSAub3V0bGluZS1uYXZpZ2F0b3JfX21haW4sXG4ub3V0bGluZS1uYXZpZ2F0b3JfZml4ZWQgLm91dGxpbmUtbmF2aWdhdG9yX19tYWluIHtcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbn1cbi5vdXRsaW5lLW5hdmlnYXRvcl9zdGlja3kgLm91dGxpbmUtbmF2aWdhdG9yX190aXRsZSxcbi5vdXRsaW5lLW5hdmlnYXRvcl9maXhlZCAub3V0bGluZS1uYXZpZ2F0b3JfX3RpdGxlIHtcbiAgZmxleC1zaHJpbms6IDA7XG59XG4ub3V0bGluZS1uYXZpZ2F0b3Jfc3RpY2t5IC5vdXRsaW5lLW5hdmlnYXRvcl9fbWFpbixcbi5vdXRsaW5lLW5hdmlnYXRvcl9maXhlZCAub3V0bGluZS1uYXZpZ2F0b3JfX21haW4ge1xuICBmbGV4OiAxO1xuICBvdmVyZmxvdzogYXV0bztcbn1cbi5vdXRsaW5lLW5hdmlnYXRvcl9zdGlja3kge1xuICBwb3NpdGlvbjogc3RpY2t5O1xuICBtYXgtaGVpZ2h0OiB2YXIoLS1vdXRsaW5lLXN0aWNreS1oZWlnaHQpO1xufVxuLm91dGxpbmUtbmF2aWdhdG9yX2ZpeGVkIHtcbiAgcG9zaXRpb246IGZpeGVkO1xuICBtYXgtaGVpZ2h0OiAxMDAlO1xufVxuLm91dGxpbmUtbmF2aWdhdG9yX2hpZGRlbiB7XG4gIGRpc3BsYXk6IG5vbmU7XG59XG4ub3V0bGluZS1uYXZpZ2F0b3JfZm9sZGVkIHtcbiAgd2lkdGg6IDA7XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4vKipcbiAqIGZvbnQubGVzcyAtIOWtl+S9k+ebuOWFs+agt+W8j1xuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogQ3JlYXRlZCBCeTogWWFvaGFpeGlhb1xuICogVXBkYXRlOiAyMDIyLjMuMTZcbiAqL1xuLyogPT09PT09IOWtl+S9kyA9PT09PT0gKi9cbi8qID09PT09PSDlrZfph40gPT09PT09ICovXG4vKiA9PT09PT0g5a2X5Y+3ID09PT09PSAqL1xuLyoqXG4gKiBtaXhpbnMubGVzcyAtIOW3peWFt+WHveaVsFxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogQ3JlYXRlZCBCeTogWWFvaGFpeGlhb1xuICogVXBkYXRlOiAyMDIyLjMuMTFcbiAqL1xuLyoqXG4gKiByYWRpdXMubGVzcyAtIOWchuinkuiuvue9riBtaXhpbngg5Ye95pWwXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBDcmVhdGVkIEJ5OiBZYW9oYWl4aWFvXG4gKiBVcGRhdGU6IDIwMjQuNC4xNlxuICovXG4vKiA9PT09PT0g5ZyG6KeS5qC35byP6K6+572u5Ye95pWwID09PT09PSAqL1xuLm91dGxpbmUtcmVhZGVyX19wcm9ncmVzcyB7XG4gIHBvc2l0aW9uOiBmaXhlZDtcbiAgdG9wOiAwO1xuICBsZWZ0OiAwO1xuICB6LWluZGV4OiAzO1xuICBoZWlnaHQ6IDRweDtcbiAgd2lkdGg6IDEwMCU7XG4gIGJhY2tncm91bmQtY29sb3I6ICM1MDdhZmU7XG4gIHNjYWxlOiAwIDE7XG4gIHRyYW5zZm9ybS1vcmlnaW46IGxlZnQ7XG4gIGFuaW1hdGlvbjogb3V0bGluZS1yZWFkZXItcHJvZ3Jlc3MgbGluZWFyO1xuICBhbmltYXRpb24tdGltZWxpbmU6IC0tUHJvZ3Jlc3NUaW1lbGluZTtcbn1cbi5vdXRsaW5lLXJlYWRlcl9fcGFwZXIge1xuICBib3gtc2hhZG93OiAwIDAgNnB4IDFweCAjZGRkO1xuICBtYXJnaW46IDJlbSBhdXRvO1xuICBtYXgtd2lkdGg6IDEyMDBweDtcbiAgcGFkZGluZzogMy4yZW07XG4gIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gIGJhY2tncm91bmQtY29sb3I6ICNmZmY7XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4ub3V0bGluZS1yZWFkZXJfX3RpdGxlIHtcbiAgbWFyZ2luOiAwLjY3ZW0gMDtcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xuICBmb250LWZhbWlseTogLWFwcGxlLXN5c3RlbSwgQmxpbmtNYWNTeXN0ZW1Gb250LCAnU2Vnb2UgVUknLCAnUGluZ0ZhbmcgU0MnLCAnSGlyYWdpbm8gU2FucyBHQicsICdNaWNyb3NvZnQgWWFIZWknLCAnSGVsdmV0aWNhIE5ldWUnLCAnQXBwbGUgQ29sb3IgRW1vamknLCAnU2Vnb2UgVUkgRW1vamknLCAnU2Vnb2UgVUkgU3ltYm9sJywgSGVsdmV0aWNhLCBBcmlhbCwgc2Fucy1zZXJpZjtcbiAgZm9udC13ZWlnaHQ6IG5vcm1hbDtcbiAgbGluZS1oZWlnaHQ6IDEuM2VtO1xuICBmb250LXNpemU6IDQuMmVtO1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLm91dGxpbmUtcmVhZGVyX19hcnRpY2xlIC5vdXRsaW5lLXJlYWRlcl9fcHJvZ3Jlc3Mge1xuICBkaXNwbGF5OiBub25lO1xufVxuLm91dGxpbmUtcmVhZGVyX2hpZGRlbiB7XG4gIGRpc3BsYXk6IG5vbmU7XG59XG4ub3V0bGluZS1yZWFkZXJfaGlkZGVuLm91dGxpbmUtcmVhZGVyX3NpYmxpbmcge1xuICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7XG59XG4ub3V0bGluZS1yZWFkZXJfaGlkZGVuLm91dGxpbmUtcmVhZGVyX3NpYmxpbmcud3JhcHBlci5wb3N0IHtcbiAgZGlzcGxheTogbm9uZTtcbn1cbi5vdXRsaW5lLXJlYWRlci0tcmVhZGluZyB7XG4gIGRpc3BsYXk6IGJsb2NrO1xuICBwb3NpdGlvbjogZml4ZWQ7XG4gIHotaW5kZXg6IDI7XG4gIHRvcDogMDtcbiAgbGVmdDogMDtcbiAgd2lkdGg6IDEwMCU7XG4gIGhlaWdodDogMTAwJTtcbiAgbWFyZ2luOiAwO1xuICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICBwYWRkaW5nOiAzZW0gNGVtO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmFmYWZhO1xuICBzY3JvbGwtdGltZWxpbmUtbmFtZTogLS1Qcm9ncmVzc1RpbWVsaW5lO1xuICBvdmVyZmxvdzogc2Nyb2xsO1xufVxuQGtleWZyYW1lcyBvdXRsaW5lLXJlYWRlci1wcm9ncmVzcyB7XG4gIHRvIHtcbiAgICBzY2FsZTogMSAxO1xuICB9XG59XG5AbWVkaWEgKG1heC13aWR0aDogNTAwcHgpIHtcbiAgLm91dGxpbmUtcmVhZGVyIHtcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xuICB9XG4gIC5vdXRsaW5lLXJlYWRlciAub3V0bGluZS10b29sYmFyIHtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7XG4gICAgZmxleC13cmFwOiBub3dyYXA7XG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICBhbGlnbi1zZWxmOiBhdXRvO1xuICAgIHRvcDogMTAwJTtcbiAgICByaWdodDogMDtcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTQ4cHgpO1xuICAgIHdpZHRoOiAxMDAlO1xuICAgIGhlaWdodDogNDhweDtcbiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgIGJvcmRlci10b3A6IDFweCBzb2xpZCAjZGRkO1xuICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmY7XG4gICAgcGFkZGluZzogMCAxNnB4O1xuICB9XG4gIC5vdXRsaW5lLXJlYWRlciAub3V0bGluZS10b29sYmFyX19idXR0b24ge1xuICAgIGJvcmRlci1yYWRpdXM6IDA7XG4gICAgZmxleDogMTtcbiAgICBib3JkZXI6IG5vbmU7XG4gICAgYm94LXNoYWRvdzogbm9uZTtcbiAgfVxuICAub3V0bGluZS1yZWFkZXItLXJlYWRpbmcge1xuICAgIHBhZGRpbmc6IDA7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjtcbiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICB9XG4gIC5vdXRsaW5lLXJlYWRlcl9fcGFwZXIge1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICB6LWluZGV4OiAxO1xuICAgIG1hcmdpbjogMDtcbiAgICBwYWRkaW5nOiAwO1xuICAgIGhlaWdodDogMTAwJTtcbiAgICBib3gtc2hhZG93OiBub25lO1xuICAgIG92ZXJmbG93OiBoaWRkZW47XG4gIH1cbiAgLm91dGxpbmUtcmVhZGVyX190aXRsZSB7XG4gICAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpcztcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgei1pbmRleDogMztcbiAgICB0b3A6IDA7XG4gICAgbGVmdDogMDtcbiAgICBtYXJnaW46IDA7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgaGVpZ2h0OiA0OHB4O1xuICAgIGxpbmUtaGVpZ2h0OiA0OHB4O1xuICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjZGRkO1xuICAgIGZvbnQtc2l6ZTogMS44ZW07XG4gICAgZm9udC13ZWlnaHQ6IDQwMDtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmO1xuICAgIG92ZXJmbG93OiBoaWRkZW47XG4gIH1cbiAgLm91dGxpbmUtcmVhZGVyX19hcnRpY2xlIHtcbiAgICBtYXJnaW46IDQ4cHggMDtcbiAgICBoZWlnaHQ6IGNhbGMoMTAwJSAtIDk2cHgpO1xuICAgIHBhZGRpbmc6IDAgMS4yNWVtO1xuICAgIHNjcm9sbC10aW1lbGluZS1uYW1lOiAtLU1vYmlsZVByb2dyZXNzVGltZWxpbmU7XG4gICAgb3ZlcmZsb3cteDogaGlkZGVuO1xuICAgIG92ZXJmbG93LXk6IHNjcm9sbDtcbiAgfVxuICAub3V0bGluZS1yZWFkZXJfX2FydGljbGUgLm91dGxpbmUtcmVhZGVyX19wcm9ncmVzcyB7XG4gICAgei1pbmRleDogNDtcbiAgICBhbmltYXRpb246IG91dGxpbmUtcmVhZGVyLXByb2dyZXNzIGxpbmVhcjtcbiAgICBhbmltYXRpb24tdGltZWxpbmU6IC0tTW9iaWxlUHJvZ3Jlc3NUaW1lbGluZTtcbiAgICBkaXNwbGF5OiBibG9jaztcbiAgfVxufVxuQG1lZGlhIHByaW50IHtcbiAgaHRtbCxcbiAgYm9keSB7XG4gICAgLyog5omT5Y2w55qE5Z+656GA5a2X5L2T5aSn5bCPICovXG4gICAgZm9udC1zaXplOiAxMnB0O1xuICAgIC8qIOaYvuekuuiuvue9ruaWh+Wtl+minOiJsuWSjOiDjOaZr+minOiJsiAqL1xuICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmY7XG4gICAgY29sb3I6ICMzMzM7XG4gICAgaGVpZ2h0OiBpbml0aWFsICFpbXBvcnRhbnQ7XG4gIH1cbiAgLyog6K6+572u6ZO+5o6l5qC35byPICovXG4gIGE6bGluayxcbiAgYTp2aXNpdGVkLFxuICBhOmhvdmVyIHtcbiAgICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZSAhaW1wb3J0YW50O1xuICAgIGNvbG9yOiAjNTA3YWZlO1xuICB9XG4gIC8qIOmakOiXj+WqkuS9k+agh+etviAqL1xuICB2aWRlbyxcbiAgYXVkaW8ge1xuICAgIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDtcbiAgfVxuICAvKiDnoa7kv53ooajmoLzlnKjmiZPljbDml7bnmoTovrnmoYblkozlr7npvZDmlrnlvI/muIXmmbAgKi9cbiAgdGFibGUge1xuICAgIHdpZHRoOiAxMDAlO1xuICAgIGJvcmRlci1jb2xsYXBzZTogY29sbGFwc2U7XG4gIH1cbiAgdGgsXG4gIHRkIHtcbiAgICBib3JkZXI6IDFweCBzb2xpZCAjZGNkZmU2O1xuICAgIHBhZGRpbmc6IDhweCAyMHB4O1xuICB9XG4gIC5vdXRsaW5lLW1lc3NhZ2UsXG4gIC5vdXRsaW5lLXRvb2xiYXIge1xuICAgIC8qIOmakOiXj+S6huW3peWFt+agj+WSjOS/oeaBr+aPkOekuuahhiAqL1xuICAgIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDtcbiAgfVxuICAub3V0bGluZS1yZWFkZXIge1xuICAgIGRpc3BsYXk6IGJsb2NrICFpbXBvcnRhbnQ7XG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICAvKiDlj5bmtojkuobnu53lr7nlrprkvY0gKi9cbiAgICAvKiDpmpDol4/pmIXor7vov5vluqbmnaEgKi9cbiAgICAvKiDmiZPljbDml7bkuI3mmL7npLrmraPmlocgRE9NIOeahOmYtOW9seaViOaenCAqL1xuICAgIC8qIOaJgOacieaWh+eroOWGheWuuSBET00g55u45YWz55qE6YK75bGF6IqC54K56YO96ZqQ6JeP5LqGICovXG4gIH1cbiAgLm91dGxpbmUtcmVhZGVyX190aXRsZSB7XG4gICAgbWFyZ2luOiAxMy40cHQgMCAyOHB0ICFpbXBvcnRhbnQ7XG4gICAgdGV4dC1hbGlnbjogY2VudGVyICFpbXBvcnRhbnQ7XG4gICAgZm9udC1zaXplOiAzMnB0ICFpbXBvcnRhbnQ7XG4gIH1cbiAgLm91dGxpbmUtcmVhZGVyLS1yZWFkaW5nIHtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmUgIWltcG9ydGFudDtcbiAgICBoZWlnaHQ6IGF1dG8gIWltcG9ydGFudDtcbiAgICBwYWRkaW5nOiAwICFpbXBvcnRhbnQ7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjtcbiAgICBvdmVyZmxvdzogaGlkZGVuICFpbXBvcnRhbnQ7XG4gIH1cbiAgLm91dGxpbmUtcmVhZGVyX19wcm9ncmVzcyB7XG4gICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50O1xuICB9XG4gIC5vdXRsaW5lLXJlYWRlcl9fcGFwZXIge1xuICAgIGJveC1zaGFkb3c6IG5vbmU7XG4gIH1cbiAgLm91dGxpbmUtcmVhZGVyIHByZSB7XG4gICAgcGFkZGluZzogMWVtICFpbXBvcnRhbnQ7XG4gICAgYm9yZGVyOiAxcHggc29saWQgI2RkZCAhaW1wb3J0YW50O1xuICAgIGJvcmRlci1yYWRpdXM6IDRweCAhaW1wb3J0YW50O1xuICB9XG4gIC5vdXRsaW5lLXJlYWRlciBwcmUsXG4gIC5vdXRsaW5lLXJlYWRlciBjb2RlIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmICFpbXBvcnRhbnQ7XG4gIH1cbiAgLm91dGxpbmUtcmVhZGVyIHRhYmxlLFxuICAub3V0bGluZS1yZWFkZXIgaW1nLFxuICAub3V0bGluZS1yZWFkZXIgc3ZnIHtcbiAgICBicmVhay1pbnNpZGU6IGF2b2lkO1xuICB9XG4gIC5vdXRsaW5lLXJlYWRlcl9zaWJsaW5nIHtcbiAgICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7XG4gIH1cbn1cbi8qID09PT09PT09PT0gYnV0dG9ucy50aGVtZSAtIOaMiemSruWvvOiIquagt+W8jyA9PT09PT09PT09ICovXG4ub3V0bGluZS10b29sYmFyIHtcbiAgcG9zaXRpb246IGZpeGVkO1xuICB6LWluZGV4OiA5OTk5OTtcbiAgbWFyZ2luOiAwO1xuICB0cmFuc2l0aW9uLWR1cmF0aW9uOiAwLjNzO1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLm91dGxpbmUtdG9vbGJhcl9fYnV0dG9uIHtcbiAgYm94LXNoYWRvdzogMCAwIDZweCAxcHggI2RjZGZlNjtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICB6LWluZGV4OiAxO1xuICBtYXJnaW46IDEwcHg7XG4gIHdpZHRoOiAzNnB4O1xuICBoZWlnaHQ6IDM2cHg7XG4gIGJvcmRlcjogMXB4IHNvbGlkICNkY2RmZTY7XG4gIGJvcmRlci1yYWRpdXM6IDNweDtcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjtcbiAgY3Vyc29yOiBwb2ludGVyO1xuICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gIGNvbG9yOiAjOTk5O1xuICB0cmFuc2l0aW9uOiBhbGwgMC4zcyAwLjFzIGVhc2UtaW4tb3V0O1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLm91dGxpbmUtdG9vbGJhcl9fYnV0dG9uOmhvdmVyIHtcbiAgY29sb3I6ICMwNTg5NDI7XG4gIGJvcmRlci1jb2xvcjogIzA1ODk0MjtcbiAgdHJhbnNmb3JtOiBzY2FsZSgxLjM1KTtcbn1cbi5vdXRsaW5lLXRvb2xiYXJfX2J1dHRvbi5oaWRlIHtcbiAgZGlzcGxheTogbm9uZTtcbn1cbi5vdXRsaW5lLXRvb2xiYXJfX2FuY2hvcjpsaW5rLFxuLm91dGxpbmUtdG9vbGJhcl9fYW5jaG9yOnZpc2l0ZWQsXG4ub3V0bGluZS10b29sYmFyX19hbmNob3I6aG92ZXIge1xuICBjb2xvcjogIzk5OTtcbiAgdGV4dC1kZWNvcmF0aW9uOiBub25lO1xufVxuLm91dGxpbmUtdG9vbGJhcl9fYW5jaG9yOmhvdmVyIHtcbiAgY29sb3I6ICMwNTg5NDI7XG59XG4ub3V0bGluZS10b29sYmFyX19pY29uIHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB6LWluZGV4OiAyO1xuICB0b3A6IDUwJTtcbiAgbGVmdDogNTAlO1xuICB3aWR0aDogMjBweDtcbiAgaGVpZ2h0OiAyMHB4O1xuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCAtNTAlKTtcbiAgZmlsbDogY3VycmVudGNvbG9yO1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLm91dGxpbmUtdG9vbGJhcl9hY3RpdmUub3V0bGluZS10b29sYmFyX19idXR0b24ge1xuICBjb2xvcjogI2ZmZjtcbiAgYmFja2dyb3VuZC1jb2xvcjogIzA1ODk0MjtcbiAgYm9yZGVyLWNvbG9yOiAjMDU4OTQyO1xufVxuLm91dGxpbmUtdG9vbGJhcl9hY3RpdmUub3V0bGluZS10b29sYmFyX19idXR0b246aG92ZXIge1xuICBjb2xvcjogI2ZmZjtcbn1cbi5vdXRsaW5lLXRvb2xiYXJfYWN0aXZlIC5vdXRsaW5lLXRvb2xiYXJfX2FuY2hvcjpsaW5rLFxuLm91dGxpbmUtdG9vbGJhcl9hY3RpdmUgLm91dGxpbmUtdG9vbGJhcl9fYW5jaG9yOnZpc2l0ZWQsXG4ub3V0bGluZS10b29sYmFyX2FjdGl2ZSAub3V0bGluZS10b29sYmFyX19hbmNob3I6aG92ZXIge1xuICBjb2xvcjogI2ZmZjtcbn1cbi5vdXRsaW5lLXRvb2xiYXJfcm91bmRlZC5vdXRsaW5lLXRvb2xiYXJfX2J1dHRvbiB7XG4gIGJvcmRlci1yYWRpdXM6IDE4cHg7XG59XG4ub3V0bGluZS10b29sYmFyX2Rpc2FibGVkLm91dGxpbmUtdG9vbGJhcl9fYW5jaG9yOmxpbmssXG4ub3V0bGluZS10b29sYmFyX2Rpc2FibGVkIC5vdXRsaW5lLXRvb2xiYXJfX2FuY2hvcjpsaW5rLFxuLm91dGxpbmUtdG9vbGJhcl9kaXNhYmxlZC5vdXRsaW5lLXRvb2xiYXJfX2FuY2hvcjp2aXNpdGVkLFxuLm91dGxpbmUtdG9vbGJhcl9kaXNhYmxlZCAub3V0bGluZS10b29sYmFyX19hbmNob3I6dmlzaXRlZCxcbi5vdXRsaW5lLXRvb2xiYXJfZGlzYWJsZWQub3V0bGluZS10b29sYmFyX19hbmNob3I6aG92ZXIsXG4ub3V0bGluZS10b29sYmFyX2Rpc2FibGVkIC5vdXRsaW5lLXRvb2xiYXJfX2FuY2hvcjpob3Zlcixcbi5vdXRsaW5lLXRvb2xiYXJfZGlzYWJsZWQub3V0bGluZS10b29sYmFyX19idXR0b24sXG4ub3V0bGluZS10b29sYmFyX2Rpc2FibGVkIC5vdXRsaW5lLXRvb2xiYXJfX2J1dHRvbiB7XG4gIGN1cnNvcjogbm90LWFsbG93ZWQ7XG4gIGNvbG9yOiAjOTk5O1xuICBib3JkZXItY29sb3I6ICM5OTk7XG59XG4ub3V0bGluZS10b29sYmFyX2Rpc2FibGVkLm91dGxpbmUtdG9vbGJhcl9fYW5jaG9yOmxpbms6aG92ZXIsXG4ub3V0bGluZS10b29sYmFyX2Rpc2FibGVkIC5vdXRsaW5lLXRvb2xiYXJfX2FuY2hvcjpsaW5rOmhvdmVyLFxuLm91dGxpbmUtdG9vbGJhcl9kaXNhYmxlZC5vdXRsaW5lLXRvb2xiYXJfX2FuY2hvcjp2aXNpdGVkOmhvdmVyLFxuLm91dGxpbmUtdG9vbGJhcl9kaXNhYmxlZCAub3V0bGluZS10b29sYmFyX19hbmNob3I6dmlzaXRlZDpob3Zlcixcbi5vdXRsaW5lLXRvb2xiYXJfZGlzYWJsZWQub3V0bGluZS10b29sYmFyX19hbmNob3I6aG92ZXI6aG92ZXIsXG4ub3V0bGluZS10b29sYmFyX2Rpc2FibGVkIC5vdXRsaW5lLXRvb2xiYXJfX2FuY2hvcjpob3Zlcjpob3Zlcixcbi5vdXRsaW5lLXRvb2xiYXJfZGlzYWJsZWQub3V0bGluZS10b29sYmFyX19idXR0b246aG92ZXIsXG4ub3V0bGluZS10b29sYmFyX2Rpc2FibGVkIC5vdXRsaW5lLXRvb2xiYXJfX2J1dHRvbjpob3ZlciB7XG4gIGNvbG9yOiAjOTk5O1xuICBib3JkZXItY29sb3I6ICM5OTk7XG59XG4ub3V0bGluZS10b29sYmFyX2Rpc2FibGVkLm91dGxpbmUtdG9vbGJhcl9fYnV0dG9uLFxuLm91dGxpbmUtdG9vbGJhcl9kaXNhYmxlZCAub3V0bGluZS10b29sYmFyX19idXR0b24ge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjVmNWY1O1xufVxuLm91dGxpbmUtdG9vbGJhcl90dGIsXG4ub3V0bGluZS10b29sYmFyX2J0dCB7XG4gIGxlZnQ6IDUwJTtcbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC01MCUpO1xufVxuLm91dGxpbmUtdG9vbGJhcl90dGIgLm91dGxpbmUtdG9vbGJhcl9fYnV0dG9uLFxuLm91dGxpbmUtdG9vbGJhcl9idHQgLm91dGxpbmUtdG9vbGJhcl9fYnV0dG9uIHtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xufVxuLm91dGxpbmUtdG9vbGJhcl90dGIge1xuICB0b3A6IDEycHg7XG59XG4ub3V0bGluZS10b29sYmFyX3R0Yi5vdXRsaW5lLXRvb2xiYXJfaGlkZGVuIHtcbiAgdG9wOiAtNTZweDtcbn1cbi5vdXRsaW5lLXRvb2xiYXJfYnR0IHtcbiAgYm90dG9tOiAxMnB4O1xufVxuLm91dGxpbmUtdG9vbGJhcl9idHQub3V0bGluZS10b29sYmFyX2hpZGRlbiB7XG4gIGJvdHRvbTogLTU2cHg7XG59XG4ub3V0bGluZS10b29sYmFyX3J0bCxcbi5vdXRsaW5lLXRvb2xiYXJfbHRyIHtcbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC01MCUpO1xuICB3aWR0aDogNTZweDtcbn1cbi5vdXRsaW5lLXRvb2xiYXJfcnRsIHtcbiAgdG9wOiA1MCU7XG4gIHJpZ2h0OiAxMnB4O1xufVxuLm91dGxpbmUtdG9vbGJhcl9ydGwub3V0bGluZS10b29sYmFyX2hpZGRlbiB7XG4gIHJpZ2h0OiAtODZweDtcbn1cbi5vdXRsaW5lLXRvb2xiYXJfbHRyIHtcbiAgdG9wOiA1MCU7XG4gIGxlZnQ6IDEycHg7XG59XG4ub3V0bGluZS10b29sYmFyX2x0ci5vdXRsaW5lLXRvb2xiYXJfaGlkZGVuIHtcbiAgbGVmdDogLTg2cHg7XG59XG4ub3V0bGluZS10b29sYmFyX3R0YiAub3V0bGluZS10b29sYmFyX19idXR0b24ub3V0bGluZS10b29sYmFyX2hpZGRlbixcbi5vdXRsaW5lLXRvb2xiYXJfcnRsIC5vdXRsaW5lLXRvb2xiYXJfX2J1dHRvbi5vdXRsaW5lLXRvb2xiYXJfaGlkZGVuLFxuLm91dGxpbmUtdG9vbGJhcl9idHQgLm91dGxpbmUtdG9vbGJhcl9fYnV0dG9uLm91dGxpbmUtdG9vbGJhcl9oaWRkZW4sXG4ub3V0bGluZS10b29sYmFyX2x0ciAub3V0bGluZS10b29sYmFyX19idXR0b24ub3V0bGluZS10b29sYmFyX2hpZGRlbiB7XG4gIGRpc3BsYXk6IG5vbmU7XG59XG4ub3V0bGluZS1tZXNzYWdlIHtcbiAgYm9yZGVyLXJhZGl1czogM3B4O1xuICBib3gtc2hhZG93OiAwIDAgNnB4IDFweCAjZGNkZmU2O1xuICBwb3NpdGlvbjogZml4ZWQ7XG4gIHotaW5kZXg6IDk5OTk7XG4gIG9wYWNpdHk6IDAuMTtcbiAgdG9wOiAtNTBweDtcbiAgbGVmdDogNTAlO1xuICBoZWlnaHQ6IDQwcHg7XG4gIG1hcmdpbjogMDtcbiAgcGFkZGluZzogMCA1MHB4O1xuICBsaW5lLWhlaWdodDogNDBweDtcbiAgZm9udC1zaXplOiAxM3B4O1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmO1xuICBjb2xvcjogIzY2NjtcbiAgdHJhbnNpdGlvbjogYWxsIDAuNXMgZWFzZS1pbi1vdXQ7XG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgtNTAlKTtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi5vdXRsaW5lLW1lc3NhZ2VfX2NvbnRlbnQge1xuICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpcztcbiAgbWFyZ2luOiAwO1xuICBtYXgtd2lkdGg6IDcwMHB4O1xuICBoZWlnaHQ6IDQwcHg7XG4gIGxpbmUtaGVpZ2h0OiA0MHB4O1xuICBmb250LXNpemU6IDEzcHg7XG4gIGNvbG9yOiAjNjY2O1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLm91dGxpbmUtbWVzc2FnZV9fY2xvc2UsXG4ub3V0bGluZS1tZXNzYWdlX19pY29uIHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB6LWluZGV4OiAyO1xuICB0b3A6IDA7XG4gIHdpZHRoOiA0MHB4O1xuICBoZWlnaHQ6IDQwcHg7XG4gIGxpbmUtaGVpZ2h0OiA0MHB4O1xuICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4ub3V0bGluZS1tZXNzYWdlX19pY29uIHtcbiAgbGVmdDogMDtcbiAgY29sb3I6ICNmZmY7XG59XG4ub3V0bGluZS1tZXNzYWdlX19pY29uIC5vdXRsaW5lLWljb24ge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHotaW5kZXg6IDI7XG4gIHRvcDogNTAlO1xuICBsZWZ0OiA1MCU7XG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIC01MCUpO1xufVxuLm91dGxpbmUtbWVzc2FnZV9fY2xvc2Uge1xuICByaWdodDogMDtcbiAgY3Vyc29yOiBwb2ludGVyO1xuICBjb2xvcjogIzk5OTtcbn1cbi5vdXRsaW5lLW1lc3NhZ2VfX2Nsb3NlIC5vdXRsaW5lLWljb24ge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHotaW5kZXg6IDI7XG4gIHRvcDogNTAlO1xuICBsZWZ0OiA1MCU7XG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIC01MCUpO1xufVxuLm91dGxpbmUtbWVzc2FnZV9fY2xvc2U6aG92ZXIge1xuICBjb2xvcjogIzY2Njtcbn1cbi5vdXRsaW5lLW1lc3NhZ2VfaW5mbyAub3V0bGluZS1tZXNzYWdlX19pY29uIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogIzUwN2FmZTtcbn1cbi5vdXRsaW5lLW1lc3NhZ2Vfd2FybmluZyAub3V0bGluZS1tZXNzYWdlX19pY29uIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ZmOTkwMTtcbn1cbi5vdXRsaW5lLW1lc3NhZ2Vfc3VjY2VzcyAub3V0bGluZS1tZXNzYWdlX19pY29uIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogIzA1ODk0Mjtcbn1cbi5vdXRsaW5lLW1lc3NhZ2VfZXJyb3IgLm91dGxpbmUtbWVzc2FnZV9faWNvbiB7XG4gIGJhY2tncm91bmQtY29sb3I6ICNmZjVkNWQ7XG59XG4ub3V0bGluZS1tZXNzYWdlX3BsYWluIHtcbiAgbWluLXdpZHRoOiAxOTBweDtcbiAgcGFkZGluZzogMCA1MHB4IDAgMTVweDtcbn1cbi5vdXRsaW5lLW1lc3NhZ2VfcGxhaW4ub3V0bGluZS1tZXNzYWdlX2luZm8ge1xuICBib3JkZXItbGVmdDogNXB4IHNvbGlkICM1MDdhZmU7XG4gIGJhY2tncm91bmQtY29sb3I6ICNlY2Y4ZmY7XG59XG4ub3V0bGluZS1tZXNzYWdlX3BsYWluLm91dGxpbmUtbWVzc2FnZV93YXJuaW5nIHtcbiAgYm9yZGVyLWxlZnQ6IDVweCBzb2xpZCAjZmY5OTAxO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmYmU2O1xufVxuLm91dGxpbmUtbWVzc2FnZV9wbGFpbi5vdXRsaW5lLW1lc3NhZ2Vfc3VjY2VzcyB7XG4gIGJvcmRlci1sZWZ0OiA1cHggc29saWQgIzA1ODk0MjtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2UxZjZlYjtcbn1cbi5vdXRsaW5lLW1lc3NhZ2VfcGxhaW4ub3V0bGluZS1tZXNzYWdlX2Vycm9yIHtcbiAgYm9yZGVyLWxlZnQ6IDVweCBzb2xpZCAjZmY1ZDVkO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmMWYwO1xufVxuLm91dGxpbmUtbWVzc2FnZV9wbGFpbiAub3V0bGluZS1tZXNzYWdlX19pY29uIHtcbiAgd2lkdGg6IDA7XG4gIGRpc3BsYXk6IG5vbmU7XG59XG4ub3V0bGluZS1tZXNzYWdlX3BsYWluIC5vdXRsaW5lLW1lc3NhZ2VfX2ljb24gLm91dGxpbmUtaWNvbiB7XG4gIGRpc3BsYXk6IG5vbmU7XG59XG4ub3V0bGluZS1tZXNzYWdlX2xpZ2h0IHtcbiAgbWluLXdpZHRoOiAxODBweDtcbiAgcGFkZGluZzogMCA0MHB4O1xufVxuLm91dGxpbmUtbWVzc2FnZV9saWdodC5vdXRsaW5lLW1lc3NhZ2VfaW5mbyAub3V0bGluZS1tZXNzYWdlX19pY29uIHtcbiAgY29sb3I6ICM1MDdhZmU7XG59XG4ub3V0bGluZS1tZXNzYWdlX2xpZ2h0Lm91dGxpbmUtbWVzc2FnZV93YXJuaW5nIC5vdXRsaW5lLW1lc3NhZ2VfX2ljb24ge1xuICBjb2xvcjogI2ZmOTkwMTtcbn1cbi5vdXRsaW5lLW1lc3NhZ2VfbGlnaHQub3V0bGluZS1tZXNzYWdlX3N1Y2Nlc3MgLm91dGxpbmUtbWVzc2FnZV9faWNvbiB7XG4gIGNvbG9yOiAjMDU4OTQyO1xufVxuLm91dGxpbmUtbWVzc2FnZV9saWdodC5vdXRsaW5lLW1lc3NhZ2VfZXJyb3IgLm91dGxpbmUtbWVzc2FnZV9faWNvbiB7XG4gIGNvbG9yOiAjZmY1ZDVkO1xufVxuLm91dGxpbmUtbWVzc2FnZV9saWdodCAub3V0bGluZS1tZXNzYWdlX19pY29uIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjtcbn1cbi5vdXRsaW5lLW1lc3NhZ2Vfcm91bmQge1xuICBib3JkZXItcmFkaXVzOiAyMHB4O1xufVxuLm91dGxpbmUtbWVzc2FnZV9yb3VuZC5vdXRsaW5lLW1lc3NhZ2VfZGVmYXVsdCB7XG4gIG1pbi13aWR0aDogMTgwcHg7XG4gIHBhZGRpbmc6IDAgNDBweDtcbn1cbi5vdXRsaW5lLW1lc3NhZ2Vfcm91bmQub3V0bGluZS1tZXNzYWdlX2RlZmF1bHQgLm91dGxpbmUtbWVzc2FnZV9faWNvbiB7XG4gIGJvcmRlci1yYWRpdXM6IDEwcHg7XG4gIHRvcDogMTBweDtcbiAgbGVmdDogMTBweDtcbiAgd2lkdGg6IDIwcHg7XG4gIGhlaWdodDogMjBweDtcbiAgbGluZS1oZWlnaHQ6IDIwcHg7XG59XG4ub3V0bGluZS1tZXNzYWdlX3JvdW5kLm91dGxpbmUtbWVzc2FnZV9kZWZhdWx0Lm91dGxpbmUtbWVzc2FnZV9mdWxsLXdpZHRoIHtcbiAgbWluLXdpZHRoOiAyMDBweDtcbiAgcGFkZGluZzogMCAyMHB4IDAgNDBweDtcbn1cbi5vdXRsaW5lLW1lc3NhZ2Vfcm91bmQub3V0bGluZS1tZXNzYWdlX3BsYWluIHtcbiAgbWluLXdpZHRoOiAxOTVweDtcbiAgcGFkZGluZzogMCA0MHB4IDAgMjBweDtcbn1cbi5vdXRsaW5lLW1lc3NhZ2Vfcm91bmQub3V0bGluZS1tZXNzYWdlX3BsYWluLm91dGxpbmUtbWVzc2FnZV9mdWxsLXdpZHRoIHtcbiAgbWluLXdpZHRoOiAyMTVweDtcbiAgcGFkZGluZzogMCAyMHB4O1xufVxuLm91dGxpbmUtbWVzc2FnZV9mdWxsLXdpZHRoIHtcbiAgbWluLXdpZHRoOiAyMDBweDtcbiAgcGFkZGluZzogMCAxMHB4IDAgNTBweDtcbn1cbi5vdXRsaW5lLW1lc3NhZ2VfZnVsbC13aWR0aC5vdXRsaW5lLW1lc3NhZ2VfcGxhaW4ge1xuICBtaW4td2lkdGg6IDIzMHB4O1xuICBwYWRkaW5nOiAwIDEwcHggMCAxNXB4O1xufVxuLm91dGxpbmUtbWVzc2FnZV9mdWxsLXdpZHRoLm91dGxpbmUtbWVzc2FnZV9saWdodCB7XG4gIG1pbi13aWR0aDogMjEwcHg7XG4gIHBhZGRpbmc6IDAgMTBweCAwIDQwcHg7XG59XG4ub3V0bGluZS1tZXNzYWdlX3Zpc2libGUge1xuICBvcGFjaXR5OiAxO1xufVxuLm91dGxpbmUtbWVzc2FnZV9oaWRkZW4ge1xuICBkaXNwbGF5OiBub25lO1xufVxuLyogPT09PT0gU2Nyb2xsYmFyID09PT09ICovXG46Oi13ZWJraXQtc2Nyb2xsYmFyIHtcbiAgd2lkdGg6IDdweDtcbiAgaGVpZ2h0OiA3cHg7XG4gIC13ZWJraXQtYm9yZGVyLXJhZGl1czogNXB4O1xufVxuOjotd2Via2l0LXNjcm9sbGJhci10cmFjay1waWVjZSB7XG4gIC13ZWJraXQtYm9yZGVyLXJhZGl1czogNXB4O1xufVxuOjotd2Via2l0LXNjcm9sbGJhci10aHVtYjp2ZXJ0aWNhbCB7XG4gIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMCwgMCwgMCwgMC4yNSk7XG4gIC13ZWJraXQtYm9yZGVyLXJhZGl1czogNXB4O1xufVxuOjotd2Via2l0LXNjcm9sbGJhci10aHVtYjpob3Jpem9udGFsIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjI1KTtcbiAgLXdlYmtpdC1ib3JkZXItcmFkaXVzOiA1cHg7XG59XG46Oi13ZWJraXQtc2Nyb2xsYmFyLXRodW1iOmhvdmVyIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjM1KTtcbn1cbjo6LXdlYmtpdC1zY3JvbGxiYXI6aG92ZXIge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuMTUpO1xufVxuIiwiLyohIG5vcm1hbGl6ZS5jc3MgdjguMC4xIHwgTUlUIExpY2Vuc2UgfCBnaXRodWIuY29tL25lY29sYXMvbm9ybWFsaXplLmNzcyAqL1xyXG5cclxuLyogRG9jdW1lbnRcclxuICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cclxuXHJcbi8qKlxyXG4gKiAxLiBDb3JyZWN0IHRoZSBsaW5lIGhlaWdodCBpbiBhbGwgYnJvd3NlcnMuXHJcbiAqIDIuIFByZXZlbnQgYWRqdXN0bWVudHMgb2YgZm9udCBzaXplIGFmdGVyIG9yaWVudGF0aW9uIGNoYW5nZXMgaW4gaU9TLlxyXG4gKi9cclxuXHJcbmh0bWwge1xyXG4gIGxpbmUtaGVpZ2h0OiAxLjE1OyAvKiAxICovXHJcbiAgLXdlYmtpdC10ZXh0LXNpemUtYWRqdXN0OiAxMDAlOyAvKiAyICovXHJcbn1cclxuXHJcbi8qIFNlY3Rpb25zXHJcbiAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXHJcblxyXG4vKipcclxuICogUmVtb3ZlIHRoZSBtYXJnaW4gaW4gYWxsIGJyb3dzZXJzLlxyXG4gKi9cclxuXHJcbmJvZHkge1xyXG4gIG1hcmdpbjogMDtcclxufVxyXG5cclxuLyoqXHJcbiAqIFJlbmRlciB0aGUgYG1haW5gIGVsZW1lbnQgY29uc2lzdGVudGx5IGluIElFLlxyXG4gKi9cclxuXHJcbm1haW4ge1xyXG4gIGRpc3BsYXk6IGJsb2NrO1xyXG59XHJcblxyXG4vKipcclxuICogQ29ycmVjdCB0aGUgZm9udCBzaXplIGFuZCBtYXJnaW4gb24gYGgxYCBlbGVtZW50cyB3aXRoaW4gYHNlY3Rpb25gIGFuZFxyXG4gKiBgYXJ0aWNsZWAgY29udGV4dHMgaW4gQ2hyb21lLCBGaXJlZm94LCBhbmQgU2FmYXJpLlxyXG4gKi9cclxuXHJcbmgxIHtcclxuICBmb250LXNpemU6IDJlbTtcclxuICBtYXJnaW46IDAuNjdlbSAwO1xyXG59XHJcblxyXG4vKiBHcm91cGluZyBjb250ZW50XHJcbiAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXHJcblxyXG4vKipcclxuICogMS4gQWRkIHRoZSBjb3JyZWN0IGJveCBzaXppbmcgaW4gRmlyZWZveC5cclxuICogMi4gU2hvdyB0aGUgb3ZlcmZsb3cgaW4gRWRnZSBhbmQgSUUuXHJcbiAqL1xyXG5cclxuaHIge1xyXG4gIGJveC1zaXppbmc6IGNvbnRlbnQtYm94OyAvKiAxICovXHJcbiAgaGVpZ2h0OiAwOyAvKiAxICovXHJcbiAgb3ZlcmZsb3c6IHZpc2libGU7IC8qIDIgKi9cclxufVxyXG5cclxuLyoqXHJcbiAqIDEuIENvcnJlY3QgdGhlIGluaGVyaXRhbmNlIGFuZCBzY2FsaW5nIG9mIGZvbnQgc2l6ZSBpbiBhbGwgYnJvd3NlcnMuXHJcbiAqIDIuIENvcnJlY3QgdGhlIG9kZCBgZW1gIGZvbnQgc2l6aW5nIGluIGFsbCBicm93c2Vycy5cclxuICovXHJcblxyXG5wcmUge1xyXG4gIGZvbnQtZmFtaWx5OiBtb25vc3BhY2UsIG1vbm9zcGFjZTsgLyogMSAqL1xyXG4gIGZvbnQtc2l6ZTogMWVtOyAvKiAyICovXHJcbn1cclxuXHJcbi8qIFRleHQtbGV2ZWwgc2VtYW50aWNzXHJcbiAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXHJcblxyXG4vKipcclxuICogUmVtb3ZlIHRoZSBncmF5IGJhY2tncm91bmQgb24gYWN0aXZlIGxpbmtzIGluIElFIDEwLlxyXG4gKi9cclxuXHJcbmEge1xyXG4gIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50O1xyXG59XHJcblxyXG4vKipcclxuICogMS4gUmVtb3ZlIHRoZSBib3R0b20gYm9yZGVyIGluIENocm9tZSA1Ny1cclxuICogMi4gQWRkIHRoZSBjb3JyZWN0IHRleHQgZGVjb3JhdGlvbiBpbiBDaHJvbWUsIEVkZ2UsIElFLCBPcGVyYSwgYW5kIFNhZmFyaS5cclxuICovXHJcblxyXG5hYmJyW3RpdGxlXSB7XHJcbiAgYm9yZGVyLWJvdHRvbTogbm9uZTsgLyogMSAqL1xyXG4gIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOyAvKiAyICovXHJcbiAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmUgZG90dGVkOyAvKiAyICovXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBBZGQgdGhlIGNvcnJlY3QgZm9udCB3ZWlnaHQgaW4gQ2hyb21lLCBFZGdlLCBhbmQgU2FmYXJpLlxyXG4gKi9cclxuXHJcbmIsXHJcbnN0cm9uZyB7XHJcbiAgZm9udC13ZWlnaHQ6IGJvbGRlcjtcclxufVxyXG5cclxuLyoqXHJcbiAqIDEuIENvcnJlY3QgdGhlIGluaGVyaXRhbmNlIGFuZCBzY2FsaW5nIG9mIGZvbnQgc2l6ZSBpbiBhbGwgYnJvd3NlcnMuXHJcbiAqIDIuIENvcnJlY3QgdGhlIG9kZCBgZW1gIGZvbnQgc2l6aW5nIGluIGFsbCBicm93c2Vycy5cclxuICovXHJcblxyXG5jb2RlLFxyXG5rYmQsXHJcbnNhbXAge1xyXG4gIGZvbnQtZmFtaWx5OiBtb25vc3BhY2UsIG1vbm9zcGFjZTsgLyogMSAqL1xyXG4gIGZvbnQtc2l6ZTogMWVtOyAvKiAyICovXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBBZGQgdGhlIGNvcnJlY3QgZm9udCBzaXplIGluIGFsbCBicm93c2Vycy5cclxuICovXHJcblxyXG5zbWFsbCB7XHJcbiAgZm9udC1zaXplOiA4MCU7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBQcmV2ZW50IGBzdWJgIGFuZCBgc3VwYCBlbGVtZW50cyBmcm9tIGFmZmVjdGluZyB0aGUgbGluZSBoZWlnaHQgaW5cclxuICogYWxsIGJyb3dzZXJzLlxyXG4gKi9cclxuXHJcbnN1Yixcclxuc3VwIHtcclxuICBmb250LXNpemU6IDc1JTtcclxuICBsaW5lLWhlaWdodDogMDtcclxuICBwb3NpdGlvbjogcmVsYXRpdmU7XHJcbiAgdmVydGljYWwtYWxpZ246IGJhc2VsaW5lO1xyXG59XHJcblxyXG5zdWIge1xyXG4gIGJvdHRvbTogLTAuMjVlbTtcclxufVxyXG5cclxuc3VwIHtcclxuICB0b3A6IC0wLjVlbTtcclxufVxyXG5cclxuLyogRW1iZWRkZWQgY29udGVudFxyXG4gICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xyXG5cclxuLyoqXHJcbiAqIFJlbW92ZSB0aGUgYm9yZGVyIG9uIGltYWdlcyBpbnNpZGUgbGlua3MgaW4gSUUgMTAuXHJcbiAqL1xyXG5cclxuaW1nIHtcclxuICBib3JkZXItc3R5bGU6IG5vbmU7XHJcbn1cclxuXHJcbi8qIEZvcm1zXHJcbiAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXHJcblxyXG4vKipcclxuICogMS4gQ2hhbmdlIHRoZSBmb250IHN0eWxlcyBpbiBhbGwgYnJvd3NlcnMuXHJcbiAqIDIuIFJlbW92ZSB0aGUgbWFyZ2luIGluIEZpcmVmb3ggYW5kIFNhZmFyaS5cclxuICovXHJcblxyXG5idXR0b24sXHJcbmlucHV0LFxyXG5vcHRncm91cCxcclxuc2VsZWN0LFxyXG50ZXh0YXJlYSB7XHJcbiAgZm9udC1mYW1pbHk6IGluaGVyaXQ7IC8qIDEgKi9cclxuICBmb250LXNpemU6IDEwMCU7IC8qIDEgKi9cclxuICBsaW5lLWhlaWdodDogMS4xNTsgLyogMSAqL1xyXG4gIG1hcmdpbjogMDsgLyogMiAqL1xyXG59XHJcblxyXG4vKipcclxuICogU2hvdyB0aGUgb3ZlcmZsb3cgaW4gSUUuXHJcbiAqIDEuIFNob3cgdGhlIG92ZXJmbG93IGluIEVkZ2UuXHJcbiAqL1xyXG5cclxuYnV0dG9uLFxyXG5pbnB1dCB7XHJcbiAgLyogMSAqL1xyXG4gIG92ZXJmbG93OiB2aXNpYmxlO1xyXG59XHJcblxyXG4vKipcclxuICogUmVtb3ZlIHRoZSBpbmhlcml0YW5jZSBvZiB0ZXh0IHRyYW5zZm9ybSBpbiBFZGdlLCBGaXJlZm94LCBhbmQgSUUuXHJcbiAqIDEuIFJlbW92ZSB0aGUgaW5oZXJpdGFuY2Ugb2YgdGV4dCB0cmFuc2Zvcm0gaW4gRmlyZWZveC5cclxuICovXHJcblxyXG5idXR0b24sXHJcbnNlbGVjdCB7XHJcbiAgLyogMSAqL1xyXG4gIHRleHQtdHJhbnNmb3JtOiBub25lO1xyXG59XHJcblxyXG4vKipcclxuICogQ29ycmVjdCB0aGUgaW5hYmlsaXR5IHRvIHN0eWxlIGNsaWNrYWJsZSB0eXBlcyBpbiBpT1MgYW5kIFNhZmFyaS5cclxuICovXHJcblxyXG5idXR0b24sXHJcblt0eXBlPSdidXR0b24nXSxcclxuW3R5cGU9J3Jlc2V0J10sXHJcblt0eXBlPSdzdWJtaXQnXSB7XHJcbiAgLXdlYmtpdC1hcHBlYXJhbmNlOiBidXR0b247XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBSZW1vdmUgdGhlIGlubmVyIGJvcmRlciBhbmQgcGFkZGluZyBpbiBGaXJlZm94LlxyXG4gKi9cclxuXHJcbmJ1dHRvbjo6LW1vei1mb2N1cy1pbm5lcixcclxuW3R5cGU9J2J1dHRvbiddOjotbW96LWZvY3VzLWlubmVyLFxyXG5bdHlwZT0ncmVzZXQnXTo6LW1vei1mb2N1cy1pbm5lcixcclxuW3R5cGU9J3N1Ym1pdCddOjotbW96LWZvY3VzLWlubmVyIHtcclxuICBib3JkZXItc3R5bGU6IG5vbmU7XHJcbiAgcGFkZGluZzogMDtcclxufVxyXG5cclxuLyoqXHJcbiAqIFJlc3RvcmUgdGhlIGZvY3VzIHN0eWxlcyB1bnNldCBieSB0aGUgcHJldmlvdXMgcnVsZS5cclxuICovXHJcblxyXG5idXR0b246LW1vei1mb2N1c3JpbmcsXHJcblt0eXBlPSdidXR0b24nXTotbW96LWZvY3VzcmluZyxcclxuW3R5cGU9J3Jlc2V0J106LW1vei1mb2N1c3JpbmcsXHJcblt0eXBlPSdzdWJtaXQnXTotbW96LWZvY3VzcmluZyB7XHJcbiAgb3V0bGluZTogMXB4IGRvdHRlZCBCdXR0b25UZXh0O1xyXG59XHJcblxyXG4vKipcclxuICogQ29ycmVjdCB0aGUgcGFkZGluZyBpbiBGaXJlZm94LlxyXG4gKi9cclxuXHJcbmZpZWxkc2V0IHtcclxuICBwYWRkaW5nOiAwLjM1ZW0gMC43NWVtIDAuNjI1ZW07XHJcbn1cclxuXHJcbi8qKlxyXG4gKiAxLiBDb3JyZWN0IHRoZSB0ZXh0IHdyYXBwaW5nIGluIEVkZ2UgYW5kIElFLlxyXG4gKiAyLiBDb3JyZWN0IHRoZSBjb2xvciBpbmhlcml0YW5jZSBmcm9tIGBmaWVsZHNldGAgZWxlbWVudHMgaW4gSUUuXHJcbiAqIDMuIFJlbW92ZSB0aGUgcGFkZGluZyBzbyBkZXZlbG9wZXJzIGFyZSBub3QgY2F1Z2h0IG91dCB3aGVuIHRoZXkgemVybyBvdXRcclxuICogICAgYGZpZWxkc2V0YCBlbGVtZW50cyBpbiBhbGwgYnJvd3NlcnMuXHJcbiAqL1xyXG5cclxubGVnZW5kIHtcclxuICBib3gtc2l6aW5nOiBib3JkZXItYm94OyAvKiAxICovXHJcbiAgY29sb3I6IGluaGVyaXQ7IC8qIDIgKi9cclxuICBkaXNwbGF5OiB0YWJsZTsgLyogMSAqL1xyXG4gIG1heC13aWR0aDogMTAwJTsgLyogMSAqL1xyXG4gIHBhZGRpbmc6IDA7IC8qIDMgKi9cclxuICB3aGl0ZS1zcGFjZTogbm9ybWFsOyAvKiAxICovXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBBZGQgdGhlIGNvcnJlY3QgdmVydGljYWwgYWxpZ25tZW50IGluIENocm9tZSwgRmlyZWZveCwgYW5kIE9wZXJhLlxyXG4gKi9cclxuXHJcbnByb2dyZXNzIHtcclxuICB2ZXJ0aWNhbC1hbGlnbjogYmFzZWxpbmU7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBSZW1vdmUgdGhlIGRlZmF1bHQgdmVydGljYWwgc2Nyb2xsYmFyIGluIElFIDEwKy5cclxuICovXHJcblxyXG50ZXh0YXJlYSB7XHJcbiAgb3ZlcmZsb3c6IGF1dG87XHJcbn1cclxuXHJcbi8qKlxyXG4gKiAxLiBBZGQgdGhlIGNvcnJlY3QgYm94IHNpemluZyBpbiBJRSAxMC5cclxuICogMi4gUmVtb3ZlIHRoZSBwYWRkaW5nIGluIElFIDEwLlxyXG4gKi9cclxuXHJcblt0eXBlPSdjaGVja2JveCddLFxyXG5bdHlwZT0ncmFkaW8nXSB7XHJcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDsgLyogMSAqL1xyXG4gIHBhZGRpbmc6IDA7IC8qIDIgKi9cclxufVxyXG5cclxuLyoqXHJcbiAqIENvcnJlY3QgdGhlIGN1cnNvciBzdHlsZSBvZiBpbmNyZW1lbnQgYW5kIGRlY3JlbWVudCBidXR0b25zIGluIENocm9tZS5cclxuICovXHJcblxyXG5bdHlwZT0nbnVtYmVyJ106Oi13ZWJraXQtaW5uZXItc3Bpbi1idXR0b24sXHJcblt0eXBlPSdudW1iZXInXTo6LXdlYmtpdC1vdXRlci1zcGluLWJ1dHRvbiB7XHJcbiAgaGVpZ2h0OiBhdXRvO1xyXG59XHJcblxyXG4vKipcclxuICogMS4gQ29ycmVjdCB0aGUgb2RkIGFwcGVhcmFuY2UgaW4gQ2hyb21lIGFuZCBTYWZhcmkuXHJcbiAqIDIuIENvcnJlY3QgdGhlIG91dGxpbmUgc3R5bGUgaW4gU2FmYXJpLlxyXG4gKi9cclxuXHJcblt0eXBlPSdzZWFyY2gnXSB7XHJcbiAgLXdlYmtpdC1hcHBlYXJhbmNlOiB0ZXh0ZmllbGQ7IC8qIDEgKi9cclxuICBvdXRsaW5lLW9mZnNldDogLTJweDsgLyogMiAqL1xyXG59XHJcblxyXG4vKipcclxuICogUmVtb3ZlIHRoZSBpbm5lciBwYWRkaW5nIGluIENocm9tZSBhbmQgU2FmYXJpIG9uIG1hY09TLlxyXG4gKi9cclxuXHJcblt0eXBlPSdzZWFyY2gnXTo6LXdlYmtpdC1zZWFyY2gtZGVjb3JhdGlvbiB7XHJcbiAgLXdlYmtpdC1hcHBlYXJhbmNlOiBub25lO1xyXG59XHJcblxyXG4vKipcclxuICogMS4gQ29ycmVjdCB0aGUgaW5hYmlsaXR5IHRvIHN0eWxlIGNsaWNrYWJsZSB0eXBlcyBpbiBpT1MgYW5kIFNhZmFyaS5cclxuICogMi4gQ2hhbmdlIGZvbnQgcHJvcGVydGllcyB0byBgaW5oZXJpdGAgaW4gU2FmYXJpLlxyXG4gKi9cclxuXHJcbjo6LXdlYmtpdC1maWxlLXVwbG9hZC1idXR0b24ge1xyXG4gIC13ZWJraXQtYXBwZWFyYW5jZTogYnV0dG9uOyAvKiAxICovXHJcbiAgZm9udDogaW5oZXJpdDsgLyogMiAqL1xyXG59XHJcblxyXG4vKiBJbnRlcmFjdGl2ZVxyXG4gICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xyXG5cclxuLypcclxuICogQWRkIHRoZSBjb3JyZWN0IGRpc3BsYXkgaW4gRWRnZSwgSUUgMTArLCBhbmQgRmlyZWZveC5cclxuICovXHJcblxyXG5kZXRhaWxzIHtcclxuICBkaXNwbGF5OiBibG9jaztcclxufVxyXG5cclxuLypcclxuICogQWRkIHRoZSBjb3JyZWN0IGRpc3BsYXkgaW4gYWxsIGJyb3dzZXJzLlxyXG4gKi9cclxuXHJcbnN1bW1hcnkge1xyXG4gIGRpc3BsYXk6IGxpc3QtaXRlbTtcclxufVxyXG5cclxuLyogTWlzY1xyXG4gICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xyXG5cclxuLyoqXHJcbiAqIEFkZCB0aGUgY29ycmVjdCBkaXNwbGF5IGluIElFIDEwKy5cclxuICovXHJcblxyXG50ZW1wbGF0ZSB7XHJcbiAgZGlzcGxheTogbm9uZTtcclxufVxyXG5cclxuLyoqXHJcbiAqIEFkZCB0aGUgY29ycmVjdCBkaXNwbGF5IGluIElFIDEwLlxyXG4gKi9cclxuXHJcbltoaWRkZW5dIHtcclxuICBkaXNwbGF5OiBub25lO1xyXG59XHJcbiIsIkBpbXBvcnQgJy4vY29sb3JzJztcclxuXHJcbi8qID09PT09IEJhc2UgPT09PT0gKi9cclxuaHRtbCxcclxuYm9keSB7XHJcbiAgaGVpZ2h0OiAxMDAlO1xyXG4gIGJhY2tncm91bmQ6IEBiZ19jb2xvcjtcclxuICBjb2xvcjogQHByaW1hcnlfdGV4dF9jb2xvcjtcclxuICBmb250LXNpemU6IDE0cHg7XHJcbiAgbGluZS1oZWlnaHQ6IDE1MCU7XHJcbiAgZm9udC1mYW1pbHk6ICdNaWNyb3NvZnQgWWFIZWkgVUknLCBBcmlhbCwgc2Fucy1zZXJpZjtcclxuICBvdmVyZmxvdzogaGlkZGVuO1xyXG59XHJcblxyXG5hIHtcclxuICAmOmxpbmssXHJcbiAgJjp2aXNpdGVkLFxyXG4gICY6aG92ZXIge1xyXG4gICAgY29sb3I6IEBzdWNjZXNzX2NvbG9yO1xyXG4gICAgdGV4dC1kZWNvcmF0aW9uOiBub25lO1xyXG4gIH1cclxuXHJcbiAgJjpob3ZlciB7XHJcbiAgICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTtcclxuICB9XHJcbn1cclxuXHJcbmNvZGUge1xyXG4gIGZvbnQtZmFtaWx5OiAnU291cmNlIENvZGUgUHJvJywgQ29uc29sYXMsIEdlb3JnaWEsIE1vbmFjbywgbW9ub3NwYWNlLCBBcmlhbCxcclxuICAgIHNhbnMtc2VyaWY7XHJcbn1cclxuIiwiLyogPT09PT0gU2Nyb2xsYmFyID09PT09ICovXHJcbjo6LXdlYmtpdC1zY3JvbGxiYXIge1xyXG4gIHdpZHRoOiA3cHg7XHJcbiAgaGVpZ2h0OiA3cHg7XHJcbiAgLXdlYmtpdC1ib3JkZXItcmFkaXVzOiA1cHg7XHJcbn1cclxuXHJcbjo6LXdlYmtpdC1zY3JvbGxiYXItdHJhY2stcGllY2Uge1xyXG4gIC13ZWJraXQtYm9yZGVyLXJhZGl1czogNXB4O1xyXG59XHJcblxyXG46Oi13ZWJraXQtc2Nyb2xsYmFyLXRodW1iOnZlcnRpY2FsIHtcclxuICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuMjUpO1xyXG4gIC13ZWJraXQtYm9yZGVyLXJhZGl1czogNXB4O1xyXG59XHJcblxyXG46Oi13ZWJraXQtc2Nyb2xsYmFyLXRodW1iOmhvcml6b250YWwge1xyXG4gIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMCwgMCwgMCwgMC4yNSk7XHJcbiAgLXdlYmtpdC1ib3JkZXItcmFkaXVzOiA1cHg7XHJcbn1cclxuXHJcbjo6LXdlYmtpdC1zY3JvbGxiYXI6aG92ZXIge1xyXG4gIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMCwgMCwgMCwgMC4xNSk7XHJcbn1cclxuXHJcbjo6LXdlYmtpdC1zY3JvbGxiYXItdGh1bWI6aG92ZXIge1xyXG4gIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMCwgMCwgMCwgMC4zNSk7XHJcbn1cclxuIiwiQGltcG9ydCAnLi9jb2xvcnMnO1xyXG5cclxuLyogTGF5b3V0ICovXHJcbi5kb2NzIHtcclxuICBkaXNwbGF5OiBmbGV4O1xyXG4gIGZsZXgtZGlyZWN0aW9uOiByb3c7XHJcbiAgZmxleC13cmFwOiBub3dyYXA7XHJcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xyXG4gIHotaW5kZXg6IDE7XHJcbiAgaGVpZ2h0OiAxMDAlO1xyXG4gIHdpZHRoOiAxMDAlO1xyXG4gIG1hcmdpbjogMDtcclxuICBvdmVyZmxvdzogaGlkZGVuO1xyXG59XHJcblxyXG4vKiBBc2lkZSAqL1xyXG4uYXNpZGUge1xyXG4gIGRpc3BsYXk6IGZsZXg7XHJcbiAgZmxleC1zaHJpbms6IDA7XHJcbiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcclxuICBmbGV4LXdyYXA6IG5vd3JhcDtcclxuICB3aWR0aDogMjYwcHg7XHJcbiAgbWFyZ2luOiAwO1xyXG4gIGhlaWdodDogMTAwJTtcclxuICBiYWNrZ3JvdW5kLWNvbG9yOiBAcHJpbWFyeV90ZXh0X2NvbG9yO1xyXG4gIGNvbG9yOiBAYm9yZGVyX2NvbG9yO1xyXG4gIGJveC1zaGFkb3c6IDAgMCA1cHggMnB4IEBib3JkZXJfY29sb3I7XHJcbiAgdHJhbnNpdGlvbi1kdXJhdGlvbjogMC4zcztcclxuICBvdmVyZmxvdzogYXV0bztcclxufVxyXG5cclxuLyogTWFpbiAqL1xyXG4ubWFpbiB7XHJcbiAgZmxleDogMTtcclxuICBwb3NpdGlvbjogcmVsYXRpdmU7XHJcbiAgei1pbmRleDogMTtcclxuICBoZWlnaHQ6IDEwMCU7XHJcbiAgYmFja2dyb3VuZC1jb2xvcjogQHdoaXRlO1xyXG4gIG92ZXJmbG93OiBhdXRvO1xyXG59XHJcblxyXG5AbWVkaWEgKG1heC13aWR0aDogNTAwcHgpIHtcclxuICAuZG9jcyB7XHJcbiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xyXG4gIH1cclxuXHJcbiAgLmFzaWRlLFxyXG4gIC5tYWluIHtcclxuICAgIHdpZHRoOiAxMDAlO1xyXG4gIH1cclxuXHJcbiAgLmFzaWRlIHtcclxuICAgIHBvc2l0aW9uOiBmaXhlZDtcclxuICAgIHotaW5kZXg6IDM7XHJcbiAgICB0b3A6IDA7XHJcblxyXG4gICAgJi5vdXRsaW5lLW5hdmlnYXRvciB7XHJcbiAgICAgICZfZm9sZGVkIHtcclxuICAgICAgICBsZWZ0OiAtMTAwJTtcclxuICAgICAgfVxyXG5cclxuICAgICAgJl9leHBhbmRlZCB7XHJcbiAgICAgICAgbGVmdDogMDtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxufVxyXG4iLCJAaW1wb3J0ICcuL2NvbG9ycyc7XHJcblxyXG4uYXNpZGUge1xyXG4gIGZvbnQtZmFtaWx5OiAnU291cmNlIENvZGUgUHJvJywgQ29uc29sYXMsIEdlb3JnaWEsIE1vbmFjbywgbW9ub3NwYWNlLCBBcmlhbCxcclxuICAgIHNhbnMtc2VyaWY7XHJcblxyXG4gICZfX2hlYWRlciB7XHJcbiAgICBtYXJnaW46IDAgYXV0bztcclxuICAgIGZsZXgtc2hyaW5rOiAwO1xyXG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcclxuICB9XHJcblxyXG4gICZfX25hdiB7XHJcbiAgICBmbGV4OiAxO1xyXG4gICAgb3ZlcmZsb3c6IGF1dG87XHJcbiAgfVxyXG5cclxuICAmX19oMiB7XHJcbiAgICBtYXJnaW46IDAgYXV0bztcclxuICAgIGhlaWdodDogNTRweDtcclxuICAgIGxpbmUtaGVpZ2h0OiA1NHB4O1xyXG4gICAgZm9udC1zaXplOiAyMHB4O1xyXG4gICAgZm9udC13ZWlnaHQ6IG5vcm1hbDtcclxuICAgIGZvbnQtZmFtaWx5OiBHZW9yZ2lhLCBDb25zb2xhcywgQXJpYWwsIHNhbnMtc2VyaWY7XHJcbiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XHJcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xyXG4gIH1cclxuXHJcbiAgJl9faDMge1xyXG4gICAgbWFyZ2luOiAwIGF1dG87XHJcbiAgICBwYWRkaW5nOiAwIDIwcHg7XHJcbiAgICBmb250LXNpemU6IDE2cHg7XHJcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xyXG4gIH1cclxuXHJcbiAgJl9fbGlzdCB7XHJcbiAgICBtYXJnaW46IDA7XHJcbiAgICBwYWRkaW5nOiAxMHB4IDA7XHJcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xyXG4gIH1cclxuXHJcbiAgJl9faXRlbSB7XHJcbiAgICBoZWlnaHQ6IDMycHg7XHJcbiAgICBsaW5lLWhlaWdodDogMzJweDtcclxuICAgIHBhZGRpbmc6IDAgMzBweDtcclxuICAgIGN1cnNvcjogcG9pbnRlcjtcclxuICAgIGZvbnQtc2l6ZTogMTNweDtcclxuICAgIG92ZXJmbG93OiBoaWRkZW47XHJcbiAgfVxyXG5cclxuICAmLW5hdmlnYXRvciB7XHJcbiAgICBmbGV4OiAxO1xyXG5cclxuICAgIC5vdXRsaW5lLW5hdmlnYXRvciB7XHJcbiAgICAgICZfX21haW4ge1xyXG4gICAgICAgICY6Oi13ZWJraXQtc2Nyb2xsYmFyLXRodW1iIHtcclxuICAgICAgICAgIGJhY2tncm91bmQtY29sb3I6IEB0aGlyZF90ZXh0X2NvbG9yO1xyXG5cclxuICAgICAgICAgICY6aG92ZXIge1xyXG4gICAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAZm91cnRoX3RleHRfY29sb3I7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICAmX19wbGFjZWhvbGRlciB7XHJcbiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogQHNlY29uZGFyeV90ZXh0X2NvbG9yO1xyXG4gICAgICAgIGJvcmRlci1sZWZ0OiAzcHggc29saWQgQHdoaXRlO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAmX19hbmNob3Ige1xyXG4gICAgICAgICY6bGluayB7XHJcbiAgICAgICAgICBjb2xvcjogQGJvcmRlcl9jb2xvcjtcclxuICAgICAgICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgICY6dmlzaXRlZCB7XHJcbiAgICAgICAgICBjb2xvcjogQGJvcmRlcl9jb2xvcjtcclxuICAgICAgICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgICY6aG92ZXIge1xyXG4gICAgICAgICAgY29sb3I6IEBib3JkZXJfY29sb3I7XHJcbiAgICAgICAgICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgICZfYWN0aXZlIHtcclxuICAgICAgICAmLm91dGxpbmUtbmF2aWdhdG9yX19hbmNob3Ige1xyXG4gICAgICAgICAgJjpsaW5rLFxyXG4gICAgICAgICAgJjp2aXNpdGVkLFxyXG4gICAgICAgICAgJjpob3ZlciB7XHJcbiAgICAgICAgICAgIGNvbG9yOiBAd2hpdGU7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbiIsIkBpbXBvcnQgJy4vY29sb3JzJztcclxuXHJcbi5tYWluIHtcclxuICAmX19oZWFkZXIsXHJcbiAgJl9fZm9vdGVyIHtcclxuICAgIG1hcmdpbjogMCBhdXRvO1xyXG4gICAgcGFkZGluZzogMWVtO1xyXG4gICAgdGV4dC1hbGlnbjogY2VudGVyO1xyXG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcclxuICB9XHJcblxyXG4gICZfX2gxIHtcclxuICAgIG1hcmdpbjogMCBhdXRvO1xyXG4gICAgcGFkZGluZy10b3A6IDFlbTtcclxuICAgIGZvbnQtc2l6ZTogNWVtO1xyXG4gICAgZm9udC13ZWlnaHQ6IG5vcm1hbDtcclxuICAgIGxpbmUtaGVpZ2h0OiAyZW07XHJcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xyXG4gIH1cclxuXHJcbiAgJl9fbmFtZSB7XHJcbiAgICBjb2xvcjogIzUwN2FmZTtcclxuICAgIGZvbnQtd2VpZ2h0OiBub3JtYWw7XHJcbiAgfVxyXG5cclxuICAmX190YWdsaW5lIHtcclxuICAgIG1hcmdpbjogMWVtIGF1dG87XHJcbiAgICBtYXgtd2lkdGg6IDk2MHB4O1xyXG4gICAgbGluZS1oZWlnaHQ6IDEuM2VtO1xyXG4gICAgZm9udC1zaXplOiAyZW07XHJcbiAgICBjb2xvcjogQGZvdXJ0aF90ZXh0X2NvbG9yO1xyXG4gICAgZm9udC13ZWlnaHQ6IDEwMDtcclxuICAgIG92ZXJmbG93OiBoaWRkZW47XHJcbiAgfVxyXG5cclxuICAmX19jZG4ge1xyXG4gICAgbWFyZ2luOiAyZW0gMDtcclxuICAgIHBhZGRpbmc6IDJlbTtcclxuICAgIGZvbnQtc2l6ZTogMTZweDtcclxuICAgIGxpbmUtaGVpZ2h0OiAxNTAlO1xyXG4gICAgdGV4dC1hbGlnbjogY2VudGVyO1xyXG4gICAgYmFja2dyb3VuZC1jb2xvcjogQGJnX2NvbG9yO1xyXG4gICAgYm9yZGVyLXRvcDogMXB4IHNvbGlkIEBib3JkZXJfY29sb3I7XHJcbiAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgQGJvcmRlcl9jb2xvcjtcclxuICAgIGNvbG9yOiBAdGhpcmRfdGV4dF9jb2xvcjtcclxuICAgIG92ZXJmbG93OiBoaWRkZW47XHJcbiAgfVxyXG5cclxuICAmX19kb3dubG9hZCB7XHJcbiAgICBtYXJnaW46IDFlbSBhdXRvO1xyXG4gICAgd2lkdGg6IDIwMHB4O1xyXG4gICAgdGV4dC1hbGlnbjogY2VudGVyO1xyXG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcclxuICB9XHJcblxyXG4gICZfX2J1dHRvbiB7XHJcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XHJcbiAgICBib3JkZXItcmFkaXVzOiA0cHg7XHJcbiAgICBwYWRkaW5nOiAxNHB4IDI5cHg7XHJcbiAgICBmb250LXNpemU6IDE4cHg7XHJcbiAgICBmb250LWZhbWlseTogJ1NvdXJjZSBDb2RlIFBybycsIENvbnNvbGFzLCBHZW9yZ2lhLCBNb25hY28sIG1vbm9zcGFjZSwgQXJpYWwsXHJcbiAgICAgIHNhbnMtc2VyaWY7XHJcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAc3VjY2Vzc19jb2xvcjtcclxuICAgIG92ZXJmbG93OiBoaWRkZW47XHJcblxyXG4gICAgJjpsaW5rLFxyXG4gICAgJjp2aXNpdGVkLFxyXG4gICAgJjpob3ZlciB7XHJcbiAgICAgIGNvbG9yOiBAd2hpdGU7XHJcbiAgICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gICZfX2Zvb3RlciB7XHJcbiAgICBtYXJnaW46IDAgM2VtO1xyXG4gICAgYm9yZGVyLXRvcDogMXB4IHNvbGlkIEBib3JkZXJfY29sb3I7XHJcbiAgfVxyXG59XHJcbiIsIkBpbXBvcnQgJy4vY29sb3JzJztcclxuXHJcbi5zZWN0aW9uIHtcclxuICBtYXJnaW46IDFlbSAwO1xyXG4gIG92ZXJmbG93OiBoaWRkZW47XHJcblxyXG4gICZfX2hlYWRlcixcclxuICAmX19jb250ZW50LFxyXG4gICZfX2Zvb3RlciB7XHJcbiAgICBtYXJnaW46IDA7XHJcbiAgICBwYWRkaW5nOiAwIDNlbTtcclxuICAgIG92ZXJmbG93OiBoaWRkZW47XHJcbiAgfVxyXG5cclxuICAmX190aXRsZSB7XHJcbiAgICBjb2xvcjogQHRoaXJkX3RleHRfY29sb3I7XHJcbiAgfVxyXG5cclxuICAmX19oMyB7XHJcbiAgICBjb2xvcjogQHByaW1hcnlfY29sb3I7XHJcbiAgICBmb250LXNpemU6IDEuMzVlbTtcclxuICB9XHJcblxyXG4gICZfX2g0IHtcclxuICAgIGZvbnQtc2l6ZTogMS4xZW07XHJcbiAgICBjb2xvcjogQHRoaXJkX3RleHRfY29sb3I7XHJcbiAgfVxyXG5cclxuICAmX19oNSB7XHJcbiAgICBmb250LXNpemU6IDFlbTtcclxuICAgIGNvbG9yOiBAZm91cnRoX3RleHRfY29sb3I7XHJcbiAgfVxyXG5cclxuICAmX19kbCxcclxuICAmX19kdCxcclxuICAmX19kZCB7XHJcbiAgICBtYXJnaW46IDA7XHJcbiAgICBwYWRkaW5nOiAwO1xyXG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcclxuICB9XHJcblxyXG4gICZfX2RsIHtcclxuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcclxuICAgIHotaW5kZXg6IDE7XHJcbiAgfVxyXG5cclxuICAmX19kdCB7XHJcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XHJcbiAgfVxyXG5cclxuICAmX19kZCB7XHJcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XHJcbiAgICBjb2xvcjogQHN1Y2Nlc3NfY29sb3I7XHJcbiAgfVxyXG5cclxuICAmX19wcmUge1xyXG4gICAgbWFyZ2luOiAyZW0gMDtcclxuICAgIHBhZGRpbmc6IDFlbTtcclxuICAgIGZvbnQtc2l6ZTogMTRweDtcclxuICAgIGxpbmUtaGVpZ2h0OiAxNTAlO1xyXG4gICAgdGV4dC1hbGlnbjogbGVmdDtcclxuICAgIGJhY2tncm91bmQtY29sb3I6IEBiZ19jb2xvcjtcclxuICAgIGJvcmRlcjogMXB4IHNvbGlkIEBib3JkZXJfY29sb3I7XHJcbiAgICBib3JkZXItcmFkaXVzOiA0cHg7XHJcbiAgICBjb2xvcjogQHRoaXJkX3RleHRfY29sb3I7XHJcbiAgICBvdmVyZmxvdzogYXV0bztcclxuICB9XHJcblxyXG4gICZfX2NvZGUge1xyXG4gICAgZGlzcGxheTogYmxvY2s7XHJcbiAgICBtYXJnaW46IDAgYXV0bztcclxuICAgIG92ZXJmbG93OiBoaWRkZW47XHJcbiAgfVxyXG5cclxuICAmX19mb290ZXIge1xyXG4gICAgYm9yZGVyLXRvcDogMXB4IHNvbGlkIEBib3JkZXJfY29sb3I7XHJcbiAgICBtYXJnaW4tdG9wOiAzZW07XHJcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAYmdfY29sb3I7XHJcbiAgICBjb2xvcjogQGZvdXJ0aF90ZXh0X2NvbG9yO1xyXG4gIH1cclxuXHJcbiAgJl9fdGFibGUge1xyXG4gICAgbWFyZ2luOiAxZW0gYXV0bztcclxuICAgIHdpZHRoOiAxMDAlO1xyXG4gICAgYm9yZGVyLXRvcDogMXB4IHNvbGlkIEBib3JkZXJfY29sb3I7XHJcbiAgfVxyXG5cclxuICAmX190aCxcclxuICAmX190ZCB7XHJcbiAgICBwYWRkaW5nOiA1cHggMTZweDtcclxuICAgIGxpbmUtaGVpZ2h0OiAyNnB4O1xyXG4gICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIEBib3JkZXJfY29sb3I7XHJcbiAgfVxyXG5cclxuICAmX190aCB7XHJcbiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XHJcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAYmdfY29sb3I7XHJcbiAgfVxyXG59XHJcblxyXG5AbWVkaWEgKG1heC13aWR0aDogNTAwcHgpIHtcclxuICAuc2VjdGlvbiB7XHJcbiAgICAmX19oZWFkZXIsXHJcbiAgICAmX19jb250ZW50IHtcclxuICAgICAgcGFkZGluZzogMCAxZW07XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbiIsIkBpbXBvcnQgJy4vY29sb3JzJztcclxuXHJcbi5jYXNlIHtcclxuICBwb3NpdGlvbjogcmVsYXRpdmU7XHJcbiAgei1pbmRleDogMTtcclxuICBkaXNwbGF5OiBncmlkO1xyXG4gIGdyaWQtdGVtcGxhdGUtY29sdW1uczogcmVwZWF0KDIsIDFmcik7XHJcbiAgZ2FwOiA0MHB4O1xyXG4gIHBhZGRpbmc6IDFlbTtcclxuICBib3JkZXItdG9wOiAxcHggc29saWQgQGJvcmRlcl9jb2xvcjtcclxuICBib3JkZXItYm90dG9tOiAxcHggc29saWQgQGJvcmRlcl9jb2xvcjtcclxuICBvdmVyZmxvdzogaGlkZGVuO1xyXG5cclxuICAmOmFmdGVyIHtcclxuICAgIGNvbnRlbnQ6ICcnO1xyXG4gICAgcG9zaXRpb246IGFic29sdXRlO1xyXG4gICAgei1pbmRleDogMjtcclxuICAgIHRvcDogMDtcclxuICAgIGxlZnQ6IDUwJTtcclxuICAgIGhlaWdodDogMTAwJTtcclxuICAgIHdpZHRoOiAwO1xyXG4gICAgYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCBAYm9yZGVyX2NvbG9yO1xyXG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcclxuICB9XHJcblxyXG4gICZfX3ByZSxcclxuICAmX190ZXh0YXJlYSB7XHJcbiAgICBmb250LXNpemU6IDEzcHg7XHJcbiAgICBsaW5lLWhlaWdodDogMTUwJTtcclxuICB9XHJcblxyXG4gICZfX3ByZSxcclxuICAmX19jb2RlLFxyXG4gICZfX3RleHRhcmVhIHtcclxuICAgIGZvbnQtZmFtaWx5OiAnQ291cmllciBOZXcnLCBDb25zb2xhcywgR2VvcmdpYSwgQXJpYWwsIHNhbnMtc2VyaWY7XHJcbiAgfVxyXG5cclxuICAmX19wcmUge1xyXG4gICAgbWFyZ2luOiAwO1xyXG4gICAgcGFkZGluZzogMWVtO1xyXG4gICAgYmFja2dyb3VuZC1jb2xvcjogQGJnX2NvbG9yO1xyXG4gICAgaGVpZ2h0OiAxMDAlO1xyXG4gICAgYm9yZGVyLXJhZGl1czogNHB4O1xyXG4gICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcclxuICAgIG92ZXJmbG93OiBhdXRvO1xyXG4gIH1cclxuXHJcbiAgJl9fdG9vbGJhciB7XHJcbiAgICBtYXJnaW46IDAgYXV0bztcclxuICAgIGhlaWdodDogMzZweDtcclxuICAgIGxpbmUtaGVpZ2h0OiAzNnB4O1xyXG4gICAgZm9udC1zaXplOiAxNHB4O1xyXG4gICAgcGFkZGluZzogMCAxNnB4O1xyXG4gICAgdGV4dC1hbGlnbjogcmlnaHQ7XHJcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xyXG4gIH1cclxuXHJcbiAgJl9fYWN0aW9uLFxyXG4gICZfX3JlbW92ZSB7XHJcbiAgICBjdXJzb3I6IHBvaW50ZXI7XHJcbiAgICBjb2xvcjogQHN1Y2Nlc3NfY29sb3I7XHJcbiAgICB1c2VyLXNlbGVjdDogbm9uZTtcclxuICB9XHJcblxyXG4gICZfX2FjdGlvbiB7XHJcbiAgICBmb250LXNpemU6IDEzcHg7XHJcbiAgICBwYWRkaW5nLWxlZnQ6IDEwcHg7XHJcblxyXG4gICAgJjpmaXJzdC1jaGlsZCB7XHJcbiAgICAgIHBhZGRpbmctbGVmdDogMDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gICZfX3JlbW92ZSB7XHJcbiAgICBmbG9hdDogcmlnaHQ7XHJcbiAgfVxyXG5cclxuICAmX19jb25zb2xlIHtcclxuICAgIG1hcmdpbjogMCBhdXRvO1xyXG4gICAgaGVpZ2h0OiAxODBweDtcclxuICAgIGJvcmRlcjogMXB4IHNvbGlkIEBib3JkZXJfY29sb3I7XHJcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xyXG4gIH1cclxuXHJcbiAgJl9fdGV4dGFyZWEge1xyXG4gICAgbWFyZ2luOiAwIGF1dG87XHJcbiAgICB3aWR0aDogMTAwJTtcclxuICAgIGhlaWdodDogMTAwJTtcclxuICAgIGJvcmRlcjogbm9uZTtcclxuICAgIG91dGxpbmU6IG5vbmU7XHJcbiAgICBwYWRkaW5nOiAxZW07XHJcbiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xyXG4gICAgb3ZlcmZsb3c6IGF1dG87XHJcbiAgfVxyXG5cclxuICAmX19saXN0LFxyXG4gICZfX2l0ZW0ge1xyXG4gICAgbWFyZ2luOiAwO1xyXG4gICAgcGFkZGluZzogMDtcclxuICAgIGxpc3Qtc3R5bGUtdHlwZTogbm9uZTtcclxuICAgIG92ZXJmbG93OiBoaWRkZW47XHJcbiAgfVxyXG5cclxuICAmX19saXN0IHtcclxuICAgIGhlaWdodDogMzYwcHg7XHJcbiAgICBib3JkZXItdG9wOiAxcHggc29saWQgQGJvcmRlcl9jb2xvcjtcclxuICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCBAYm9yZGVyX2NvbG9yO1xyXG4gICAgZm9udC1zaXplOiAxM3B4O1xyXG4gICAgb3ZlcmZsb3c6IGF1dG87XHJcbiAgfVxyXG5cclxuICAmX19pdGVtIHtcclxuICAgIGhlaWdodDogMzZweDtcclxuICAgIGxpbmUtaGVpZ2h0OiAzNnB4O1xyXG4gICAgY3Vyc29yOiBwb2ludGVyO1xyXG4gICAgcGFkZGluZzogMCAxNnB4O1xyXG5cclxuICAgICY6aG92ZXIge1xyXG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAaG92ZXJfYmdfY29sb3I7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbiIsIjpyb290IHtcclxuICAtLW91dGxpbmUtekluZGV4OiAyMDAwO1xyXG4gIC0tb3V0bGluZS1zdGlja3ktaGVpZ2h0OiAxMDAlO1xyXG4gIC0tb3V0bGluZS1uYXZpZ2F0b3Itd2lkdGg6IDEwMCU7XHJcbn1cclxuIiwiLyogPT09PT09PT09PSBpY29uLnRoZW1lIC0gc3ZnIOWbvuagh+eahOagt+W8jyA9PT09PT09PT09ICovXHJcbi5vdXRsaW5lLWljb24ge1xyXG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcclxuICB6LWluZGV4OiAxO1xyXG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcclxuICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO1xyXG4gIHdpZHRoOiAxZW07XHJcbiAgaGVpZ2h0OiAxZW07XHJcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcclxuXHJcbiAgJl9fc3ZnIHtcclxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcclxuICAgIHotaW5kZXg6IDI7XHJcbiAgICB0b3A6IDUwJTtcclxuICAgIGxlZnQ6IDUwJTtcclxuICAgIHdpZHRoOiAxZW07XHJcbiAgICBoZWlnaHQ6IDFlbTtcclxuICAgIGZpbGw6IGN1cnJlbnRjb2xvcjtcclxuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIC01MCUpO1xyXG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcclxuICB9XHJcblxyXG4gICZfaGlkZGVuIHtcclxuICAgIGRpc3BsYXk6IG5vbmU7XHJcbiAgfVxyXG59XHJcbiIsIkBpbXBvcnQgJ2NvbG9ycyc7XHJcblxyXG4ub3V0bGluZS1oZWFkaW5nIHtcclxuICBwb3NpdGlvbjogcmVsYXRpdmU7XHJcbiAgei1pbmRleDogMTtcclxuICBvdmVyZmxvdzogaGlkZGVuO1xyXG5cclxuICAmX19hbmNob3Ige1xyXG4gICAgZGlzcGxheTogbm9uZTtcclxuXHJcbiAgICAmOmxpbmssXHJcbiAgICAmOnZpc2l0ZWQsXHJcbiAgICAmOmhvdmVyIHtcclxuICAgICAgY29sb3I6IEBmb3VydGhfdGV4dF9jb2xvcjtcclxuICAgICAgdGV4dC1kZWNvcmF0aW9uOiBub25lO1xyXG4gICAgfVxyXG5cclxuICAgICY6aG92ZXIge1xyXG4gICAgICBjb2xvcjogQHByaW1hcnlfY29sb3I7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAmOmhvdmVyIHtcclxuICAgIC5vdXRsaW5lLWhlYWRpbmdfX2FuY2hvciB7XHJcbiAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcclxuICAgIH1cclxuICB9XHJcblxyXG4gICZfc3RhcnQge1xyXG4gICAgJjpob3ZlciB7XHJcbiAgICAgIG92ZXJmbG93OiB2aXNpYmxlO1xyXG4gICAgfVxyXG5cclxuICAgIC5vdXRsaW5lLWhlYWRpbmdfX2FuY2hvciB7XHJcbiAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcclxuICAgICAgei1pbmRleDogMjtcclxuICAgICAgdG9wOiA1MCU7XHJcbiAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtNTAlKTtcclxuICAgICAgbGVmdDogLTFlbTtcclxuICAgIH1cclxuICB9XHJcbn1cclxuIiwiQGltcG9ydCAnLi92YXJpYWJsZXMnO1xyXG5AaW1wb3J0ICcuL2NvbG9ycyc7XHJcbkBpbXBvcnQgJy4vc2hhZG93JztcclxuXHJcbi5vdXRsaW5lLWRyYXdlciB7XHJcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xyXG4gIHotaW5kZXg6IC0xO1xyXG4gIHRvcDogMDtcclxuICBsZWZ0OiAwO1xyXG4gIG1hcmdpbjogMDtcclxuICB3aWR0aDogMTAwJTtcclxuICBoZWlnaHQ6IDEwMCU7XHJcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDtcclxuICB2aXNpYmlsaXR5OiBoaWRkZW47XHJcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcclxuXHJcbiAgJl9fbW9kYWwge1xyXG4gICAgLnNoYWRvd19saWdodF9yZWd1bGFyKCk7XHJcbiAgICBkaXNwbGF5OiBmbGV4O1xyXG4gICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcclxuICAgIGZsZXgtd3JhcDogbm93cmFwO1xyXG4gICAgcG9zaXRpb246IGFic29sdXRlO1xyXG4gICAgei1pbmRleDogMjE7XHJcbiAgICBoZWlnaHQ6IDEwMCU7XHJcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAd2hpdGU7XHJcbiAgICB0cmFuc2l0aW9uLWR1cmF0aW9uOiAwLjRzO1xyXG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcclxuICB9XHJcblxyXG4gICZfX2hlYWRlcixcclxuICAmX19tYWluLFxyXG4gICZfX2Zvb3RlciB7XHJcbiAgICB3aWR0aDogMTAwJTtcclxuICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XHJcbiAgfVxyXG5cclxuICAmX19oZWFkZXIsXHJcbiAgJl9fZm9vdGVyIHtcclxuICAgIGZsZXgtc2hyaW5rOiAwO1xyXG4gIH1cclxuXHJcbiAgJl9fdGl0bGUsXHJcbiAgJl9fbWFpbixcclxuICAmX19mb290ZXIge1xyXG4gICAgcGFkZGluZzogMCAxNnB4O1xyXG4gIH1cclxuXHJcbiAgJl9faGVhZGVyLFxyXG4gICZfX3RpdGxlIHtcclxuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcclxuICAgIHotaW5kZXg6IDE7XHJcbiAgICBtYXJnaW46IDAgYXV0bztcclxuICAgIGhlaWdodDogNTJweDtcclxuICAgIGxpbmUtaGVpZ2h0OiA1MnB4O1xyXG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcclxuICB9XHJcblxyXG4gICZfX3RpdGxlIHtcclxuICAgIGZvbnQtc2l6ZTogMTZweDtcclxuICAgIGZvbnQtd2VpZ2h0OiA0MDA7XHJcbiAgICBtYXJnaW46IDAgMTZweDtcclxuICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XHJcbiAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgQHByaW1hcnlfYm9yZGVyX2NvbG9yO1xyXG4gIH1cclxuXHJcbiAgJl9fY2xvc2Uge1xyXG4gICAgcG9zaXRpb246IGFic29sdXRlO1xyXG4gICAgei1pbmRleDogMjtcclxuICAgIHRvcDogNTAlO1xyXG4gICAgcmlnaHQ6IDEycHg7XHJcbiAgICB3aWR0aDogMjBweDtcclxuICAgIGhlaWdodDogMjBweDtcclxuICAgIGxpbmUtaGVpZ2h0OiAyMHB4O1xyXG4gICAgY29sb3I6IEBmb3VydGhfdGV4dF9jb2xvcjtcclxuICAgIGZvbnQtc2l6ZTogMjBweDtcclxuICAgIHRleHQtYWxpZ246IGNlbnRlcjtcclxuICAgIGN1cnNvcjogcG9pbnRlcjtcclxuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtNTAlKTtcclxuICAgIG92ZXJmbG93OiBoaWRkZW47XHJcblxyXG4gICAgLm91dGxpbmUtaWNvbiB7XHJcbiAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcclxuICAgICAgei1pbmRleDogMjtcclxuICAgICAgdG9wOiAwO1xyXG4gICAgICBsZWZ0OiAwO1xyXG4gICAgfVxyXG5cclxuICAgICY6aG92ZXIge1xyXG4gICAgICBjb2xvcjogQHRoaXJkX3RleHRfY29sb3I7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAmX19tYWluIHtcclxuICAgIGZsZXg6IDE7XHJcbiAgICBvdmVyZmxvdzogYXV0bztcclxuXHJcbiAgICAmLm92ZXJmbG93LWhpZGRlbiB7XHJcbiAgICAgIG92ZXJmbG93OiBoaWRkZW47XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAmX19mb290ZXIge1xyXG4gICAgbWFyZ2luOiAwIGF1dG87XHJcbiAgICB0ZXh0LWFsaWduOiByaWdodDtcclxuICAgIG92ZXJmbG93OiBoaWRkZW47XHJcbiAgfVxyXG5cclxuICAmX19vdmVybGF5IHtcclxuICAgIGNvbnRlbnQ6ICcnO1xyXG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xyXG4gICAgei1pbmRleDogMTtcclxuICAgIHRvcDogMDtcclxuICAgIGxlZnQ6IDA7XHJcbiAgICB3aWR0aDogMTAwJTtcclxuICAgIGhlaWdodDogMTAwJTtcclxuICAgIGJhY2tncm91bmQtY29sb3I6IEB3aGl0ZTtcclxuICAgIG9wYWNpdHk6IDAuMTtcclxuICAgIG92ZXJmbG93OiBoaWRkZW47XHJcbiAgfVxyXG5cclxuICAmX3J0bCxcclxuICAmX2x0ciB7XHJcbiAgICAmLm91dGxpbmUtZHJhd2VyIHtcclxuICAgICAgJl90aW55IHtcclxuICAgICAgICB3aWR0aDogMjgwcHg7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgICZfbWluaSB7XHJcbiAgICAgICAgd2lkdGg6IDQ4MHB4O1xyXG4gICAgICB9XHJcblxyXG4gICAgICAmX3NtYWxsIHtcclxuICAgICAgICB3aWR0aDogNTQwcHg7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgICZfcmVndWxhciB7XHJcbiAgICAgICAgd2lkdGg6IDY4MHB4O1xyXG4gICAgICB9XHJcblxyXG4gICAgICAmX21lZGl1bSB7XHJcbiAgICAgICAgd2lkdGg6IDcyMHB4O1xyXG4gICAgICB9XHJcblxyXG4gICAgICAmX2xhcmdlIHtcclxuICAgICAgICB3aWR0aDogOTYwcHg7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gICZfcnRsIHtcclxuICAgIGJvcmRlci1sZWZ0OiAxcHggc29saWQgQHByaW1hcnlfYm9yZGVyX2NvbG9yO1xyXG5cclxuICAgICYub3V0bGluZS1kcmF3ZXIge1xyXG4gICAgICAmX3Rpbnkge1xyXG4gICAgICAgICYub3V0bGluZS1kcmF3ZXJfY2xvc2VkIHtcclxuICAgICAgICAgIHJpZ2h0OiAtMjkwcHg7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICAmX21pbmkge1xyXG4gICAgICAgICYub3V0bGluZS1kcmF3ZXJfY2xvc2VkIHtcclxuICAgICAgICAgIHJpZ2h0OiAtNDkwcHg7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICAmX3NtYWxsIHtcclxuICAgICAgICAmLm91dGxpbmUtZHJhd2VyX2Nsb3NlZCB7XHJcbiAgICAgICAgICByaWdodDogLTU1MHB4O1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgJl9yZWd1bGFyIHtcclxuICAgICAgICAmLm91dGxpbmUtZHJhd2VyX2Nsb3NlZCB7XHJcbiAgICAgICAgICByaWdodDogLTY5MHB4O1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgJl9tZWRpdW0ge1xyXG4gICAgICAgICYub3V0bGluZS1kcmF3ZXJfY2xvc2VkIHtcclxuICAgICAgICAgIHJpZ2h0OiAtNzMwcHg7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICAmX2xhcmdlIHtcclxuICAgICAgICAmLm91dGxpbmUtZHJhd2VyX2Nsb3NlZCB7XHJcbiAgICAgICAgICByaWdodDogLTk3MHB4O1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgJl9sdHIge1xyXG4gICAgYm9yZGVyLXJpZ2h0OiAxcHggc29saWQgQHByaW1hcnlfYm9yZGVyX2NvbG9yO1xyXG5cclxuICAgICYub3V0bGluZS1kcmF3ZXIge1xyXG4gICAgICAmX3Rpbnkge1xyXG4gICAgICAgICYub3V0bGluZS1kcmF3ZXJfY2xvc2VkIHtcclxuICAgICAgICAgIGxlZnQ6IC0yOTBweDtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgICZfbWluaSB7XHJcbiAgICAgICAgJi5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xyXG4gICAgICAgICAgbGVmdDogLTQ5MHB4O1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgJl9zbWFsbCB7XHJcbiAgICAgICAgJi5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xyXG4gICAgICAgICAgbGVmdDogLTU1MHB4O1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgJl9yZWd1bGFyIHtcclxuICAgICAgICAmLm91dGxpbmUtZHJhd2VyX2Nsb3NlZCB7XHJcbiAgICAgICAgICBsZWZ0OiAtNjkwcHg7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICAmX21lZGl1bSB7XHJcbiAgICAgICAgJi5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xyXG4gICAgICAgICAgbGVmdDogLTczMHB4O1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgJl9sYXJnZSB7XHJcbiAgICAgICAgJi5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xyXG4gICAgICAgICAgbGVmdDogLTk3MHB4O1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgJl90dGIsXHJcbiAgJl9idHQge1xyXG4gICAgbGVmdDogMDtcclxuICAgIHdpZHRoOiAxMDAlO1xyXG5cclxuICAgICYub3V0bGluZS1kcmF3ZXIge1xyXG4gICAgICAmX3Rpbnkge1xyXG4gICAgICAgIGhlaWdodDogMjQwcHg7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgICZfbWluaSB7XHJcbiAgICAgICAgaGVpZ2h0OiAzMjBweDtcclxuICAgICAgfVxyXG5cclxuICAgICAgJl9zbWFsbCB7XHJcbiAgICAgICAgaGVpZ2h0OiAzNjBweDtcclxuICAgICAgfVxyXG5cclxuICAgICAgJl9yZWd1bGFyIHtcclxuICAgICAgICBoZWlnaHQ6IDQwMHB4O1xyXG4gICAgICB9XHJcblxyXG4gICAgICAmX21lZGl1bSB7XHJcbiAgICAgICAgaGVpZ2h0OiA0NDBweDtcclxuICAgICAgfVxyXG5cclxuICAgICAgJl9sYXJnZSB7XHJcbiAgICAgICAgaGVpZ2h0OiA0ODBweDtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgJl90dGIge1xyXG4gICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIEBwcmltYXJ5X2JvcmRlcl9jb2xvcjtcclxuXHJcbiAgICAmLm91dGxpbmUtZHJhd2VyIHtcclxuICAgICAgJl90aW55IHtcclxuICAgICAgICAmLm91dGxpbmUtZHJhd2VyX2Nsb3NlZCB7XHJcbiAgICAgICAgICB0b3A6IC0yNTBweDtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgICZfbWluaSB7XHJcbiAgICAgICAgJi5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xyXG4gICAgICAgICAgdG9wOiAtMzMwcHg7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICAmX3NtYWxsIHtcclxuICAgICAgICAmLm91dGxpbmUtZHJhd2VyX2Nsb3NlZCB7XHJcbiAgICAgICAgICB0b3A6IC0zNzBweDtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgICZfcmVndWxhciB7XHJcbiAgICAgICAgJi5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xyXG4gICAgICAgICAgdG9wOiAtNDEwcHg7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICAmX21lZGl1bSB7XHJcbiAgICAgICAgJi5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xyXG4gICAgICAgICAgdG9wOiAtNDUwcHg7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICAmX2xhcmdlIHtcclxuICAgICAgICAmLm91dGxpbmUtZHJhd2VyX2Nsb3NlZCB7XHJcbiAgICAgICAgICB0b3A6IC00OTBweDtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gICZfYnR0IHtcclxuICAgIHRvcDogaW5pdGlhbDtcclxuICAgIGJvcmRlci10b3A6IDFweCBzb2xpZCBAcHJpbWFyeV9ib3JkZXJfY29sb3I7XHJcblxyXG4gICAgJi5vdXRsaW5lLWRyYXdlciB7XHJcbiAgICAgICZfdGlueSB7XHJcbiAgICAgICAgJi5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xyXG4gICAgICAgICAgYm90dG9tOiAtMjUwcHg7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICAmX21pbmkge1xyXG4gICAgICAgICYub3V0bGluZS1kcmF3ZXJfY2xvc2VkIHtcclxuICAgICAgICAgIGJvdHRvbTogLTMzMHB4O1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgJl9zbWFsbCB7XHJcbiAgICAgICAgJi5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xyXG4gICAgICAgICAgYm90dG9tOiAtMzcwcHg7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICAmX3JlZ3VsYXIge1xyXG4gICAgICAgICYub3V0bGluZS1kcmF3ZXJfY2xvc2VkIHtcclxuICAgICAgICAgIGJvdHRvbTogLTQxMHB4O1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgJl9tZWRpdW0ge1xyXG4gICAgICAgICYub3V0bGluZS1kcmF3ZXJfY2xvc2VkIHtcclxuICAgICAgICAgIGJvdHRvbTogLTQ1MHB4O1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgJl9sYXJnZSB7XHJcbiAgICAgICAgJi5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xyXG4gICAgICAgICAgYm90dG9tOiAtNDkwcHg7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAmX29wZW5lZCB7XHJcbiAgICB2aXNpYmlsaXR5OiB2aXNpYmxlO1xyXG4gICAgei1pbmRleDogdmFyKC0tb3V0bGluZS16SW5kZXgpO1xyXG5cclxuICAgICYub3V0bGluZS1kcmF3ZXIge1xyXG4gICAgICBwb3NpdGlvbjogZml4ZWQ7XHJcblxyXG4gICAgICAmX3J0bCB7XHJcbiAgICAgICAgcmlnaHQ6IDA7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgICZfbHRyIHtcclxuICAgICAgICBsZWZ0OiAwO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAmX3R0YiB7XHJcbiAgICAgICAgdG9wOiAwO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAmX2J0dCB7XHJcbiAgICAgICAgYm90dG9tOiAwO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAmX29mZnNldCB7XHJcbiAgICAmLm91dGxpbmUtZHJhd2VyIHtcclxuICAgICAgJl9ydGwsXHJcbiAgICAgICZfbHRyIHtcclxuICAgICAgICBoZWlnaHQ6IGNhbGMoMTAwJSAtIDRlbSk7XHJcbiAgICAgICAgdG9wOiA1MCU7XHJcbiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC01MCUpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAmX3R0YixcclxuICAgICAgJl9idHQge1xyXG4gICAgICAgIHdpZHRoOiBjYWxjKDEwMCUgLSA0ZW0pO1xyXG4gICAgICAgIGxlZnQ6IDUwJTtcclxuICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTUwJSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgICZfb3BlbmVkIHtcclxuICAgICAgICAmLm91dGxpbmUtZHJhd2VyIHtcclxuICAgICAgICAgICZfcnRsIHtcclxuICAgICAgICAgICAgcmlnaHQ6IDJlbTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAmX2x0ciB7XHJcbiAgICAgICAgICAgIGxlZnQ6IDJlbTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAmX3R0YiB7XHJcbiAgICAgICAgICAgIHRvcDogMmVtO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICZfYnR0IHtcclxuICAgICAgICAgICAgYm90dG9tOiAyZW07XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAmX2F1dG8ge1xyXG4gICAgJi5vdXRsaW5lLWRyYXdlciB7XHJcbiAgICAgICZfcnRsLFxyXG4gICAgICAmX2x0ciB7XHJcbiAgICAgICAgaGVpZ2h0OiBhdXRvO1xyXG4gICAgICAgIG1heC1oZWlnaHQ6IGNhbGMoMTAwJSAtIDRlbSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gICZfZnVsbCB7XHJcbiAgICBwYWRkaW5nOiAwO1xyXG4gIH1cclxufVxyXG4iLCIvKipcclxuICogc2hhZG93Lmxlc3MgLSDpmLTlvbHmoLflvI/orr7nva4gbWl4aW54IOWHveaVsFxyXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XHJcbiAqIENyZWF0ZWQgQnk6IFlhb2hhaXhpYW9cclxuICogVXBkYXRlOiAyMDIyLjMuMjBcclxuICovXHJcbkBpbXBvcnQgJy4vY29sb3JzJztcclxuXHJcbi8qID09PT09PSDpmLTlvbHmoLflvI/orr7nva7lh73mlbAgPT09PT09ICovXHJcbi5zaGFkb3coQG9mZnNldDogMCAwIDZweCAxcHgsIEBjb2xvcjogQHByaW1hcnlfYm9yZGVyX2NvbG9yKSB7XHJcbiAgYm94LXNoYWRvdzogQG9mZnNldCBAY29sb3I7XHJcbn1cclxuXHJcbi5zaGFkb3dfcmVndWxhcihAY29sb3I6IEBwcmltYXJ5X2JvcmRlcl9jb2xvcikge1xyXG4gIC5zaGFkb3coMCAwIDZweCAxcHgsIEBjb2xvcik7XHJcbn1cclxuXHJcbi5zaGFkb3dfbGFyZ2UoQGNvbG9yOiBAcHJpbWFyeV9ib3JkZXJfY29sb3IpIHtcclxuICAuc2hhZG93KDAgMCAxMnB4IDFweCwgQGNvbG9yKTtcclxufVxyXG5cclxuLnNoYWRvd19saWdodF9yZWd1bGFyKCkge1xyXG4gIC5zaGFkb3dfcmVndWxhcigpO1xyXG59XHJcblxyXG4uc2hhZG93X2xpZ2h0X2xhcmdlKCkge1xyXG4gIC5zaGFkb3dfbGFyZ2UoKTtcclxufVxyXG5cclxuLnNoYWRvd19kYXJrX3JlZ3VsYXIoKSB7XHJcbiAgLnNoYWRvd19yZWd1bGFyKEBzZWNvbmRhcnlfYm9yZGVyX2NvbG9yKTtcclxufVxyXG5cclxuLnNoYWRvd19kYXJrX2xhcmdlKCkge1xyXG4gIC5zaGFkb3dfbGFyZ2UoQHNlY29uZGFyeV9ib3JkZXJfY29sb3IpO1xyXG59XHJcbiIsIkBpbXBvcnQgJy4vdmFyaWFibGVzJztcclxuQGltcG9ydCAnLi9jb2xvcnMnO1xyXG5AaW1wb3J0ICcuL2VsbGlwc2lzJztcclxuXHJcbi5vdXRsaW5lLW5hdmlnYXRvciB7XHJcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xyXG4gIHotaW5kZXg6IDE7XHJcbiAgbWFyZ2luOiAwO1xyXG4gIHdpZHRoOiB2YXIoLS1vdXRsaW5lLW5hdmlnYXRvci13aWR0aCk7XHJcbiAgb3ZlcmZsb3c6IGF1dG87XHJcblxyXG4gICYtcGFyZW50IHtcclxuICAgIHRyYW5zaXRpb246IDAuM3MgZWFzZS1pbi1vdXQ7XHJcbiAgfVxyXG5cclxuICAmX190aXRsZSB7XHJcbiAgICBtYXJnaW46IDAgMTZweDtcclxuICAgIGhlaWdodDogNDBweDtcclxuICAgIGxpbmUtaGVpZ2h0OiA0MHB4O1xyXG4gICAgcGFkZGluZzogMCAxNnB4O1xyXG4gICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIEBwcmltYXJ5X2JvcmRlcl9jb2xvcjtcclxuICAgIGZvbnQtc2l6ZTogMTZweDtcclxuICAgIGZvbnQtd2VpZ2h0OiA0MDA7XHJcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xyXG4gIH1cclxuXHJcbiAgJl9fbWFpbiB7XHJcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XHJcbiAgICB6LWluZGV4OiAxO1xyXG4gICAgbWFyZ2luOiAwO1xyXG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcclxuICB9XHJcblxyXG4gICZfX2xpc3QsXHJcbiAgJl9fc3ViamVjdCxcclxuICAmX19pdGVtIHtcclxuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcclxuICAgIHotaW5kZXg6IDI7XHJcbiAgICBtYXJnaW46IDA7XHJcbiAgICBwYWRkaW5nOiAwO1xyXG4gICAgbGlzdC1zdHlsZS10eXBlOiBub25lO1xyXG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcclxuICB9XHJcblxyXG4gICZfX2xpc3Qge1xyXG4gICAgcGFkZGluZzogMC41ZW0gMDtcclxuICB9XHJcblxyXG4gICZfX3N1YmplY3Qge1xyXG4gICAgcGFkZGluZy1sZWZ0OiAxZW07XHJcbiAgfVxyXG5cclxuICAmX19pdGVtIHtcclxuICAgIG1hcmdpbjogMDtcclxuICAgIGxpbmUtaGVpZ2h0OiAzMHB4O1xyXG4gICAgZm9udC1zaXplOiAxM3B4O1xyXG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcclxuICB9XHJcblxyXG4gICZfX3BsYWNlaG9sZGVyIHtcclxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcclxuICAgIHotaW5kZXg6IDE7XHJcbiAgICB0b3A6IDA7XHJcbiAgICBsZWZ0OiAwO1xyXG4gICAgd2lkdGg6IDEwMCU7XHJcbiAgICBoZWlnaHQ6IDMwcHg7XHJcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAaG92ZXJfYmdfY29sb3I7XHJcbiAgICBib3JkZXItbGVmdDogMnB4IHNvbGlkIEBzdWNjZXNzX2NvbG9yO1xyXG4gICAgdHJhbnNpdGlvbi1kdXJhdGlvbjogMC4ycztcclxuICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XHJcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xyXG4gIH1cclxuXHJcbiAgJl9fYW5jaG9yIHtcclxuICAgIC5lbGxpcHNpcygxKTtcclxuICAgIGRpc3BsYXk6IGJsb2NrO1xyXG4gICAgcGFkZGluZzogMCAxLjVlbTtcclxuXHJcbiAgICAmOmxpbmssXHJcbiAgICAmOnZpc2l0ZWQsXHJcbiAgICAmOmhvdmVyIHtcclxuICAgICAgdGV4dC1kZWNvcmF0aW9uOiBub25lO1xyXG4gICAgICBjb2xvcjogQHNlY29uZGFyeV90ZXh0X2NvbG9yO1xyXG4gICAgfVxyXG5cclxuICAgICY6aG92ZXIge1xyXG4gICAgICBjb2xvcjogQHN1Y2Nlc3NfY29sb3I7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAmX19jb2RlIHtcclxuICAgIHBhZGRpbmctcmlnaHQ6IDAuNWVtO1xyXG4gIH1cclxuXHJcbiAgJl9oaWdobGlnaHQge1xyXG4gICAgJi5vdXRsaW5lLW5hdmlnYXRvcl9fYW5jaG9yIHtcclxuICAgICAgJjpsaW5rLFxyXG4gICAgICAmOnZpc2l0ZWQsXHJcbiAgICAgICY6aG92ZXIge1xyXG4gICAgICAgIGNvbG9yOiBAc3VjY2Vzc19jb2xvcjtcclxuICAgICAgICBmb250LXdlaWdodDogYm9sZDtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgJl9zdGlja3ksXHJcbiAgJl9maXhlZCB7XHJcbiAgICBkaXNwbGF5OiBmbGV4O1xyXG4gICAgZmxleC13cmFwOiBub3dyYXA7XHJcbiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xyXG4gICAgei1pbmRleDogdmFyKC0tb3V0bGluZS16SW5kZXgpO1xyXG4gICAgdG9wOiAwO1xyXG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcclxuXHJcbiAgICAub3V0bGluZS1uYXZpZ2F0b3Ige1xyXG4gICAgICAmX190aXRsZSxcclxuICAgICAgJl9fbWFpbiB7XHJcbiAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcclxuICAgICAgfVxyXG5cclxuICAgICAgJl9fdGl0bGUge1xyXG4gICAgICAgIGZsZXgtc2hyaW5rOiAwO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAmX19tYWluIHtcclxuICAgICAgICBmbGV4OiAxO1xyXG4gICAgICAgIG92ZXJmbG93OiBhdXRvO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAmX3N0aWNreSB7XHJcbiAgICBwb3NpdGlvbjogc3RpY2t5O1xyXG4gICAgbWF4LWhlaWdodDogdmFyKC0tb3V0bGluZS1zdGlja3ktaGVpZ2h0KTtcclxuICB9XHJcblxyXG4gICZfZml4ZWQge1xyXG4gICAgcG9zaXRpb246IGZpeGVkO1xyXG4gICAgbWF4LWhlaWdodDogMTAwJTtcclxuICB9XHJcblxyXG4gICZfaGlkZGVuIHtcclxuICAgIGRpc3BsYXk6IG5vbmU7XHJcbiAgfVxyXG5cclxuICAmX2ZvbGRlZCB7XHJcbiAgICB3aWR0aDogMDtcclxuICAgIG92ZXJmbG93OiBoaWRkZW47XHJcbiAgfVxyXG59XHJcbiIsIi8qKlxyXG4gKiBlbGxpcHNpcy5sZXNzIC0g5paH5pys55yB55WlIG1peGlueCDlh73mlbBcclxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxyXG4gKiBDcmVhdGVkIEJ5OiBZYW9oYWl4aWFvXHJcbiAqIFVwZGF0ZTogMjAyMi4zLjExXHJcbiAqL1xyXG5cclxuLyogPT09PT09IOaWh+acrOecgeeVpeWHveaVsCA9PT09PT0gKi9cclxuLmVsbGlwc2lzIChAbGluZXMpIHdoZW4gKEBsaW5lcz0xKSB7XHJcbiAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcclxuICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpcztcclxuICBvdmVyZmxvdzogaGlkZGVuO1xyXG59XHJcblxyXG4uZWxsaXBzaXMgKEBsaW5lcykgd2hlbiAoQGxpbmVzPj0yKSB7XHJcbiAgLXdlYmtpdC1saW5lLWNsYW1wOiBAbGluZXM7XHJcbiAgZGlzcGxheTogYm94O1xyXG4gIC13ZWJraXQtYm94LW9yaWVudDogdmVydGljYWw7XHJcbiAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7XHJcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcclxufVxyXG4iLCJAaW1wb3J0ICcuL2NvbG9ycyc7XHJcbkBpbXBvcnQgJy4vZm9udCc7XHJcbkBpbXBvcnQgJy4vbWl4aW5zJztcclxuXHJcbi5vdXRsaW5lLXJlYWRlciB7XHJcbiAgJl9fcHJvZ3Jlc3Mge1xyXG4gICAgcG9zaXRpb246IGZpeGVkO1xyXG4gICAgdG9wOiAwO1xyXG4gICAgbGVmdDogMDtcclxuICAgIHotaW5kZXg6IDM7XHJcbiAgICBoZWlnaHQ6IDRweDtcclxuICAgIHdpZHRoOiAxMDAlO1xyXG4gICAgYmFja2dyb3VuZC1jb2xvcjogQHByaW1hcnlfY29sb3I7XHJcbiAgICBzY2FsZTogMCAxO1xyXG4gICAgdHJhbnNmb3JtLW9yaWdpbjogbGVmdDtcclxuICAgIGFuaW1hdGlvbjogb3V0bGluZS1yZWFkZXItcHJvZ3Jlc3MgbGluZWFyO1xyXG4gICAgYW5pbWF0aW9uLXRpbWVsaW5lOiAtLVByb2dyZXNzVGltZWxpbmU7XHJcbiAgfVxyXG5cclxuICAmX19wYXBlciB7XHJcbiAgICAuc2hhZG93X2RhcmtfcmVndWxhcigpO1xyXG4gICAgbWFyZ2luOiAyZW0gYXV0bztcclxuICAgIG1heC13aWR0aDogMTIwMHB4O1xyXG4gICAgcGFkZGluZzogMy4yZW07XHJcbiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xyXG4gICAgYmFja2dyb3VuZC1jb2xvcjogQHdoaXRlO1xyXG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcclxuICB9XHJcblxyXG4gICZfX3RpdGxlIHtcclxuICAgIG1hcmdpbjogMC42N2VtIDA7XHJcbiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XHJcbiAgICBmb250LWZhbWlseTogQGZvbnRfdGV4dF9mYW1pbHk7XHJcbiAgICBmb250LXdlaWdodDogbm9ybWFsO1xyXG4gICAgbGluZS1oZWlnaHQ6IDEuM2VtO1xyXG4gICAgZm9udC1zaXplOiA0LjJlbTtcclxuICAgIG92ZXJmbG93OiBoaWRkZW47XHJcbiAgfVxyXG5cclxuICAmX19hcnRpY2xlIHtcclxuICAgIC5vdXRsaW5lLXJlYWRlcl9fcHJvZ3Jlc3Mge1xyXG4gICAgICBkaXNwbGF5OiBub25lO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgJl9oaWRkZW4ge1xyXG4gICAgZGlzcGxheTogbm9uZTtcclxuXHJcbiAgICAmLm91dGxpbmUtcmVhZGVyX3NpYmxpbmcge1xyXG4gICAgICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7XHJcblxyXG4gICAgICAmLndyYXBwZXIge1xyXG4gICAgICAgICYucG9zdCB7XHJcbiAgICAgICAgICBkaXNwbGF5OiBub25lO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgJi0tcmVhZGluZyB7XHJcbiAgICBkaXNwbGF5OiBibG9jaztcclxuICAgIHBvc2l0aW9uOiBmaXhlZDtcclxuICAgIHotaW5kZXg6IDI7XHJcbiAgICB0b3A6IDA7XHJcbiAgICBsZWZ0OiAwO1xyXG4gICAgd2lkdGg6IDEwMCU7XHJcbiAgICBoZWlnaHQ6IDEwMCU7XHJcbiAgICBtYXJnaW46IDA7XHJcbiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xyXG4gICAgcGFkZGluZzogM2VtIDRlbTtcclxuICAgIGJhY2tncm91bmQtY29sb3I6IEBiZ19jb2xvcjtcclxuICAgIHNjcm9sbC10aW1lbGluZS1uYW1lOiAtLVByb2dyZXNzVGltZWxpbmU7XHJcbiAgICBvdmVyZmxvdzogc2Nyb2xsO1xyXG4gIH1cclxufVxyXG5cclxuQGtleWZyYW1lcyBvdXRsaW5lLXJlYWRlci1wcm9ncmVzcyB7XHJcbiAgdG8ge1xyXG4gICAgc2NhbGU6IDEgMTtcclxuICB9XHJcbn1cclxuXHJcbkBtZWRpYSAobWF4LXdpZHRoOiA1MDBweCkge1xyXG4gIC5vdXRsaW5lIHtcclxuICAgICYtcmVhZGVyIHtcclxuICAgICAgb3ZlcmZsb3c6IGhpZGRlbjtcclxuXHJcbiAgICAgIC5vdXRsaW5lLXRvb2xiYXIge1xyXG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XHJcbiAgICAgICAgZmxleC1kaXJlY3Rpb246IHJvdztcclxuICAgICAgICBmbGV4LXdyYXA6IG5vd3JhcDtcclxuICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xyXG4gICAgICAgIGFsaWduLXNlbGY6IGF1dG87XHJcbiAgICAgICAgdG9wOiAxMDAlO1xyXG4gICAgICAgIHJpZ2h0OiAwO1xyXG4gICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtNDhweCk7XHJcbiAgICAgICAgd2lkdGg6IDEwMCU7XHJcbiAgICAgICAgaGVpZ2h0OiA0OHB4O1xyXG4gICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XHJcbiAgICAgICAgYm9yZGVyLXRvcDogMXB4IHNvbGlkIEBib3JkZXJfY29sb3I7XHJcbiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogQHdoaXRlO1xyXG4gICAgICAgIHBhZGRpbmc6IDAgMTZweDtcclxuXHJcbiAgICAgICAgJl9fYnV0dG9uIHtcclxuICAgICAgICAgIC5yYWRpdXNfbm9uZSgpO1xyXG4gICAgICAgICAgZmxleDogMTtcclxuICAgICAgICAgIGJvcmRlcjogbm9uZTtcclxuICAgICAgICAgIGJveC1zaGFkb3c6IG5vbmU7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICAmLS1yZWFkaW5nIHtcclxuICAgICAgICBwYWRkaW5nOiAwO1xyXG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6IEB3aGl0ZTtcclxuICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xyXG4gICAgICB9XHJcblxyXG4gICAgICAmX19wYXBlciB7XHJcbiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xyXG4gICAgICAgIHotaW5kZXg6IDE7XHJcbiAgICAgICAgbWFyZ2luOiAwO1xyXG4gICAgICAgIHBhZGRpbmc6IDA7XHJcbiAgICAgICAgaGVpZ2h0OiAxMDAlO1xyXG4gICAgICAgIGJveC1zaGFkb3c6IG5vbmU7XHJcbiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjtcclxuICAgICAgfVxyXG5cclxuICAgICAgJl9fdGl0bGUge1xyXG4gICAgICAgIC5lbGxpcHNpcygxKTtcclxuICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XHJcbiAgICAgICAgei1pbmRleDogMztcclxuICAgICAgICB0b3A6IDA7XHJcbiAgICAgICAgbGVmdDogMDtcclxuICAgICAgICBtYXJnaW46IDA7XHJcbiAgICAgICAgd2lkdGg6IDEwMCU7XHJcbiAgICAgICAgaGVpZ2h0OiA0OHB4O1xyXG4gICAgICAgIGxpbmUtaGVpZ2h0OiA0OHB4O1xyXG4gICAgICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCBAYm9yZGVyX2NvbG9yO1xyXG4gICAgICAgIGZvbnQtc2l6ZTogMS44ZW07XHJcbiAgICAgICAgZm9udC13ZWlnaHQ6IDQwMDtcclxuICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAd2hpdGU7XHJcbiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjtcclxuICAgICAgfVxyXG5cclxuICAgICAgJl9fYXJ0aWNsZSB7XHJcbiAgICAgICAgbWFyZ2luOiA0OHB4IDA7XHJcbiAgICAgICAgaGVpZ2h0OiBjYWxjKDEwMCUgLSA5NnB4KTtcclxuICAgICAgICBwYWRkaW5nOiAwIDEuMjVlbTtcclxuICAgICAgICBzY3JvbGwtdGltZWxpbmUtbmFtZTogLS1Nb2JpbGVQcm9ncmVzc1RpbWVsaW5lO1xyXG4gICAgICAgIG92ZXJmbG93LXg6IGhpZGRlbjtcclxuICAgICAgICBvdmVyZmxvdy15OiBzY3JvbGw7XHJcblxyXG4gICAgICAgIC5vdXRsaW5lLXJlYWRlcl9fcHJvZ3Jlc3Mge1xyXG4gICAgICAgICAgei1pbmRleDogNDtcclxuICAgICAgICAgIGFuaW1hdGlvbjogb3V0bGluZS1yZWFkZXItcHJvZ3Jlc3MgbGluZWFyO1xyXG4gICAgICAgICAgYW5pbWF0aW9uLXRpbWVsaW5lOiAtLU1vYmlsZVByb2dyZXNzVGltZWxpbmU7XHJcbiAgICAgICAgICBkaXNwbGF5OiBibG9jaztcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcbn1cclxuXHJcbkBtZWRpYSBwcmludCB7XHJcbiAgaHRtbCxcclxuICBib2R5IHtcclxuICAgIC8qIOaJk+WNsOeahOWfuuehgOWtl+S9k+Wkp+WwjyAqL1xyXG4gICAgZm9udC1zaXplOiAxMnB0O1xyXG4gICAgLyog5pi+56S66K6+572u5paH5a2X6aKc6Imy5ZKM6IOM5pmv6aKc6ImyICovXHJcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAd2hpdGU7XHJcbiAgICBjb2xvcjogQHByaW1hcnlfdGV4dF9jb2xvcjtcclxuICAgIGhlaWdodDogaW5pdGlhbCAhaW1wb3J0YW50O1xyXG4gIH1cclxuXHJcbiAgLyog6K6+572u6ZO+5o6l5qC35byPICovXHJcbiAgYTpsaW5rLFxyXG4gIGE6dmlzaXRlZCxcclxuICBhOmhvdmVyIHtcclxuICAgIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lICFpbXBvcnRhbnQ7XHJcbiAgICBjb2xvcjogQHByaW1hcnlfY29sb3I7XHJcbiAgfVxyXG5cclxuICAvKiDpmpDol4/lqpLkvZPmoIfnrb4gKi9cclxuICB2aWRlbyxcclxuICBhdWRpbyB7XHJcbiAgICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7XHJcbiAgfVxyXG5cclxuICAvKiDnoa7kv53ooajmoLzlnKjmiZPljbDml7bnmoTovrnmoYblkozlr7npvZDmlrnlvI/muIXmmbAgKi9cclxuICB0YWJsZSB7XHJcbiAgICB3aWR0aDogMTAwJTtcclxuICAgIGJvcmRlci1jb2xsYXBzZTogY29sbGFwc2U7XHJcbiAgfVxyXG4gIHRoLFxyXG4gIHRkIHtcclxuICAgIGJvcmRlcjogMXB4IHNvbGlkIEBwcmltYXJ5X2JvcmRlcl9jb2xvcjtcclxuICAgIHBhZGRpbmc6IDhweCAyMHB4O1xyXG4gIH1cclxuXHJcbiAgLm91dGxpbmUge1xyXG4gICAgJi1tZXNzYWdlLFxyXG4gICAgJi10b29sYmFyIHtcclxuICAgICAgLyog6ZqQ6JeP5LqG5bel5YW35qCP5ZKM5L+h5oGv5o+Q56S65qGGICovXHJcbiAgICAgIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDtcclxuICAgIH1cclxuXHJcbiAgICAmLXJlYWRlciB7XHJcbiAgICAgIGRpc3BsYXk6IGJsb2NrICFpbXBvcnRhbnQ7XHJcbiAgICAgIG92ZXJmbG93OiBoaWRkZW47XHJcblxyXG4gICAgICAmX190aXRsZSB7XHJcbiAgICAgICAgbWFyZ2luOiAxMy40cHQgMCAyOHB0ICFpbXBvcnRhbnQ7XHJcbiAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyICFpbXBvcnRhbnQ7XHJcbiAgICAgICAgZm9udC1zaXplOiAzMnB0ICFpbXBvcnRhbnQ7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8qIOWPlua2iOS6hue7neWvueWumuS9jSAqL1xyXG4gICAgICAmLS1yZWFkaW5nIHtcclxuICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmUgIWltcG9ydGFudDtcclxuICAgICAgICBoZWlnaHQ6IGF1dG8gIWltcG9ydGFudDtcclxuICAgICAgICBwYWRkaW5nOiAwICFpbXBvcnRhbnQ7XHJcbiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogQHdoaXRlO1xyXG4gICAgICAgIG92ZXJmbG93OiBoaWRkZW4gIWltcG9ydGFudDtcclxuICAgICAgfVxyXG5cclxuICAgICAgLyog6ZqQ6JeP6ZiF6K+76L+b5bqm5p2hICovXHJcbiAgICAgICZfX3Byb2dyZXNzIHtcclxuICAgICAgICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8qIOaJk+WNsOaXtuS4jeaYvuekuuato+aWhyBET00g55qE6Zi05b2x5pWI5p6cICovXHJcbiAgICAgICZfX3BhcGVyIHtcclxuICAgICAgICBib3gtc2hhZG93OiBub25lO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBwcmUge1xyXG4gICAgICAgIHBhZGRpbmc6IDFlbSAhaW1wb3J0YW50O1xyXG4gICAgICAgIGJvcmRlcjogMXB4IHNvbGlkIEBib3JkZXJfY29sb3IgIWltcG9ydGFudDtcclxuICAgICAgICBib3JkZXItcmFkaXVzOiA0cHggIWltcG9ydGFudDtcclxuICAgICAgfVxyXG5cclxuICAgICAgcHJlLFxyXG4gICAgICBjb2RlIHtcclxuICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAd2hpdGUgIWltcG9ydGFudDtcclxuICAgICAgfVxyXG5cclxuICAgICAgdGFibGUsXHJcbiAgICAgIGltZyxcclxuICAgICAgc3ZnIHtcclxuICAgICAgICBicmVhay1pbnNpZGU6IGF2b2lkO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvKiDmiYDmnInmlofnq6DlhoXlrrkgRE9NIOebuOWFs+eahOmCu+WxheiKgueCuemDvemakOiXj+S6hiAqL1xyXG4gICAgICAmX3NpYmxpbmcge1xyXG4gICAgICAgIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxufVxyXG4iLCIvKipcclxuICogcmFkaXVzLmxlc3MgLSDlnIbop5Lorr7nva4gbWl4aW54IOWHveaVsFxyXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XHJcbiAqIENyZWF0ZWQgQnk6IFlhb2hhaXhpYW9cclxuICogVXBkYXRlOiAyMDI0LjQuMTZcclxuICovXHJcblxyXG4vKiA9PT09PT0g5ZyG6KeS5qC35byP6K6+572u5Ye95pWwID09PT09PSAqL1xyXG4ucmFkaXVzKEBudW06IDJweCkge1xyXG4gIGJvcmRlci1yYWRpdXM6IEBudW07XHJcbn1cclxuXHJcbi5yYWRpdXNfbm9uZSgpIHtcclxuICAucmFkaXVzKDApO1xyXG59XHJcblxyXG4ucmFkaXVzX21pbmkoKSB7XHJcbiAgLnJhZGl1cygycHgpO1xyXG59XHJcblxyXG4ucmFkaXVzX3NtYWxsKCkge1xyXG4gIC5yYWRpdXMoM3B4KTtcclxufVxyXG5cclxuLnJhZGl1c19yZWd1bGFyKCkge1xyXG4gIC5yYWRpdXMoNHB4KTtcclxufVxyXG5cclxuLnJhZGl1c19tZWRpdW0oKSB7XHJcbiAgLnJhZGl1cyg1cHgpO1xyXG59XHJcblxyXG4ucmFkaXVzX2xhcmdlKCkge1xyXG4gIC5yYWRpdXMoMTBweCk7XHJcbn1cclxuXHJcbi5yYWRpdXNfaHVnZSgpIHtcclxuICAucmFkaXVzKDE2cHgpO1xyXG59XHJcblxyXG4ucmFkaXVzX3JvdW5kKCkge1xyXG4gIC5yYWRpdXMoMzBweCk7XHJcbn1cclxuIiwiLyogPT09PT09PT09PSBidXR0b25zLnRoZW1lIC0g5oyJ6ZKu5a+86Iiq5qC35byPID09PT09PT09PT0gKi9cclxuQGltcG9ydCAnLi9jb2xvcnMnO1xyXG5AaW1wb3J0ICcuL3NoYWRvdyc7XHJcblxyXG4ub3V0bGluZS10b29sYmFyIHtcclxuICBwb3NpdGlvbjogZml4ZWQ7XHJcbiAgei1pbmRleDogOTk5OTk7XHJcbiAgbWFyZ2luOiAwO1xyXG4gIHRyYW5zaXRpb24tZHVyYXRpb246IDAuM3M7XHJcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcclxuXHJcbiAgJl9fYnV0dG9uIHtcclxuICAgIC5zaGFkb3dfbGlnaHRfcmVndWxhcigpO1xyXG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xyXG4gICAgei1pbmRleDogMTtcclxuICAgIG1hcmdpbjogMTBweDtcclxuICAgIHdpZHRoOiAzNnB4O1xyXG4gICAgaGVpZ2h0OiAzNnB4O1xyXG4gICAgYm9yZGVyOiAxcHggc29saWQgQHByaW1hcnlfYm9yZGVyX2NvbG9yO1xyXG4gICAgYm9yZGVyLXJhZGl1czogM3B4O1xyXG4gICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcclxuICAgIGJhY2tncm91bmQtY29sb3I6IEB3aGl0ZTtcclxuICAgIGN1cnNvcjogcG9pbnRlcjtcclxuICAgIHRleHQtYWxpZ246IGNlbnRlcjtcclxuICAgIGNvbG9yOiBAZm91cnRoX3RleHRfY29sb3I7XHJcbiAgICB0cmFuc2l0aW9uOiBhbGwgMC4zcyAwLjFzIGVhc2UtaW4tb3V0O1xyXG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcclxuXHJcbiAgICAmOmhvdmVyIHtcclxuICAgICAgY29sb3I6IEBzdWNjZXNzX2NvbG9yO1xyXG4gICAgICBib3JkZXItY29sb3I6IEBzdWNjZXNzX2NvbG9yO1xyXG4gICAgICB0cmFuc2Zvcm06IHNjYWxlKDEuMzUpO1xyXG4gICAgfVxyXG5cclxuICAgICYuaGlkZSB7XHJcbiAgICAgIGRpc3BsYXk6IG5vbmU7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAmX19hbmNob3Ige1xyXG4gICAgJjpsaW5rLFxyXG4gICAgJjp2aXNpdGVkLFxyXG4gICAgJjpob3ZlciB7XHJcbiAgICAgIGNvbG9yOiBAZm91cnRoX3RleHRfY29sb3I7XHJcbiAgICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTtcclxuICAgIH1cclxuXHJcbiAgICAmOmhvdmVyIHtcclxuICAgICAgY29sb3I6IEBzdWNjZXNzX2NvbG9yO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgJl9faWNvbiB7XHJcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XHJcbiAgICB6LWluZGV4OiAyO1xyXG4gICAgdG9wOiA1MCU7XHJcbiAgICBsZWZ0OiA1MCU7XHJcbiAgICB3aWR0aDogMjBweDtcclxuICAgIGhlaWdodDogMjBweDtcclxuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIC01MCUpO1xyXG4gICAgZmlsbDogY3VycmVudGNvbG9yO1xyXG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcclxuICB9XHJcblxyXG4gICZfYWN0aXZlIHtcclxuICAgICYub3V0bGluZS10b29sYmFyIHtcclxuICAgICAgJl9fYnV0dG9uIHtcclxuICAgICAgICBjb2xvcjogQHdoaXRlO1xyXG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6IEBzdWNjZXNzX2NvbG9yO1xyXG4gICAgICAgIGJvcmRlci1jb2xvcjogQHN1Y2Nlc3NfY29sb3I7XHJcblxyXG4gICAgICAgICY6aG92ZXIge1xyXG4gICAgICAgICAgY29sb3I6IEB3aGl0ZTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAub3V0bGluZS10b29sYmFyX19hbmNob3Ige1xyXG4gICAgICAmOmxpbmssXHJcbiAgICAgICY6dmlzaXRlZCxcclxuICAgICAgJjpob3ZlciB7XHJcbiAgICAgICAgY29sb3I6IEB3aGl0ZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgJl9yb3VuZGVkIHtcclxuICAgICYub3V0bGluZS10b29sYmFyX19idXR0b24ge1xyXG4gICAgICBib3JkZXItcmFkaXVzOiAxOHB4O1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgJl9kaXNhYmxlZCB7XHJcbiAgICAmLm91dGxpbmUtdG9vbGJhcixcclxuICAgIC5vdXRsaW5lLXRvb2xiYXIge1xyXG4gICAgICAmX19hbmNob3I6bGluayxcclxuICAgICAgJl9fYW5jaG9yOnZpc2l0ZWQsXHJcbiAgICAgICZfX2FuY2hvcjpob3ZlcixcclxuICAgICAgJl9fYnV0dG9uIHtcclxuICAgICAgICBjdXJzb3I6IG5vdC1hbGxvd2VkO1xyXG4gICAgICAgIGNvbG9yOiBAZm91cnRoX3RleHRfY29sb3I7XHJcbiAgICAgICAgYm9yZGVyLWNvbG9yOiBAZm91cnRoX3RleHRfY29sb3I7XHJcblxyXG4gICAgICAgICY6aG92ZXIge1xyXG4gICAgICAgICAgY29sb3I6IEBmb3VydGhfdGV4dF9jb2xvcjtcclxuICAgICAgICAgIGJvcmRlci1jb2xvcjogQGZvdXJ0aF90ZXh0X2NvbG9yO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgJl9fYnV0dG9uIHtcclxuICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAZGlzYWJsZWRfYmdfY29sb3I7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gICZfdHRiLFxyXG4gICZfYnR0IHtcclxuICAgIGxlZnQ6IDUwJTtcclxuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgtNTAlKTtcclxuXHJcbiAgICAub3V0bGluZS10b29sYmFyX19idXR0b24ge1xyXG4gICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAmX3R0YiB7XHJcbiAgICB0b3A6IDEycHg7XHJcblxyXG4gICAgJi5vdXRsaW5lLXRvb2xiYXJfaGlkZGVuIHtcclxuICAgICAgdG9wOiAtNTZweDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gICZfYnR0IHtcclxuICAgIGJvdHRvbTogMTJweDtcclxuXHJcbiAgICAmLm91dGxpbmUtdG9vbGJhcl9oaWRkZW4ge1xyXG4gICAgICBib3R0b206IC01NnB4O1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgJl9ydGwsXHJcbiAgJl9sdHIge1xyXG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC01MCUpO1xyXG4gICAgd2lkdGg6IDU2cHg7XHJcbiAgfVxyXG5cclxuICAmX3J0bCB7XHJcbiAgICB0b3A6IDUwJTtcclxuICAgIHJpZ2h0OiAxMnB4O1xyXG5cclxuICAgICYub3V0bGluZS10b29sYmFyX2hpZGRlbiB7XHJcbiAgICAgIHJpZ2h0OiAtODZweDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gICZfbHRyIHtcclxuICAgIHRvcDogNTAlO1xyXG4gICAgbGVmdDogMTJweDtcclxuXHJcbiAgICAmLm91dGxpbmUtdG9vbGJhcl9oaWRkZW4ge1xyXG4gICAgICBsZWZ0OiAtODZweDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gICZfdHRiLFxyXG4gICZfcnRsLFxyXG4gICZfYnR0LFxyXG4gICZfbHRyIHtcclxuICAgIC5vdXRsaW5lLXRvb2xiYXJfX2J1dHRvbiB7XHJcbiAgICAgICYub3V0bGluZS10b29sYmFyX2hpZGRlbiB7XHJcbiAgICAgICAgZGlzcGxheTogbm9uZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxufVxyXG4iLCJAaW1wb3J0ICcuL2NvbG9ycyc7XHJcbkBpbXBvcnQgJy4vZm9udCc7XHJcbkBpbXBvcnQgJy4vaWNvbnMnO1xyXG5AaW1wb3J0ICcuL21peGlucyc7XHJcblxyXG4ub3V0bGluZS1tZXNzYWdlIHtcclxuICAucmFkaXVzX3NtYWxsKCk7XHJcbiAgLnNoYWRvd19saWdodF9yZWd1bGFyKCk7XHJcbiAgcG9zaXRpb246IGZpeGVkO1xyXG4gIHotaW5kZXg6IDk5OTk7XHJcbiAgb3BhY2l0eTogMC4xO1xyXG4gIHRvcDogLTUwcHg7XHJcbiAgbGVmdDogNTAlO1xyXG4gIGhlaWdodDogNDBweDtcclxuICBtYXJnaW46IDA7XHJcbiAgcGFkZGluZzogMCA1MHB4O1xyXG4gIGxpbmUtaGVpZ2h0OiA0MHB4O1xyXG4gIGZvbnQtc2l6ZTogQGZvbnRfc2l6ZV9zbWFsbDtcclxuICBiYWNrZ3JvdW5kLWNvbG9yOiBAd2hpdGU7XHJcbiAgY29sb3I6IEB0aGlyZF90ZXh0X2NvbG9yO1xyXG4gIHRyYW5zaXRpb246IGFsbCAwLjVzIGVhc2UtaW4tb3V0O1xyXG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgtNTAlKTtcclxuICBvdmVyZmxvdzogaGlkZGVuO1xyXG5cclxuICAmX19jb250ZW50IHtcclxuICAgIC5lbGxpcHNpcygxKTtcclxuICAgIG1hcmdpbjogMDtcclxuICAgIG1heC13aWR0aDogNzAwcHg7XHJcbiAgICBoZWlnaHQ6IDQwcHg7XHJcbiAgICBsaW5lLWhlaWdodDogNDBweDtcclxuICAgIGZvbnQtc2l6ZTogMTNweDtcclxuICAgIGNvbG9yOiBAdGhpcmRfdGV4dF9jb2xvcjtcclxuICAgIG92ZXJmbG93OiBoaWRkZW47XHJcbiAgfVxyXG5cclxuICAmX19jbG9zZSxcclxuICAmX19pY29uIHtcclxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcclxuICAgIHotaW5kZXg6IDI7XHJcbiAgICB0b3A6IDA7XHJcbiAgICB3aWR0aDogNDBweDtcclxuICAgIGhlaWdodDogNDBweDtcclxuICAgIGxpbmUtaGVpZ2h0OiA0MHB4O1xyXG4gICAgdGV4dC1hbGlnbjogY2VudGVyO1xyXG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcclxuICB9XHJcblxyXG4gICZfX2ljb24ge1xyXG4gICAgbGVmdDogMDtcclxuICAgIGNvbG9yOiBAd2hpdGU7XHJcblxyXG4gICAgLm91dGxpbmUtaWNvbiB7XHJcbiAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcclxuICAgICAgei1pbmRleDogMjtcclxuICAgICAgdG9wOiA1MCU7XHJcbiAgICAgIGxlZnQ6IDUwJTtcclxuICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgLTUwJSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAmX19jbG9zZSB7XHJcbiAgICByaWdodDogMDtcclxuICAgIGN1cnNvcjogcG9pbnRlcjtcclxuICAgIGNvbG9yOiBAZm91cnRoX3RleHRfY29sb3I7XHJcblxyXG4gICAgLm91dGxpbmUtaWNvbiB7XHJcbiAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcclxuICAgICAgei1pbmRleDogMjtcclxuICAgICAgdG9wOiA1MCU7XHJcbiAgICAgIGxlZnQ6IDUwJTtcclxuICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgLTUwJSk7XHJcbiAgICB9XHJcblxyXG4gICAgJjpob3ZlciB7XHJcbiAgICAgIGNvbG9yOiBAdGhpcmRfdGV4dF9jb2xvcjtcclxuICAgIH1cclxuICB9XHJcblxyXG4gICZfaW5mbyB7XHJcbiAgICAub3V0bGluZS1tZXNzYWdlX19pY29uIHtcclxuICAgICAgYmFja2dyb3VuZC1jb2xvcjogQHByaW1hcnlfY29sb3I7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAmX3dhcm5pbmcge1xyXG4gICAgLm91dGxpbmUtbWVzc2FnZV9faWNvbiB7XHJcbiAgICAgIGJhY2tncm91bmQtY29sb3I6IEB3YXJuaW5nX2NvbG9yO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgJl9zdWNjZXNzIHtcclxuICAgIC5vdXRsaW5lLW1lc3NhZ2VfX2ljb24ge1xyXG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAc3VjY2Vzc19jb2xvcjtcclxuICAgIH1cclxuICB9XHJcblxyXG4gICZfZXJyb3Ige1xyXG4gICAgLm91dGxpbmUtbWVzc2FnZV9faWNvbiB7XHJcbiAgICAgIGJhY2tncm91bmQtY29sb3I6IEBkYW5nZXJfY29sb3I7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAmX3BsYWluIHtcclxuICAgIG1pbi13aWR0aDogMTkwcHg7XHJcbiAgICBwYWRkaW5nOiAwIDUwcHggMCAxNXB4O1xyXG5cclxuICAgICYub3V0bGluZS1tZXNzYWdlIHtcclxuICAgICAgJl9pbmZvIHtcclxuICAgICAgICBib3JkZXItbGVmdDogNXB4IHNvbGlkIEBwcmltYXJ5X2NvbG9yO1xyXG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6IEBpbmZvX3RpcF9iZ19jb2xvcjtcclxuICAgICAgfVxyXG5cclxuICAgICAgJl93YXJuaW5nIHtcclxuICAgICAgICBib3JkZXItbGVmdDogNXB4IHNvbGlkIEB3YXJuaW5nX2NvbG9yO1xyXG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6IEB3YXJuaW5nX3RpcF9iZ19jb2xvcjtcclxuICAgICAgfVxyXG5cclxuICAgICAgJl9zdWNjZXNzIHtcclxuICAgICAgICBib3JkZXItbGVmdDogNXB4IHNvbGlkIEBzdWNjZXNzX2NvbG9yO1xyXG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6IEBzdWNjZXNzX3RpcF9iZ19jb2xvcjtcclxuICAgICAgfVxyXG5cclxuICAgICAgJl9lcnJvciB7XHJcbiAgICAgICAgYm9yZGVyLWxlZnQ6IDVweCBzb2xpZCBAZGFuZ2VyX2NvbG9yO1xyXG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6IEBkYW5nZXJfdGlwX2JnX2NvbG9yO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLm91dGxpbmUtbWVzc2FnZV9faWNvbiB7XHJcbiAgICAgIHdpZHRoOiAwO1xyXG4gICAgICBkaXNwbGF5OiBub25lO1xyXG5cclxuICAgICAgLm91dGxpbmUtaWNvbiB7XHJcbiAgICAgICAgZGlzcGxheTogbm9uZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgJl9saWdodCB7XHJcbiAgICBtaW4td2lkdGg6IDE4MHB4O1xyXG4gICAgcGFkZGluZzogMCA0MHB4O1xyXG5cclxuICAgICYub3V0bGluZS1tZXNzYWdlIHtcclxuICAgICAgJl9pbmZvIHtcclxuICAgICAgICAub3V0bGluZS1tZXNzYWdlX19pY29uIHtcclxuICAgICAgICAgIGNvbG9yOiBAcHJpbWFyeV9jb2xvcjtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgICZfd2FybmluZyB7XHJcbiAgICAgICAgLm91dGxpbmUtbWVzc2FnZV9faWNvbiB7XHJcbiAgICAgICAgICBjb2xvcjogQHdhcm5pbmdfY29sb3I7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICAmX3N1Y2Nlc3Mge1xyXG4gICAgICAgIC5vdXRsaW5lLW1lc3NhZ2VfX2ljb24ge1xyXG4gICAgICAgICAgY29sb3I6IEBzdWNjZXNzX2NvbG9yO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgJl9lcnJvciB7XHJcbiAgICAgICAgLm91dGxpbmUtbWVzc2FnZV9faWNvbiB7XHJcbiAgICAgICAgICBjb2xvcjogQGRhbmdlcl9jb2xvcjtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAub3V0bGluZS1tZXNzYWdlX19pY29uIHtcclxuICAgICAgYmFja2dyb3VuZC1jb2xvcjogQHdoaXRlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgJl9yb3VuZCB7XHJcbiAgICAucmFkaXVzKDIwcHgpO1xyXG5cclxuICAgICYub3V0bGluZS1tZXNzYWdlIHtcclxuICAgICAgJl9kZWZhdWx0IHtcclxuICAgICAgICBtaW4td2lkdGg6IDE4MHB4O1xyXG4gICAgICAgIHBhZGRpbmc6IDAgNDBweDtcclxuXHJcbiAgICAgICAgLm91dGxpbmUtbWVzc2FnZV9faWNvbiB7XHJcbiAgICAgICAgICAucmFkaXVzKDEwcHgpO1xyXG4gICAgICAgICAgdG9wOiAxMHB4O1xyXG4gICAgICAgICAgbGVmdDogMTBweDtcclxuICAgICAgICAgIHdpZHRoOiAyMHB4O1xyXG4gICAgICAgICAgaGVpZ2h0OiAyMHB4O1xyXG4gICAgICAgICAgbGluZS1oZWlnaHQ6IDIwcHg7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAmLm91dGxpbmUtbWVzc2FnZV9mdWxsLXdpZHRoIHtcclxuICAgICAgICAgIG1pbi13aWR0aDogMjAwcHg7XHJcbiAgICAgICAgICBwYWRkaW5nOiAwIDIwcHggMCA0MHB4O1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgJl9wbGFpbiB7XHJcbiAgICAgICAgbWluLXdpZHRoOiAxOTVweDtcclxuICAgICAgICBwYWRkaW5nOiAwIDQwcHggMCAyMHB4O1xyXG5cclxuICAgICAgICAmLm91dGxpbmUtbWVzc2FnZV9mdWxsLXdpZHRoIHtcclxuICAgICAgICAgIG1pbi13aWR0aDogMjE1cHg7XHJcbiAgICAgICAgICBwYWRkaW5nOiAwIDIwcHg7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAmX2Z1bGwtd2lkdGgge1xyXG4gICAgbWluLXdpZHRoOiAyMDBweDtcclxuICAgIHBhZGRpbmc6IDAgMTBweCAwIDUwcHg7XHJcblxyXG4gICAgJi5vdXRsaW5lLW1lc3NhZ2Uge1xyXG4gICAgICAmX3BsYWluIHtcclxuICAgICAgICBtaW4td2lkdGg6IDIzMHB4O1xyXG4gICAgICAgIHBhZGRpbmc6IDAgMTBweCAwIDE1cHg7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgICZfbGlnaHQge1xyXG4gICAgICAgIG1pbi13aWR0aDogMjEwcHg7XHJcbiAgICAgICAgcGFkZGluZzogMCAxMHB4IDAgNDBweDtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgJl92aXNpYmxlIHtcclxuICAgIG9wYWNpdHk6IDE7XHJcbiAgfVxyXG5cclxuICAmX2hpZGRlbiB7XHJcbiAgICBkaXNwbGF5OiBub25lO1xyXG4gIH1cclxufVxyXG4iLCIvKiA9PT09PSBTY3JvbGxiYXIgPT09PT0gKi9cclxuOjotd2Via2l0LXNjcm9sbGJhciB7XHJcbiAgd2lkdGg6IDdweDtcclxuICBoZWlnaHQ6IDdweDtcclxuICAtd2Via2l0LWJvcmRlci1yYWRpdXM6IDVweDtcclxuXHJcbiAgJi10cmFjay1waWVjZSB7XHJcbiAgICAtd2Via2l0LWJvcmRlci1yYWRpdXM6IDVweDtcclxuICB9XHJcblxyXG4gICYtdGh1bWIge1xyXG4gICAgJjp2ZXJ0aWNhbCB7XHJcbiAgICAgIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMCwgMCwgMCwgMC4yNSk7XHJcbiAgICAgIC13ZWJraXQtYm9yZGVyLXJhZGl1czogNXB4O1xyXG4gICAgfVxyXG5cclxuICAgICY6aG9yaXpvbnRhbCB7XHJcbiAgICAgIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMCwgMCwgMCwgMC4yNSk7XHJcbiAgICAgIC13ZWJraXQtYm9yZGVyLXJhZGl1czogNXB4O1xyXG4gICAgfVxyXG5cclxuICAgICY6aG92ZXIge1xyXG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuMzUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgJjpob3ZlciB7XHJcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuMTUpO1xyXG4gIH1cclxufVxyXG4iXX0= */ +/*# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLzxpbnB1dCBjc3MgMT4iLCJub3JtYWxpemUubGVzcyIsImJhc2UubGVzcyIsInNjcm9sbGJhci5sZXNzIiwibGF5b3V0Lmxlc3MiLCJhc2lkZS5sZXNzIiwibWFpbi5sZXNzIiwic2VjdGlvbi5sZXNzIiwiY2FzZS5sZXNzIiwiLi4vLi4vdGhlbWUvdmFyaWFibGVzLmxlc3MiLCIuLi8uLi90aGVtZS9pY29ucy5sZXNzIiwiLi4vLi4vdGhlbWUvc2Nyb2xsYmFyLmxlc3MiLCIuLi8uLi9hbmNob3JzL2FuY2hvcnMubGVzcyIsIi4uLy4uL2RyYXdlci9kcmF3ZXIubGVzcyIsIi4uLy4uL3RoZW1lL3NoYWRvdy5sZXNzIiwiLi4vLi4vbmF2aWdhdG9yL25hdmlnYXRvci5sZXNzIiwiLi4vLi4vdGhlbWUvZWxsaXBzaXMubGVzcyIsIi4uLy4uL3JlYWRlci9yZWFkZXIubGVzcyIsIi4uLy4uL3RoZW1lL3JhZGl1cy5sZXNzIiwiLi4vLi4vdG9vbGJhci90b29sYmFyLmxlc3MiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsNEVBQTRFO0FBQzVFO2dGQUNnRjtBQUNoRjs7O0dBR0c7QUNJSDtFQUNFLGtCQUFBO0VERkEsT0FBTztFQ0dQLCtCQUFBO0VEREEsT0FBTztDQUNSO0FBQ0Q7Z0ZBQ2dGO0FBQ2hGOztHQUVHO0FDS0g7RUFDRSxVQUFBO0NESEQ7QUFDRDs7R0FFRztBQ09IO0VBQ0UsZUFBQTtDRExEO0FBQ0Q7OztHQUdHO0FDU0g7RUFDRSxlQUFBO0VBQ0EsaUJBQUE7Q0RQRDtBQUNEO2dGQUNnRjtBQUNoRjs7O0dBR0c7QUNZSDtFQUNFLGdDQUFBO1VBQUEsd0JBQUE7RURWQSxPQUFPO0VDV1AsVUFBQTtFRFRBLE9BQU87RUNVUCxrQkFBQTtFRFJBLE9BQU87Q0FDUjtBQUNEOzs7R0FHRztBQ1dIO0VBQ0Usa0NBQUE7RURUQSxPQUFPO0VDVVAsZUFBQTtFRFJBLE9BQU87Q0FDUjtBQUNEO2dGQUNnRjtBQUNoRjs7R0FFRztBQ1lIO0VB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QW1CejdDRztFQUNFLGNBQUE7Q25CMjdDTDtBbUJ2N0NDOztFQUVFLG9DQUFBO1VBQUEsNEJBQUE7RUFDQSxZQUFBO0NuQnk3Q0g7QW1CdDdDQztFQUNFLFNBQUE7RUFDQSxZQUFBO0NuQnc3Q0g7QW1CdDdDRztFQUNFLGFBQUE7Q25CdzdDTDtBbUJwN0NDO0VBQ0UsU0FBQTtFQUNBLFdBQUE7Q25CczdDSDtBbUJwN0NHO0VBQ0UsWUFBQTtDbkJzN0NMO0FtQjc2Q0s7Ozs7RUFDRSxjQUFBO0NuQms3Q1AiLCJmaWxlIjoiZG9jcy5jc3MiLCJzb3VyY2VzQ29udGVudCI6WyIvKiEgbm9ybWFsaXplLmNzcyB2OC4wLjEgfCBNSVQgTGljZW5zZSB8IGdpdGh1Yi5jb20vbmVjb2xhcy9ub3JtYWxpemUuY3NzICovXG4vKiBEb2N1bWVudFxuICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cbi8qKlxuICogMS4gQ29ycmVjdCB0aGUgbGluZSBoZWlnaHQgaW4gYWxsIGJyb3dzZXJzLlxuICogMi4gUHJldmVudCBhZGp1c3RtZW50cyBvZiBmb250IHNpemUgYWZ0ZXIgb3JpZW50YXRpb24gY2hhbmdlcyBpbiBpT1MuXG4gKi9cbmh0bWwge1xuICBsaW5lLWhlaWdodDogMS4xNTtcbiAgLyogMSAqL1xuICAtd2Via2l0LXRleHQtc2l6ZS1hZGp1c3Q6IDEwMCU7XG4gIC8qIDIgKi9cbn1cbi8qIFNlY3Rpb25zXG4gICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xuLyoqXG4gKiBSZW1vdmUgdGhlIG1hcmdpbiBpbiBhbGwgYnJvd3NlcnMuXG4gKi9cbmJvZHkge1xuICBtYXJnaW46IDA7XG59XG4vKipcbiAqIFJlbmRlciB0aGUgYG1haW5gIGVsZW1lbnQgY29uc2lzdGVudGx5IGluIElFLlxuICovXG5tYWluIHtcbiAgZGlzcGxheTogYmxvY2s7XG59XG4vKipcbiAqIENvcnJlY3QgdGhlIGZvbnQgc2l6ZSBhbmQgbWFyZ2luIG9uIGBoMWAgZWxlbWVudHMgd2l0aGluIGBzZWN0aW9uYCBhbmRcbiAqIGBhcnRpY2xlYCBjb250ZXh0cyBpbiBDaHJvbWUsIEZpcmVmb3gsIGFuZCBTYWZhcmkuXG4gKi9cbmgxIHtcbiAgZm9udC1zaXplOiAyZW07XG4gIG1hcmdpbjogMC42N2VtIDA7XG59XG4vKiBHcm91cGluZyBjb250ZW50XG4gICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xuLyoqXG4gKiAxLiBBZGQgdGhlIGNvcnJlY3QgYm94IHNpemluZyBpbiBGaXJlZm94LlxuICogMi4gU2hvdyB0aGUgb3ZlcmZsb3cgaW4gRWRnZSBhbmQgSUUuXG4gKi9cbmhyIHtcbiAgYm94LXNpemluZzogY29udGVudC1ib3g7XG4gIC8qIDEgKi9cbiAgaGVpZ2h0OiAwO1xuICAvKiAxICovXG4gIG92ZXJmbG93OiB2aXNpYmxlO1xuICAvKiAyICovXG59XG4vKipcbiAqIDEuIENvcnJlY3QgdGhlIGluaGVyaXRhbmNlIGFuZCBzY2FsaW5nIG9mIGZvbnQgc2l6ZSBpbiBhbGwgYnJvd3NlcnMuXG4gKiAyLiBDb3JyZWN0IHRoZSBvZGQgYGVtYCBmb250IHNpemluZyBpbiBhbGwgYnJvd3NlcnMuXG4gKi9cbnByZSB7XG4gIGZvbnQtZmFtaWx5OiBtb25vc3BhY2UsIG1vbm9zcGFjZTtcbiAgLyogMSAqL1xuICBmb250LXNpemU6IDFlbTtcbiAgLyogMiAqL1xufVxuLyogVGV4dC1sZXZlbCBzZW1hbnRpY3NcbiAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXG4vKipcbiAqIFJlbW92ZSB0aGUgZ3JheSBiYWNrZ3JvdW5kIG9uIGFjdGl2ZSBsaW5rcyBpbiBJRSAxMC5cbiAqL1xuYSB7XG4gIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50O1xufVxuLyoqXG4gKiAxLiBSZW1vdmUgdGhlIGJvdHRvbSBib3JkZXIgaW4gQ2hyb21lIDU3LVxuICogMi4gQWRkIHRoZSBjb3JyZWN0IHRleHQgZGVjb3JhdGlvbiBpbiBDaHJvbWUsIEVkZ2UsIElFLCBPcGVyYSwgYW5kIFNhZmFyaS5cbiAqL1xuYWJiclt0aXRsZV0ge1xuICBib3JkZXItYm90dG9tOiBub25lO1xuICAvKiAxICovXG4gIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lO1xuICAvKiAyICovXG4gIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lIGRvdHRlZDtcbiAgLyogMiAqL1xufVxuLyoqXG4gKiBBZGQgdGhlIGNvcnJlY3QgZm9udCB3ZWlnaHQgaW4gQ2hyb21lLCBFZGdlLCBhbmQgU2FmYXJpLlxuICovXG5iLFxuc3Ryb25nIHtcbiAgZm9udC13ZWlnaHQ6IGJvbGRlcjtcbn1cbi8qKlxuICogMS4gQ29ycmVjdCB0aGUgaW5oZXJpdGFuY2UgYW5kIHNjYWxpbmcgb2YgZm9udCBzaXplIGluIGFsbCBicm93c2Vycy5cbiAqIDIuIENvcnJlY3QgdGhlIG9kZCBgZW1gIGZvbnQgc2l6aW5nIGluIGFsbCBicm93c2Vycy5cbiAqL1xuY29kZSxcbmtiZCxcbnNhbXAge1xuICBmb250LWZhbWlseTogbW9ub3NwYWNlLCBtb25vc3BhY2U7XG4gIC8qIDEgKi9cbiAgZm9udC1zaXplOiAxZW07XG4gIC8qIDIgKi9cbn1cbi8qKlxuICogQWRkIHRoZSBjb3JyZWN0IGZvbnQgc2l6ZSBpbiBhbGwgYnJvd3NlcnMuXG4gKi9cbnNtYWxsIHtcbiAgZm9udC1zaXplOiA4MCU7XG59XG4vKipcbiAqIFByZXZlbnQgYHN1YmAgYW5kIGBzdXBgIGVsZW1lbnRzIGZyb20gYWZmZWN0aW5nIHRoZSBsaW5lIGhlaWdodCBpblxuICogYWxsIGJyb3dzZXJzLlxuICovXG5zdWIsXG5zdXAge1xuICBmb250LXNpemU6IDc1JTtcbiAgbGluZS1oZWlnaHQ6IDA7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgdmVydGljYWwtYWxpZ246IGJhc2VsaW5lO1xufVxuc3ViIHtcbiAgYm90dG9tOiAtMC4yNWVtO1xufVxuc3VwIHtcbiAgdG9wOiAtMC41ZW07XG59XG4vKiBFbWJlZGRlZCBjb250ZW50XG4gICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xuLyoqXG4gKiBSZW1vdmUgdGhlIGJvcmRlciBvbiBpbWFnZXMgaW5zaWRlIGxpbmtzIGluIElFIDEwLlxuICovXG5pbWcge1xuICBib3JkZXItc3R5bGU6IG5vbmU7XG59XG4vKiBGb3Jtc1xuICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cbi8qKlxuICogMS4gQ2hhbmdlIHRoZSBmb250IHN0eWxlcyBpbiBhbGwgYnJvd3NlcnMuXG4gKiAyLiBSZW1vdmUgdGhlIG1hcmdpbiBpbiBGaXJlZm94IGFuZCBTYWZhcmkuXG4gKi9cbmJ1dHRvbixcbmlucHV0LFxub3B0Z3JvdXAsXG5zZWxlY3QsXG50ZXh0YXJlYSB7XG4gIGZvbnQtZmFtaWx5OiBpbmhlcml0O1xuICAvKiAxICovXG4gIGZvbnQtc2l6ZTogMTAwJTtcbiAgLyogMSAqL1xuICBsaW5lLWhlaWdodDogMS4xNTtcbiAgLyogMSAqL1xuICBtYXJnaW46IDA7XG4gIC8qIDIgKi9cbn1cbi8qKlxuICogU2hvdyB0aGUgb3ZlcmZsb3cgaW4gSUUuXG4gKiAxLiBTaG93IHRoZSBvdmVyZmxvdyBpbiBFZGdlLlxuICovXG5idXR0b24sXG5pbnB1dCB7XG4gIC8qIDEgKi9cbiAgb3ZlcmZsb3c6IHZpc2libGU7XG59XG4vKipcbiAqIFJlbW92ZSB0aGUgaW5oZXJpdGFuY2Ugb2YgdGV4dCB0cmFuc2Zvcm0gaW4gRWRnZSwgRmlyZWZveCwgYW5kIElFLlxuICogMS4gUmVtb3ZlIHRoZSBpbmhlcml0YW5jZSBvZiB0ZXh0IHRyYW5zZm9ybSBpbiBGaXJlZm94LlxuICovXG5idXR0b24sXG5zZWxlY3Qge1xuICAvKiAxICovXG4gIHRleHQtdHJhbnNmb3JtOiBub25lO1xufVxuLyoqXG4gKiBDb3JyZWN0IHRoZSBpbmFiaWxpdHkgdG8gc3R5bGUgY2xpY2thYmxlIHR5cGVzIGluIGlPUyBhbmQgU2FmYXJpLlxuICovXG5idXR0b24sXG5bdHlwZT0nYnV0dG9uJ10sXG5bdHlwZT0ncmVzZXQnXSxcblt0eXBlPSdzdWJtaXQnXSB7XG4gIC13ZWJraXQtYXBwZWFyYW5jZTogYnV0dG9uO1xufVxuLyoqXG4gKiBSZW1vdmUgdGhlIGlubmVyIGJvcmRlciBhbmQgcGFkZGluZyBpbiBGaXJlZm94LlxuICovXG5idXR0b246Oi1tb3otZm9jdXMtaW5uZXIsXG5bdHlwZT0nYnV0dG9uJ106Oi1tb3otZm9jdXMtaW5uZXIsXG5bdHlwZT0ncmVzZXQnXTo6LW1vei1mb2N1cy1pbm5lcixcblt0eXBlPSdzdWJtaXQnXTo6LW1vei1mb2N1cy1pbm5lciB7XG4gIGJvcmRlci1zdHlsZTogbm9uZTtcbiAgcGFkZGluZzogMDtcbn1cbi8qKlxuICogUmVzdG9yZSB0aGUgZm9jdXMgc3R5bGVzIHVuc2V0IGJ5IHRoZSBwcmV2aW91cyBydWxlLlxuICovXG5idXR0b246LW1vei1mb2N1c3JpbmcsXG5bdHlwZT0nYnV0dG9uJ106LW1vei1mb2N1c3JpbmcsXG5bdHlwZT0ncmVzZXQnXTotbW96LWZvY3VzcmluZyxcblt0eXBlPSdzdWJtaXQnXTotbW96LWZvY3VzcmluZyB7XG4gIG91dGxpbmU6IDFweCBkb3R0ZWQgQnV0dG9uVGV4dDtcbn1cbi8qKlxuICogQ29ycmVjdCB0aGUgcGFkZGluZyBpbiBGaXJlZm94LlxuICovXG5maWVsZHNldCB7XG4gIHBhZGRpbmc6IDAuMzVlbSAwLjc1ZW0gMC42MjVlbTtcbn1cbi8qKlxuICogMS4gQ29ycmVjdCB0aGUgdGV4dCB3cmFwcGluZyBpbiBFZGdlIGFuZCBJRS5cbiAqIDIuIENvcnJlY3QgdGhlIGNvbG9yIGluaGVyaXRhbmNlIGZyb20gYGZpZWxkc2V0YCBlbGVtZW50cyBpbiBJRS5cbiAqIDMuIFJlbW92ZSB0aGUgcGFkZGluZyBzbyBkZXZlbG9wZXJzIGFyZSBub3QgY2F1Z2h0IG91dCB3aGVuIHRoZXkgemVybyBvdXRcbiAqICAgIGBmaWVsZHNldGAgZWxlbWVudHMgaW4gYWxsIGJyb3dzZXJzLlxuICovXG5sZWdlbmQge1xuICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAvKiAxICovXG4gIGNvbG9yOiBpbmhlcml0O1xuICAvKiAyICovXG4gIGRpc3BsYXk6IHRhYmxlO1xuICAvKiAxICovXG4gIG1heC13aWR0aDogMTAwJTtcbiAgLyogMSAqL1xuICBwYWRkaW5nOiAwO1xuICAvKiAzICovXG4gIHdoaXRlLXNwYWNlOiBub3JtYWw7XG4gIC8qIDEgKi9cbn1cbi8qKlxuICogQWRkIHRoZSBjb3JyZWN0IHZlcnRpY2FsIGFsaWdubWVudCBpbiBDaHJvbWUsIEZpcmVmb3gsIGFuZCBPcGVyYS5cbiAqL1xucHJvZ3Jlc3Mge1xuICB2ZXJ0aWNhbC1hbGlnbjogYmFzZWxpbmU7XG59XG4vKipcbiAqIFJlbW92ZSB0aGUgZGVmYXVsdCB2ZXJ0aWNhbCBzY3JvbGxiYXIgaW4gSUUgMTArLlxuICovXG50ZXh0YXJlYSB7XG4gIG92ZXJmbG93OiBhdXRvO1xufVxuLyoqXG4gKiAxLiBBZGQgdGhlIGNvcnJlY3QgYm94IHNpemluZyBpbiBJRSAxMC5cbiAqIDIuIFJlbW92ZSB0aGUgcGFkZGluZyBpbiBJRSAxMC5cbiAqL1xuW3R5cGU9J2NoZWNrYm94J10sXG5bdHlwZT0ncmFkaW8nXSB7XG4gIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gIC8qIDEgKi9cbiAgcGFkZGluZzogMDtcbiAgLyogMiAqL1xufVxuLyoqXG4gKiBDb3JyZWN0IHRoZSBjdXJzb3Igc3R5bGUgb2YgaW5jcmVtZW50IGFuZCBkZWNyZW1lbnQgYnV0dG9ucyBpbiBDaHJvbWUuXG4gKi9cblt0eXBlPSdudW1iZXInXTo6LXdlYmtpdC1pbm5lci1zcGluLWJ1dHRvbixcblt0eXBlPSdudW1iZXInXTo6LXdlYmtpdC1vdXRlci1zcGluLWJ1dHRvbiB7XG4gIGhlaWdodDogYXV0bztcbn1cbi8qKlxuICogMS4gQ29ycmVjdCB0aGUgb2RkIGFwcGVhcmFuY2UgaW4gQ2hyb21lIGFuZCBTYWZhcmkuXG4gKiAyLiBDb3JyZWN0IHRoZSBvdXRsaW5lIHN0eWxlIGluIFNhZmFyaS5cbiAqL1xuW3R5cGU9J3NlYXJjaCddIHtcbiAgLXdlYmtpdC1hcHBlYXJhbmNlOiB0ZXh0ZmllbGQ7XG4gIC8qIDEgKi9cbiAgb3V0bGluZS1vZmZzZXQ6IC0ycHg7XG4gIC8qIDIgKi9cbn1cbi8qKlxuICogUmVtb3ZlIHRoZSBpbm5lciBwYWRkaW5nIGluIENocm9tZSBhbmQgU2FmYXJpIG9uIG1hY09TLlxuICovXG5bdHlwZT0nc2VhcmNoJ106Oi13ZWJraXQtc2VhcmNoLWRlY29yYXRpb24ge1xuICAtd2Via2l0LWFwcGVhcmFuY2U6IG5vbmU7XG59XG4vKipcbiAqIDEuIENvcnJlY3QgdGhlIGluYWJpbGl0eSB0byBzdHlsZSBjbGlja2FibGUgdHlwZXMgaW4gaU9TIGFuZCBTYWZhcmkuXG4gKiAyLiBDaGFuZ2UgZm9udCBwcm9wZXJ0aWVzIHRvIGBpbmhlcml0YCBpbiBTYWZhcmkuXG4gKi9cbjo6LXdlYmtpdC1maWxlLXVwbG9hZC1idXR0b24ge1xuICAtd2Via2l0LWFwcGVhcmFuY2U6IGJ1dHRvbjtcbiAgLyogMSAqL1xuICBmb250OiBpbmhlcml0O1xuICAvKiAyICovXG59XG4vKiBJbnRlcmFjdGl2ZVxuICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cbi8qXG4gKiBBZGQgdGhlIGNvcnJlY3QgZGlzcGxheSBpbiBFZGdlLCBJRSAxMCssIGFuZCBGaXJlZm94LlxuICovXG5kZXRhaWxzIHtcbiAgZGlzcGxheTogYmxvY2s7XG59XG4vKlxuICogQWRkIHRoZSBjb3JyZWN0IGRpc3BsYXkgaW4gYWxsIGJyb3dzZXJzLlxuICovXG5zdW1tYXJ5IHtcbiAgZGlzcGxheTogbGlzdC1pdGVtO1xufVxuLyogTWlzY1xuICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cbi8qKlxuICogQWRkIHRoZSBjb3JyZWN0IGRpc3BsYXkgaW4gSUUgMTArLlxuICovXG50ZW1wbGF0ZSB7XG4gIGRpc3BsYXk6IG5vbmU7XG59XG4vKipcbiAqIEFkZCB0aGUgY29ycmVjdCBkaXNwbGF5IGluIElFIDEwLlxuICovXG5baGlkZGVuXSB7XG4gIGRpc3BsYXk6IG5vbmU7XG59XG4vKiA9PT09PSBCYXNlID09PT09ICovXG5odG1sLFxuYm9keSB7XG4gIGhlaWdodDogMTAwJTtcbiAgYmFja2dyb3VuZDogI2ZhZmFmYTtcbiAgY29sb3I6ICMzMzM7XG4gIGZvbnQtc2l6ZTogMTRweDtcbiAgbGluZS1oZWlnaHQ6IDE1MCU7XG4gIGZvbnQtZmFtaWx5OiAnTWljcm9zb2Z0IFlhSGVpIFVJJywgQXJpYWwsIHNhbnMtc2VyaWY7XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG5hOmxpbmssXG5hOnZpc2l0ZWQsXG5hOmhvdmVyIHtcbiAgY29sb3I6ICMwNTg5NDI7XG4gIHRleHQtZGVjb3JhdGlvbjogbm9uZTtcbn1cbmE6aG92ZXIge1xuICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTtcbn1cbmNvZGUge1xuICBmb250LWZhbWlseTogJ1NvdXJjZSBDb2RlIFBybycsIENvbnNvbGFzLCBHZW9yZ2lhLCBNb25hY28sIG1vbm9zcGFjZSwgQXJpYWwsIHNhbnMtc2VyaWY7XG59XG4vKiA9PT09PSBTY3JvbGxiYXIgPT09PT0gKi9cbjo6LXdlYmtpdC1zY3JvbGxiYXIge1xuICB3aWR0aDogN3B4O1xuICBoZWlnaHQ6IDdweDtcbiAgLXdlYmtpdC1ib3JkZXItcmFkaXVzOiA1cHg7XG59XG46Oi13ZWJraXQtc2Nyb2xsYmFyLXRyYWNrLXBpZWNlIHtcbiAgLXdlYmtpdC1ib3JkZXItcmFkaXVzOiA1cHg7XG59XG46Oi13ZWJraXQtc2Nyb2xsYmFyLXRodW1iOnZlcnRpY2FsIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjI1KTtcbiAgLXdlYmtpdC1ib3JkZXItcmFkaXVzOiA1cHg7XG59XG46Oi13ZWJraXQtc2Nyb2xsYmFyLXRodW1iOmhvcml6b250YWwge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuMjUpO1xuICAtd2Via2l0LWJvcmRlci1yYWRpdXM6IDVweDtcbn1cbjo6LXdlYmtpdC1zY3JvbGxiYXI6aG92ZXIge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuMTUpO1xufVxuOjotd2Via2l0LXNjcm9sbGJhci10aHVtYjpob3ZlciB7XG4gIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMCwgMCwgMCwgMC4zNSk7XG59XG4vKiBMYXlvdXQgKi9cbi5kb2NzIHtcbiAgZGlzcGxheTogZmxleDtcbiAgZmxleC1kaXJlY3Rpb246IHJvdztcbiAgZmxleC13cmFwOiBub3dyYXA7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgei1pbmRleDogMTtcbiAgaGVpZ2h0OiAxMDAlO1xuICB3aWR0aDogMTAwJTtcbiAgbWFyZ2luOiAwO1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLyogQXNpZGUgKi9cbi5hc2lkZSB7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGZsZXgtc2hyaW5rOiAwO1xuICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICBmbGV4LXdyYXA6IG5vd3JhcDtcbiAgd2lkdGg6IDI2MHB4O1xuICBtYXJnaW46IDA7XG4gIGhlaWdodDogMTAwJTtcbiAgYmFja2dyb3VuZC1jb2xvcjogIzMzMztcbiAgY29sb3I6ICNkZGQ7XG4gIGJveC1zaGFkb3c6IDAgMCA1cHggMnB4ICNkZGQ7XG4gIHRyYW5zaXRpb24tZHVyYXRpb246IDAuM3M7XG4gIG92ZXJmbG93OiBhdXRvO1xufVxuLyogTWFpbiAqL1xuLm1haW4ge1xuICBmbGV4OiAxO1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIHotaW5kZXg6IDE7XG4gIGhlaWdodDogMTAwJTtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjtcbiAgb3ZlcmZsb3c6IGF1dG87XG59XG5AbWVkaWEgKG1heC13aWR0aDogNTAwcHgpIHtcbiAgLmRvY3Mge1xuICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gIH1cbiAgLmFzaWRlLFxuICAubWFpbiB7XG4gICAgd2lkdGg6IDEwMCU7XG4gIH1cbiAgLmFzaWRlIHtcbiAgICBwb3NpdGlvbjogZml4ZWQ7XG4gICAgei1pbmRleDogMztcbiAgICB0b3A6IDA7XG4gIH1cbiAgLmFzaWRlLm91dGxpbmUtbmF2aWdhdG9yX2ZvbGRlZCB7XG4gICAgbGVmdDogLTEwMCU7XG4gIH1cbiAgLmFzaWRlLm91dGxpbmUtbmF2aWdhdG9yX2V4cGFuZGVkIHtcbiAgICBsZWZ0OiAwO1xuICB9XG59XG4uYXNpZGUge1xuICBmb250LWZhbWlseTogJ1NvdXJjZSBDb2RlIFBybycsIENvbnNvbGFzLCBHZW9yZ2lhLCBNb25hY28sIG1vbm9zcGFjZSwgQXJpYWwsIHNhbnMtc2VyaWY7XG59XG4uYXNpZGVfX2hlYWRlciB7XG4gIG1hcmdpbjogMCBhdXRvO1xuICBmbGV4LXNocmluazogMDtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi5hc2lkZV9fbmF2IHtcbiAgZmxleDogMTtcbiAgb3ZlcmZsb3c6IGF1dG87XG59XG4uYXNpZGVfX2gyIHtcbiAgbWFyZ2luOiAwIGF1dG87XG4gIGhlaWdodDogNTRweDtcbiAgbGluZS1oZWlnaHQ6IDU0cHg7XG4gIGZvbnQtc2l6ZTogMjBweDtcbiAgZm9udC13ZWlnaHQ6IG5vcm1hbDtcbiAgZm9udC1mYW1pbHk6IEdlb3JnaWEsIENvbnNvbGFzLCBBcmlhbCwgc2Fucy1zZXJpZjtcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLmFzaWRlX19oMyB7XG4gIG1hcmdpbjogMCBhdXRvO1xuICBwYWRkaW5nOiAwIDIwcHg7XG4gIGZvbnQtc2l6ZTogMTZweDtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi5hc2lkZV9fbGlzdCB7XG4gIG1hcmdpbjogMDtcbiAgcGFkZGluZzogMTBweCAwO1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLmFzaWRlX19pdGVtIHtcbiAgaGVpZ2h0OiAzMnB4O1xuICBsaW5lLWhlaWdodDogMzJweDtcbiAgcGFkZGluZzogMCAzMHB4O1xuICBjdXJzb3I6IHBvaW50ZXI7XG4gIGZvbnQtc2l6ZTogMTNweDtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi5hc2lkZS1uYXZpZ2F0b3Ige1xuICBmbGV4OiAxO1xufVxuLmFzaWRlLW5hdmlnYXRvciAub3V0bGluZS1uYXZpZ2F0b3JfX21haW46Oi13ZWJraXQtc2Nyb2xsYmFyLXRodW1iIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogIzY2Njtcbn1cbi5hc2lkZS1uYXZpZ2F0b3IgLm91dGxpbmUtbmF2aWdhdG9yX19tYWluOjotd2Via2l0LXNjcm9sbGJhci10aHVtYjpob3ZlciB7XG4gIGJhY2tncm91bmQtY29sb3I6ICM5OTk7XG59XG4uYXNpZGUtbmF2aWdhdG9yIC5vdXRsaW5lLW5hdmlnYXRvcl9fcGxhY2Vob2xkZXIge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjNTU1O1xuICBib3JkZXItbGVmdDogM3B4IHNvbGlkICNmZmY7XG59XG4uYXNpZGUtbmF2aWdhdG9yIC5vdXRsaW5lLW5hdmlnYXRvcl9fYW5jaG9yOmxpbmsge1xuICBjb2xvcjogI2RkZDtcbiAgdGV4dC1kZWNvcmF0aW9uOiBub25lO1xufVxuLmFzaWRlLW5hdmlnYXRvciAub3V0bGluZS1uYXZpZ2F0b3JfX2FuY2hvcjp2aXNpdGVkIHtcbiAgY29sb3I6ICNkZGQ7XG4gIHRleHQtZGVjb3JhdGlvbjogbm9uZTtcbn1cbi5hc2lkZS1uYXZpZ2F0b3IgLm91dGxpbmUtbmF2aWdhdG9yX19hbmNob3I6aG92ZXIge1xuICBjb2xvcjogI2RkZDtcbiAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7XG59XG4uYXNpZGUtbmF2aWdhdG9yIC5vdXRsaW5lLW5hdmlnYXRvcl9hY3RpdmUub3V0bGluZS1uYXZpZ2F0b3JfX2FuY2hvcjpsaW5rLFxuLmFzaWRlLW5hdmlnYXRvciAub3V0bGluZS1uYXZpZ2F0b3JfYWN0aXZlLm91dGxpbmUtbmF2aWdhdG9yX19hbmNob3I6dmlzaXRlZCxcbi5hc2lkZS1uYXZpZ2F0b3IgLm91dGxpbmUtbmF2aWdhdG9yX2FjdGl2ZS5vdXRsaW5lLW5hdmlnYXRvcl9fYW5jaG9yOmhvdmVyIHtcbiAgY29sb3I6ICNmZmY7XG59XG4ubWFpbl9faGVhZGVyLFxuLm1haW5fX2Zvb3RlciB7XG4gIG1hcmdpbjogMCBhdXRvO1xuICBwYWRkaW5nOiAxZW07XG4gIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi5tYWluX19oMSB7XG4gIG1hcmdpbjogMCBhdXRvO1xuICBwYWRkaW5nLXRvcDogMWVtO1xuICBmb250LXNpemU6IDVlbTtcbiAgZm9udC13ZWlnaHQ6IG5vcm1hbDtcbiAgbGluZS1oZWlnaHQ6IDJlbTtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi5tYWluX19uYW1lIHtcbiAgY29sb3I6ICM1MDdhZmU7XG4gIGZvbnQtd2VpZ2h0OiBub3JtYWw7XG59XG4ubWFpbl9fdGFnbGluZSB7XG4gIG1hcmdpbjogMWVtIGF1dG87XG4gIG1heC13aWR0aDogOTYwcHg7XG4gIGxpbmUtaGVpZ2h0OiAxLjNlbTtcbiAgZm9udC1zaXplOiAyZW07XG4gIGNvbG9yOiAjOTk5O1xuICBmb250LXdlaWdodDogMTAwO1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLm1haW5fX2NkbiB7XG4gIG1hcmdpbjogMmVtIDA7XG4gIHBhZGRpbmc6IDJlbTtcbiAgZm9udC1zaXplOiAxNnB4O1xuICBsaW5lLWhlaWdodDogMTUwJTtcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmFmYWZhO1xuICBib3JkZXItdG9wOiAxcHggc29saWQgI2RkZDtcbiAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNkZGQ7XG4gIGNvbG9yOiAjNjY2O1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLm1haW5fX2Rvd25sb2FkIHtcbiAgbWFyZ2luOiAxZW0gYXV0bztcbiAgd2lkdGg6IDIwMHB4O1xuICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4ubWFpbl9fYnV0dG9uIHtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICBib3JkZXItcmFkaXVzOiA0cHg7XG4gIHBhZGRpbmc6IDE0cHggMjlweDtcbiAgZm9udC1zaXplOiAxOHB4O1xuICBmb250LWZhbWlseTogJ1NvdXJjZSBDb2RlIFBybycsIENvbnNvbGFzLCBHZW9yZ2lhLCBNb25hY28sIG1vbm9zcGFjZSwgQXJpYWwsIHNhbnMtc2VyaWY7XG4gIGJhY2tncm91bmQtY29sb3I6ICMwNTg5NDI7XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4ubWFpbl9fYnV0dG9uOmxpbmssXG4ubWFpbl9fYnV0dG9uOnZpc2l0ZWQsXG4ubWFpbl9fYnV0dG9uOmhvdmVyIHtcbiAgY29sb3I6ICNmZmY7XG4gIHRleHQtZGVjb3JhdGlvbjogbm9uZTtcbn1cbi5tYWluX19mb290ZXIge1xuICBtYXJnaW46IDAgM2VtO1xuICBib3JkZXItdG9wOiAxcHggc29saWQgI2RkZDtcbn1cbi5zZWN0aW9uIHtcbiAgbWFyZ2luOiAxZW0gMDtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi5zZWN0aW9uX19oZWFkZXIsXG4uc2VjdGlvbl9fY29udGVudCxcbi5zZWN0aW9uX19mb290ZXIge1xuICBtYXJnaW46IDA7XG4gIHBhZGRpbmc6IDAgM2VtO1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLnNlY3Rpb25fX3RpdGxlIHtcbiAgY29sb3I6ICM2NjY7XG59XG4uc2VjdGlvbl9faDMge1xuICBjb2xvcjogIzUwN2FmZTtcbiAgZm9udC1zaXplOiAxLjM1ZW07XG59XG4uc2VjdGlvbl9faDQge1xuICBmb250LXNpemU6IDEuMWVtO1xuICBjb2xvcjogIzY2Njtcbn1cbi5zZWN0aW9uX19oNSB7XG4gIGZvbnQtc2l6ZTogMWVtO1xuICBjb2xvcjogIzk5OTtcbn1cbi5zZWN0aW9uX19kbCxcbi5zZWN0aW9uX19kdCxcbi5zZWN0aW9uX19kZCB7XG4gIG1hcmdpbjogMDtcbiAgcGFkZGluZzogMDtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi5zZWN0aW9uX19kbCB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgei1pbmRleDogMTtcbn1cbi5zZWN0aW9uX19kdCB7XG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbn1cbi5zZWN0aW9uX19kZCB7XG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgY29sb3I6ICMwNTg5NDI7XG59XG4uc2VjdGlvbl9fcHJlIHtcbiAgbWFyZ2luOiAyZW0gMDtcbiAgcGFkZGluZzogMWVtO1xuICBmb250LXNpemU6IDE0cHg7XG4gIGxpbmUtaGVpZ2h0OiAxNTAlO1xuICB0ZXh0LWFsaWduOiBsZWZ0O1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmFmYWZhO1xuICBib3JkZXI6IDFweCBzb2xpZCAjZGRkO1xuICBib3JkZXItcmFkaXVzOiA0cHg7XG4gIGNvbG9yOiAjNjY2O1xuICBvdmVyZmxvdzogYXV0bztcbn1cbi5zZWN0aW9uX19jb2RlIHtcbiAgZGlzcGxheTogYmxvY2s7XG4gIG1hcmdpbjogMCBhdXRvO1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLnNlY3Rpb25fX2Zvb3RlciB7XG4gIGJvcmRlci10b3A6IDFweCBzb2xpZCAjZGRkO1xuICBtYXJnaW4tdG9wOiAzZW07XG4gIGJhY2tncm91bmQtY29sb3I6ICNmYWZhZmE7XG4gIGNvbG9yOiAjOTk5O1xufVxuLnNlY3Rpb25fX3RhYmxlIHtcbiAgbWFyZ2luOiAxZW0gYXV0bztcbiAgd2lkdGg6IDEwMCU7XG4gIGJvcmRlci10b3A6IDFweCBzb2xpZCAjZGRkO1xufVxuLnNlY3Rpb25fX3RoLFxuLnNlY3Rpb25fX3RkIHtcbiAgcGFkZGluZzogNXB4IDE2cHg7XG4gIGxpbmUtaGVpZ2h0OiAyNnB4O1xuICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI2RkZDtcbn1cbi5zZWN0aW9uX190aCB7XG4gIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ZhZmFmYTtcbn1cbkBtZWRpYSAobWF4LXdpZHRoOiA1MDBweCkge1xuICAuc2VjdGlvbl9faGVhZGVyLFxuICAuc2VjdGlvbl9fY29udGVudCB7XG4gICAgcGFkZGluZzogMCAxZW07XG4gIH1cbn1cbi5jYXNlIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICB6LWluZGV4OiAxO1xuICBkaXNwbGF5OiBncmlkO1xuICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IHJlcGVhdCgyLCAxZnIpO1xuICBnYXA6IDQwcHg7XG4gIHBhZGRpbmc6IDFlbTtcbiAgYm9yZGVyLXRvcDogMXB4IHNvbGlkICNkZGQ7XG4gIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjZGRkO1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLmNhc2U6YWZ0ZXIge1xuICBjb250ZW50OiAnJztcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB6LWluZGV4OiAyO1xuICB0b3A6IDA7XG4gIGxlZnQ6IDUwJTtcbiAgaGVpZ2h0OiAxMDAlO1xuICB3aWR0aDogMDtcbiAgYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjZGRkO1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLmNhc2VfX3ByZSxcbi5jYXNlX190ZXh0YXJlYSB7XG4gIGZvbnQtc2l6ZTogMTNweDtcbiAgbGluZS1oZWlnaHQ6IDE1MCU7XG59XG4uY2FzZV9fcHJlLFxuLmNhc2VfX2NvZGUsXG4uY2FzZV9fdGV4dGFyZWEge1xuICBmb250LWZhbWlseTogJ0NvdXJpZXIgTmV3JywgQ29uc29sYXMsIEdlb3JnaWEsIEFyaWFsLCBzYW5zLXNlcmlmO1xufVxuLmNhc2VfX3ByZSB7XG4gIG1hcmdpbjogMDtcbiAgcGFkZGluZzogMWVtO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmFmYWZhO1xuICBoZWlnaHQ6IDEwMCU7XG4gIGJvcmRlci1yYWRpdXM6IDRweDtcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgb3ZlcmZsb3c6IGF1dG87XG59XG4uY2FzZV9fdG9vbGJhciB7XG4gIG1hcmdpbjogMCBhdXRvO1xuICBoZWlnaHQ6IDM2cHg7XG4gIGxpbmUtaGVpZ2h0OiAzNnB4O1xuICBmb250LXNpemU6IDE0cHg7XG4gIHBhZGRpbmc6IDAgMTZweDtcbiAgdGV4dC1hbGlnbjogcmlnaHQ7XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4uY2FzZV9fYWN0aW9uLFxuLmNhc2VfX3JlbW92ZSB7XG4gIGN1cnNvcjogcG9pbnRlcjtcbiAgY29sb3I6ICMwNTg5NDI7XG4gIHVzZXItc2VsZWN0OiBub25lO1xufVxuLmNhc2VfX2FjdGlvbiB7XG4gIGZvbnQtc2l6ZTogMTNweDtcbiAgcGFkZGluZy1sZWZ0OiAxMHB4O1xufVxuLmNhc2VfX2FjdGlvbjpmaXJzdC1jaGlsZCB7XG4gIHBhZGRpbmctbGVmdDogMDtcbn1cbi5jYXNlX19yZW1vdmUge1xuICBmbG9hdDogcmlnaHQ7XG59XG4uY2FzZV9fY29uc29sZSB7XG4gIG1hcmdpbjogMCBhdXRvO1xuICBoZWlnaHQ6IDE4MHB4O1xuICBib3JkZXI6IDFweCBzb2xpZCAjZGRkO1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLmNhc2VfX3RleHRhcmVhIHtcbiAgbWFyZ2luOiAwIGF1dG87XG4gIHdpZHRoOiAxMDAlO1xuICBoZWlnaHQ6IDEwMCU7XG4gIGJvcmRlcjogbm9uZTtcbiAgb3V0bGluZTogbm9uZTtcbiAgcGFkZGluZzogMWVtO1xuICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICBvdmVyZmxvdzogYXV0bztcbn1cbi5jYXNlX19saXN0LFxuLmNhc2VfX2l0ZW0ge1xuICBtYXJnaW46IDA7XG4gIHBhZGRpbmc6IDA7XG4gIGxpc3Qtc3R5bGUtdHlwZTogbm9uZTtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi5jYXNlX19saXN0IHtcbiAgaGVpZ2h0OiAzNjBweDtcbiAgYm9yZGVyLXRvcDogMXB4IHNvbGlkICNkZGQ7XG4gIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjZGRkO1xuICBmb250LXNpemU6IDEzcHg7XG4gIG92ZXJmbG93OiBhdXRvO1xufVxuLmNhc2VfX2l0ZW0ge1xuICBoZWlnaHQ6IDM2cHg7XG4gIGxpbmUtaGVpZ2h0OiAzNnB4O1xuICBjdXJzb3I6IHBvaW50ZXI7XG4gIHBhZGRpbmc6IDAgMTZweDtcbn1cbi5jYXNlX19pdGVtOmhvdmVyIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2Y3ZjhmOTtcbn1cbjpyb290IHtcbiAgLS1vdXRsaW5lLXpJbmRleDogMjAwMDtcbiAgLS1vdXRsaW5lLXN0aWNreS1oZWlnaHQ6IDEwMCU7XG4gIC0tb3V0bGluZS1uYXZpZ2F0b3Itd2lkdGg6IDEwMCU7XG59XG4vKiA9PT09PT09PT09IGNvbG9ycy50aGVtZSAtIOWfuuehgOminOiJsuWPmOmHj+mbhuWQiCA9PT09PT09PT09ICovXG4vKipcbiAqIGVsbGlwc2lzLmxlc3MgLSDmlofmnKznnIHnlaUgbWl4aW54IOWHveaVsFxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogQ3JlYXRlZCBCeTogWWFvaGFpeGlhb1xuICogVXBkYXRlOiAyMDIyLjMuMTFcbiAqL1xuLyogPT09PT09IOaWh+acrOecgeeVpeWHveaVsCA9PT09PT0gKi9cbi8qKlxuICogc2hhZG93Lmxlc3MgLSDpmLTlvbHmoLflvI/orr7nva4gbWl4aW54IOWHveaVsFxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogQ3JlYXRlZCBCeTogWWFvaGFpeGlhb1xuICogVXBkYXRlOiAyMDIyLjMuMjBcbiAqL1xuLyogPT09PT09IOmYtOW9seagt+W8j+iuvue9ruWHveaVsCA9PT09PT0gKi9cbi8qID09PT09PT09PT0gaWNvbi50aGVtZSAtIHN2ZyDlm77moIfnmoTmoLflvI8gPT09PT09PT09PSAqL1xuLm91dGxpbmUtaWNvbiB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgei1pbmRleDogMTtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO1xuICB3aWR0aDogMWVtO1xuICBoZWlnaHQ6IDFlbTtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi5vdXRsaW5lLWljb25fX3N2ZyB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgei1pbmRleDogMjtcbiAgdG9wOiA1MCU7XG4gIGxlZnQ6IDUwJTtcbiAgd2lkdGg6IDFlbTtcbiAgaGVpZ2h0OiAxZW07XG4gIGZpbGw6IGN1cnJlbnRjb2xvcjtcbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgLTUwJSk7XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4ub3V0bGluZS1pY29uX2hpZGRlbiB7XG4gIGRpc3BsYXk6IG5vbmU7XG59XG4vKiA9PT09PSBTY3JvbGxiYXIgPT09PT0gKi9cbjo6LXdlYmtpdC1zY3JvbGxiYXIge1xuICB3aWR0aDogN3B4O1xuICBoZWlnaHQ6IDdweDtcbiAgLXdlYmtpdC1ib3JkZXItcmFkaXVzOiA1cHg7XG59XG46Oi13ZWJraXQtc2Nyb2xsYmFyLXRyYWNrLXBpZWNlIHtcbiAgLXdlYmtpdC1ib3JkZXItcmFkaXVzOiA1cHg7XG59XG46Oi13ZWJraXQtc2Nyb2xsYmFyLXRodW1iOnZlcnRpY2FsIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjI1KTtcbiAgLXdlYmtpdC1ib3JkZXItcmFkaXVzOiA1cHg7XG59XG46Oi13ZWJraXQtc2Nyb2xsYmFyLXRodW1iOmhvcml6b250YWwge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuMjUpO1xuICAtd2Via2l0LWJvcmRlci1yYWRpdXM6IDVweDtcbn1cbjo6LXdlYmtpdC1zY3JvbGxiYXItdGh1bWI6aG92ZXIge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuMzUpO1xufVxuOjotd2Via2l0LXNjcm9sbGJhcjpob3ZlciB7XG4gIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMCwgMCwgMCwgMC4xNSk7XG59XG4ub3V0bGluZS1oZWFkaW5nIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICB6LWluZGV4OiAxO1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLm91dGxpbmUtaGVhZGluZ19fYW5jaG9yIHtcbiAgZGlzcGxheTogbm9uZTtcbn1cbi5vdXRsaW5lLWhlYWRpbmdfX2FuY2hvcjpsaW5rLFxuLm91dGxpbmUtaGVhZGluZ19fYW5jaG9yOnZpc2l0ZWQsXG4ub3V0bGluZS1oZWFkaW5nX19hbmNob3I6aG92ZXIge1xuICBjb2xvcjogIzk5OTtcbiAgdGV4dC1kZWNvcmF0aW9uOiBub25lO1xufVxuLm91dGxpbmUtaGVhZGluZ19fYW5jaG9yOmhvdmVyIHtcbiAgY29sb3I6ICM1MDdhZmU7XG59XG4ub3V0bGluZS1oZWFkaW5nOmhvdmVyIC5vdXRsaW5lLWhlYWRpbmdfX2FuY2hvciB7XG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbn1cbi5vdXRsaW5lLWhlYWRpbmdfc3RhcnQ6aG92ZXIge1xuICBvdmVyZmxvdzogdmlzaWJsZTtcbn1cbi5vdXRsaW5lLWhlYWRpbmdfc3RhcnQgLm91dGxpbmUtaGVhZGluZ19fYW5jaG9yIHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB6LWluZGV4OiAyO1xuICB0b3A6IDUwJTtcbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC01MCUpO1xuICBsZWZ0OiAtMWVtO1xufVxuLm91dGxpbmUtZHJhd2VyIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICB6LWluZGV4OiAtMTtcbiAgdG9wOiAwO1xuICBsZWZ0OiAwO1xuICBtYXJnaW46IDA7XG4gIHdpZHRoOiAxMDAlO1xuICBoZWlnaHQ6IDEwMCU7XG4gIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gIHZpc2liaWxpdHk6IGhpZGRlbjtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi5vdXRsaW5lLWRyYXdlcl9fbW9kYWwge1xuICBib3gtc2hhZG93OiAwIDAgNnB4IDFweCAjZGNkZmU2O1xuICBkaXNwbGF5OiBmbGV4O1xuICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICBmbGV4LXdyYXA6IG5vd3JhcDtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB6LWluZGV4OiAyMTtcbiAgaGVpZ2h0OiAxMDAlO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmO1xuICB0cmFuc2l0aW9uLWR1cmF0aW9uOiAwLjRzO1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLm91dGxpbmUtZHJhd2VyX19oZWFkZXIsXG4ub3V0bGluZS1kcmF3ZXJfX21haW4sXG4ub3V0bGluZS1kcmF3ZXJfX2Zvb3RlciB7XG4gIHdpZHRoOiAxMDAlO1xuICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xufVxuLm91dGxpbmUtZHJhd2VyX19oZWFkZXIsXG4ub3V0bGluZS1kcmF3ZXJfX2Zvb3RlciB7XG4gIGZsZXgtc2hyaW5rOiAwO1xufVxuLm91dGxpbmUtZHJhd2VyX190aXRsZSxcbi5vdXRsaW5lLWRyYXdlcl9fbWFpbixcbi5vdXRsaW5lLWRyYXdlcl9fZm9vdGVyIHtcbiAgcGFkZGluZzogMCAxNnB4O1xufVxuLm91dGxpbmUtZHJhd2VyX19oZWFkZXIsXG4ub3V0bGluZS1kcmF3ZXJfX3RpdGxlIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICB6LWluZGV4OiAxO1xuICBtYXJnaW46IDAgYXV0bztcbiAgaGVpZ2h0OiA1MnB4O1xuICBsaW5lLWhlaWdodDogNTJweDtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi5vdXRsaW5lLWRyYXdlcl9fdGl0bGUge1xuICBmb250LXNpemU6IDE2cHg7XG4gIGZvbnQtd2VpZ2h0OiA0MDA7XG4gIG1hcmdpbjogMCAxNnB4O1xuICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI2RjZGZlNjtcbn1cbi5vdXRsaW5lLWRyYXdlcl9fY2xvc2Uge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHotaW5kZXg6IDI7XG4gIHRvcDogNTAlO1xuICByaWdodDogMTJweDtcbiAgd2lkdGg6IDIwcHg7XG4gIGhlaWdodDogMjBweDtcbiAgbGluZS1oZWlnaHQ6IDIwcHg7XG4gIGNvbG9yOiAjOTk5O1xuICBmb250LXNpemU6IDIwcHg7XG4gIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgY3Vyc29yOiBwb2ludGVyO1xuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTUwJSk7XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4ub3V0bGluZS1kcmF3ZXJfX2Nsb3NlIC5vdXRsaW5lLWljb24ge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHotaW5kZXg6IDI7XG4gIHRvcDogMDtcbiAgbGVmdDogMDtcbn1cbi5vdXRsaW5lLWRyYXdlcl9fY2xvc2U6aG92ZXIge1xuICBjb2xvcjogIzY2Njtcbn1cbi5vdXRsaW5lLWRyYXdlcl9fbWFpbiB7XG4gIGZsZXg6IDE7XG4gIG92ZXJmbG93OiBhdXRvO1xufVxuLm91dGxpbmUtZHJhd2VyX19tYWluLm92ZXJmbG93LWhpZGRlbiB7XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4ub3V0bGluZS1kcmF3ZXJfX2Zvb3RlciB7XG4gIG1hcmdpbjogMCBhdXRvO1xuICB0ZXh0LWFsaWduOiByaWdodDtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi5vdXRsaW5lLWRyYXdlcl9fb3ZlcmxheSB7XG4gIGNvbnRlbnQ6ICcnO1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIHotaW5kZXg6IDE7XG4gIHRvcDogMDtcbiAgbGVmdDogMDtcbiAgd2lkdGg6IDEwMCU7XG4gIGhlaWdodDogMTAwJTtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjtcbiAgb3BhY2l0eTogMC4xO1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLm91dGxpbmUtZHJhd2VyX3J0bC5vdXRsaW5lLWRyYXdlcl90aW55LFxuLm91dGxpbmUtZHJhd2VyX2x0ci5vdXRsaW5lLWRyYXdlcl90aW55IHtcbiAgd2lkdGg6IDI4MHB4O1xufVxuLm91dGxpbmUtZHJhd2VyX3J0bC5vdXRsaW5lLWRyYXdlcl9taW5pLFxuLm91dGxpbmUtZHJhd2VyX2x0ci5vdXRsaW5lLWRyYXdlcl9taW5pIHtcbiAgd2lkdGg6IDQ4MHB4O1xufVxuLm91dGxpbmUtZHJhd2VyX3J0bC5vdXRsaW5lLWRyYXdlcl9zbWFsbCxcbi5vdXRsaW5lLWRyYXdlcl9sdHIub3V0bGluZS1kcmF3ZXJfc21hbGwge1xuICB3aWR0aDogNTQwcHg7XG59XG4ub3V0bGluZS1kcmF3ZXJfcnRsLm91dGxpbmUtZHJhd2VyX3JlZ3VsYXIsXG4ub3V0bGluZS1kcmF3ZXJfbHRyLm91dGxpbmUtZHJhd2VyX3JlZ3VsYXIge1xuICB3aWR0aDogNjgwcHg7XG59XG4ub3V0bGluZS1kcmF3ZXJfcnRsLm91dGxpbmUtZHJhd2VyX21lZGl1bSxcbi5vdXRsaW5lLWRyYXdlcl9sdHIub3V0bGluZS1kcmF3ZXJfbWVkaXVtIHtcbiAgd2lkdGg6IDcyMHB4O1xufVxuLm91dGxpbmUtZHJhd2VyX3J0bC5vdXRsaW5lLWRyYXdlcl9sYXJnZSxcbi5vdXRsaW5lLWRyYXdlcl9sdHIub3V0bGluZS1kcmF3ZXJfbGFyZ2Uge1xuICB3aWR0aDogOTYwcHg7XG59XG4ub3V0bGluZS1kcmF3ZXJfcnRsIHtcbiAgYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjZGNkZmU2O1xufVxuLm91dGxpbmUtZHJhd2VyX3J0bC5vdXRsaW5lLWRyYXdlcl90aW55Lm91dGxpbmUtZHJhd2VyX2Nsb3NlZCB7XG4gIHJpZ2h0OiAtMjkwcHg7XG59XG4ub3V0bGluZS1kcmF3ZXJfcnRsLm91dGxpbmUtZHJhd2VyX21pbmkub3V0bGluZS1kcmF3ZXJfY2xvc2VkIHtcbiAgcmlnaHQ6IC00OTBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl9ydGwub3V0bGluZS1kcmF3ZXJfc21hbGwub3V0bGluZS1kcmF3ZXJfY2xvc2VkIHtcbiAgcmlnaHQ6IC01NTBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl9ydGwub3V0bGluZS1kcmF3ZXJfcmVndWxhci5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xuICByaWdodDogLTY5MHB4O1xufVxuLm91dGxpbmUtZHJhd2VyX3J0bC5vdXRsaW5lLWRyYXdlcl9tZWRpdW0ub3V0bGluZS1kcmF3ZXJfY2xvc2VkIHtcbiAgcmlnaHQ6IC03MzBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl9ydGwub3V0bGluZS1kcmF3ZXJfbGFyZ2Uub3V0bGluZS1kcmF3ZXJfY2xvc2VkIHtcbiAgcmlnaHQ6IC05NzBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl9sdHIge1xuICBib3JkZXItcmlnaHQ6IDFweCBzb2xpZCAjZGNkZmU2O1xufVxuLm91dGxpbmUtZHJhd2VyX2x0ci5vdXRsaW5lLWRyYXdlcl90aW55Lm91dGxpbmUtZHJhd2VyX2Nsb3NlZCB7XG4gIGxlZnQ6IC0yOTBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl9sdHIub3V0bGluZS1kcmF3ZXJfbWluaS5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xuICBsZWZ0OiAtNDkwcHg7XG59XG4ub3V0bGluZS1kcmF3ZXJfbHRyLm91dGxpbmUtZHJhd2VyX3NtYWxsLm91dGxpbmUtZHJhd2VyX2Nsb3NlZCB7XG4gIGxlZnQ6IC01NTBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl9sdHIub3V0bGluZS1kcmF3ZXJfcmVndWxhci5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xuICBsZWZ0OiAtNjkwcHg7XG59XG4ub3V0bGluZS1kcmF3ZXJfbHRyLm91dGxpbmUtZHJhd2VyX21lZGl1bS5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xuICBsZWZ0OiAtNzMwcHg7XG59XG4ub3V0bGluZS1kcmF3ZXJfbHRyLm91dGxpbmUtZHJhd2VyX2xhcmdlLm91dGxpbmUtZHJhd2VyX2Nsb3NlZCB7XG4gIGxlZnQ6IC05NzBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl90dGIsXG4ub3V0bGluZS1kcmF3ZXJfYnR0IHtcbiAgbGVmdDogMDtcbiAgd2lkdGg6IDEwMCU7XG59XG4ub3V0bGluZS1kcmF3ZXJfdHRiLm91dGxpbmUtZHJhd2VyX3RpbnksXG4ub3V0bGluZS1kcmF3ZXJfYnR0Lm91dGxpbmUtZHJhd2VyX3Rpbnkge1xuICBoZWlnaHQ6IDI0MHB4O1xufVxuLm91dGxpbmUtZHJhd2VyX3R0Yi5vdXRsaW5lLWRyYXdlcl9taW5pLFxuLm91dGxpbmUtZHJhd2VyX2J0dC5vdXRsaW5lLWRyYXdlcl9taW5pIHtcbiAgaGVpZ2h0OiAzMjBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl90dGIub3V0bGluZS1kcmF3ZXJfc21hbGwsXG4ub3V0bGluZS1kcmF3ZXJfYnR0Lm91dGxpbmUtZHJhd2VyX3NtYWxsIHtcbiAgaGVpZ2h0OiAzNjBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl90dGIub3V0bGluZS1kcmF3ZXJfcmVndWxhcixcbi5vdXRsaW5lLWRyYXdlcl9idHQub3V0bGluZS1kcmF3ZXJfcmVndWxhciB7XG4gIGhlaWdodDogNDAwcHg7XG59XG4ub3V0bGluZS1kcmF3ZXJfdHRiLm91dGxpbmUtZHJhd2VyX21lZGl1bSxcbi5vdXRsaW5lLWRyYXdlcl9idHQub3V0bGluZS1kcmF3ZXJfbWVkaXVtIHtcbiAgaGVpZ2h0OiA0NDBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl90dGIub3V0bGluZS1kcmF3ZXJfbGFyZ2UsXG4ub3V0bGluZS1kcmF3ZXJfYnR0Lm91dGxpbmUtZHJhd2VyX2xhcmdlIHtcbiAgaGVpZ2h0OiA0ODBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl90dGIge1xuICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI2RjZGZlNjtcbn1cbi5vdXRsaW5lLWRyYXdlcl90dGIub3V0bGluZS1kcmF3ZXJfdGlueS5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xuICB0b3A6IC0yNTBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl90dGIub3V0bGluZS1kcmF3ZXJfbWluaS5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xuICB0b3A6IC0zMzBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl90dGIub3V0bGluZS1kcmF3ZXJfc21hbGwub3V0bGluZS1kcmF3ZXJfY2xvc2VkIHtcbiAgdG9wOiAtMzcwcHg7XG59XG4ub3V0bGluZS1kcmF3ZXJfdHRiLm91dGxpbmUtZHJhd2VyX3JlZ3VsYXIub3V0bGluZS1kcmF3ZXJfY2xvc2VkIHtcbiAgdG9wOiAtNDEwcHg7XG59XG4ub3V0bGluZS1kcmF3ZXJfdHRiLm91dGxpbmUtZHJhd2VyX21lZGl1bS5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xuICB0b3A6IC00NTBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl90dGIub3V0bGluZS1kcmF3ZXJfbGFyZ2Uub3V0bGluZS1kcmF3ZXJfY2xvc2VkIHtcbiAgdG9wOiAtNDkwcHg7XG59XG4ub3V0bGluZS1kcmF3ZXJfYnR0IHtcbiAgdG9wOiBpbml0aWFsO1xuICBib3JkZXItdG9wOiAxcHggc29saWQgI2RjZGZlNjtcbn1cbi5vdXRsaW5lLWRyYXdlcl9idHQub3V0bGluZS1kcmF3ZXJfdGlueS5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xuICBib3R0b206IC0yNTBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl9idHQub3V0bGluZS1kcmF3ZXJfbWluaS5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xuICBib3R0b206IC0zMzBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl9idHQub3V0bGluZS1kcmF3ZXJfc21hbGwub3V0bGluZS1kcmF3ZXJfY2xvc2VkIHtcbiAgYm90dG9tOiAtMzcwcHg7XG59XG4ub3V0bGluZS1kcmF3ZXJfYnR0Lm91dGxpbmUtZHJhd2VyX3JlZ3VsYXIub3V0bGluZS1kcmF3ZXJfY2xvc2VkIHtcbiAgYm90dG9tOiAtNDEwcHg7XG59XG4ub3V0bGluZS1kcmF3ZXJfYnR0Lm91dGxpbmUtZHJhd2VyX21lZGl1bS5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xuICBib3R0b206IC00NTBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl9idHQub3V0bGluZS1kcmF3ZXJfbGFyZ2Uub3V0bGluZS1kcmF3ZXJfY2xvc2VkIHtcbiAgYm90dG9tOiAtNDkwcHg7XG59XG4ub3V0bGluZS1kcmF3ZXJfb3BlbmVkIHtcbiAgdmlzaWJpbGl0eTogdmlzaWJsZTtcbiAgei1pbmRleDogdmFyKC0tb3V0bGluZS16SW5kZXgpO1xufVxuLm91dGxpbmUtZHJhd2VyX29wZW5lZC5vdXRsaW5lLWRyYXdlciB7XG4gIHBvc2l0aW9uOiBmaXhlZDtcbn1cbi5vdXRsaW5lLWRyYXdlcl9vcGVuZWQub3V0bGluZS1kcmF3ZXJfcnRsIHtcbiAgcmlnaHQ6IDA7XG59XG4ub3V0bGluZS1kcmF3ZXJfb3BlbmVkLm91dGxpbmUtZHJhd2VyX2x0ciB7XG4gIGxlZnQ6IDA7XG59XG4ub3V0bGluZS1kcmF3ZXJfb3BlbmVkLm91dGxpbmUtZHJhd2VyX3R0YiB7XG4gIHRvcDogMDtcbn1cbi5vdXRsaW5lLWRyYXdlcl9vcGVuZWQub3V0bGluZS1kcmF3ZXJfYnR0IHtcbiAgYm90dG9tOiAwO1xufVxuLm91dGxpbmUtZHJhd2VyX29mZnNldC5vdXRsaW5lLWRyYXdlcl9ydGwsXG4ub3V0bGluZS1kcmF3ZXJfb2Zmc2V0Lm91dGxpbmUtZHJhd2VyX2x0ciB7XG4gIGhlaWdodDogY2FsYygxMDAlIC0gNGVtKTtcbiAgdG9wOiA1MCU7XG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtNTAlKTtcbn1cbi5vdXRsaW5lLWRyYXdlcl9vZmZzZXQub3V0bGluZS1kcmF3ZXJfdHRiLFxuLm91dGxpbmUtZHJhd2VyX29mZnNldC5vdXRsaW5lLWRyYXdlcl9idHQge1xuICB3aWR0aDogY2FsYygxMDAlIC0gNGVtKTtcbiAgbGVmdDogNTAlO1xuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTUwJSk7XG59XG4ub3V0bGluZS1kcmF3ZXJfb2Zmc2V0Lm91dGxpbmUtZHJhd2VyX29wZW5lZC5vdXRsaW5lLWRyYXdlcl9ydGwge1xuICByaWdodDogMmVtO1xufVxuLm91dGxpbmUtZHJhd2VyX29mZnNldC5vdXRsaW5lLWRyYXdlcl9vcGVuZWQub3V0bGluZS1kcmF3ZXJfbHRyIHtcbiAgbGVmdDogMmVtO1xufVxuLm91dGxpbmUtZHJhd2VyX29mZnNldC5vdXRsaW5lLWRyYXdlcl9vcGVuZWQub3V0bGluZS1kcmF3ZXJfdHRiIHtcbiAgdG9wOiAyZW07XG59XG4ub3V0bGluZS1kcmF3ZXJfb2Zmc2V0Lm91dGxpbmUtZHJhd2VyX29wZW5lZC5vdXRsaW5lLWRyYXdlcl9idHQge1xuICBib3R0b206IDJlbTtcbn1cbi5vdXRsaW5lLWRyYXdlcl9hdXRvLm91dGxpbmUtZHJhd2VyX3J0bCxcbi5vdXRsaW5lLWRyYXdlcl9hdXRvLm91dGxpbmUtZHJhd2VyX2x0ciB7XG4gIGhlaWdodDogYXV0bztcbiAgbWF4LWhlaWdodDogY2FsYygxMDAlIC0gNGVtKTtcbn1cbi5vdXRsaW5lLWRyYXdlcl9mdWxsIHtcbiAgcGFkZGluZzogMDtcbn1cbi5vdXRsaW5lLW5hdmlnYXRvciB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgei1pbmRleDogMTtcbiAgbWFyZ2luOiAwO1xuICB3aWR0aDogdmFyKC0tb3V0bGluZS1uYXZpZ2F0b3Itd2lkdGgpO1xuICBvdmVyZmxvdzogYXV0bztcbn1cbi5vdXRsaW5lLW5hdmlnYXRvci1wYXJlbnQge1xuICB0cmFuc2l0aW9uOiAwLjNzIGVhc2UtaW4tb3V0O1xufVxuLm91dGxpbmUtbmF2aWdhdG9yX190aXRsZSB7XG4gIG1hcmdpbjogMCAxNnB4O1xuICBoZWlnaHQ6IDQwcHg7XG4gIGxpbmUtaGVpZ2h0OiA0MHB4O1xuICBwYWRkaW5nOiAwIDE2cHg7XG4gIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjZGNkZmU2O1xuICBmb250LXNpemU6IDE2cHg7XG4gIGZvbnQtd2VpZ2h0OiA0MDA7XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4ub3V0bGluZS1uYXZpZ2F0b3JfX21haW4ge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIHotaW5kZXg6IDE7XG4gIG1hcmdpbjogMDtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi5vdXRsaW5lLW5hdmlnYXRvcl9fbGlzdCxcbi5vdXRsaW5lLW5hdmlnYXRvcl9fc3ViamVjdCxcbi5vdXRsaW5lLW5hdmlnYXRvcl9faXRlbSB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgei1pbmRleDogMjtcbiAgbWFyZ2luOiAwO1xuICBwYWRkaW5nOiAwO1xuICBsaXN0LXN0eWxlLXR5cGU6IG5vbmU7XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4ub3V0bGluZS1uYXZpZ2F0b3JfX2xpc3Qge1xuICBwYWRkaW5nOiAwLjVlbSAwO1xufVxuLm91dGxpbmUtbmF2aWdhdG9yX19zdWJqZWN0IHtcbiAgcGFkZGluZy1sZWZ0OiAxZW07XG59XG4ub3V0bGluZS1uYXZpZ2F0b3JfX2l0ZW0ge1xuICBtYXJnaW46IDA7XG4gIGxpbmUtaGVpZ2h0OiAzMHB4O1xuICBmb250LXNpemU6IDEzcHg7XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4ub3V0bGluZS1uYXZpZ2F0b3JfX3BsYWNlaG9sZGVyIHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB6LWluZGV4OiAxO1xuICB0b3A6IDA7XG4gIGxlZnQ6IDA7XG4gIHdpZHRoOiAxMDAlO1xuICBoZWlnaHQ6IDMwcHg7XG4gIGJhY2tncm91bmQtY29sb3I6ICNmN2Y4Zjk7XG4gIGJvcmRlci1sZWZ0OiAycHggc29saWQgIzA1ODk0MjtcbiAgdHJhbnNpdGlvbi1kdXJhdGlvbjogMC4ycztcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi5vdXRsaW5lLW5hdmlnYXRvcl9fYW5jaG9yIHtcbiAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbiAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7XG4gIG92ZXJmbG93OiBoaWRkZW47XG4gIGRpc3BsYXk6IGJsb2NrO1xuICBwYWRkaW5nOiAwIDEuNWVtO1xufVxuLm91dGxpbmUtbmF2aWdhdG9yX19hbmNob3I6bGluayxcbi5vdXRsaW5lLW5hdmlnYXRvcl9fYW5jaG9yOnZpc2l0ZWQsXG4ub3V0bGluZS1uYXZpZ2F0b3JfX2FuY2hvcjpob3ZlciB7XG4gIHRleHQtZGVjb3JhdGlvbjogbm9uZTtcbiAgY29sb3I6ICM1NTU7XG59XG4ub3V0bGluZS1uYXZpZ2F0b3JfX2FuY2hvcjpob3ZlciB7XG4gIGNvbG9yOiAjMDU4OTQyO1xufVxuLm91dGxpbmUtbmF2aWdhdG9yX19jb2RlIHtcbiAgcGFkZGluZy1yaWdodDogMC41ZW07XG59XG4ub3V0bGluZS1uYXZpZ2F0b3JfaGlnaGxpZ2h0Lm91dGxpbmUtbmF2aWdhdG9yX19hbmNob3I6bGluayxcbi5vdXRsaW5lLW5hdmlnYXRvcl9oaWdobGlnaHQub3V0bGluZS1uYXZpZ2F0b3JfX2FuY2hvcjp2aXNpdGVkLFxuLm91dGxpbmUtbmF2aWdhdG9yX2hpZ2hsaWdodC5vdXRsaW5lLW5hdmlnYXRvcl9fYW5jaG9yOmhvdmVyIHtcbiAgY29sb3I6ICMwNTg5NDI7XG4gIGZvbnQtd2VpZ2h0OiBib2xkO1xufVxuLm91dGxpbmUtbmF2aWdhdG9yX3N0aWNreSxcbi5vdXRsaW5lLW5hdmlnYXRvcl9maXhlZCB7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGZsZXgtd3JhcDogbm93cmFwO1xuICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICB6LWluZGV4OiB2YXIoLS1vdXRsaW5lLXpJbmRleCk7XG4gIHRvcDogMDtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi5vdXRsaW5lLW5hdmlnYXRvcl9zdGlja3kgLm91dGxpbmUtbmF2aWdhdG9yX190aXRsZSxcbi5vdXRsaW5lLW5hdmlnYXRvcl9maXhlZCAub3V0bGluZS1uYXZpZ2F0b3JfX3RpdGxlLFxuLm91dGxpbmUtbmF2aWdhdG9yX3N0aWNreSAub3V0bGluZS1uYXZpZ2F0b3JfX21haW4sXG4ub3V0bGluZS1uYXZpZ2F0b3JfZml4ZWQgLm91dGxpbmUtbmF2aWdhdG9yX19tYWluIHtcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbn1cbi5vdXRsaW5lLW5hdmlnYXRvcl9zdGlja3kgLm91dGxpbmUtbmF2aWdhdG9yX190aXRsZSxcbi5vdXRsaW5lLW5hdmlnYXRvcl9maXhlZCAub3V0bGluZS1uYXZpZ2F0b3JfX3RpdGxlIHtcbiAgZmxleC1zaHJpbms6IDA7XG59XG4ub3V0bGluZS1uYXZpZ2F0b3Jfc3RpY2t5IC5vdXRsaW5lLW5hdmlnYXRvcl9fbWFpbixcbi5vdXRsaW5lLW5hdmlnYXRvcl9maXhlZCAub3V0bGluZS1uYXZpZ2F0b3JfX21haW4ge1xuICBmbGV4OiAxO1xuICBvdmVyZmxvdzogYXV0bztcbn1cbi5vdXRsaW5lLW5hdmlnYXRvcl9zdGlja3kge1xuICBwb3NpdGlvbjogc3RpY2t5O1xuICBtYXgtaGVpZ2h0OiB2YXIoLS1vdXRsaW5lLXN0aWNreS1oZWlnaHQpO1xufVxuLm91dGxpbmUtbmF2aWdhdG9yX2ZpeGVkIHtcbiAgcG9zaXRpb246IGZpeGVkO1xuICBtYXgtaGVpZ2h0OiAxMDAlO1xufVxuLm91dGxpbmUtbmF2aWdhdG9yX2hpZGRlbiB7XG4gIGRpc3BsYXk6IG5vbmU7XG59XG4ub3V0bGluZS1uYXZpZ2F0b3JfZm9sZGVkIHtcbiAgd2lkdGg6IDA7XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4vKipcbiAqIGZvbnQubGVzcyAtIOWtl+S9k+ebuOWFs+agt+W8j1xuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogQ3JlYXRlZCBCeTogWWFvaGFpeGlhb1xuICogVXBkYXRlOiAyMDIyLjMuMTZcbiAqL1xuLyogPT09PT09IOWtl+S9kyA9PT09PT0gKi9cbi8qID09PT09PSDlrZfph40gPT09PT09ICovXG4vKiA9PT09PT0g5a2X5Y+3ID09PT09PSAqL1xuLyoqXG4gKiBtaXhpbnMubGVzcyAtIOW3peWFt+WHveaVsFxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogQ3JlYXRlZCBCeTogWWFvaGFpeGlhb1xuICogVXBkYXRlOiAyMDIyLjMuMTFcbiAqL1xuLyoqXG4gKiByYWRpdXMubGVzcyAtIOWchuinkuiuvue9riBtaXhpbngg5Ye95pWwXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBDcmVhdGVkIEJ5OiBZYW9oYWl4aWFvXG4gKiBVcGRhdGU6IDIwMjQuNC4xNlxuICovXG4vKiA9PT09PT0g5ZyG6KeS5qC35byP6K6+572u5Ye95pWwID09PT09PSAqL1xuLm91dGxpbmUtcmVhZGVyX19wcm9ncmVzcyB7XG4gIHBvc2l0aW9uOiBmaXhlZDtcbiAgdG9wOiAwO1xuICBsZWZ0OiAwO1xuICB6LWluZGV4OiAzO1xuICBoZWlnaHQ6IDRweDtcbiAgd2lkdGg6IDEwMCU7XG4gIGJhY2tncm91bmQtY29sb3I6ICM1MDdhZmU7XG4gIHNjYWxlOiAwIDE7XG4gIHRyYW5zZm9ybS1vcmlnaW46IGxlZnQ7XG4gIGFuaW1hdGlvbjogb3V0bGluZS1yZWFkZXItcHJvZ3Jlc3MgbGluZWFyO1xuICBhbmltYXRpb24tdGltZWxpbmU6IC0tUHJvZ3Jlc3NUaW1lbGluZTtcbn1cbi5vdXRsaW5lLXJlYWRlcl9fcGFwZXIge1xuICBib3gtc2hhZG93OiAwIDAgNnB4IDFweCAjZGRkO1xuICBtYXJnaW46IDJlbSBhdXRvO1xuICBtYXgtd2lkdGg6IDEyMDBweDtcbiAgcGFkZGluZzogMy4yZW07XG4gIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gIGJhY2tncm91bmQtY29sb3I6ICNmZmY7XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4ub3V0bGluZS1yZWFkZXJfX3RpdGxlIHtcbiAgbWFyZ2luOiAwLjY3ZW0gMDtcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xuICBmb250LWZhbWlseTogLWFwcGxlLXN5c3RlbSwgQmxpbmtNYWNTeXN0ZW1Gb250LCAnU2Vnb2UgVUknLCAnUGluZ0ZhbmcgU0MnLCAnSGlyYWdpbm8gU2FucyBHQicsICdNaWNyb3NvZnQgWWFIZWknLCAnSGVsdmV0aWNhIE5ldWUnLCAnQXBwbGUgQ29sb3IgRW1vamknLCAnU2Vnb2UgVUkgRW1vamknLCAnU2Vnb2UgVUkgU3ltYm9sJywgSGVsdmV0aWNhLCBBcmlhbCwgc2Fucy1zZXJpZjtcbiAgZm9udC13ZWlnaHQ6IG5vcm1hbDtcbiAgbGluZS1oZWlnaHQ6IDEuM2VtO1xuICBmb250LXNpemU6IDQuMmVtO1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLm91dGxpbmUtcmVhZGVyX19hcnRpY2xlIC5vdXRsaW5lLXJlYWRlcl9fcHJvZ3Jlc3Mge1xuICBkaXNwbGF5OiBub25lO1xufVxuLm91dGxpbmUtcmVhZGVyX2hpZGRlbiB7XG4gIGRpc3BsYXk6IG5vbmU7XG59XG4ub3V0bGluZS1yZWFkZXJfaGlkZGVuLm91dGxpbmUtcmVhZGVyX3NpYmxpbmcge1xuICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7XG59XG4ub3V0bGluZS1yZWFkZXJfaGlkZGVuLm91dGxpbmUtcmVhZGVyX3NpYmxpbmcud3JhcHBlci5wb3N0IHtcbiAgZGlzcGxheTogbm9uZTtcbn1cbi5vdXRsaW5lLXJlYWRlci0tcmVhZGluZyB7XG4gIGRpc3BsYXk6IGJsb2NrO1xuICBwb3NpdGlvbjogZml4ZWQ7XG4gIHotaW5kZXg6IDI7XG4gIHRvcDogMDtcbiAgbGVmdDogMDtcbiAgd2lkdGg6IDEwMCU7XG4gIGhlaWdodDogMTAwJTtcbiAgbWFyZ2luOiAwO1xuICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICBwYWRkaW5nOiAzZW0gNGVtO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmFmYWZhO1xuICBzY3JvbGwtdGltZWxpbmUtbmFtZTogLS1Qcm9ncmVzc1RpbWVsaW5lO1xuICBvdmVyZmxvdzogc2Nyb2xsO1xufVxuQGtleWZyYW1lcyBvdXRsaW5lLXJlYWRlci1wcm9ncmVzcyB7XG4gIHRvIHtcbiAgICBzY2FsZTogMSAxO1xuICB9XG59XG5AbWVkaWEgKG1heC13aWR0aDogNTAwcHgpIHtcbiAgLm91dGxpbmUtcmVhZGVyIHtcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xuICB9XG4gIC5vdXRsaW5lLXJlYWRlciAub3V0bGluZS10b29sYmFyIHtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7XG4gICAgZmxleC13cmFwOiBub3dyYXA7XG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICBhbGlnbi1zZWxmOiBhdXRvO1xuICAgIHRvcDogMTAwJTtcbiAgICByaWdodDogMDtcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTQ4cHgpO1xuICAgIHdpZHRoOiAxMDAlO1xuICAgIGhlaWdodDogNDhweDtcbiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgIGJvcmRlci10b3A6IDFweCBzb2xpZCAjZGRkO1xuICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmY7XG4gICAgcGFkZGluZzogMCAxNnB4O1xuICB9XG4gIC5vdXRsaW5lLXJlYWRlciAub3V0bGluZS10b29sYmFyX19idXR0b24ge1xuICAgIGJvcmRlci1yYWRpdXM6IDA7XG4gICAgZmxleDogMTtcbiAgICBib3JkZXI6IG5vbmU7XG4gICAgYm94LXNoYWRvdzogbm9uZTtcbiAgfVxuICAub3V0bGluZS1yZWFkZXItLXJlYWRpbmcge1xuICAgIHBhZGRpbmc6IDA7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjtcbiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICB9XG4gIC5vdXRsaW5lLXJlYWRlcl9fcGFwZXIge1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICB6LWluZGV4OiAxO1xuICAgIG1hcmdpbjogMDtcbiAgICBwYWRkaW5nOiAwO1xuICAgIGhlaWdodDogMTAwJTtcbiAgICBib3gtc2hhZG93OiBub25lO1xuICAgIG92ZXJmbG93OiBoaWRkZW47XG4gIH1cbiAgLm91dGxpbmUtcmVhZGVyX190aXRsZSB7XG4gICAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpcztcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgei1pbmRleDogMztcbiAgICB0b3A6IDA7XG4gICAgbGVmdDogMDtcbiAgICBtYXJnaW46IDA7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgaGVpZ2h0OiA0OHB4O1xuICAgIGxpbmUtaGVpZ2h0OiA0OHB4O1xuICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjZGRkO1xuICAgIGZvbnQtc2l6ZTogMS44ZW07XG4gICAgZm9udC13ZWlnaHQ6IDQwMDtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmO1xuICAgIG92ZXJmbG93OiBoaWRkZW47XG4gIH1cbiAgLm91dGxpbmUtcmVhZGVyX19hcnRpY2xlIHtcbiAgICBtYXJnaW46IDQ4cHggMDtcbiAgICBoZWlnaHQ6IGNhbGMoMTAwJSAtIDk2cHgpO1xuICAgIHBhZGRpbmc6IDAgMS4yNWVtO1xuICAgIHNjcm9sbC10aW1lbGluZS1uYW1lOiAtLU1vYmlsZVByb2dyZXNzVGltZWxpbmU7XG4gICAgb3ZlcmZsb3cteDogaGlkZGVuO1xuICAgIG92ZXJmbG93LXk6IHNjcm9sbDtcbiAgfVxuICAub3V0bGluZS1yZWFkZXJfX2FydGljbGUgLm91dGxpbmUtcmVhZGVyX19wcm9ncmVzcyB7XG4gICAgei1pbmRleDogNDtcbiAgICBhbmltYXRpb246IG91dGxpbmUtcmVhZGVyLXByb2dyZXNzIGxpbmVhcjtcbiAgICBhbmltYXRpb24tdGltZWxpbmU6IC0tTW9iaWxlUHJvZ3Jlc3NUaW1lbGluZTtcbiAgICBkaXNwbGF5OiBibG9jaztcbiAgfVxufVxuQG1lZGlhIHByaW50IHtcbiAgaHRtbCxcbiAgYm9keSB7XG4gICAgLyog5omT5Y2w55qE5Z+656GA5a2X5L2T5aSn5bCPICovXG4gICAgZm9udC1zaXplOiAxMnB0O1xuICAgIC8qIOaYvuekuuiuvue9ruaWh+Wtl+minOiJsuWSjOiDjOaZr+minOiJsiAqL1xuICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmY7XG4gICAgY29sb3I6ICMzMzM7XG4gICAgaGVpZ2h0OiBpbml0aWFsICFpbXBvcnRhbnQ7XG4gIH1cbiAgLyog6K6+572u6ZO+5o6l5qC35byPICovXG4gIGE6bGluayxcbiAgYTp2aXNpdGVkLFxuICBhOmhvdmVyIHtcbiAgICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZSAhaW1wb3J0YW50O1xuICAgIGNvbG9yOiAjNTA3YWZlO1xuICB9XG4gIC8qIOmakOiXj+WqkuS9k+agh+etviAqL1xuICB2aWRlbyxcbiAgYXVkaW8ge1xuICAgIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDtcbiAgfVxuICAvKiDnoa7kv53ooajmoLzlnKjmiZPljbDml7bnmoTovrnmoYblkozlr7npvZDmlrnlvI/muIXmmbAgKi9cbiAgdGFibGUge1xuICAgIHdpZHRoOiAxMDAlO1xuICAgIGJvcmRlci1jb2xsYXBzZTogY29sbGFwc2U7XG4gIH1cbiAgdGgsXG4gIHRkIHtcbiAgICBib3JkZXI6IDFweCBzb2xpZCAjZGNkZmU2O1xuICAgIHBhZGRpbmc6IDhweCAyMHB4O1xuICB9XG4gIC5vdXRsaW5lLW1lc3NhZ2UsXG4gIC5vdXRsaW5lLXRvb2xiYXIge1xuICAgIC8qIOmakOiXj+S6huW3peWFt+agj+WSjOS/oeaBr+aPkOekuuahhiAqL1xuICAgIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDtcbiAgfVxuICAub3V0bGluZS1yZWFkZXIge1xuICAgIGRpc3BsYXk6IGJsb2NrICFpbXBvcnRhbnQ7XG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICAvKiDlj5bmtojkuobnu53lr7nlrprkvY0gKi9cbiAgICAvKiDpmpDol4/pmIXor7vov5vluqbmnaEgKi9cbiAgICAvKiDmiZPljbDml7bkuI3mmL7npLrmraPmlocgRE9NIOeahOmYtOW9seaViOaenCAqL1xuICAgIC8qIOaJgOacieaWh+eroOWGheWuuSBET00g55u45YWz55qE6YK75bGF6IqC54K56YO96ZqQ6JeP5LqGICovXG4gIH1cbiAgLm91dGxpbmUtcmVhZGVyX190aXRsZSB7XG4gICAgbWFyZ2luOiAxMy40cHQgMCAyOHB0ICFpbXBvcnRhbnQ7XG4gICAgdGV4dC1hbGlnbjogY2VudGVyICFpbXBvcnRhbnQ7XG4gICAgZm9udC1zaXplOiAzMnB0ICFpbXBvcnRhbnQ7XG4gIH1cbiAgLm91dGxpbmUtcmVhZGVyLS1yZWFkaW5nIHtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmUgIWltcG9ydGFudDtcbiAgICBoZWlnaHQ6IGF1dG8gIWltcG9ydGFudDtcbiAgICBwYWRkaW5nOiAwICFpbXBvcnRhbnQ7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjtcbiAgICBvdmVyZmxvdzogaGlkZGVuICFpbXBvcnRhbnQ7XG4gIH1cbiAgLm91dGxpbmUtcmVhZGVyX19wcm9ncmVzcyB7XG4gICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50O1xuICB9XG4gIC5vdXRsaW5lLXJlYWRlcl9fcGFwZXIge1xuICAgIGJveC1zaGFkb3c6IG5vbmU7XG4gIH1cbiAgLm91dGxpbmUtcmVhZGVyIHByZSB7XG4gICAgcGFkZGluZzogMWVtICFpbXBvcnRhbnQ7XG4gICAgYm9yZGVyOiAxcHggc29saWQgI2RkZCAhaW1wb3J0YW50O1xuICAgIGJvcmRlci1yYWRpdXM6IDRweCAhaW1wb3J0YW50O1xuICB9XG4gIC5vdXRsaW5lLXJlYWRlciBwcmUsXG4gIC5vdXRsaW5lLXJlYWRlciBjb2RlIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmICFpbXBvcnRhbnQ7XG4gIH1cbiAgLm91dGxpbmUtcmVhZGVyIHRhYmxlLFxuICAub3V0bGluZS1yZWFkZXIgaW1nLFxuICAub3V0bGluZS1yZWFkZXIgc3ZnIHtcbiAgICBicmVhay1pbnNpZGU6IGF2b2lkO1xuICB9XG4gIC5vdXRsaW5lLXJlYWRlcl9zaWJsaW5nIHtcbiAgICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7XG4gIH1cbn1cbi5vdXRsaW5lLXRvb2xiYXIge1xuICBwb3NpdGlvbjogZml4ZWQ7XG4gIHotaW5kZXg6IDk5OTk5O1xuICBtYXJnaW46IDA7XG4gIHRyYW5zaXRpb24tZHVyYXRpb246IDAuM3M7XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4ub3V0bGluZS10b29sYmFyX19idXR0b24ge1xuICBib3gtc2hhZG93OiAwIDAgNnB4IDFweCAjZGNkZmU2O1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIHotaW5kZXg6IDE7XG4gIG1hcmdpbjogMTBweDtcbiAgd2lkdGg6IDM2cHg7XG4gIGhlaWdodDogMzZweDtcbiAgYm9yZGVyOiAxcHggc29saWQgI2RjZGZlNjtcbiAgYm9yZGVyLXJhZGl1czogM3B4O1xuICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmO1xuICBjdXJzb3I6IHBvaW50ZXI7XG4gIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgY29sb3I6ICM5OTk7XG4gIHRyYW5zaXRpb246IGFsbCAwLjNzIDAuMXMgZWFzZS1pbi1vdXQ7XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4ub3V0bGluZS10b29sYmFyX19idXR0b246aG92ZXIge1xuICBjb2xvcjogIzA1ODk0MjtcbiAgYm9yZGVyLWNvbG9yOiAjMDU4OTQyO1xuICB0cmFuc2Zvcm06IHNjYWxlKDEuMzUpO1xufVxuLm91dGxpbmUtdG9vbGJhcl9fYnV0dG9uLmhpZGUge1xuICBkaXNwbGF5OiBub25lO1xufVxuLm91dGxpbmUtdG9vbGJhcl9fYW5jaG9yOmxpbmssXG4ub3V0bGluZS10b29sYmFyX19hbmNob3I6dmlzaXRlZCxcbi5vdXRsaW5lLXRvb2xiYXJfX2FuY2hvcjpob3ZlciB7XG4gIGNvbG9yOiAjOTk5O1xuICB0ZXh0LWRlY29yYXRpb246IG5vbmU7XG59XG4ub3V0bGluZS10b29sYmFyX19hbmNob3I6aG92ZXIge1xuICBjb2xvcjogIzA1ODk0Mjtcbn1cbi5vdXRsaW5lLXRvb2xiYXJfX2ljb24ge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHotaW5kZXg6IDI7XG4gIHRvcDogNTAlO1xuICBsZWZ0OiA1MCU7XG4gIHdpZHRoOiAyMHB4O1xuICBoZWlnaHQ6IDIwcHg7XG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIC01MCUpO1xuICBmaWxsOiBjdXJyZW50Y29sb3I7XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4ub3V0bGluZS10b29sYmFyX2FjdGl2ZS5vdXRsaW5lLXRvb2xiYXJfX2J1dHRvbiB7XG4gIGNvbG9yOiAjZmZmO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjMDU4OTQyO1xuICBib3JkZXItY29sb3I6ICMwNTg5NDI7XG59XG4ub3V0bGluZS10b29sYmFyX2FjdGl2ZS5vdXRsaW5lLXRvb2xiYXJfX2J1dHRvbjpob3ZlciB7XG4gIGNvbG9yOiAjZmZmO1xufVxuLm91dGxpbmUtdG9vbGJhcl9hY3RpdmUgLm91dGxpbmUtdG9vbGJhcl9fYW5jaG9yOmxpbmssXG4ub3V0bGluZS10b29sYmFyX2FjdGl2ZSAub3V0bGluZS10b29sYmFyX19hbmNob3I6dmlzaXRlZCxcbi5vdXRsaW5lLXRvb2xiYXJfYWN0aXZlIC5vdXRsaW5lLXRvb2xiYXJfX2FuY2hvcjpob3ZlciB7XG4gIGNvbG9yOiAjZmZmO1xufVxuLm91dGxpbmUtdG9vbGJhcl9yb3VuZGVkLm91dGxpbmUtdG9vbGJhcl9fYnV0dG9uIHtcbiAgYm9yZGVyLXJhZGl1czogMThweDtcbn1cbi5vdXRsaW5lLXRvb2xiYXJfZGlzYWJsZWQub3V0bGluZS10b29sYmFyX19hbmNob3I6bGluayxcbi5vdXRsaW5lLXRvb2xiYXJfZGlzYWJsZWQgLm91dGxpbmUtdG9vbGJhcl9fYW5jaG9yOmxpbmssXG4ub3V0bGluZS10b29sYmFyX2Rpc2FibGVkLm91dGxpbmUtdG9vbGJhcl9fYW5jaG9yOnZpc2l0ZWQsXG4ub3V0bGluZS10b29sYmFyX2Rpc2FibGVkIC5vdXRsaW5lLXRvb2xiYXJfX2FuY2hvcjp2aXNpdGVkLFxuLm91dGxpbmUtdG9vbGJhcl9kaXNhYmxlZC5vdXRsaW5lLXRvb2xiYXJfX2FuY2hvcjpob3Zlcixcbi5vdXRsaW5lLXRvb2xiYXJfZGlzYWJsZWQgLm91dGxpbmUtdG9vbGJhcl9fYW5jaG9yOmhvdmVyLFxuLm91dGxpbmUtdG9vbGJhcl9kaXNhYmxlZC5vdXRsaW5lLXRvb2xiYXJfX2J1dHRvbixcbi5vdXRsaW5lLXRvb2xiYXJfZGlzYWJsZWQgLm91dGxpbmUtdG9vbGJhcl9fYnV0dG9uIHtcbiAgY3Vyc29yOiBub3QtYWxsb3dlZDtcbiAgY29sb3I6ICM5OTk7XG4gIGJvcmRlci1jb2xvcjogIzk5OTtcbn1cbi5vdXRsaW5lLXRvb2xiYXJfZGlzYWJsZWQub3V0bGluZS10b29sYmFyX19hbmNob3I6bGluazpob3Zlcixcbi5vdXRsaW5lLXRvb2xiYXJfZGlzYWJsZWQgLm91dGxpbmUtdG9vbGJhcl9fYW5jaG9yOmxpbms6aG92ZXIsXG4ub3V0bGluZS10b29sYmFyX2Rpc2FibGVkLm91dGxpbmUtdG9vbGJhcl9fYW5jaG9yOnZpc2l0ZWQ6aG92ZXIsXG4ub3V0bGluZS10b29sYmFyX2Rpc2FibGVkIC5vdXRsaW5lLXRvb2xiYXJfX2FuY2hvcjp2aXNpdGVkOmhvdmVyLFxuLm91dGxpbmUtdG9vbGJhcl9kaXNhYmxlZC5vdXRsaW5lLXRvb2xiYXJfX2FuY2hvcjpob3Zlcjpob3Zlcixcbi5vdXRsaW5lLXRvb2xiYXJfZGlzYWJsZWQgLm91dGxpbmUtdG9vbGJhcl9fYW5jaG9yOmhvdmVyOmhvdmVyLFxuLm91dGxpbmUtdG9vbGJhcl9kaXNhYmxlZC5vdXRsaW5lLXRvb2xiYXJfX2J1dHRvbjpob3Zlcixcbi5vdXRsaW5lLXRvb2xiYXJfZGlzYWJsZWQgLm91dGxpbmUtdG9vbGJhcl9fYnV0dG9uOmhvdmVyIHtcbiAgY29sb3I6ICM5OTk7XG4gIGJvcmRlci1jb2xvcjogIzk5OTtcbn1cbi5vdXRsaW5lLXRvb2xiYXJfZGlzYWJsZWQub3V0bGluZS10b29sYmFyX19idXR0b24sXG4ub3V0bGluZS10b29sYmFyX2Rpc2FibGVkIC5vdXRsaW5lLXRvb2xiYXJfX2J1dHRvbiB7XG4gIGJhY2tncm91bmQtY29sb3I6ICNmNWY1ZjU7XG59XG4ub3V0bGluZS10b29sYmFyX3R0Yixcbi5vdXRsaW5lLXRvb2xiYXJfYnR0IHtcbiAgbGVmdDogNTAlO1xuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTUwJSk7XG59XG4ub3V0bGluZS10b29sYmFyX3R0YiAub3V0bGluZS10b29sYmFyX19idXR0b24sXG4ub3V0bGluZS10b29sYmFyX2J0dCAub3V0bGluZS10b29sYmFyX19idXR0b24ge1xuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG59XG4ub3V0bGluZS10b29sYmFyX3R0YiB7XG4gIHRvcDogMTJweDtcbn1cbi5vdXRsaW5lLXRvb2xiYXJfdHRiLm91dGxpbmUtdG9vbGJhcl9oaWRkZW4ge1xuICB0b3A6IC01NnB4O1xufVxuLm91dGxpbmUtdG9vbGJhcl9idHQge1xuICBib3R0b206IDEycHg7XG59XG4ub3V0bGluZS10b29sYmFyX2J0dC5vdXRsaW5lLXRvb2xiYXJfaGlkZGVuIHtcbiAgYm90dG9tOiAtNTZweDtcbn1cbi5vdXRsaW5lLXRvb2xiYXJfcnRsLFxuLm91dGxpbmUtdG9vbGJhcl9sdHIge1xuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTUwJSk7XG4gIHdpZHRoOiA1NnB4O1xufVxuLm91dGxpbmUtdG9vbGJhcl9ydGwge1xuICB0b3A6IDUwJTtcbiAgcmlnaHQ6IDEycHg7XG59XG4ub3V0bGluZS10b29sYmFyX3J0bC5vdXRsaW5lLXRvb2xiYXJfaGlkZGVuIHtcbiAgcmlnaHQ6IC04NnB4O1xufVxuLm91dGxpbmUtdG9vbGJhcl9sdHIge1xuICB0b3A6IDUwJTtcbiAgbGVmdDogMTJweDtcbn1cbi5vdXRsaW5lLXRvb2xiYXJfbHRyLm91dGxpbmUtdG9vbGJhcl9oaWRkZW4ge1xuICBsZWZ0OiAtODZweDtcbn1cbi5vdXRsaW5lLXRvb2xiYXJfdHRiIC5vdXRsaW5lLXRvb2xiYXJfX2J1dHRvbi5vdXRsaW5lLXRvb2xiYXJfaGlkZGVuLFxuLm91dGxpbmUtdG9vbGJhcl9ydGwgLm91dGxpbmUtdG9vbGJhcl9fYnV0dG9uLm91dGxpbmUtdG9vbGJhcl9oaWRkZW4sXG4ub3V0bGluZS10b29sYmFyX2J0dCAub3V0bGluZS10b29sYmFyX19idXR0b24ub3V0bGluZS10b29sYmFyX2hpZGRlbixcbi5vdXRsaW5lLXRvb2xiYXJfbHRyIC5vdXRsaW5lLXRvb2xiYXJfX2J1dHRvbi5vdXRsaW5lLXRvb2xiYXJfaGlkZGVuIHtcbiAgZGlzcGxheTogbm9uZTtcbn1cbiIsIi8qISBub3JtYWxpemUuY3NzIHY4LjAuMSB8IE1JVCBMaWNlbnNlIHwgZ2l0aHViLmNvbS9uZWNvbGFzL25vcm1hbGl6ZS5jc3MgKi9cclxuXHJcbi8qIERvY3VtZW50XHJcbiAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXHJcblxyXG4vKipcclxuICogMS4gQ29ycmVjdCB0aGUgbGluZSBoZWlnaHQgaW4gYWxsIGJyb3dzZXJzLlxyXG4gKiAyLiBQcmV2ZW50IGFkanVzdG1lbnRzIG9mIGZvbnQgc2l6ZSBhZnRlciBvcmllbnRhdGlvbiBjaGFuZ2VzIGluIGlPUy5cclxuICovXHJcblxyXG5odG1sIHtcclxuICBsaW5lLWhlaWdodDogMS4xNTsgLyogMSAqL1xyXG4gIC13ZWJraXQtdGV4dC1zaXplLWFkanVzdDogMTAwJTsgLyogMiAqL1xyXG59XHJcblxyXG4vKiBTZWN0aW9uc1xyXG4gICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xyXG5cclxuLyoqXHJcbiAqIFJlbW92ZSB0aGUgbWFyZ2luIGluIGFsbCBicm93c2Vycy5cclxuICovXHJcblxyXG5ib2R5IHtcclxuICBtYXJnaW46IDA7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBSZW5kZXIgdGhlIGBtYWluYCBlbGVtZW50IGNvbnNpc3RlbnRseSBpbiBJRS5cclxuICovXHJcblxyXG5tYWluIHtcclxuICBkaXNwbGF5OiBibG9jaztcclxufVxyXG5cclxuLyoqXHJcbiAqIENvcnJlY3QgdGhlIGZvbnQgc2l6ZSBhbmQgbWFyZ2luIG9uIGBoMWAgZWxlbWVudHMgd2l0aGluIGBzZWN0aW9uYCBhbmRcclxuICogYGFydGljbGVgIGNvbnRleHRzIGluIENocm9tZSwgRmlyZWZveCwgYW5kIFNhZmFyaS5cclxuICovXHJcblxyXG5oMSB7XHJcbiAgZm9udC1zaXplOiAyZW07XHJcbiAgbWFyZ2luOiAwLjY3ZW0gMDtcclxufVxyXG5cclxuLyogR3JvdXBpbmcgY29udGVudFxyXG4gICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xyXG5cclxuLyoqXHJcbiAqIDEuIEFkZCB0aGUgY29ycmVjdCBib3ggc2l6aW5nIGluIEZpcmVmb3guXHJcbiAqIDIuIFNob3cgdGhlIG92ZXJmbG93IGluIEVkZ2UgYW5kIElFLlxyXG4gKi9cclxuXHJcbmhyIHtcclxuICBib3gtc2l6aW5nOiBjb250ZW50LWJveDsgLyogMSAqL1xyXG4gIGhlaWdodDogMDsgLyogMSAqL1xyXG4gIG92ZXJmbG93OiB2aXNpYmxlOyAvKiAyICovXHJcbn1cclxuXHJcbi8qKlxyXG4gKiAxLiBDb3JyZWN0IHRoZSBpbmhlcml0YW5jZSBhbmQgc2NhbGluZyBvZiBmb250IHNpemUgaW4gYWxsIGJyb3dzZXJzLlxyXG4gKiAyLiBDb3JyZWN0IHRoZSBvZGQgYGVtYCBmb250IHNpemluZyBpbiBhbGwgYnJvd3NlcnMuXHJcbiAqL1xyXG5cclxucHJlIHtcclxuICBmb250LWZhbWlseTogbW9ub3NwYWNlLCBtb25vc3BhY2U7IC8qIDEgKi9cclxuICBmb250LXNpemU6IDFlbTsgLyogMiAqL1xyXG59XHJcblxyXG4vKiBUZXh0LWxldmVsIHNlbWFudGljc1xyXG4gICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xyXG5cclxuLyoqXHJcbiAqIFJlbW92ZSB0aGUgZ3JheSBiYWNrZ3JvdW5kIG9uIGFjdGl2ZSBsaW5rcyBpbiBJRSAxMC5cclxuICovXHJcblxyXG5hIHtcclxuICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDtcclxufVxyXG5cclxuLyoqXHJcbiAqIDEuIFJlbW92ZSB0aGUgYm90dG9tIGJvcmRlciBpbiBDaHJvbWUgNTctXHJcbiAqIDIuIEFkZCB0aGUgY29ycmVjdCB0ZXh0IGRlY29yYXRpb24gaW4gQ2hyb21lLCBFZGdlLCBJRSwgT3BlcmEsIGFuZCBTYWZhcmkuXHJcbiAqL1xyXG5cclxuYWJiclt0aXRsZV0ge1xyXG4gIGJvcmRlci1ib3R0b206IG5vbmU7IC8qIDEgKi9cclxuICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsgLyogMiAqL1xyXG4gIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lIGRvdHRlZDsgLyogMiAqL1xyXG59XHJcblxyXG4vKipcclxuICogQWRkIHRoZSBjb3JyZWN0IGZvbnQgd2VpZ2h0IGluIENocm9tZSwgRWRnZSwgYW5kIFNhZmFyaS5cclxuICovXHJcblxyXG5iLFxyXG5zdHJvbmcge1xyXG4gIGZvbnQtd2VpZ2h0OiBib2xkZXI7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiAxLiBDb3JyZWN0IHRoZSBpbmhlcml0YW5jZSBhbmQgc2NhbGluZyBvZiBmb250IHNpemUgaW4gYWxsIGJyb3dzZXJzLlxyXG4gKiAyLiBDb3JyZWN0IHRoZSBvZGQgYGVtYCBmb250IHNpemluZyBpbiBhbGwgYnJvd3NlcnMuXHJcbiAqL1xyXG5cclxuY29kZSxcclxua2JkLFxyXG5zYW1wIHtcclxuICBmb250LWZhbWlseTogbW9ub3NwYWNlLCBtb25vc3BhY2U7IC8qIDEgKi9cclxuICBmb250LXNpemU6IDFlbTsgLyogMiAqL1xyXG59XHJcblxyXG4vKipcclxuICogQWRkIHRoZSBjb3JyZWN0IGZvbnQgc2l6ZSBpbiBhbGwgYnJvd3NlcnMuXHJcbiAqL1xyXG5cclxuc21hbGwge1xyXG4gIGZvbnQtc2l6ZTogODAlO1xyXG59XHJcblxyXG4vKipcclxuICogUHJldmVudCBgc3ViYCBhbmQgYHN1cGAgZWxlbWVudHMgZnJvbSBhZmZlY3RpbmcgdGhlIGxpbmUgaGVpZ2h0IGluXHJcbiAqIGFsbCBicm93c2Vycy5cclxuICovXHJcblxyXG5zdWIsXHJcbnN1cCB7XHJcbiAgZm9udC1zaXplOiA3NSU7XHJcbiAgbGluZS1oZWlnaHQ6IDA7XHJcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xyXG4gIHZlcnRpY2FsLWFsaWduOiBiYXNlbGluZTtcclxufVxyXG5cclxuc3ViIHtcclxuICBib3R0b206IC0wLjI1ZW07XHJcbn1cclxuXHJcbnN1cCB7XHJcbiAgdG9wOiAtMC41ZW07XHJcbn1cclxuXHJcbi8qIEVtYmVkZGVkIGNvbnRlbnRcclxuICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cclxuXHJcbi8qKlxyXG4gKiBSZW1vdmUgdGhlIGJvcmRlciBvbiBpbWFnZXMgaW5zaWRlIGxpbmtzIGluIElFIDEwLlxyXG4gKi9cclxuXHJcbmltZyB7XHJcbiAgYm9yZGVyLXN0eWxlOiBub25lO1xyXG59XHJcblxyXG4vKiBGb3Jtc1xyXG4gICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xyXG5cclxuLyoqXHJcbiAqIDEuIENoYW5nZSB0aGUgZm9udCBzdHlsZXMgaW4gYWxsIGJyb3dzZXJzLlxyXG4gKiAyLiBSZW1vdmUgdGhlIG1hcmdpbiBpbiBGaXJlZm94IGFuZCBTYWZhcmkuXHJcbiAqL1xyXG5cclxuYnV0dG9uLFxyXG5pbnB1dCxcclxub3B0Z3JvdXAsXHJcbnNlbGVjdCxcclxudGV4dGFyZWEge1xyXG4gIGZvbnQtZmFtaWx5OiBpbmhlcml0OyAvKiAxICovXHJcbiAgZm9udC1zaXplOiAxMDAlOyAvKiAxICovXHJcbiAgbGluZS1oZWlnaHQ6IDEuMTU7IC8qIDEgKi9cclxuICBtYXJnaW46IDA7IC8qIDIgKi9cclxufVxyXG5cclxuLyoqXHJcbiAqIFNob3cgdGhlIG92ZXJmbG93IGluIElFLlxyXG4gKiAxLiBTaG93IHRoZSBvdmVyZmxvdyBpbiBFZGdlLlxyXG4gKi9cclxuXHJcbmJ1dHRvbixcclxuaW5wdXQge1xyXG4gIC8qIDEgKi9cclxuICBvdmVyZmxvdzogdmlzaWJsZTtcclxufVxyXG5cclxuLyoqXHJcbiAqIFJlbW92ZSB0aGUgaW5oZXJpdGFuY2Ugb2YgdGV4dCB0cmFuc2Zvcm0gaW4gRWRnZSwgRmlyZWZveCwgYW5kIElFLlxyXG4gKiAxLiBSZW1vdmUgdGhlIGluaGVyaXRhbmNlIG9mIHRleHQgdHJhbnNmb3JtIGluIEZpcmVmb3guXHJcbiAqL1xyXG5cclxuYnV0dG9uLFxyXG5zZWxlY3Qge1xyXG4gIC8qIDEgKi9cclxuICB0ZXh0LXRyYW5zZm9ybTogbm9uZTtcclxufVxyXG5cclxuLyoqXHJcbiAqIENvcnJlY3QgdGhlIGluYWJpbGl0eSB0byBzdHlsZSBjbGlja2FibGUgdHlwZXMgaW4gaU9TIGFuZCBTYWZhcmkuXHJcbiAqL1xyXG5cclxuYnV0dG9uLFxyXG5bdHlwZT0nYnV0dG9uJ10sXHJcblt0eXBlPSdyZXNldCddLFxyXG5bdHlwZT0nc3VibWl0J10ge1xyXG4gIC13ZWJraXQtYXBwZWFyYW5jZTogYnV0dG9uO1xyXG59XHJcblxyXG4vKipcclxuICogUmVtb3ZlIHRoZSBpbm5lciBib3JkZXIgYW5kIHBhZGRpbmcgaW4gRmlyZWZveC5cclxuICovXHJcblxyXG5idXR0b246Oi1tb3otZm9jdXMtaW5uZXIsXHJcblt0eXBlPSdidXR0b24nXTo6LW1vei1mb2N1cy1pbm5lcixcclxuW3R5cGU9J3Jlc2V0J106Oi1tb3otZm9jdXMtaW5uZXIsXHJcblt0eXBlPSdzdWJtaXQnXTo6LW1vei1mb2N1cy1pbm5lciB7XHJcbiAgYm9yZGVyLXN0eWxlOiBub25lO1xyXG4gIHBhZGRpbmc6IDA7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBSZXN0b3JlIHRoZSBmb2N1cyBzdHlsZXMgdW5zZXQgYnkgdGhlIHByZXZpb3VzIHJ1bGUuXHJcbiAqL1xyXG5cclxuYnV0dG9uOi1tb3otZm9jdXNyaW5nLFxyXG5bdHlwZT0nYnV0dG9uJ106LW1vei1mb2N1c3JpbmcsXHJcblt0eXBlPSdyZXNldCddOi1tb3otZm9jdXNyaW5nLFxyXG5bdHlwZT0nc3VibWl0J106LW1vei1mb2N1c3Jpbmcge1xyXG4gIG91dGxpbmU6IDFweCBkb3R0ZWQgQnV0dG9uVGV4dDtcclxufVxyXG5cclxuLyoqXHJcbiAqIENvcnJlY3QgdGhlIHBhZGRpbmcgaW4gRmlyZWZveC5cclxuICovXHJcblxyXG5maWVsZHNldCB7XHJcbiAgcGFkZGluZzogMC4zNWVtIDAuNzVlbSAwLjYyNWVtO1xyXG59XHJcblxyXG4vKipcclxuICogMS4gQ29ycmVjdCB0aGUgdGV4dCB3cmFwcGluZyBpbiBFZGdlIGFuZCBJRS5cclxuICogMi4gQ29ycmVjdCB0aGUgY29sb3IgaW5oZXJpdGFuY2UgZnJvbSBgZmllbGRzZXRgIGVsZW1lbnRzIGluIElFLlxyXG4gKiAzLiBSZW1vdmUgdGhlIHBhZGRpbmcgc28gZGV2ZWxvcGVycyBhcmUgbm90IGNhdWdodCBvdXQgd2hlbiB0aGV5IHplcm8gb3V0XHJcbiAqICAgIGBmaWVsZHNldGAgZWxlbWVudHMgaW4gYWxsIGJyb3dzZXJzLlxyXG4gKi9cclxuXHJcbmxlZ2VuZCB7XHJcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDsgLyogMSAqL1xyXG4gIGNvbG9yOiBpbmhlcml0OyAvKiAyICovXHJcbiAgZGlzcGxheTogdGFibGU7IC8qIDEgKi9cclxuICBtYXgtd2lkdGg6IDEwMCU7IC8qIDEgKi9cclxuICBwYWRkaW5nOiAwOyAvKiAzICovXHJcbiAgd2hpdGUtc3BhY2U6IG5vcm1hbDsgLyogMSAqL1xyXG59XHJcblxyXG4vKipcclxuICogQWRkIHRoZSBjb3JyZWN0IHZlcnRpY2FsIGFsaWdubWVudCBpbiBDaHJvbWUsIEZpcmVmb3gsIGFuZCBPcGVyYS5cclxuICovXHJcblxyXG5wcm9ncmVzcyB7XHJcbiAgdmVydGljYWwtYWxpZ246IGJhc2VsaW5lO1xyXG59XHJcblxyXG4vKipcclxuICogUmVtb3ZlIHRoZSBkZWZhdWx0IHZlcnRpY2FsIHNjcm9sbGJhciBpbiBJRSAxMCsuXHJcbiAqL1xyXG5cclxudGV4dGFyZWEge1xyXG4gIG92ZXJmbG93OiBhdXRvO1xyXG59XHJcblxyXG4vKipcclxuICogMS4gQWRkIHRoZSBjb3JyZWN0IGJveCBzaXppbmcgaW4gSUUgMTAuXHJcbiAqIDIuIFJlbW92ZSB0aGUgcGFkZGluZyBpbiBJRSAxMC5cclxuICovXHJcblxyXG5bdHlwZT0nY2hlY2tib3gnXSxcclxuW3R5cGU9J3JhZGlvJ10ge1xyXG4gIGJveC1zaXppbmc6IGJvcmRlci1ib3g7IC8qIDEgKi9cclxuICBwYWRkaW5nOiAwOyAvKiAyICovXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBDb3JyZWN0IHRoZSBjdXJzb3Igc3R5bGUgb2YgaW5jcmVtZW50IGFuZCBkZWNyZW1lbnQgYnV0dG9ucyBpbiBDaHJvbWUuXHJcbiAqL1xyXG5cclxuW3R5cGU9J251bWJlciddOjotd2Via2l0LWlubmVyLXNwaW4tYnV0dG9uLFxyXG5bdHlwZT0nbnVtYmVyJ106Oi13ZWJraXQtb3V0ZXItc3Bpbi1idXR0b24ge1xyXG4gIGhlaWdodDogYXV0bztcclxufVxyXG5cclxuLyoqXHJcbiAqIDEuIENvcnJlY3QgdGhlIG9kZCBhcHBlYXJhbmNlIGluIENocm9tZSBhbmQgU2FmYXJpLlxyXG4gKiAyLiBDb3JyZWN0IHRoZSBvdXRsaW5lIHN0eWxlIGluIFNhZmFyaS5cclxuICovXHJcblxyXG5bdHlwZT0nc2VhcmNoJ10ge1xyXG4gIC13ZWJraXQtYXBwZWFyYW5jZTogdGV4dGZpZWxkOyAvKiAxICovXHJcbiAgb3V0bGluZS1vZmZzZXQ6IC0ycHg7IC8qIDIgKi9cclxufVxyXG5cclxuLyoqXHJcbiAqIFJlbW92ZSB0aGUgaW5uZXIgcGFkZGluZyBpbiBDaHJvbWUgYW5kIFNhZmFyaSBvbiBtYWNPUy5cclxuICovXHJcblxyXG5bdHlwZT0nc2VhcmNoJ106Oi13ZWJraXQtc2VhcmNoLWRlY29yYXRpb24ge1xyXG4gIC13ZWJraXQtYXBwZWFyYW5jZTogbm9uZTtcclxufVxyXG5cclxuLyoqXHJcbiAqIDEuIENvcnJlY3QgdGhlIGluYWJpbGl0eSB0byBzdHlsZSBjbGlja2FibGUgdHlwZXMgaW4gaU9TIGFuZCBTYWZhcmkuXHJcbiAqIDIuIENoYW5nZSBmb250IHByb3BlcnRpZXMgdG8gYGluaGVyaXRgIGluIFNhZmFyaS5cclxuICovXHJcblxyXG46Oi13ZWJraXQtZmlsZS11cGxvYWQtYnV0dG9uIHtcclxuICAtd2Via2l0LWFwcGVhcmFuY2U6IGJ1dHRvbjsgLyogMSAqL1xyXG4gIGZvbnQ6IGluaGVyaXQ7IC8qIDIgKi9cclxufVxyXG5cclxuLyogSW50ZXJhY3RpdmVcclxuICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cclxuXHJcbi8qXHJcbiAqIEFkZCB0aGUgY29ycmVjdCBkaXNwbGF5IGluIEVkZ2UsIElFIDEwKywgYW5kIEZpcmVmb3guXHJcbiAqL1xyXG5cclxuZGV0YWlscyB7XHJcbiAgZGlzcGxheTogYmxvY2s7XHJcbn1cclxuXHJcbi8qXHJcbiAqIEFkZCB0aGUgY29ycmVjdCBkaXNwbGF5IGluIGFsbCBicm93c2Vycy5cclxuICovXHJcblxyXG5zdW1tYXJ5IHtcclxuICBkaXNwbGF5OiBsaXN0LWl0ZW07XHJcbn1cclxuXHJcbi8qIE1pc2NcclxuICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cclxuXHJcbi8qKlxyXG4gKiBBZGQgdGhlIGNvcnJlY3QgZGlzcGxheSBpbiBJRSAxMCsuXHJcbiAqL1xyXG5cclxudGVtcGxhdGUge1xyXG4gIGRpc3BsYXk6IG5vbmU7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBBZGQgdGhlIGNvcnJlY3QgZGlzcGxheSBpbiBJRSAxMC5cclxuICovXHJcblxyXG5baGlkZGVuXSB7XHJcbiAgZGlzcGxheTogbm9uZTtcclxufVxyXG4iLCJAaW1wb3J0ICcuL2NvbG9ycyc7XHJcblxyXG4vKiA9PT09PSBCYXNlID09PT09ICovXHJcbmh0bWwsXHJcbmJvZHkge1xyXG4gIGhlaWdodDogMTAwJTtcclxuICBiYWNrZ3JvdW5kOiBAYmdfY29sb3I7XHJcbiAgY29sb3I6IEBwcmltYXJ5X3RleHRfY29sb3I7XHJcbiAgZm9udC1zaXplOiAxNHB4O1xyXG4gIGxpbmUtaGVpZ2h0OiAxNTAlO1xyXG4gIGZvbnQtZmFtaWx5OiAnTWljcm9zb2Z0IFlhSGVpIFVJJywgQXJpYWwsIHNhbnMtc2VyaWY7XHJcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcclxufVxyXG5cclxuYSB7XHJcbiAgJjpsaW5rLFxyXG4gICY6dmlzaXRlZCxcclxuICAmOmhvdmVyIHtcclxuICAgIGNvbG9yOiBAc3VjY2Vzc19jb2xvcjtcclxuICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTtcclxuICB9XHJcblxyXG4gICY6aG92ZXIge1xyXG4gICAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7XHJcbiAgfVxyXG59XHJcblxyXG5jb2RlIHtcclxuICBmb250LWZhbWlseTogJ1NvdXJjZSBDb2RlIFBybycsIENvbnNvbGFzLCBHZW9yZ2lhLCBNb25hY28sIG1vbm9zcGFjZSwgQXJpYWwsXHJcbiAgICBzYW5zLXNlcmlmO1xyXG59XHJcbiIsIi8qID09PT09IFNjcm9sbGJhciA9PT09PSAqL1xyXG46Oi13ZWJraXQtc2Nyb2xsYmFyIHtcclxuICB3aWR0aDogN3B4O1xyXG4gIGhlaWdodDogN3B4O1xyXG4gIC13ZWJraXQtYm9yZGVyLXJhZGl1czogNXB4O1xyXG59XHJcblxyXG46Oi13ZWJraXQtc2Nyb2xsYmFyLXRyYWNrLXBpZWNlIHtcclxuICAtd2Via2l0LWJvcmRlci1yYWRpdXM6IDVweDtcclxufVxyXG5cclxuOjotd2Via2l0LXNjcm9sbGJhci10aHVtYjp2ZXJ0aWNhbCB7XHJcbiAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjI1KTtcclxuICAtd2Via2l0LWJvcmRlci1yYWRpdXM6IDVweDtcclxufVxyXG5cclxuOjotd2Via2l0LXNjcm9sbGJhci10aHVtYjpob3Jpem9udGFsIHtcclxuICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuMjUpO1xyXG4gIC13ZWJraXQtYm9yZGVyLXJhZGl1czogNXB4O1xyXG59XHJcblxyXG46Oi13ZWJraXQtc2Nyb2xsYmFyOmhvdmVyIHtcclxuICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuMTUpO1xyXG59XHJcblxyXG46Oi13ZWJraXQtc2Nyb2xsYmFyLXRodW1iOmhvdmVyIHtcclxuICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuMzUpO1xyXG59XHJcbiIsIkBpbXBvcnQgJy4vY29sb3JzJztcclxuXHJcbi8qIExheW91dCAqL1xyXG4uZG9jcyB7XHJcbiAgZGlzcGxheTogZmxleDtcclxuICBmbGV4LWRpcmVjdGlvbjogcm93O1xyXG4gIGZsZXgtd3JhcDogbm93cmFwO1xyXG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcclxuICB6LWluZGV4OiAxO1xyXG4gIGhlaWdodDogMTAwJTtcclxuICB3aWR0aDogMTAwJTtcclxuICBtYXJnaW46IDA7XHJcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcclxufVxyXG5cclxuLyogQXNpZGUgKi9cclxuLmFzaWRlIHtcclxuICBkaXNwbGF5OiBmbGV4O1xyXG4gIGZsZXgtc2hyaW5rOiAwO1xyXG4gIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XHJcbiAgZmxleC13cmFwOiBub3dyYXA7XHJcbiAgd2lkdGg6IDI2MHB4O1xyXG4gIG1hcmdpbjogMDtcclxuICBoZWlnaHQ6IDEwMCU7XHJcbiAgYmFja2dyb3VuZC1jb2xvcjogQHByaW1hcnlfdGV4dF9jb2xvcjtcclxuICBjb2xvcjogQGJvcmRlcl9jb2xvcjtcclxuICBib3gtc2hhZG93OiAwIDAgNXB4IDJweCBAYm9yZGVyX2NvbG9yO1xyXG4gIHRyYW5zaXRpb24tZHVyYXRpb246IDAuM3M7XHJcbiAgb3ZlcmZsb3c6IGF1dG87XHJcbn1cclxuXHJcbi8qIE1haW4gKi9cclxuLm1haW4ge1xyXG4gIGZsZXg6IDE7XHJcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xyXG4gIHotaW5kZXg6IDE7XHJcbiAgaGVpZ2h0OiAxMDAlO1xyXG4gIGJhY2tncm91bmQtY29sb3I6IEB3aGl0ZTtcclxuICBvdmVyZmxvdzogYXV0bztcclxufVxyXG5cclxuQG1lZGlhIChtYXgtd2lkdGg6IDUwMHB4KSB7XHJcbiAgLmRvY3Mge1xyXG4gICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcclxuICB9XHJcblxyXG4gIC5hc2lkZSxcclxuICAubWFpbiB7XHJcbiAgICB3aWR0aDogMTAwJTtcclxuICB9XHJcblxyXG4gIC5hc2lkZSB7XHJcbiAgICBwb3NpdGlvbjogZml4ZWQ7XHJcbiAgICB6LWluZGV4OiAzO1xyXG4gICAgdG9wOiAwO1xyXG5cclxuICAgICYub3V0bGluZS1uYXZpZ2F0b3Ige1xyXG4gICAgICAmX2ZvbGRlZCB7XHJcbiAgICAgICAgbGVmdDogLTEwMCU7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgICZfZXhwYW5kZWQge1xyXG4gICAgICAgIGxlZnQ6IDA7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcbn1cclxuIiwiQGltcG9ydCAnLi9jb2xvcnMnO1xyXG5cclxuLmFzaWRlIHtcclxuICBmb250LWZhbWlseTogJ1NvdXJjZSBDb2RlIFBybycsIENvbnNvbGFzLCBHZW9yZ2lhLCBNb25hY28sIG1vbm9zcGFjZSwgQXJpYWwsXHJcbiAgICBzYW5zLXNlcmlmO1xyXG5cclxuICAmX19oZWFkZXIge1xyXG4gICAgbWFyZ2luOiAwIGF1dG87XHJcbiAgICBmbGV4LXNocmluazogMDtcclxuICAgIG92ZXJmbG93OiBoaWRkZW47XHJcbiAgfVxyXG5cclxuICAmX19uYXYge1xyXG4gICAgZmxleDogMTtcclxuICAgIG92ZXJmbG93OiBhdXRvO1xyXG4gIH1cclxuXHJcbiAgJl9faDIge1xyXG4gICAgbWFyZ2luOiAwIGF1dG87XHJcbiAgICBoZWlnaHQ6IDU0cHg7XHJcbiAgICBsaW5lLWhlaWdodDogNTRweDtcclxuICAgIGZvbnQtc2l6ZTogMjBweDtcclxuICAgIGZvbnQtd2VpZ2h0OiBub3JtYWw7XHJcbiAgICBmb250LWZhbWlseTogR2VvcmdpYSwgQ29uc29sYXMsIEFyaWFsLCBzYW5zLXNlcmlmO1xyXG4gICAgdGV4dC1hbGlnbjogY2VudGVyO1xyXG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcclxuICB9XHJcblxyXG4gICZfX2gzIHtcclxuICAgIG1hcmdpbjogMCBhdXRvO1xyXG4gICAgcGFkZGluZzogMCAyMHB4O1xyXG4gICAgZm9udC1zaXplOiAxNnB4O1xyXG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcclxuICB9XHJcblxyXG4gICZfX2xpc3Qge1xyXG4gICAgbWFyZ2luOiAwO1xyXG4gICAgcGFkZGluZzogMTBweCAwO1xyXG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcclxuICB9XHJcblxyXG4gICZfX2l0ZW0ge1xyXG4gICAgaGVpZ2h0OiAzMnB4O1xyXG4gICAgbGluZS1oZWlnaHQ6IDMycHg7XHJcbiAgICBwYWRkaW5nOiAwIDMwcHg7XHJcbiAgICBjdXJzb3I6IHBvaW50ZXI7XHJcbiAgICBmb250LXNpemU6IDEzcHg7XHJcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xyXG4gIH1cclxuXHJcbiAgJi1uYXZpZ2F0b3Ige1xyXG4gICAgZmxleDogMTtcclxuXHJcbiAgICAub3V0bGluZS1uYXZpZ2F0b3Ige1xyXG4gICAgICAmX19tYWluIHtcclxuICAgICAgICAmOjotd2Via2l0LXNjcm9sbGJhci10aHVtYiB7XHJcbiAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAdGhpcmRfdGV4dF9jb2xvcjtcclxuXHJcbiAgICAgICAgICAmOmhvdmVyIHtcclxuICAgICAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogQGZvdXJ0aF90ZXh0X2NvbG9yO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgJl9fcGxhY2Vob2xkZXIge1xyXG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6IEBzZWNvbmRhcnlfdGV4dF9jb2xvcjtcclxuICAgICAgICBib3JkZXItbGVmdDogM3B4IHNvbGlkIEB3aGl0ZTtcclxuICAgICAgfVxyXG5cclxuICAgICAgJl9fYW5jaG9yIHtcclxuICAgICAgICAmOmxpbmsge1xyXG4gICAgICAgICAgY29sb3I6IEBib3JkZXJfY29sb3I7XHJcbiAgICAgICAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAmOnZpc2l0ZWQge1xyXG4gICAgICAgICAgY29sb3I6IEBib3JkZXJfY29sb3I7XHJcbiAgICAgICAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAmOmhvdmVyIHtcclxuICAgICAgICAgIGNvbG9yOiBAYm9yZGVyX2NvbG9yO1xyXG4gICAgICAgICAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICAmX2FjdGl2ZSB7XHJcbiAgICAgICAgJi5vdXRsaW5lLW5hdmlnYXRvcl9fYW5jaG9yIHtcclxuICAgICAgICAgICY6bGluayxcclxuICAgICAgICAgICY6dmlzaXRlZCxcclxuICAgICAgICAgICY6aG92ZXIge1xyXG4gICAgICAgICAgICBjb2xvcjogQHdoaXRlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxufVxyXG4iLCJAaW1wb3J0ICcuL2NvbG9ycyc7XHJcblxyXG4ubWFpbiB7XHJcbiAgJl9faGVhZGVyLFxyXG4gICZfX2Zvb3RlciB7XHJcbiAgICBtYXJnaW46IDAgYXV0bztcclxuICAgIHBhZGRpbmc6IDFlbTtcclxuICAgIHRleHQtYWxpZ246IGNlbnRlcjtcclxuICAgIG92ZXJmbG93OiBoaWRkZW47XHJcbiAgfVxyXG5cclxuICAmX19oMSB7XHJcbiAgICBtYXJnaW46IDAgYXV0bztcclxuICAgIHBhZGRpbmctdG9wOiAxZW07XHJcbiAgICBmb250LXNpemU6IDVlbTtcclxuICAgIGZvbnQtd2VpZ2h0OiBub3JtYWw7XHJcbiAgICBsaW5lLWhlaWdodDogMmVtO1xyXG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcclxuICB9XHJcblxyXG4gICZfX25hbWUge1xyXG4gICAgY29sb3I6ICM1MDdhZmU7XHJcbiAgICBmb250LXdlaWdodDogbm9ybWFsO1xyXG4gIH1cclxuXHJcbiAgJl9fdGFnbGluZSB7XHJcbiAgICBtYXJnaW46IDFlbSBhdXRvO1xyXG4gICAgbWF4LXdpZHRoOiA5NjBweDtcclxuICAgIGxpbmUtaGVpZ2h0OiAxLjNlbTtcclxuICAgIGZvbnQtc2l6ZTogMmVtO1xyXG4gICAgY29sb3I6IEBmb3VydGhfdGV4dF9jb2xvcjtcclxuICAgIGZvbnQtd2VpZ2h0OiAxMDA7XHJcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xyXG4gIH1cclxuXHJcbiAgJl9fY2RuIHtcclxuICAgIG1hcmdpbjogMmVtIDA7XHJcbiAgICBwYWRkaW5nOiAyZW07XHJcbiAgICBmb250LXNpemU6IDE2cHg7XHJcbiAgICBsaW5lLWhlaWdodDogMTUwJTtcclxuICAgIHRleHQtYWxpZ246IGNlbnRlcjtcclxuICAgIGJhY2tncm91bmQtY29sb3I6IEBiZ19jb2xvcjtcclxuICAgIGJvcmRlci10b3A6IDFweCBzb2xpZCBAYm9yZGVyX2NvbG9yO1xyXG4gICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIEBib3JkZXJfY29sb3I7XHJcbiAgICBjb2xvcjogQHRoaXJkX3RleHRfY29sb3I7XHJcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xyXG4gIH1cclxuXHJcbiAgJl9fZG93bmxvYWQge1xyXG4gICAgbWFyZ2luOiAxZW0gYXV0bztcclxuICAgIHdpZHRoOiAyMDBweDtcclxuICAgIHRleHQtYWxpZ246IGNlbnRlcjtcclxuICAgIG92ZXJmbG93OiBoaWRkZW47XHJcbiAgfVxyXG5cclxuICAmX19idXR0b24ge1xyXG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xyXG4gICAgYm9yZGVyLXJhZGl1czogNHB4O1xyXG4gICAgcGFkZGluZzogMTRweCAyOXB4O1xyXG4gICAgZm9udC1zaXplOiAxOHB4O1xyXG4gICAgZm9udC1mYW1pbHk6ICdTb3VyY2UgQ29kZSBQcm8nLCBDb25zb2xhcywgR2VvcmdpYSwgTW9uYWNvLCBtb25vc3BhY2UsIEFyaWFsLFxyXG4gICAgICBzYW5zLXNlcmlmO1xyXG4gICAgYmFja2dyb3VuZC1jb2xvcjogQHN1Y2Nlc3NfY29sb3I7XHJcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xyXG5cclxuICAgICY6bGluayxcclxuICAgICY6dmlzaXRlZCxcclxuICAgICY6aG92ZXIge1xyXG4gICAgICBjb2xvcjogQHdoaXRlO1xyXG4gICAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAmX19mb290ZXIge1xyXG4gICAgbWFyZ2luOiAwIDNlbTtcclxuICAgIGJvcmRlci10b3A6IDFweCBzb2xpZCBAYm9yZGVyX2NvbG9yO1xyXG4gIH1cclxufVxyXG4iLCJAaW1wb3J0ICcuL2NvbG9ycyc7XHJcblxyXG4uc2VjdGlvbiB7XHJcbiAgbWFyZ2luOiAxZW0gMDtcclxuICBvdmVyZmxvdzogaGlkZGVuO1xyXG5cclxuICAmX19oZWFkZXIsXHJcbiAgJl9fY29udGVudCxcclxuICAmX19mb290ZXIge1xyXG4gICAgbWFyZ2luOiAwO1xyXG4gICAgcGFkZGluZzogMCAzZW07XHJcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xyXG4gIH1cclxuXHJcbiAgJl9fdGl0bGUge1xyXG4gICAgY29sb3I6IEB0aGlyZF90ZXh0X2NvbG9yO1xyXG4gIH1cclxuXHJcbiAgJl9faDMge1xyXG4gICAgY29sb3I6IEBwcmltYXJ5X2NvbG9yO1xyXG4gICAgZm9udC1zaXplOiAxLjM1ZW07XHJcbiAgfVxyXG5cclxuICAmX19oNCB7XHJcbiAgICBmb250LXNpemU6IDEuMWVtO1xyXG4gICAgY29sb3I6IEB0aGlyZF90ZXh0X2NvbG9yO1xyXG4gIH1cclxuXHJcbiAgJl9faDUge1xyXG4gICAgZm9udC1zaXplOiAxZW07XHJcbiAgICBjb2xvcjogQGZvdXJ0aF90ZXh0X2NvbG9yO1xyXG4gIH1cclxuXHJcbiAgJl9fZGwsXHJcbiAgJl9fZHQsXHJcbiAgJl9fZGQge1xyXG4gICAgbWFyZ2luOiAwO1xyXG4gICAgcGFkZGluZzogMDtcclxuICAgIG92ZXJmbG93OiBoaWRkZW47XHJcbiAgfVxyXG5cclxuICAmX19kbCB7XHJcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XHJcbiAgICB6LWluZGV4OiAxO1xyXG4gIH1cclxuXHJcbiAgJl9fZHQge1xyXG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xyXG4gIH1cclxuXHJcbiAgJl9fZGQge1xyXG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xyXG4gICAgY29sb3I6IEBzdWNjZXNzX2NvbG9yO1xyXG4gIH1cclxuXHJcbiAgJl9fcHJlIHtcclxuICAgIG1hcmdpbjogMmVtIDA7XHJcbiAgICBwYWRkaW5nOiAxZW07XHJcbiAgICBmb250LXNpemU6IDE0cHg7XHJcbiAgICBsaW5lLWhlaWdodDogMTUwJTtcclxuICAgIHRleHQtYWxpZ246IGxlZnQ7XHJcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAYmdfY29sb3I7XHJcbiAgICBib3JkZXI6IDFweCBzb2xpZCBAYm9yZGVyX2NvbG9yO1xyXG4gICAgYm9yZGVyLXJhZGl1czogNHB4O1xyXG4gICAgY29sb3I6IEB0aGlyZF90ZXh0X2NvbG9yO1xyXG4gICAgb3ZlcmZsb3c6IGF1dG87XHJcbiAgfVxyXG5cclxuICAmX19jb2RlIHtcclxuICAgIGRpc3BsYXk6IGJsb2NrO1xyXG4gICAgbWFyZ2luOiAwIGF1dG87XHJcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xyXG4gIH1cclxuXHJcbiAgJl9fZm9vdGVyIHtcclxuICAgIGJvcmRlci10b3A6IDFweCBzb2xpZCBAYm9yZGVyX2NvbG9yO1xyXG4gICAgbWFyZ2luLXRvcDogM2VtO1xyXG4gICAgYmFja2dyb3VuZC1jb2xvcjogQGJnX2NvbG9yO1xyXG4gICAgY29sb3I6IEBmb3VydGhfdGV4dF9jb2xvcjtcclxuICB9XHJcblxyXG4gICZfX3RhYmxlIHtcclxuICAgIG1hcmdpbjogMWVtIGF1dG87XHJcbiAgICB3aWR0aDogMTAwJTtcclxuICAgIGJvcmRlci10b3A6IDFweCBzb2xpZCBAYm9yZGVyX2NvbG9yO1xyXG4gIH1cclxuXHJcbiAgJl9fdGgsXHJcbiAgJl9fdGQge1xyXG4gICAgcGFkZGluZzogNXB4IDE2cHg7XHJcbiAgICBsaW5lLWhlaWdodDogMjZweDtcclxuICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCBAYm9yZGVyX2NvbG9yO1xyXG4gIH1cclxuXHJcbiAgJl9fdGgge1xyXG4gICAgdGV4dC1hbGlnbjogY2VudGVyO1xyXG4gICAgYmFja2dyb3VuZC1jb2xvcjogQGJnX2NvbG9yO1xyXG4gIH1cclxufVxyXG5cclxuQG1lZGlhIChtYXgtd2lkdGg6IDUwMHB4KSB7XHJcbiAgLnNlY3Rpb24ge1xyXG4gICAgJl9faGVhZGVyLFxyXG4gICAgJl9fY29udGVudCB7XHJcbiAgICAgIHBhZGRpbmc6IDAgMWVtO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG4iLCJAaW1wb3J0ICcuL2NvbG9ycyc7XHJcblxyXG4uY2FzZSB7XHJcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xyXG4gIHotaW5kZXg6IDE7XHJcbiAgZGlzcGxheTogZ3JpZDtcclxuICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IHJlcGVhdCgyLCAxZnIpO1xyXG4gIGdhcDogNDBweDtcclxuICBwYWRkaW5nOiAxZW07XHJcbiAgYm9yZGVyLXRvcDogMXB4IHNvbGlkIEBib3JkZXJfY29sb3I7XHJcbiAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIEBib3JkZXJfY29sb3I7XHJcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcclxuXHJcbiAgJjphZnRlciB7XHJcbiAgICBjb250ZW50OiAnJztcclxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcclxuICAgIHotaW5kZXg6IDI7XHJcbiAgICB0b3A6IDA7XHJcbiAgICBsZWZ0OiA1MCU7XHJcbiAgICBoZWlnaHQ6IDEwMCU7XHJcbiAgICB3aWR0aDogMDtcclxuICAgIGJvcmRlci1sZWZ0OiAxcHggc29saWQgQGJvcmRlcl9jb2xvcjtcclxuICAgIG92ZXJmbG93OiBoaWRkZW47XHJcbiAgfVxyXG5cclxuICAmX19wcmUsXHJcbiAgJl9fdGV4dGFyZWEge1xyXG4gICAgZm9udC1zaXplOiAxM3B4O1xyXG4gICAgbGluZS1oZWlnaHQ6IDE1MCU7XHJcbiAgfVxyXG5cclxuICAmX19wcmUsXHJcbiAgJl9fY29kZSxcclxuICAmX190ZXh0YXJlYSB7XHJcbiAgICBmb250LWZhbWlseTogJ0NvdXJpZXIgTmV3JywgQ29uc29sYXMsIEdlb3JnaWEsIEFyaWFsLCBzYW5zLXNlcmlmO1xyXG4gIH1cclxuXHJcbiAgJl9fcHJlIHtcclxuICAgIG1hcmdpbjogMDtcclxuICAgIHBhZGRpbmc6IDFlbTtcclxuICAgIGJhY2tncm91bmQtY29sb3I6IEBiZ19jb2xvcjtcclxuICAgIGhlaWdodDogMTAwJTtcclxuICAgIGJvcmRlci1yYWRpdXM6IDRweDtcclxuICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XHJcbiAgICBvdmVyZmxvdzogYXV0bztcclxuICB9XHJcblxyXG4gICZfX3Rvb2xiYXIge1xyXG4gICAgbWFyZ2luOiAwIGF1dG87XHJcbiAgICBoZWlnaHQ6IDM2cHg7XHJcbiAgICBsaW5lLWhlaWdodDogMzZweDtcclxuICAgIGZvbnQtc2l6ZTogMTRweDtcclxuICAgIHBhZGRpbmc6IDAgMTZweDtcclxuICAgIHRleHQtYWxpZ246IHJpZ2h0O1xyXG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcclxuICB9XHJcblxyXG4gICZfX2FjdGlvbixcclxuICAmX19yZW1vdmUge1xyXG4gICAgY3Vyc29yOiBwb2ludGVyO1xyXG4gICAgY29sb3I6IEBzdWNjZXNzX2NvbG9yO1xyXG4gICAgdXNlci1zZWxlY3Q6IG5vbmU7XHJcbiAgfVxyXG5cclxuICAmX19hY3Rpb24ge1xyXG4gICAgZm9udC1zaXplOiAxM3B4O1xyXG4gICAgcGFkZGluZy1sZWZ0OiAxMHB4O1xyXG5cclxuICAgICY6Zmlyc3QtY2hpbGQge1xyXG4gICAgICBwYWRkaW5nLWxlZnQ6IDA7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAmX19yZW1vdmUge1xyXG4gICAgZmxvYXQ6IHJpZ2h0O1xyXG4gIH1cclxuXHJcbiAgJl9fY29uc29sZSB7XHJcbiAgICBtYXJnaW46IDAgYXV0bztcclxuICAgIGhlaWdodDogMTgwcHg7XHJcbiAgICBib3JkZXI6IDFweCBzb2xpZCBAYm9yZGVyX2NvbG9yO1xyXG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcclxuICB9XHJcblxyXG4gICZfX3RleHRhcmVhIHtcclxuICAgIG1hcmdpbjogMCBhdXRvO1xyXG4gICAgd2lkdGg6IDEwMCU7XHJcbiAgICBoZWlnaHQ6IDEwMCU7XHJcbiAgICBib3JkZXI6IG5vbmU7XHJcbiAgICBvdXRsaW5lOiBub25lO1xyXG4gICAgcGFkZGluZzogMWVtO1xyXG4gICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcclxuICAgIG92ZXJmbG93OiBhdXRvO1xyXG4gIH1cclxuXHJcbiAgJl9fbGlzdCxcclxuICAmX19pdGVtIHtcclxuICAgIG1hcmdpbjogMDtcclxuICAgIHBhZGRpbmc6IDA7XHJcbiAgICBsaXN0LXN0eWxlLXR5cGU6IG5vbmU7XHJcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xyXG4gIH1cclxuXHJcbiAgJl9fbGlzdCB7XHJcbiAgICBoZWlnaHQ6IDM2MHB4O1xyXG4gICAgYm9yZGVyLXRvcDogMXB4IHNvbGlkIEBib3JkZXJfY29sb3I7XHJcbiAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgQGJvcmRlcl9jb2xvcjtcclxuICAgIGZvbnQtc2l6ZTogMTNweDtcclxuICAgIG92ZXJmbG93OiBhdXRvO1xyXG4gIH1cclxuXHJcbiAgJl9faXRlbSB7XHJcbiAgICBoZWlnaHQ6IDM2cHg7XHJcbiAgICBsaW5lLWhlaWdodDogMzZweDtcclxuICAgIGN1cnNvcjogcG9pbnRlcjtcclxuICAgIHBhZGRpbmc6IDAgMTZweDtcclxuXHJcbiAgICAmOmhvdmVyIHtcclxuICAgICAgYmFja2dyb3VuZC1jb2xvcjogQGhvdmVyX2JnX2NvbG9yO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG4iLCI6cm9vdCB7XHJcbiAgLS1vdXRsaW5lLXpJbmRleDogMjAwMDtcclxuICAtLW91dGxpbmUtc3RpY2t5LWhlaWdodDogMTAwJTtcclxuICAtLW91dGxpbmUtbmF2aWdhdG9yLXdpZHRoOiAxMDAlO1xyXG59XHJcbiIsIi8qID09PT09PT09PT0gaWNvbi50aGVtZSAtIHN2ZyDlm77moIfnmoTmoLflvI8gPT09PT09PT09PSAqL1xyXG4ub3V0bGluZS1pY29uIHtcclxuICBwb3NpdGlvbjogcmVsYXRpdmU7XHJcbiAgei1pbmRleDogMTtcclxuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XHJcbiAgdmVydGljYWwtYWxpZ246IG1pZGRsZTtcclxuICB3aWR0aDogMWVtO1xyXG4gIGhlaWdodDogMWVtO1xyXG4gIG92ZXJmbG93OiBoaWRkZW47XHJcblxyXG4gICZfX3N2ZyB7XHJcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XHJcbiAgICB6LWluZGV4OiAyO1xyXG4gICAgdG9wOiA1MCU7XHJcbiAgICBsZWZ0OiA1MCU7XHJcbiAgICB3aWR0aDogMWVtO1xyXG4gICAgaGVpZ2h0OiAxZW07XHJcbiAgICBmaWxsOiBjdXJyZW50Y29sb3I7XHJcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCAtNTAlKTtcclxuICAgIG92ZXJmbG93OiBoaWRkZW47XHJcbiAgfVxyXG5cclxuICAmX2hpZGRlbiB7XHJcbiAgICBkaXNwbGF5OiBub25lO1xyXG4gIH1cclxufVxyXG4iLCIvKiA9PT09PSBTY3JvbGxiYXIgPT09PT0gKi9cclxuOjotd2Via2l0LXNjcm9sbGJhciB7XHJcbiAgd2lkdGg6IDdweDtcclxuICBoZWlnaHQ6IDdweDtcclxuICAtd2Via2l0LWJvcmRlci1yYWRpdXM6IDVweDtcclxuXHJcbiAgJi10cmFjay1waWVjZSB7XHJcbiAgICAtd2Via2l0LWJvcmRlci1yYWRpdXM6IDVweDtcclxuICB9XHJcblxyXG4gICYtdGh1bWIge1xyXG4gICAgJjp2ZXJ0aWNhbCB7XHJcbiAgICAgIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMCwgMCwgMCwgMC4yNSk7XHJcbiAgICAgIC13ZWJraXQtYm9yZGVyLXJhZGl1czogNXB4O1xyXG4gICAgfVxyXG5cclxuICAgICY6aG9yaXpvbnRhbCB7XHJcbiAgICAgIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMCwgMCwgMCwgMC4yNSk7XHJcbiAgICAgIC13ZWJraXQtYm9yZGVyLXJhZGl1czogNXB4O1xyXG4gICAgfVxyXG5cclxuICAgICY6aG92ZXIge1xyXG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuMzUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgJjpob3ZlciB7XHJcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuMTUpO1xyXG4gIH1cclxufVxyXG4iLCJAaW1wb3J0ICcuLi90aGVtZS9jb2xvcnMnO1xyXG5cclxuLm91dGxpbmUtaGVhZGluZyB7XHJcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xyXG4gIHotaW5kZXg6IDE7XHJcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcclxuXHJcbiAgJl9fYW5jaG9yIHtcclxuICAgIGRpc3BsYXk6IG5vbmU7XHJcblxyXG4gICAgJjpsaW5rLFxyXG4gICAgJjp2aXNpdGVkLFxyXG4gICAgJjpob3ZlciB7XHJcbiAgICAgIGNvbG9yOiBAZm91cnRoX3RleHRfY29sb3I7XHJcbiAgICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTtcclxuICAgIH1cclxuXHJcbiAgICAmOmhvdmVyIHtcclxuICAgICAgY29sb3I6IEBwcmltYXJ5X2NvbG9yO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgJjpob3ZlciB7XHJcbiAgICAub3V0bGluZS1oZWFkaW5nX19hbmNob3Ige1xyXG4gICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAmX3N0YXJ0IHtcclxuICAgICY6aG92ZXIge1xyXG4gICAgICBvdmVyZmxvdzogdmlzaWJsZTtcclxuICAgIH1cclxuXHJcbiAgICAub3V0bGluZS1oZWFkaW5nX19hbmNob3Ige1xyXG4gICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XHJcbiAgICAgIHotaW5kZXg6IDI7XHJcbiAgICAgIHRvcDogNTAlO1xyXG4gICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTUwJSk7XHJcbiAgICAgIGxlZnQ6IC0xZW07XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbiIsIkBpbXBvcnQgJy4uL3RoZW1lL3ZhcmlhYmxlcyc7XHJcbkBpbXBvcnQgJy4uL3RoZW1lL2NvbG9ycyc7XHJcbkBpbXBvcnQgJy4uL3RoZW1lL3NoYWRvdyc7XHJcblxyXG4ub3V0bGluZS1kcmF3ZXIge1xyXG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcclxuICB6LWluZGV4OiAtMTtcclxuICB0b3A6IDA7XHJcbiAgbGVmdDogMDtcclxuICBtYXJnaW46IDA7XHJcbiAgd2lkdGg6IDEwMCU7XHJcbiAgaGVpZ2h0OiAxMDAlO1xyXG4gIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XHJcbiAgdmlzaWJpbGl0eTogaGlkZGVuO1xyXG4gIG92ZXJmbG93OiBoaWRkZW47XHJcblxyXG4gICZfX21vZGFsIHtcclxuICAgIC5zaGFkb3dfbGlnaHRfcmVndWxhcigpO1xyXG4gICAgZGlzcGxheTogZmxleDtcclxuICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XHJcbiAgICBmbGV4LXdyYXA6IG5vd3JhcDtcclxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcclxuICAgIHotaW5kZXg6IDIxO1xyXG4gICAgaGVpZ2h0OiAxMDAlO1xyXG4gICAgYmFja2dyb3VuZC1jb2xvcjogQHdoaXRlO1xyXG4gICAgdHJhbnNpdGlvbi1kdXJhdGlvbjogMC40cztcclxuICAgIG92ZXJmbG93OiBoaWRkZW47XHJcbiAgfVxyXG5cclxuICAmX19oZWFkZXIsXHJcbiAgJl9fbWFpbixcclxuICAmX19mb290ZXIge1xyXG4gICAgd2lkdGg6IDEwMCU7XHJcbiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xyXG4gIH1cclxuXHJcbiAgJl9faGVhZGVyLFxyXG4gICZfX2Zvb3RlciB7XHJcbiAgICBmbGV4LXNocmluazogMDtcclxuICB9XHJcblxyXG4gICZfX3RpdGxlLFxyXG4gICZfX21haW4sXHJcbiAgJl9fZm9vdGVyIHtcclxuICAgIHBhZGRpbmc6IDAgMTZweDtcclxuICB9XHJcblxyXG4gICZfX2hlYWRlcixcclxuICAmX190aXRsZSB7XHJcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XHJcbiAgICB6LWluZGV4OiAxO1xyXG4gICAgbWFyZ2luOiAwIGF1dG87XHJcbiAgICBoZWlnaHQ6IDUycHg7XHJcbiAgICBsaW5lLWhlaWdodDogNTJweDtcclxuICAgIG92ZXJmbG93OiBoaWRkZW47XHJcbiAgfVxyXG5cclxuICAmX190aXRsZSB7XHJcbiAgICBmb250LXNpemU6IDE2cHg7XHJcbiAgICBmb250LXdlaWdodDogNDAwO1xyXG4gICAgbWFyZ2luOiAwIDE2cHg7XHJcbiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xyXG4gICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIEBwcmltYXJ5X2JvcmRlcl9jb2xvcjtcclxuICB9XHJcblxyXG4gICZfX2Nsb3NlIHtcclxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcclxuICAgIHotaW5kZXg6IDI7XHJcbiAgICB0b3A6IDUwJTtcclxuICAgIHJpZ2h0OiAxMnB4O1xyXG4gICAgd2lkdGg6IDIwcHg7XHJcbiAgICBoZWlnaHQ6IDIwcHg7XHJcbiAgICBsaW5lLWhlaWdodDogMjBweDtcclxuICAgIGNvbG9yOiBAZm91cnRoX3RleHRfY29sb3I7XHJcbiAgICBmb250LXNpemU6IDIwcHg7XHJcbiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XHJcbiAgICBjdXJzb3I6IHBvaW50ZXI7XHJcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTUwJSk7XHJcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xyXG5cclxuICAgIC5vdXRsaW5lLWljb24ge1xyXG4gICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XHJcbiAgICAgIHotaW5kZXg6IDI7XHJcbiAgICAgIHRvcDogMDtcclxuICAgICAgbGVmdDogMDtcclxuICAgIH1cclxuXHJcbiAgICAmOmhvdmVyIHtcclxuICAgICAgY29sb3I6IEB0aGlyZF90ZXh0X2NvbG9yO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgJl9fbWFpbiB7XHJcbiAgICBmbGV4OiAxO1xyXG4gICAgb3ZlcmZsb3c6IGF1dG87XHJcblxyXG4gICAgJi5vdmVyZmxvdy1oaWRkZW4ge1xyXG4gICAgICBvdmVyZmxvdzogaGlkZGVuO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgJl9fZm9vdGVyIHtcclxuICAgIG1hcmdpbjogMCBhdXRvO1xyXG4gICAgdGV4dC1hbGlnbjogcmlnaHQ7XHJcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xyXG4gIH1cclxuXHJcbiAgJl9fb3ZlcmxheSB7XHJcbiAgICBjb250ZW50OiAnJztcclxuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcclxuICAgIHotaW5kZXg6IDE7XHJcbiAgICB0b3A6IDA7XHJcbiAgICBsZWZ0OiAwO1xyXG4gICAgd2lkdGg6IDEwMCU7XHJcbiAgICBoZWlnaHQ6IDEwMCU7XHJcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAd2hpdGU7XHJcbiAgICBvcGFjaXR5OiAwLjE7XHJcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xyXG4gIH1cclxuXHJcbiAgJl9ydGwsXHJcbiAgJl9sdHIge1xyXG4gICAgJi5vdXRsaW5lLWRyYXdlciB7XHJcbiAgICAgICZfdGlueSB7XHJcbiAgICAgICAgd2lkdGg6IDI4MHB4O1xyXG4gICAgICB9XHJcblxyXG4gICAgICAmX21pbmkge1xyXG4gICAgICAgIHdpZHRoOiA0ODBweDtcclxuICAgICAgfVxyXG5cclxuICAgICAgJl9zbWFsbCB7XHJcbiAgICAgICAgd2lkdGg6IDU0MHB4O1xyXG4gICAgICB9XHJcblxyXG4gICAgICAmX3JlZ3VsYXIge1xyXG4gICAgICAgIHdpZHRoOiA2ODBweDtcclxuICAgICAgfVxyXG5cclxuICAgICAgJl9tZWRpdW0ge1xyXG4gICAgICAgIHdpZHRoOiA3MjBweDtcclxuICAgICAgfVxyXG5cclxuICAgICAgJl9sYXJnZSB7XHJcbiAgICAgICAgd2lkdGg6IDk2MHB4O1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAmX3J0bCB7XHJcbiAgICBib3JkZXItbGVmdDogMXB4IHNvbGlkIEBwcmltYXJ5X2JvcmRlcl9jb2xvcjtcclxuXHJcbiAgICAmLm91dGxpbmUtZHJhd2VyIHtcclxuICAgICAgJl90aW55IHtcclxuICAgICAgICAmLm91dGxpbmUtZHJhd2VyX2Nsb3NlZCB7XHJcbiAgICAgICAgICByaWdodDogLTI5MHB4O1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgJl9taW5pIHtcclxuICAgICAgICAmLm91dGxpbmUtZHJhd2VyX2Nsb3NlZCB7XHJcbiAgICAgICAgICByaWdodDogLTQ5MHB4O1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgJl9zbWFsbCB7XHJcbiAgICAgICAgJi5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xyXG4gICAgICAgICAgcmlnaHQ6IC01NTBweDtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgICZfcmVndWxhciB7XHJcbiAgICAgICAgJi5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xyXG4gICAgICAgICAgcmlnaHQ6IC02OTBweDtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgICZfbWVkaXVtIHtcclxuICAgICAgICAmLm91dGxpbmUtZHJhd2VyX2Nsb3NlZCB7XHJcbiAgICAgICAgICByaWdodDogLTczMHB4O1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgJl9sYXJnZSB7XHJcbiAgICAgICAgJi5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xyXG4gICAgICAgICAgcmlnaHQ6IC05NzBweDtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gICZfbHRyIHtcclxuICAgIGJvcmRlci1yaWdodDogMXB4IHNvbGlkIEBwcmltYXJ5X2JvcmRlcl9jb2xvcjtcclxuXHJcbiAgICAmLm91dGxpbmUtZHJhd2VyIHtcclxuICAgICAgJl90aW55IHtcclxuICAgICAgICAmLm91dGxpbmUtZHJhd2VyX2Nsb3NlZCB7XHJcbiAgICAgICAgICBsZWZ0OiAtMjkwcHg7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICAmX21pbmkge1xyXG4gICAgICAgICYub3V0bGluZS1kcmF3ZXJfY2xvc2VkIHtcclxuICAgICAgICAgIGxlZnQ6IC00OTBweDtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgICZfc21hbGwge1xyXG4gICAgICAgICYub3V0bGluZS1kcmF3ZXJfY2xvc2VkIHtcclxuICAgICAgICAgIGxlZnQ6IC01NTBweDtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgICZfcmVndWxhciB7XHJcbiAgICAgICAgJi5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xyXG4gICAgICAgICAgbGVmdDogLTY5MHB4O1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgJl9tZWRpdW0ge1xyXG4gICAgICAgICYub3V0bGluZS1kcmF3ZXJfY2xvc2VkIHtcclxuICAgICAgICAgIGxlZnQ6IC03MzBweDtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgICZfbGFyZ2Uge1xyXG4gICAgICAgICYub3V0bGluZS1kcmF3ZXJfY2xvc2VkIHtcclxuICAgICAgICAgIGxlZnQ6IC05NzBweDtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gICZfdHRiLFxyXG4gICZfYnR0IHtcclxuICAgIGxlZnQ6IDA7XHJcbiAgICB3aWR0aDogMTAwJTtcclxuXHJcbiAgICAmLm91dGxpbmUtZHJhd2VyIHtcclxuICAgICAgJl90aW55IHtcclxuICAgICAgICBoZWlnaHQ6IDI0MHB4O1xyXG4gICAgICB9XHJcblxyXG4gICAgICAmX21pbmkge1xyXG4gICAgICAgIGhlaWdodDogMzIwcHg7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgICZfc21hbGwge1xyXG4gICAgICAgIGhlaWdodDogMzYwcHg7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgICZfcmVndWxhciB7XHJcbiAgICAgICAgaGVpZ2h0OiA0MDBweDtcclxuICAgICAgfVxyXG5cclxuICAgICAgJl9tZWRpdW0ge1xyXG4gICAgICAgIGhlaWdodDogNDQwcHg7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgICZfbGFyZ2Uge1xyXG4gICAgICAgIGhlaWdodDogNDgwcHg7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gICZfdHRiIHtcclxuICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCBAcHJpbWFyeV9ib3JkZXJfY29sb3I7XHJcblxyXG4gICAgJi5vdXRsaW5lLWRyYXdlciB7XHJcbiAgICAgICZfdGlueSB7XHJcbiAgICAgICAgJi5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xyXG4gICAgICAgICAgdG9wOiAtMjUwcHg7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICAmX21pbmkge1xyXG4gICAgICAgICYub3V0bGluZS1kcmF3ZXJfY2xvc2VkIHtcclxuICAgICAgICAgIHRvcDogLTMzMHB4O1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgJl9zbWFsbCB7XHJcbiAgICAgICAgJi5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xyXG4gICAgICAgICAgdG9wOiAtMzcwcHg7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICAmX3JlZ3VsYXIge1xyXG4gICAgICAgICYub3V0bGluZS1kcmF3ZXJfY2xvc2VkIHtcclxuICAgICAgICAgIHRvcDogLTQxMHB4O1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgJl9tZWRpdW0ge1xyXG4gICAgICAgICYub3V0bGluZS1kcmF3ZXJfY2xvc2VkIHtcclxuICAgICAgICAgIHRvcDogLTQ1MHB4O1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgJl9sYXJnZSB7XHJcbiAgICAgICAgJi5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xyXG4gICAgICAgICAgdG9wOiAtNDkwcHg7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAmX2J0dCB7XHJcbiAgICB0b3A6IGluaXRpYWw7XHJcbiAgICBib3JkZXItdG9wOiAxcHggc29saWQgQHByaW1hcnlfYm9yZGVyX2NvbG9yO1xyXG5cclxuICAgICYub3V0bGluZS1kcmF3ZXIge1xyXG4gICAgICAmX3Rpbnkge1xyXG4gICAgICAgICYub3V0bGluZS1kcmF3ZXJfY2xvc2VkIHtcclxuICAgICAgICAgIGJvdHRvbTogLTI1MHB4O1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgJl9taW5pIHtcclxuICAgICAgICAmLm91dGxpbmUtZHJhd2VyX2Nsb3NlZCB7XHJcbiAgICAgICAgICBib3R0b206IC0zMzBweDtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgICZfc21hbGwge1xyXG4gICAgICAgICYub3V0bGluZS1kcmF3ZXJfY2xvc2VkIHtcclxuICAgICAgICAgIGJvdHRvbTogLTM3MHB4O1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgJl9yZWd1bGFyIHtcclxuICAgICAgICAmLm91dGxpbmUtZHJhd2VyX2Nsb3NlZCB7XHJcbiAgICAgICAgICBib3R0b206IC00MTBweDtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgICZfbWVkaXVtIHtcclxuICAgICAgICAmLm91dGxpbmUtZHJhd2VyX2Nsb3NlZCB7XHJcbiAgICAgICAgICBib3R0b206IC00NTBweDtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgICZfbGFyZ2Uge1xyXG4gICAgICAgICYub3V0bGluZS1kcmF3ZXJfY2xvc2VkIHtcclxuICAgICAgICAgIGJvdHRvbTogLTQ5MHB4O1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgJl9vcGVuZWQge1xyXG4gICAgdmlzaWJpbGl0eTogdmlzaWJsZTtcclxuICAgIHotaW5kZXg6IHZhcigtLW91dGxpbmUtekluZGV4KTtcclxuXHJcbiAgICAmLm91dGxpbmUtZHJhd2VyIHtcclxuICAgICAgcG9zaXRpb246IGZpeGVkO1xyXG5cclxuICAgICAgJl9ydGwge1xyXG4gICAgICAgIHJpZ2h0OiAwO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAmX2x0ciB7XHJcbiAgICAgICAgbGVmdDogMDtcclxuICAgICAgfVxyXG5cclxuICAgICAgJl90dGIge1xyXG4gICAgICAgIHRvcDogMDtcclxuICAgICAgfVxyXG5cclxuICAgICAgJl9idHQge1xyXG4gICAgICAgIGJvdHRvbTogMDtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgJl9vZmZzZXQge1xyXG4gICAgJi5vdXRsaW5lLWRyYXdlciB7XHJcbiAgICAgICZfcnRsLFxyXG4gICAgICAmX2x0ciB7XHJcbiAgICAgICAgaGVpZ2h0OiBjYWxjKDEwMCUgLSA0ZW0pO1xyXG4gICAgICAgIHRvcDogNTAlO1xyXG4gICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtNTAlKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgJl90dGIsXHJcbiAgICAgICZfYnR0IHtcclxuICAgICAgICB3aWR0aDogY2FsYygxMDAlIC0gNGVtKTtcclxuICAgICAgICBsZWZ0OiA1MCU7XHJcbiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC01MCUpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAmX29wZW5lZCB7XHJcbiAgICAgICAgJi5vdXRsaW5lLWRyYXdlciB7XHJcbiAgICAgICAgICAmX3J0bCB7XHJcbiAgICAgICAgICAgIHJpZ2h0OiAyZW07XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgJl9sdHIge1xyXG4gICAgICAgICAgICBsZWZ0OiAyZW07XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgJl90dGIge1xyXG4gICAgICAgICAgICB0b3A6IDJlbTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAmX2J0dCB7XHJcbiAgICAgICAgICAgIGJvdHRvbTogMmVtO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgJl9hdXRvIHtcclxuICAgICYub3V0bGluZS1kcmF3ZXIge1xyXG4gICAgICAmX3J0bCxcclxuICAgICAgJl9sdHIge1xyXG4gICAgICAgIGhlaWdodDogYXV0bztcclxuICAgICAgICBtYXgtaGVpZ2h0OiBjYWxjKDEwMCUgLSA0ZW0pO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAmX2Z1bGwge1xyXG4gICAgcGFkZGluZzogMDtcclxuICB9XHJcbn1cclxuIiwiLyoqXHJcbiAqIHNoYWRvdy5sZXNzIC0g6Zi05b2x5qC35byP6K6+572uIG1peGlueCDlh73mlbBcclxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxyXG4gKiBDcmVhdGVkIEJ5OiBZYW9oYWl4aWFvXHJcbiAqIFVwZGF0ZTogMjAyMi4zLjIwXHJcbiAqL1xyXG5AaW1wb3J0ICcuL2NvbG9ycyc7XHJcblxyXG4vKiA9PT09PT0g6Zi05b2x5qC35byP6K6+572u5Ye95pWwID09PT09PSAqL1xyXG4uc2hhZG93KEBvZmZzZXQ6IDAgMCA2cHggMXB4LCBAY29sb3I6IEBwcmltYXJ5X2JvcmRlcl9jb2xvcikge1xyXG4gIGJveC1zaGFkb3c6IEBvZmZzZXQgQGNvbG9yO1xyXG59XHJcblxyXG4uc2hhZG93X3JlZ3VsYXIoQGNvbG9yOiBAcHJpbWFyeV9ib3JkZXJfY29sb3IpIHtcclxuICAuc2hhZG93KDAgMCA2cHggMXB4LCBAY29sb3IpO1xyXG59XHJcblxyXG4uc2hhZG93X2xhcmdlKEBjb2xvcjogQHByaW1hcnlfYm9yZGVyX2NvbG9yKSB7XHJcbiAgLnNoYWRvdygwIDAgMTJweCAxcHgsIEBjb2xvcik7XHJcbn1cclxuXHJcbi5zaGFkb3dfbGlnaHRfcmVndWxhcigpIHtcclxuICAuc2hhZG93X3JlZ3VsYXIoKTtcclxufVxyXG5cclxuLnNoYWRvd19saWdodF9sYXJnZSgpIHtcclxuICAuc2hhZG93X2xhcmdlKCk7XHJcbn1cclxuXHJcbi5zaGFkb3dfZGFya19yZWd1bGFyKCkge1xyXG4gIC5zaGFkb3dfcmVndWxhcihAc2Vjb25kYXJ5X2JvcmRlcl9jb2xvcik7XHJcbn1cclxuXHJcbi5zaGFkb3dfZGFya19sYXJnZSgpIHtcclxuICAuc2hhZG93X2xhcmdlKEBzZWNvbmRhcnlfYm9yZGVyX2NvbG9yKTtcclxufVxyXG4iLCJAaW1wb3J0ICcuLi90aGVtZS92YXJpYWJsZXMnO1xyXG5AaW1wb3J0ICcuLi90aGVtZS9jb2xvcnMnO1xyXG5AaW1wb3J0ICcuLi90aGVtZS9lbGxpcHNpcyc7XHJcblxyXG4ub3V0bGluZS1uYXZpZ2F0b3Ige1xyXG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcclxuICB6LWluZGV4OiAxO1xyXG4gIG1hcmdpbjogMDtcclxuICB3aWR0aDogdmFyKC0tb3V0bGluZS1uYXZpZ2F0b3Itd2lkdGgpO1xyXG4gIG92ZXJmbG93OiBhdXRvO1xyXG5cclxuICAmLXBhcmVudCB7XHJcbiAgICB0cmFuc2l0aW9uOiAwLjNzIGVhc2UtaW4tb3V0O1xyXG4gIH1cclxuXHJcbiAgJl9fdGl0bGUge1xyXG4gICAgbWFyZ2luOiAwIDE2cHg7XHJcbiAgICBoZWlnaHQ6IDQwcHg7XHJcbiAgICBsaW5lLWhlaWdodDogNDBweDtcclxuICAgIHBhZGRpbmc6IDAgMTZweDtcclxuICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCBAcHJpbWFyeV9ib3JkZXJfY29sb3I7XHJcbiAgICBmb250LXNpemU6IDE2cHg7XHJcbiAgICBmb250LXdlaWdodDogNDAwO1xyXG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcclxuICB9XHJcblxyXG4gICZfX21haW4ge1xyXG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xyXG4gICAgei1pbmRleDogMTtcclxuICAgIG1hcmdpbjogMDtcclxuICAgIG92ZXJmbG93OiBoaWRkZW47XHJcbiAgfVxyXG5cclxuICAmX19saXN0LFxyXG4gICZfX3N1YmplY3QsXHJcbiAgJl9faXRlbSB7XHJcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XHJcbiAgICB6LWluZGV4OiAyO1xyXG4gICAgbWFyZ2luOiAwO1xyXG4gICAgcGFkZGluZzogMDtcclxuICAgIGxpc3Qtc3R5bGUtdHlwZTogbm9uZTtcclxuICAgIG92ZXJmbG93OiBoaWRkZW47XHJcbiAgfVxyXG5cclxuICAmX19saXN0IHtcclxuICAgIHBhZGRpbmc6IDAuNWVtIDA7XHJcbiAgfVxyXG5cclxuICAmX19zdWJqZWN0IHtcclxuICAgIHBhZGRpbmctbGVmdDogMWVtO1xyXG4gIH1cclxuXHJcbiAgJl9faXRlbSB7XHJcbiAgICBtYXJnaW46IDA7XHJcbiAgICBsaW5lLWhlaWdodDogMzBweDtcclxuICAgIGZvbnQtc2l6ZTogMTNweDtcclxuICAgIG92ZXJmbG93OiBoaWRkZW47XHJcbiAgfVxyXG5cclxuICAmX19wbGFjZWhvbGRlciB7XHJcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XHJcbiAgICB6LWluZGV4OiAxO1xyXG4gICAgdG9wOiAwO1xyXG4gICAgbGVmdDogMDtcclxuICAgIHdpZHRoOiAxMDAlO1xyXG4gICAgaGVpZ2h0OiAzMHB4O1xyXG4gICAgYmFja2dyb3VuZC1jb2xvcjogQGhvdmVyX2JnX2NvbG9yO1xyXG4gICAgYm9yZGVyLWxlZnQ6IDJweCBzb2xpZCBAc3VjY2Vzc19jb2xvcjtcclxuICAgIHRyYW5zaXRpb24tZHVyYXRpb246IDAuMnM7XHJcbiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xyXG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcclxuICB9XHJcblxyXG4gICZfX2FuY2hvciB7XHJcbiAgICAuZWxsaXBzaXMoMSk7XHJcbiAgICBkaXNwbGF5OiBibG9jaztcclxuICAgIHBhZGRpbmc6IDAgMS41ZW07XHJcblxyXG4gICAgJjpsaW5rLFxyXG4gICAgJjp2aXNpdGVkLFxyXG4gICAgJjpob3ZlciB7XHJcbiAgICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTtcclxuICAgICAgY29sb3I6IEBzZWNvbmRhcnlfdGV4dF9jb2xvcjtcclxuICAgIH1cclxuXHJcbiAgICAmOmhvdmVyIHtcclxuICAgICAgY29sb3I6IEBzdWNjZXNzX2NvbG9yO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgJl9fY29kZSB7XHJcbiAgICBwYWRkaW5nLXJpZ2h0OiAwLjVlbTtcclxuICB9XHJcblxyXG4gICZfaGlnaGxpZ2h0IHtcclxuICAgICYub3V0bGluZS1uYXZpZ2F0b3JfX2FuY2hvciB7XHJcbiAgICAgICY6bGluayxcclxuICAgICAgJjp2aXNpdGVkLFxyXG4gICAgICAmOmhvdmVyIHtcclxuICAgICAgICBjb2xvcjogQHN1Y2Nlc3NfY29sb3I7XHJcbiAgICAgICAgZm9udC13ZWlnaHQ6IGJvbGQ7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gICZfc3RpY2t5LFxyXG4gICZfZml4ZWQge1xyXG4gICAgZGlzcGxheTogZmxleDtcclxuICAgIGZsZXgtd3JhcDogbm93cmFwO1xyXG4gICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcclxuICAgIHotaW5kZXg6IHZhcigtLW91dGxpbmUtekluZGV4KTtcclxuICAgIHRvcDogMDtcclxuICAgIG92ZXJmbG93OiBoaWRkZW47XHJcblxyXG4gICAgLm91dGxpbmUtbmF2aWdhdG9yIHtcclxuICAgICAgJl9fdGl0bGUsXHJcbiAgICAgICZfX21haW4ge1xyXG4gICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgICZfX3RpdGxlIHtcclxuICAgICAgICBmbGV4LXNocmluazogMDtcclxuICAgICAgfVxyXG5cclxuICAgICAgJl9fbWFpbiB7XHJcbiAgICAgICAgZmxleDogMTtcclxuICAgICAgICBvdmVyZmxvdzogYXV0bztcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgJl9zdGlja3kge1xyXG4gICAgcG9zaXRpb246IHN0aWNreTtcclxuICAgIG1heC1oZWlnaHQ6IHZhcigtLW91dGxpbmUtc3RpY2t5LWhlaWdodCk7XHJcbiAgfVxyXG5cclxuICAmX2ZpeGVkIHtcclxuICAgIHBvc2l0aW9uOiBmaXhlZDtcclxuICAgIG1heC1oZWlnaHQ6IDEwMCU7XHJcbiAgfVxyXG5cclxuICAmX2hpZGRlbiB7XHJcbiAgICBkaXNwbGF5OiBub25lO1xyXG4gIH1cclxuXHJcbiAgJl9mb2xkZWQge1xyXG4gICAgd2lkdGg6IDA7XHJcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xyXG4gIH1cclxufVxyXG4iLCIvKipcclxuICogZWxsaXBzaXMubGVzcyAtIOaWh+acrOecgeeVpSBtaXhpbngg5Ye95pWwXHJcbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cclxuICogQ3JlYXRlZCBCeTogWWFvaGFpeGlhb1xyXG4gKiBVcGRhdGU6IDIwMjIuMy4xMVxyXG4gKi9cclxuXHJcbi8qID09PT09PSDmlofmnKznnIHnlaXlh73mlbAgPT09PT09ICovXHJcbi5lbGxpcHNpcyAoQGxpbmVzKSB3aGVuIChAbGluZXM9MSkge1xyXG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7XHJcbiAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7XHJcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcclxufVxyXG5cclxuLmVsbGlwc2lzIChAbGluZXMpIHdoZW4gKEBsaW5lcz49Mikge1xyXG4gIC13ZWJraXQtbGluZS1jbGFtcDogQGxpbmVzO1xyXG4gIGRpc3BsYXk6IGJveDtcclxuICAtd2Via2l0LWJveC1vcmllbnQ6IHZlcnRpY2FsO1xyXG4gIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzO1xyXG4gIG92ZXJmbG93OiBoaWRkZW47XHJcbn1cclxuIiwiQGltcG9ydCAnLi4vdGhlbWUvY29sb3JzJztcclxuQGltcG9ydCAnLi4vdGhlbWUvZm9udCc7XHJcbkBpbXBvcnQgJy4uL3RoZW1lL21peGlucyc7XHJcblxyXG4ub3V0bGluZS1yZWFkZXIge1xyXG4gICZfX3Byb2dyZXNzIHtcclxuICAgIHBvc2l0aW9uOiBmaXhlZDtcclxuICAgIHRvcDogMDtcclxuICAgIGxlZnQ6IDA7XHJcbiAgICB6LWluZGV4OiAzO1xyXG4gICAgaGVpZ2h0OiA0cHg7XHJcbiAgICB3aWR0aDogMTAwJTtcclxuICAgIGJhY2tncm91bmQtY29sb3I6IEBwcmltYXJ5X2NvbG9yO1xyXG4gICAgc2NhbGU6IDAgMTtcclxuICAgIHRyYW5zZm9ybS1vcmlnaW46IGxlZnQ7XHJcbiAgICBhbmltYXRpb246IG91dGxpbmUtcmVhZGVyLXByb2dyZXNzIGxpbmVhcjtcclxuICAgIGFuaW1hdGlvbi10aW1lbGluZTogLS1Qcm9ncmVzc1RpbWVsaW5lO1xyXG4gIH1cclxuXHJcbiAgJl9fcGFwZXIge1xyXG4gICAgLnNoYWRvd19kYXJrX3JlZ3VsYXIoKTtcclxuICAgIG1hcmdpbjogMmVtIGF1dG87XHJcbiAgICBtYXgtd2lkdGg6IDEyMDBweDtcclxuICAgIHBhZGRpbmc6IDMuMmVtO1xyXG4gICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcclxuICAgIGJhY2tncm91bmQtY29sb3I6IEB3aGl0ZTtcclxuICAgIG92ZXJmbG93OiBoaWRkZW47XHJcbiAgfVxyXG5cclxuICAmX190aXRsZSB7XHJcbiAgICBtYXJnaW46IDAuNjdlbSAwO1xyXG4gICAgdGV4dC1hbGlnbjogY2VudGVyO1xyXG4gICAgZm9udC1mYW1pbHk6IEBmb250X3RleHRfZmFtaWx5O1xyXG4gICAgZm9udC13ZWlnaHQ6IG5vcm1hbDtcclxuICAgIGxpbmUtaGVpZ2h0OiAxLjNlbTtcclxuICAgIGZvbnQtc2l6ZTogNC4yZW07XHJcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xyXG4gIH1cclxuXHJcbiAgJl9fYXJ0aWNsZSB7XHJcbiAgICAub3V0bGluZS1yZWFkZXJfX3Byb2dyZXNzIHtcclxuICAgICAgZGlzcGxheTogbm9uZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gICZfaGlkZGVuIHtcclxuICAgIGRpc3BsYXk6IG5vbmU7XHJcblxyXG4gICAgJi5vdXRsaW5lLXJlYWRlcl9zaWJsaW5nIHtcclxuICAgICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50O1xyXG5cclxuICAgICAgJi53cmFwcGVyIHtcclxuICAgICAgICAmLnBvc3Qge1xyXG4gICAgICAgICAgZGlzcGxheTogbm9uZTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gICYtLXJlYWRpbmcge1xyXG4gICAgZGlzcGxheTogYmxvY2s7XHJcbiAgICBwb3NpdGlvbjogZml4ZWQ7XHJcbiAgICB6LWluZGV4OiAyO1xyXG4gICAgdG9wOiAwO1xyXG4gICAgbGVmdDogMDtcclxuICAgIHdpZHRoOiAxMDAlO1xyXG4gICAgaGVpZ2h0OiAxMDAlO1xyXG4gICAgbWFyZ2luOiAwO1xyXG4gICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcclxuICAgIHBhZGRpbmc6IDNlbSA0ZW07XHJcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAYmdfY29sb3I7XHJcbiAgICBzY3JvbGwtdGltZWxpbmUtbmFtZTogLS1Qcm9ncmVzc1RpbWVsaW5lO1xyXG4gICAgb3ZlcmZsb3c6IHNjcm9sbDtcclxuICB9XHJcbn1cclxuXHJcbkBrZXlmcmFtZXMgb3V0bGluZS1yZWFkZXItcHJvZ3Jlc3Mge1xyXG4gIHRvIHtcclxuICAgIHNjYWxlOiAxIDE7XHJcbiAgfVxyXG59XHJcblxyXG5AbWVkaWEgKG1heC13aWR0aDogNTAwcHgpIHtcclxuICAub3V0bGluZSB7XHJcbiAgICAmLXJlYWRlciB7XHJcbiAgICAgIG92ZXJmbG93OiBoaWRkZW47XHJcblxyXG4gICAgICAub3V0bGluZS10b29sYmFyIHtcclxuICAgICAgICBkaXNwbGF5OiBmbGV4O1xyXG4gICAgICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7XHJcbiAgICAgICAgZmxleC13cmFwOiBub3dyYXA7XHJcbiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcclxuICAgICAgICBhbGlnbi1zZWxmOiBhdXRvO1xyXG4gICAgICAgIHRvcDogMTAwJTtcclxuICAgICAgICByaWdodDogMDtcclxuICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTQ4cHgpO1xyXG4gICAgICAgIHdpZHRoOiAxMDAlO1xyXG4gICAgICAgIGhlaWdodDogNDhweDtcclxuICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xyXG4gICAgICAgIGJvcmRlci10b3A6IDFweCBzb2xpZCBAYm9yZGVyX2NvbG9yO1xyXG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6IEB3aGl0ZTtcclxuICAgICAgICBwYWRkaW5nOiAwIDE2cHg7XHJcblxyXG4gICAgICAgICZfX2J1dHRvbiB7XHJcbiAgICAgICAgICAucmFkaXVzX25vbmUoKTtcclxuICAgICAgICAgIGZsZXg6IDE7XHJcbiAgICAgICAgICBib3JkZXI6IG5vbmU7XHJcbiAgICAgICAgICBib3gtc2hhZG93OiBub25lO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgJi0tcmVhZGluZyB7XHJcbiAgICAgICAgcGFkZGluZzogMDtcclxuICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAd2hpdGU7XHJcbiAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcclxuICAgICAgfVxyXG5cclxuICAgICAgJl9fcGFwZXIge1xyXG4gICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcclxuICAgICAgICB6LWluZGV4OiAxO1xyXG4gICAgICAgIG1hcmdpbjogMDtcclxuICAgICAgICBwYWRkaW5nOiAwO1xyXG4gICAgICAgIGhlaWdodDogMTAwJTtcclxuICAgICAgICBib3gtc2hhZG93OiBub25lO1xyXG4gICAgICAgIG92ZXJmbG93OiBoaWRkZW47XHJcbiAgICAgIH1cclxuXHJcbiAgICAgICZfX3RpdGxlIHtcclxuICAgICAgICAuZWxsaXBzaXMoMSk7XHJcbiAgICAgICAgcG9zaXRpb246IGFic29sdXRlO1xyXG4gICAgICAgIHotaW5kZXg6IDM7XHJcbiAgICAgICAgdG9wOiAwO1xyXG4gICAgICAgIGxlZnQ6IDA7XHJcbiAgICAgICAgbWFyZ2luOiAwO1xyXG4gICAgICAgIHdpZHRoOiAxMDAlO1xyXG4gICAgICAgIGhlaWdodDogNDhweDtcclxuICAgICAgICBsaW5lLWhlaWdodDogNDhweDtcclxuICAgICAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgQGJvcmRlcl9jb2xvcjtcclxuICAgICAgICBmb250LXNpemU6IDEuOGVtO1xyXG4gICAgICAgIGZvbnQtd2VpZ2h0OiA0MDA7XHJcbiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogQHdoaXRlO1xyXG4gICAgICAgIG92ZXJmbG93OiBoaWRkZW47XHJcbiAgICAgIH1cclxuXHJcbiAgICAgICZfX2FydGljbGUge1xyXG4gICAgICAgIG1hcmdpbjogNDhweCAwO1xyXG4gICAgICAgIGhlaWdodDogY2FsYygxMDAlIC0gOTZweCk7XHJcbiAgICAgICAgcGFkZGluZzogMCAxLjI1ZW07XHJcbiAgICAgICAgc2Nyb2xsLXRpbWVsaW5lLW5hbWU6IC0tTW9iaWxlUHJvZ3Jlc3NUaW1lbGluZTtcclxuICAgICAgICBvdmVyZmxvdy14OiBoaWRkZW47XHJcbiAgICAgICAgb3ZlcmZsb3cteTogc2Nyb2xsO1xyXG5cclxuICAgICAgICAub3V0bGluZS1yZWFkZXJfX3Byb2dyZXNzIHtcclxuICAgICAgICAgIHotaW5kZXg6IDQ7XHJcbiAgICAgICAgICBhbmltYXRpb246IG91dGxpbmUtcmVhZGVyLXByb2dyZXNzIGxpbmVhcjtcclxuICAgICAgICAgIGFuaW1hdGlvbi10aW1lbGluZTogLS1Nb2JpbGVQcm9ncmVzc1RpbWVsaW5lO1xyXG4gICAgICAgICAgZGlzcGxheTogYmxvY2s7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcblxyXG5AbWVkaWEgcHJpbnQge1xyXG4gIGh0bWwsXHJcbiAgYm9keSB7XHJcbiAgICAvKiDmiZPljbDnmoTln7rnoYDlrZfkvZPlpKflsI8gKi9cclxuICAgIGZvbnQtc2l6ZTogMTJwdDtcclxuICAgIC8qIOaYvuekuuiuvue9ruaWh+Wtl+minOiJsuWSjOiDjOaZr+minOiJsiAqL1xyXG4gICAgYmFja2dyb3VuZC1jb2xvcjogQHdoaXRlO1xyXG4gICAgY29sb3I6IEBwcmltYXJ5X3RleHRfY29sb3I7XHJcbiAgICBoZWlnaHQ6IGluaXRpYWwgIWltcG9ydGFudDtcclxuICB9XHJcblxyXG4gIC8qIOiuvue9rumTvuaOpeagt+W8jyAqL1xyXG4gIGE6bGluayxcclxuICBhOnZpc2l0ZWQsXHJcbiAgYTpob3ZlciB7XHJcbiAgICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZSAhaW1wb3J0YW50O1xyXG4gICAgY29sb3I6IEBwcmltYXJ5X2NvbG9yO1xyXG4gIH1cclxuXHJcbiAgLyog6ZqQ6JeP5aqS5L2T5qCH562+ICovXHJcbiAgdmlkZW8sXHJcbiAgYXVkaW8ge1xyXG4gICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50O1xyXG4gIH1cclxuXHJcbiAgLyog56Gu5L+d6KGo5qC85Zyo5omT5Y2w5pe255qE6L655qGG5ZKM5a+56b2Q5pa55byP5riF5pmwICovXHJcbiAgdGFibGUge1xyXG4gICAgd2lkdGg6IDEwMCU7XHJcbiAgICBib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlO1xyXG4gIH1cclxuICB0aCxcclxuICB0ZCB7XHJcbiAgICBib3JkZXI6IDFweCBzb2xpZCBAcHJpbWFyeV9ib3JkZXJfY29sb3I7XHJcbiAgICBwYWRkaW5nOiA4cHggMjBweDtcclxuICB9XHJcblxyXG4gIC5vdXRsaW5lIHtcclxuICAgICYtbWVzc2FnZSxcclxuICAgICYtdG9vbGJhciB7XHJcbiAgICAgIC8qIOmakOiXj+S6huW3peWFt+agj+WSjOS/oeaBr+aPkOekuuahhiAqL1xyXG4gICAgICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7XHJcbiAgICB9XHJcblxyXG4gICAgJi1yZWFkZXIge1xyXG4gICAgICBkaXNwbGF5OiBibG9jayAhaW1wb3J0YW50O1xyXG4gICAgICBvdmVyZmxvdzogaGlkZGVuO1xyXG5cclxuICAgICAgJl9fdGl0bGUge1xyXG4gICAgICAgIG1hcmdpbjogMTMuNHB0IDAgMjhwdCAhaW1wb3J0YW50O1xyXG4gICAgICAgIHRleHQtYWxpZ246IGNlbnRlciAhaW1wb3J0YW50O1xyXG4gICAgICAgIGZvbnQtc2l6ZTogMzJwdCAhaW1wb3J0YW50O1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvKiDlj5bmtojkuobnu53lr7nlrprkvY0gKi9cclxuICAgICAgJi0tcmVhZGluZyB7XHJcbiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlICFpbXBvcnRhbnQ7XHJcbiAgICAgICAgaGVpZ2h0OiBhdXRvICFpbXBvcnRhbnQ7XHJcbiAgICAgICAgcGFkZGluZzogMCAhaW1wb3J0YW50O1xyXG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6IEB3aGl0ZTtcclxuICAgICAgICBvdmVyZmxvdzogaGlkZGVuICFpbXBvcnRhbnQ7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8qIOmakOiXj+mYheivu+i/m+W6puadoSAqL1xyXG4gICAgICAmX19wcm9ncmVzcyB7XHJcbiAgICAgICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50O1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvKiDmiZPljbDml7bkuI3mmL7npLrmraPmlocgRE9NIOeahOmYtOW9seaViOaenCAqL1xyXG4gICAgICAmX19wYXBlciB7XHJcbiAgICAgICAgYm94LXNoYWRvdzogbm9uZTtcclxuICAgICAgfVxyXG5cclxuICAgICAgcHJlIHtcclxuICAgICAgICBwYWRkaW5nOiAxZW0gIWltcG9ydGFudDtcclxuICAgICAgICBib3JkZXI6IDFweCBzb2xpZCBAYm9yZGVyX2NvbG9yICFpbXBvcnRhbnQ7XHJcbiAgICAgICAgYm9yZGVyLXJhZGl1czogNHB4ICFpbXBvcnRhbnQ7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHByZSxcclxuICAgICAgY29kZSB7XHJcbiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogQHdoaXRlICFpbXBvcnRhbnQ7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRhYmxlLFxyXG4gICAgICBpbWcsXHJcbiAgICAgIHN2ZyB7XHJcbiAgICAgICAgYnJlYWstaW5zaWRlOiBhdm9pZDtcclxuICAgICAgfVxyXG5cclxuICAgICAgLyog5omA5pyJ5paH56ug5YaF5a65IERPTSDnm7jlhbPnmoTpgrvlsYXoioLngrnpg73pmpDol4/kuoYgKi9cclxuICAgICAgJl9zaWJsaW5nIHtcclxuICAgICAgICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcbn1cclxuIiwiLyoqXHJcbiAqIHJhZGl1cy5sZXNzIC0g5ZyG6KeS6K6+572uIG1peGlueCDlh73mlbBcclxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxyXG4gKiBDcmVhdGVkIEJ5OiBZYW9oYWl4aWFvXHJcbiAqIFVwZGF0ZTogMjAyNC40LjE2XHJcbiAqL1xyXG5cclxuLyogPT09PT09IOWchuinkuagt+W8j+iuvue9ruWHveaVsCA9PT09PT0gKi9cclxuLnJhZGl1cyhAbnVtOiAycHgpIHtcclxuICBib3JkZXItcmFkaXVzOiBAbnVtO1xyXG59XHJcblxyXG4ucmFkaXVzX25vbmUoKSB7XHJcbiAgLnJhZGl1cygwKTtcclxufVxyXG5cclxuLnJhZGl1c19taW5pKCkge1xyXG4gIC5yYWRpdXMoMnB4KTtcclxufVxyXG5cclxuLnJhZGl1c19zbWFsbCgpIHtcclxuICAucmFkaXVzKDNweCk7XHJcbn1cclxuXHJcbi5yYWRpdXNfcmVndWxhcigpIHtcclxuICAucmFkaXVzKDRweCk7XHJcbn1cclxuXHJcbi5yYWRpdXNfbWVkaXVtKCkge1xyXG4gIC5yYWRpdXMoNXB4KTtcclxufVxyXG5cclxuLnJhZGl1c19sYXJnZSgpIHtcclxuICAucmFkaXVzKDEwcHgpO1xyXG59XHJcblxyXG4ucmFkaXVzX2h1Z2UoKSB7XHJcbiAgLnJhZGl1cygxNnB4KTtcclxufVxyXG5cclxuLnJhZGl1c19yb3VuZCgpIHtcclxuICAucmFkaXVzKDMwcHgpO1xyXG59XHJcbiIsIkBpbXBvcnQgJy4uL3RoZW1lL2NvbG9ycyc7XHJcbkBpbXBvcnQgJy4uL3RoZW1lL3NoYWRvdyc7XHJcblxyXG4ub3V0bGluZS10b29sYmFyIHtcclxuICBwb3NpdGlvbjogZml4ZWQ7XHJcbiAgei1pbmRleDogOTk5OTk7XHJcbiAgbWFyZ2luOiAwO1xyXG4gIHRyYW5zaXRpb24tZHVyYXRpb246IDAuM3M7XHJcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcclxuXHJcbiAgJl9fYnV0dG9uIHtcclxuICAgIC5zaGFkb3dfbGlnaHRfcmVndWxhcigpO1xyXG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xyXG4gICAgei1pbmRleDogMTtcclxuICAgIG1hcmdpbjogMTBweDtcclxuICAgIHdpZHRoOiAzNnB4O1xyXG4gICAgaGVpZ2h0OiAzNnB4O1xyXG4gICAgYm9yZGVyOiAxcHggc29saWQgQHByaW1hcnlfYm9yZGVyX2NvbG9yO1xyXG4gICAgYm9yZGVyLXJhZGl1czogM3B4O1xyXG4gICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcclxuICAgIGJhY2tncm91bmQtY29sb3I6IEB3aGl0ZTtcclxuICAgIGN1cnNvcjogcG9pbnRlcjtcclxuICAgIHRleHQtYWxpZ246IGNlbnRlcjtcclxuICAgIGNvbG9yOiBAZm91cnRoX3RleHRfY29sb3I7XHJcbiAgICB0cmFuc2l0aW9uOiBhbGwgMC4zcyAwLjFzIGVhc2UtaW4tb3V0O1xyXG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcclxuXHJcbiAgICAmOmhvdmVyIHtcclxuICAgICAgY29sb3I6IEBzdWNjZXNzX2NvbG9yO1xyXG4gICAgICBib3JkZXItY29sb3I6IEBzdWNjZXNzX2NvbG9yO1xyXG4gICAgICB0cmFuc2Zvcm06IHNjYWxlKDEuMzUpO1xyXG4gICAgfVxyXG5cclxuICAgICYuaGlkZSB7XHJcbiAgICAgIGRpc3BsYXk6IG5vbmU7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAmX19hbmNob3Ige1xyXG4gICAgJjpsaW5rLFxyXG4gICAgJjp2aXNpdGVkLFxyXG4gICAgJjpob3ZlciB7XHJcbiAgICAgIGNvbG9yOiBAZm91cnRoX3RleHRfY29sb3I7XHJcbiAgICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTtcclxuICAgIH1cclxuXHJcbiAgICAmOmhvdmVyIHtcclxuICAgICAgY29sb3I6IEBzdWNjZXNzX2NvbG9yO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgJl9faWNvbiB7XHJcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XHJcbiAgICB6LWluZGV4OiAyO1xyXG4gICAgdG9wOiA1MCU7XHJcbiAgICBsZWZ0OiA1MCU7XHJcbiAgICB3aWR0aDogMjBweDtcclxuICAgIGhlaWdodDogMjBweDtcclxuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIC01MCUpO1xyXG4gICAgZmlsbDogY3VycmVudGNvbG9yO1xyXG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcclxuICB9XHJcblxyXG4gICZfYWN0aXZlIHtcclxuICAgICYub3V0bGluZS10b29sYmFyIHtcclxuICAgICAgJl9fYnV0dG9uIHtcclxuICAgICAgICBjb2xvcjogQHdoaXRlO1xyXG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6IEBzdWNjZXNzX2NvbG9yO1xyXG4gICAgICAgIGJvcmRlci1jb2xvcjogQHN1Y2Nlc3NfY29sb3I7XHJcblxyXG4gICAgICAgICY6aG92ZXIge1xyXG4gICAgICAgICAgY29sb3I6IEB3aGl0ZTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAub3V0bGluZS10b29sYmFyX19hbmNob3Ige1xyXG4gICAgICAmOmxpbmssXHJcbiAgICAgICY6dmlzaXRlZCxcclxuICAgICAgJjpob3ZlciB7XHJcbiAgICAgICAgY29sb3I6IEB3aGl0ZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgJl9yb3VuZGVkIHtcclxuICAgICYub3V0bGluZS10b29sYmFyX19idXR0b24ge1xyXG4gICAgICBib3JkZXItcmFkaXVzOiAxOHB4O1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgJl9kaXNhYmxlZCB7XHJcbiAgICAmLm91dGxpbmUtdG9vbGJhcixcclxuICAgIC5vdXRsaW5lLXRvb2xiYXIge1xyXG4gICAgICAmX19hbmNob3I6bGluayxcclxuICAgICAgJl9fYW5jaG9yOnZpc2l0ZWQsXHJcbiAgICAgICZfX2FuY2hvcjpob3ZlcixcclxuICAgICAgJl9fYnV0dG9uIHtcclxuICAgICAgICBjdXJzb3I6IG5vdC1hbGxvd2VkO1xyXG4gICAgICAgIGNvbG9yOiBAZm91cnRoX3RleHRfY29sb3I7XHJcbiAgICAgICAgYm9yZGVyLWNvbG9yOiBAZm91cnRoX3RleHRfY29sb3I7XHJcblxyXG4gICAgICAgICY6aG92ZXIge1xyXG4gICAgICAgICAgY29sb3I6IEBmb3VydGhfdGV4dF9jb2xvcjtcclxuICAgICAgICAgIGJvcmRlci1jb2xvcjogQGZvdXJ0aF90ZXh0X2NvbG9yO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgJl9fYnV0dG9uIHtcclxuICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAZGlzYWJsZWRfYmdfY29sb3I7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gICZfdHRiLFxyXG4gICZfYnR0IHtcclxuICAgIGxlZnQ6IDUwJTtcclxuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgtNTAlKTtcclxuXHJcbiAgICAub3V0bGluZS10b29sYmFyX19idXR0b24ge1xyXG4gICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAmX3R0YiB7XHJcbiAgICB0b3A6IDEycHg7XHJcblxyXG4gICAgJi5vdXRsaW5lLXRvb2xiYXJfaGlkZGVuIHtcclxuICAgICAgdG9wOiAtNTZweDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gICZfYnR0IHtcclxuICAgIGJvdHRvbTogMTJweDtcclxuXHJcbiAgICAmLm91dGxpbmUtdG9vbGJhcl9oaWRkZW4ge1xyXG4gICAgICBib3R0b206IC01NnB4O1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgJl9ydGwsXHJcbiAgJl9sdHIge1xyXG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC01MCUpO1xyXG4gICAgd2lkdGg6IDU2cHg7XHJcbiAgfVxyXG5cclxuICAmX3J0bCB7XHJcbiAgICB0b3A6IDUwJTtcclxuICAgIHJpZ2h0OiAxMnB4O1xyXG5cclxuICAgICYub3V0bGluZS10b29sYmFyX2hpZGRlbiB7XHJcbiAgICAgIHJpZ2h0OiAtODZweDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gICZfbHRyIHtcclxuICAgIHRvcDogNTAlO1xyXG4gICAgbGVmdDogMTJweDtcclxuXHJcbiAgICAmLm91dGxpbmUtdG9vbGJhcl9oaWRkZW4ge1xyXG4gICAgICBsZWZ0OiAtODZweDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gICZfdHRiLFxyXG4gICZfcnRsLFxyXG4gICZfYnR0LFxyXG4gICZfbHRyIHtcclxuICAgIC5vdXRsaW5lLXRvb2xiYXJfX2J1dHRvbiB7XHJcbiAgICAgICYub3V0bGluZS10b29sYmFyX2hpZGRlbiB7XHJcbiAgICAgICAgZGlzcGxheTogbm9uZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxufVxyXG4iXX0= */ diff --git a/docs/css/docs.min.css b/docs/css/docs.min.css index a4fd6212..4fc6a1c1 100644 --- a/docs/css/docs.min.css +++ b/docs/css/docs.min.css @@ -1,2 +1,2 @@ -/*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */button,hr,input{overflow:visible}progress,sub,sup{vertical-align:baseline}.docs,.main{position:relative;z-index:1}.aside,.outline-toolbar{-webkit-transition-duration:.3s}.docs,.main,sub,sup{position:relative}.case:after,.outline-drawer__overlay{content:''}html{-webkit-text-size-adjust:100%}body{margin:0}details,main{display:block}h1{font-size:2em;margin:.67em 0}hr{-webkit-box-sizing:content-box;box-sizing:content-box;height:0}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}a{background-color:transparent}abbr[title]{border-bottom:none;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}b,strong{font-weight:bolder}small{font-size:80%}sub,sup{font-size:75%;line-height:0}sub{bottom:-.25em}sup{top:-.5em}img{border-style:none}button,input,optgroup,select,textarea{font-family:inherit;font-size:100%;line-height:1.15;margin:0}button,select{text-transform:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:ButtonText dotted 1px}fieldset{padding:.35em .75em .625em}legend{-webkit-box-sizing:border-box;box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}textarea{overflow:auto}.docs,body,html{height:100%;overflow:hidden}[type=checkbox],[type=radio]{-webkit-box-sizing:border-box;box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}[hidden],template{display:none}body,html{background:#fafafa;color:#333;font-size:14px;line-height:150%;font-family:'Microsoft YaHei UI',Arial,sans-serif}.aside,code{font-family:'Source Code Pro',Consolas,Georgia,Monaco,monospace,Arial,sans-serif}a:hover,a:link,a:visited{color:#058942;text-decoration:none}a:hover{text-decoration:underline}.docs{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;-ms-flex-wrap:nowrap;flex-wrap:nowrap;width:100%;margin:0}.aside,.outline-drawer__modal,.outline-navigator_fixed,.outline-navigator_sticky{-webkit-box-orient:vertical;-webkit-box-direction:normal}.aside,.main{overflow:auto;height:100%}.aside{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-negative:0;flex-shrink:0;-ms-flex-direction:column;flex-direction:column;-ms-flex-wrap:nowrap;flex-wrap:nowrap;width:260px;margin:0;background-color:#333;color:#ddd;-webkit-box-shadow:0 0 5px 2px #ddd;box-shadow:0 0 5px 2px #ddd;transition-duration:.3s}.main__button,.section__dd,.section__dt{display:inline-block}.aside__nav,.main{-webkit-box-flex:1}.main{-ms-flex:1;flex:1;background-color:#fff}@media (max-width:500px){.docs{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.aside,.main{width:100%}.aside{position:fixed;z-index:3;top:0}.aside.outline-navigator_folded{left:-100%}.aside.outline-navigator_expanded{left:0}}.case,.section__dl{z-index:1;position:relative}.aside__header{margin:0 auto;-ms-flex-negative:0;flex-shrink:0;overflow:hidden}.aside__nav{-ms-flex:1;flex:1;overflow:auto}.aside__h2{margin:0 auto;height:54px;line-height:54px;font-size:20px;font-weight:400;font-family:Georgia,Consolas,Arial,sans-serif;text-align:center;overflow:hidden}.aside__h3{margin:0 auto;padding:0 20px;font-size:16px;overflow:hidden}.aside__list{margin:0;padding:10px 0;overflow:hidden}.aside__item{height:32px;line-height:32px;padding:0 30px;cursor:pointer;font-size:13px;overflow:hidden}.aside-navigator{-webkit-box-flex:1;-ms-flex:1;flex:1}.aside-navigator .outline-navigator__main::-webkit-scrollbar-thumb{background-color:#666}.aside-navigator .outline-navigator__main::-webkit-scrollbar-thumb:hover{background-color:#999}.aside-navigator .outline-navigator__placeholder{background-color:#555;border-left:3px solid #fff}.aside-navigator .outline-navigator__anchor:link,.aside-navigator .outline-navigator__anchor:visited{color:#ddd;text-decoration:none}.aside-navigator .outline-navigator__anchor:hover{color:#ddd;text-decoration:underline}.aside-navigator .outline-navigator_active.outline-navigator__anchor:hover,.aside-navigator .outline-navigator_active.outline-navigator__anchor:link,.aside-navigator .outline-navigator_active.outline-navigator__anchor:visited{color:#fff}.main__footer,.main__header{margin:0 auto;padding:1em;text-align:center;overflow:hidden}.main__h1{margin:0 auto;padding-top:1em;font-size:5em;font-weight:400;line-height:2em;overflow:hidden}.main__name{color:#507afe;font-weight:400}.main__tagline{margin:1em auto;max-width:960px;line-height:1.3em;font-size:2em;color:#999;font-weight:100;overflow:hidden}.main__cdn,.section__pre{line-height:150%;background-color:#fafafa}.main__cdn{margin:2em 0;padding:2em;font-size:16px;text-align:center;border-top:1px solid #ddd;border-bottom:1px solid #ddd;color:#666;overflow:hidden}.main__download{margin:1em auto;width:200px;text-align:center;overflow:hidden}.main__button{border-radius:4px;padding:14px 29px;font-size:18px;font-family:'Source Code Pro',Consolas,Georgia,Monaco,monospace,Arial,sans-serif;background-color:#058942;overflow:hidden}.main__button:hover,.main__button:link,.main__button:visited{color:#fff;text-decoration:none}.main__footer{margin:0 3em;border-top:1px solid #ddd}.section{margin:1em 0;overflow:hidden}.section__content,.section__footer,.section__header{margin:0;padding:0 3em;overflow:hidden}.section__title{color:#666}.section__h3{color:#507afe;font-size:1.35em}.section__h4{font-size:1.1em;color:#666}.section__h5{font-size:1em;color:#999}.section__dd,.section__dl,.section__dt{margin:0;padding:0;overflow:hidden}.section__dd{color:#058942}.section__pre{margin:2em 0;padding:1em;font-size:14px;text-align:left;border:1px solid #ddd;border-radius:4px;color:#666;overflow:auto}.case,.case:after,.case__console,.case__toolbar,.section__code{overflow:hidden}.section__code{display:block;margin:0 auto}.section__footer{border-top:1px solid #ddd;margin-top:3em;background-color:#fafafa;color:#999}.section__table{margin:1em auto;width:100%;border-top:1px solid #ddd}.section__td,.section__th{padding:5px 16px;line-height:26px;border-bottom:1px solid #ddd}.section__th{text-align:center;background-color:#fafafa}@media (max-width:500px){.section__content,.section__header{padding:0 1em}}.case{display:grid;grid-template-columns:repeat(2,1fr);gap:40px;padding:1em;border-top:1px solid #ddd;border-bottom:1px solid #ddd}.case:after{position:absolute;z-index:2;top:0;left:50%;height:100%;width:0;border-left:1px solid #ddd}.case__pre,.case__textarea{font-size:13px;line-height:150%}.case__code,.case__pre,.case__textarea{font-family:'Courier New',Consolas,Georgia,Arial,sans-serif}.case__pre{margin:0;padding:1em;background-color:#fafafa;height:100%;border-radius:4px;-webkit-box-sizing:border-box;box-sizing:border-box;overflow:auto}.case__toolbar{margin:0 auto;height:36px;line-height:36px;font-size:14px;padding:0 16px;text-align:right}.case__action,.case__remove{cursor:pointer;color:#058942;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.case__action{font-size:13px;padding-left:10px}.case__action:first-child{padding-left:0}.case__remove{float:right}.case__console{margin:0 auto;height:180px;border:1px solid #ddd}.case__textarea{margin:0 auto;width:100%;height:100%;border:none;outline:0;padding:1em;-webkit-box-sizing:border-box;box-sizing:border-box;overflow:auto}.case__item,.case__list{margin:0;padding:0;list-style-type:none;overflow:hidden}.case__item,.outline-drawer__footer,.outline-drawer__main,.outline-drawer__title{padding:0 16px}.case__list{height:360px;border-top:1px solid #ddd;border-bottom:1px solid #ddd;font-size:13px;overflow:auto}.outline-drawer__title,.outline-drawer_ttb,.outline-navigator__title{border-bottom:1px solid #dcdfe6}.case__item{height:36px;line-height:36px;cursor:pointer}.outline-icon,.outline-icon__svg{width:1em;height:1em;overflow:hidden}.case__item:hover{background-color:#f7f8f9}:root{--outline-zIndex:2000;--outline-sticky-height:100%;--outline-navigator-width:100%}.outline-icon{position:relative;z-index:1;display:inline-block;vertical-align:middle}.outline-heading__anchor,.outline-icon_hidden{display:none}.outline-icon__svg{position:absolute;z-index:2;top:50%;left:50%;fill:currentcolor;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%)}.outline-heading{position:relative;z-index:1;overflow:hidden}.outline-heading__anchor:hover,.outline-heading__anchor:link,.outline-heading__anchor:visited{color:#999;text-decoration:none}.outline-heading__anchor:hover{color:#507afe}.outline-heading:hover .outline-heading__anchor{display:inline-block}.outline-heading_start:hover{overflow:visible}.outline-heading_start .outline-heading__anchor{position:absolute;z-index:2;top:50%;-webkit-transform:translateY(-50%);transform:translateY(-50%);left:-1em}.outline-drawer{position:relative;z-index:-1;top:0;left:0;margin:0;width:100%;height:100%;-webkit-box-sizing:border-box;box-sizing:border-box;visibility:hidden;overflow:hidden}.outline-drawer__modal{-webkit-box-shadow:0 0 6px 1px #dcdfe6;box-shadow:0 0 6px 1px #dcdfe6;display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;-ms-flex-wrap:nowrap;flex-wrap:nowrap;position:absolute;z-index:21;height:100%;background-color:#fff;-webkit-transition-duration:.4s;transition-duration:.4s;overflow:hidden}.outline-drawer__footer,.outline-drawer__header,.outline-drawer__main{width:100%;-webkit-box-sizing:border-box;box-sizing:border-box}.outline-drawer__footer,.outline-drawer__header{-ms-flex-negative:0;flex-shrink:0}.outline-drawer__header,.outline-drawer__title{position:relative;z-index:1;margin:0 auto;height:52px;line-height:52px;overflow:hidden}.outline-drawer__title{font-size:16px;font-weight:400;margin:0 16px;-webkit-box-sizing:border-box;box-sizing:border-box}.outline-drawer__close{position:absolute;z-index:2;top:50%;right:12px;width:20px;height:20px;line-height:20px;color:#999;font-size:20px;text-align:center;cursor:pointer;-webkit-transform:translateY(-50%);transform:translateY(-50%);overflow:hidden}.outline-drawer__close .outline-icon{position:absolute;z-index:2;top:0;left:0}.outline-drawer__close:hover{color:#666}.outline-drawer__main{-webkit-box-flex:1;-ms-flex:1;flex:1;overflow:auto}.outline-drawer__main.overflow-hidden{overflow:hidden}.outline-drawer__footer{margin:0 auto;text-align:right;overflow:hidden}.outline-drawer__overlay{position:relative;z-index:1;top:0;left:0;width:100%;height:100%;background-color:#fff;opacity:.1;overflow:hidden}.outline-drawer_ltr.outline-drawer_tiny,.outline-drawer_rtl.outline-drawer_tiny{width:280px}.outline-drawer_ltr.outline-drawer_mini,.outline-drawer_rtl.outline-drawer_mini{width:480px}.outline-drawer_ltr.outline-drawer_small,.outline-drawer_rtl.outline-drawer_small{width:540px}.outline-drawer_ltr.outline-drawer_regular,.outline-drawer_rtl.outline-drawer_regular{width:680px}.outline-drawer_ltr.outline-drawer_medium,.outline-drawer_rtl.outline-drawer_medium{width:720px}.outline-drawer_ltr.outline-drawer_large,.outline-drawer_rtl.outline-drawer_large{width:960px}.outline-drawer_rtl{border-left:1px solid #dcdfe6}.outline-drawer_rtl.outline-drawer_tiny.outline-drawer_closed{right:-290px}.outline-drawer_rtl.outline-drawer_mini.outline-drawer_closed{right:-490px}.outline-drawer_rtl.outline-drawer_small.outline-drawer_closed{right:-550px}.outline-drawer_rtl.outline-drawer_regular.outline-drawer_closed{right:-690px}.outline-drawer_rtl.outline-drawer_medium.outline-drawer_closed{right:-730px}.outline-drawer_rtl.outline-drawer_large.outline-drawer_closed{right:-970px}.outline-drawer_ltr{border-right:1px solid #dcdfe6}.outline-drawer_ltr.outline-drawer_tiny.outline-drawer_closed{left:-290px}.outline-drawer_ltr.outline-drawer_mini.outline-drawer_closed{left:-490px}.outline-drawer_ltr.outline-drawer_small.outline-drawer_closed{left:-550px}.outline-drawer_ltr.outline-drawer_regular.outline-drawer_closed{left:-690px}.outline-drawer_ltr.outline-drawer_medium.outline-drawer_closed{left:-730px}.outline-drawer_ltr.outline-drawer_large.outline-drawer_closed{left:-970px}.outline-drawer_btt,.outline-drawer_ttb{left:0;width:100%}.outline-drawer_btt.outline-drawer_tiny,.outline-drawer_ttb.outline-drawer_tiny{height:240px}.outline-drawer_btt.outline-drawer_mini,.outline-drawer_ttb.outline-drawer_mini{height:320px}.outline-drawer_btt.outline-drawer_small,.outline-drawer_ttb.outline-drawer_small{height:360px}.outline-drawer_btt.outline-drawer_regular,.outline-drawer_ttb.outline-drawer_regular{height:400px}.outline-drawer_btt.outline-drawer_medium,.outline-drawer_ttb.outline-drawer_medium{height:440px}.outline-drawer_btt.outline-drawer_large,.outline-drawer_ttb.outline-drawer_large{height:480px}.outline-drawer_ttb.outline-drawer_tiny.outline-drawer_closed{top:-250px}.outline-drawer_ttb.outline-drawer_mini.outline-drawer_closed{top:-330px}.outline-drawer_ttb.outline-drawer_small.outline-drawer_closed{top:-370px}.outline-drawer_ttb.outline-drawer_regular.outline-drawer_closed{top:-410px}.outline-drawer_ttb.outline-drawer_medium.outline-drawer_closed{top:-450px}.outline-drawer_ttb.outline-drawer_large.outline-drawer_closed{top:-490px}.outline-drawer_btt{top:initial;border-top:1px solid #dcdfe6}.outline-drawer_btt.outline-drawer_tiny.outline-drawer_closed{bottom:-250px}.outline-drawer_btt.outline-drawer_mini.outline-drawer_closed{bottom:-330px}.outline-drawer_btt.outline-drawer_small.outline-drawer_closed{bottom:-370px}.outline-drawer_btt.outline-drawer_regular.outline-drawer_closed{bottom:-410px}.outline-drawer_btt.outline-drawer_medium.outline-drawer_closed{bottom:-450px}.outline-drawer_btt.outline-drawer_large.outline-drawer_closed{bottom:-490px}.outline-drawer_opened{visibility:visible;z-index:var(--outline-zIndex)}.outline-drawer_opened.outline-drawer{position:fixed}.outline-drawer_opened.outline-drawer_rtl{right:0}.outline-drawer_opened.outline-drawer_ltr{left:0}.outline-drawer_opened.outline-drawer_ttb{top:0}.outline-drawer_opened.outline-drawer_btt{bottom:0}.outline-drawer_offset.outline-drawer_ltr,.outline-drawer_offset.outline-drawer_rtl{height:calc(100% - 4em);top:50%;-webkit-transform:translateY(-50%);transform:translateY(-50%)}.outline-drawer_offset.outline-drawer_btt,.outline-drawer_offset.outline-drawer_ttb{width:calc(100% - 4em);left:50%;-webkit-transform:translateX(-50%);transform:translateX(-50%)}.outline-drawer_offset.outline-drawer_opened.outline-drawer_rtl{right:2em}.outline-drawer_offset.outline-drawer_opened.outline-drawer_ltr{left:2em}.outline-drawer_offset.outline-drawer_opened.outline-drawer_ttb{top:2em}.outline-drawer_offset.outline-drawer_opened.outline-drawer_btt{bottom:2em}.outline-drawer_auto.outline-drawer_ltr,.outline-drawer_auto.outline-drawer_rtl{height:auto;max-height:calc(100% - 4em)}.outline-drawer_full{padding:0}.outline-navigator{position:relative;z-index:1;margin:0;width:var(--outline-navigator-width);overflow:auto}.outline-navigator-parent{-webkit-transition:.3s ease-in-out;transition:.3s ease-in-out}.outline-navigator__title{margin:0 16px;height:40px;line-height:40px;padding:0 16px;font-size:16px;font-weight:400;overflow:hidden}.outline-navigator__main{position:relative;z-index:1;margin:0;overflow:hidden}.outline-navigator__item,.outline-navigator__list,.outline-navigator__subject{position:relative;z-index:2;margin:0;padding:0;list-style-type:none;overflow:hidden}.outline-navigator__list{padding:.5em 0}.outline-navigator__subject{padding-left:1em}.outline-navigator__item{margin:0;line-height:30px;font-size:13px;overflow:hidden}.outline-navigator__placeholder{position:absolute;z-index:1;top:0;left:0;width:100%;height:30px;background-color:#f7f8f9;border-left:2px solid #058942;-webkit-transition-duration:.2s;transition-duration:.2s;-webkit-box-sizing:border-box;box-sizing:border-box;overflow:hidden}.outline-navigator__anchor{white-space:nowrap;text-overflow:ellipsis;overflow:hidden;display:block;padding:0 1.5em}.outline-navigator__anchor:hover,.outline-navigator__anchor:link,.outline-navigator__anchor:visited{text-decoration:none;color:#555}.outline-navigator__anchor:hover{color:#058942}.outline-navigator__code{padding-right:.5em}.outline-navigator_highlight.outline-navigator__anchor:hover,.outline-navigator_highlight.outline-navigator__anchor:link,.outline-navigator_highlight.outline-navigator__anchor:visited{color:#058942;font-weight:700}.outline-navigator_fixed,.outline-navigator_sticky{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-ms-flex-direction:column;flex-direction:column;z-index:var(--outline-zIndex);top:0;overflow:hidden}.outline-navigator_hidden,.outline-reader__article .outline-reader__progress,.outline-reader_hidden{display:none}.outline-navigator_fixed .outline-navigator__main,.outline-navigator_fixed .outline-navigator__title,.outline-navigator_sticky .outline-navigator__main,.outline-navigator_sticky .outline-navigator__title{-webkit-box-sizing:border-box;box-sizing:border-box}.outline-navigator_fixed .outline-navigator__title,.outline-navigator_sticky .outline-navigator__title{-ms-flex-negative:0;flex-shrink:0}.outline-navigator_fixed .outline-navigator__main,.outline-navigator_sticky .outline-navigator__main{-webkit-box-flex:1;-ms-flex:1;flex:1;overflow:auto}.outline-navigator_sticky{position:sticky;max-height:var(--outline-sticky-height)}.outline-navigator_fixed{position:fixed;max-height:100%}.outline-navigator_folded{width:0;overflow:hidden}.outline-reader__progress{position:fixed;top:0;left:0;z-index:3;height:4px;width:100%;background-color:#507afe;scale:0 1;-webkit-transform-origin:left;transform-origin:left;-webkit-animation:outline-reader-progress linear;animation:outline-reader-progress linear;animation-timeline:--ProgressTimeline}.outline-message,.outline-toolbar__button{background-color:#fff;-webkit-box-shadow:0 0 6px 1px #dcdfe6}.outline-reader__paper{-webkit-box-shadow:0 0 6px 1px #ddd;box-shadow:0 0 6px 1px #ddd;margin:2em auto;max-width:1200px;padding:3.2em;-webkit-box-sizing:border-box;box-sizing:border-box;background-color:#fff;overflow:hidden}.outline-reader__title{margin:.67em 0;text-align:center;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI','PingFang SC','Hiragino Sans GB','Microsoft YaHei','Helvetica Neue','Apple Color Emoji','Segoe UI Emoji','Segoe UI Symbol',Helvetica,Arial,sans-serif;font-weight:400;line-height:1.3em;font-size:4.2em;overflow:hidden}.outline-reader_hidden.outline-reader_sibling{display:none!important}.outline-reader_hidden.outline-reader_sibling.wrapper.post{display:none}.outline-reader--reading{display:block;position:fixed;z-index:2;top:0;left:0;width:100%;height:100%;margin:0;-webkit-box-sizing:border-box;box-sizing:border-box;padding:3em 4em;background-color:#fafafa;scroll-timeline-name:--ProgressTimeline;overflow:scroll}@-webkit-keyframes outline-reader-progress{to{scale:1 1}}@keyframes outline-reader-progress{to{scale:1 1}}@media (max-width:500px){.outline-reader{overflow:hidden}.outline-reader .outline-toolbar{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-ms-flex-item-align:auto;align-self:auto;top:100%;right:0;-webkit-transform:translateY(-48px);transform:translateY(-48px);width:100%;height:48px;-webkit-box-sizing:border-box;box-sizing:border-box;border-top:1px solid #ddd;background-color:#fff;padding:0 16px}.outline-reader .outline-toolbar__button{border-radius:0;-webkit-box-flex:1;-ms-flex:1;flex:1;border:none;-webkit-box-shadow:none;box-shadow:none}.outline-reader--reading{padding:0;background-color:#fff;-webkit-box-sizing:border-box;box-sizing:border-box}.outline-reader__paper{position:relative;z-index:1;margin:0;padding:0;height:100%;-webkit-box-shadow:none;box-shadow:none;overflow:hidden}.outline-reader__title{white-space:nowrap;text-overflow:ellipsis;position:absolute;z-index:3;top:0;left:0;margin:0;width:100%;height:48px;line-height:48px;border-bottom:1px solid #ddd;font-size:1.8em;font-weight:400;background-color:#fff;overflow:hidden}.outline-reader__article{margin:48px 0;height:calc(100% - 96px);padding:0 1.25em;scroll-timeline-name:--MobileProgressTimeline;overflow-x:hidden;overflow-y:scroll}.outline-reader__article .outline-reader__progress{z-index:4;-webkit-animation:outline-reader-progress linear;animation:outline-reader-progress linear;animation-timeline:--MobileProgressTimeline;display:block}}@media print{body,html{font-size:12pt;background-color:#fff;color:#333;height:initial!important}a:hover,a:link,a:visited{text-decoration:underline!important;color:#507afe}.outline-message,.outline-toolbar,audio,video{display:none!important}table{width:100%;border-collapse:collapse}td,th{border:1px solid #dcdfe6;padding:8px 20px}.outline-reader{display:block!important;overflow:hidden}.outline-reader__progress,.outline-reader_sibling{display:none!important}.outline-reader__title{margin:13.4pt 0 28pt!important;text-align:center!important;font-size:32pt!important}.outline-reader--reading{position:relative!important;height:auto!important;padding:0!important;background-color:#fff;overflow:hidden!important}.outline-reader__paper{-webkit-box-shadow:none;box-shadow:none}.outline-reader pre{padding:1em!important;border:1px solid #ddd!important;border-radius:4px!important}.outline-reader code,.outline-reader pre{background-color:#fff!important}.outline-reader img,.outline-reader svg,.outline-reader table{-webkit-column-break-inside:avoid;-moz-column-break-inside:avoid;break-inside:avoid}}.outline-toolbar{position:fixed;z-index:99999;margin:0;transition-duration:.3s;overflow:hidden}.outline-toolbar__button{box-shadow:0 0 6px 1px #dcdfe6;position:relative;z-index:1;margin:10px;width:36px;height:36px;border:1px solid #dcdfe6;border-radius:3px;-webkit-box-sizing:border-box;box-sizing:border-box;cursor:pointer;text-align:center;color:#999;-webkit-transition:all .3s .1s ease-in-out;transition:all .3s .1s ease-in-out;overflow:hidden}.outline-toolbar__button:hover{color:#058942;border-color:#058942;-webkit-transform:scale(1.35);transform:scale(1.35)}.outline-toolbar__button.hide{display:none}.outline-toolbar__anchor:hover,.outline-toolbar__anchor:link,.outline-toolbar__anchor:visited{color:#999;text-decoration:none}.outline-toolbar__anchor:hover{color:#058942}.outline-toolbar__icon{position:absolute;z-index:2;top:50%;left:50%;width:20px;height:20px;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%);fill:currentcolor;overflow:hidden}.outline-toolbar_active.outline-toolbar__button{color:#fff;background-color:#058942;border-color:#058942}.outline-toolbar_active .outline-toolbar__anchor:hover,.outline-toolbar_active .outline-toolbar__anchor:link,.outline-toolbar_active .outline-toolbar__anchor:visited,.outline-toolbar_active.outline-toolbar__button:hover{color:#fff}.outline-toolbar_rounded.outline-toolbar__button{border-radius:18px}.outline-toolbar_disabled .outline-toolbar__anchor:hover,.outline-toolbar_disabled .outline-toolbar__anchor:link,.outline-toolbar_disabled .outline-toolbar__anchor:visited,.outline-toolbar_disabled .outline-toolbar__button,.outline-toolbar_disabled.outline-toolbar__anchor:hover,.outline-toolbar_disabled.outline-toolbar__anchor:link,.outline-toolbar_disabled.outline-toolbar__anchor:visited,.outline-toolbar_disabled.outline-toolbar__button{cursor:not-allowed;color:#999;border-color:#999}.outline-toolbar_disabled .outline-toolbar__anchor:hover:hover,.outline-toolbar_disabled .outline-toolbar__anchor:link:hover,.outline-toolbar_disabled .outline-toolbar__anchor:visited:hover,.outline-toolbar_disabled .outline-toolbar__button:hover,.outline-toolbar_disabled.outline-toolbar__anchor:hover:hover,.outline-toolbar_disabled.outline-toolbar__anchor:link:hover,.outline-toolbar_disabled.outline-toolbar__anchor:visited:hover,.outline-toolbar_disabled.outline-toolbar__button:hover{color:#999;border-color:#999}.outline-message,.outline-message__content{margin:0;font-size:13px;color:#666;height:40px;line-height:40px;overflow:hidden}.outline-toolbar_disabled .outline-toolbar__button,.outline-toolbar_disabled.outline-toolbar__button{background-color:#f5f5f5}.outline-toolbar_btt,.outline-toolbar_ttb{left:50%;-webkit-transform:translateX(-50%);transform:translateX(-50%)}.outline-toolbar_btt .outline-toolbar__button,.outline-toolbar_ttb .outline-toolbar__button{display:inline-block}.outline-toolbar_ttb{top:12px}.outline-toolbar_ttb.outline-toolbar_hidden{top:-56px}.outline-toolbar_btt{bottom:12px}.outline-toolbar_btt.outline-toolbar_hidden{bottom:-56px}.outline-toolbar_ltr,.outline-toolbar_rtl{-webkit-transform:translateY(-50%);transform:translateY(-50%);width:56px}.outline-toolbar_rtl{top:50%;right:12px}.outline-toolbar_rtl.outline-toolbar_hidden{right:-86px}.outline-toolbar_ltr{top:50%;left:12px}.outline-toolbar_ltr.outline-toolbar_hidden{left:-86px}.outline-toolbar_btt .outline-toolbar__button.outline-toolbar_hidden,.outline-toolbar_ltr .outline-toolbar__button.outline-toolbar_hidden,.outline-toolbar_rtl .outline-toolbar__button.outline-toolbar_hidden,.outline-toolbar_ttb .outline-toolbar__button.outline-toolbar_hidden{display:none}.outline-message{border-radius:3px;box-shadow:0 0 6px 1px #dcdfe6;position:fixed;z-index:9999;opacity:.1;top:-50px;left:50%;padding:0 50px;-webkit-transition:all .5s ease-in-out;transition:all .5s ease-in-out;-webkit-transform:translateX(-50%);transform:translateX(-50%)}.outline-message__content{white-space:nowrap;text-overflow:ellipsis;max-width:700px}.outline-message__close,.outline-message__icon{position:absolute;z-index:2;top:0;width:40px;height:40px;line-height:40px;text-align:center;overflow:hidden}.outline-message__icon{left:0;color:#fff}.outline-message__icon .outline-icon{position:absolute;z-index:2;top:50%;left:50%;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%)}.outline-message__close{right:0;cursor:pointer;color:#999}.outline-message__close .outline-icon{position:absolute;z-index:2;top:50%;left:50%;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%)}.outline-message__close:hover{color:#666}.outline-message_info .outline-message__icon{background-color:#507afe}.outline-message_warning .outline-message__icon{background-color:#ff9901}.outline-message_success .outline-message__icon{background-color:#058942}.outline-message_error .outline-message__icon{background-color:#ff5d5d}.outline-message_plain{min-width:190px;padding:0 50px 0 15px}.outline-message_light,.outline-message_round.outline-message_default{min-width:180px;padding:0 40px}.outline-message_plain.outline-message_info{border-left:5px solid #507afe;background-color:#ecf8ff}.outline-message_plain.outline-message_warning{border-left:5px solid #ff9901;background-color:#fffbe6}.outline-message_plain.outline-message_success{border-left:5px solid #058942;background-color:#e1f6eb}.outline-message_plain.outline-message_error{border-left:5px solid #ff5d5d;background-color:#fff1f0}.outline-message_plain .outline-message__icon{width:0;display:none}.outline-message_plain .outline-message__icon .outline-icon{display:none}.outline-message_light.outline-message_info .outline-message__icon{color:#507afe}.outline-message_light.outline-message_warning .outline-message__icon{color:#ff9901}.outline-message_light.outline-message_success .outline-message__icon{color:#058942}.outline-message_light.outline-message_error .outline-message__icon{color:#ff5d5d}.outline-message_light .outline-message__icon{background-color:#fff}.outline-message_round{border-radius:20px}.outline-message_round.outline-message_default .outline-message__icon{border-radius:10px;top:10px;left:10px;width:20px;height:20px;line-height:20px}.outline-message_round.outline-message_default.outline-message_full-width{min-width:200px;padding:0 20px 0 40px}.outline-message_round.outline-message_plain{min-width:195px;padding:0 40px 0 20px}.outline-message_round.outline-message_plain.outline-message_full-width{min-width:215px;padding:0 20px}.outline-message_full-width{min-width:200px;padding:0 10px 0 50px}.outline-message_full-width.outline-message_plain{min-width:230px;padding:0 10px 0 15px}.outline-message_full-width.outline-message_light{min-width:210px;padding:0 10px 0 40px}.outline-message_visible{opacity:1}.outline-message_hidden{display:none}::-webkit-scrollbar{width:7px;height:7px;-webkit-border-radius:5px}::-webkit-scrollbar-track-piece{-webkit-border-radius:5px}::-webkit-scrollbar-thumb:vertical{background-color:rgba(0,0,0,.25);-webkit-border-radius:5px}::-webkit-scrollbar-thumb:horizontal{background-color:rgba(0,0,0,.25);-webkit-border-radius:5px}::-webkit-scrollbar-thumb:hover{background-color:rgba(0,0,0,.35)}::-webkit-scrollbar:hover{background-color:rgba(0,0,0,.15)} -/*# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlcyI6WyJjc3MvZG9jcy5jc3MiXSwic291cmNlc0NvbnRlbnQiOlsiLyohIG5vcm1hbGl6ZS5jc3MgdjguMC4xIHwgTUlUIExpY2Vuc2UgfCBnaXRodWIuY29tL25lY29sYXMvbm9ybWFsaXplLmNzcyAqL1xuLyogRG9jdW1lbnRcbiAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXG4vKipcbiAqIDEuIENvcnJlY3QgdGhlIGxpbmUgaGVpZ2h0IGluIGFsbCBicm93c2Vycy5cbiAqIDIuIFByZXZlbnQgYWRqdXN0bWVudHMgb2YgZm9udCBzaXplIGFmdGVyIG9yaWVudGF0aW9uIGNoYW5nZXMgaW4gaU9TLlxuICovXG5odG1sIHtcbiAgbGluZS1oZWlnaHQ6IDEuMTU7XG4gIC8qIDEgKi9cbiAgLXdlYmtpdC10ZXh0LXNpemUtYWRqdXN0OiAxMDAlO1xuICAvKiAyICovXG59XG4vKiBTZWN0aW9uc1xuICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cbi8qKlxuICogUmVtb3ZlIHRoZSBtYXJnaW4gaW4gYWxsIGJyb3dzZXJzLlxuICovXG5ib2R5IHtcbiAgbWFyZ2luOiAwO1xufVxuLyoqXG4gKiBSZW5kZXIgdGhlIGBtYWluYCBlbGVtZW50IGNvbnNpc3RlbnRseSBpbiBJRS5cbiAqL1xubWFpbiB7XG4gIGRpc3BsYXk6IGJsb2NrO1xufVxuLyoqXG4gKiBDb3JyZWN0IHRoZSBmb250IHNpemUgYW5kIG1hcmdpbiBvbiBgaDFgIGVsZW1lbnRzIHdpdGhpbiBgc2VjdGlvbmAgYW5kXG4gKiBgYXJ0aWNsZWAgY29udGV4dHMgaW4gQ2hyb21lLCBGaXJlZm94LCBhbmQgU2FmYXJpLlxuICovXG5oMSB7XG4gIGZvbnQtc2l6ZTogMmVtO1xuICBtYXJnaW46IDAuNjdlbSAwO1xufVxuLyogR3JvdXBpbmcgY29udGVudFxuICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cbi8qKlxuICogMS4gQWRkIHRoZSBjb3JyZWN0IGJveCBzaXppbmcgaW4gRmlyZWZveC5cbiAqIDIuIFNob3cgdGhlIG92ZXJmbG93IGluIEVkZ2UgYW5kIElFLlxuICovXG5ociB7XG4gIC13ZWJraXQtYm94LXNpemluZzogY29udGVudC1ib3g7XG4gICAgICAgICAgYm94LXNpemluZzogY29udGVudC1ib3g7XG4gIC8qIDEgKi9cbiAgaGVpZ2h0OiAwO1xuICAvKiAxICovXG4gIG92ZXJmbG93OiB2aXNpYmxlO1xuICAvKiAyICovXG59XG4vKipcbiAqIDEuIENvcnJlY3QgdGhlIGluaGVyaXRhbmNlIGFuZCBzY2FsaW5nIG9mIGZvbnQgc2l6ZSBpbiBhbGwgYnJvd3NlcnMuXG4gKiAyLiBDb3JyZWN0IHRoZSBvZGQgYGVtYCBmb250IHNpemluZyBpbiBhbGwgYnJvd3NlcnMuXG4gKi9cbnByZSB7XG4gIGZvbnQtZmFtaWx5OiBtb25vc3BhY2UsIG1vbm9zcGFjZTtcbiAgLyogMSAqL1xuICBmb250LXNpemU6IDFlbTtcbiAgLyogMiAqL1xufVxuLyogVGV4dC1sZXZlbCBzZW1hbnRpY3NcbiAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXG4vKipcbiAqIFJlbW92ZSB0aGUgZ3JheSBiYWNrZ3JvdW5kIG9uIGFjdGl2ZSBsaW5rcyBpbiBJRSAxMC5cbiAqL1xuYSB7XG4gIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50O1xufVxuLyoqXG4gKiAxLiBSZW1vdmUgdGhlIGJvdHRvbSBib3JkZXIgaW4gQ2hyb21lIDU3LVxuICogMi4gQWRkIHRoZSBjb3JyZWN0IHRleHQgZGVjb3JhdGlvbiBpbiBDaHJvbWUsIEVkZ2UsIElFLCBPcGVyYSwgYW5kIFNhZmFyaS5cbiAqL1xuYWJiclt0aXRsZV0ge1xuICBib3JkZXItYm90dG9tOiBub25lO1xuICAvKiAxICovXG4gIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lO1xuICAvKiAyICovXG4gIC13ZWJraXQtdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmUgZG90dGVkO1xuICAgICAgICAgIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lIGRvdHRlZDtcbiAgLyogMiAqL1xufVxuLyoqXG4gKiBBZGQgdGhlIGNvcnJlY3QgZm9udCB3ZWlnaHQgaW4gQ2hyb21lLCBFZGdlLCBhbmQgU2FmYXJpLlxuICovXG5iLFxuc3Ryb25nIHtcbiAgZm9udC13ZWlnaHQ6IGJvbGRlcjtcbn1cbi8qKlxuICogMS4gQ29ycmVjdCB0aGUgaW5oZXJpdGFuY2UgYW5kIHNjYWxpbmcgb2YgZm9udCBzaXplIGluIGFsbCBicm93c2Vycy5cbiAqIDIuIENvcnJlY3QgdGhlIG9kZCBgZW1gIGZvbnQgc2l6aW5nIGluIGFsbCBicm93c2Vycy5cbiAqL1xuY29kZSxcbmtiZCxcbnNhbXAge1xuICBmb250LWZhbWlseTogbW9ub3NwYWNlLCBtb25vc3BhY2U7XG4gIC8qIDEgKi9cbiAgZm9udC1zaXplOiAxZW07XG4gIC8qIDIgKi9cbn1cbi8qKlxuICogQWRkIHRoZSBjb3JyZWN0IGZvbnQgc2l6ZSBpbiBhbGwgYnJvd3NlcnMuXG4gKi9cbnNtYWxsIHtcbiAgZm9udC1zaXplOiA4MCU7XG59XG4vKipcbiAqIFByZXZlbnQgYHN1YmAgYW5kIGBzdXBgIGVsZW1lbnRzIGZyb20gYWZmZWN0aW5nIHRoZSBsaW5lIGhlaWdodCBpblxuICogYWxsIGJyb3dzZXJzLlxuICovXG5zdWIsXG5zdXAge1xuICBmb250LXNpemU6IDc1JTtcbiAgbGluZS1oZWlnaHQ6IDA7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgdmVydGljYWwtYWxpZ246IGJhc2VsaW5lO1xufVxuc3ViIHtcbiAgYm90dG9tOiAtMC4yNWVtO1xufVxuc3VwIHtcbiAgdG9wOiAtMC41ZW07XG59XG4vKiBFbWJlZGRlZCBjb250ZW50XG4gICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xuLyoqXG4gKiBSZW1vdmUgdGhlIGJvcmRlciBvbiBpbWFnZXMgaW5zaWRlIGxpbmtzIGluIElFIDEwLlxuICovXG5pbWcge1xuICBib3JkZXItc3R5bGU6IG5vbmU7XG59XG4vKiBGb3Jtc1xuICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cbi8qKlxuICogMS4gQ2hhbmdlIHRoZSBmb250IHN0eWxlcyBpbiBhbGwgYnJvd3NlcnMuXG4gKiAyLiBSZW1vdmUgdGhlIG1hcmdpbiBpbiBGaXJlZm94IGFuZCBTYWZhcmkuXG4gKi9cbmJ1dHRvbixcbmlucHV0LFxub3B0Z3JvdXAsXG5zZWxlY3QsXG50ZXh0YXJlYSB7XG4gIGZvbnQtZmFtaWx5OiBpbmhlcml0O1xuICAvKiAxICovXG4gIGZvbnQtc2l6ZTogMTAwJTtcbiAgLyogMSAqL1xuICBsaW5lLWhlaWdodDogMS4xNTtcbiAgLyogMSAqL1xuICBtYXJnaW46IDA7XG4gIC8qIDIgKi9cbn1cbi8qKlxuICogU2hvdyB0aGUgb3ZlcmZsb3cgaW4gSUUuXG4gKiAxLiBTaG93IHRoZSBvdmVyZmxvdyBpbiBFZGdlLlxuICovXG5idXR0b24sXG5pbnB1dCB7XG4gIC8qIDEgKi9cbiAgb3ZlcmZsb3c6IHZpc2libGU7XG59XG4vKipcbiAqIFJlbW92ZSB0aGUgaW5oZXJpdGFuY2Ugb2YgdGV4dCB0cmFuc2Zvcm0gaW4gRWRnZSwgRmlyZWZveCwgYW5kIElFLlxuICogMS4gUmVtb3ZlIHRoZSBpbmhlcml0YW5jZSBvZiB0ZXh0IHRyYW5zZm9ybSBpbiBGaXJlZm94LlxuICovXG5idXR0b24sXG5zZWxlY3Qge1xuICAvKiAxICovXG4gIHRleHQtdHJhbnNmb3JtOiBub25lO1xufVxuLyoqXG4gKiBDb3JyZWN0IHRoZSBpbmFiaWxpdHkgdG8gc3R5bGUgY2xpY2thYmxlIHR5cGVzIGluIGlPUyBhbmQgU2FmYXJpLlxuICovXG5idXR0b24sXG5bdHlwZT0nYnV0dG9uJ10sXG5bdHlwZT0ncmVzZXQnXSxcblt0eXBlPSdzdWJtaXQnXSB7XG4gIC13ZWJraXQtYXBwZWFyYW5jZTogYnV0dG9uO1xufVxuLyoqXG4gKiBSZW1vdmUgdGhlIGlubmVyIGJvcmRlciBhbmQgcGFkZGluZyBpbiBGaXJlZm94LlxuICovXG5idXR0b246Oi1tb3otZm9jdXMtaW5uZXIsXG5bdHlwZT0nYnV0dG9uJ106Oi1tb3otZm9jdXMtaW5uZXIsXG5bdHlwZT0ncmVzZXQnXTo6LW1vei1mb2N1cy1pbm5lcixcblt0eXBlPSdzdWJtaXQnXTo6LW1vei1mb2N1cy1pbm5lciB7XG4gIGJvcmRlci1zdHlsZTogbm9uZTtcbiAgcGFkZGluZzogMDtcbn1cbi8qKlxuICogUmVzdG9yZSB0aGUgZm9jdXMgc3R5bGVzIHVuc2V0IGJ5IHRoZSBwcmV2aW91cyBydWxlLlxuICovXG5idXR0b246LW1vei1mb2N1c3JpbmcsXG5bdHlwZT0nYnV0dG9uJ106LW1vei1mb2N1c3JpbmcsXG5bdHlwZT0ncmVzZXQnXTotbW96LWZvY3VzcmluZyxcblt0eXBlPSdzdWJtaXQnXTotbW96LWZvY3VzcmluZyB7XG4gIG91dGxpbmU6IDFweCBkb3R0ZWQgQnV0dG9uVGV4dDtcbn1cbi8qKlxuICogQ29ycmVjdCB0aGUgcGFkZGluZyBpbiBGaXJlZm94LlxuICovXG5maWVsZHNldCB7XG4gIHBhZGRpbmc6IDAuMzVlbSAwLjc1ZW0gMC42MjVlbTtcbn1cbi8qKlxuICogMS4gQ29ycmVjdCB0aGUgdGV4dCB3cmFwcGluZyBpbiBFZGdlIGFuZCBJRS5cbiAqIDIuIENvcnJlY3QgdGhlIGNvbG9yIGluaGVyaXRhbmNlIGZyb20gYGZpZWxkc2V0YCBlbGVtZW50cyBpbiBJRS5cbiAqIDMuIFJlbW92ZSB0aGUgcGFkZGluZyBzbyBkZXZlbG9wZXJzIGFyZSBub3QgY2F1Z2h0IG91dCB3aGVuIHRoZXkgemVybyBvdXRcbiAqICAgIGBmaWVsZHNldGAgZWxlbWVudHMgaW4gYWxsIGJyb3dzZXJzLlxuICovXG5sZWdlbmQge1xuICAtd2Via2l0LWJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgLyogMSAqL1xuICBjb2xvcjogaW5oZXJpdDtcbiAgLyogMiAqL1xuICBkaXNwbGF5OiB0YWJsZTtcbiAgLyogMSAqL1xuICBtYXgtd2lkdGg6IDEwMCU7XG4gIC8qIDEgKi9cbiAgcGFkZGluZzogMDtcbiAgLyogMyAqL1xuICB3aGl0ZS1zcGFjZTogbm9ybWFsO1xuICAvKiAxICovXG59XG4vKipcbiAqIEFkZCB0aGUgY29ycmVjdCB2ZXJ0aWNhbCBhbGlnbm1lbnQgaW4gQ2hyb21lLCBGaXJlZm94LCBhbmQgT3BlcmEuXG4gKi9cbnByb2dyZXNzIHtcbiAgdmVydGljYWwtYWxpZ246IGJhc2VsaW5lO1xufVxuLyoqXG4gKiBSZW1vdmUgdGhlIGRlZmF1bHQgdmVydGljYWwgc2Nyb2xsYmFyIGluIElFIDEwKy5cbiAqL1xudGV4dGFyZWEge1xuICBvdmVyZmxvdzogYXV0bztcbn1cbi8qKlxuICogMS4gQWRkIHRoZSBjb3JyZWN0IGJveCBzaXppbmcgaW4gSUUgMTAuXG4gKiAyLiBSZW1vdmUgdGhlIHBhZGRpbmcgaW4gSUUgMTAuXG4gKi9cblt0eXBlPSdjaGVja2JveCddLFxuW3R5cGU9J3JhZGlvJ10ge1xuICAtd2Via2l0LWJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgLyogMSAqL1xuICBwYWRkaW5nOiAwO1xuICAvKiAyICovXG59XG4vKipcbiAqIENvcnJlY3QgdGhlIGN1cnNvciBzdHlsZSBvZiBpbmNyZW1lbnQgYW5kIGRlY3JlbWVudCBidXR0b25zIGluIENocm9tZS5cbiAqL1xuW3R5cGU9J251bWJlciddOjotd2Via2l0LWlubmVyLXNwaW4tYnV0dG9uLFxuW3R5cGU9J251bWJlciddOjotd2Via2l0LW91dGVyLXNwaW4tYnV0dG9uIHtcbiAgaGVpZ2h0OiBhdXRvO1xufVxuLyoqXG4gKiAxLiBDb3JyZWN0IHRoZSBvZGQgYXBwZWFyYW5jZSBpbiBDaHJvbWUgYW5kIFNhZmFyaS5cbiAqIDIuIENvcnJlY3QgdGhlIG91dGxpbmUgc3R5bGUgaW4gU2FmYXJpLlxuICovXG5bdHlwZT0nc2VhcmNoJ10ge1xuICAtd2Via2l0LWFwcGVhcmFuY2U6IHRleHRmaWVsZDtcbiAgLyogMSAqL1xuICBvdXRsaW5lLW9mZnNldDogLTJweDtcbiAgLyogMiAqL1xufVxuLyoqXG4gKiBSZW1vdmUgdGhlIGlubmVyIHBhZGRpbmcgaW4gQ2hyb21lIGFuZCBTYWZhcmkgb24gbWFjT1MuXG4gKi9cblt0eXBlPSdzZWFyY2gnXTo6LXdlYmtpdC1zZWFyY2gtZGVjb3JhdGlvbiB7XG4gIC13ZWJraXQtYXBwZWFyYW5jZTogbm9uZTtcbn1cbi8qKlxuICogMS4gQ29ycmVjdCB0aGUgaW5hYmlsaXR5IHRvIHN0eWxlIGNsaWNrYWJsZSB0eXBlcyBpbiBpT1MgYW5kIFNhZmFyaS5cbiAqIDIuIENoYW5nZSBmb250IHByb3BlcnRpZXMgdG8gYGluaGVyaXRgIGluIFNhZmFyaS5cbiAqL1xuOjotd2Via2l0LWZpbGUtdXBsb2FkLWJ1dHRvbiB7XG4gIC13ZWJraXQtYXBwZWFyYW5jZTogYnV0dG9uO1xuICAvKiAxICovXG4gIGZvbnQ6IGluaGVyaXQ7XG4gIC8qIDIgKi9cbn1cbi8qIEludGVyYWN0aXZlXG4gICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xuLypcbiAqIEFkZCB0aGUgY29ycmVjdCBkaXNwbGF5IGluIEVkZ2UsIElFIDEwKywgYW5kIEZpcmVmb3guXG4gKi9cbmRldGFpbHMge1xuICBkaXNwbGF5OiBibG9jaztcbn1cbi8qXG4gKiBBZGQgdGhlIGNvcnJlY3QgZGlzcGxheSBpbiBhbGwgYnJvd3NlcnMuXG4gKi9cbnN1bW1hcnkge1xuICBkaXNwbGF5OiBsaXN0LWl0ZW07XG59XG4vKiBNaXNjXG4gICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xuLyoqXG4gKiBBZGQgdGhlIGNvcnJlY3QgZGlzcGxheSBpbiBJRSAxMCsuXG4gKi9cbnRlbXBsYXRlIHtcbiAgZGlzcGxheTogbm9uZTtcbn1cbi8qKlxuICogQWRkIHRoZSBjb3JyZWN0IGRpc3BsYXkgaW4gSUUgMTAuXG4gKi9cbltoaWRkZW5dIHtcbiAgZGlzcGxheTogbm9uZTtcbn1cbi8qID09PT09IEJhc2UgPT09PT0gKi9cbmh0bWwsXG5ib2R5IHtcbiAgaGVpZ2h0OiAxMDAlO1xuICBiYWNrZ3JvdW5kOiAjZmFmYWZhO1xuICBjb2xvcjogIzMzMztcbiAgZm9udC1zaXplOiAxNHB4O1xuICBsaW5lLWhlaWdodDogMTUwJTtcbiAgZm9udC1mYW1pbHk6ICdNaWNyb3NvZnQgWWFIZWkgVUknLCBBcmlhbCwgc2Fucy1zZXJpZjtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbmE6bGluayxcbmE6dmlzaXRlZCxcbmE6aG92ZXIge1xuICBjb2xvcjogIzA1ODk0MjtcbiAgdGV4dC1kZWNvcmF0aW9uOiBub25lO1xufVxuYTpob3ZlciB7XG4gIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lO1xufVxuY29kZSB7XG4gIGZvbnQtZmFtaWx5OiAnU291cmNlIENvZGUgUHJvJywgQ29uc29sYXMsIEdlb3JnaWEsIE1vbmFjbywgbW9ub3NwYWNlLCBBcmlhbCwgc2Fucy1zZXJpZjtcbn1cbi8qID09PT09IFNjcm9sbGJhciA9PT09PSAqL1xuOjotd2Via2l0LXNjcm9sbGJhciB7XG4gIHdpZHRoOiA3cHg7XG4gIGhlaWdodDogN3B4O1xuICAtd2Via2l0LWJvcmRlci1yYWRpdXM6IDVweDtcbn1cbjo6LXdlYmtpdC1zY3JvbGxiYXItdHJhY2stcGllY2Uge1xuICAtd2Via2l0LWJvcmRlci1yYWRpdXM6IDVweDtcbn1cbjo6LXdlYmtpdC1zY3JvbGxiYXItdGh1bWI6dmVydGljYWwge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuMjUpO1xuICAtd2Via2l0LWJvcmRlci1yYWRpdXM6IDVweDtcbn1cbjo6LXdlYmtpdC1zY3JvbGxiYXItdGh1bWI6aG9yaXpvbnRhbCB7XG4gIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMCwgMCwgMCwgMC4yNSk7XG4gIC13ZWJraXQtYm9yZGVyLXJhZGl1czogNXB4O1xufVxuOjotd2Via2l0LXNjcm9sbGJhcjpob3ZlciB7XG4gIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMCwgMCwgMCwgMC4xNSk7XG59XG46Oi13ZWJraXQtc2Nyb2xsYmFyLXRodW1iOmhvdmVyIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjM1KTtcbn1cbi8qIExheW91dCAqL1xuLmRvY3Mge1xuICBkaXNwbGF5OiAtd2Via2l0LWJveDtcbiAgZGlzcGxheTogLW1zLWZsZXhib3g7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIC13ZWJraXQtYm94LW9yaWVudDogaG9yaXpvbnRhbDtcbiAgLXdlYmtpdC1ib3gtZGlyZWN0aW9uOiBub3JtYWw7XG4gICAgICAtbXMtZmxleC1kaXJlY3Rpb246IHJvdztcbiAgICAgICAgICBmbGV4LWRpcmVjdGlvbjogcm93O1xuICAtbXMtZmxleC13cmFwOiBub3dyYXA7XG4gICAgICBmbGV4LXdyYXA6IG5vd3JhcDtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICB6LWluZGV4OiAxO1xuICBoZWlnaHQ6IDEwMCU7XG4gIHdpZHRoOiAxMDAlO1xuICBtYXJnaW46IDA7XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4vKiBBc2lkZSAqL1xuLmFzaWRlIHtcbiAgZGlzcGxheTogLXdlYmtpdC1ib3g7XG4gIGRpc3BsYXk6IC1tcy1mbGV4Ym94O1xuICBkaXNwbGF5OiBmbGV4O1xuICAtbXMtZmxleC1uZWdhdGl2ZTogMDtcbiAgICAgIGZsZXgtc2hyaW5rOiAwO1xuICAtd2Via2l0LWJveC1vcmllbnQ6IHZlcnRpY2FsO1xuICAtd2Via2l0LWJveC1kaXJlY3Rpb246IG5vcm1hbDtcbiAgICAgIC1tcy1mbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gIC1tcy1mbGV4LXdyYXA6IG5vd3JhcDtcbiAgICAgIGZsZXgtd3JhcDogbm93cmFwO1xuICB3aWR0aDogMjYwcHg7XG4gIG1hcmdpbjogMDtcbiAgaGVpZ2h0OiAxMDAlO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjMzMzO1xuICBjb2xvcjogI2RkZDtcbiAgLXdlYmtpdC1ib3gtc2hhZG93OiAwIDAgNXB4IDJweCAjZGRkO1xuICAgICAgICAgIGJveC1zaGFkb3c6IDAgMCA1cHggMnB4ICNkZGQ7XG4gIC13ZWJraXQtdHJhbnNpdGlvbi1kdXJhdGlvbjogMC4zcztcbiAgICAgICAgICB0cmFuc2l0aW9uLWR1cmF0aW9uOiAwLjNzO1xuICBvdmVyZmxvdzogYXV0bztcbn1cbi8qIE1haW4gKi9cbi5tYWluIHtcbiAgLXdlYmtpdC1ib3gtZmxleDogMTtcbiAgICAgIC1tcy1mbGV4OiAxO1xuICAgICAgICAgIGZsZXg6IDE7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgei1pbmRleDogMTtcbiAgaGVpZ2h0OiAxMDAlO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmO1xuICBvdmVyZmxvdzogYXV0bztcbn1cbkBtZWRpYSAobWF4LXdpZHRoOiA1MDBweCkge1xuICAuZG9jcyB7XG4gICAgLXdlYmtpdC1ib3gtb3JpZW50OiB2ZXJ0aWNhbDtcbiAgICAtd2Via2l0LWJveC1kaXJlY3Rpb246IG5vcm1hbDtcbiAgICAgICAgLW1zLWZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICB9XG4gIC5hc2lkZSxcbiAgLm1haW4ge1xuICAgIHdpZHRoOiAxMDAlO1xuICB9XG4gIC5hc2lkZSB7XG4gICAgcG9zaXRpb246IGZpeGVkO1xuICAgIHotaW5kZXg6IDM7XG4gICAgdG9wOiAwO1xuICB9XG4gIC5hc2lkZS5vdXRsaW5lLW5hdmlnYXRvcl9mb2xkZWQge1xuICAgIGxlZnQ6IC0xMDAlO1xuICB9XG4gIC5hc2lkZS5vdXRsaW5lLW5hdmlnYXRvcl9leHBhbmRlZCB7XG4gICAgbGVmdDogMDtcbiAgfVxufVxuLmFzaWRlIHtcbiAgZm9udC1mYW1pbHk6ICdTb3VyY2UgQ29kZSBQcm8nLCBDb25zb2xhcywgR2VvcmdpYSwgTW9uYWNvLCBtb25vc3BhY2UsIEFyaWFsLCBzYW5zLXNlcmlmO1xufVxuLmFzaWRlX19oZWFkZXIge1xuICBtYXJnaW46IDAgYXV0bztcbiAgLW1zLWZsZXgtbmVnYXRpdmU6IDA7XG4gICAgICBmbGV4LXNocmluazogMDtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi5hc2lkZV9fbmF2IHtcbiAgLXdlYmtpdC1ib3gtZmxleDogMTtcbiAgICAgIC1tcy1mbGV4OiAxO1xuICAgICAgICAgIGZsZXg6IDE7XG4gIG92ZXJmbG93OiBhdXRvO1xufVxuLmFzaWRlX19oMiB7XG4gIG1hcmdpbjogMCBhdXRvO1xuICBoZWlnaHQ6IDU0cHg7XG4gIGxpbmUtaGVpZ2h0OiA1NHB4O1xuICBmb250LXNpemU6IDIwcHg7XG4gIGZvbnQtd2VpZ2h0OiBub3JtYWw7XG4gIGZvbnQtZmFtaWx5OiBHZW9yZ2lhLCBDb25zb2xhcywgQXJpYWwsIHNhbnMtc2VyaWY7XG4gIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi5hc2lkZV9faDMge1xuICBtYXJnaW46IDAgYXV0bztcbiAgcGFkZGluZzogMCAyMHB4O1xuICBmb250LXNpemU6IDE2cHg7XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4uYXNpZGVfX2xpc3Qge1xuICBtYXJnaW46IDA7XG4gIHBhZGRpbmc6IDEwcHggMDtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi5hc2lkZV9faXRlbSB7XG4gIGhlaWdodDogMzJweDtcbiAgbGluZS1oZWlnaHQ6IDMycHg7XG4gIHBhZGRpbmc6IDAgMzBweDtcbiAgY3Vyc29yOiBwb2ludGVyO1xuICBmb250LXNpemU6IDEzcHg7XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4uYXNpZGUtbmF2aWdhdG9yIHtcbiAgLXdlYmtpdC1ib3gtZmxleDogMTtcbiAgICAgIC1tcy1mbGV4OiAxO1xuICAgICAgICAgIGZsZXg6IDE7XG59XG4uYXNpZGUtbmF2aWdhdG9yIC5vdXRsaW5lLW5hdmlnYXRvcl9fbWFpbjo6LXdlYmtpdC1zY3JvbGxiYXItdGh1bWIge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjNjY2O1xufVxuLmFzaWRlLW5hdmlnYXRvciAub3V0bGluZS1uYXZpZ2F0b3JfX21haW46Oi13ZWJraXQtc2Nyb2xsYmFyLXRodW1iOmhvdmVyIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogIzk5OTtcbn1cbi5hc2lkZS1uYXZpZ2F0b3IgLm91dGxpbmUtbmF2aWdhdG9yX19wbGFjZWhvbGRlciB7XG4gIGJhY2tncm91bmQtY29sb3I6ICM1NTU7XG4gIGJvcmRlci1sZWZ0OiAzcHggc29saWQgI2ZmZjtcbn1cbi5hc2lkZS1uYXZpZ2F0b3IgLm91dGxpbmUtbmF2aWdhdG9yX19hbmNob3I6bGluayB7XG4gIGNvbG9yOiAjZGRkO1xuICB0ZXh0LWRlY29yYXRpb246IG5vbmU7XG59XG4uYXNpZGUtbmF2aWdhdG9yIC5vdXRsaW5lLW5hdmlnYXRvcl9fYW5jaG9yOnZpc2l0ZWQge1xuICBjb2xvcjogI2RkZDtcbiAgdGV4dC1kZWNvcmF0aW9uOiBub25lO1xufVxuLmFzaWRlLW5hdmlnYXRvciAub3V0bGluZS1uYXZpZ2F0b3JfX2FuY2hvcjpob3ZlciB7XG4gIGNvbG9yOiAjZGRkO1xuICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTtcbn1cbi5hc2lkZS1uYXZpZ2F0b3IgLm91dGxpbmUtbmF2aWdhdG9yX2FjdGl2ZS5vdXRsaW5lLW5hdmlnYXRvcl9fYW5jaG9yOmxpbmssXG4uYXNpZGUtbmF2aWdhdG9yIC5vdXRsaW5lLW5hdmlnYXRvcl9hY3RpdmUub3V0bGluZS1uYXZpZ2F0b3JfX2FuY2hvcjp2aXNpdGVkLFxuLmFzaWRlLW5hdmlnYXRvciAub3V0bGluZS1uYXZpZ2F0b3JfYWN0aXZlLm91dGxpbmUtbmF2aWdhdG9yX19hbmNob3I6aG92ZXIge1xuICBjb2xvcjogI2ZmZjtcbn1cbi5tYWluX19oZWFkZXIsXG4ubWFpbl9fZm9vdGVyIHtcbiAgbWFyZ2luOiAwIGF1dG87XG4gIHBhZGRpbmc6IDFlbTtcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLm1haW5fX2gxIHtcbiAgbWFyZ2luOiAwIGF1dG87XG4gIHBhZGRpbmctdG9wOiAxZW07XG4gIGZvbnQtc2l6ZTogNWVtO1xuICBmb250LXdlaWdodDogbm9ybWFsO1xuICBsaW5lLWhlaWdodDogMmVtO1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLm1haW5fX25hbWUge1xuICBjb2xvcjogIzUwN2FmZTtcbiAgZm9udC13ZWlnaHQ6IG5vcm1hbDtcbn1cbi5tYWluX190YWdsaW5lIHtcbiAgbWFyZ2luOiAxZW0gYXV0bztcbiAgbWF4LXdpZHRoOiA5NjBweDtcbiAgbGluZS1oZWlnaHQ6IDEuM2VtO1xuICBmb250LXNpemU6IDJlbTtcbiAgY29sb3I6ICM5OTk7XG4gIGZvbnQtd2VpZ2h0OiAxMDA7XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4ubWFpbl9fY2RuIHtcbiAgbWFyZ2luOiAyZW0gMDtcbiAgcGFkZGluZzogMmVtO1xuICBmb250LXNpemU6IDE2cHg7XG4gIGxpbmUtaGVpZ2h0OiAxNTAlO1xuICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gIGJhY2tncm91bmQtY29sb3I6ICNmYWZhZmE7XG4gIGJvcmRlci10b3A6IDFweCBzb2xpZCAjZGRkO1xuICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI2RkZDtcbiAgY29sb3I6ICM2NjY7XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4ubWFpbl9fZG93bmxvYWQge1xuICBtYXJnaW46IDFlbSBhdXRvO1xuICB3aWR0aDogMjAwcHg7XG4gIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi5tYWluX19idXR0b24ge1xuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gIGJvcmRlci1yYWRpdXM6IDRweDtcbiAgcGFkZGluZzogMTRweCAyOXB4O1xuICBmb250LXNpemU6IDE4cHg7XG4gIGZvbnQtZmFtaWx5OiAnU291cmNlIENvZGUgUHJvJywgQ29uc29sYXMsIEdlb3JnaWEsIE1vbmFjbywgbW9ub3NwYWNlLCBBcmlhbCwgc2Fucy1zZXJpZjtcbiAgYmFja2dyb3VuZC1jb2xvcjogIzA1ODk0MjtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi5tYWluX19idXR0b246bGluayxcbi5tYWluX19idXR0b246dmlzaXRlZCxcbi5tYWluX19idXR0b246aG92ZXIge1xuICBjb2xvcjogI2ZmZjtcbiAgdGV4dC1kZWNvcmF0aW9uOiBub25lO1xufVxuLm1haW5fX2Zvb3RlciB7XG4gIG1hcmdpbjogMCAzZW07XG4gIGJvcmRlci10b3A6IDFweCBzb2xpZCAjZGRkO1xufVxuLnNlY3Rpb24ge1xuICBtYXJnaW46IDFlbSAwO1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLnNlY3Rpb25fX2hlYWRlcixcbi5zZWN0aW9uX19jb250ZW50LFxuLnNlY3Rpb25fX2Zvb3RlciB7XG4gIG1hcmdpbjogMDtcbiAgcGFkZGluZzogMCAzZW07XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4uc2VjdGlvbl9fdGl0bGUge1xuICBjb2xvcjogIzY2Njtcbn1cbi5zZWN0aW9uX19oMyB7XG4gIGNvbG9yOiAjNTA3YWZlO1xuICBmb250LXNpemU6IDEuMzVlbTtcbn1cbi5zZWN0aW9uX19oNCB7XG4gIGZvbnQtc2l6ZTogMS4xZW07XG4gIGNvbG9yOiAjNjY2O1xufVxuLnNlY3Rpb25fX2g1IHtcbiAgZm9udC1zaXplOiAxZW07XG4gIGNvbG9yOiAjOTk5O1xufVxuLnNlY3Rpb25fX2RsLFxuLnNlY3Rpb25fX2R0LFxuLnNlY3Rpb25fX2RkIHtcbiAgbWFyZ2luOiAwO1xuICBwYWRkaW5nOiAwO1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLnNlY3Rpb25fX2RsIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICB6LWluZGV4OiAxO1xufVxuLnNlY3Rpb25fX2R0IHtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xufVxuLnNlY3Rpb25fX2RkIHtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICBjb2xvcjogIzA1ODk0Mjtcbn1cbi5zZWN0aW9uX19wcmUge1xuICBtYXJnaW46IDJlbSAwO1xuICBwYWRkaW5nOiAxZW07XG4gIGZvbnQtc2l6ZTogMTRweDtcbiAgbGluZS1oZWlnaHQ6IDE1MCU7XG4gIHRleHQtYWxpZ246IGxlZnQ7XG4gIGJhY2tncm91bmQtY29sb3I6ICNmYWZhZmE7XG4gIGJvcmRlcjogMXB4IHNvbGlkICNkZGQ7XG4gIGJvcmRlci1yYWRpdXM6IDRweDtcbiAgY29sb3I6ICM2NjY7XG4gIG92ZXJmbG93OiBhdXRvO1xufVxuLnNlY3Rpb25fX2NvZGUge1xuICBkaXNwbGF5OiBibG9jaztcbiAgbWFyZ2luOiAwIGF1dG87XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4uc2VjdGlvbl9fZm9vdGVyIHtcbiAgYm9yZGVyLXRvcDogMXB4IHNvbGlkICNkZGQ7XG4gIG1hcmdpbi10b3A6IDNlbTtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ZhZmFmYTtcbiAgY29sb3I6ICM5OTk7XG59XG4uc2VjdGlvbl9fdGFibGUge1xuICBtYXJnaW46IDFlbSBhdXRvO1xuICB3aWR0aDogMTAwJTtcbiAgYm9yZGVyLXRvcDogMXB4IHNvbGlkICNkZGQ7XG59XG4uc2VjdGlvbl9fdGgsXG4uc2VjdGlvbl9fdGQge1xuICBwYWRkaW5nOiA1cHggMTZweDtcbiAgbGluZS1oZWlnaHQ6IDI2cHg7XG4gIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjZGRkO1xufVxuLnNlY3Rpb25fX3RoIHtcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmFmYWZhO1xufVxuQG1lZGlhIChtYXgtd2lkdGg6IDUwMHB4KSB7XG4gIC5zZWN0aW9uX19oZWFkZXIsXG4gIC5zZWN0aW9uX19jb250ZW50IHtcbiAgICBwYWRkaW5nOiAwIDFlbTtcbiAgfVxufVxuLmNhc2Uge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIHotaW5kZXg6IDE7XG4gIGRpc3BsYXk6IGdyaWQ7XG4gIGdyaWQtdGVtcGxhdGUtY29sdW1uczogcmVwZWF0KDIsIDFmcik7XG4gIGdhcDogNDBweDtcbiAgcGFkZGluZzogMWVtO1xuICBib3JkZXItdG9wOiAxcHggc29saWQgI2RkZDtcbiAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNkZGQ7XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4uY2FzZTphZnRlciB7XG4gIGNvbnRlbnQ6ICcnO1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHotaW5kZXg6IDI7XG4gIHRvcDogMDtcbiAgbGVmdDogNTAlO1xuICBoZWlnaHQ6IDEwMCU7XG4gIHdpZHRoOiAwO1xuICBib3JkZXItbGVmdDogMXB4IHNvbGlkICNkZGQ7XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4uY2FzZV9fcHJlLFxuLmNhc2VfX3RleHRhcmVhIHtcbiAgZm9udC1zaXplOiAxM3B4O1xuICBsaW5lLWhlaWdodDogMTUwJTtcbn1cbi5jYXNlX19wcmUsXG4uY2FzZV9fY29kZSxcbi5jYXNlX190ZXh0YXJlYSB7XG4gIGZvbnQtZmFtaWx5OiAnQ291cmllciBOZXcnLCBDb25zb2xhcywgR2VvcmdpYSwgQXJpYWwsIHNhbnMtc2VyaWY7XG59XG4uY2FzZV9fcHJlIHtcbiAgbWFyZ2luOiAwO1xuICBwYWRkaW5nOiAxZW07XG4gIGJhY2tncm91bmQtY29sb3I6ICNmYWZhZmE7XG4gIGhlaWdodDogMTAwJTtcbiAgYm9yZGVyLXJhZGl1czogNHB4O1xuICAtd2Via2l0LWJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgb3ZlcmZsb3c6IGF1dG87XG59XG4uY2FzZV9fdG9vbGJhciB7XG4gIG1hcmdpbjogMCBhdXRvO1xuICBoZWlnaHQ6IDM2cHg7XG4gIGxpbmUtaGVpZ2h0OiAzNnB4O1xuICBmb250LXNpemU6IDE0cHg7XG4gIHBhZGRpbmc6IDAgMTZweDtcbiAgdGV4dC1hbGlnbjogcmlnaHQ7XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4uY2FzZV9fYWN0aW9uLFxuLmNhc2VfX3JlbW92ZSB7XG4gIGN1cnNvcjogcG9pbnRlcjtcbiAgY29sb3I6ICMwNTg5NDI7XG4gIC13ZWJraXQtdXNlci1zZWxlY3Q6IG5vbmU7XG4gICAgIC1tb3otdXNlci1zZWxlY3Q6IG5vbmU7XG4gICAgICAtbXMtdXNlci1zZWxlY3Q6IG5vbmU7XG4gICAgICAgICAgdXNlci1zZWxlY3Q6IG5vbmU7XG59XG4uY2FzZV9fYWN0aW9uIHtcbiAgZm9udC1zaXplOiAxM3B4O1xuICBwYWRkaW5nLWxlZnQ6IDEwcHg7XG59XG4uY2FzZV9fYWN0aW9uOmZpcnN0LWNoaWxkIHtcbiAgcGFkZGluZy1sZWZ0OiAwO1xufVxuLmNhc2VfX3JlbW92ZSB7XG4gIGZsb2F0OiByaWdodDtcbn1cbi5jYXNlX19jb25zb2xlIHtcbiAgbWFyZ2luOiAwIGF1dG87XG4gIGhlaWdodDogMTgwcHg7XG4gIGJvcmRlcjogMXB4IHNvbGlkICNkZGQ7XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4uY2FzZV9fdGV4dGFyZWEge1xuICBtYXJnaW46IDAgYXV0bztcbiAgd2lkdGg6IDEwMCU7XG4gIGhlaWdodDogMTAwJTtcbiAgYm9yZGVyOiBub25lO1xuICBvdXRsaW5lOiBub25lO1xuICBwYWRkaW5nOiAxZW07XG4gIC13ZWJraXQtYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICBvdmVyZmxvdzogYXV0bztcbn1cbi5jYXNlX19saXN0LFxuLmNhc2VfX2l0ZW0ge1xuICBtYXJnaW46IDA7XG4gIHBhZGRpbmc6IDA7XG4gIGxpc3Qtc3R5bGUtdHlwZTogbm9uZTtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi5jYXNlX19saXN0IHtcbiAgaGVpZ2h0OiAzNjBweDtcbiAgYm9yZGVyLXRvcDogMXB4IHNvbGlkICNkZGQ7XG4gIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjZGRkO1xuICBmb250LXNpemU6IDEzcHg7XG4gIG92ZXJmbG93OiBhdXRvO1xufVxuLmNhc2VfX2l0ZW0ge1xuICBoZWlnaHQ6IDM2cHg7XG4gIGxpbmUtaGVpZ2h0OiAzNnB4O1xuICBjdXJzb3I6IHBvaW50ZXI7XG4gIHBhZGRpbmc6IDAgMTZweDtcbn1cbi5jYXNlX19pdGVtOmhvdmVyIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2Y3ZjhmOTtcbn1cbjpyb290IHtcbiAgLS1vdXRsaW5lLXpJbmRleDogMjAwMDtcbiAgLS1vdXRsaW5lLXN0aWNreS1oZWlnaHQ6IDEwMCU7XG4gIC0tb3V0bGluZS1uYXZpZ2F0b3Itd2lkdGg6IDEwMCU7XG59XG4vKiA9PT09PT09PT09IGNvbG9ycy50aGVtZSAtIOWfuuehgOminOiJsuWPmOmHj+mbhuWQiCA9PT09PT09PT09ICovXG4vKipcbiAqIGVsbGlwc2lzLmxlc3MgLSDmlofmnKznnIHnlaUgbWl4aW54IOWHveaVsFxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogQ3JlYXRlZCBCeTogWWFvaGFpeGlhb1xuICogVXBkYXRlOiAyMDIyLjMuMTFcbiAqL1xuLyogPT09PT09IOaWh+acrOecgeeVpeWHveaVsCA9PT09PT0gKi9cbi8qKlxuICogc2hhZG93Lmxlc3MgLSDpmLTlvbHmoLflvI/orr7nva4gbWl4aW54IOWHveaVsFxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogQ3JlYXRlZCBCeTogWWFvaGFpeGlhb1xuICogVXBkYXRlOiAyMDIyLjMuMjBcbiAqL1xuLyogPT09PT09IOmYtOW9seagt+W8j+iuvue9ruWHveaVsCA9PT09PT0gKi9cbi8qID09PT09PT09PT0gaWNvbi50aGVtZSAtIHN2ZyDlm77moIfnmoTmoLflvI8gPT09PT09PT09PSAqL1xuLm91dGxpbmUtaWNvbiB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgei1pbmRleDogMTtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO1xuICB3aWR0aDogMWVtO1xuICBoZWlnaHQ6IDFlbTtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi5vdXRsaW5lLWljb25fX3N2ZyB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgei1pbmRleDogMjtcbiAgdG9wOiA1MCU7XG4gIGxlZnQ6IDUwJTtcbiAgd2lkdGg6IDFlbTtcbiAgaGVpZ2h0OiAxZW07XG4gIGZpbGw6IGN1cnJlbnRjb2xvcjtcbiAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCAtNTAlKTtcbiAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCAtNTAlKTtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi5vdXRsaW5lLWljb25faGlkZGVuIHtcbiAgZGlzcGxheTogbm9uZTtcbn1cbi5vdXRsaW5lLWhlYWRpbmcge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIHotaW5kZXg6IDE7XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4ub3V0bGluZS1oZWFkaW5nX19hbmNob3Ige1xuICBkaXNwbGF5OiBub25lO1xufVxuLm91dGxpbmUtaGVhZGluZ19fYW5jaG9yOmxpbmssXG4ub3V0bGluZS1oZWFkaW5nX19hbmNob3I6dmlzaXRlZCxcbi5vdXRsaW5lLWhlYWRpbmdfX2FuY2hvcjpob3ZlciB7XG4gIGNvbG9yOiAjOTk5O1xuICB0ZXh0LWRlY29yYXRpb246IG5vbmU7XG59XG4ub3V0bGluZS1oZWFkaW5nX19hbmNob3I6aG92ZXIge1xuICBjb2xvcjogIzUwN2FmZTtcbn1cbi5vdXRsaW5lLWhlYWRpbmc6aG92ZXIgLm91dGxpbmUtaGVhZGluZ19fYW5jaG9yIHtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xufVxuLm91dGxpbmUtaGVhZGluZ19zdGFydDpob3ZlciB7XG4gIG92ZXJmbG93OiB2aXNpYmxlO1xufVxuLm91dGxpbmUtaGVhZGluZ19zdGFydCAub3V0bGluZS1oZWFkaW5nX19hbmNob3Ige1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHotaW5kZXg6IDI7XG4gIHRvcDogNTAlO1xuICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlWSgtNTAlKTtcbiAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTUwJSk7XG4gIGxlZnQ6IC0xZW07XG59XG4ub3V0bGluZS1kcmF3ZXIge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIHotaW5kZXg6IC0xO1xuICB0b3A6IDA7XG4gIGxlZnQ6IDA7XG4gIG1hcmdpbjogMDtcbiAgd2lkdGg6IDEwMCU7XG4gIGhlaWdodDogMTAwJTtcbiAgLXdlYmtpdC1ib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gIHZpc2liaWxpdHk6IGhpZGRlbjtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi5vdXRsaW5lLWRyYXdlcl9fbW9kYWwge1xuICAtd2Via2l0LWJveC1zaGFkb3c6IDAgMCA2cHggMXB4ICNkY2RmZTY7XG4gICAgICAgICAgYm94LXNoYWRvdzogMCAwIDZweCAxcHggI2RjZGZlNjtcbiAgZGlzcGxheTogLXdlYmtpdC1ib3g7XG4gIGRpc3BsYXk6IC1tcy1mbGV4Ym94O1xuICBkaXNwbGF5OiBmbGV4O1xuICAtd2Via2l0LWJveC1vcmllbnQ6IHZlcnRpY2FsO1xuICAtd2Via2l0LWJveC1kaXJlY3Rpb246IG5vcm1hbDtcbiAgICAgIC1tcy1mbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gIC1tcy1mbGV4LXdyYXA6IG5vd3JhcDtcbiAgICAgIGZsZXgtd3JhcDogbm93cmFwO1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHotaW5kZXg6IDIxO1xuICBoZWlnaHQ6IDEwMCU7XG4gIGJhY2tncm91bmQtY29sb3I6ICNmZmY7XG4gIC13ZWJraXQtdHJhbnNpdGlvbi1kdXJhdGlvbjogMC40cztcbiAgICAgICAgICB0cmFuc2l0aW9uLWR1cmF0aW9uOiAwLjRzO1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLm91dGxpbmUtZHJhd2VyX19oZWFkZXIsXG4ub3V0bGluZS1kcmF3ZXJfX21haW4sXG4ub3V0bGluZS1kcmF3ZXJfX2Zvb3RlciB7XG4gIHdpZHRoOiAxMDAlO1xuICAtd2Via2l0LWJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbn1cbi5vdXRsaW5lLWRyYXdlcl9faGVhZGVyLFxuLm91dGxpbmUtZHJhd2VyX19mb290ZXIge1xuICAtbXMtZmxleC1uZWdhdGl2ZTogMDtcbiAgICAgIGZsZXgtc2hyaW5rOiAwO1xufVxuLm91dGxpbmUtZHJhd2VyX190aXRsZSxcbi5vdXRsaW5lLWRyYXdlcl9fbWFpbixcbi5vdXRsaW5lLWRyYXdlcl9fZm9vdGVyIHtcbiAgcGFkZGluZzogMCAxNnB4O1xufVxuLm91dGxpbmUtZHJhd2VyX19oZWFkZXIsXG4ub3V0bGluZS1kcmF3ZXJfX3RpdGxlIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICB6LWluZGV4OiAxO1xuICBtYXJnaW46IDAgYXV0bztcbiAgaGVpZ2h0OiA1MnB4O1xuICBsaW5lLWhlaWdodDogNTJweDtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi5vdXRsaW5lLWRyYXdlcl9fdGl0bGUge1xuICBmb250LXNpemU6IDE2cHg7XG4gIGZvbnQtd2VpZ2h0OiA0MDA7XG4gIG1hcmdpbjogMCAxNnB4O1xuICAtd2Via2l0LWJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNkY2RmZTY7XG59XG4ub3V0bGluZS1kcmF3ZXJfX2Nsb3NlIHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB6LWluZGV4OiAyO1xuICB0b3A6IDUwJTtcbiAgcmlnaHQ6IDEycHg7XG4gIHdpZHRoOiAyMHB4O1xuICBoZWlnaHQ6IDIwcHg7XG4gIGxpbmUtaGVpZ2h0OiAyMHB4O1xuICBjb2xvcjogIzk5OTtcbiAgZm9udC1zaXplOiAyMHB4O1xuICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gIGN1cnNvcjogcG9pbnRlcjtcbiAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTUwJSk7XG4gICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC01MCUpO1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLm91dGxpbmUtZHJhd2VyX19jbG9zZSAub3V0bGluZS1pY29uIHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB6LWluZGV4OiAyO1xuICB0b3A6IDA7XG4gIGxlZnQ6IDA7XG59XG4ub3V0bGluZS1kcmF3ZXJfX2Nsb3NlOmhvdmVyIHtcbiAgY29sb3I6ICM2NjY7XG59XG4ub3V0bGluZS1kcmF3ZXJfX21haW4ge1xuICAtd2Via2l0LWJveC1mbGV4OiAxO1xuICAgICAgLW1zLWZsZXg6IDE7XG4gICAgICAgICAgZmxleDogMTtcbiAgb3ZlcmZsb3c6IGF1dG87XG59XG4ub3V0bGluZS1kcmF3ZXJfX21haW4ub3ZlcmZsb3ctaGlkZGVuIHtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi5vdXRsaW5lLWRyYXdlcl9fZm9vdGVyIHtcbiAgbWFyZ2luOiAwIGF1dG87XG4gIHRleHQtYWxpZ246IHJpZ2h0O1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLm91dGxpbmUtZHJhd2VyX19vdmVybGF5IHtcbiAgY29udGVudDogJyc7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgei1pbmRleDogMTtcbiAgdG9wOiAwO1xuICBsZWZ0OiAwO1xuICB3aWR0aDogMTAwJTtcbiAgaGVpZ2h0OiAxMDAlO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmO1xuICBvcGFjaXR5OiAwLjE7XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4ub3V0bGluZS1kcmF3ZXJfcnRsLm91dGxpbmUtZHJhd2VyX3RpbnksXG4ub3V0bGluZS1kcmF3ZXJfbHRyLm91dGxpbmUtZHJhd2VyX3Rpbnkge1xuICB3aWR0aDogMjgwcHg7XG59XG4ub3V0bGluZS1kcmF3ZXJfcnRsLm91dGxpbmUtZHJhd2VyX21pbmksXG4ub3V0bGluZS1kcmF3ZXJfbHRyLm91dGxpbmUtZHJhd2VyX21pbmkge1xuICB3aWR0aDogNDgwcHg7XG59XG4ub3V0bGluZS1kcmF3ZXJfcnRsLm91dGxpbmUtZHJhd2VyX3NtYWxsLFxuLm91dGxpbmUtZHJhd2VyX2x0ci5vdXRsaW5lLWRyYXdlcl9zbWFsbCB7XG4gIHdpZHRoOiA1NDBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl9ydGwub3V0bGluZS1kcmF3ZXJfcmVndWxhcixcbi5vdXRsaW5lLWRyYXdlcl9sdHIub3V0bGluZS1kcmF3ZXJfcmVndWxhciB7XG4gIHdpZHRoOiA2ODBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl9ydGwub3V0bGluZS1kcmF3ZXJfbWVkaXVtLFxuLm91dGxpbmUtZHJhd2VyX2x0ci5vdXRsaW5lLWRyYXdlcl9tZWRpdW0ge1xuICB3aWR0aDogNzIwcHg7XG59XG4ub3V0bGluZS1kcmF3ZXJfcnRsLm91dGxpbmUtZHJhd2VyX2xhcmdlLFxuLm91dGxpbmUtZHJhd2VyX2x0ci5vdXRsaW5lLWRyYXdlcl9sYXJnZSB7XG4gIHdpZHRoOiA5NjBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl9ydGwge1xuICBib3JkZXItbGVmdDogMXB4IHNvbGlkICNkY2RmZTY7XG59XG4ub3V0bGluZS1kcmF3ZXJfcnRsLm91dGxpbmUtZHJhd2VyX3Rpbnkub3V0bGluZS1kcmF3ZXJfY2xvc2VkIHtcbiAgcmlnaHQ6IC0yOTBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl9ydGwub3V0bGluZS1kcmF3ZXJfbWluaS5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xuICByaWdodDogLTQ5MHB4O1xufVxuLm91dGxpbmUtZHJhd2VyX3J0bC5vdXRsaW5lLWRyYXdlcl9zbWFsbC5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xuICByaWdodDogLTU1MHB4O1xufVxuLm91dGxpbmUtZHJhd2VyX3J0bC5vdXRsaW5lLWRyYXdlcl9yZWd1bGFyLm91dGxpbmUtZHJhd2VyX2Nsb3NlZCB7XG4gIHJpZ2h0OiAtNjkwcHg7XG59XG4ub3V0bGluZS1kcmF3ZXJfcnRsLm91dGxpbmUtZHJhd2VyX21lZGl1bS5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xuICByaWdodDogLTczMHB4O1xufVxuLm91dGxpbmUtZHJhd2VyX3J0bC5vdXRsaW5lLWRyYXdlcl9sYXJnZS5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xuICByaWdodDogLTk3MHB4O1xufVxuLm91dGxpbmUtZHJhd2VyX2x0ciB7XG4gIGJvcmRlci1yaWdodDogMXB4IHNvbGlkICNkY2RmZTY7XG59XG4ub3V0bGluZS1kcmF3ZXJfbHRyLm91dGxpbmUtZHJhd2VyX3Rpbnkub3V0bGluZS1kcmF3ZXJfY2xvc2VkIHtcbiAgbGVmdDogLTI5MHB4O1xufVxuLm91dGxpbmUtZHJhd2VyX2x0ci5vdXRsaW5lLWRyYXdlcl9taW5pLm91dGxpbmUtZHJhd2VyX2Nsb3NlZCB7XG4gIGxlZnQ6IC00OTBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl9sdHIub3V0bGluZS1kcmF3ZXJfc21hbGwub3V0bGluZS1kcmF3ZXJfY2xvc2VkIHtcbiAgbGVmdDogLTU1MHB4O1xufVxuLm91dGxpbmUtZHJhd2VyX2x0ci5vdXRsaW5lLWRyYXdlcl9yZWd1bGFyLm91dGxpbmUtZHJhd2VyX2Nsb3NlZCB7XG4gIGxlZnQ6IC02OTBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl9sdHIub3V0bGluZS1kcmF3ZXJfbWVkaXVtLm91dGxpbmUtZHJhd2VyX2Nsb3NlZCB7XG4gIGxlZnQ6IC03MzBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl9sdHIub3V0bGluZS1kcmF3ZXJfbGFyZ2Uub3V0bGluZS1kcmF3ZXJfY2xvc2VkIHtcbiAgbGVmdDogLTk3MHB4O1xufVxuLm91dGxpbmUtZHJhd2VyX3R0Yixcbi5vdXRsaW5lLWRyYXdlcl9idHQge1xuICBsZWZ0OiAwO1xuICB3aWR0aDogMTAwJTtcbn1cbi5vdXRsaW5lLWRyYXdlcl90dGIub3V0bGluZS1kcmF3ZXJfdGlueSxcbi5vdXRsaW5lLWRyYXdlcl9idHQub3V0bGluZS1kcmF3ZXJfdGlueSB7XG4gIGhlaWdodDogMjQwcHg7XG59XG4ub3V0bGluZS1kcmF3ZXJfdHRiLm91dGxpbmUtZHJhd2VyX21pbmksXG4ub3V0bGluZS1kcmF3ZXJfYnR0Lm91dGxpbmUtZHJhd2VyX21pbmkge1xuICBoZWlnaHQ6IDMyMHB4O1xufVxuLm91dGxpbmUtZHJhd2VyX3R0Yi5vdXRsaW5lLWRyYXdlcl9zbWFsbCxcbi5vdXRsaW5lLWRyYXdlcl9idHQub3V0bGluZS1kcmF3ZXJfc21hbGwge1xuICBoZWlnaHQ6IDM2MHB4O1xufVxuLm91dGxpbmUtZHJhd2VyX3R0Yi5vdXRsaW5lLWRyYXdlcl9yZWd1bGFyLFxuLm91dGxpbmUtZHJhd2VyX2J0dC5vdXRsaW5lLWRyYXdlcl9yZWd1bGFyIHtcbiAgaGVpZ2h0OiA0MDBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl90dGIub3V0bGluZS1kcmF3ZXJfbWVkaXVtLFxuLm91dGxpbmUtZHJhd2VyX2J0dC5vdXRsaW5lLWRyYXdlcl9tZWRpdW0ge1xuICBoZWlnaHQ6IDQ0MHB4O1xufVxuLm91dGxpbmUtZHJhd2VyX3R0Yi5vdXRsaW5lLWRyYXdlcl9sYXJnZSxcbi5vdXRsaW5lLWRyYXdlcl9idHQub3V0bGluZS1kcmF3ZXJfbGFyZ2Uge1xuICBoZWlnaHQ6IDQ4MHB4O1xufVxuLm91dGxpbmUtZHJhd2VyX3R0YiB7XG4gIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjZGNkZmU2O1xufVxuLm91dGxpbmUtZHJhd2VyX3R0Yi5vdXRsaW5lLWRyYXdlcl90aW55Lm91dGxpbmUtZHJhd2VyX2Nsb3NlZCB7XG4gIHRvcDogLTI1MHB4O1xufVxuLm91dGxpbmUtZHJhd2VyX3R0Yi5vdXRsaW5lLWRyYXdlcl9taW5pLm91dGxpbmUtZHJhd2VyX2Nsb3NlZCB7XG4gIHRvcDogLTMzMHB4O1xufVxuLm91dGxpbmUtZHJhd2VyX3R0Yi5vdXRsaW5lLWRyYXdlcl9zbWFsbC5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xuICB0b3A6IC0zNzBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl90dGIub3V0bGluZS1kcmF3ZXJfcmVndWxhci5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xuICB0b3A6IC00MTBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl90dGIub3V0bGluZS1kcmF3ZXJfbWVkaXVtLm91dGxpbmUtZHJhd2VyX2Nsb3NlZCB7XG4gIHRvcDogLTQ1MHB4O1xufVxuLm91dGxpbmUtZHJhd2VyX3R0Yi5vdXRsaW5lLWRyYXdlcl9sYXJnZS5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xuICB0b3A6IC00OTBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl9idHQge1xuICB0b3A6IGluaXRpYWw7XG4gIGJvcmRlci10b3A6IDFweCBzb2xpZCAjZGNkZmU2O1xufVxuLm91dGxpbmUtZHJhd2VyX2J0dC5vdXRsaW5lLWRyYXdlcl90aW55Lm91dGxpbmUtZHJhd2VyX2Nsb3NlZCB7XG4gIGJvdHRvbTogLTI1MHB4O1xufVxuLm91dGxpbmUtZHJhd2VyX2J0dC5vdXRsaW5lLWRyYXdlcl9taW5pLm91dGxpbmUtZHJhd2VyX2Nsb3NlZCB7XG4gIGJvdHRvbTogLTMzMHB4O1xufVxuLm91dGxpbmUtZHJhd2VyX2J0dC5vdXRsaW5lLWRyYXdlcl9zbWFsbC5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xuICBib3R0b206IC0zNzBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl9idHQub3V0bGluZS1kcmF3ZXJfcmVndWxhci5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xuICBib3R0b206IC00MTBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl9idHQub3V0bGluZS1kcmF3ZXJfbWVkaXVtLm91dGxpbmUtZHJhd2VyX2Nsb3NlZCB7XG4gIGJvdHRvbTogLTQ1MHB4O1xufVxuLm91dGxpbmUtZHJhd2VyX2J0dC5vdXRsaW5lLWRyYXdlcl9sYXJnZS5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xuICBib3R0b206IC00OTBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl9vcGVuZWQge1xuICB2aXNpYmlsaXR5OiB2aXNpYmxlO1xuICB6LWluZGV4OiB2YXIoLS1vdXRsaW5lLXpJbmRleCk7XG59XG4ub3V0bGluZS1kcmF3ZXJfb3BlbmVkLm91dGxpbmUtZHJhd2VyIHtcbiAgcG9zaXRpb246IGZpeGVkO1xufVxuLm91dGxpbmUtZHJhd2VyX29wZW5lZC5vdXRsaW5lLWRyYXdlcl9ydGwge1xuICByaWdodDogMDtcbn1cbi5vdXRsaW5lLWRyYXdlcl9vcGVuZWQub3V0bGluZS1kcmF3ZXJfbHRyIHtcbiAgbGVmdDogMDtcbn1cbi5vdXRsaW5lLWRyYXdlcl9vcGVuZWQub3V0bGluZS1kcmF3ZXJfdHRiIHtcbiAgdG9wOiAwO1xufVxuLm91dGxpbmUtZHJhd2VyX29wZW5lZC5vdXRsaW5lLWRyYXdlcl9idHQge1xuICBib3R0b206IDA7XG59XG4ub3V0bGluZS1kcmF3ZXJfb2Zmc2V0Lm91dGxpbmUtZHJhd2VyX3J0bCxcbi5vdXRsaW5lLWRyYXdlcl9vZmZzZXQub3V0bGluZS1kcmF3ZXJfbHRyIHtcbiAgaGVpZ2h0OiBjYWxjKDEwMCUgLSA0ZW0pO1xuICB0b3A6IDUwJTtcbiAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTUwJSk7XG4gICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC01MCUpO1xufVxuLm91dGxpbmUtZHJhd2VyX29mZnNldC5vdXRsaW5lLWRyYXdlcl90dGIsXG4ub3V0bGluZS1kcmF3ZXJfb2Zmc2V0Lm91dGxpbmUtZHJhd2VyX2J0dCB7XG4gIHdpZHRoOiBjYWxjKDEwMCUgLSA0ZW0pO1xuICBsZWZ0OiA1MCU7XG4gIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC01MCUpO1xuICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgtNTAlKTtcbn1cbi5vdXRsaW5lLWRyYXdlcl9vZmZzZXQub3V0bGluZS1kcmF3ZXJfb3BlbmVkLm91dGxpbmUtZHJhd2VyX3J0bCB7XG4gIHJpZ2h0OiAyZW07XG59XG4ub3V0bGluZS1kcmF3ZXJfb2Zmc2V0Lm91dGxpbmUtZHJhd2VyX29wZW5lZC5vdXRsaW5lLWRyYXdlcl9sdHIge1xuICBsZWZ0OiAyZW07XG59XG4ub3V0bGluZS1kcmF3ZXJfb2Zmc2V0Lm91dGxpbmUtZHJhd2VyX29wZW5lZC5vdXRsaW5lLWRyYXdlcl90dGIge1xuICB0b3A6IDJlbTtcbn1cbi5vdXRsaW5lLWRyYXdlcl9vZmZzZXQub3V0bGluZS1kcmF3ZXJfb3BlbmVkLm91dGxpbmUtZHJhd2VyX2J0dCB7XG4gIGJvdHRvbTogMmVtO1xufVxuLm91dGxpbmUtZHJhd2VyX2F1dG8ub3V0bGluZS1kcmF3ZXJfcnRsLFxuLm91dGxpbmUtZHJhd2VyX2F1dG8ub3V0bGluZS1kcmF3ZXJfbHRyIHtcbiAgaGVpZ2h0OiBhdXRvO1xuICBtYXgtaGVpZ2h0OiBjYWxjKDEwMCUgLSA0ZW0pO1xufVxuLm91dGxpbmUtZHJhd2VyX2Z1bGwge1xuICBwYWRkaW5nOiAwO1xufVxuLm91dGxpbmUtbmF2aWdhdG9yIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICB6LWluZGV4OiAxO1xuICBtYXJnaW46IDA7XG4gIHdpZHRoOiB2YXIoLS1vdXRsaW5lLW5hdmlnYXRvci13aWR0aCk7XG4gIG92ZXJmbG93OiBhdXRvO1xufVxuLm91dGxpbmUtbmF2aWdhdG9yLXBhcmVudCB7XG4gIC13ZWJraXQtdHJhbnNpdGlvbjogMC4zcyBlYXNlLWluLW91dDtcbiAgdHJhbnNpdGlvbjogMC4zcyBlYXNlLWluLW91dDtcbn1cbi5vdXRsaW5lLW5hdmlnYXRvcl9fdGl0bGUge1xuICBtYXJnaW46IDAgMTZweDtcbiAgaGVpZ2h0OiA0MHB4O1xuICBsaW5lLWhlaWdodDogNDBweDtcbiAgcGFkZGluZzogMCAxNnB4O1xuICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI2RjZGZlNjtcbiAgZm9udC1zaXplOiAxNnB4O1xuICBmb250LXdlaWdodDogNDAwO1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLm91dGxpbmUtbmF2aWdhdG9yX19tYWluIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICB6LWluZGV4OiAxO1xuICBtYXJnaW46IDA7XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4ub3V0bGluZS1uYXZpZ2F0b3JfX2xpc3QsXG4ub3V0bGluZS1uYXZpZ2F0b3JfX3N1YmplY3QsXG4ub3V0bGluZS1uYXZpZ2F0b3JfX2l0ZW0ge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIHotaW5kZXg6IDI7XG4gIG1hcmdpbjogMDtcbiAgcGFkZGluZzogMDtcbiAgbGlzdC1zdHlsZS10eXBlOiBub25lO1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLm91dGxpbmUtbmF2aWdhdG9yX19saXN0IHtcbiAgcGFkZGluZzogMC41ZW0gMDtcbn1cbi5vdXRsaW5lLW5hdmlnYXRvcl9fc3ViamVjdCB7XG4gIHBhZGRpbmctbGVmdDogMWVtO1xufVxuLm91dGxpbmUtbmF2aWdhdG9yX19pdGVtIHtcbiAgbWFyZ2luOiAwO1xuICBsaW5lLWhlaWdodDogMzBweDtcbiAgZm9udC1zaXplOiAxM3B4O1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLm91dGxpbmUtbmF2aWdhdG9yX19wbGFjZWhvbGRlciB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgei1pbmRleDogMTtcbiAgdG9wOiAwO1xuICBsZWZ0OiAwO1xuICB3aWR0aDogMTAwJTtcbiAgaGVpZ2h0OiAzMHB4O1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjdmOGY5O1xuICBib3JkZXItbGVmdDogMnB4IHNvbGlkICMwNTg5NDI7XG4gIC13ZWJraXQtdHJhbnNpdGlvbi1kdXJhdGlvbjogMC4ycztcbiAgICAgICAgICB0cmFuc2l0aW9uLWR1cmF0aW9uOiAwLjJzO1xuICAtd2Via2l0LWJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi5vdXRsaW5lLW5hdmlnYXRvcl9fYW5jaG9yIHtcbiAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbiAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7XG4gIG92ZXJmbG93OiBoaWRkZW47XG4gIGRpc3BsYXk6IGJsb2NrO1xuICBwYWRkaW5nOiAwIDEuNWVtO1xufVxuLm91dGxpbmUtbmF2aWdhdG9yX19hbmNob3I6bGluayxcbi5vdXRsaW5lLW5hdmlnYXRvcl9fYW5jaG9yOnZpc2l0ZWQsXG4ub3V0bGluZS1uYXZpZ2F0b3JfX2FuY2hvcjpob3ZlciB7XG4gIHRleHQtZGVjb3JhdGlvbjogbm9uZTtcbiAgY29sb3I6ICM1NTU7XG59XG4ub3V0bGluZS1uYXZpZ2F0b3JfX2FuY2hvcjpob3ZlciB7XG4gIGNvbG9yOiAjMDU4OTQyO1xufVxuLm91dGxpbmUtbmF2aWdhdG9yX19jb2RlIHtcbiAgcGFkZGluZy1yaWdodDogMC41ZW07XG59XG4ub3V0bGluZS1uYXZpZ2F0b3JfaGlnaGxpZ2h0Lm91dGxpbmUtbmF2aWdhdG9yX19hbmNob3I6bGluayxcbi5vdXRsaW5lLW5hdmlnYXRvcl9oaWdobGlnaHQub3V0bGluZS1uYXZpZ2F0b3JfX2FuY2hvcjp2aXNpdGVkLFxuLm91dGxpbmUtbmF2aWdhdG9yX2hpZ2hsaWdodC5vdXRsaW5lLW5hdmlnYXRvcl9fYW5jaG9yOmhvdmVyIHtcbiAgY29sb3I6ICMwNTg5NDI7XG4gIGZvbnQtd2VpZ2h0OiBib2xkO1xufVxuLm91dGxpbmUtbmF2aWdhdG9yX3N0aWNreSxcbi5vdXRsaW5lLW5hdmlnYXRvcl9maXhlZCB7XG4gIGRpc3BsYXk6IC13ZWJraXQtYm94O1xuICBkaXNwbGF5OiAtbXMtZmxleGJveDtcbiAgZGlzcGxheTogZmxleDtcbiAgLW1zLWZsZXgtd3JhcDogbm93cmFwO1xuICAgICAgZmxleC13cmFwOiBub3dyYXA7XG4gIC13ZWJraXQtYm94LW9yaWVudDogdmVydGljYWw7XG4gIC13ZWJraXQtYm94LWRpcmVjdGlvbjogbm9ybWFsO1xuICAgICAgLW1zLWZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgei1pbmRleDogdmFyKC0tb3V0bGluZS16SW5kZXgpO1xuICB0b3A6IDA7XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4ub3V0bGluZS1uYXZpZ2F0b3Jfc3RpY2t5IC5vdXRsaW5lLW5hdmlnYXRvcl9fdGl0bGUsXG4ub3V0bGluZS1uYXZpZ2F0b3JfZml4ZWQgLm91dGxpbmUtbmF2aWdhdG9yX190aXRsZSxcbi5vdXRsaW5lLW5hdmlnYXRvcl9zdGlja3kgLm91dGxpbmUtbmF2aWdhdG9yX19tYWluLFxuLm91dGxpbmUtbmF2aWdhdG9yX2ZpeGVkIC5vdXRsaW5lLW5hdmlnYXRvcl9fbWFpbiB7XG4gIC13ZWJraXQtYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xufVxuLm91dGxpbmUtbmF2aWdhdG9yX3N0aWNreSAub3V0bGluZS1uYXZpZ2F0b3JfX3RpdGxlLFxuLm91dGxpbmUtbmF2aWdhdG9yX2ZpeGVkIC5vdXRsaW5lLW5hdmlnYXRvcl9fdGl0bGUge1xuICAtbXMtZmxleC1uZWdhdGl2ZTogMDtcbiAgICAgIGZsZXgtc2hyaW5rOiAwO1xufVxuLm91dGxpbmUtbmF2aWdhdG9yX3N0aWNreSAub3V0bGluZS1uYXZpZ2F0b3JfX21haW4sXG4ub3V0bGluZS1uYXZpZ2F0b3JfZml4ZWQgLm91dGxpbmUtbmF2aWdhdG9yX19tYWluIHtcbiAgLXdlYmtpdC1ib3gtZmxleDogMTtcbiAgICAgIC1tcy1mbGV4OiAxO1xuICAgICAgICAgIGZsZXg6IDE7XG4gIG92ZXJmbG93OiBhdXRvO1xufVxuLm91dGxpbmUtbmF2aWdhdG9yX3N0aWNreSB7XG4gIHBvc2l0aW9uOiBzdGlja3k7XG4gIG1heC1oZWlnaHQ6IHZhcigtLW91dGxpbmUtc3RpY2t5LWhlaWdodCk7XG59XG4ub3V0bGluZS1uYXZpZ2F0b3JfZml4ZWQge1xuICBwb3NpdGlvbjogZml4ZWQ7XG4gIG1heC1oZWlnaHQ6IDEwMCU7XG59XG4ub3V0bGluZS1uYXZpZ2F0b3JfaGlkZGVuIHtcbiAgZGlzcGxheTogbm9uZTtcbn1cbi5vdXRsaW5lLW5hdmlnYXRvcl9mb2xkZWQge1xuICB3aWR0aDogMDtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi8qKlxuICogZm9udC5sZXNzIC0g5a2X5L2T55u45YWz5qC35byPXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBDcmVhdGVkIEJ5OiBZYW9oYWl4aWFvXG4gKiBVcGRhdGU6IDIwMjIuMy4xNlxuICovXG4vKiA9PT09PT0g5a2X5L2TID09PT09PSAqL1xuLyogPT09PT09IOWtl+mHjSA9PT09PT0gKi9cbi8qID09PT09PSDlrZflj7cgPT09PT09ICovXG4vKipcbiAqIG1peGlucy5sZXNzIC0g5bel5YW35Ye95pWwXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBDcmVhdGVkIEJ5OiBZYW9oYWl4aWFvXG4gKiBVcGRhdGU6IDIwMjIuMy4xMVxuICovXG4vKipcbiAqIHJhZGl1cy5sZXNzIC0g5ZyG6KeS6K6+572uIG1peGlueCDlh73mlbBcbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIENyZWF0ZWQgQnk6IFlhb2hhaXhpYW9cbiAqIFVwZGF0ZTogMjAyNC40LjE2XG4gKi9cbi8qID09PT09PSDlnIbop5LmoLflvI/orr7nva7lh73mlbAgPT09PT09ICovXG4ub3V0bGluZS1yZWFkZXJfX3Byb2dyZXNzIHtcbiAgcG9zaXRpb246IGZpeGVkO1xuICB0b3A6IDA7XG4gIGxlZnQ6IDA7XG4gIHotaW5kZXg6IDM7XG4gIGhlaWdodDogNHB4O1xuICB3aWR0aDogMTAwJTtcbiAgYmFja2dyb3VuZC1jb2xvcjogIzUwN2FmZTtcbiAgc2NhbGU6IDAgMTtcbiAgLXdlYmtpdC10cmFuc2Zvcm0tb3JpZ2luOiBsZWZ0O1xuICAgICAgICAgIHRyYW5zZm9ybS1vcmlnaW46IGxlZnQ7XG4gIC13ZWJraXQtYW5pbWF0aW9uOiBvdXRsaW5lLXJlYWRlci1wcm9ncmVzcyBsaW5lYXI7XG4gICAgICAgICAgYW5pbWF0aW9uOiBvdXRsaW5lLXJlYWRlci1wcm9ncmVzcyBsaW5lYXI7XG4gIGFuaW1hdGlvbi10aW1lbGluZTogLS1Qcm9ncmVzc1RpbWVsaW5lO1xufVxuLm91dGxpbmUtcmVhZGVyX19wYXBlciB7XG4gIC13ZWJraXQtYm94LXNoYWRvdzogMCAwIDZweCAxcHggI2RkZDtcbiAgICAgICAgICBib3gtc2hhZG93OiAwIDAgNnB4IDFweCAjZGRkO1xuICBtYXJnaW46IDJlbSBhdXRvO1xuICBtYXgtd2lkdGg6IDEyMDBweDtcbiAgcGFkZGluZzogMy4yZW07XG4gIC13ZWJraXQtYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmO1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLm91dGxpbmUtcmVhZGVyX190aXRsZSB7XG4gIG1hcmdpbjogMC42N2VtIDA7XG4gIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgZm9udC1mYW1pbHk6IC1hcHBsZS1zeXN0ZW0sIEJsaW5rTWFjU3lzdGVtRm9udCwgJ1NlZ29lIFVJJywgJ1BpbmdGYW5nIFNDJywgJ0hpcmFnaW5vIFNhbnMgR0InLCAnTWljcm9zb2Z0IFlhSGVpJywgJ0hlbHZldGljYSBOZXVlJywgJ0FwcGxlIENvbG9yIEVtb2ppJywgJ1NlZ29lIFVJIEVtb2ppJywgJ1NlZ29lIFVJIFN5bWJvbCcsIEhlbHZldGljYSwgQXJpYWwsIHNhbnMtc2VyaWY7XG4gIGZvbnQtd2VpZ2h0OiBub3JtYWw7XG4gIGxpbmUtaGVpZ2h0OiAxLjNlbTtcbiAgZm9udC1zaXplOiA0LjJlbTtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi5vdXRsaW5lLXJlYWRlcl9fYXJ0aWNsZSAub3V0bGluZS1yZWFkZXJfX3Byb2dyZXNzIHtcbiAgZGlzcGxheTogbm9uZTtcbn1cbi5vdXRsaW5lLXJlYWRlcl9oaWRkZW4ge1xuICBkaXNwbGF5OiBub25lO1xufVxuLm91dGxpbmUtcmVhZGVyX2hpZGRlbi5vdXRsaW5lLXJlYWRlcl9zaWJsaW5nIHtcbiAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50O1xufVxuLm91dGxpbmUtcmVhZGVyX2hpZGRlbi5vdXRsaW5lLXJlYWRlcl9zaWJsaW5nLndyYXBwZXIucG9zdCB7XG4gIGRpc3BsYXk6IG5vbmU7XG59XG4ub3V0bGluZS1yZWFkZXItLXJlYWRpbmcge1xuICBkaXNwbGF5OiBibG9jaztcbiAgcG9zaXRpb246IGZpeGVkO1xuICB6LWluZGV4OiAyO1xuICB0b3A6IDA7XG4gIGxlZnQ6IDA7XG4gIHdpZHRoOiAxMDAlO1xuICBoZWlnaHQ6IDEwMCU7XG4gIG1hcmdpbjogMDtcbiAgLXdlYmtpdC1ib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gIHBhZGRpbmc6IDNlbSA0ZW07XG4gIGJhY2tncm91bmQtY29sb3I6ICNmYWZhZmE7XG4gIHNjcm9sbC10aW1lbGluZS1uYW1lOiAtLVByb2dyZXNzVGltZWxpbmU7XG4gIG92ZXJmbG93OiBzY3JvbGw7XG59XG5ALXdlYmtpdC1rZXlmcmFtZXMgb3V0bGluZS1yZWFkZXItcHJvZ3Jlc3Mge1xuICB0byB7XG4gICAgc2NhbGU6IDEgMTtcbiAgfVxufVxuQGtleWZyYW1lcyBvdXRsaW5lLXJlYWRlci1wcm9ncmVzcyB7XG4gIHRvIHtcbiAgICBzY2FsZTogMSAxO1xuICB9XG59XG5AbWVkaWEgKG1heC13aWR0aDogNTAwcHgpIHtcbiAgLm91dGxpbmUtcmVhZGVyIHtcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xuICB9XG4gIC5vdXRsaW5lLXJlYWRlciAub3V0bGluZS10b29sYmFyIHtcbiAgICBkaXNwbGF5OiAtd2Via2l0LWJveDtcbiAgICBkaXNwbGF5OiAtbXMtZmxleGJveDtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIC13ZWJraXQtYm94LW9yaWVudDogaG9yaXpvbnRhbDtcbiAgICAtd2Via2l0LWJveC1kaXJlY3Rpb246IG5vcm1hbDtcbiAgICAgICAgLW1zLWZsZXgtZGlyZWN0aW9uOiByb3c7XG4gICAgICAgICAgICBmbGV4LWRpcmVjdGlvbjogcm93O1xuICAgIC1tcy1mbGV4LXdyYXA6IG5vd3JhcDtcbiAgICAgICAgZmxleC13cmFwOiBub3dyYXA7XG4gICAgLXdlYmtpdC1ib3gtYWxpZ246IGNlbnRlcjtcbiAgICAgICAgLW1zLWZsZXgtYWxpZ246IGNlbnRlcjtcbiAgICAgICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgLW1zLWZsZXgtaXRlbS1hbGlnbjogYXV0bztcbiAgICAgICAgYWxpZ24tc2VsZjogYXV0bztcbiAgICB0b3A6IDEwMCU7XG4gICAgcmlnaHQ6IDA7XG4gICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTQ4cHgpO1xuICAgICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC00OHB4KTtcbiAgICB3aWR0aDogMTAwJTtcbiAgICBoZWlnaHQ6IDQ4cHg7XG4gICAgLXdlYmtpdC1ib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgICAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICBib3JkZXItdG9wOiAxcHggc29saWQgI2RkZDtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmO1xuICAgIHBhZGRpbmc6IDAgMTZweDtcbiAgfVxuICAub3V0bGluZS1yZWFkZXIgLm91dGxpbmUtdG9vbGJhcl9fYnV0dG9uIHtcbiAgICBib3JkZXItcmFkaXVzOiAwO1xuICAgIC13ZWJraXQtYm94LWZsZXg6IDE7XG4gICAgICAgIC1tcy1mbGV4OiAxO1xuICAgICAgICAgICAgZmxleDogMTtcbiAgICBib3JkZXI6IG5vbmU7XG4gICAgLXdlYmtpdC1ib3gtc2hhZG93OiBub25lO1xuICAgICAgICAgICAgYm94LXNoYWRvdzogbm9uZTtcbiAgfVxuICAub3V0bGluZS1yZWFkZXItLXJlYWRpbmcge1xuICAgIHBhZGRpbmc6IDA7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjtcbiAgICAtd2Via2l0LWJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICB9XG4gIC5vdXRsaW5lLXJlYWRlcl9fcGFwZXIge1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICB6LWluZGV4OiAxO1xuICAgIG1hcmdpbjogMDtcbiAgICBwYWRkaW5nOiAwO1xuICAgIGhlaWdodDogMTAwJTtcbiAgICAtd2Via2l0LWJveC1zaGFkb3c6IG5vbmU7XG4gICAgICAgICAgICBib3gtc2hhZG93OiBub25lO1xuICAgIG92ZXJmbG93OiBoaWRkZW47XG4gIH1cbiAgLm91dGxpbmUtcmVhZGVyX190aXRsZSB7XG4gICAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpcztcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgei1pbmRleDogMztcbiAgICB0b3A6IDA7XG4gICAgbGVmdDogMDtcbiAgICBtYXJnaW46IDA7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgaGVpZ2h0OiA0OHB4O1xuICAgIGxpbmUtaGVpZ2h0OiA0OHB4O1xuICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjZGRkO1xuICAgIGZvbnQtc2l6ZTogMS44ZW07XG4gICAgZm9udC13ZWlnaHQ6IDQwMDtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmO1xuICAgIG92ZXJmbG93OiBoaWRkZW47XG4gIH1cbiAgLm91dGxpbmUtcmVhZGVyX19hcnRpY2xlIHtcbiAgICBtYXJnaW46IDQ4cHggMDtcbiAgICBoZWlnaHQ6IGNhbGMoMTAwJSAtIDk2cHgpO1xuICAgIHBhZGRpbmc6IDAgMS4yNWVtO1xuICAgIHNjcm9sbC10aW1lbGluZS1uYW1lOiAtLU1vYmlsZVByb2dyZXNzVGltZWxpbmU7XG4gICAgb3ZlcmZsb3cteDogaGlkZGVuO1xuICAgIG92ZXJmbG93LXk6IHNjcm9sbDtcbiAgfVxuICAub3V0bGluZS1yZWFkZXJfX2FydGljbGUgLm91dGxpbmUtcmVhZGVyX19wcm9ncmVzcyB7XG4gICAgei1pbmRleDogNDtcbiAgICAtd2Via2l0LWFuaW1hdGlvbjogb3V0bGluZS1yZWFkZXItcHJvZ3Jlc3MgbGluZWFyO1xuICAgICAgICAgICAgYW5pbWF0aW9uOiBvdXRsaW5lLXJlYWRlci1wcm9ncmVzcyBsaW5lYXI7XG4gICAgYW5pbWF0aW9uLXRpbWVsaW5lOiAtLU1vYmlsZVByb2dyZXNzVGltZWxpbmU7XG4gICAgZGlzcGxheTogYmxvY2s7XG4gIH1cbn1cbkBtZWRpYSBwcmludCB7XG4gIGh0bWwsXG4gIGJvZHkge1xuICAgIC8qIOaJk+WNsOeahOWfuuehgOWtl+S9k+Wkp+WwjyAqL1xuICAgIGZvbnQtc2l6ZTogMTJwdDtcbiAgICAvKiDmmL7npLrorr7nva7mloflrZfpopzoibLlkozog4zmma/popzoibIgKi9cbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmO1xuICAgIGNvbG9yOiAjMzMzO1xuICAgIGhlaWdodDogaW5pdGlhbCAhaW1wb3J0YW50O1xuICB9XG4gIC8qIOiuvue9rumTvuaOpeagt+W8jyAqL1xuICBhOmxpbmssXG4gIGE6dmlzaXRlZCxcbiAgYTpob3ZlciB7XG4gICAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmUgIWltcG9ydGFudDtcbiAgICBjb2xvcjogIzUwN2FmZTtcbiAgfVxuICAvKiDpmpDol4/lqpLkvZPmoIfnrb4gKi9cbiAgdmlkZW8sXG4gIGF1ZGlvIHtcbiAgICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7XG4gIH1cbiAgLyog56Gu5L+d6KGo5qC85Zyo5omT5Y2w5pe255qE6L655qGG5ZKM5a+56b2Q5pa55byP5riF5pmwICovXG4gIHRhYmxlIHtcbiAgICB3aWR0aDogMTAwJTtcbiAgICBib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlO1xuICB9XG4gIHRoLFxuICB0ZCB7XG4gICAgYm9yZGVyOiAxcHggc29saWQgI2RjZGZlNjtcbiAgICBwYWRkaW5nOiA4cHggMjBweDtcbiAgfVxuICAub3V0bGluZS1tZXNzYWdlLFxuICAub3V0bGluZS10b29sYmFyIHtcbiAgICAvKiDpmpDol4/kuoblt6XlhbfmoI/lkozkv6Hmga/mj5DnpLrmoYYgKi9cbiAgICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7XG4gIH1cbiAgLm91dGxpbmUtcmVhZGVyIHtcbiAgICBkaXNwbGF5OiBibG9jayAhaW1wb3J0YW50O1xuICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgLyog5Y+W5raI5LqG57ud5a+55a6a5L2NICovXG4gICAgLyog6ZqQ6JeP6ZiF6K+76L+b5bqm5p2hICovXG4gICAgLyog5omT5Y2w5pe25LiN5pi+56S65q2j5paHIERPTSDnmoTpmLTlvbHmlYjmnpwgKi9cbiAgICAvKiDmiYDmnInmlofnq6DlhoXlrrkgRE9NIOebuOWFs+eahOmCu+WxheiKgueCuemDvemakOiXj+S6hiAqL1xuICB9XG4gIC5vdXRsaW5lLXJlYWRlcl9fdGl0bGUge1xuICAgIG1hcmdpbjogMTMuNHB0IDAgMjhwdCAhaW1wb3J0YW50O1xuICAgIHRleHQtYWxpZ246IGNlbnRlciAhaW1wb3J0YW50O1xuICAgIGZvbnQtc2l6ZTogMzJwdCAhaW1wb3J0YW50O1xuICB9XG4gIC5vdXRsaW5lLXJlYWRlci0tcmVhZGluZyB7XG4gICAgcG9zaXRpb246IHJlbGF0aXZlICFpbXBvcnRhbnQ7XG4gICAgaGVpZ2h0OiBhdXRvICFpbXBvcnRhbnQ7XG4gICAgcGFkZGluZzogMCAhaW1wb3J0YW50O1xuICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmY7XG4gICAgb3ZlcmZsb3c6IGhpZGRlbiAhaW1wb3J0YW50O1xuICB9XG4gIC5vdXRsaW5lLXJlYWRlcl9fcHJvZ3Jlc3Mge1xuICAgIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDtcbiAgfVxuICAub3V0bGluZS1yZWFkZXJfX3BhcGVyIHtcbiAgICAtd2Via2l0LWJveC1zaGFkb3c6IG5vbmU7XG4gICAgICAgICAgICBib3gtc2hhZG93OiBub25lO1xuICB9XG4gIC5vdXRsaW5lLXJlYWRlciBwcmUge1xuICAgIHBhZGRpbmc6IDFlbSAhaW1wb3J0YW50O1xuICAgIGJvcmRlcjogMXB4IHNvbGlkICNkZGQgIWltcG9ydGFudDtcbiAgICBib3JkZXItcmFkaXVzOiA0cHggIWltcG9ydGFudDtcbiAgfVxuICAub3V0bGluZS1yZWFkZXIgcHJlLFxuICAub3V0bGluZS1yZWFkZXIgY29kZSB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZiAhaW1wb3J0YW50O1xuICB9XG4gIC5vdXRsaW5lLXJlYWRlciB0YWJsZSxcbiAgLm91dGxpbmUtcmVhZGVyIGltZyxcbiAgLm91dGxpbmUtcmVhZGVyIHN2ZyB7XG4gICAgLXdlYmtpdC1jb2x1bW4tYnJlYWstaW5zaWRlOiBhdm9pZDtcbiAgICAgICAtbW96LWNvbHVtbi1icmVhay1pbnNpZGU6IGF2b2lkO1xuICAgICAgICAgICAgYnJlYWstaW5zaWRlOiBhdm9pZDtcbiAgfVxuICAub3V0bGluZS1yZWFkZXJfc2libGluZyB7XG4gICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50O1xuICB9XG59XG4vKiA9PT09PT09PT09IGJ1dHRvbnMudGhlbWUgLSDmjInpkq7lr7zoiKrmoLflvI8gPT09PT09PT09PSAqL1xuLm91dGxpbmUtdG9vbGJhciB7XG4gIHBvc2l0aW9uOiBmaXhlZDtcbiAgei1pbmRleDogOTk5OTk7XG4gIG1hcmdpbjogMDtcbiAgLXdlYmtpdC10cmFuc2l0aW9uLWR1cmF0aW9uOiAwLjNzO1xuICAgICAgICAgIHRyYW5zaXRpb24tZHVyYXRpb246IDAuM3M7XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4ub3V0bGluZS10b29sYmFyX19idXR0b24ge1xuICAtd2Via2l0LWJveC1zaGFkb3c6IDAgMCA2cHggMXB4ICNkY2RmZTY7XG4gICAgICAgICAgYm94LXNoYWRvdzogMCAwIDZweCAxcHggI2RjZGZlNjtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICB6LWluZGV4OiAxO1xuICBtYXJnaW46IDEwcHg7XG4gIHdpZHRoOiAzNnB4O1xuICBoZWlnaHQ6IDM2cHg7XG4gIGJvcmRlcjogMXB4IHNvbGlkICNkY2RmZTY7XG4gIGJvcmRlci1yYWRpdXM6IDNweDtcbiAgLXdlYmtpdC1ib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gIGJhY2tncm91bmQtY29sb3I6ICNmZmY7XG4gIGN1cnNvcjogcG9pbnRlcjtcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xuICBjb2xvcjogIzk5OTtcbiAgLXdlYmtpdC10cmFuc2l0aW9uOiBhbGwgMC4zcyAwLjFzIGVhc2UtaW4tb3V0O1xuICB0cmFuc2l0aW9uOiBhbGwgMC4zcyAwLjFzIGVhc2UtaW4tb3V0O1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLm91dGxpbmUtdG9vbGJhcl9fYnV0dG9uOmhvdmVyIHtcbiAgY29sb3I6ICMwNTg5NDI7XG4gIGJvcmRlci1jb2xvcjogIzA1ODk0MjtcbiAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlKDEuMzUpO1xuICAgICAgICAgIHRyYW5zZm9ybTogc2NhbGUoMS4zNSk7XG59XG4ub3V0bGluZS10b29sYmFyX19idXR0b24uaGlkZSB7XG4gIGRpc3BsYXk6IG5vbmU7XG59XG4ub3V0bGluZS10b29sYmFyX19hbmNob3I6bGluayxcbi5vdXRsaW5lLXRvb2xiYXJfX2FuY2hvcjp2aXNpdGVkLFxuLm91dGxpbmUtdG9vbGJhcl9fYW5jaG9yOmhvdmVyIHtcbiAgY29sb3I6ICM5OTk7XG4gIHRleHQtZGVjb3JhdGlvbjogbm9uZTtcbn1cbi5vdXRsaW5lLXRvb2xiYXJfX2FuY2hvcjpob3ZlciB7XG4gIGNvbG9yOiAjMDU4OTQyO1xufVxuLm91dGxpbmUtdG9vbGJhcl9faWNvbiB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgei1pbmRleDogMjtcbiAgdG9wOiA1MCU7XG4gIGxlZnQ6IDUwJTtcbiAgd2lkdGg6IDIwcHg7XG4gIGhlaWdodDogMjBweDtcbiAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCAtNTAlKTtcbiAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCAtNTAlKTtcbiAgZmlsbDogY3VycmVudGNvbG9yO1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLm91dGxpbmUtdG9vbGJhcl9hY3RpdmUub3V0bGluZS10b29sYmFyX19idXR0b24ge1xuICBjb2xvcjogI2ZmZjtcbiAgYmFja2dyb3VuZC1jb2xvcjogIzA1ODk0MjtcbiAgYm9yZGVyLWNvbG9yOiAjMDU4OTQyO1xufVxuLm91dGxpbmUtdG9vbGJhcl9hY3RpdmUub3V0bGluZS10b29sYmFyX19idXR0b246aG92ZXIge1xuICBjb2xvcjogI2ZmZjtcbn1cbi5vdXRsaW5lLXRvb2xiYXJfYWN0aXZlIC5vdXRsaW5lLXRvb2xiYXJfX2FuY2hvcjpsaW5rLFxuLm91dGxpbmUtdG9vbGJhcl9hY3RpdmUgLm91dGxpbmUtdG9vbGJhcl9fYW5jaG9yOnZpc2l0ZWQsXG4ub3V0bGluZS10b29sYmFyX2FjdGl2ZSAub3V0bGluZS10b29sYmFyX19hbmNob3I6aG92ZXIge1xuICBjb2xvcjogI2ZmZjtcbn1cbi5vdXRsaW5lLXRvb2xiYXJfcm91bmRlZC5vdXRsaW5lLXRvb2xiYXJfX2J1dHRvbiB7XG4gIGJvcmRlci1yYWRpdXM6IDE4cHg7XG59XG4ub3V0bGluZS10b29sYmFyX2Rpc2FibGVkLm91dGxpbmUtdG9vbGJhcl9fYW5jaG9yOmxpbmssXG4ub3V0bGluZS10b29sYmFyX2Rpc2FibGVkIC5vdXRsaW5lLXRvb2xiYXJfX2FuY2hvcjpsaW5rLFxuLm91dGxpbmUtdG9vbGJhcl9kaXNhYmxlZC5vdXRsaW5lLXRvb2xiYXJfX2FuY2hvcjp2aXNpdGVkLFxuLm91dGxpbmUtdG9vbGJhcl9kaXNhYmxlZCAub3V0bGluZS10b29sYmFyX19hbmNob3I6dmlzaXRlZCxcbi5vdXRsaW5lLXRvb2xiYXJfZGlzYWJsZWQub3V0bGluZS10b29sYmFyX19hbmNob3I6aG92ZXIsXG4ub3V0bGluZS10b29sYmFyX2Rpc2FibGVkIC5vdXRsaW5lLXRvb2xiYXJfX2FuY2hvcjpob3Zlcixcbi5vdXRsaW5lLXRvb2xiYXJfZGlzYWJsZWQub3V0bGluZS10b29sYmFyX19idXR0b24sXG4ub3V0bGluZS10b29sYmFyX2Rpc2FibGVkIC5vdXRsaW5lLXRvb2xiYXJfX2J1dHRvbiB7XG4gIGN1cnNvcjogbm90LWFsbG93ZWQ7XG4gIGNvbG9yOiAjOTk5O1xuICBib3JkZXItY29sb3I6ICM5OTk7XG59XG4ub3V0bGluZS10b29sYmFyX2Rpc2FibGVkLm91dGxpbmUtdG9vbGJhcl9fYW5jaG9yOmxpbms6aG92ZXIsXG4ub3V0bGluZS10b29sYmFyX2Rpc2FibGVkIC5vdXRsaW5lLXRvb2xiYXJfX2FuY2hvcjpsaW5rOmhvdmVyLFxuLm91dGxpbmUtdG9vbGJhcl9kaXNhYmxlZC5vdXRsaW5lLXRvb2xiYXJfX2FuY2hvcjp2aXNpdGVkOmhvdmVyLFxuLm91dGxpbmUtdG9vbGJhcl9kaXNhYmxlZCAub3V0bGluZS10b29sYmFyX19hbmNob3I6dmlzaXRlZDpob3Zlcixcbi5vdXRsaW5lLXRvb2xiYXJfZGlzYWJsZWQub3V0bGluZS10b29sYmFyX19hbmNob3I6aG92ZXI6aG92ZXIsXG4ub3V0bGluZS10b29sYmFyX2Rpc2FibGVkIC5vdXRsaW5lLXRvb2xiYXJfX2FuY2hvcjpob3Zlcjpob3Zlcixcbi5vdXRsaW5lLXRvb2xiYXJfZGlzYWJsZWQub3V0bGluZS10b29sYmFyX19idXR0b246aG92ZXIsXG4ub3V0bGluZS10b29sYmFyX2Rpc2FibGVkIC5vdXRsaW5lLXRvb2xiYXJfX2J1dHRvbjpob3ZlciB7XG4gIGNvbG9yOiAjOTk5O1xuICBib3JkZXItY29sb3I6ICM5OTk7XG59XG4ub3V0bGluZS10b29sYmFyX2Rpc2FibGVkLm91dGxpbmUtdG9vbGJhcl9fYnV0dG9uLFxuLm91dGxpbmUtdG9vbGJhcl9kaXNhYmxlZCAub3V0bGluZS10b29sYmFyX19idXR0b24ge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjVmNWY1O1xufVxuLm91dGxpbmUtdG9vbGJhcl90dGIsXG4ub3V0bGluZS10b29sYmFyX2J0dCB7XG4gIGxlZnQ6IDUwJTtcbiAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTUwJSk7XG4gICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC01MCUpO1xufVxuLm91dGxpbmUtdG9vbGJhcl90dGIgLm91dGxpbmUtdG9vbGJhcl9fYnV0dG9uLFxuLm91dGxpbmUtdG9vbGJhcl9idHQgLm91dGxpbmUtdG9vbGJhcl9fYnV0dG9uIHtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xufVxuLm91dGxpbmUtdG9vbGJhcl90dGIge1xuICB0b3A6IDEycHg7XG59XG4ub3V0bGluZS10b29sYmFyX3R0Yi5vdXRsaW5lLXRvb2xiYXJfaGlkZGVuIHtcbiAgdG9wOiAtNTZweDtcbn1cbi5vdXRsaW5lLXRvb2xiYXJfYnR0IHtcbiAgYm90dG9tOiAxMnB4O1xufVxuLm91dGxpbmUtdG9vbGJhcl9idHQub3V0bGluZS10b29sYmFyX2hpZGRlbiB7XG4gIGJvdHRvbTogLTU2cHg7XG59XG4ub3V0bGluZS10b29sYmFyX3J0bCxcbi5vdXRsaW5lLXRvb2xiYXJfbHRyIHtcbiAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTUwJSk7XG4gICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC01MCUpO1xuICB3aWR0aDogNTZweDtcbn1cbi5vdXRsaW5lLXRvb2xiYXJfcnRsIHtcbiAgdG9wOiA1MCU7XG4gIHJpZ2h0OiAxMnB4O1xufVxuLm91dGxpbmUtdG9vbGJhcl9ydGwub3V0bGluZS10b29sYmFyX2hpZGRlbiB7XG4gIHJpZ2h0OiAtODZweDtcbn1cbi5vdXRsaW5lLXRvb2xiYXJfbHRyIHtcbiAgdG9wOiA1MCU7XG4gIGxlZnQ6IDEycHg7XG59XG4ub3V0bGluZS10b29sYmFyX2x0ci5vdXRsaW5lLXRvb2xiYXJfaGlkZGVuIHtcbiAgbGVmdDogLTg2cHg7XG59XG4ub3V0bGluZS10b29sYmFyX3R0YiAub3V0bGluZS10b29sYmFyX19idXR0b24ub3V0bGluZS10b29sYmFyX2hpZGRlbixcbi5vdXRsaW5lLXRvb2xiYXJfcnRsIC5vdXRsaW5lLXRvb2xiYXJfX2J1dHRvbi5vdXRsaW5lLXRvb2xiYXJfaGlkZGVuLFxuLm91dGxpbmUtdG9vbGJhcl9idHQgLm91dGxpbmUtdG9vbGJhcl9fYnV0dG9uLm91dGxpbmUtdG9vbGJhcl9oaWRkZW4sXG4ub3V0bGluZS10b29sYmFyX2x0ciAub3V0bGluZS10b29sYmFyX19idXR0b24ub3V0bGluZS10b29sYmFyX2hpZGRlbiB7XG4gIGRpc3BsYXk6IG5vbmU7XG59XG4ub3V0bGluZS1tZXNzYWdlIHtcbiAgYm9yZGVyLXJhZGl1czogM3B4O1xuICAtd2Via2l0LWJveC1zaGFkb3c6IDAgMCA2cHggMXB4ICNkY2RmZTY7XG4gICAgICAgICAgYm94LXNoYWRvdzogMCAwIDZweCAxcHggI2RjZGZlNjtcbiAgcG9zaXRpb246IGZpeGVkO1xuICB6LWluZGV4OiA5OTk5O1xuICBvcGFjaXR5OiAwLjE7XG4gIHRvcDogLTUwcHg7XG4gIGxlZnQ6IDUwJTtcbiAgaGVpZ2h0OiA0MHB4O1xuICBtYXJnaW46IDA7XG4gIHBhZGRpbmc6IDAgNTBweDtcbiAgbGluZS1oZWlnaHQ6IDQwcHg7XG4gIGZvbnQtc2l6ZTogMTNweDtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjtcbiAgY29sb3I6ICM2NjY7XG4gIC13ZWJraXQtdHJhbnNpdGlvbjogYWxsIDAuNXMgZWFzZS1pbi1vdXQ7XG4gIHRyYW5zaXRpb246IGFsbCAwLjVzIGVhc2UtaW4tb3V0O1xuICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlWCgtNTAlKTtcbiAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTUwJSk7XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4ub3V0bGluZS1tZXNzYWdlX19jb250ZW50IHtcbiAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbiAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7XG4gIG1hcmdpbjogMDtcbiAgbWF4LXdpZHRoOiA3MDBweDtcbiAgaGVpZ2h0OiA0MHB4O1xuICBsaW5lLWhlaWdodDogNDBweDtcbiAgZm9udC1zaXplOiAxM3B4O1xuICBjb2xvcjogIzY2NjtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi5vdXRsaW5lLW1lc3NhZ2VfX2Nsb3NlLFxuLm91dGxpbmUtbWVzc2FnZV9faWNvbiB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgei1pbmRleDogMjtcbiAgdG9wOiAwO1xuICB3aWR0aDogNDBweDtcbiAgaGVpZ2h0OiA0MHB4O1xuICBsaW5lLWhlaWdodDogNDBweDtcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLm91dGxpbmUtbWVzc2FnZV9faWNvbiB7XG4gIGxlZnQ6IDA7XG4gIGNvbG9yOiAjZmZmO1xufVxuLm91dGxpbmUtbWVzc2FnZV9faWNvbiAub3V0bGluZS1pY29uIHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB6LWluZGV4OiAyO1xuICB0b3A6IDUwJTtcbiAgbGVmdDogNTAlO1xuICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIC01MCUpO1xuICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIC01MCUpO1xufVxuLm91dGxpbmUtbWVzc2FnZV9fY2xvc2Uge1xuICByaWdodDogMDtcbiAgY3Vyc29yOiBwb2ludGVyO1xuICBjb2xvcjogIzk5OTtcbn1cbi5vdXRsaW5lLW1lc3NhZ2VfX2Nsb3NlIC5vdXRsaW5lLWljb24ge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHotaW5kZXg6IDI7XG4gIHRvcDogNTAlO1xuICBsZWZ0OiA1MCU7XG4gIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgLTUwJSk7XG4gICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgLTUwJSk7XG59XG4ub3V0bGluZS1tZXNzYWdlX19jbG9zZTpob3ZlciB7XG4gIGNvbG9yOiAjNjY2O1xufVxuLm91dGxpbmUtbWVzc2FnZV9pbmZvIC5vdXRsaW5lLW1lc3NhZ2VfX2ljb24ge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjNTA3YWZlO1xufVxuLm91dGxpbmUtbWVzc2FnZV93YXJuaW5nIC5vdXRsaW5lLW1lc3NhZ2VfX2ljb24ge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmY5OTAxO1xufVxuLm91dGxpbmUtbWVzc2FnZV9zdWNjZXNzIC5vdXRsaW5lLW1lc3NhZ2VfX2ljb24ge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjMDU4OTQyO1xufVxuLm91dGxpbmUtbWVzc2FnZV9lcnJvciAub3V0bGluZS1tZXNzYWdlX19pY29uIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ZmNWQ1ZDtcbn1cbi5vdXRsaW5lLW1lc3NhZ2VfcGxhaW4ge1xuICBtaW4td2lkdGg6IDE5MHB4O1xuICBwYWRkaW5nOiAwIDUwcHggMCAxNXB4O1xufVxuLm91dGxpbmUtbWVzc2FnZV9wbGFpbi5vdXRsaW5lLW1lc3NhZ2VfaW5mbyB7XG4gIGJvcmRlci1sZWZ0OiA1cHggc29saWQgIzUwN2FmZTtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2VjZjhmZjtcbn1cbi5vdXRsaW5lLW1lc3NhZ2VfcGxhaW4ub3V0bGluZS1tZXNzYWdlX3dhcm5pbmcge1xuICBib3JkZXItbGVmdDogNXB4IHNvbGlkICNmZjk5MDE7XG4gIGJhY2tncm91bmQtY29sb3I6ICNmZmZiZTY7XG59XG4ub3V0bGluZS1tZXNzYWdlX3BsYWluLm91dGxpbmUtbWVzc2FnZV9zdWNjZXNzIHtcbiAgYm9yZGVyLWxlZnQ6IDVweCBzb2xpZCAjMDU4OTQyO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZTFmNmViO1xufVxuLm91dGxpbmUtbWVzc2FnZV9wbGFpbi5vdXRsaW5lLW1lc3NhZ2VfZXJyb3Ige1xuICBib3JkZXItbGVmdDogNXB4IHNvbGlkICNmZjVkNWQ7XG4gIGJhY2tncm91bmQtY29sb3I6ICNmZmYxZjA7XG59XG4ub3V0bGluZS1tZXNzYWdlX3BsYWluIC5vdXRsaW5lLW1lc3NhZ2VfX2ljb24ge1xuICB3aWR0aDogMDtcbiAgZGlzcGxheTogbm9uZTtcbn1cbi5vdXRsaW5lLW1lc3NhZ2VfcGxhaW4gLm91dGxpbmUtbWVzc2FnZV9faWNvbiAub3V0bGluZS1pY29uIHtcbiAgZGlzcGxheTogbm9uZTtcbn1cbi5vdXRsaW5lLW1lc3NhZ2VfbGlnaHQge1xuICBtaW4td2lkdGg6IDE4MHB4O1xuICBwYWRkaW5nOiAwIDQwcHg7XG59XG4ub3V0bGluZS1tZXNzYWdlX2xpZ2h0Lm91dGxpbmUtbWVzc2FnZV9pbmZvIC5vdXRsaW5lLW1lc3NhZ2VfX2ljb24ge1xuICBjb2xvcjogIzUwN2FmZTtcbn1cbi5vdXRsaW5lLW1lc3NhZ2VfbGlnaHQub3V0bGluZS1tZXNzYWdlX3dhcm5pbmcgLm91dGxpbmUtbWVzc2FnZV9faWNvbiB7XG4gIGNvbG9yOiAjZmY5OTAxO1xufVxuLm91dGxpbmUtbWVzc2FnZV9saWdodC5vdXRsaW5lLW1lc3NhZ2Vfc3VjY2VzcyAub3V0bGluZS1tZXNzYWdlX19pY29uIHtcbiAgY29sb3I6ICMwNTg5NDI7XG59XG4ub3V0bGluZS1tZXNzYWdlX2xpZ2h0Lm91dGxpbmUtbWVzc2FnZV9lcnJvciAub3V0bGluZS1tZXNzYWdlX19pY29uIHtcbiAgY29sb3I6ICNmZjVkNWQ7XG59XG4ub3V0bGluZS1tZXNzYWdlX2xpZ2h0IC5vdXRsaW5lLW1lc3NhZ2VfX2ljb24ge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmO1xufVxuLm91dGxpbmUtbWVzc2FnZV9yb3VuZCB7XG4gIGJvcmRlci1yYWRpdXM6IDIwcHg7XG59XG4ub3V0bGluZS1tZXNzYWdlX3JvdW5kLm91dGxpbmUtbWVzc2FnZV9kZWZhdWx0IHtcbiAgbWluLXdpZHRoOiAxODBweDtcbiAgcGFkZGluZzogMCA0MHB4O1xufVxuLm91dGxpbmUtbWVzc2FnZV9yb3VuZC5vdXRsaW5lLW1lc3NhZ2VfZGVmYXVsdCAub3V0bGluZS1tZXNzYWdlX19pY29uIHtcbiAgYm9yZGVyLXJhZGl1czogMTBweDtcbiAgdG9wOiAxMHB4O1xuICBsZWZ0OiAxMHB4O1xuICB3aWR0aDogMjBweDtcbiAgaGVpZ2h0OiAyMHB4O1xuICBsaW5lLWhlaWdodDogMjBweDtcbn1cbi5vdXRsaW5lLW1lc3NhZ2Vfcm91bmQub3V0bGluZS1tZXNzYWdlX2RlZmF1bHQub3V0bGluZS1tZXNzYWdlX2Z1bGwtd2lkdGgge1xuICBtaW4td2lkdGg6IDIwMHB4O1xuICBwYWRkaW5nOiAwIDIwcHggMCA0MHB4O1xufVxuLm91dGxpbmUtbWVzc2FnZV9yb3VuZC5vdXRsaW5lLW1lc3NhZ2VfcGxhaW4ge1xuICBtaW4td2lkdGg6IDE5NXB4O1xuICBwYWRkaW5nOiAwIDQwcHggMCAyMHB4O1xufVxuLm91dGxpbmUtbWVzc2FnZV9yb3VuZC5vdXRsaW5lLW1lc3NhZ2VfcGxhaW4ub3V0bGluZS1tZXNzYWdlX2Z1bGwtd2lkdGgge1xuICBtaW4td2lkdGg6IDIxNXB4O1xuICBwYWRkaW5nOiAwIDIwcHg7XG59XG4ub3V0bGluZS1tZXNzYWdlX2Z1bGwtd2lkdGgge1xuICBtaW4td2lkdGg6IDIwMHB4O1xuICBwYWRkaW5nOiAwIDEwcHggMCA1MHB4O1xufVxuLm91dGxpbmUtbWVzc2FnZV9mdWxsLXdpZHRoLm91dGxpbmUtbWVzc2FnZV9wbGFpbiB7XG4gIG1pbi13aWR0aDogMjMwcHg7XG4gIHBhZGRpbmc6IDAgMTBweCAwIDE1cHg7XG59XG4ub3V0bGluZS1tZXNzYWdlX2Z1bGwtd2lkdGgub3V0bGluZS1tZXNzYWdlX2xpZ2h0IHtcbiAgbWluLXdpZHRoOiAyMTBweDtcbiAgcGFkZGluZzogMCAxMHB4IDAgNDBweDtcbn1cbi5vdXRsaW5lLW1lc3NhZ2VfdmlzaWJsZSB7XG4gIG9wYWNpdHk6IDE7XG59XG4ub3V0bGluZS1tZXNzYWdlX2hpZGRlbiB7XG4gIGRpc3BsYXk6IG5vbmU7XG59XG4vKiA9PT09PSBTY3JvbGxiYXIgPT09PT0gKi9cbjo6LXdlYmtpdC1zY3JvbGxiYXIge1xuICB3aWR0aDogN3B4O1xuICBoZWlnaHQ6IDdweDtcbiAgLXdlYmtpdC1ib3JkZXItcmFkaXVzOiA1cHg7XG59XG46Oi13ZWJraXQtc2Nyb2xsYmFyLXRyYWNrLXBpZWNlIHtcbiAgLXdlYmtpdC1ib3JkZXItcmFkaXVzOiA1cHg7XG59XG46Oi13ZWJraXQtc2Nyb2xsYmFyLXRodW1iOnZlcnRpY2FsIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjI1KTtcbiAgLXdlYmtpdC1ib3JkZXItcmFkaXVzOiA1cHg7XG59XG46Oi13ZWJraXQtc2Nyb2xsYmFyLXRodW1iOmhvcml6b250YWwge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuMjUpO1xuICAtd2Via2l0LWJvcmRlci1yYWRpdXM6IDVweDtcbn1cbjo6LXdlYmtpdC1zY3JvbGxiYXItdGh1bWI6aG92ZXIge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuMzUpO1xufVxuOjotd2Via2l0LXNjcm9sbGJhcjpob3ZlciB7XG4gIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMCwgMCwgMCwgMC4xNSk7XG59XG5cbi8qIyBzb3VyY2VNYXBwaW5nVVJMPWRhdGE6YXBwbGljYXRpb24vanNvbjtjaGFyc2V0PXV0Zjg7YmFzZTY0LGV5SjJaWEp6YVc5dUlqb3pMQ0p6YjNWeVkyVnpJanBiSWk0dUx5NHVMenhwYm5CMWRDQmpjM01nTVQ0aUxDSnViM0p0WVd4cGVtVXViR1Z6Y3lJc0ltSmhjMlV1YkdWemN5SXNJbk5qY205c2JHSmhjaTVzWlhOeklpd2liR0Y1YjNWMExteGxjM01pTENKaGMybGtaUzVzWlhOeklpd2liV0ZwYmk1c1pYTnpJaXdpYzJWamRHbHZiaTVzWlhOeklpd2lZMkZ6WlM1c1pYTnpJaXdpTGk0dkxpNHZkR2hsYldVdmRtRnlhV0ZpYkdWekxteGxjM01pTENJdUxpOHVMaTkwYUdWdFpTOXBZMjl1Y3k1c1pYTnpJaXdpTGk0dkxpNHZkR2hsYldVdllXNWphRzl5Y3k1c1pYTnpJaXdpTGk0dkxpNHZkR2hsYldVdlpISmhkMlZ5TG14bGMzTWlMQ0l1TGk4dUxpOTBhR1Z0WlM5emFHRmtiM2N1YkdWemN5SXNJaTR1THk0dUwzUm9aVzFsTDI1aGRtbG5ZWFJ2Y2k1c1pYTnpJaXdpTGk0dkxpNHZkR2hsYldVdlpXeHNhWEJ6YVhNdWJHVnpjeUlzSWk0dUx5NHVMM1JvWlcxbEwzSmxZV1JsY2k1c1pYTnpJaXdpTGk0dkxpNHZkR2hsYldVdmNtRmthWFZ6TG14bGMzTWlMQ0l1TGk4dUxpOTBhR1Z0WlM5MGIyOXNZbUZ5TG14bGMzTWlMQ0l1TGk4dUxpOTBhR1Z0WlM5dFpYTnpZV2RsTG14bGMzTWlMQ0l1TGk4dUxpOTBhR1Z0WlM5elkzSnZiR3hpWVhJdWJHVnpjeUpkTENKdVlXMWxjeUk2VzEwc0ltMWhjSEJwYm1keklqb2lRVUZCUVN3MFJVRkJORVU3UVVGRE5VVTdaMFpCUTJkR08wRkJRMmhHT3pzN1IwRkhSenRCUTBsSU8wVkJRMFVzYTBKQlFVRTdSVVJHUVN4UFFVRlBPMFZEUjFBc0swSkJRVUU3UlVSRVFTeFBRVUZQTzBOQlExSTdRVUZEUkR0blJrRkRaMFk3UVVGRGFFWTdPMGRCUlVjN1FVTkxTRHRGUVVORkxGVkJRVUU3UTBSSVJEdEJRVU5FT3p0SFFVVkhPMEZEVDBnN1JVRkRSU3hsUVVGQk8wTkVURVE3UVVGRFJEczdPMGRCUjBjN1FVTlRTRHRGUVVORkxHVkJRVUU3UlVGRFFTeHBRa0ZCUVR0RFJGQkVPMEZCUTBRN1owWkJRMmRHTzBGQlEyaEdPenM3UjBGSFJ6dEJRMWxJTzBWQlEwVXNaME5CUVVFN1ZVRkJRU3gzUWtGQlFUdEZSRlpCTEU5QlFVODdSVU5YVUN4VlFVRkJPMFZFVkVFc1QwRkJUenRGUTFWUUxHdENRVUZCTzBWRVVrRXNUMEZCVHp0RFFVTlNPMEZCUTBRN096dEhRVWRITzBGRFYwZzdSVUZEUlN4clEwRkJRVHRGUkZSQkxFOUJRVTg3UlVOVlVDeGxRVUZCTzBWRVVrRXNUMEZCVHp0RFFVTlNPMEZCUTBRN1owWkJRMmRHTzBGQlEyaEdPenRIUVVWSE8wRkRXVWc3UlVGRFJTdzRRa0ZCUVR0RFJGWkVPMEZCUTBRN096dEhRVWRITzBGRFkwZzdSVUZEUlN4dlFrRkJRVHRGUkZwQkxFOUJRVTg3UlVOaFVDd3lRa0ZCUVR0RlJGaEJMRTlCUVU4N1JVTlpVQ3d3UTBGQlFUdFZRVUZCTEd0RFFVRkJPMFZFVmtFc1QwRkJUenREUVVOU08wRkJRMFE3TzBkQlJVYzdRVU5oU0RzN1JVRkZSU3h2UWtGQlFUdERSRmhFTzBGQlEwUTdPenRIUVVkSE8wRkRaVWc3T3p0RlFVZEZMR3REUVVGQk8wVkVZa0VzVDBGQlR6dEZRMk5RTEdWQlFVRTdSVVJhUVN4UFFVRlBPME5CUTFJN1FVRkRSRHM3UjBGRlJ6dEJRMlZJTzBWQlEwVXNaVUZCUVR0RFJHSkVPMEZCUTBRN096dEhRVWRITzBGRGFVSklPenRGUVVWRkxHVkJRVUU3UlVGRFFTeGxRVUZCTzBWQlEwRXNiVUpCUVVFN1JVRkRRU3g1UWtGQlFUdERSR1pFTzBGRGEwSkVPMFZCUTBVc1owSkJRVUU3UTBSb1FrUTdRVU50UWtRN1JVRkRSU3haUVVGQk8wTkVha0pFTzBGQlEwUTdaMFpCUTJkR08wRkJRMmhHT3p0SFFVVkhPMEZEYzBKSU8wVkJRMFVzYlVKQlFVRTdRMFJ3UWtRN1FVRkRSRHRuUmtGRFowWTdRVUZEYUVZN096dEhRVWRITzBGRGVVSklPenM3T3p0RlFVdEZMSEZDUVVGQk8wVkVka0pCTEU5QlFVODdSVU4zUWxBc1owSkJRVUU3UlVSMFFrRXNUMEZCVHp0RlEzVkNVQ3hyUWtGQlFUdEZSSEpDUVN4UFFVRlBPMFZEYzBKUUxGVkJRVUU3UlVSd1FrRXNUMEZCVHp0RFFVTlNPMEZCUTBRN096dEhRVWRITzBGRGRVSklPenRGUkhCQ1JTeFBRVUZQTzBWRGRVSlFMR3RDUVVGQk8wTkVja0pFTzBGQlEwUTdPenRIUVVkSE8wRkRlVUpJT3p0RlJIUkNSU3hQUVVGUE8wVkRlVUpRTEhGQ1FVRkJPME5FZGtKRU8wRkJRMFE3TzBkQlJVYzdRVU15UWtnN096czdSVUZKUlN3eVFrRkJRVHREUkhwQ1JEdEJRVU5FT3p0SFFVVkhPMEZETmtKSU96czdPMFZCU1VVc2JVSkJRVUU3UlVGRFFTeFhRVUZCTzBORU0wSkVPMEZCUTBRN08wZEJSVWM3UVVNclFrZzdPenM3UlVGSlJTd3JRa0ZCUVR0RFJEZENSRHRCUVVORU96dEhRVVZITzBGRGFVTklPMFZCUTBVc0swSkJRVUU3UTBRdlFrUTdRVUZEUkRzN096czdSMEZMUnp0QlEyMURTRHRGUVVORkxDdENRVUZCTzFWQlFVRXNkVUpCUVVFN1JVUnFRMEVzVDBGQlR6dEZRMnREVUN4bFFVRkJPMFZFYUVOQkxFOUJRVTg3UlVOcFExQXNaVUZCUVR0RlJDOUNRU3hQUVVGUE8wVkRaME5RTEdkQ1FVRkJPMFZFT1VKQkxFOUJRVTg3UlVNclFsQXNWMEZCUVR0RlJEZENRU3hQUVVGUE8wVkRPRUpRTEc5Q1FVRkJPMFZFTlVKQkxFOUJRVTg3UTBGRFVqdEJRVU5FT3p0SFFVVkhPMEZESzBKSU8wVkJRMFVzZVVKQlFVRTdRMFEzUWtRN1FVRkRSRHM3UjBGRlJ6dEJRMmxEU0R0RlFVTkZMR1ZCUVVFN1EwUXZRa1E3UVVGRFJEczdPMGRCUjBjN1FVTnRRMGc3TzBWQlJVVXNLMEpCUVVFN1ZVRkJRU3gxUWtGQlFUdEZSR3BEUVN4UFFVRlBPMFZEYTBOUUxGZEJRVUU3UlVSb1EwRXNUMEZCVHp0RFFVTlNPMEZCUTBRN08wZEJSVWM3UVVOdFEwZzdPMFZCUlVVc1lVRkJRVHREUkdwRFJEdEJRVU5FT3pzN1IwRkhSenRCUTNGRFNEdEZRVU5GTERoQ1FVRkJPMFZFYmtOQkxFOUJRVTg3UlVOdlExQXNjVUpCUVVFN1JVUnNRMEVzVDBGQlR6dERRVU5TTzBGQlEwUTdPMGRCUlVjN1FVTnhRMGc3UlVGRFJTeDVRa0ZCUVR0RFJHNURSRHRCUVVORU96czdSMEZIUnp0QlEzVkRTRHRGUVVORkxESkNRVUZCTzBWRWNrTkJMRTlCUVU4N1JVTnpRMUFzWTBGQlFUdEZSSEJEUVN4UFFVRlBPME5CUTFJN1FVRkRSRHRuUmtGRFowWTdRVUZEYUVZN08wZEJSVWM3UVVOM1EwZzdSVUZEUlN4bFFVRkJPME5FZEVORU8wRkJRMFE3TzBkQlJVYzdRVU13UTBnN1JVRkRSU3h0UWtGQlFUdERSSGhEUkR0QlFVTkVPMmRHUVVOblJqdEJRVU5vUmpzN1IwRkZSenRCUXpaRFNEdEZRVU5GTEdOQlFVRTdRMFF6UTBRN1FVRkRSRHM3UjBGRlJ6dEJReXREU0R0RlFVTkZMR05CUVVFN1EwUTNRMFE3UVVGRFJDeHpRa0ZCYzBJN1FVVTVVM1JDT3p0RlFVVkZMR0ZCUVVFN1JVRkRRU3h2UWtGQlFUdEZRVU5CTEZsQlFVRTdSVUZEUVN4blFrRkJRVHRGUVVOQkxHdENRVUZCTzBWQlEwRXNjVVJCUVVFN1JVRkRRU3hwUWtGQlFUdERSbWRVUkR0QlJUVlRRenM3TzBWQlIwVXNaVUZCUVR0RlFVTkJMSE5DUVVGQk8wTkdPRk5JTzBGRk0xTkRPMFZCUTBVc01rSkJRVUU3UTBZMlUwZzdRVVY2VTBRN1JVRkRSU3gzUmtGQlFUdERSakpUUkR0QlFVTkVMREpDUVVFeVFqdEJSM1pWTTBJN1JVRkRSU3hYUVVGQk8wVkJRMEVzV1VGQlFUdEZRVU5CTERKQ1FVRkJPME5JZVZWRU8wRkhkRlZFTzBWQlEwVXNNa0pCUVVFN1EwaDNWVVE3UVVkeVZVUTdSVUZEUlN4elEwRkJRVHRGUVVOQkxESkNRVUZCTzBOSWRWVkVPMEZIY0ZWRU8wVkJRMFVzYzBOQlFVRTdSVUZEUVN3eVFrRkJRVHREU0hOVlJEdEJSMjVWUkR0RlFVTkZMSE5EUVVGQk8wTkljVlZFTzBGSGJGVkVPMFZCUTBVc2MwTkJRVUU3UTBodlZVUTdRVUZEUkN4WlFVRlpPMEZKTlZaYU8wVkJRMFVzY1VKQlFVRTdSVUZCUVN4eFFrRkJRVHRGUVVGQkxHTkJRVUU3UlVGRFFTd3JRa0ZCUVR0RlFVRkJMRGhDUVVGQk8wMUJRVUVzZDBKQlFVRTdWVUZCUVN4dlFrRkJRVHRGUVVOQkxITkNRVUZCTzAxQlFVRXNhMEpCUVVFN1JVRkRRU3h0UWtGQlFUdEZRVU5CTEZkQlFVRTdSVUZEUVN4aFFVRkJPMFZCUTBFc1dVRkJRVHRGUVVOQkxGVkJRVUU3UlVGRFFTeHBRa0ZCUVR0RFNqaFdSRHRCUVVORUxGZEJRVmM3UVVrelZsZzdSVUZEUlN4eFFrRkJRVHRGUVVGQkxIRkNRVUZCTzBWQlFVRXNZMEZCUVR0RlFVTkJMSEZDUVVGQk8wMUJRVUVzWlVGQlFUdEZRVU5CTERaQ1FVRkJPMFZCUVVFc09FSkJRVUU3VFVGQlFTd3lRa0ZCUVR0VlFVRkJMSFZDUVVGQk8wVkJRMEVzYzBKQlFVRTdUVUZCUVN4clFrRkJRVHRGUVVOQkxHRkJRVUU3UlVGRFFTeFZRVUZCTzBWQlEwRXNZVUZCUVR0RlFVTkJMSFZDUVVGQk8wVkJRMEVzV1VGQlFUdEZRVU5CTEhGRFFVRkJPMVZCUVVFc05rSkJRVUU3UlVGRFFTeHJRMEZCUVR0VlFVRkJMREJDUVVGQk8wVkJRMEVzWlVGQlFUdERTalpXUkR0QlFVTkVMRlZCUVZVN1FVa3hWbFk3UlVGRFJTeHZRa0ZCUVR0TlFVRkJMRmxCUVVFN1ZVRkJRU3hSUVVGQk8wVkJRMEVzYlVKQlFVRTdSVUZEUVN4WFFVRkJPMFZCUTBFc1lVRkJRVHRGUVVOQkxIVkNRVUZCTzBWQlEwRXNaVUZCUVR0RFNqUldSRHRCU1hwV1JEdEZRVU5GTzBsQlEwVXNOa0pCUVVFN1NVRkJRU3c0UWtGQlFUdFJRVUZCTERKQ1FVRkJPMWxCUVVFc2RVSkJRVUU3UjBveVZrUTdSVWw0VmtRN08wbEJSVVVzV1VGQlFUdEhTakJXUkR0RlNYWldSRHRKUVVORkxHZENRVUZCTzBsQlEwRXNWMEZCUVR0SlFVTkJMRTlCUVVFN1IwcDVWa1E3UlVsMFZrYzdTVUZEUlN4WlFVRkJPMGRLZDFaTU8wVkpjbFpITzBsQlEwVXNVVUZCUVR0SFNuVldURHREUVVOR08wRkxjRnBFTzBWQlEwVXNkMFpCUVVFN1EweHpXa1E3UVV0dVdrTTdSVUZEUlN4bFFVRkJPMFZCUTBFc2NVSkJRVUU3VFVGQlFTeGxRVUZCTzBWQlEwRXNhVUpCUVVFN1EweHhXa2c3UVV0c1drTTdSVUZEUlN4dlFrRkJRVHROUVVGQkxGbEJRVUU3VlVGQlFTeFJRVUZCTzBWQlEwRXNaVUZCUVR0RFRHOWFTRHRCUzJwYVF6dEZRVU5GTEdWQlFVRTdSVUZEUVN4aFFVRkJPMFZCUTBFc2EwSkJRVUU3UlVGRFFTeG5Ra0ZCUVR0RlFVTkJMRzlDUVVGQk8wVkJRMEVzYTBSQlFVRTdSVUZEUVN4dFFrRkJRVHRGUVVOQkxHbENRVUZCTzBOTWJWcElPMEZMYUZwRE8wVkJRMFVzWlVGQlFUdEZRVU5CTEdkQ1FVRkJPMFZCUTBFc1owSkJRVUU3UlVGRFFTeHBRa0ZCUVR0RFRHdGFTRHRCU3k5WlF6dEZRVU5GTEZWQlFVRTdSVUZEUVN4blFrRkJRVHRGUVVOQkxHbENRVUZCTzBOTWFWcElPMEZMT1ZsRE8wVkJRMFVzWVVGQlFUdEZRVU5CTEd0Q1FVRkJPMFZCUTBFc1owSkJRVUU3UlVGRFFTeG5Ra0ZCUVR0RlFVTkJMR2RDUVVGQk8wVkJRMEVzYVVKQlFVRTdRMHhuV2tnN1FVczNXVU03UlVGRFJTeHZRa0ZCUVR0TlFVRkJMRmxCUVVFN1ZVRkJRU3hSUVVGQk8wTk1LMWxJTzBGTE0xbFBPMFZCUTBVc2RVSkJRVUU3UTB3MldWUTdRVXN6V1ZNN1JVRkRSU3gxUWtGQlFUdERURFpaV0R0QlMzaFpTenRGUVVORkxIVkNRVUZCTzBWQlEwRXNORUpCUVVFN1Ewd3dXVkE3UVV0MFdVODdSVUZEUlN4WlFVRkJPMFZCUTBFc2MwSkJRVUU3UTB4M1dWUTdRVXR5V1U4N1JVRkRSU3haUVVGQk8wVkJRMEVzYzBKQlFVRTdRMHgxV1ZRN1FVdHdXVTg3UlVGRFJTeFpRVUZCTzBWQlEwRXNNa0pCUVVFN1EweHpXVlE3UVV0b1dWTTdPenRGUVVkRkxGbEJRVUU3UTB4cldWZzdRVTB4WkVNN08wVkJSVVVzWlVGQlFUdEZRVU5CTEdGQlFVRTdSVUZEUVN4dFFrRkJRVHRGUVVOQkxHbENRVUZCTzBOT05HUklPMEZOZW1SRE8wVkJRMFVzWlVGQlFUdEZRVU5CTEdsQ1FVRkJPMFZCUTBFc1pVRkJRVHRGUVVOQkxHOUNRVUZCTzBWQlEwRXNhVUpCUVVFN1JVRkRRU3hwUWtGQlFUdERUakprU0R0QlRYaGtRenRGUVVORkxHVkJRVUU3UlVGRFFTeHZRa0ZCUVR0RFRqQmtTRHRCVFhaa1F6dEZRVU5GTEdsQ1FVRkJPMFZCUTBFc2FVSkJRVUU3UlVGRFFTeHRRa0ZCUVR0RlFVTkJMR1ZCUVVFN1JVRkRRU3haUVVGQk8wVkJRMEVzYVVKQlFVRTdSVUZEUVN4cFFrRkJRVHREVG5sa1NEdEJUWFJrUXp0RlFVTkZMR05CUVVFN1JVRkRRU3hoUVVGQk8wVkJRMEVzWjBKQlFVRTdSVUZEUVN4clFrRkJRVHRGUVVOQkxHMUNRVUZCTzBWQlEwRXNNRUpCUVVFN1JVRkRRU3d5UWtGQlFUdEZRVU5CTERoQ1FVRkJPMFZCUTBFc1dVRkJRVHRGUVVOQkxHbENRVUZCTzBOT2QyUklPMEZOY21SRE8wVkJRMFVzYVVKQlFVRTdSVUZEUVN4aFFVRkJPMFZCUTBFc2JVSkJRVUU3UlVGRFFTeHBRa0ZCUVR0RFRuVmtTRHRCVFhCa1F6dEZRVU5GTEhOQ1FVRkJPMFZCUTBFc2JVSkJRVUU3UlVGRFFTeHRRa0ZCUVR0RlFVTkJMR2RDUVVGQk8wVkJRMEVzZDBaQlFVRTdSVUZGUVN3d1FrRkJRVHRGUVVOQkxHbENRVUZCTzBOT2NXUklPMEZOYm1SSE96czdSVUZIUlN4WlFVRkJPMFZCUTBFc2MwSkJRVUU3UTA1eFpFdzdRVTFxWkVNN1JVRkRSU3hqUVVGQk8wVkJRMEVzTWtKQlFVRTdRMDV0WkVnN1FVODFhRUpFTzBWQlEwVXNZMEZCUVR0RlFVTkJMR2xDUVVGQk8wTlFPR2hDUkR0QlR6Vm9Ra003T3p0RlFVZEZMRlZCUVVFN1JVRkRRU3hsUVVGQk8wVkJRMEVzYVVKQlFVRTdRMUE0YUVKSU8wRlBNMmhDUXp0RlFVTkZMRmxCUVVFN1ExQTJhRUpJTzBGUE1XaENRenRGUVVORkxHVkJRVUU3UlVGRFFTeHJRa0ZCUVR0RFVEUm9Ra2c3UVU5NmFFSkRPMFZCUTBVc2FVSkJRVUU3UlVGRFFTeFpRVUZCTzBOUU1taENTRHRCVDNob1FrTTdSVUZEUlN4bFFVRkJPMFZCUTBFc1dVRkJRVHREVURCb1FrZzdRVTkyYUVKRE96czdSVUZIUlN4VlFVRkJPMFZCUTBFc1YwRkJRVHRGUVVOQkxHbENRVUZCTzBOUWVXaENTRHRCVDNSb1FrTTdSVUZEUlN4dFFrRkJRVHRGUVVOQkxGZEJRVUU3UTFCM2FFSklPMEZQY21oQ1F6dEZRVU5GTEhOQ1FVRkJPME5RZFdoQ1NEdEJUM0JvUWtNN1JVRkRSU3h6UWtGQlFUdEZRVU5CTEdWQlFVRTdRMUJ6YUVKSU8wRlBibWhDUXp0RlFVTkZMR05CUVVFN1JVRkRRU3hoUVVGQk8wVkJRMEVzWjBKQlFVRTdSVUZEUVN4clFrRkJRVHRGUVVOQkxHbENRVUZCTzBWQlEwRXNNRUpCUVVFN1JVRkRRU3gxUWtGQlFUdEZRVU5CTEcxQ1FVRkJPMFZCUTBFc1dVRkJRVHRGUVVOQkxHVkJRVUU3UTFCeGFFSklPMEZQYkdoQ1F6dEZRVU5GTEdWQlFVRTdSVUZEUVN4bFFVRkJPMFZCUTBFc2FVSkJRVUU3UTFCdmFFSklPMEZQYW1oQ1F6dEZRVU5GTERKQ1FVRkJPMFZCUTBFc1owSkJRVUU3UlVGRFFTd3dRa0ZCUVR0RlFVTkJMRmxCUVVFN1ExQnRhRUpJTzBGUGFHaENRenRGUVVORkxHbENRVUZCTzBWQlEwRXNXVUZCUVR0RlFVTkJMREpDUVVGQk8wTlFhMmhDU0R0QlR5OW5Ra003TzBWQlJVVXNhMEpCUVVFN1JVRkRRU3hyUWtGQlFUdEZRVU5CTERoQ1FVRkJPME5RYVdoQ1NEdEJUemxuUWtNN1JVRkRSU3h0UWtGQlFUdEZRVU5CTERCQ1FVRkJPME5RWjJoQ1NEdEJUelZuUWtRN1JVRkZTVHM3U1VGRlJTeGxRVUZCTzBkUU5tZENTRHREUVVOR08wRlJjRzVDUkR0RlFVTkZMRzFDUVVGQk8wVkJRMEVzVjBGQlFUdEZRVU5CTEdOQlFVRTdSVUZEUVN4elEwRkJRVHRGUVVOQkxGVkJRVUU3UlVGRFFTeGhRVUZCTzBWQlEwRXNNa0pCUVVFN1JVRkRRU3c0UWtGQlFUdEZRVU5CTEdsQ1FVRkJPME5TYzI1Q1JEdEJVWEJ1UWtNN1JVRkRSU3haUVVGQk8wVkJRMEVzYlVKQlFVRTdSVUZEUVN4WFFVRkJPMFZCUTBFc1QwRkJRVHRGUVVOQkxGVkJRVUU3UlVGRFFTeGhRVUZCTzBWQlEwRXNVMEZCUVR0RlFVTkJMRFJDUVVGQk8wVkJRMEVzYVVKQlFVRTdRMUp6YmtKSU8wRlJibTVDUXpzN1JVRkZSU3huUWtGQlFUdEZRVU5CTEd0Q1FVRkJPME5TY1c1Q1NEdEJVV3h1UWtNN096dEZRVWRGTEdsRlFVRkJPME5TYjI1Q1NEdEJVV3B1UWtNN1JVRkRSU3hWUVVGQk8wVkJRMEVzWVVGQlFUdEZRVU5CTERCQ1FVRkJPMFZCUTBFc1lVRkJRVHRGUVVOQkxHMUNRVUZCTzBWQlEwRXNLMEpCUVVFN1ZVRkJRU3gxUWtGQlFUdEZRVU5CTEdWQlFVRTdRMUp0YmtKSU8wRlJhRzVDUXp0RlFVTkZMR1ZCUVVFN1JVRkRRU3hoUVVGQk8wVkJRMEVzYTBKQlFVRTdSVUZEUVN4blFrRkJRVHRGUVVOQkxHZENRVUZCTzBWQlEwRXNhMEpCUVVFN1JVRkRRU3hwUWtGQlFUdERVbXR1UWtnN1FWRXZiVUpET3p0RlFVVkZMR2RDUVVGQk8wVkJRMEVzWlVGQlFUdEZRVU5CTERCQ1FVRkJPMHRCUVVFc2RVSkJRVUU3VFVGQlFTeHpRa0ZCUVR0VlFVRkJMR3RDUVVGQk8wTlNhVzVDU0R0QlVUbHRRa003UlVGRFJTeG5Ra0ZCUVR0RlFVTkJMRzFDUVVGQk8wTlNaMjVDU0R0QlVUbHRRa2M3UlVGRFJTeG5Ra0ZCUVR0RFVtZHVRa3c3UVZFMWJVSkRPMFZCUTBVc1lVRkJRVHREVWpodFFrZzdRVkV6YlVKRE8wVkJRMFVzWlVGQlFUdEZRVU5CTEdOQlFVRTdSVUZEUVN4MVFrRkJRVHRGUVVOQkxHbENRVUZCTzBOU05tMUNTRHRCVVRGdFFrTTdSVUZEUlN4bFFVRkJPMFZCUTBFc1dVRkJRVHRGUVVOQkxHRkJRVUU3UlVGRFFTeGhRVUZCTzBWQlEwRXNZMEZCUVR0RlFVTkJMR0ZCUVVFN1JVRkRRU3dyUWtGQlFUdFZRVUZCTEhWQ1FVRkJPMFZCUTBFc1pVRkJRVHREVWpSdFFrZzdRVkY2YlVKRE96dEZRVVZGTEZWQlFVRTdSVUZEUVN4WFFVRkJPMFZCUTBFc2MwSkJRVUU3UlVGRFFTeHBRa0ZCUVR0RFVqSnRRa2c3UVZGNGJVSkRPMFZCUTBVc1kwRkJRVHRGUVVOQkxESkNRVUZCTzBWQlEwRXNPRUpCUVVFN1JVRkRRU3huUWtGQlFUdEZRVU5CTEdWQlFVRTdRMUl3YlVKSU8wRlJkbTFDUXp0RlFVTkZMR0ZCUVVFN1JVRkRRU3hyUWtGQlFUdEZRVU5CTEdkQ1FVRkJPMFZCUTBFc1owSkJRVUU3UTFKNWJVSklPMEZSZG0xQ1J6dEZRVU5GTERCQ1FVRkJPME5TZVcxQ1REdEJVeTkwUWtRN1JVRkRReXgxUWtGQlFUdEZRVU5FTERoQ1FVRkJPMFZCUVdsRExHZERRVUZCTzBOVWEzVkNhRU03UVVGRFJDeHRSRUZCYlVRN1FVRkRia1E3T3pzN08wZEJTMGM3UVVGRFNDd3dRa0ZCTUVJN1FVRkRNVUk3T3pzN08wZEJTMGM3UVVGRFNDdzBRa0ZCTkVJN1FVRkROVUlzYTBSQlFXdEVPMEZWY0haQ1F6dEZRVVZ1UkN4dFFrRkJRVHRGUVVGelFpeFhRVUZCTzBWQlExUXNjMEpCUVVFN1JVRkRWU3gxUWtGQlFUdEZRVU5CTEZkQlFVRTdSVUZEWWl4WlFVRkJPMFZCUTBFc2FVSkJRVUU3UTFaemRrSlVPMEZWY25aQ1l6dEZRVVZXTEcxQ1FVRkJPMFZCUTFrc1YwRkJRVHRGUVVOVUxGTkJRVUU3UlVGRFNDeFZRVUZCTzBWQlEwRXNWMEZCUVR0RlFVTkJMRmxCUVVFN1JVRkRRU3h0UWtGQlFUdEZRVU5OTEhsRFFVRkJPMVZCUVVFc2FVTkJRVUU3UlVGRFlTeHBRa0ZCUVR0RFZuTjJRblpDTzBGVmNuWkNVenRGUVVOU0xHTkJRVUU3UTFaMWRrSkVPMEZYZW5kQ1JEdEZRVU5GTEcxQ1FVRkJPMFZCUTBFc1YwRkJRVHRGUVVOQkxHbENRVUZCTzBOWU1uZENSRHRCVjNwM1FrTTdSVUZEUlN4alFVRkJPME5ZTW5kQ1NEdEJWM3AzUWtjN096dEZRVWRGTEZsQlFVRTdSVUZEUVN4elFrRkJRVHREV0RKM1FrdzdRVmQ0ZDBKSE8wVkJRMFVzWlVGQlFUdERXREIzUWt3N1FWZDBkMEpETzBWQlJVa3NjMEpCUVVFN1ExaDFkMEpNTzBGWGJIZENSenRGUVVORkxHdENRVUZCTzBOWWIzZENURHRCVjNSM1FrTTdSVUZOU1N4dFFrRkJRVHRGUVVOQkxGZEJRVUU3UlVGRFFTeFRRVUZCTzBWQlEwRXNiME5CUVVFN1ZVRkJRU3cwUWtGQlFUdEZRVU5CTEZkQlFVRTdRMWh0ZDBKTU8wRlpjbmxDUkR0RlFVTkZMRzFDUVVGQk8wVkJRMEVzV1VGQlFUdEZRVU5CTEU5QlFVRTdSVUZEUVN4UlFVRkJPMFZCUTBFc1ZVRkJRVHRGUVVOQkxGbEJRVUU3UlVGRFFTeGhRVUZCTzBWQlEwRXNLMEpCUVVFN1ZVRkJRU3gxUWtGQlFUdEZRVU5CTEcxQ1FVRkJPMFZCUTBFc2FVSkJRVUU3UTFwMWVVSkVPMEZaY25sQ1F6dEZRMUJ6UkN4M1EwRkJRVHRWUVVGQkxHZERRVUZCTzBWRVUzQkVMSEZDUVVGQk8wVkJRVUVzY1VKQlFVRTdSVUZCUVN4alFVRkJPMFZCUTBFc05rSkJRVUU3UlVGQlFTdzRRa0ZCUVR0TlFVRkJMREpDUVVGQk8xVkJRVUVzZFVKQlFVRTdSVUZEUVN4elFrRkJRVHROUVVGQkxHdENRVUZCTzBWQlEwRXNiVUpCUVVFN1JVRkRRU3haUVVGQk8wVkJRMEVzWVVGQlFUdEZRVU5CTEhWQ1FVRkJPMFZCUTBFc2EwTkJRVUU3VlVGQlFTd3dRa0ZCUVR0RlFVTkJMR2xDUVVGQk8wTmFkWGxDU0R0QldYQjVRa003T3p0RlFVZEZMRmxCUVVFN1JVRkRRU3dyUWtGQlFUdFZRVUZCTEhWQ1FVRkJPME5hYzNsQ1NEdEJXVzU1UWtNN08wVkJSVVVzY1VKQlFVRTdUVUZCUVN4bFFVRkJPME5hY1hsQ1NEdEJXV3g1UWtNN096dEZRVWRGTEdkQ1FVRkJPME5hYjNsQ1NEdEJXV3A1UWtNN08wVkJSVVVzYlVKQlFVRTdSVUZEUVN4WFFVRkJPMFZCUTBFc1pVRkJRVHRGUVVOQkxHRkJRVUU3UlVGRFFTeHJRa0ZCUVR0RlFVTkJMR2xDUVVGQk8wTmFiWGxDU0R0QldXaDVRa003UlVGRFJTeG5Ra0ZCUVR0RlFVTkJMR2xDUVVGQk8wVkJRMEVzWlVGQlFUdEZRVU5CTEN0Q1FVRkJPMVZCUVVFc2RVSkJRVUU3UlVGRFFTeHBRMEZCUVR0RFdtdDVRa2c3UVZrdmVFSkRPMFZCUTBVc2JVSkJRVUU3UlVGRFFTeFhRVUZCTzBWQlEwRXNVMEZCUVR0RlFVTkJMRmxCUVVFN1JVRkRRU3haUVVGQk8wVkJRMEVzWVVGQlFUdEZRVU5CTEd0Q1FVRkJPMFZCUTBFc1dVRkJRVHRGUVVOQkxHZENRVUZCTzBWQlEwRXNiVUpCUVVFN1JVRkRRU3huUWtGQlFUdEZRVU5CTEc5RFFVRkJPMVZCUVVFc05FSkJRVUU3UlVGRFFTeHBRa0ZCUVR0RFdtbDVRa2c3UVZrNWVVSkRPMFZCWjBKSkxHMUNRVUZCTzBWQlEwRXNWMEZCUVR0RlFVTkJMRTlCUVVFN1JVRkRRU3hSUVVGQk8wTmFhWGxDVER0QldUbDRRa2M3UlVGRFJTeFpRVUZCTzBOYVozbENURHRCV1RWNFFrTTdSVUZEUlN4dlFrRkJRVHROUVVGQkxGbEJRVUU3VlVGQlFTeFJRVUZCTzBWQlEwRXNaVUZCUVR0RFdqaDRRa2c3UVZrMWVFSkhPMFZCUTBVc2FVSkJRVUU3UTFvNGVFSk1PMEZaTVhoQ1F6dEZRVU5GTEdWQlFVRTdSVUZEUVN4clFrRkJRVHRGUVVOQkxHbENRVUZCTzBOYU5IaENTRHRCV1hwNFFrTTdSVUZEUlN4WlFVRkJPMFZCUTBFc2JVSkJRVUU3UlVGRFFTeFhRVUZCTzBWQlEwRXNUMEZCUVR0RlFVTkJMRkZCUVVFN1JVRkRRU3haUVVGQk8wVkJRMEVzWVVGQlFUdEZRVU5CTEhWQ1FVRkJPMFZCUTBFc1lVRkJRVHRGUVVOQkxHbENRVUZCTzBOYU1uaENTRHRCV1hKNFFrczdPMFZCUTBVc1lVRkJRVHREV25kNFFsQTdRVmx5ZUVKTE96dEZRVU5GTEdGQlFVRTdRMXAzZUVKUU8wRlpjbmhDU3pzN1JVRkRSU3hoUVVGQk8wTmFkM2hDVUR0QldYSjRRa3M3TzBWQlEwVXNZVUZCUVR0RFduZDRRbEE3UVZseWVFSkxPenRGUVVORkxHRkJRVUU3UTFwM2VFSlFPMEZaY25oQ1N6czdSVUZEUlN4aFFVRkJPME5hZDNoQ1VEdEJXVzU0UWtNN1JVRkRSU3dyUWtGQlFUdERXbkY0UWtnN1FWbHFlRUpQTzBWQlEwVXNZMEZCUVR0RFdtMTRRbFE3UVZrNWQwSlBPMFZCUTBVc1kwRkJRVHREV21kNFFsUTdRVmt6ZDBKUE8wVkJRMFVzWTBGQlFUdERXalozUWxRN1FWbDRkMEpQTzBWQlEwVXNZMEZCUVR0RFdqQjNRbFE3UVZseWQwSlBPMFZCUTBVc1kwRkJRVHREV25WM1FsUTdRVmxzZDBKUE8wVkJRMFVzWTBGQlFUdERXbTkzUWxRN1FWazVka0pETzBWQlEwVXNaME5CUVVFN1ExcG5kMEpJTzBGWk5YWkNUenRGUVVORkxHRkJRVUU3UTFvNGRrSlVPMEZaZW5aQ1R6dEZRVU5GTEdGQlFVRTdRMW95ZGtKVU8wRlpkSFpDVHp0RlFVTkZMR0ZCUVVFN1ExcDNka0pVTzBGWmJuWkNUenRGUVVORkxHRkJRVUU3UTFweGRrSlVPMEZaYUhaQ1R6dEZRVU5GTEdGQlFVRTdRMXByZGtKVU8wRlpOM1ZDVHp0RlFVTkZMR0ZCUVVFN1Exb3JkVUpVTzBGWmVuVkNRenM3UlVGRlJTeFJRVUZCTzBWQlEwRXNXVUZCUVR0RFdqSjFRa2c3UVZsNGRVSkxPenRGUVVORkxHTkJRVUU3UTFveWRVSlFPMEZaZUhWQ1N6czdSVUZEUlN4alFVRkJPME5hTW5WQ1VEdEJXWGgxUWtzN08wVkJRMFVzWTBGQlFUdERXakoxUWxBN1FWbDRkVUpMT3p0RlFVTkZMR05CUVVFN1Exb3lkVUpRTzBGWmVIVkNTenM3UlVGRFJTeGpRVUZCTzBOYU1uVkNVRHRCV1hoMVFrczdPMFZCUTBVc1kwRkJRVHREV2pKMVFsQTdRVmwwZFVKRE8wVkJRMFVzYVVOQlFVRTdRMXAzZFVKSU8wRlpjSFZDVHp0RlFVTkZMRmxCUVVFN1ExcHpkVUpVTzBGWmFuVkNUenRGUVVORkxGbEJRVUU3UTFwdGRVSlVPMEZaT1hSQ1R6dEZRVU5GTEZsQlFVRTdRMXBuZFVKVU8wRlpNM1JDVHp0RlFVTkZMRmxCUVVFN1ExbzJkRUpVTzBGWmVIUkNUenRGUVVORkxGbEJRVUU3UTFvd2RFSlVPMEZaY25SQ1R6dEZRVU5GTEZsQlFVRTdRMXAxZEVKVU8wRlphblJDUXp0RlFVTkZMR0ZCUVVFN1JVRkRRU3c0UWtGQlFUdERXbTEwUWtnN1FWa3ZjMEpQTzBWQlEwVXNaVUZCUVR0RFdtbDBRbFE3UVZrMWMwSlBPMFZCUTBVc1pVRkJRVHREV2poelFsUTdRVmw2YzBKUE8wVkJRMFVzWlVGQlFUdERXakp6UWxRN1FWbDBjMEpQTzBWQlEwVXNaVUZCUVR0RFduZHpRbFE3UVZsdWMwSlBPMFZCUTBVc1pVRkJRVHREV25GelFsUTdRVmxvYzBKUE8wVkJRMFVzWlVGQlFUdERXbXR6UWxRN1FWazFja0pETzBWQlEwVXNiMEpCUVVFN1JVRkRRU3dyUWtGQlFUdERXamh5UWtnN1FWazFja0pITzBWQlEwVXNaMEpCUVVFN1ExbzRja0pNTzBGWk5YSkNTenRGUVVORkxGTkJRVUU3UTFvNGNrSlFPMEZaTTNKQ1N6dEZRVU5GTEZGQlFVRTdRMW8yY2tKUU8wRlpNWEpDU3p0RlFVTkZMRTlCUVVFN1ExbzBja0pRTzBGWmVuSkNTenRGUVVORkxGVkJRVUU3UTFveWNrSlFPMEZaY0hKQ1N6czdSVUZGUlN4NVFrRkJRVHRGUVVOQkxGTkJRVUU3UlVGRFFTeHZRMEZCUVR0VlFVRkJMRFJDUVVGQk8wTmFjM0pDVUR0QldXNXlRa3M3TzBWQlJVVXNkMEpCUVVFN1JVRkRRU3hWUVVGQk8wVkJRMEVzYjBOQlFVRTdWVUZCUVN3MFFrRkJRVHREV25GeVFsQTdRVmxvY2tKVE8wVkJRMFVzVjBGQlFUdERXbXR5UWxnN1FWa3ZjVUpUTzBWQlEwVXNWVUZCUVR0RFdtbHlRbGc3UVZrNWNVSlRPMFZCUTBVc1UwRkJRVHREV21keVFsZzdRVmszY1VKVE8wVkJRMFVzV1VGQlFUdERXaXR4UWxnN1FWbDBjVUpMT3p0RlFVVkZMR0ZCUVVFN1JVRkRRU3cyUWtGQlFUdERXbmR4UWxBN1FWbHVjVUpETzBWQlEwVXNWMEZCUVR0RFduRnhRa2c3UVdONmEwTkVPMFZCUTBVc2JVSkJRVUU3UlVGRFFTeFhRVUZCTzBWQlEwRXNWVUZCUVR0RlFVTkJMSE5EUVVGQk8wVkJRMEVzWlVGQlFUdERaREpyUTBRN1FXTjZhME5ETzBWQlEwVXNjVU5CUVVFN1JVRkJRU3cyUWtGQlFUdERaREpyUTBnN1FXTjRhME5ETzBWQlEwVXNaVUZCUVR0RlFVTkJMR0ZCUVVFN1JVRkRRU3hyUWtGQlFUdEZRVU5CTEdkQ1FVRkJPMFZCUTBFc2FVTkJRVUU3UlVGRFFTeG5Ra0ZCUVR0RlFVTkJMR2xDUVVGQk8wVkJRMEVzYVVKQlFVRTdRMlF3YTBOSU8wRmpkbXREUXp0RlFVTkZMRzFDUVVGQk8wVkJRMEVzVjBGQlFUdEZRVU5CTEZWQlFVRTdSVUZEUVN4cFFrRkJRVHREWkhsclEwZzdRV04wYTBORE96czdSVUZIUlN4dFFrRkJRVHRGUVVOQkxGZEJRVUU3UlVGRFFTeFZRVUZCTzBWQlEwRXNWMEZCUVR0RlFVTkJMSE5DUVVGQk8wVkJRMEVzYVVKQlFVRTdRMlIzYTBOSU8wRmpjbXREUXp0RlFVTkZMR2xDUVVGQk8wTmtkV3REU0R0QlkzQnJRME03UlVGRFJTeHJRa0ZCUVR0RFpITnJRMGc3UVdOdWEwTkRPMFZCUTBVc1ZVRkJRVHRGUVVOQkxHdENRVUZCTzBWQlEwRXNaMEpCUVVFN1JVRkRRU3hwUWtGQlFUdERaSEZyUTBnN1FXTnNhME5ETzBWQlEwVXNiVUpCUVVFN1JVRkRRU3hYUVVGQk8wVkJRMEVzVDBGQlFUdEZRVU5CTEZGQlFVRTdSVUZEUVN4WlFVRkJPMFZCUTBFc1lVRkJRVHRGUVVOQkxEQkNRVUZCTzBWQlEwRXNLMEpCUVVFN1JVRkRRU3hyUTBGQlFUdFZRVUZCTERCQ1FVRkJPMFZCUTBFc0swSkJRVUU3VlVGQlFTeDFRa0ZCUVR0RlFVTkJMR2xDUVVGQk8wTmtiMnREU0R0QlkycHJRME03UlVOcVJUWkNMRzlDUVVGQk8wVkJRMllzZDBKQlFVRTdSVUZEUnl4cFFrRkJRVHRGUkdsRlppeGxRVUZCTzBWQlEwRXNhVUpCUVVFN1EyUnhhME5JTzBGamJtdERSenM3TzBWQlIwVXNjMEpCUVVFN1JVRkRRU3haUVVGQk8wTmtjV3REVER0QlkyeHJRMGM3UlVGRFJTeGxRVUZCTzBOa2IydERURHRCWTJoclEwTTdSVUZEUlN4eFFrRkJRVHREWkd0clEwZzdRV00zYWtOTE96czdSVUZIUlN4bFFVRkJPMFZCUTBFc2EwSkJRVUU3UTJRcmFrTlFPMEZqTVdwRFF6czdSVUZGUlN4eFFrRkJRVHRGUVVGQkxIRkNRVUZCTzBWQlFVRXNZMEZCUVR0RlFVTkJMSE5DUVVGQk8wMUJRVUVzYTBKQlFVRTdSVUZEUVN3MlFrRkJRVHRGUVVGQkxEaENRVUZCTzAxQlFVRXNNa0pCUVVFN1ZVRkJRU3gxUWtGQlFUdEZRVU5CTEN0Q1FVRkJPMFZCUTBFc1QwRkJRVHRGUVVOQkxHbENRVUZCTzBOa05HcERTRHRCWTNwcVEwczdPenM3UlVGRlJTd3JRa0ZCUVR0VlFVRkJMSFZDUVVGQk8wTmtObXBEVUR0Qll6RnFRMHM3TzBWQlEwVXNjVUpCUVVFN1RVRkJRU3hsUVVGQk8wTmtObXBEVUR0Qll6RnFRMHM3TzBWQlEwVXNiMEpCUVVFN1RVRkJRU3haUVVGQk8xVkJRVUVzVVVGQlFUdEZRVU5CTEdWQlFVRTdRMlEyYWtOUU8wRmplR3BEUXp0RlFVTkZMR2xDUVVGQk8wVkJRMEVzZVVOQlFVRTdRMlF3YWtOSU8wRmpkbXBEUXp0RlFVTkZMR2RDUVVGQk8wVkJRMEVzYVVKQlFVRTdRMlI1YWtOSU8wRmpkR3BEUXp0RlFVTkZMR05CUVVFN1EyUjNha05JTzBGamNtcERRenRGUVVORkxGTkJRVUU3UlVGRFFTeHBRa0ZCUVR0RFpIVnFRMGc3UVVGRFJEczdPenM3UjBGTFJ6dEJRVU5JTEhOQ1FVRnpRanRCUVVOMFFpeHpRa0ZCYzBJN1FVRkRkRUlzYzBKQlFYTkNPMEZCUTNSQ096czdPenRIUVV0SE8wRkJRMGc3T3pzN08wZEJTMGM3UVVGRFNDdzBRa0ZCTkVJN1FXZENNM1JETVVJN1JVRkRSU3huUWtGQlFUdEZRVU5CTEU5QlFVRTdSVUZEUVN4UlFVRkJPMFZCUTBFc1YwRkJRVHRGUVVOQkxGbEJRVUU3UlVGRFFTeFpRVUZCTzBWQlEwRXNNRUpCUVVFN1JVRkRRU3hYUVVGQk8wVkJRMEVzSzBKQlFVRTdWVUZCUVN4MVFrRkJRVHRGUVVOQkxHdEVRVUZCTzFWQlFVRXNNRU5CUVVFN1JVRkRRU3gxUTBGQlFUdERhRUkyZEVOSU8wRm5RakYwUTBNN1JVaFdjMFFzY1VOQlFVRTdWVUZCUVN3MlFrRkJRVHRGUjFsd1JDeHBRa0ZCUVR0RlFVTkJMR3RDUVVGQk8wVkJRMEVzWlVGQlFUdEZRVU5CTEN0Q1FVRkJPMVZCUVVFc2RVSkJRVUU3UlVGRFFTeDFRa0ZCUVR0RlFVTkJMR2xDUVVGQk8wTm9RalIwUTBnN1FXZENlblJEUXp0RlFVTkZMR2xDUVVGQk8wVkJRMEVzYlVKQlFVRTdSVUZEUVN3eVRrRkJRVHRGUVVOQkxHOUNRVUZCTzBWQlEwRXNiVUpCUVVFN1JVRkRRU3hwUWtGQlFUdEZRVU5CTEdsQ1FVRkJPME5vUWpKMFEwZzdRV2RDZUhSRFF6dEZRVVZKTEdOQlFVRTdRMmhDZVhSRFREdEJaMEp5ZEVORE8wVkJRMFVzWTBGQlFUdERhRUoxZEVOSU8wRm5RbkowUTBjN1JVRkRSU3g1UWtGQlFUdERhRUoxZEVOTU8wRm5RbkIwUTA4N1JVRkRSU3hqUVVGQk8wTm9Rbk4wUTFRN1FXZENhSFJEUXp0RlFVTkZMR1ZCUVVFN1JVRkRRU3huUWtGQlFUdEZRVU5CTEZkQlFVRTdSVUZEUVN4UFFVRkJPMFZCUTBFc1VVRkJRVHRGUVVOQkxGbEJRVUU3UlVGRFFTeGhRVUZCTzBWQlEwRXNWVUZCUVR0RlFVTkJMQ3RDUVVGQk8xVkJRVUVzZFVKQlFVRTdSVUZEUVN4cFFrRkJRVHRGUVVOQkxEQkNRVUZCTzBWQlEwRXNlVU5CUVVFN1JVRkRRU3hwUWtGQlFUdERhRUpyZEVOSU8wRm5Ramx6UTBRN1JVRkRSVHRKUVVORkxGZEJRVUU3UjJoQ1ozUkRSRHREUVVOR08wRm5RbTUwUTBRN1JVRkRSVHRKUVVORkxGZEJRVUU3UjJoQ1ozUkRSRHREUVVOR08wRm5RamR6UTBRN1JVRkZTVHRKUVVORkxHbENRVUZCTzBkb1FqaHpRMGc3UldkQ0wzTkRRenRKUVVsSkxIRkNRVUZCTzBsQlFVRXNjVUpCUVVFN1NVRkJRU3hqUVVGQk8wbEJRMEVzSzBKQlFVRTdTVUZCUVN3NFFrRkJRVHRSUVVGQkxIZENRVUZCTzFsQlFVRXNiMEpCUVVFN1NVRkRRU3h6UWtGQlFUdFJRVUZCTEd0Q1FVRkJPMGxCUTBFc01FSkJRVUU3VVVGQlFTeDFRa0ZCUVR0WlFVRkJMRzlDUVVGQk8wbEJRMEVzTUVKQlFVRTdVVUZCUVN4cFFrRkJRVHRKUVVOQkxGVkJRVUU3U1VGRFFTeFRRVUZCTzBsQlEwRXNjVU5CUVVFN1dVRkJRU3cyUWtGQlFUdEpRVU5CTEZsQlFVRTdTVUZEUVN4aFFVRkJPMGxCUTBFc0swSkJRVUU3V1VGQlFTeDFRa0ZCUVR0SlFVTkJMREpDUVVGQk8wbEJRMEVzZFVKQlFVRTdTVUZEUVN4blFrRkJRVHRIYUVJNGMwTk1PMFZuUWpWelEwczdTVU01Ums0c2FVSkJRVUU3U1VSblIxRXNiMEpCUVVFN1VVRkJRU3haUVVGQk8xbEJRVUVzVVVGQlFUdEpRVU5CTEdGQlFVRTdTVUZEUVN4NVFrRkJRVHRaUVVGQkxHbENRVUZCTzBkb1FqaHpRMUE3UldkQ01YTkRSenRKUVVORkxGZEJRVUU3U1VGRFFTeDFRa0ZCUVR0SlFVTkJMQ3RDUVVGQk8xbEJRVUVzZFVKQlFVRTdSMmhDTkhORFREdEZaMEo2YzBOSE8wbEJRMFVzYlVKQlFVRTdTVUZEUVN4WFFVRkJPMGxCUTBFc1ZVRkJRVHRKUVVOQkxGZEJRVUU3U1VGRFFTeGhRVUZCTzBsQlEwRXNlVUpCUVVFN1dVRkJRU3hwUWtGQlFUdEpRVU5CTEdsQ1FVRkJPMGRvUWpKelEwdzdSV2RDZUhORFJ6dEpSSFpJZVVJc2IwSkJRVUU3U1VGRFppeDNRa0ZCUVR0SlEzZElVaXh0UWtGQlFUdEpRVU5CTEZkQlFVRTdTVUZEUVN4UFFVRkJPMGxCUTBFc1VVRkJRVHRKUVVOQkxGVkJRVUU3U1VGRFFTeFpRVUZCTzBsQlEwRXNZVUZCUVR0SlFVTkJMR3RDUVVGQk8wbEJRMEVzT0VKQlFVRTdTVUZEUVN4cFFrRkJRVHRKUVVOQkxHbENRVUZCTzBsQlEwRXNkVUpCUVVFN1NVRkRRU3hwUWtGQlFUdEhhRUl5YzBOTU8wVm5Rbmh6UTBjN1NVRkRSU3hsUVVGQk8wbEJRMEVzTUVKQlFVRTdTVUZEUVN4clFrRkJRVHRKUVVOQkxDdERRVUZCTzBsQlEwRXNiVUpCUVVFN1NVRkRRU3h0UWtGQlFUdEhhRUl3YzBOTU8wVm5RbWgwUTBjN1NVRlRTU3hYUVVGQk8wbEJRMEVzYTBSQlFVRTdXVUZCUVN3d1EwRkJRVHRKUVVOQkxEWkRRVUZCTzBsQlEwRXNaVUZCUVR0SGFFSXdjME5RTzBOQlEwWTdRV2RDY0hORFJEdEZRVU5GT3p0SmFFSjFjME5GTEdWQlFXVTdTV2RDY0hORFppeG5Ra0ZCUVR0SmFFSnpjME5CTEcxQ1FVRnRRanRKWjBKd2MwTnVRaXgxUWtGQlFUdEpRVU5CTEZsQlFVRTdTVUZEUVN3eVFrRkJRVHRIYUVKemMwTkVPMFZCUTBRc1dVRkJXVHRGWjBKdWMwTmFPenM3U1VGSFJTeHpRMEZCUVR0SlFVTkJMR1ZCUVVFN1IyaENjWE5EUkR0RlFVTkVMRmxCUVZrN1JXZENiSE5EV2pzN1NVRkZSU3g1UWtGQlFUdEhhRUp2YzBORU8wVkJRMFFzZDBKQlFYZENPMFZuUW1welEzaENPMGxCUTBVc1dVRkJRVHRKUVVOQkxEQkNRVUZCTzBkb1FtMXpRMFE3UldkQ2FuTkRSRHM3U1VGRlJTd3dRa0ZCUVR0SlFVTkJMR3RDUVVGQk8wZG9RbTF6UTBRN1JXZENMM0pEUXpzN1NXaENhM05EUVN4clFrRkJhMEk3U1dkQ0wzSkRhRUlzZVVKQlFVRTdSMmhDYVhORFNEdEZaMEk1Y2tORE8wbEJRMFVzTUVKQlFVRTdTVUZEUVN4cFFrRkJRVHRKYUVKbmMwTkdMR0ZCUVdFN1NVRkRZaXhoUVVGaE8wbEJRMklzZDBKQlFYZENPMGxCUTNoQ0xEUkNRVUUwUWp0SFFVTTNRanRGWjBKc2MwTkhPMGxCUTBVc2FVTkJRVUU3U1VGRFFTdzRRa0ZCUVR0SlFVTkJMREpDUVVGQk8wZG9RbTl6UTB3N1JXZENhSE5EUnp0SlFVTkZMRGhDUVVGQk8wbEJRMEVzZDBKQlFVRTdTVUZEUVN4elFrRkJRVHRKUVVOQkxIVkNRVUZCTzBsQlEwRXNORUpCUVVFN1IyaENhM05EVER0RlowSTVja05ITzBsQlEwVXNlVUpCUVVFN1IyaENaM05EVER0RlowSTFja05ITzBsQlEwVXNlVUpCUVVFN1dVRkJRU3hwUWtGQlFUdEhhRUk0Y2tOTU8wVm5RbmgwUTBNN1NVRTRRa2tzZDBKQlFVRTdTVUZEUVN4clEwRkJRVHRKUVVOQkxEaENRVUZCTzBkb1FqWnlRMHc3UldkQ04zUkRRenM3U1VGeFEwa3NhME5CUVVFN1IyaENOSEpEVER0RlowSnFkVU5ET3pzN1NVRXlRMGtzYlVOQlFVRTdUMEZCUVN4blEwRkJRVHRaUVVGQkxHOUNRVUZCTzBkb1FqSnlRMHc3UldkQ2RuSkRSenRKUVVORkxIbENRVUZCTzBkb1FubHlRMHc3UTBGRFJqdEJRVU5FTEd0RVFVRnJSRHRCYTBKeU4wTnNSRHRGUVVORkxHZENRVUZCTzBWQlEwRXNaVUZCUVR0RlFVTkJMRlZCUVVFN1JVRkRRU3hyUTBGQlFUdFZRVUZCTERCQ1FVRkJPMFZCUTBFc2FVSkJRVUU3UTJ4Q2RUZERSRHRCYTBKeU4wTkRPMFZNUm5ORUxIZERRVUZCTzFWQlFVRXNaME5CUVVFN1JVdEpjRVFzYlVKQlFVRTdSVUZEUVN4WFFVRkJPMFZCUTBFc1lVRkJRVHRGUVVOQkxGbEJRVUU3UlVGRFFTeGhRVUZCTzBWQlEwRXNNRUpCUVVFN1JVRkRRU3h0UWtGQlFUdEZRVU5CTEN0Q1FVRkJPMVZCUVVFc2RVSkJRVUU3UlVGRFFTeDFRa0ZCUVR0RlFVTkJMR2RDUVVGQk8wVkJRMEVzYlVKQlFVRTdSVUZEUVN4WlFVRkJPMFZCUTBFc09FTkJRVUU3UlVGQlFTeHpRMEZCUVR0RlFVTkJMR2xDUVVGQk8wTnNRblUzUTBnN1FXdENjamREUnp0RlFVTkZMR1ZCUVVFN1JVRkRRU3h6UWtGQlFUdEZRVU5CTEN0Q1FVRkJPMVZCUVVFc2RVSkJRVUU3UTJ4Q2RUZERURHRCYTBKd04wTkhPMFZCUTBVc1kwRkJRVHREYkVKek4wTk1PMEZyUW1vM1EwYzdPenRGUVVkRkxGbEJRVUU3UlVGRFFTeHpRa0ZCUVR0RGJFSnROME5NTzBGclFtZzNRMGM3UlVGRFJTeGxRVUZCTzBOc1FtczNRMHc3UVd0Q09UWkRRenRGUVVORkxHMUNRVUZCTzBWQlEwRXNWMEZCUVR0RlFVTkJMRk5CUVVFN1JVRkRRU3hWUVVGQk8wVkJRMEVzV1VGQlFUdEZRVU5CTEdGQlFVRTdSVUZEUVN4NVEwRkJRVHRWUVVGQkxHbERRVUZCTzBWQlEwRXNiVUpCUVVFN1JVRkRRU3hwUWtGQlFUdERiRUpuTjBOSU8wRnJRak0yUTBzN1JVRkRSU3haUVVGQk8wVkJRMEVzTUVKQlFVRTdSVUZEUVN4elFrRkJRVHREYkVJMk5rTlFPMEZyUWpNMlEwODdSVUZEUlN4WlFVRkJPME5zUWpZMlExUTdRV3RDZGpaRFN6czdPMFZCUjBVc1dVRkJRVHREYkVKNU5rTlFPMEZyUW00MlEwYzdSVUZEUlN4dlFrRkJRVHREYkVKeE5rTk1PMEZyUWprMVEwczdPenM3T3pzN08wVkJTVVVzYjBKQlFVRTdSVUZEUVN4WlFVRkJPMFZCUTBFc2JVSkJRVUU3UTJ4Q2J6WkRVRHRCYTBKc05rTlBPenM3T3pzN096dEZRVU5GTEZsQlFVRTdSVUZEUVN4dFFrRkJRVHREYkVJeU5rTlVPMEZyUW5ZMlEwczdPMFZCUTBVc01FSkJRVUU3UTJ4Q01EWkRVRHRCYTBKeU5rTkRPenRGUVVWRkxGVkJRVUU3UlVGRFFTeHZRMEZCUVR0VlFVRkJMRFJDUVVGQk8wTnNRblUyUTBnN1FXdENNVFpEUXpzN1JVRk5TU3h6UWtGQlFUdERiRUozTmtOTU8wRnJRbkEyUTBNN1JVRkRSU3hWUVVGQk8wTnNRbk0yUTBnN1FXdENjRFpEUnp0RlFVTkZMRmRCUVVFN1EyeENjelpEVER0QmEwSnNOa05ETzBWQlEwVXNZVUZCUVR0RGJFSnZOa05JTzBGclFtdzJRMGM3UlVGRFJTeGpRVUZCTzBOc1FtODJRMHc3UVd0Q2FEWkRRenM3UlVGRlJTeHZRMEZCUVR0VlFVRkJMRFJDUVVGQk8wVkJRMEVzV1VGQlFUdERiRUpyTmtOSU8wRnJRaTgxUTBNN1JVRkRSU3hUUVVGQk8wVkJRMEVzV1VGQlFUdERiRUpwTmtOSU8wRnJRaTgxUTBjN1JVRkRSU3hoUVVGQk8wTnNRbWsyUTB3N1FXdENOelZEUXp0RlFVTkZMRk5CUVVFN1JVRkRRU3hYUVVGQk8wTnNRaXMxUTBnN1FXdENOelZEUnp0RlFVTkZMRmxCUVVFN1EyeENLelZEVER0QmEwSjBOVU5MT3pzN08wVkJRMFVzWTBGQlFUdERiRUl5TlVOUU8wRnRRbXByUkVRN1JVWkpSU3h0UWtGQlFUdEZTa0Z6UkN4M1EwRkJRVHRWUVVGQkxHZERRVUZCTzBWTlJIUkVMR2RDUVVGQk8wVkJRMEVzWTBGQlFUdEZRVU5CTEdGQlFVRTdSVUZEUVN4WFFVRkJPMFZCUTBFc1ZVRkJRVHRGUVVOQkxHRkJRVUU3UlVGRFFTeFZRVUZCTzBWQlEwRXNaMEpCUVVFN1JVRkRRU3hyUWtGQlFUdEZRVU5CTEdkQ1FVRkJPMFZCUTBFc2RVSkJRVUU3UlVGRFFTeFpRVUZCTzBWQlEwRXNlVU5CUVVFN1JVRkJRU3hwUTBGQlFUdEZRVU5CTEc5RFFVRkJPMVZCUVVFc05FSkJRVUU3UlVGRFFTeHBRa0ZCUVR0RGJrSnRhMFJFTzBGdFFtcHJSRU03UlVwb1FqWkNMRzlDUVVGQk8wVkJRMllzZDBKQlFVRTdSVWxwUWxvc1ZVRkJRVHRGUVVOQkxHbENRVUZCTzBWQlEwRXNZVUZCUVR0RlFVTkJMR3RDUVVGQk8wVkJRMEVzWjBKQlFVRTdSVUZEUVN4WlFVRkJPMFZCUTBFc2FVSkJRVUU3UTI1Q2IydEVTRHRCYlVKcWEwUkRPenRGUVVWRkxHMUNRVUZCTzBWQlEwRXNWMEZCUVR0RlFVTkJMRTlCUVVFN1JVRkRRU3haUVVGQk8wVkJRMEVzWVVGQlFUdEZRVU5CTEd0Q1FVRkJPMFZCUTBFc2JVSkJRVUU3UlVGRFFTeHBRa0ZCUVR0RGJrSnRhMFJJTzBGdFFtaHJSRU03UlVGRFJTeFJRVUZCTzBWQlEwRXNXVUZCUVR0RGJrSnJhMFJJTzBGdFFuQnJSRU03UlVGTFNTeHRRa0ZCUVR0RlFVTkJMRmRCUVVFN1JVRkRRU3hUUVVGQk8wVkJRMEVzVlVGQlFUdEZRVU5CTEhsRFFVRkJPMVZCUVVFc2FVTkJRVUU3UTI1Q2EydEVURHRCYlVJNWFrUkRPMFZCUTBVc1UwRkJRVHRGUVVOQkxHZENRVUZCTzBWQlEwRXNXVUZCUVR0RGJrSm5hMFJJTzBGdFFtNXJSRU03UlVGTlNTeHRRa0ZCUVR0RlFVTkJMRmRCUVVFN1JVRkRRU3hUUVVGQk8wVkJRMEVzVlVGQlFUdEZRVU5CTEhsRFFVRkJPMVZCUVVFc2FVTkJRVUU3UTI1Q1oydEVURHRCYlVJM2FrUkhPMFZCUTBVc1dVRkJRVHREYmtJcmFrUk1PMEZ0UWpOcVJFTTdSVUZGU1N3d1FrRkJRVHREYmtJMGFrUk1PMEZ0UW5ocVJFTTdSVUZGU1N3d1FrRkJRVHREYmtKNWFrUk1PMEZ0UW5KcVJFTTdSVUZGU1N3d1FrRkJRVHREYmtKemFrUk1PMEZ0UW14cVJFTTdSVUZGU1N3d1FrRkJRVHREYmtKdGFrUk1PMEZ0UWk5cFJFTTdSVUZEUlN4cFFrRkJRVHRGUVVOQkxIVkNRVUZCTzBOdVFtbHFSRWc3UVcxQ09XbEVTenRGUVVORkxDdENRVUZCTzBWQlEwRXNNRUpCUVVFN1EyNUNaMnBFVUR0QmJVSTNhVVJMTzBWQlEwVXNLMEpCUVVFN1JVRkRRU3d3UWtGQlFUdERia0lyYVVSUU8wRnRRalZwUkVzN1JVRkRSU3dyUWtGQlFUdEZRVU5CTERCQ1FVRkJPME51UWpocFJGQTdRVzFDTTJsRVN6dEZRVU5GTEN0Q1FVRkJPMFZCUTBFc01FSkJRVUU3UTI1Q05tbEVVRHRCYlVKdWEwUkRPMFZCTWtKSkxGTkJRVUU3UlVGRFFTeGpRVUZCTzBOdVFqSnBSRXc3UVcxQ2RtdEVRenRGUVN0Q1RTeGpRVUZCTzBOdVFqSnBSRkE3UVcxQ2RHbEVRenRGUVVORkxHbENRVUZCTzBWQlEwRXNaMEpCUVVFN1EyNUNkMmxFU0R0QmJVSnlhVVJMTzBWQlJVa3NaVUZCUVR0RGJrSnphVVJVTzBGdFFteHBSRXM3UlVGRlNTeGxRVUZCTzBOdVFtMXBSRlE3UVcxQ0wyaEVTenRGUVVWSkxHVkJRVUU3UTI1Q1oybEVWRHRCYlVJMWFFUkxPMFZCUlVrc1pVRkJRVHREYmtJMmFFUlVPMEZ0UW5ScVJFTTdSVUVyUWtrc2RVSkJRVUU3UTI1Q01HaEVURHRCYlVKMGFFUkRPMFZHY0V0QkxHOUNRVUZCTzBOcVFqWnlSRVE3UVcxQ2NtaEVTenRGUVVORkxHbENRVUZCTzBWQlEwRXNaMEpCUVVFN1EyNUNkV2hFVUR0QmJVSjZhRVJMTzBWR2VFdEtMRzlDUVVGQk8wVkZPRXRSTEZWQlFVRTdSVUZEUVN4WFFVRkJPMFZCUTBFc1dVRkJRVHRGUVVOQkxHRkJRVUU3UlVGRFFTeHJRa0ZCUVR0RGJrSjFhRVJVTzBGdFFuQm9SRTg3UlVGRFJTeHBRa0ZCUVR0RlFVTkJMSFZDUVVGQk8wTnVRbk5vUkZRN1FXMUNiR2hFU3p0RlFVTkZMR2xDUVVGQk8wVkJRMEVzZFVKQlFVRTdRMjVDYjJoRVVEdEJiVUpzYUVSUE8wVkJRMFVzYVVKQlFVRTdSVUZEUVN4blFrRkJRVHREYmtKdmFFUlVPMEZ0UWpsblJFTTdSVUZEUlN4cFFrRkJRVHRGUVVOQkxIVkNRVUZCTzBOdVFtZG9SRWc3UVcxQ04yZEVTenRGUVVORkxHbENRVUZCTzBWQlEwRXNkVUpCUVVFN1EyNUNLMmRFVUR0QmJVSTFaMFJMTzBWQlEwVXNhVUpCUVVFN1JVRkRRU3gxUWtGQlFUdERia0k0WjBSUU8wRnRRbnBuUkVNN1JVRkRSU3hYUVVGQk8wTnVRakpuUkVnN1FXMUNlR2RFUXp0RlFVTkZMR05CUVVFN1EyNUNNR2RFU0R0QlFVTkVMREpDUVVFeVFqdEJiMEpvZGtRelFqdEZRVU5GTEZkQlFVRTdSVUZEUVN4WlFVRkJPMFZCUTBFc01rSkJRVUU3UTNCQ2EzWkVSRHRCYjBKb2RrUkRPMFZCUTBVc01rSkJRVUU3UTNCQ2EzWkVTRHRCYjBJNWRVUkhPMFZCUTBVc2MwTkJRVUU3UlVGRFFTd3lRa0ZCUVR0RGNFSm5ka1JNTzBGdlFqZDFSRWM3UlVGRFJTeHpRMEZCUVR0RlFVTkJMREpDUVVGQk8wTndRaXQxUkV3N1FXOUNOWFZFUnp0RlFVTkZMSE5EUVVGQk8wTndRamgxUkV3N1FXOUNNWFZFUXp0RlFVTkZMSE5EUVVGQk8wTndRalIxUkVnaUxDSm1hV3hsSWpvaVpHOWpjeTVqYzNNaUxDSnpiM1Z5WTJWelEyOXVkR1Z1ZENJNld5SXZLaUVnYm05eWJXRnNhWHBsTG1OemN5QjJPQzR3TGpFZ2ZDQk5TVlFnVEdsalpXNXpaU0I4SUdkcGRHaDFZaTVqYjIwdmJtVmpiMnhoY3k5dWIzSnRZV3hwZW1VdVkzTnpJQ292WEc0dktpQkViMk4xYldWdWRGeHVJQ0FnUFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwZ0tpOWNiaThxS2x4dUlDb2dNUzRnUTI5eWNtVmpkQ0IwYUdVZ2JHbHVaU0JvWldsbmFIUWdhVzRnWVd4c0lHSnliM2R6WlhKekxseHVJQ29nTWk0Z1VISmxkbVZ1ZENCaFpHcDFjM1J0Wlc1MGN5QnZaaUJtYjI1MElITnBlbVVnWVdaMFpYSWdiM0pwWlc1MFlYUnBiMjRnWTJoaGJtZGxjeUJwYmlCcFQxTXVYRzRnS2k5Y2JtaDBiV3dnZTF4dUlDQnNhVzVsTFdobGFXZG9kRG9nTVM0eE5UdGNiaUFnTHlvZ01TQXFMMXh1SUNBdGQyVmlhMmwwTFhSbGVIUXRjMmw2WlMxaFpHcDFjM1E2SURFd01DVTdYRzRnSUM4cUlESWdLaTljYm4xY2JpOHFJRk5sWTNScGIyNXpYRzRnSUNBOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBTQXFMMXh1THlvcVhHNGdLaUJTWlcxdmRtVWdkR2hsSUcxaGNtZHBiaUJwYmlCaGJHd2dZbkp2ZDNObGNuTXVYRzRnS2k5Y2JtSnZaSGtnZTF4dUlDQnRZWEpuYVc0NklEQTdYRzU5WEc0dktpcGNiaUFxSUZKbGJtUmxjaUIwYUdVZ1lHMWhhVzVnSUdWc1pXMWxiblFnWTI5dWMybHpkR1Z1ZEd4NUlHbHVJRWxGTGx4dUlDb3ZYRzV0WVdsdUlIdGNiaUFnWkdsemNHeGhlVG9nWW14dlkyczdYRzU5WEc0dktpcGNiaUFxSUVOdmNuSmxZM1FnZEdobElHWnZiblFnYzJsNlpTQmhibVFnYldGeVoybHVJRzl1SUdCb01XQWdaV3hsYldWdWRITWdkMmwwYUdsdUlHQnpaV04wYVc5dVlDQmhibVJjYmlBcUlHQmhjblJwWTJ4bFlDQmpiMjUwWlhoMGN5QnBiaUJEYUhKdmJXVXNJRVpwY21WbWIzZ3NJR0Z1WkNCVFlXWmhjbWt1WEc0Z0tpOWNibWd4SUh0Y2JpQWdabTl1ZEMxemFYcGxPaUF5WlcwN1hHNGdJRzFoY21kcGJqb2dNQzQyTjJWdElEQTdYRzU5WEc0dktpQkhjbTkxY0dsdVp5QmpiMjUwWlc1MFhHNGdJQ0E5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFNBcUwxeHVMeW9xWEc0Z0tpQXhMaUJCWkdRZ2RHaGxJR052Y25KbFkzUWdZbTk0SUhOcGVtbHVaeUJwYmlCR2FYSmxabTk0TGx4dUlDb2dNaTRnVTJodmR5QjBhR1VnYjNabGNtWnNiM2NnYVc0Z1JXUm5aU0JoYm1RZ1NVVXVYRzRnS2k5Y2JtaHlJSHRjYmlBZ1ltOTRMWE5wZW1sdVp6b2dZMjl1ZEdWdWRDMWliM2c3WEc0Z0lDOHFJREVnS2k5Y2JpQWdhR1ZwWjJoME9pQXdPMXh1SUNBdktpQXhJQ292WEc0Z0lHOTJaWEptYkc5M09pQjJhWE5wWW14bE8xeHVJQ0F2S2lBeUlDb3ZYRzU5WEc0dktpcGNiaUFxSURFdUlFTnZjbkpsWTNRZ2RHaGxJR2x1YUdWeWFYUmhibU5sSUdGdVpDQnpZMkZzYVc1bklHOW1JR1p2Ym5RZ2MybDZaU0JwYmlCaGJHd2dZbkp2ZDNObGNuTXVYRzRnS2lBeUxpQkRiM0p5WldOMElIUm9aU0J2WkdRZ1lHVnRZQ0JtYjI1MElITnBlbWx1WnlCcGJpQmhiR3dnWW5KdmQzTmxjbk11WEc0Z0tpOWNibkJ5WlNCN1hHNGdJR1p2Ym5RdFptRnRhV3g1T2lCdGIyNXZjM0JoWTJVc0lHMXZibTl6Y0dGalpUdGNiaUFnTHlvZ01TQXFMMXh1SUNCbWIyNTBMWE5wZW1VNklERmxiVHRjYmlBZ0x5b2dNaUFxTDF4dWZWeHVMeW9nVkdWNGRDMXNaWFpsYkNCelpXMWhiblJwWTNOY2JpQWdJRDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5SUNvdlhHNHZLaXBjYmlBcUlGSmxiVzkyWlNCMGFHVWdaM0poZVNCaVlXTnJaM0p2ZFc1a0lHOXVJR0ZqZEdsMlpTQnNhVzVyY3lCcGJpQkpSU0F4TUM1Y2JpQXFMMXh1WVNCN1hHNGdJR0poWTJ0bmNtOTFibVF0WTI5c2IzSTZJSFJ5WVc1emNHRnlaVzUwTzF4dWZWeHVMeW9xWEc0Z0tpQXhMaUJTWlcxdmRtVWdkR2hsSUdKdmRIUnZiU0JpYjNKa1pYSWdhVzRnUTJoeWIyMWxJRFUzTFZ4dUlDb2dNaTRnUVdSa0lIUm9aU0JqYjNKeVpXTjBJSFJsZUhRZ1pHVmpiM0poZEdsdmJpQnBiaUJEYUhKdmJXVXNJRVZrWjJVc0lFbEZMQ0JQY0dWeVlTd2dZVzVrSUZOaFptRnlhUzVjYmlBcUwxeHVZV0ppY2x0MGFYUnNaVjBnZTF4dUlDQmliM0prWlhJdFltOTBkRzl0T2lCdWIyNWxPMXh1SUNBdktpQXhJQ292WEc0Z0lIUmxlSFF0WkdWamIzSmhkR2x2YmpvZ2RXNWtaWEpzYVc1bE8xeHVJQ0F2S2lBeUlDb3ZYRzRnSUhSbGVIUXRaR1ZqYjNKaGRHbHZiam9nZFc1a1pYSnNhVzVsSUdSdmRIUmxaRHRjYmlBZ0x5b2dNaUFxTDF4dWZWeHVMeW9xWEc0Z0tpQkJaR1FnZEdobElHTnZjbkpsWTNRZ1ptOXVkQ0IzWldsbmFIUWdhVzRnUTJoeWIyMWxMQ0JGWkdkbExDQmhibVFnVTJGbVlYSnBMbHh1SUNvdlhHNWlMRnh1YzNSeWIyNW5JSHRjYmlBZ1ptOXVkQzEzWldsbmFIUTZJR0p2YkdSbGNqdGNibjFjYmk4cUtseHVJQ29nTVM0Z1EyOXljbVZqZENCMGFHVWdhVzVvWlhKcGRHRnVZMlVnWVc1a0lITmpZV3hwYm1jZ2IyWWdabTl1ZENCemFYcGxJR2x1SUdGc2JDQmljbTkzYzJWeWN5NWNiaUFxSURJdUlFTnZjbkpsWTNRZ2RHaGxJRzlrWkNCZ1pXMWdJR1p2Ym5RZ2MybDZhVzVuSUdsdUlHRnNiQ0JpY205M2MyVnljeTVjYmlBcUwxeHVZMjlrWlN4Y2JtdGlaQ3hjYm5OaGJYQWdlMXh1SUNCbWIyNTBMV1poYldsc2VUb2diVzl1YjNOd1lXTmxMQ0J0YjI1dmMzQmhZMlU3WEc0Z0lDOHFJREVnS2k5Y2JpQWdabTl1ZEMxemFYcGxPaUF4WlcwN1hHNGdJQzhxSURJZ0tpOWNibjFjYmk4cUtseHVJQ29nUVdSa0lIUm9aU0JqYjNKeVpXTjBJR1p2Ym5RZ2MybDZaU0JwYmlCaGJHd2dZbkp2ZDNObGNuTXVYRzRnS2k5Y2JuTnRZV3hzSUh0Y2JpQWdabTl1ZEMxemFYcGxPaUE0TUNVN1hHNTlYRzR2S2lwY2JpQXFJRkJ5WlhabGJuUWdZSE4xWW1BZ1lXNWtJR0J6ZFhCZ0lHVnNaVzFsYm5SeklHWnliMjBnWVdabVpXTjBhVzVuSUhSb1pTQnNhVzVsSUdobGFXZG9kQ0JwYmx4dUlDb2dZV3hzSUdKeWIzZHpaWEp6TGx4dUlDb3ZYRzV6ZFdJc1hHNXpkWEFnZTF4dUlDQm1iMjUwTFhOcGVtVTZJRGMxSlR0Y2JpQWdiR2x1WlMxb1pXbG5hSFE2SURBN1hHNGdJSEJ2YzJsMGFXOXVPaUJ5Wld4aGRHbDJaVHRjYmlBZ2RtVnlkR2xqWVd3dFlXeHBaMjQ2SUdKaGMyVnNhVzVsTzF4dWZWeHVjM1ZpSUh0Y2JpQWdZbTkwZEc5dE9pQXRNQzR5TldWdE8xeHVmVnh1YzNWd0lIdGNiaUFnZEc5d09pQXRNQzQxWlcwN1hHNTlYRzR2S2lCRmJXSmxaR1JsWkNCamIyNTBaVzUwWEc0Z0lDQTlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQU0FxTDF4dUx5b3FYRzRnS2lCU1pXMXZkbVVnZEdobElHSnZjbVJsY2lCdmJpQnBiV0ZuWlhNZ2FXNXphV1JsSUd4cGJtdHpJR2x1SUVsRklERXdMbHh1SUNvdlhHNXBiV2NnZTF4dUlDQmliM0prWlhJdGMzUjViR1U2SUc1dmJtVTdYRzU5WEc0dktpQkdiM0p0YzF4dUlDQWdQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDBnS2k5Y2JpOHFLbHh1SUNvZ01TNGdRMmhoYm1kbElIUm9aU0JtYjI1MElITjBlV3hsY3lCcGJpQmhiR3dnWW5KdmQzTmxjbk11WEc0Z0tpQXlMaUJTWlcxdmRtVWdkR2hsSUcxaGNtZHBiaUJwYmlCR2FYSmxabTk0SUdGdVpDQlRZV1poY21rdVhHNGdLaTljYm1KMWRIUnZiaXhjYm1sdWNIVjBMRnh1YjNCMFozSnZkWEFzWEc1elpXeGxZM1FzWEc1MFpYaDBZWEpsWVNCN1hHNGdJR1p2Ym5RdFptRnRhV3g1T2lCcGJtaGxjbWwwTzF4dUlDQXZLaUF4SUNvdlhHNGdJR1p2Ym5RdGMybDZaVG9nTVRBd0pUdGNiaUFnTHlvZ01TQXFMMXh1SUNCc2FXNWxMV2hsYVdkb2REb2dNUzR4TlR0Y2JpQWdMeW9nTVNBcUwxeHVJQ0J0WVhKbmFXNDZJREE3WEc0Z0lDOHFJRElnS2k5Y2JuMWNiaThxS2x4dUlDb2dVMmh2ZHlCMGFHVWdiM1psY21ac2IzY2dhVzRnU1VVdVhHNGdLaUF4TGlCVGFHOTNJSFJvWlNCdmRtVnlabXh2ZHlCcGJpQkZaR2RsTGx4dUlDb3ZYRzVpZFhSMGIyNHNYRzVwYm5CMWRDQjdYRzRnSUM4cUlERWdLaTljYmlBZ2IzWmxjbVpzYjNjNklIWnBjMmxpYkdVN1hHNTlYRzR2S2lwY2JpQXFJRkpsYlc5MlpTQjBhR1VnYVc1b1pYSnBkR0Z1WTJVZ2IyWWdkR1Y0ZENCMGNtRnVjMlp2Y20wZ2FXNGdSV1JuWlN3Z1JtbHlaV1p2ZUN3Z1lXNWtJRWxGTGx4dUlDb2dNUzRnVW1WdGIzWmxJSFJvWlNCcGJtaGxjbWwwWVc1alpTQnZaaUIwWlhoMElIUnlZVzV6Wm05eWJTQnBiaUJHYVhKbFptOTRMbHh1SUNvdlhHNWlkWFIwYjI0c1hHNXpaV3hsWTNRZ2UxeHVJQ0F2S2lBeElDb3ZYRzRnSUhSbGVIUXRkSEpoYm5ObWIzSnRPaUJ1YjI1bE8xeHVmVnh1THlvcVhHNGdLaUJEYjNKeVpXTjBJSFJvWlNCcGJtRmlhV3hwZEhrZ2RHOGdjM1I1YkdVZ1kyeHBZMnRoWW14bElIUjVjR1Z6SUdsdUlHbFBVeUJoYm1RZ1UyRm1ZWEpwTGx4dUlDb3ZYRzVpZFhSMGIyNHNYRzViZEhsd1pUMG5ZblYwZEc5dUoxMHNYRzViZEhsd1pUMG5jbVZ6WlhRblhTeGNibHQwZVhCbFBTZHpkV0p0YVhRblhTQjdYRzRnSUMxM1pXSnJhWFF0WVhCd1pXRnlZVzVqWlRvZ1luVjBkRzl1TzF4dWZWeHVMeW9xWEc0Z0tpQlNaVzF2ZG1VZ2RHaGxJR2x1Ym1WeUlHSnZjbVJsY2lCaGJtUWdjR0ZrWkdsdVp5QnBiaUJHYVhKbFptOTRMbHh1SUNvdlhHNWlkWFIwYjI0Nk9pMXRiM290Wm05amRYTXRhVzV1WlhJc1hHNWJkSGx3WlQwblluVjBkRzl1SjEwNk9pMXRiM290Wm05amRYTXRhVzV1WlhJc1hHNWJkSGx3WlQwbmNtVnpaWFFuWFRvNkxXMXZlaTFtYjJOMWN5MXBibTVsY2l4Y2JsdDBlWEJsUFNkemRXSnRhWFFuWFRvNkxXMXZlaTFtYjJOMWN5MXBibTVsY2lCN1hHNGdJR0p2Y21SbGNpMXpkSGxzWlRvZ2JtOXVaVHRjYmlBZ2NHRmtaR2x1WnpvZ01EdGNibjFjYmk4cUtseHVJQ29nVW1WemRHOXlaU0IwYUdVZ1ptOWpkWE1nYzNSNWJHVnpJSFZ1YzJWMElHSjVJSFJvWlNCd2NtVjJhVzkxY3lCeWRXeGxMbHh1SUNvdlhHNWlkWFIwYjI0NkxXMXZlaTFtYjJOMWMzSnBibWNzWEc1YmRIbHdaVDBuWW5WMGRHOXVKMTA2TFcxdmVpMW1iMk4xYzNKcGJtY3NYRzViZEhsd1pUMG5jbVZ6WlhRblhUb3RiVzk2TFdadlkzVnpjbWx1Wnl4Y2JsdDBlWEJsUFNkemRXSnRhWFFuWFRvdGJXOTZMV1p2WTNWemNtbHVaeUI3WEc0Z0lHOTFkR3hwYm1VNklERndlQ0JrYjNSMFpXUWdRblYwZEc5dVZHVjRkRHRjYm4xY2JpOHFLbHh1SUNvZ1EyOXljbVZqZENCMGFHVWdjR0ZrWkdsdVp5QnBiaUJHYVhKbFptOTRMbHh1SUNvdlhHNW1hV1ZzWkhObGRDQjdYRzRnSUhCaFpHUnBibWM2SURBdU16VmxiU0F3TGpjMVpXMGdNQzQyTWpWbGJUdGNibjFjYmk4cUtseHVJQ29nTVM0Z1EyOXljbVZqZENCMGFHVWdkR1Y0ZENCM2NtRndjR2x1WnlCcGJpQkZaR2RsSUdGdVpDQkpSUzVjYmlBcUlESXVJRU52Y25KbFkzUWdkR2hsSUdOdmJHOXlJR2x1YUdWeWFYUmhibU5sSUdaeWIyMGdZR1pwWld4a2MyVjBZQ0JsYkdWdFpXNTBjeUJwYmlCSlJTNWNiaUFxSURNdUlGSmxiVzkyWlNCMGFHVWdjR0ZrWkdsdVp5QnpieUJrWlhabGJHOXdaWEp6SUdGeVpTQnViM1FnWTJGMVoyaDBJRzkxZENCM2FHVnVJSFJvWlhrZ2VtVnlieUJ2ZFhSY2JpQXFJQ0FnSUdCbWFXVnNaSE5sZEdBZ1pXeGxiV1Z1ZEhNZ2FXNGdZV3hzSUdKeWIzZHpaWEp6TGx4dUlDb3ZYRzVzWldkbGJtUWdlMXh1SUNCaWIzZ3RjMmw2YVc1bk9pQmliM0prWlhJdFltOTRPMXh1SUNBdktpQXhJQ292WEc0Z0lHTnZiRzl5T2lCcGJtaGxjbWwwTzF4dUlDQXZLaUF5SUNvdlhHNGdJR1JwYzNCc1lYazZJSFJoWW14bE8xeHVJQ0F2S2lBeElDb3ZYRzRnSUcxaGVDMTNhV1IwYURvZ01UQXdKVHRjYmlBZ0x5b2dNU0FxTDF4dUlDQndZV1JrYVc1bk9pQXdPMXh1SUNBdktpQXpJQ292WEc0Z0lIZG9hWFJsTFhOd1lXTmxPaUJ1YjNKdFlXdzdYRzRnSUM4cUlERWdLaTljYm4xY2JpOHFLbHh1SUNvZ1FXUmtJSFJvWlNCamIzSnlaV04wSUhabGNuUnBZMkZzSUdGc2FXZHViV1Z1ZENCcGJpQkRhSEp2YldVc0lFWnBjbVZtYjNnc0lHRnVaQ0JQY0dWeVlTNWNiaUFxTDF4dWNISnZaM0psYzNNZ2UxeHVJQ0IyWlhKMGFXTmhiQzFoYkdsbmJqb2dZbUZ6Wld4cGJtVTdYRzU5WEc0dktpcGNiaUFxSUZKbGJXOTJaU0IwYUdVZ1pHVm1ZWFZzZENCMlpYSjBhV05oYkNCelkzSnZiR3hpWVhJZ2FXNGdTVVVnTVRBckxseHVJQ292WEc1MFpYaDBZWEpsWVNCN1hHNGdJRzkyWlhKbWJHOTNPaUJoZFhSdk8xeHVmVnh1THlvcVhHNGdLaUF4TGlCQlpHUWdkR2hsSUdOdmNuSmxZM1FnWW05NElITnBlbWx1WnlCcGJpQkpSU0F4TUM1Y2JpQXFJREl1SUZKbGJXOTJaU0IwYUdVZ2NHRmtaR2x1WnlCcGJpQkpSU0F4TUM1Y2JpQXFMMXh1VzNSNWNHVTlKMk5vWldOclltOTRKMTBzWEc1YmRIbHdaVDBuY21Ga2FXOG5YU0I3WEc0Z0lHSnZlQzF6YVhwcGJtYzZJR0p2Y21SbGNpMWliM2c3WEc0Z0lDOHFJREVnS2k5Y2JpQWdjR0ZrWkdsdVp6b2dNRHRjYmlBZ0x5b2dNaUFxTDF4dWZWeHVMeW9xWEc0Z0tpQkRiM0p5WldOMElIUm9aU0JqZFhKemIzSWdjM1I1YkdVZ2IyWWdhVzVqY21WdFpXNTBJR0Z1WkNCa1pXTnlaVzFsYm5RZ1luVjBkRzl1Y3lCcGJpQkRhSEp2YldVdVhHNGdLaTljYmx0MGVYQmxQU2R1ZFcxaVpYSW5YVG82TFhkbFltdHBkQzFwYm01bGNpMXpjR2x1TFdKMWRIUnZiaXhjYmx0MGVYQmxQU2R1ZFcxaVpYSW5YVG82TFhkbFltdHBkQzF2ZFhSbGNpMXpjR2x1TFdKMWRIUnZiaUI3WEc0Z0lHaGxhV2RvZERvZ1lYVjBienRjYm4xY2JpOHFLbHh1SUNvZ01TNGdRMjl5Y21WamRDQjBhR1VnYjJSa0lHRndjR1ZoY21GdVkyVWdhVzRnUTJoeWIyMWxJR0Z1WkNCVFlXWmhjbWt1WEc0Z0tpQXlMaUJEYjNKeVpXTjBJSFJvWlNCdmRYUnNhVzVsSUhOMGVXeGxJR2x1SUZOaFptRnlhUzVjYmlBcUwxeHVXM1I1Y0dVOUozTmxZWEpqYUNkZElIdGNiaUFnTFhkbFltdHBkQzFoY0hCbFlYSmhibU5sT2lCMFpYaDBabWxsYkdRN1hHNGdJQzhxSURFZ0tpOWNiaUFnYjNWMGJHbHVaUzF2Wm1aelpYUTZJQzB5Y0hnN1hHNGdJQzhxSURJZ0tpOWNibjFjYmk4cUtseHVJQ29nVW1WdGIzWmxJSFJvWlNCcGJtNWxjaUJ3WVdSa2FXNW5JR2x1SUVOb2NtOXRaU0JoYm1RZ1UyRm1ZWEpwSUc5dUlHMWhZMDlUTGx4dUlDb3ZYRzViZEhsd1pUMG5jMlZoY21Ob0oxMDZPaTEzWldKcmFYUXRjMlZoY21Ob0xXUmxZMjl5WVhScGIyNGdlMXh1SUNBdGQyVmlhMmwwTFdGd2NHVmhjbUZ1WTJVNklHNXZibVU3WEc1OVhHNHZLaXBjYmlBcUlERXVJRU52Y25KbFkzUWdkR2hsSUdsdVlXSnBiR2wwZVNCMGJ5QnpkSGxzWlNCamJHbGphMkZpYkdVZ2RIbHdaWE1nYVc0Z2FVOVRJR0Z1WkNCVFlXWmhjbWt1WEc0Z0tpQXlMaUJEYUdGdVoyVWdabTl1ZENCd2NtOXdaWEowYVdWeklIUnZJR0JwYm1obGNtbDBZQ0JwYmlCVFlXWmhjbWt1WEc0Z0tpOWNiam82TFhkbFltdHBkQzFtYVd4bExYVndiRzloWkMxaWRYUjBiMjRnZTF4dUlDQXRkMlZpYTJsMExXRndjR1ZoY21GdVkyVTZJR0oxZEhSdmJqdGNiaUFnTHlvZ01TQXFMMXh1SUNCbWIyNTBPaUJwYm1obGNtbDBPMXh1SUNBdktpQXlJQ292WEc1OVhHNHZLaUJKYm5SbGNtRmpkR2wyWlZ4dUlDQWdQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDBnS2k5Y2JpOHFYRzRnS2lCQlpHUWdkR2hsSUdOdmNuSmxZM1FnWkdsemNHeGhlU0JwYmlCRlpHZGxMQ0JKUlNBeE1Dc3NJR0Z1WkNCR2FYSmxabTk0TGx4dUlDb3ZYRzVrWlhSaGFXeHpJSHRjYmlBZ1pHbHpjR3hoZVRvZ1lteHZZMnM3WEc1OVhHNHZLbHh1SUNvZ1FXUmtJSFJvWlNCamIzSnlaV04wSUdScGMzQnNZWGtnYVc0Z1lXeHNJR0p5YjNkelpYSnpMbHh1SUNvdlhHNXpkVzF0WVhKNUlIdGNiaUFnWkdsemNHeGhlVG9nYkdsemRDMXBkR1Z0TzF4dWZWeHVMeW9nVFdselkxeHVJQ0FnUFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwZ0tpOWNiaThxS2x4dUlDb2dRV1JrSUhSb1pTQmpiM0p5WldOMElHUnBjM0JzWVhrZ2FXNGdTVVVnTVRBckxseHVJQ292WEc1MFpXMXdiR0YwWlNCN1hHNGdJR1JwYzNCc1lYazZJRzV2Ym1VN1hHNTlYRzR2S2lwY2JpQXFJRUZrWkNCMGFHVWdZMjl5Y21WamRDQmthWE53YkdGNUlHbHVJRWxGSURFd0xseHVJQ292WEc1YmFHbGtaR1Z1WFNCN1hHNGdJR1JwYzNCc1lYazZJRzV2Ym1VN1hHNTlYRzR2S2lBOVBUMDlQU0JDWVhObElEMDlQVDA5SUNvdlhHNW9kRzFzTEZ4dVltOWtlU0I3WEc0Z0lHaGxhV2RvZERvZ01UQXdKVHRjYmlBZ1ltRmphMmR5YjNWdVpEb2dJMlpoWm1GbVlUdGNiaUFnWTI5c2IzSTZJQ016TXpNN1hHNGdJR1p2Ym5RdGMybDZaVG9nTVRSd2VEdGNiaUFnYkdsdVpTMW9aV2xuYUhRNklERTFNQ1U3WEc0Z0lHWnZiblF0Wm1GdGFXeDVPaUFuVFdsamNtOXpiMlowSUZsaFNHVnBJRlZKSnl3Z1FYSnBZV3dzSUhOaGJuTXRjMlZ5YVdZN1hHNGdJRzkyWlhKbWJHOTNPaUJvYVdSa1pXNDdYRzU5WEc1aE9teHBibXNzWEc1aE9uWnBjMmwwWldRc1hHNWhPbWh2ZG1WeUlIdGNiaUFnWTI5c2IzSTZJQ013TlRnNU5ESTdYRzRnSUhSbGVIUXRaR1ZqYjNKaGRHbHZiam9nYm05dVpUdGNibjFjYm1FNmFHOTJaWElnZTF4dUlDQjBaWGgwTFdSbFkyOXlZWFJwYjI0NklIVnVaR1Z5YkdsdVpUdGNibjFjYm1OdlpHVWdlMXh1SUNCbWIyNTBMV1poYldsc2VUb2dKMU52ZFhKalpTQkRiMlJsSUZCeWJ5Y3NJRU52Ym5OdmJHRnpMQ0JIWlc5eVoybGhMQ0JOYjI1aFkyOHNJRzF2Ym05emNHRmpaU3dnUVhKcFlXd3NJSE5oYm5NdGMyVnlhV1k3WEc1OVhHNHZLaUE5UFQwOVBTQlRZM0p2Ykd4aVlYSWdQVDA5UFQwZ0tpOWNiam82TFhkbFltdHBkQzF6WTNKdmJHeGlZWElnZTF4dUlDQjNhV1IwYURvZ04zQjRPMXh1SUNCb1pXbG5hSFE2SURkd2VEdGNiaUFnTFhkbFltdHBkQzFpYjNKa1pYSXRjbUZrYVhWek9pQTFjSGc3WEc1OVhHNDZPaTEzWldKcmFYUXRjMk55YjJ4c1ltRnlMWFJ5WVdOckxYQnBaV05sSUh0Y2JpQWdMWGRsWW10cGRDMWliM0prWlhJdGNtRmthWFZ6T2lBMWNIZzdYRzU5WEc0Nk9pMTNaV0pyYVhRdGMyTnliMnhzWW1GeUxYUm9kVzFpT25abGNuUnBZMkZzSUh0Y2JpQWdZbUZqYTJkeWIzVnVaQzFqYjJ4dmNqb2djbWRpWVNnd0xDQXdMQ0F3TENBd0xqSTFLVHRjYmlBZ0xYZGxZbXRwZEMxaWIzSmtaWEl0Y21Ga2FYVnpPaUExY0hnN1hHNTlYRzQ2T2kxM1pXSnJhWFF0YzJOeWIyeHNZbUZ5TFhSb2RXMWlPbWh2Y21sNmIyNTBZV3dnZTF4dUlDQmlZV05yWjNKdmRXNWtMV052Ykc5eU9pQnlaMkpoS0RBc0lEQXNJREFzSURBdU1qVXBPMXh1SUNBdGQyVmlhMmwwTFdKdmNtUmxjaTF5WVdScGRYTTZJRFZ3ZUR0Y2JuMWNiam82TFhkbFltdHBkQzF6WTNKdmJHeGlZWEk2YUc5MlpYSWdlMXh1SUNCaVlXTnJaM0p2ZFc1a0xXTnZiRzl5T2lCeVoySmhLREFzSURBc0lEQXNJREF1TVRVcE8xeHVmVnh1T2pvdGQyVmlhMmwwTFhOamNtOXNiR0poY2kxMGFIVnRZanBvYjNabGNpQjdYRzRnSUdKaFkydG5jbTkxYm1RdFkyOXNiM0k2SUhKblltRW9NQ3dnTUN3Z01Dd2dNQzR6TlNrN1hHNTlYRzR2S2lCTVlYbHZkWFFnS2k5Y2JpNWtiMk56SUh0Y2JpQWdaR2x6Y0d4aGVUb2dabXhsZUR0Y2JpQWdabXhsZUMxa2FYSmxZM1JwYjI0NklISnZkenRjYmlBZ1pteGxlQzEzY21Gd09pQnViM2R5WVhBN1hHNGdJSEJ2YzJsMGFXOXVPaUJ5Wld4aGRHbDJaVHRjYmlBZ2VpMXBibVJsZURvZ01UdGNiaUFnYUdWcFoyaDBPaUF4TURBbE8xeHVJQ0IzYVdSMGFEb2dNVEF3SlR0Y2JpQWdiV0Z5WjJsdU9pQXdPMXh1SUNCdmRtVnlabXh2ZHpvZ2FHbGtaR1Z1TzF4dWZWeHVMeW9nUVhOcFpHVWdLaTljYmk1aGMybGtaU0I3WEc0Z0lHUnBjM0JzWVhrNklHWnNaWGc3WEc0Z0lHWnNaWGd0YzJoeWFXNXJPaUF3TzF4dUlDQm1iR1Y0TFdScGNtVmpkR2x2YmpvZ1kyOXNkVzF1TzF4dUlDQm1iR1Y0TFhkeVlYQTZJRzV2ZDNKaGNEdGNiaUFnZDJsa2RHZzZJREkyTUhCNE8xeHVJQ0J0WVhKbmFXNDZJREE3WEc0Z0lHaGxhV2RvZERvZ01UQXdKVHRjYmlBZ1ltRmphMmR5YjNWdVpDMWpiMnh2Y2pvZ0l6TXpNenRjYmlBZ1kyOXNiM0k2SUNOa1pHUTdYRzRnSUdKdmVDMXphR0ZrYjNjNklEQWdNQ0ExY0hnZ01uQjRJQ05rWkdRN1hHNGdJSFJ5WVc1emFYUnBiMjR0WkhWeVlYUnBiMjQ2SURBdU0zTTdYRzRnSUc5MlpYSm1iRzkzT2lCaGRYUnZPMXh1ZlZ4dUx5b2dUV0ZwYmlBcUwxeHVMbTFoYVc0Z2UxeHVJQ0JtYkdWNE9pQXhPMXh1SUNCd2IzTnBkR2x2YmpvZ2NtVnNZWFJwZG1VN1hHNGdJSG90YVc1a1pYZzZJREU3WEc0Z0lHaGxhV2RvZERvZ01UQXdKVHRjYmlBZ1ltRmphMmR5YjNWdVpDMWpiMnh2Y2pvZ0kyWm1aanRjYmlBZ2IzWmxjbVpzYjNjNklHRjFkRzg3WEc1OVhHNUFiV1ZrYVdFZ0tHMWhlQzEzYVdSMGFEb2dOVEF3Y0hncElIdGNiaUFnTG1SdlkzTWdlMXh1SUNBZ0lHWnNaWGd0WkdseVpXTjBhVzl1T2lCamIyeDFiVzQ3WEc0Z0lIMWNiaUFnTG1GemFXUmxMRnh1SUNBdWJXRnBiaUI3WEc0Z0lDQWdkMmxrZEdnNklERXdNQ1U3WEc0Z0lIMWNiaUFnTG1GemFXUmxJSHRjYmlBZ0lDQndiM05wZEdsdmJqb2dabWw0WldRN1hHNGdJQ0FnZWkxcGJtUmxlRG9nTXp0Y2JpQWdJQ0IwYjNBNklEQTdYRzRnSUgxY2JpQWdMbUZ6YVdSbExtOTFkR3hwYm1VdGJtRjJhV2RoZEc5eVgyWnZiR1JsWkNCN1hHNGdJQ0FnYkdWbWREb2dMVEV3TUNVN1hHNGdJSDFjYmlBZ0xtRnphV1JsTG05MWRHeHBibVV0Ym1GMmFXZGhkRzl5WDJWNGNHRnVaR1ZrSUh0Y2JpQWdJQ0JzWldaME9pQXdPMXh1SUNCOVhHNTlYRzR1WVhOcFpHVWdlMXh1SUNCbWIyNTBMV1poYldsc2VUb2dKMU52ZFhKalpTQkRiMlJsSUZCeWJ5Y3NJRU52Ym5OdmJHRnpMQ0JIWlc5eVoybGhMQ0JOYjI1aFkyOHNJRzF2Ym05emNHRmpaU3dnUVhKcFlXd3NJSE5oYm5NdGMyVnlhV1k3WEc1OVhHNHVZWE5wWkdWZlgyaGxZV1JsY2lCN1hHNGdJRzFoY21kcGJqb2dNQ0JoZFhSdk8xeHVJQ0JtYkdWNExYTm9jbWx1YXpvZ01EdGNiaUFnYjNabGNtWnNiM2M2SUdocFpHUmxianRjYm4xY2JpNWhjMmxrWlY5ZmJtRjJJSHRjYmlBZ1pteGxlRG9nTVR0Y2JpQWdiM1psY21ac2IzYzZJR0YxZEc4N1hHNTlYRzR1WVhOcFpHVmZYMmd5SUh0Y2JpQWdiV0Z5WjJsdU9pQXdJR0YxZEc4N1hHNGdJR2hsYVdkb2REb2dOVFJ3ZUR0Y2JpQWdiR2x1WlMxb1pXbG5hSFE2SURVMGNIZzdYRzRnSUdadmJuUXRjMmw2WlRvZ01qQndlRHRjYmlBZ1ptOXVkQzEzWldsbmFIUTZJRzV2Y20xaGJEdGNiaUFnWm05dWRDMW1ZVzFwYkhrNklFZGxiM0puYVdFc0lFTnZibk52YkdGekxDQkJjbWxoYkN3Z2MyRnVjeTF6WlhKcFpqdGNiaUFnZEdWNGRDMWhiR2xuYmpvZ1kyVnVkR1Z5TzF4dUlDQnZkbVZ5Wm14dmR6b2dhR2xrWkdWdU8xeHVmVnh1TG1GemFXUmxYMTlvTXlCN1hHNGdJRzFoY21kcGJqb2dNQ0JoZFhSdk8xeHVJQ0J3WVdSa2FXNW5PaUF3SURJd2NIZzdYRzRnSUdadmJuUXRjMmw2WlRvZ01UWndlRHRjYmlBZ2IzWmxjbVpzYjNjNklHaHBaR1JsYmp0Y2JuMWNiaTVoYzJsa1pWOWZiR2x6ZENCN1hHNGdJRzFoY21kcGJqb2dNRHRjYmlBZ2NHRmtaR2x1WnpvZ01UQndlQ0F3TzF4dUlDQnZkbVZ5Wm14dmR6b2dhR2xrWkdWdU8xeHVmVnh1TG1GemFXUmxYMTlwZEdWdElIdGNiaUFnYUdWcFoyaDBPaUF6TW5CNE8xeHVJQ0JzYVc1bExXaGxhV2RvZERvZ016SndlRHRjYmlBZ2NHRmtaR2x1WnpvZ01DQXpNSEI0TzF4dUlDQmpkWEp6YjNJNklIQnZhVzUwWlhJN1hHNGdJR1p2Ym5RdGMybDZaVG9nTVROd2VEdGNiaUFnYjNabGNtWnNiM2M2SUdocFpHUmxianRjYm4xY2JpNWhjMmxrWlMxdVlYWnBaMkYwYjNJZ2UxeHVJQ0JtYkdWNE9pQXhPMXh1ZlZ4dUxtRnphV1JsTFc1aGRtbG5ZWFJ2Y2lBdWIzVjBiR2x1WlMxdVlYWnBaMkYwYjNKZlgyMWhhVzQ2T2kxM1pXSnJhWFF0YzJOeWIyeHNZbUZ5TFhSb2RXMWlJSHRjYmlBZ1ltRmphMmR5YjNWdVpDMWpiMnh2Y2pvZ0l6WTJOanRjYm4xY2JpNWhjMmxrWlMxdVlYWnBaMkYwYjNJZ0xtOTFkR3hwYm1VdGJtRjJhV2RoZEc5eVgxOXRZV2x1T2pvdGQyVmlhMmwwTFhOamNtOXNiR0poY2kxMGFIVnRZanBvYjNabGNpQjdYRzRnSUdKaFkydG5jbTkxYm1RdFkyOXNiM0k2SUNNNU9UazdYRzU5WEc0dVlYTnBaR1V0Ym1GMmFXZGhkRzl5SUM1dmRYUnNhVzVsTFc1aGRtbG5ZWFJ2Y2w5ZmNHeGhZMlZvYjJ4a1pYSWdlMXh1SUNCaVlXTnJaM0p2ZFc1a0xXTnZiRzl5T2lBak5UVTFPMXh1SUNCaWIzSmtaWEl0YkdWbWREb2dNM0I0SUhOdmJHbGtJQ05tWm1ZN1hHNTlYRzR1WVhOcFpHVXRibUYyYVdkaGRHOXlJQzV2ZFhSc2FXNWxMVzVoZG1sbllYUnZjbDlmWVc1amFHOXlPbXhwYm1zZ2UxeHVJQ0JqYjJ4dmNqb2dJMlJrWkR0Y2JpQWdkR1Y0ZEMxa1pXTnZjbUYwYVc5dU9pQnViMjVsTzF4dWZWeHVMbUZ6YVdSbExXNWhkbWxuWVhSdmNpQXViM1YwYkdsdVpTMXVZWFpwWjJGMGIzSmZYMkZ1WTJodmNqcDJhWE5wZEdWa0lIdGNiaUFnWTI5c2IzSTZJQ05rWkdRN1hHNGdJSFJsZUhRdFpHVmpiM0poZEdsdmJqb2dibTl1WlR0Y2JuMWNiaTVoYzJsa1pTMXVZWFpwWjJGMGIzSWdMbTkxZEd4cGJtVXRibUYyYVdkaGRHOXlYMTloYm1Ob2IzSTZhRzkyWlhJZ2UxeHVJQ0JqYjJ4dmNqb2dJMlJrWkR0Y2JpQWdkR1Y0ZEMxa1pXTnZjbUYwYVc5dU9pQjFibVJsY214cGJtVTdYRzU5WEc0dVlYTnBaR1V0Ym1GMmFXZGhkRzl5SUM1dmRYUnNhVzVsTFc1aGRtbG5ZWFJ2Y2w5aFkzUnBkbVV1YjNWMGJHbHVaUzF1WVhacFoyRjBiM0pmWDJGdVkyaHZjanBzYVc1ckxGeHVMbUZ6YVdSbExXNWhkbWxuWVhSdmNpQXViM1YwYkdsdVpTMXVZWFpwWjJGMGIzSmZZV04wYVhabExtOTFkR3hwYm1VdGJtRjJhV2RoZEc5eVgxOWhibU5vYjNJNmRtbHphWFJsWkN4Y2JpNWhjMmxrWlMxdVlYWnBaMkYwYjNJZ0xtOTFkR3hwYm1VdGJtRjJhV2RoZEc5eVgyRmpkR2wyWlM1dmRYUnNhVzVsTFc1aGRtbG5ZWFJ2Y2w5ZllXNWphRzl5T21odmRtVnlJSHRjYmlBZ1kyOXNiM0k2SUNObVptWTdYRzU5WEc0dWJXRnBibDlmYUdWaFpHVnlMRnh1TG0xaGFXNWZYMlp2YjNSbGNpQjdYRzRnSUcxaGNtZHBiam9nTUNCaGRYUnZPMXh1SUNCd1lXUmthVzVuT2lBeFpXMDdYRzRnSUhSbGVIUXRZV3hwWjI0NklHTmxiblJsY2p0Y2JpQWdiM1psY21ac2IzYzZJR2hwWkdSbGJqdGNibjFjYmk1dFlXbHVYMTlvTVNCN1hHNGdJRzFoY21kcGJqb2dNQ0JoZFhSdk8xeHVJQ0J3WVdSa2FXNW5MWFJ2Y0RvZ01XVnRPMXh1SUNCbWIyNTBMWE5wZW1VNklEVmxiVHRjYmlBZ1ptOXVkQzEzWldsbmFIUTZJRzV2Y20xaGJEdGNiaUFnYkdsdVpTMW9aV2xuYUhRNklESmxiVHRjYmlBZ2IzWmxjbVpzYjNjNklHaHBaR1JsYmp0Y2JuMWNiaTV0WVdsdVgxOXVZVzFsSUh0Y2JpQWdZMjlzYjNJNklDTTFNRGRoWm1VN1hHNGdJR1p2Ym5RdGQyVnBaMmgwT2lCdWIzSnRZV3c3WEc1OVhHNHViV0ZwYmw5ZmRHRm5iR2x1WlNCN1hHNGdJRzFoY21kcGJqb2dNV1Z0SUdGMWRHODdYRzRnSUcxaGVDMTNhV1IwYURvZ09UWXdjSGc3WEc0Z0lHeHBibVV0YUdWcFoyaDBPaUF4TGpObGJUdGNiaUFnWm05dWRDMXphWHBsT2lBeVpXMDdYRzRnSUdOdmJHOXlPaUFqT1RrNU8xeHVJQ0JtYjI1MExYZGxhV2RvZERvZ01UQXdPMXh1SUNCdmRtVnlabXh2ZHpvZ2FHbGtaR1Z1TzF4dWZWeHVMbTFoYVc1ZlgyTmtiaUI3WEc0Z0lHMWhjbWRwYmpvZ01tVnRJREE3WEc0Z0lIQmhaR1JwYm1jNklESmxiVHRjYmlBZ1ptOXVkQzF6YVhwbE9pQXhObkI0TzF4dUlDQnNhVzVsTFdobGFXZG9kRG9nTVRVd0pUdGNiaUFnZEdWNGRDMWhiR2xuYmpvZ1kyVnVkR1Z5TzF4dUlDQmlZV05yWjNKdmRXNWtMV052Ykc5eU9pQWpabUZtWVdaaE8xeHVJQ0JpYjNKa1pYSXRkRzl3T2lBeGNIZ2djMjlzYVdRZ0kyUmtaRHRjYmlBZ1ltOXlaR1Z5TFdKdmRIUnZiVG9nTVhCNElITnZiR2xrSUNOa1pHUTdYRzRnSUdOdmJHOXlPaUFqTmpZMk8xeHVJQ0J2ZG1WeVpteHZkem9nYUdsa1pHVnVPMXh1ZlZ4dUxtMWhhVzVmWDJSdmQyNXNiMkZrSUh0Y2JpQWdiV0Z5WjJsdU9pQXhaVzBnWVhWMGJ6dGNiaUFnZDJsa2RHZzZJREl3TUhCNE8xeHVJQ0IwWlhoMExXRnNhV2R1T2lCalpXNTBaWEk3WEc0Z0lHOTJaWEptYkc5M09pQm9hV1JrWlc0N1hHNTlYRzR1YldGcGJsOWZZblYwZEc5dUlIdGNiaUFnWkdsemNHeGhlVG9nYVc1c2FXNWxMV0pzYjJOck8xeHVJQ0JpYjNKa1pYSXRjbUZrYVhWek9pQTBjSGc3WEc0Z0lIQmhaR1JwYm1jNklERTBjSGdnTWpsd2VEdGNiaUFnWm05dWRDMXphWHBsT2lBeE9IQjRPMXh1SUNCbWIyNTBMV1poYldsc2VUb2dKMU52ZFhKalpTQkRiMlJsSUZCeWJ5Y3NJRU52Ym5OdmJHRnpMQ0JIWlc5eVoybGhMQ0JOYjI1aFkyOHNJRzF2Ym05emNHRmpaU3dnUVhKcFlXd3NJSE5oYm5NdGMyVnlhV1k3WEc0Z0lHSmhZMnRuY205MWJtUXRZMjlzYjNJNklDTXdOVGc1TkRJN1hHNGdJRzkyWlhKbWJHOTNPaUJvYVdSa1pXNDdYRzU5WEc0dWJXRnBibDlmWW5WMGRHOXVPbXhwYm1zc1hHNHViV0ZwYmw5ZlluVjBkRzl1T25acGMybDBaV1FzWEc0dWJXRnBibDlmWW5WMGRHOXVPbWh2ZG1WeUlIdGNiaUFnWTI5c2IzSTZJQ05tWm1ZN1hHNGdJSFJsZUhRdFpHVmpiM0poZEdsdmJqb2dibTl1WlR0Y2JuMWNiaTV0WVdsdVgxOW1iMjkwWlhJZ2UxeHVJQ0J0WVhKbmFXNDZJREFnTTJWdE8xeHVJQ0JpYjNKa1pYSXRkRzl3T2lBeGNIZ2djMjlzYVdRZ0kyUmtaRHRjYm4xY2JpNXpaV04wYVc5dUlIdGNiaUFnYldGeVoybHVPaUF4WlcwZ01EdGNiaUFnYjNabGNtWnNiM2M2SUdocFpHUmxianRjYm4xY2JpNXpaV04wYVc5dVgxOW9aV0ZrWlhJc1hHNHVjMlZqZEdsdmJsOWZZMjl1ZEdWdWRDeGNiaTV6WldOMGFXOXVYMTltYjI5MFpYSWdlMXh1SUNCdFlYSm5hVzQ2SURBN1hHNGdJSEJoWkdScGJtYzZJREFnTTJWdE8xeHVJQ0J2ZG1WeVpteHZkem9nYUdsa1pHVnVPMXh1ZlZ4dUxuTmxZM1JwYjI1ZlgzUnBkR3hsSUh0Y2JpQWdZMjlzYjNJNklDTTJOalk3WEc1OVhHNHVjMlZqZEdsdmJsOWZhRE1nZTF4dUlDQmpiMnh2Y2pvZ0l6VXdOMkZtWlR0Y2JpQWdabTl1ZEMxemFYcGxPaUF4TGpNMVpXMDdYRzU5WEc0dWMyVmpkR2x2Ymw5ZmFEUWdlMXh1SUNCbWIyNTBMWE5wZW1VNklERXVNV1Z0TzF4dUlDQmpiMnh2Y2pvZ0l6WTJOanRjYm4xY2JpNXpaV04wYVc5dVgxOW9OU0I3WEc0Z0lHWnZiblF0YzJsNlpUb2dNV1Z0TzF4dUlDQmpiMnh2Y2pvZ0l6azVPVHRjYm4xY2JpNXpaV04wYVc5dVgxOWtiQ3hjYmk1elpXTjBhVzl1WDE5a2RDeGNiaTV6WldOMGFXOXVYMTlrWkNCN1hHNGdJRzFoY21kcGJqb2dNRHRjYmlBZ2NHRmtaR2x1WnpvZ01EdGNiaUFnYjNabGNtWnNiM2M2SUdocFpHUmxianRjYm4xY2JpNXpaV04wYVc5dVgxOWtiQ0I3WEc0Z0lIQnZjMmwwYVc5dU9pQnlaV3hoZEdsMlpUdGNiaUFnZWkxcGJtUmxlRG9nTVR0Y2JuMWNiaTV6WldOMGFXOXVYMTlrZENCN1hHNGdJR1JwYzNCc1lYazZJR2x1YkdsdVpTMWliRzlqYXp0Y2JuMWNiaTV6WldOMGFXOXVYMTlrWkNCN1hHNGdJR1JwYzNCc1lYazZJR2x1YkdsdVpTMWliRzlqYXp0Y2JpQWdZMjlzYjNJNklDTXdOVGc1TkRJN1hHNTlYRzR1YzJWamRHbHZibDlmY0hKbElIdGNiaUFnYldGeVoybHVPaUF5WlcwZ01EdGNiaUFnY0dGa1pHbHVaem9nTVdWdE8xeHVJQ0JtYjI1MExYTnBlbVU2SURFMGNIZzdYRzRnSUd4cGJtVXRhR1ZwWjJoME9pQXhOVEFsTzF4dUlDQjBaWGgwTFdGc2FXZHVPaUJzWldaME8xeHVJQ0JpWVdOclozSnZkVzVrTFdOdmJHOXlPaUFqWm1GbVlXWmhPMXh1SUNCaWIzSmtaWEk2SURGd2VDQnpiMnhwWkNBalpHUmtPMXh1SUNCaWIzSmtaWEl0Y21Ga2FYVnpPaUEwY0hnN1hHNGdJR052Ykc5eU9pQWpOalkyTzF4dUlDQnZkbVZ5Wm14dmR6b2dZWFYwYnp0Y2JuMWNiaTV6WldOMGFXOXVYMTlqYjJSbElIdGNiaUFnWkdsemNHeGhlVG9nWW14dlkyczdYRzRnSUcxaGNtZHBiam9nTUNCaGRYUnZPMXh1SUNCdmRtVnlabXh2ZHpvZ2FHbGtaR1Z1TzF4dWZWeHVMbk5sWTNScGIyNWZYMlp2YjNSbGNpQjdYRzRnSUdKdmNtUmxjaTEwYjNBNklERndlQ0J6YjJ4cFpDQWpaR1JrTzF4dUlDQnRZWEpuYVc0dGRHOXdPaUF6WlcwN1hHNGdJR0poWTJ0bmNtOTFibVF0WTI5c2IzSTZJQ05tWVdaaFptRTdYRzRnSUdOdmJHOXlPaUFqT1RrNU8xeHVmVnh1TG5ObFkzUnBiMjVmWDNSaFlteGxJSHRjYmlBZ2JXRnlaMmx1T2lBeFpXMGdZWFYwYnp0Y2JpQWdkMmxrZEdnNklERXdNQ1U3WEc0Z0lHSnZjbVJsY2kxMGIzQTZJREZ3ZUNCemIyeHBaQ0FqWkdSa08xeHVmVnh1TG5ObFkzUnBiMjVmWDNSb0xGeHVMbk5sWTNScGIyNWZYM1JrSUh0Y2JpQWdjR0ZrWkdsdVp6b2dOWEI0SURFMmNIZzdYRzRnSUd4cGJtVXRhR1ZwWjJoME9pQXlObkI0TzF4dUlDQmliM0prWlhJdFltOTBkRzl0T2lBeGNIZ2djMjlzYVdRZ0kyUmtaRHRjYm4xY2JpNXpaV04wYVc5dVgxOTBhQ0I3WEc0Z0lIUmxlSFF0WVd4cFoyNDZJR05sYm5SbGNqdGNiaUFnWW1GamEyZHliM1Z1WkMxamIyeHZjam9nSTJaaFptRm1ZVHRjYm4xY2JrQnRaV1JwWVNBb2JXRjRMWGRwWkhSb09pQTFNREJ3ZUNrZ2UxeHVJQ0F1YzJWamRHbHZibDlmYUdWaFpHVnlMRnh1SUNBdWMyVmpkR2x2Ymw5ZlkyOXVkR1Z1ZENCN1hHNGdJQ0FnY0dGa1pHbHVaem9nTUNBeFpXMDdYRzRnSUgxY2JuMWNiaTVqWVhObElIdGNiaUFnY0c5emFYUnBiMjQ2SUhKbGJHRjBhWFpsTzF4dUlDQjZMV2x1WkdWNE9pQXhPMXh1SUNCa2FYTndiR0Y1T2lCbmNtbGtPMXh1SUNCbmNtbGtMWFJsYlhCc1lYUmxMV052YkhWdGJuTTZJSEpsY0dWaGRDZ3lMQ0F4Wm5JcE8xeHVJQ0JuWVhBNklEUXdjSGc3WEc0Z0lIQmhaR1JwYm1jNklERmxiVHRjYmlBZ1ltOXlaR1Z5TFhSdmNEb2dNWEI0SUhOdmJHbGtJQ05rWkdRN1hHNGdJR0p2Y21SbGNpMWliM1IwYjIwNklERndlQ0J6YjJ4cFpDQWpaR1JrTzF4dUlDQnZkbVZ5Wm14dmR6b2dhR2xrWkdWdU8xeHVmVnh1TG1OaGMyVTZZV1owWlhJZ2UxeHVJQ0JqYjI1MFpXNTBPaUFuSnp0Y2JpQWdjRzl6YVhScGIyNDZJR0ZpYzI5c2RYUmxPMXh1SUNCNkxXbHVaR1Y0T2lBeU8xeHVJQ0IwYjNBNklEQTdYRzRnSUd4bFpuUTZJRFV3SlR0Y2JpQWdhR1ZwWjJoME9pQXhNREFsTzF4dUlDQjNhV1IwYURvZ01EdGNiaUFnWW05eVpHVnlMV3hsWm5RNklERndlQ0J6YjJ4cFpDQWpaR1JrTzF4dUlDQnZkbVZ5Wm14dmR6b2dhR2xrWkdWdU8xeHVmVnh1TG1OaGMyVmZYM0J5WlN4Y2JpNWpZWE5sWDE5MFpYaDBZWEpsWVNCN1hHNGdJR1p2Ym5RdGMybDZaVG9nTVROd2VEdGNiaUFnYkdsdVpTMW9aV2xuYUhRNklERTFNQ1U3WEc1OVhHNHVZMkZ6WlY5ZmNISmxMRnh1TG1OaGMyVmZYMk52WkdVc1hHNHVZMkZ6WlY5ZmRHVjRkR0Z5WldFZ2UxeHVJQ0JtYjI1MExXWmhiV2xzZVRvZ0owTnZkWEpwWlhJZ1RtVjNKeXdnUTI5dWMyOXNZWE1zSUVkbGIzSm5hV0VzSUVGeWFXRnNMQ0J6WVc1ekxYTmxjbWxtTzF4dWZWeHVMbU5oYzJWZlgzQnlaU0I3WEc0Z0lHMWhjbWRwYmpvZ01EdGNiaUFnY0dGa1pHbHVaem9nTVdWdE8xeHVJQ0JpWVdOclozSnZkVzVrTFdOdmJHOXlPaUFqWm1GbVlXWmhPMXh1SUNCb1pXbG5hSFE2SURFd01DVTdYRzRnSUdKdmNtUmxjaTF5WVdScGRYTTZJRFJ3ZUR0Y2JpQWdZbTk0TFhOcGVtbHVaem9nWW05eVpHVnlMV0p2ZUR0Y2JpQWdiM1psY21ac2IzYzZJR0YxZEc4N1hHNTlYRzR1WTJGelpWOWZkRzl2YkdKaGNpQjdYRzRnSUcxaGNtZHBiam9nTUNCaGRYUnZPMXh1SUNCb1pXbG5hSFE2SURNMmNIZzdYRzRnSUd4cGJtVXRhR1ZwWjJoME9pQXpObkI0TzF4dUlDQm1iMjUwTFhOcGVtVTZJREUwY0hnN1hHNGdJSEJoWkdScGJtYzZJREFnTVRad2VEdGNiaUFnZEdWNGRDMWhiR2xuYmpvZ2NtbG5hSFE3WEc0Z0lHOTJaWEptYkc5M09pQm9hV1JrWlc0N1hHNTlYRzR1WTJGelpWOWZZV04wYVc5dUxGeHVMbU5oYzJWZlgzSmxiVzkyWlNCN1hHNGdJR04xY25OdmNqb2djRzlwYm5SbGNqdGNiaUFnWTI5c2IzSTZJQ013TlRnNU5ESTdYRzRnSUhWelpYSXRjMlZzWldOME9pQnViMjVsTzF4dWZWeHVMbU5oYzJWZlgyRmpkR2x2YmlCN1hHNGdJR1p2Ym5RdGMybDZaVG9nTVROd2VEdGNiaUFnY0dGa1pHbHVaeTFzWldaME9pQXhNSEI0TzF4dWZWeHVMbU5oYzJWZlgyRmpkR2x2YmpwbWFYSnpkQzFqYUdsc1pDQjdYRzRnSUhCaFpHUnBibWN0YkdWbWREb2dNRHRjYm4xY2JpNWpZWE5sWDE5eVpXMXZkbVVnZTF4dUlDQm1iRzloZERvZ2NtbG5hSFE3WEc1OVhHNHVZMkZ6WlY5ZlkyOXVjMjlzWlNCN1hHNGdJRzFoY21kcGJqb2dNQ0JoZFhSdk8xeHVJQ0JvWldsbmFIUTZJREU0TUhCNE8xeHVJQ0JpYjNKa1pYSTZJREZ3ZUNCemIyeHBaQ0FqWkdSa08xeHVJQ0J2ZG1WeVpteHZkem9nYUdsa1pHVnVPMXh1ZlZ4dUxtTmhjMlZmWDNSbGVIUmhjbVZoSUh0Y2JpQWdiV0Z5WjJsdU9pQXdJR0YxZEc4N1hHNGdJSGRwWkhSb09pQXhNREFsTzF4dUlDQm9aV2xuYUhRNklERXdNQ1U3WEc0Z0lHSnZjbVJsY2pvZ2JtOXVaVHRjYmlBZ2IzVjBiR2x1WlRvZ2JtOXVaVHRjYmlBZ2NHRmtaR2x1WnpvZ01XVnRPMXh1SUNCaWIzZ3RjMmw2YVc1bk9pQmliM0prWlhJdFltOTRPMXh1SUNCdmRtVnlabXh2ZHpvZ1lYVjBienRjYm4xY2JpNWpZWE5sWDE5c2FYTjBMRnh1TG1OaGMyVmZYMmwwWlcwZ2UxeHVJQ0J0WVhKbmFXNDZJREE3WEc0Z0lIQmhaR1JwYm1jNklEQTdYRzRnSUd4cGMzUXRjM1I1YkdVdGRIbHdaVG9nYm05dVpUdGNiaUFnYjNabGNtWnNiM2M2SUdocFpHUmxianRjYm4xY2JpNWpZWE5sWDE5c2FYTjBJSHRjYmlBZ2FHVnBaMmgwT2lBek5qQndlRHRjYmlBZ1ltOXlaR1Z5TFhSdmNEb2dNWEI0SUhOdmJHbGtJQ05rWkdRN1hHNGdJR0p2Y21SbGNpMWliM1IwYjIwNklERndlQ0J6YjJ4cFpDQWpaR1JrTzF4dUlDQm1iMjUwTFhOcGVtVTZJREV6Y0hnN1hHNGdJRzkyWlhKbWJHOTNPaUJoZFhSdk8xeHVmVnh1TG1OaGMyVmZYMmwwWlcwZ2UxeHVJQ0JvWldsbmFIUTZJRE0yY0hnN1hHNGdJR3hwYm1VdGFHVnBaMmgwT2lBek5uQjRPMXh1SUNCamRYSnpiM0k2SUhCdmFXNTBaWEk3WEc0Z0lIQmhaR1JwYm1jNklEQWdNVFp3ZUR0Y2JuMWNiaTVqWVhObFgxOXBkR1Z0T21odmRtVnlJSHRjYmlBZ1ltRmphMmR5YjNWdVpDMWpiMnh2Y2pvZ0kyWTNaamhtT1R0Y2JuMWNianB5YjI5MElIdGNiaUFnTFMxdmRYUnNhVzVsTFhwSmJtUmxlRG9nTWpBd01EdGNiaUFnTFMxdmRYUnNhVzVsTFhOMGFXTnJlUzFvWldsbmFIUTZJREV3TUNVN1hHNGdJQzB0YjNWMGJHbHVaUzF1WVhacFoyRjBiM0l0ZDJsa2RHZzZJREV3TUNVN1hHNTlYRzR2S2lBOVBUMDlQVDA5UFQwOUlHTnZiRzl5Y3k1MGFHVnRaU0F0SU9XZnV1ZWhnT21pbk9pSnN1V1BtT21IaittYmh1V1FpQ0E5UFQwOVBUMDlQVDA5SUNvdlhHNHZLaXBjYmlBcUlHVnNiR2x3YzJsekxteGxjM01nTFNEbWxvZm1uS3pubklIbmxhVWdiV2w0YVc1NElPV0h2ZWFWc0Z4dUlDb2dQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBWeHVJQ29nUTNKbFlYUmxaQ0JDZVRvZ1dXRnZhR0ZwZUdsaGIxeHVJQ29nVlhCa1lYUmxPaUF5TURJeUxqTXVNVEZjYmlBcUwxeHVMeW9nUFQwOVBUMDlJT2FXaCthY3JPZWNnZWVWcGVXSHZlYVZzQ0E5UFQwOVBUMGdLaTljYmk4cUtseHVJQ29nYzJoaFpHOTNMbXhsYzNNZ0xTRHBtTFRsdmJIbW9MZmx2SS9vcnI3bnZhNGdiV2w0YVc1NElPV0h2ZWFWc0Z4dUlDb2dQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBWeHVJQ29nUTNKbFlYUmxaQ0JDZVRvZ1dXRnZhR0ZwZUdsaGIxeHVJQ29nVlhCa1lYUmxPaUF5TURJeUxqTXVNakJjYmlBcUwxeHVMeW9nUFQwOVBUMDlJT21ZdE9XOXNlYWd0K1c4aitpdXZ1ZTlydVdIdmVhVnNDQTlQVDA5UFQwZ0tpOWNiaThxSUQwOVBUMDlQVDA5UFQwZ2FXTnZiaTUwYUdWdFpTQXRJSE4yWnlEbG03N21vSWZubW9UbW9MZmx2SThnUFQwOVBUMDlQVDA5UFNBcUwxeHVMbTkxZEd4cGJtVXRhV052YmlCN1hHNGdJSEJ2YzJsMGFXOXVPaUJ5Wld4aGRHbDJaVHRjYmlBZ2VpMXBibVJsZURvZ01UdGNiaUFnWkdsemNHeGhlVG9nYVc1c2FXNWxMV0pzYjJOck8xeHVJQ0IyWlhKMGFXTmhiQzFoYkdsbmJqb2diV2xrWkd4bE8xeHVJQ0IzYVdSMGFEb2dNV1Z0TzF4dUlDQm9aV2xuYUhRNklERmxiVHRjYmlBZ2IzWmxjbVpzYjNjNklHaHBaR1JsYmp0Y2JuMWNiaTV2ZFhSc2FXNWxMV2xqYjI1ZlgzTjJaeUI3WEc0Z0lIQnZjMmwwYVc5dU9pQmhZbk52YkhWMFpUdGNiaUFnZWkxcGJtUmxlRG9nTWp0Y2JpQWdkRzl3T2lBMU1DVTdYRzRnSUd4bFpuUTZJRFV3SlR0Y2JpQWdkMmxrZEdnNklERmxiVHRjYmlBZ2FHVnBaMmgwT2lBeFpXMDdYRzRnSUdacGJHdzZJR04xY25KbGJuUmpiMnh2Y2p0Y2JpQWdkSEpoYm5ObWIzSnRPaUIwY21GdWMyeGhkR1VvTFRVd0pTd2dMVFV3SlNrN1hHNGdJRzkyWlhKbWJHOTNPaUJvYVdSa1pXNDdYRzU5WEc0dWIzVjBiR2x1WlMxcFkyOXVYMmhwWkdSbGJpQjdYRzRnSUdScGMzQnNZWGs2SUc1dmJtVTdYRzU5WEc0dWIzVjBiR2x1WlMxb1pXRmthVzVuSUh0Y2JpQWdjRzl6YVhScGIyNDZJSEpsYkdGMGFYWmxPMXh1SUNCNkxXbHVaR1Y0T2lBeE8xeHVJQ0J2ZG1WeVpteHZkem9nYUdsa1pHVnVPMXh1ZlZ4dUxtOTFkR3hwYm1VdGFHVmhaR2x1WjE5ZllXNWphRzl5SUh0Y2JpQWdaR2x6Y0d4aGVUb2dibTl1WlR0Y2JuMWNiaTV2ZFhSc2FXNWxMV2hsWVdScGJtZGZYMkZ1WTJodmNqcHNhVzVyTEZ4dUxtOTFkR3hwYm1VdGFHVmhaR2x1WjE5ZllXNWphRzl5T25acGMybDBaV1FzWEc0dWIzVjBiR2x1WlMxb1pXRmthVzVuWDE5aGJtTm9iM0k2YUc5MlpYSWdlMXh1SUNCamIyeHZjam9nSXprNU9UdGNiaUFnZEdWNGRDMWtaV052Y21GMGFXOXVPaUJ1YjI1bE8xeHVmVnh1TG05MWRHeHBibVV0YUdWaFpHbHVaMTlmWVc1amFHOXlPbWh2ZG1WeUlIdGNiaUFnWTI5c2IzSTZJQ00xTURkaFptVTdYRzU5WEc0dWIzVjBiR2x1WlMxb1pXRmthVzVuT21odmRtVnlJQzV2ZFhSc2FXNWxMV2hsWVdScGJtZGZYMkZ1WTJodmNpQjdYRzRnSUdScGMzQnNZWGs2SUdsdWJHbHVaUzFpYkc5amF6dGNibjFjYmk1dmRYUnNhVzVsTFdobFlXUnBibWRmYzNSaGNuUTZhRzkyWlhJZ2UxeHVJQ0J2ZG1WeVpteHZkem9nZG1semFXSnNaVHRjYm4xY2JpNXZkWFJzYVc1bExXaGxZV1JwYm1kZmMzUmhjblFnTG05MWRHeHBibVV0YUdWaFpHbHVaMTlmWVc1amFHOXlJSHRjYmlBZ2NHOXphWFJwYjI0NklHRmljMjlzZFhSbE8xeHVJQ0I2TFdsdVpHVjRPaUF5TzF4dUlDQjBiM0E2SURVd0pUdGNiaUFnZEhKaGJuTm1iM0p0T2lCMGNtRnVjMnhoZEdWWktDMDFNQ1VwTzF4dUlDQnNaV1owT2lBdE1XVnRPMXh1ZlZ4dUxtOTFkR3hwYm1VdFpISmhkMlZ5SUh0Y2JpQWdjRzl6YVhScGIyNDZJSEpsYkdGMGFYWmxPMXh1SUNCNkxXbHVaR1Y0T2lBdE1UdGNiaUFnZEc5d09pQXdPMXh1SUNCc1pXWjBPaUF3TzF4dUlDQnRZWEpuYVc0NklEQTdYRzRnSUhkcFpIUm9PaUF4TURBbE8xeHVJQ0JvWldsbmFIUTZJREV3TUNVN1hHNGdJR0p2ZUMxemFYcHBibWM2SUdKdmNtUmxjaTFpYjNnN1hHNGdJSFpwYzJsaWFXeHBkSGs2SUdocFpHUmxianRjYmlBZ2IzWmxjbVpzYjNjNklHaHBaR1JsYmp0Y2JuMWNiaTV2ZFhSc2FXNWxMV1J5WVhkbGNsOWZiVzlrWVd3Z2UxeHVJQ0JpYjNndGMyaGhaRzkzT2lBd0lEQWdObkI0SURGd2VDQWpaR05rWm1VMk8xeHVJQ0JrYVhOd2JHRjVPaUJtYkdWNE8xeHVJQ0JtYkdWNExXUnBjbVZqZEdsdmJqb2dZMjlzZFcxdU8xeHVJQ0JtYkdWNExYZHlZWEE2SUc1dmQzSmhjRHRjYmlBZ2NHOXphWFJwYjI0NklHRmljMjlzZFhSbE8xeHVJQ0I2TFdsdVpHVjRPaUF5TVR0Y2JpQWdhR1ZwWjJoME9pQXhNREFsTzF4dUlDQmlZV05yWjNKdmRXNWtMV052Ykc5eU9pQWpabVptTzF4dUlDQjBjbUZ1YzJsMGFXOXVMV1IxY21GMGFXOXVPaUF3TGpSek8xeHVJQ0J2ZG1WeVpteHZkem9nYUdsa1pHVnVPMXh1ZlZ4dUxtOTFkR3hwYm1VdFpISmhkMlZ5WDE5b1pXRmtaWElzWEc0dWIzVjBiR2x1WlMxa2NtRjNaWEpmWDIxaGFXNHNYRzR1YjNWMGJHbHVaUzFrY21GM1pYSmZYMlp2YjNSbGNpQjdYRzRnSUhkcFpIUm9PaUF4TURBbE8xeHVJQ0JpYjNndGMybDZhVzVuT2lCaWIzSmtaWEl0WW05NE8xeHVmVnh1TG05MWRHeHBibVV0WkhKaGQyVnlYMTlvWldGa1pYSXNYRzR1YjNWMGJHbHVaUzFrY21GM1pYSmZYMlp2YjNSbGNpQjdYRzRnSUdac1pYZ3RjMmh5YVc1ck9pQXdPMXh1ZlZ4dUxtOTFkR3hwYm1VdFpISmhkMlZ5WDE5MGFYUnNaU3hjYmk1dmRYUnNhVzVsTFdSeVlYZGxjbDlmYldGcGJpeGNiaTV2ZFhSc2FXNWxMV1J5WVhkbGNsOWZabTl2ZEdWeUlIdGNiaUFnY0dGa1pHbHVaem9nTUNBeE5uQjRPMXh1ZlZ4dUxtOTFkR3hwYm1VdFpISmhkMlZ5WDE5b1pXRmtaWElzWEc0dWIzVjBiR2x1WlMxa2NtRjNaWEpmWDNScGRHeGxJSHRjYmlBZ2NHOXphWFJwYjI0NklISmxiR0YwYVhabE8xeHVJQ0I2TFdsdVpHVjRPaUF4TzF4dUlDQnRZWEpuYVc0NklEQWdZWFYwYnp0Y2JpQWdhR1ZwWjJoME9pQTFNbkI0TzF4dUlDQnNhVzVsTFdobGFXZG9kRG9nTlRKd2VEdGNiaUFnYjNabGNtWnNiM2M2SUdocFpHUmxianRjYm4xY2JpNXZkWFJzYVc1bExXUnlZWGRsY2w5ZmRHbDBiR1VnZTF4dUlDQm1iMjUwTFhOcGVtVTZJREUyY0hnN1hHNGdJR1p2Ym5RdGQyVnBaMmgwT2lBME1EQTdYRzRnSUcxaGNtZHBiam9nTUNBeE5uQjRPMXh1SUNCaWIzZ3RjMmw2YVc1bk9pQmliM0prWlhJdFltOTRPMXh1SUNCaWIzSmtaWEl0WW05MGRHOXRPaUF4Y0hnZ2MyOXNhV1FnSTJSalpHWmxOanRjYm4xY2JpNXZkWFJzYVc1bExXUnlZWGRsY2w5ZlkyeHZjMlVnZTF4dUlDQndiM05wZEdsdmJqb2dZV0p6YjJ4MWRHVTdYRzRnSUhvdGFXNWtaWGc2SURJN1hHNGdJSFJ2Y0RvZ05UQWxPMXh1SUNCeWFXZG9kRG9nTVRKd2VEdGNiaUFnZDJsa2RHZzZJREl3Y0hnN1hHNGdJR2hsYVdkb2REb2dNakJ3ZUR0Y2JpQWdiR2x1WlMxb1pXbG5hSFE2SURJd2NIZzdYRzRnSUdOdmJHOXlPaUFqT1RrNU8xeHVJQ0JtYjI1MExYTnBlbVU2SURJd2NIZzdYRzRnSUhSbGVIUXRZV3hwWjI0NklHTmxiblJsY2p0Y2JpQWdZM1Z5YzI5eU9pQndiMmx1ZEdWeU8xeHVJQ0IwY21GdWMyWnZjbTA2SUhSeVlXNXpiR0YwWlZrb0xUVXdKU2s3WEc0Z0lHOTJaWEptYkc5M09pQm9hV1JrWlc0N1hHNTlYRzR1YjNWMGJHbHVaUzFrY21GM1pYSmZYMk5zYjNObElDNXZkWFJzYVc1bExXbGpiMjRnZTF4dUlDQndiM05wZEdsdmJqb2dZV0p6YjJ4MWRHVTdYRzRnSUhvdGFXNWtaWGc2SURJN1hHNGdJSFJ2Y0RvZ01EdGNiaUFnYkdWbWREb2dNRHRjYm4xY2JpNXZkWFJzYVc1bExXUnlZWGRsY2w5ZlkyeHZjMlU2YUc5MlpYSWdlMXh1SUNCamIyeHZjam9nSXpZMk5qdGNibjFjYmk1dmRYUnNhVzVsTFdSeVlYZGxjbDlmYldGcGJpQjdYRzRnSUdac1pYZzZJREU3WEc0Z0lHOTJaWEptYkc5M09pQmhkWFJ2TzF4dWZWeHVMbTkxZEd4cGJtVXRaSEpoZDJWeVgxOXRZV2x1TG05MlpYSm1iRzkzTFdocFpHUmxiaUI3WEc0Z0lHOTJaWEptYkc5M09pQm9hV1JrWlc0N1hHNTlYRzR1YjNWMGJHbHVaUzFrY21GM1pYSmZYMlp2YjNSbGNpQjdYRzRnSUcxaGNtZHBiam9nTUNCaGRYUnZPMXh1SUNCMFpYaDBMV0ZzYVdkdU9pQnlhV2RvZER0Y2JpQWdiM1psY21ac2IzYzZJR2hwWkdSbGJqdGNibjFjYmk1dmRYUnNhVzVsTFdSeVlYZGxjbDlmYjNabGNteGhlU0I3WEc0Z0lHTnZiblJsYm5RNklDY25PMXh1SUNCd2IzTnBkR2x2YmpvZ2NtVnNZWFJwZG1VN1hHNGdJSG90YVc1a1pYZzZJREU3WEc0Z0lIUnZjRG9nTUR0Y2JpQWdiR1ZtZERvZ01EdGNiaUFnZDJsa2RHZzZJREV3TUNVN1hHNGdJR2hsYVdkb2REb2dNVEF3SlR0Y2JpQWdZbUZqYTJkeWIzVnVaQzFqYjJ4dmNqb2dJMlptWmp0Y2JpQWdiM0JoWTJsMGVUb2dNQzR4TzF4dUlDQnZkbVZ5Wm14dmR6b2dhR2xrWkdWdU8xeHVmVnh1TG05MWRHeHBibVV0WkhKaGQyVnlYM0owYkM1dmRYUnNhVzVsTFdSeVlYZGxjbDkwYVc1NUxGeHVMbTkxZEd4cGJtVXRaSEpoZDJWeVgyeDBjaTV2ZFhSc2FXNWxMV1J5WVhkbGNsOTBhVzU1SUh0Y2JpQWdkMmxrZEdnNklESTRNSEI0TzF4dWZWeHVMbTkxZEd4cGJtVXRaSEpoZDJWeVgzSjBiQzV2ZFhSc2FXNWxMV1J5WVhkbGNsOXRhVzVwTEZ4dUxtOTFkR3hwYm1VdFpISmhkMlZ5WDJ4MGNpNXZkWFJzYVc1bExXUnlZWGRsY2w5dGFXNXBJSHRjYmlBZ2QybGtkR2c2SURRNE1IQjRPMXh1ZlZ4dUxtOTFkR3hwYm1VdFpISmhkMlZ5WDNKMGJDNXZkWFJzYVc1bExXUnlZWGRsY2w5emJXRnNiQ3hjYmk1dmRYUnNhVzVsTFdSeVlYZGxjbDlzZEhJdWIzVjBiR2x1WlMxa2NtRjNaWEpmYzIxaGJHd2dlMXh1SUNCM2FXUjBhRG9nTlRRd2NIZzdYRzU5WEc0dWIzVjBiR2x1WlMxa2NtRjNaWEpmY25Sc0xtOTFkR3hwYm1VdFpISmhkMlZ5WDNKbFozVnNZWElzWEc0dWIzVjBiR2x1WlMxa2NtRjNaWEpmYkhSeUxtOTFkR3hwYm1VdFpISmhkMlZ5WDNKbFozVnNZWElnZTF4dUlDQjNhV1IwYURvZ05qZ3djSGc3WEc1OVhHNHViM1YwYkdsdVpTMWtjbUYzWlhKZmNuUnNMbTkxZEd4cGJtVXRaSEpoZDJWeVgyMWxaR2wxYlN4Y2JpNXZkWFJzYVc1bExXUnlZWGRsY2w5c2RISXViM1YwYkdsdVpTMWtjbUYzWlhKZmJXVmthWFZ0SUh0Y2JpQWdkMmxrZEdnNklEY3lNSEI0TzF4dWZWeHVMbTkxZEd4cGJtVXRaSEpoZDJWeVgzSjBiQzV2ZFhSc2FXNWxMV1J5WVhkbGNsOXNZWEpuWlN4Y2JpNXZkWFJzYVc1bExXUnlZWGRsY2w5c2RISXViM1YwYkdsdVpTMWtjbUYzWlhKZmJHRnlaMlVnZTF4dUlDQjNhV1IwYURvZ09UWXdjSGc3WEc1OVhHNHViM1YwYkdsdVpTMWtjbUYzWlhKZmNuUnNJSHRjYmlBZ1ltOXlaR1Z5TFd4bFpuUTZJREZ3ZUNCemIyeHBaQ0FqWkdOa1ptVTJPMXh1ZlZ4dUxtOTFkR3hwYm1VdFpISmhkMlZ5WDNKMGJDNXZkWFJzYVc1bExXUnlZWGRsY2w5MGFXNTVMbTkxZEd4cGJtVXRaSEpoZDJWeVgyTnNiM05sWkNCN1hHNGdJSEpwWjJoME9pQXRNamt3Y0hnN1hHNTlYRzR1YjNWMGJHbHVaUzFrY21GM1pYSmZjblJzTG05MWRHeHBibVV0WkhKaGQyVnlYMjFwYm1rdWIzVjBiR2x1WlMxa2NtRjNaWEpmWTJ4dmMyVmtJSHRjYmlBZ2NtbG5hSFE2SUMwME9UQndlRHRjYm4xY2JpNXZkWFJzYVc1bExXUnlZWGRsY2w5eWRHd3ViM1YwYkdsdVpTMWtjbUYzWlhKZmMyMWhiR3d1YjNWMGJHbHVaUzFrY21GM1pYSmZZMnh2YzJWa0lIdGNiaUFnY21sbmFIUTZJQzAxTlRCd2VEdGNibjFjYmk1dmRYUnNhVzVsTFdSeVlYZGxjbDl5ZEd3dWIzVjBiR2x1WlMxa2NtRjNaWEpmY21WbmRXeGhjaTV2ZFhSc2FXNWxMV1J5WVhkbGNsOWpiRzl6WldRZ2UxeHVJQ0J5YVdkb2REb2dMVFk1TUhCNE8xeHVmVnh1TG05MWRHeHBibVV0WkhKaGQyVnlYM0owYkM1dmRYUnNhVzVsTFdSeVlYZGxjbDl0WldScGRXMHViM1YwYkdsdVpTMWtjbUYzWlhKZlkyeHZjMlZrSUh0Y2JpQWdjbWxuYUhRNklDMDNNekJ3ZUR0Y2JuMWNiaTV2ZFhSc2FXNWxMV1J5WVhkbGNsOXlkR3d1YjNWMGJHbHVaUzFrY21GM1pYSmZiR0Z5WjJVdWIzVjBiR2x1WlMxa2NtRjNaWEpmWTJ4dmMyVmtJSHRjYmlBZ2NtbG5hSFE2SUMwNU56QndlRHRjYm4xY2JpNXZkWFJzYVc1bExXUnlZWGRsY2w5c2RISWdlMXh1SUNCaWIzSmtaWEl0Y21sbmFIUTZJREZ3ZUNCemIyeHBaQ0FqWkdOa1ptVTJPMXh1ZlZ4dUxtOTFkR3hwYm1VdFpISmhkMlZ5WDJ4MGNpNXZkWFJzYVc1bExXUnlZWGRsY2w5MGFXNTVMbTkxZEd4cGJtVXRaSEpoZDJWeVgyTnNiM05sWkNCN1hHNGdJR3hsWm5RNklDMHlPVEJ3ZUR0Y2JuMWNiaTV2ZFhSc2FXNWxMV1J5WVhkbGNsOXNkSEl1YjNWMGJHbHVaUzFrY21GM1pYSmZiV2x1YVM1dmRYUnNhVzVsTFdSeVlYZGxjbDlqYkc5elpXUWdlMXh1SUNCc1pXWjBPaUF0TkRrd2NIZzdYRzU5WEc0dWIzVjBiR2x1WlMxa2NtRjNaWEpmYkhSeUxtOTFkR3hwYm1VdFpISmhkMlZ5WDNOdFlXeHNMbTkxZEd4cGJtVXRaSEpoZDJWeVgyTnNiM05sWkNCN1hHNGdJR3hsWm5RNklDMDFOVEJ3ZUR0Y2JuMWNiaTV2ZFhSc2FXNWxMV1J5WVhkbGNsOXNkSEl1YjNWMGJHbHVaUzFrY21GM1pYSmZjbVZuZFd4aGNpNXZkWFJzYVc1bExXUnlZWGRsY2w5amJHOXpaV1FnZTF4dUlDQnNaV1owT2lBdE5qa3djSGc3WEc1OVhHNHViM1YwYkdsdVpTMWtjbUYzWlhKZmJIUnlMbTkxZEd4cGJtVXRaSEpoZDJWeVgyMWxaR2wxYlM1dmRYUnNhVzVsTFdSeVlYZGxjbDlqYkc5elpXUWdlMXh1SUNCc1pXWjBPaUF0TnpNd2NIZzdYRzU5WEc0dWIzVjBiR2x1WlMxa2NtRjNaWEpmYkhSeUxtOTFkR3hwYm1VdFpISmhkMlZ5WDJ4aGNtZGxMbTkxZEd4cGJtVXRaSEpoZDJWeVgyTnNiM05sWkNCN1hHNGdJR3hsWm5RNklDMDVOekJ3ZUR0Y2JuMWNiaTV2ZFhSc2FXNWxMV1J5WVhkbGNsOTBkR0lzWEc0dWIzVjBiR2x1WlMxa2NtRjNaWEpmWW5SMElIdGNiaUFnYkdWbWREb2dNRHRjYmlBZ2QybGtkR2c2SURFd01DVTdYRzU5WEc0dWIzVjBiR2x1WlMxa2NtRjNaWEpmZEhSaUxtOTFkR3hwYm1VdFpISmhkMlZ5WDNScGJua3NYRzR1YjNWMGJHbHVaUzFrY21GM1pYSmZZblIwTG05MWRHeHBibVV0WkhKaGQyVnlYM1JwYm5rZ2UxeHVJQ0JvWldsbmFIUTZJREkwTUhCNE8xeHVmVnh1TG05MWRHeHBibVV0WkhKaGQyVnlYM1IwWWk1dmRYUnNhVzVsTFdSeVlYZGxjbDl0YVc1cExGeHVMbTkxZEd4cGJtVXRaSEpoZDJWeVgySjBkQzV2ZFhSc2FXNWxMV1J5WVhkbGNsOXRhVzVwSUh0Y2JpQWdhR1ZwWjJoME9pQXpNakJ3ZUR0Y2JuMWNiaTV2ZFhSc2FXNWxMV1J5WVhkbGNsOTBkR0l1YjNWMGJHbHVaUzFrY21GM1pYSmZjMjFoYkd3c1hHNHViM1YwYkdsdVpTMWtjbUYzWlhKZlluUjBMbTkxZEd4cGJtVXRaSEpoZDJWeVgzTnRZV3hzSUh0Y2JpQWdhR1ZwWjJoME9pQXpOakJ3ZUR0Y2JuMWNiaTV2ZFhSc2FXNWxMV1J5WVhkbGNsOTBkR0l1YjNWMGJHbHVaUzFrY21GM1pYSmZjbVZuZFd4aGNpeGNiaTV2ZFhSc2FXNWxMV1J5WVhkbGNsOWlkSFF1YjNWMGJHbHVaUzFrY21GM1pYSmZjbVZuZFd4aGNpQjdYRzRnSUdobGFXZG9kRG9nTkRBd2NIZzdYRzU5WEc0dWIzVjBiR2x1WlMxa2NtRjNaWEpmZEhSaUxtOTFkR3hwYm1VdFpISmhkMlZ5WDIxbFpHbDFiU3hjYmk1dmRYUnNhVzVsTFdSeVlYZGxjbDlpZEhRdWIzVjBiR2x1WlMxa2NtRjNaWEpmYldWa2FYVnRJSHRjYmlBZ2FHVnBaMmgwT2lBME5EQndlRHRjYm4xY2JpNXZkWFJzYVc1bExXUnlZWGRsY2w5MGRHSXViM1YwYkdsdVpTMWtjbUYzWlhKZmJHRnlaMlVzWEc0dWIzVjBiR2x1WlMxa2NtRjNaWEpmWW5SMExtOTFkR3hwYm1VdFpISmhkMlZ5WDJ4aGNtZGxJSHRjYmlBZ2FHVnBaMmgwT2lBME9EQndlRHRjYm4xY2JpNXZkWFJzYVc1bExXUnlZWGRsY2w5MGRHSWdlMXh1SUNCaWIzSmtaWEl0WW05MGRHOXRPaUF4Y0hnZ2MyOXNhV1FnSTJSalpHWmxOanRjYm4xY2JpNXZkWFJzYVc1bExXUnlZWGRsY2w5MGRHSXViM1YwYkdsdVpTMWtjbUYzWlhKZmRHbHVlUzV2ZFhSc2FXNWxMV1J5WVhkbGNsOWpiRzl6WldRZ2UxeHVJQ0IwYjNBNklDMHlOVEJ3ZUR0Y2JuMWNiaTV2ZFhSc2FXNWxMV1J5WVhkbGNsOTBkR0l1YjNWMGJHbHVaUzFrY21GM1pYSmZiV2x1YVM1dmRYUnNhVzVsTFdSeVlYZGxjbDlqYkc5elpXUWdlMXh1SUNCMGIzQTZJQzB6TXpCd2VEdGNibjFjYmk1dmRYUnNhVzVsTFdSeVlYZGxjbDkwZEdJdWIzVjBiR2x1WlMxa2NtRjNaWEpmYzIxaGJHd3ViM1YwYkdsdVpTMWtjbUYzWlhKZlkyeHZjMlZrSUh0Y2JpQWdkRzl3T2lBdE16Y3djSGc3WEc1OVhHNHViM1YwYkdsdVpTMWtjbUYzWlhKZmRIUmlMbTkxZEd4cGJtVXRaSEpoZDJWeVgzSmxaM1ZzWVhJdWIzVjBiR2x1WlMxa2NtRjNaWEpmWTJ4dmMyVmtJSHRjYmlBZ2RHOXdPaUF0TkRFd2NIZzdYRzU5WEc0dWIzVjBiR2x1WlMxa2NtRjNaWEpmZEhSaUxtOTFkR3hwYm1VdFpISmhkMlZ5WDIxbFpHbDFiUzV2ZFhSc2FXNWxMV1J5WVhkbGNsOWpiRzl6WldRZ2UxeHVJQ0IwYjNBNklDMDBOVEJ3ZUR0Y2JuMWNiaTV2ZFhSc2FXNWxMV1J5WVhkbGNsOTBkR0l1YjNWMGJHbHVaUzFrY21GM1pYSmZiR0Z5WjJVdWIzVjBiR2x1WlMxa2NtRjNaWEpmWTJ4dmMyVmtJSHRjYmlBZ2RHOXdPaUF0TkRrd2NIZzdYRzU5WEc0dWIzVjBiR2x1WlMxa2NtRjNaWEpmWW5SMElIdGNiaUFnZEc5d09pQnBibWwwYVdGc08xeHVJQ0JpYjNKa1pYSXRkRzl3T2lBeGNIZ2djMjlzYVdRZ0kyUmpaR1psTmp0Y2JuMWNiaTV2ZFhSc2FXNWxMV1J5WVhkbGNsOWlkSFF1YjNWMGJHbHVaUzFrY21GM1pYSmZkR2x1ZVM1dmRYUnNhVzVsTFdSeVlYZGxjbDlqYkc5elpXUWdlMXh1SUNCaWIzUjBiMjA2SUMweU5UQndlRHRjYm4xY2JpNXZkWFJzYVc1bExXUnlZWGRsY2w5aWRIUXViM1YwYkdsdVpTMWtjbUYzWlhKZmJXbHVhUzV2ZFhSc2FXNWxMV1J5WVhkbGNsOWpiRzl6WldRZ2UxeHVJQ0JpYjNSMGIyMDZJQzB6TXpCd2VEdGNibjFjYmk1dmRYUnNhVzVsTFdSeVlYZGxjbDlpZEhRdWIzVjBiR2x1WlMxa2NtRjNaWEpmYzIxaGJHd3ViM1YwYkdsdVpTMWtjbUYzWlhKZlkyeHZjMlZrSUh0Y2JpQWdZbTkwZEc5dE9pQXRNemN3Y0hnN1hHNTlYRzR1YjNWMGJHbHVaUzFrY21GM1pYSmZZblIwTG05MWRHeHBibVV0WkhKaGQyVnlYM0psWjNWc1lYSXViM1YwYkdsdVpTMWtjbUYzWlhKZlkyeHZjMlZrSUh0Y2JpQWdZbTkwZEc5dE9pQXROREV3Y0hnN1hHNTlYRzR1YjNWMGJHbHVaUzFrY21GM1pYSmZZblIwTG05MWRHeHBibVV0WkhKaGQyVnlYMjFsWkdsMWJTNXZkWFJzYVc1bExXUnlZWGRsY2w5amJHOXpaV1FnZTF4dUlDQmliM1IwYjIwNklDMDBOVEJ3ZUR0Y2JuMWNiaTV2ZFhSc2FXNWxMV1J5WVhkbGNsOWlkSFF1YjNWMGJHbHVaUzFrY21GM1pYSmZiR0Z5WjJVdWIzVjBiR2x1WlMxa2NtRjNaWEpmWTJ4dmMyVmtJSHRjYmlBZ1ltOTBkRzl0T2lBdE5Ea3djSGc3WEc1OVhHNHViM1YwYkdsdVpTMWtjbUYzWlhKZmIzQmxibVZrSUh0Y2JpQWdkbWx6YVdKcGJHbDBlVG9nZG1semFXSnNaVHRjYmlBZ2VpMXBibVJsZURvZ2RtRnlLQzB0YjNWMGJHbHVaUzE2U1c1a1pYZ3BPMXh1ZlZ4dUxtOTFkR3hwYm1VdFpISmhkMlZ5WDI5d1pXNWxaQzV2ZFhSc2FXNWxMV1J5WVhkbGNpQjdYRzRnSUhCdmMybDBhVzl1T2lCbWFYaGxaRHRjYm4xY2JpNXZkWFJzYVc1bExXUnlZWGRsY2w5dmNHVnVaV1F1YjNWMGJHbHVaUzFrY21GM1pYSmZjblJzSUh0Y2JpQWdjbWxuYUhRNklEQTdYRzU5WEc0dWIzVjBiR2x1WlMxa2NtRjNaWEpmYjNCbGJtVmtMbTkxZEd4cGJtVXRaSEpoZDJWeVgyeDBjaUI3WEc0Z0lHeGxablE2SURBN1hHNTlYRzR1YjNWMGJHbHVaUzFrY21GM1pYSmZiM0JsYm1Wa0xtOTFkR3hwYm1VdFpISmhkMlZ5WDNSMFlpQjdYRzRnSUhSdmNEb2dNRHRjYm4xY2JpNXZkWFJzYVc1bExXUnlZWGRsY2w5dmNHVnVaV1F1YjNWMGJHbHVaUzFrY21GM1pYSmZZblIwSUh0Y2JpQWdZbTkwZEc5dE9pQXdPMXh1ZlZ4dUxtOTFkR3hwYm1VdFpISmhkMlZ5WDI5bVpuTmxkQzV2ZFhSc2FXNWxMV1J5WVhkbGNsOXlkR3dzWEc0dWIzVjBiR2x1WlMxa2NtRjNaWEpmYjJabWMyVjBMbTkxZEd4cGJtVXRaSEpoZDJWeVgyeDBjaUI3WEc0Z0lHaGxhV2RvZERvZ1kyRnNZeWd4TURBbElDMGdOR1Z0S1R0Y2JpQWdkRzl3T2lBMU1DVTdYRzRnSUhSeVlXNXpabTl5YlRvZ2RISmhibk5zWVhSbFdTZ3ROVEFsS1R0Y2JuMWNiaTV2ZFhSc2FXNWxMV1J5WVhkbGNsOXZabVp6WlhRdWIzVjBiR2x1WlMxa2NtRjNaWEpmZEhSaUxGeHVMbTkxZEd4cGJtVXRaSEpoZDJWeVgyOW1abk5sZEM1dmRYUnNhVzVsTFdSeVlYZGxjbDlpZEhRZ2UxeHVJQ0IzYVdSMGFEb2dZMkZzWXlneE1EQWxJQzBnTkdWdEtUdGNiaUFnYkdWbWREb2dOVEFsTzF4dUlDQjBjbUZ1YzJadmNtMDZJSFJ5WVc1emJHRjBaVmdvTFRVd0pTazdYRzU5WEc0dWIzVjBiR2x1WlMxa2NtRjNaWEpmYjJabWMyVjBMbTkxZEd4cGJtVXRaSEpoZDJWeVgyOXdaVzVsWkM1dmRYUnNhVzVsTFdSeVlYZGxjbDl5ZEd3Z2UxeHVJQ0J5YVdkb2REb2dNbVZ0TzF4dWZWeHVMbTkxZEd4cGJtVXRaSEpoZDJWeVgyOW1abk5sZEM1dmRYUnNhVzVsTFdSeVlYZGxjbDl2Y0dWdVpXUXViM1YwYkdsdVpTMWtjbUYzWlhKZmJIUnlJSHRjYmlBZ2JHVm1kRG9nTW1WdE8xeHVmVnh1TG05MWRHeHBibVV0WkhKaGQyVnlYMjltWm5ObGRDNXZkWFJzYVc1bExXUnlZWGRsY2w5dmNHVnVaV1F1YjNWMGJHbHVaUzFrY21GM1pYSmZkSFJpSUh0Y2JpQWdkRzl3T2lBeVpXMDdYRzU5WEc0dWIzVjBiR2x1WlMxa2NtRjNaWEpmYjJabWMyVjBMbTkxZEd4cGJtVXRaSEpoZDJWeVgyOXdaVzVsWkM1dmRYUnNhVzVsTFdSeVlYZGxjbDlpZEhRZ2UxeHVJQ0JpYjNSMGIyMDZJREpsYlR0Y2JuMWNiaTV2ZFhSc2FXNWxMV1J5WVhkbGNsOWhkWFJ2TG05MWRHeHBibVV0WkhKaGQyVnlYM0owYkN4Y2JpNXZkWFJzYVc1bExXUnlZWGRsY2w5aGRYUnZMbTkxZEd4cGJtVXRaSEpoZDJWeVgyeDBjaUI3WEc0Z0lHaGxhV2RvZERvZ1lYVjBienRjYmlBZ2JXRjRMV2hsYVdkb2REb2dZMkZzWXlneE1EQWxJQzBnTkdWdEtUdGNibjFjYmk1dmRYUnNhVzVsTFdSeVlYZGxjbDltZFd4c0lIdGNiaUFnY0dGa1pHbHVaem9nTUR0Y2JuMWNiaTV2ZFhSc2FXNWxMVzVoZG1sbllYUnZjaUI3WEc0Z0lIQnZjMmwwYVc5dU9pQnlaV3hoZEdsMlpUdGNiaUFnZWkxcGJtUmxlRG9nTVR0Y2JpQWdiV0Z5WjJsdU9pQXdPMXh1SUNCM2FXUjBhRG9nZG1GeUtDMHRiM1YwYkdsdVpTMXVZWFpwWjJGMGIzSXRkMmxrZEdncE8xeHVJQ0J2ZG1WeVpteHZkem9nWVhWMGJ6dGNibjFjYmk1dmRYUnNhVzVsTFc1aGRtbG5ZWFJ2Y2kxd1lYSmxiblFnZTF4dUlDQjBjbUZ1YzJsMGFXOXVPaUF3TGpOeklHVmhjMlV0YVc0dGIzVjBPMXh1ZlZ4dUxtOTFkR3hwYm1VdGJtRjJhV2RoZEc5eVgxOTBhWFJzWlNCN1hHNGdJRzFoY21kcGJqb2dNQ0F4Tm5CNE8xeHVJQ0JvWldsbmFIUTZJRFF3Y0hnN1hHNGdJR3hwYm1VdGFHVnBaMmgwT2lBME1IQjRPMXh1SUNCd1lXUmthVzVuT2lBd0lERTJjSGc3WEc0Z0lHSnZjbVJsY2kxaWIzUjBiMjA2SURGd2VDQnpiMnhwWkNBalpHTmtabVUyTzF4dUlDQm1iMjUwTFhOcGVtVTZJREUyY0hnN1hHNGdJR1p2Ym5RdGQyVnBaMmgwT2lBME1EQTdYRzRnSUc5MlpYSm1iRzkzT2lCb2FXUmtaVzQ3WEc1OVhHNHViM1YwYkdsdVpTMXVZWFpwWjJGMGIzSmZYMjFoYVc0Z2UxeHVJQ0J3YjNOcGRHbHZiam9nY21Wc1lYUnBkbVU3WEc0Z0lIb3RhVzVrWlhnNklERTdYRzRnSUcxaGNtZHBiam9nTUR0Y2JpQWdiM1psY21ac2IzYzZJR2hwWkdSbGJqdGNibjFjYmk1dmRYUnNhVzVsTFc1aGRtbG5ZWFJ2Y2w5ZmJHbHpkQ3hjYmk1dmRYUnNhVzVsTFc1aGRtbG5ZWFJ2Y2w5ZmMzVmlhbVZqZEN4Y2JpNXZkWFJzYVc1bExXNWhkbWxuWVhSdmNsOWZhWFJsYlNCN1hHNGdJSEJ2YzJsMGFXOXVPaUJ5Wld4aGRHbDJaVHRjYmlBZ2VpMXBibVJsZURvZ01qdGNiaUFnYldGeVoybHVPaUF3TzF4dUlDQndZV1JrYVc1bk9pQXdPMXh1SUNCc2FYTjBMWE4wZVd4bExYUjVjR1U2SUc1dmJtVTdYRzRnSUc5MlpYSm1iRzkzT2lCb2FXUmtaVzQ3WEc1OVhHNHViM1YwYkdsdVpTMXVZWFpwWjJGMGIzSmZYMnhwYzNRZ2UxeHVJQ0J3WVdSa2FXNW5PaUF3TGpWbGJTQXdPMXh1ZlZ4dUxtOTFkR3hwYm1VdGJtRjJhV2RoZEc5eVgxOXpkV0pxWldOMElIdGNiaUFnY0dGa1pHbHVaeTFzWldaME9pQXhaVzA3WEc1OVhHNHViM1YwYkdsdVpTMXVZWFpwWjJGMGIzSmZYMmwwWlcwZ2UxeHVJQ0J0WVhKbmFXNDZJREE3WEc0Z0lHeHBibVV0YUdWcFoyaDBPaUF6TUhCNE8xeHVJQ0JtYjI1MExYTnBlbVU2SURFemNIZzdYRzRnSUc5MlpYSm1iRzkzT2lCb2FXUmtaVzQ3WEc1OVhHNHViM1YwYkdsdVpTMXVZWFpwWjJGMGIzSmZYM0JzWVdObGFHOXNaR1Z5SUh0Y2JpQWdjRzl6YVhScGIyNDZJR0ZpYzI5c2RYUmxPMXh1SUNCNkxXbHVaR1Y0T2lBeE8xeHVJQ0IwYjNBNklEQTdYRzRnSUd4bFpuUTZJREE3WEc0Z0lIZHBaSFJvT2lBeE1EQWxPMXh1SUNCb1pXbG5hSFE2SURNd2NIZzdYRzRnSUdKaFkydG5jbTkxYm1RdFkyOXNiM0k2SUNObU4yWTRaams3WEc0Z0lHSnZjbVJsY2kxc1pXWjBPaUF5Y0hnZ2MyOXNhV1FnSXpBMU9EazBNanRjYmlBZ2RISmhibk5wZEdsdmJpMWtkWEpoZEdsdmJqb2dNQzR5Y3p0Y2JpQWdZbTk0TFhOcGVtbHVaem9nWW05eVpHVnlMV0p2ZUR0Y2JpQWdiM1psY21ac2IzYzZJR2hwWkdSbGJqdGNibjFjYmk1dmRYUnNhVzVsTFc1aGRtbG5ZWFJ2Y2w5ZllXNWphRzl5SUh0Y2JpQWdkMmhwZEdVdGMzQmhZMlU2SUc1dmQzSmhjRHRjYmlBZ2RHVjRkQzF2ZG1WeVpteHZkem9nWld4c2FYQnphWE03WEc0Z0lHOTJaWEptYkc5M09pQm9hV1JrWlc0N1hHNGdJR1JwYzNCc1lYazZJR0pzYjJOck8xeHVJQ0J3WVdSa2FXNW5PaUF3SURFdU5XVnRPMXh1ZlZ4dUxtOTFkR3hwYm1VdGJtRjJhV2RoZEc5eVgxOWhibU5vYjNJNmJHbHVheXhjYmk1dmRYUnNhVzVsTFc1aGRtbG5ZWFJ2Y2w5ZllXNWphRzl5T25acGMybDBaV1FzWEc0dWIzVjBiR2x1WlMxdVlYWnBaMkYwYjNKZlgyRnVZMmh2Y2pwb2IzWmxjaUI3WEc0Z0lIUmxlSFF0WkdWamIzSmhkR2x2YmpvZ2JtOXVaVHRjYmlBZ1kyOXNiM0k2SUNNMU5UVTdYRzU5WEc0dWIzVjBiR2x1WlMxdVlYWnBaMkYwYjNKZlgyRnVZMmh2Y2pwb2IzWmxjaUI3WEc0Z0lHTnZiRzl5T2lBak1EVTRPVFF5TzF4dWZWeHVMbTkxZEd4cGJtVXRibUYyYVdkaGRHOXlYMTlqYjJSbElIdGNiaUFnY0dGa1pHbHVaeTF5YVdkb2REb2dNQzQxWlcwN1hHNTlYRzR1YjNWMGJHbHVaUzF1WVhacFoyRjBiM0pmYUdsbmFHeHBaMmgwTG05MWRHeHBibVV0Ym1GMmFXZGhkRzl5WDE5aGJtTm9iM0k2YkdsdWF5eGNiaTV2ZFhSc2FXNWxMVzVoZG1sbllYUnZjbDlvYVdkb2JHbG5hSFF1YjNWMGJHbHVaUzF1WVhacFoyRjBiM0pmWDJGdVkyaHZjanAyYVhOcGRHVmtMRnh1TG05MWRHeHBibVV0Ym1GMmFXZGhkRzl5WDJocFoyaHNhV2RvZEM1dmRYUnNhVzVsTFc1aGRtbG5ZWFJ2Y2w5ZllXNWphRzl5T21odmRtVnlJSHRjYmlBZ1kyOXNiM0k2SUNNd05UZzVOREk3WEc0Z0lHWnZiblF0ZDJWcFoyaDBPaUJpYjJ4a08xeHVmVnh1TG05MWRHeHBibVV0Ym1GMmFXZGhkRzl5WDNOMGFXTnJlU3hjYmk1dmRYUnNhVzVsTFc1aGRtbG5ZWFJ2Y2w5bWFYaGxaQ0I3WEc0Z0lHUnBjM0JzWVhrNklHWnNaWGc3WEc0Z0lHWnNaWGd0ZDNKaGNEb2dibTkzY21Gd08xeHVJQ0JtYkdWNExXUnBjbVZqZEdsdmJqb2dZMjlzZFcxdU8xeHVJQ0I2TFdsdVpHVjRPaUIyWVhJb0xTMXZkWFJzYVc1bExYcEpibVJsZUNrN1hHNGdJSFJ2Y0RvZ01EdGNiaUFnYjNabGNtWnNiM2M2SUdocFpHUmxianRjYm4xY2JpNXZkWFJzYVc1bExXNWhkbWxuWVhSdmNsOXpkR2xqYTNrZ0xtOTFkR3hwYm1VdGJtRjJhV2RoZEc5eVgxOTBhWFJzWlN4Y2JpNXZkWFJzYVc1bExXNWhkbWxuWVhSdmNsOW1hWGhsWkNBdWIzVjBiR2x1WlMxdVlYWnBaMkYwYjNKZlgzUnBkR3hsTEZ4dUxtOTFkR3hwYm1VdGJtRjJhV2RoZEc5eVgzTjBhV05yZVNBdWIzVjBiR2x1WlMxdVlYWnBaMkYwYjNKZlgyMWhhVzRzWEc0dWIzVjBiR2x1WlMxdVlYWnBaMkYwYjNKZlptbDRaV1FnTG05MWRHeHBibVV0Ym1GMmFXZGhkRzl5WDE5dFlXbHVJSHRjYmlBZ1ltOTRMWE5wZW1sdVp6b2dZbTl5WkdWeUxXSnZlRHRjYm4xY2JpNXZkWFJzYVc1bExXNWhkbWxuWVhSdmNsOXpkR2xqYTNrZ0xtOTFkR3hwYm1VdGJtRjJhV2RoZEc5eVgxOTBhWFJzWlN4Y2JpNXZkWFJzYVc1bExXNWhkbWxuWVhSdmNsOW1hWGhsWkNBdWIzVjBiR2x1WlMxdVlYWnBaMkYwYjNKZlgzUnBkR3hsSUh0Y2JpQWdabXhsZUMxemFISnBibXM2SURBN1hHNTlYRzR1YjNWMGJHbHVaUzF1WVhacFoyRjBiM0pmYzNScFkydDVJQzV2ZFhSc2FXNWxMVzVoZG1sbllYUnZjbDlmYldGcGJpeGNiaTV2ZFhSc2FXNWxMVzVoZG1sbllYUnZjbDltYVhobFpDQXViM1YwYkdsdVpTMXVZWFpwWjJGMGIzSmZYMjFoYVc0Z2UxeHVJQ0JtYkdWNE9pQXhPMXh1SUNCdmRtVnlabXh2ZHpvZ1lYVjBienRjYm4xY2JpNXZkWFJzYVc1bExXNWhkbWxuWVhSdmNsOXpkR2xqYTNrZ2UxeHVJQ0J3YjNOcGRHbHZiam9nYzNScFkydDVPMXh1SUNCdFlYZ3RhR1ZwWjJoME9pQjJZWElvTFMxdmRYUnNhVzVsTFhOMGFXTnJlUzFvWldsbmFIUXBPMXh1ZlZ4dUxtOTFkR3hwYm1VdGJtRjJhV2RoZEc5eVgyWnBlR1ZrSUh0Y2JpQWdjRzl6YVhScGIyNDZJR1pwZUdWa08xeHVJQ0J0WVhndGFHVnBaMmgwT2lBeE1EQWxPMXh1ZlZ4dUxtOTFkR3hwYm1VdGJtRjJhV2RoZEc5eVgyaHBaR1JsYmlCN1hHNGdJR1JwYzNCc1lYazZJRzV2Ym1VN1hHNTlYRzR1YjNWMGJHbHVaUzF1WVhacFoyRjBiM0pmWm05c1pHVmtJSHRjYmlBZ2QybGtkR2c2SURBN1hHNGdJRzkyWlhKbWJHOTNPaUJvYVdSa1pXNDdYRzU5WEc0dktpcGNiaUFxSUdadmJuUXViR1Z6Y3lBdElPV3RsK1M5aytlYnVPV0ZzK2FndCtXOGoxeHVJQ29nUFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVnh1SUNvZ1EzSmxZWFJsWkNCQ2VUb2dXV0Z2YUdGcGVHbGhiMXh1SUNvZ1ZYQmtZWFJsT2lBeU1ESXlMak11TVRaY2JpQXFMMXh1THlvZ1BUMDlQVDA5SU9XdGwrUzlreUE5UFQwOVBUMGdLaTljYmk4cUlEMDlQVDA5UFNEbHJaZnBoNDBnUFQwOVBUMDlJQ292WEc0dktpQTlQVDA5UFQwZzVhMlg1WSszSUQwOVBUMDlQU0FxTDF4dUx5b3FYRzRnS2lCdGFYaHBibk11YkdWemN5QXRJT1czcGVXRnQrV0h2ZWFWc0Z4dUlDb2dQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBWeHVJQ29nUTNKbFlYUmxaQ0JDZVRvZ1dXRnZhR0ZwZUdsaGIxeHVJQ29nVlhCa1lYUmxPaUF5TURJeUxqTXVNVEZjYmlBcUwxeHVMeW9xWEc0Z0tpQnlZV1JwZFhNdWJHVnpjeUF0SU9XY2h1aW5rdWl1dnVlOXJpQnRhWGhwYm5nZzVZZTk1cFd3WEc0Z0tpQTlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVhHNGdLaUJEY21WaGRHVmtJRUo1T2lCWllXOW9ZV2w0YVdGdlhHNGdLaUJWY0dSaGRHVTZJREl3TWpRdU5DNHhObHh1SUNvdlhHNHZLaUE5UFQwOVBUMGc1WnlHNktlUzVxQzM1YnlQNks2KzU3MnU1WWU5NXBXd0lEMDlQVDA5UFNBcUwxeHVMbTkxZEd4cGJtVXRjbVZoWkdWeVgxOXdjbTluY21WemN5QjdYRzRnSUhCdmMybDBhVzl1T2lCbWFYaGxaRHRjYmlBZ2RHOXdPaUF3TzF4dUlDQnNaV1owT2lBd08xeHVJQ0I2TFdsdVpHVjRPaUF6TzF4dUlDQm9aV2xuYUhRNklEUndlRHRjYmlBZ2QybGtkR2c2SURFd01DVTdYRzRnSUdKaFkydG5jbTkxYm1RdFkyOXNiM0k2SUNNMU1EZGhabVU3WEc0Z0lITmpZV3hsT2lBd0lERTdYRzRnSUhSeVlXNXpabTl5YlMxdmNtbG5hVzQ2SUd4bFpuUTdYRzRnSUdGdWFXMWhkR2x2YmpvZ2IzVjBiR2x1WlMxeVpXRmtaWEl0Y0hKdlozSmxjM01nYkdsdVpXRnlPMXh1SUNCaGJtbHRZWFJwYjI0dGRHbHRaV3hwYm1VNklDMHRVSEp2WjNKbGMzTlVhVzFsYkdsdVpUdGNibjFjYmk1dmRYUnNhVzVsTFhKbFlXUmxjbDlmY0dGd1pYSWdlMXh1SUNCaWIzZ3RjMmhoWkc5M09pQXdJREFnTm5CNElERndlQ0FqWkdSa08xeHVJQ0J0WVhKbmFXNDZJREpsYlNCaGRYUnZPMXh1SUNCdFlYZ3RkMmxrZEdnNklERXlNREJ3ZUR0Y2JpQWdjR0ZrWkdsdVp6b2dNeTR5WlcwN1hHNGdJR0p2ZUMxemFYcHBibWM2SUdKdmNtUmxjaTFpYjNnN1hHNGdJR0poWTJ0bmNtOTFibVF0WTI5c2IzSTZJQ05tWm1ZN1hHNGdJRzkyWlhKbWJHOTNPaUJvYVdSa1pXNDdYRzU5WEc0dWIzVjBiR2x1WlMxeVpXRmtaWEpmWDNScGRHeGxJSHRjYmlBZ2JXRnlaMmx1T2lBd0xqWTNaVzBnTUR0Y2JpQWdkR1Y0ZEMxaGJHbG5iam9nWTJWdWRHVnlPMXh1SUNCbWIyNTBMV1poYldsc2VUb2dMV0Z3Y0d4bExYTjVjM1JsYlN3Z1FteHBibXROWVdOVGVYTjBaVzFHYjI1MExDQW5VMlZuYjJVZ1ZVa25MQ0FuVUdsdVowWmhibWNnVTBNbkxDQW5TR2x5WVdkcGJtOGdVMkZ1Y3lCSFFpY3NJQ2ROYVdOeWIzTnZablFnV1dGSVpXa25MQ0FuU0dWc2RtVjBhV05oSUU1bGRXVW5MQ0FuUVhCd2JHVWdRMjlzYjNJZ1JXMXZhbWtuTENBblUyVm5iMlVnVlVrZ1JXMXZhbWtuTENBblUyVm5iMlVnVlVrZ1UzbHRZbTlzSnl3Z1NHVnNkbVYwYVdOaExDQkJjbWxoYkN3Z2MyRnVjeTF6WlhKcFpqdGNiaUFnWm05dWRDMTNaV2xuYUhRNklHNXZjbTFoYkR0Y2JpQWdiR2x1WlMxb1pXbG5hSFE2SURFdU0yVnRPMXh1SUNCbWIyNTBMWE5wZW1VNklEUXVNbVZ0TzF4dUlDQnZkbVZ5Wm14dmR6b2dhR2xrWkdWdU8xeHVmVnh1TG05MWRHeHBibVV0Y21WaFpHVnlYMTloY25ScFkyeGxJQzV2ZFhSc2FXNWxMWEpsWVdSbGNsOWZjSEp2WjNKbGMzTWdlMXh1SUNCa2FYTndiR0Y1T2lCdWIyNWxPMXh1ZlZ4dUxtOTFkR3hwYm1VdGNtVmhaR1Z5WDJocFpHUmxiaUI3WEc0Z0lHUnBjM0JzWVhrNklHNXZibVU3WEc1OVhHNHViM1YwYkdsdVpTMXlaV0ZrWlhKZmFHbGtaR1Z1TG05MWRHeHBibVV0Y21WaFpHVnlYM05wWW14cGJtY2dlMXh1SUNCa2FYTndiR0Y1T2lCdWIyNWxJQ0ZwYlhCdmNuUmhiblE3WEc1OVhHNHViM1YwYkdsdVpTMXlaV0ZrWlhKZmFHbGtaR1Z1TG05MWRHeHBibVV0Y21WaFpHVnlYM05wWW14cGJtY3VkM0poY0hCbGNpNXdiM04wSUh0Y2JpQWdaR2x6Y0d4aGVUb2dibTl1WlR0Y2JuMWNiaTV2ZFhSc2FXNWxMWEpsWVdSbGNpMHRjbVZoWkdsdVp5QjdYRzRnSUdScGMzQnNZWGs2SUdKc2IyTnJPMXh1SUNCd2IzTnBkR2x2YmpvZ1ptbDRaV1E3WEc0Z0lIb3RhVzVrWlhnNklESTdYRzRnSUhSdmNEb2dNRHRjYmlBZ2JHVm1kRG9nTUR0Y2JpQWdkMmxrZEdnNklERXdNQ1U3WEc0Z0lHaGxhV2RvZERvZ01UQXdKVHRjYmlBZ2JXRnlaMmx1T2lBd08xeHVJQ0JpYjNndGMybDZhVzVuT2lCaWIzSmtaWEl0WW05NE8xeHVJQ0J3WVdSa2FXNW5PaUF6WlcwZ05HVnRPMXh1SUNCaVlXTnJaM0p2ZFc1a0xXTnZiRzl5T2lBalptRm1ZV1poTzF4dUlDQnpZM0p2Ykd3dGRHbHRaV3hwYm1VdGJtRnRaVG9nTFMxUWNtOW5jbVZ6YzFScGJXVnNhVzVsTzF4dUlDQnZkbVZ5Wm14dmR6b2djMk55YjJ4c08xeHVmVnh1UUd0bGVXWnlZVzFsY3lCdmRYUnNhVzVsTFhKbFlXUmxjaTF3Y205bmNtVnpjeUI3WEc0Z0lIUnZJSHRjYmlBZ0lDQnpZMkZzWlRvZ01TQXhPMXh1SUNCOVhHNTlYRzVBYldWa2FXRWdLRzFoZUMxM2FXUjBhRG9nTlRBd2NIZ3BJSHRjYmlBZ0xtOTFkR3hwYm1VdGNtVmhaR1Z5SUh0Y2JpQWdJQ0J2ZG1WeVpteHZkem9nYUdsa1pHVnVPMXh1SUNCOVhHNGdJQzV2ZFhSc2FXNWxMWEpsWVdSbGNpQXViM1YwYkdsdVpTMTBiMjlzWW1GeUlIdGNiaUFnSUNCa2FYTndiR0Y1T2lCbWJHVjRPMXh1SUNBZ0lHWnNaWGd0WkdseVpXTjBhVzl1T2lCeWIzYzdYRzRnSUNBZ1pteGxlQzEzY21Gd09pQnViM2R5WVhBN1hHNGdJQ0FnWVd4cFoyNHRhWFJsYlhNNklHTmxiblJsY2p0Y2JpQWdJQ0JoYkdsbmJpMXpaV3htT2lCaGRYUnZPMXh1SUNBZ0lIUnZjRG9nTVRBd0pUdGNiaUFnSUNCeWFXZG9kRG9nTUR0Y2JpQWdJQ0IwY21GdWMyWnZjbTA2SUhSeVlXNXpiR0YwWlZrb0xUUTRjSGdwTzF4dUlDQWdJSGRwWkhSb09pQXhNREFsTzF4dUlDQWdJR2hsYVdkb2REb2dORGh3ZUR0Y2JpQWdJQ0JpYjNndGMybDZhVzVuT2lCaWIzSmtaWEl0WW05NE8xeHVJQ0FnSUdKdmNtUmxjaTEwYjNBNklERndlQ0J6YjJ4cFpDQWpaR1JrTzF4dUlDQWdJR0poWTJ0bmNtOTFibVF0WTI5c2IzSTZJQ05tWm1ZN1hHNGdJQ0FnY0dGa1pHbHVaem9nTUNBeE5uQjRPMXh1SUNCOVhHNGdJQzV2ZFhSc2FXNWxMWEpsWVdSbGNpQXViM1YwYkdsdVpTMTBiMjlzWW1GeVgxOWlkWFIwYjI0Z2UxeHVJQ0FnSUdKdmNtUmxjaTF5WVdScGRYTTZJREE3WEc0Z0lDQWdabXhsZURvZ01UdGNiaUFnSUNCaWIzSmtaWEk2SUc1dmJtVTdYRzRnSUNBZ1ltOTRMWE5vWVdSdmR6b2dibTl1WlR0Y2JpQWdmVnh1SUNBdWIzVjBiR2x1WlMxeVpXRmtaWEl0TFhKbFlXUnBibWNnZTF4dUlDQWdJSEJoWkdScGJtYzZJREE3WEc0Z0lDQWdZbUZqYTJkeWIzVnVaQzFqYjJ4dmNqb2dJMlptWmp0Y2JpQWdJQ0JpYjNndGMybDZhVzVuT2lCaWIzSmtaWEl0WW05NE8xeHVJQ0I5WEc0Z0lDNXZkWFJzYVc1bExYSmxZV1JsY2w5ZmNHRndaWElnZTF4dUlDQWdJSEJ2YzJsMGFXOXVPaUJ5Wld4aGRHbDJaVHRjYmlBZ0lDQjZMV2x1WkdWNE9pQXhPMXh1SUNBZ0lHMWhjbWRwYmpvZ01EdGNiaUFnSUNCd1lXUmthVzVuT2lBd08xeHVJQ0FnSUdobGFXZG9kRG9nTVRBd0pUdGNiaUFnSUNCaWIzZ3RjMmhoWkc5M09pQnViMjVsTzF4dUlDQWdJRzkyWlhKbWJHOTNPaUJvYVdSa1pXNDdYRzRnSUgxY2JpQWdMbTkxZEd4cGJtVXRjbVZoWkdWeVgxOTBhWFJzWlNCN1hHNGdJQ0FnZDJocGRHVXRjM0JoWTJVNklHNXZkM0poY0R0Y2JpQWdJQ0IwWlhoMExXOTJaWEptYkc5M09pQmxiR3hwY0hOcGN6dGNiaUFnSUNCd2IzTnBkR2x2YmpvZ1lXSnpiMngxZEdVN1hHNGdJQ0FnZWkxcGJtUmxlRG9nTXp0Y2JpQWdJQ0IwYjNBNklEQTdYRzRnSUNBZ2JHVm1kRG9nTUR0Y2JpQWdJQ0J0WVhKbmFXNDZJREE3WEc0Z0lDQWdkMmxrZEdnNklERXdNQ1U3WEc0Z0lDQWdhR1ZwWjJoME9pQTBPSEI0TzF4dUlDQWdJR3hwYm1VdGFHVnBaMmgwT2lBME9IQjRPMXh1SUNBZ0lHSnZjbVJsY2kxaWIzUjBiMjA2SURGd2VDQnpiMnhwWkNBalpHUmtPMXh1SUNBZ0lHWnZiblF0YzJsNlpUb2dNUzQ0WlcwN1hHNGdJQ0FnWm05dWRDMTNaV2xuYUhRNklEUXdNRHRjYmlBZ0lDQmlZV05yWjNKdmRXNWtMV052Ykc5eU9pQWpabVptTzF4dUlDQWdJRzkyWlhKbWJHOTNPaUJvYVdSa1pXNDdYRzRnSUgxY2JpQWdMbTkxZEd4cGJtVXRjbVZoWkdWeVgxOWhjblJwWTJ4bElIdGNiaUFnSUNCdFlYSm5hVzQ2SURRNGNIZ2dNRHRjYmlBZ0lDQm9aV2xuYUhRNklHTmhiR01vTVRBd0pTQXRJRGsyY0hncE8xeHVJQ0FnSUhCaFpHUnBibWM2SURBZ01TNHlOV1Z0TzF4dUlDQWdJSE5qY205c2JDMTBhVzFsYkdsdVpTMXVZVzFsT2lBdExVMXZZbWxzWlZCeWIyZHlaWE56VkdsdFpXeHBibVU3WEc0Z0lDQWdiM1psY21ac2IzY3RlRG9nYUdsa1pHVnVPMXh1SUNBZ0lHOTJaWEptYkc5M0xYazZJSE5qY205c2JEdGNiaUFnZlZ4dUlDQXViM1YwYkdsdVpTMXlaV0ZrWlhKZlgyRnlkR2xqYkdVZ0xtOTFkR3hwYm1VdGNtVmhaR1Z5WDE5d2NtOW5jbVZ6Y3lCN1hHNGdJQ0FnZWkxcGJtUmxlRG9nTkR0Y2JpQWdJQ0JoYm1sdFlYUnBiMjQ2SUc5MWRHeHBibVV0Y21WaFpHVnlMWEJ5YjJkeVpYTnpJR3hwYm1WaGNqdGNiaUFnSUNCaGJtbHRZWFJwYjI0dGRHbHRaV3hwYm1VNklDMHRUVzlpYVd4bFVISnZaM0psYzNOVWFXMWxiR2x1WlR0Y2JpQWdJQ0JrYVhOd2JHRjVPaUJpYkc5amF6dGNiaUFnZlZ4dWZWeHVRRzFsWkdsaElIQnlhVzUwSUh0Y2JpQWdhSFJ0YkN4Y2JpQWdZbTlrZVNCN1hHNGdJQ0FnTHlvZzVvbVQ1WTJ3NTVxRTVaKzY1NkdBNWEyWDVMMlQ1YVNuNWJDUElDb3ZYRzRnSUNBZ1ptOXVkQzF6YVhwbE9pQXhNbkIwTzF4dUlDQWdJQzhxSU9hWXZ1ZWt1dWl1dnVlOXJ1YVdoK1d0bCttaW5PaUpzdVdTak9pRGpPYVpyK21pbk9pSnNpQXFMMXh1SUNBZ0lHSmhZMnRuY205MWJtUXRZMjlzYjNJNklDTm1abVk3WEc0Z0lDQWdZMjlzYjNJNklDTXpNek03WEc0Z0lDQWdhR1ZwWjJoME9pQnBibWwwYVdGc0lDRnBiWEJ2Y25SaGJuUTdYRzRnSUgxY2JpQWdMeW9nNks2KzU3MnU2Wk8rNW82bDVxQzM1YnlQSUNvdlhHNGdJR0U2YkdsdWF5eGNiaUFnWVRwMmFYTnBkR1ZrTEZ4dUlDQmhPbWh2ZG1WeUlIdGNiaUFnSUNCMFpYaDBMV1JsWTI5eVlYUnBiMjQ2SUhWdVpHVnliR2x1WlNBaGFXMXdiM0owWVc1ME8xeHVJQ0FnSUdOdmJHOXlPaUFqTlRBM1lXWmxPMXh1SUNCOVhHNGdJQzhxSU9tYWtPaVhqK1dxa3VTOWsrYWdoK2V0dmlBcUwxeHVJQ0IyYVdSbGJ5eGNiaUFnWVhWa2FXOGdlMXh1SUNBZ0lHUnBjM0JzWVhrNklHNXZibVVnSVdsdGNHOXlkR0Z1ZER0Y2JpQWdmVnh1SUNBdktpRG5vYTdrdjUzb29ham1vTHpsbktqbWlaUGxqYkRtbDdibm1vVG92cm5tb1libGtvemxyN25wdlpEbWxybmx2SS9tdUlYbW1iQWdLaTljYmlBZ2RHRmliR1VnZTF4dUlDQWdJSGRwWkhSb09pQXhNREFsTzF4dUlDQWdJR0p2Y21SbGNpMWpiMnhzWVhCelpUb2dZMjlzYkdGd2MyVTdYRzRnSUgxY2JpQWdkR2dzWEc0Z0lIUmtJSHRjYmlBZ0lDQmliM0prWlhJNklERndlQ0J6YjJ4cFpDQWpaR05rWm1VMk8xeHVJQ0FnSUhCaFpHUnBibWM2SURod2VDQXlNSEI0TzF4dUlDQjlYRzRnSUM1dmRYUnNhVzVsTFcxbGMzTmhaMlVzWEc0Z0lDNXZkWFJzYVc1bExYUnZiMnhpWVhJZ2UxeHVJQ0FnSUM4cUlPbWFrT2lYaitTNmh1VzNwZVdGdCthZ2orV1NqT1Mvb2VhQnIrYVBrT2VrdXVhaGhpQXFMMXh1SUNBZ0lHUnBjM0JzWVhrNklHNXZibVVnSVdsdGNHOXlkR0Z1ZER0Y2JpQWdmVnh1SUNBdWIzVjBiR2x1WlMxeVpXRmtaWElnZTF4dUlDQWdJR1JwYzNCc1lYazZJR0pzYjJOcklDRnBiWEJ2Y25SaGJuUTdYRzRnSUNBZ2IzWmxjbVpzYjNjNklHaHBaR1JsYmp0Y2JpQWdJQ0F2S2lEbGo1Ym10b2prdW9ibnU1M2xyN25scnBya3ZZMGdLaTljYmlBZ0lDQXZLaURwbXBEb2w0L3BtSVhvcjd2b3Y1dmx1cWJtbmFFZ0tpOWNiaUFnSUNBdktpRG1pWlBsamJEbWw3Ymt1STNtbUw3bnBMcm1yYVBtbG9jZ1JFOU5JT2VhaE9tWXRPVzlzZWFWaU9hZW5DQXFMMXh1SUNBZ0lDOHFJT2FKZ09hY2llYVdoK2Vyb09XR2hlV3V1U0JFVDAwZzU1dTQ1WVd6NTVxRTZZSzc1YkdGNklxQzU0SzU2WU85NlpxUTZKZVA1THFHSUNvdlhHNGdJSDFjYmlBZ0xtOTFkR3hwYm1VdGNtVmhaR1Z5WDE5MGFYUnNaU0I3WEc0Z0lDQWdiV0Z5WjJsdU9pQXhNeTQwY0hRZ01DQXlPSEIwSUNGcGJYQnZjblJoYm5RN1hHNGdJQ0FnZEdWNGRDMWhiR2xuYmpvZ1kyVnVkR1Z5SUNGcGJYQnZjblJoYm5RN1hHNGdJQ0FnWm05dWRDMXphWHBsT2lBek1uQjBJQ0ZwYlhCdmNuUmhiblE3WEc0Z0lIMWNiaUFnTG05MWRHeHBibVV0Y21WaFpHVnlMUzF5WldGa2FXNW5JSHRjYmlBZ0lDQndiM05wZEdsdmJqb2djbVZzWVhScGRtVWdJV2x0Y0c5eWRHRnVkRHRjYmlBZ0lDQm9aV2xuYUhRNklHRjFkRzhnSVdsdGNHOXlkR0Z1ZER0Y2JpQWdJQ0J3WVdSa2FXNW5PaUF3SUNGcGJYQnZjblJoYm5RN1hHNGdJQ0FnWW1GamEyZHliM1Z1WkMxamIyeHZjam9nSTJabVpqdGNiaUFnSUNCdmRtVnlabXh2ZHpvZ2FHbGtaR1Z1SUNGcGJYQnZjblJoYm5RN1hHNGdJSDFjYmlBZ0xtOTFkR3hwYm1VdGNtVmhaR1Z5WDE5d2NtOW5jbVZ6Y3lCN1hHNGdJQ0FnWkdsemNHeGhlVG9nYm05dVpTQWhhVzF3YjNKMFlXNTBPMXh1SUNCOVhHNGdJQzV2ZFhSc2FXNWxMWEpsWVdSbGNsOWZjR0Z3WlhJZ2UxeHVJQ0FnSUdKdmVDMXphR0ZrYjNjNklHNXZibVU3WEc0Z0lIMWNiaUFnTG05MWRHeHBibVV0Y21WaFpHVnlJSEJ5WlNCN1hHNGdJQ0FnY0dGa1pHbHVaem9nTVdWdElDRnBiWEJ2Y25SaGJuUTdYRzRnSUNBZ1ltOXlaR1Z5T2lBeGNIZ2djMjlzYVdRZ0kyUmtaQ0FoYVcxd2IzSjBZVzUwTzF4dUlDQWdJR0p2Y21SbGNpMXlZV1JwZFhNNklEUndlQ0FoYVcxd2IzSjBZVzUwTzF4dUlDQjlYRzRnSUM1dmRYUnNhVzVsTFhKbFlXUmxjaUJ3Y21Vc1hHNGdJQzV2ZFhSc2FXNWxMWEpsWVdSbGNpQmpiMlJsSUh0Y2JpQWdJQ0JpWVdOclozSnZkVzVrTFdOdmJHOXlPaUFqWm1abUlDRnBiWEJ2Y25SaGJuUTdYRzRnSUgxY2JpQWdMbTkxZEd4cGJtVXRjbVZoWkdWeUlIUmhZbXhsTEZ4dUlDQXViM1YwYkdsdVpTMXlaV0ZrWlhJZ2FXMW5MRnh1SUNBdWIzVjBiR2x1WlMxeVpXRmtaWElnYzNabklIdGNiaUFnSUNCaWNtVmhheTFwYm5OcFpHVTZJR0YyYjJsa08xeHVJQ0I5WEc0Z0lDNXZkWFJzYVc1bExYSmxZV1JsY2w5emFXSnNhVzVuSUh0Y2JpQWdJQ0JrYVhOd2JHRjVPaUJ1YjI1bElDRnBiWEJ2Y25SaGJuUTdYRzRnSUgxY2JuMWNiaThxSUQwOVBUMDlQVDA5UFQwZ1luVjBkRzl1Y3k1MGFHVnRaU0F0SU9hTWllbVNydVd2dk9pSXF1YWd0K1c4anlBOVBUMDlQVDA5UFQwOUlDb3ZYRzR1YjNWMGJHbHVaUzEwYjI5c1ltRnlJSHRjYmlBZ2NHOXphWFJwYjI0NklHWnBlR1ZrTzF4dUlDQjZMV2x1WkdWNE9pQTVPVGs1T1R0Y2JpQWdiV0Z5WjJsdU9pQXdPMXh1SUNCMGNtRnVjMmwwYVc5dUxXUjFjbUYwYVc5dU9pQXdMak56TzF4dUlDQnZkbVZ5Wm14dmR6b2dhR2xrWkdWdU8xeHVmVnh1TG05MWRHeHBibVV0ZEc5dmJHSmhjbDlmWW5WMGRHOXVJSHRjYmlBZ1ltOTRMWE5vWVdSdmR6b2dNQ0F3SURad2VDQXhjSGdnSTJSalpHWmxOanRjYmlBZ2NHOXphWFJwYjI0NklISmxiR0YwYVhabE8xeHVJQ0I2TFdsdVpHVjRPaUF4TzF4dUlDQnRZWEpuYVc0NklERXdjSGc3WEc0Z0lIZHBaSFJvT2lBek5uQjRPMXh1SUNCb1pXbG5hSFE2SURNMmNIZzdYRzRnSUdKdmNtUmxjam9nTVhCNElITnZiR2xrSUNOa1kyUm1aVFk3WEc0Z0lHSnZjbVJsY2kxeVlXUnBkWE02SUROd2VEdGNiaUFnWW05NExYTnBlbWx1WnpvZ1ltOXlaR1Z5TFdKdmVEdGNiaUFnWW1GamEyZHliM1Z1WkMxamIyeHZjam9nSTJabVpqdGNiaUFnWTNWeWMyOXlPaUJ3YjJsdWRHVnlPMXh1SUNCMFpYaDBMV0ZzYVdkdU9pQmpaVzUwWlhJN1hHNGdJR052Ykc5eU9pQWpPVGs1TzF4dUlDQjBjbUZ1YzJsMGFXOXVPaUJoYkd3Z01DNHpjeUF3TGpGeklHVmhjMlV0YVc0dGIzVjBPMXh1SUNCdmRtVnlabXh2ZHpvZ2FHbGtaR1Z1TzF4dWZWeHVMbTkxZEd4cGJtVXRkRzl2YkdKaGNsOWZZblYwZEc5dU9taHZkbVZ5SUh0Y2JpQWdZMjlzYjNJNklDTXdOVGc1TkRJN1hHNGdJR0p2Y21SbGNpMWpiMnh2Y2pvZ0l6QTFPRGswTWp0Y2JpQWdkSEpoYm5ObWIzSnRPaUJ6WTJGc1pTZ3hMak0xS1R0Y2JuMWNiaTV2ZFhSc2FXNWxMWFJ2YjJ4aVlYSmZYMkoxZEhSdmJpNW9hV1JsSUh0Y2JpQWdaR2x6Y0d4aGVUb2dibTl1WlR0Y2JuMWNiaTV2ZFhSc2FXNWxMWFJ2YjJ4aVlYSmZYMkZ1WTJodmNqcHNhVzVyTEZ4dUxtOTFkR3hwYm1VdGRHOXZiR0poY2w5ZllXNWphRzl5T25acGMybDBaV1FzWEc0dWIzVjBiR2x1WlMxMGIyOXNZbUZ5WDE5aGJtTm9iM0k2YUc5MlpYSWdlMXh1SUNCamIyeHZjam9nSXprNU9UdGNiaUFnZEdWNGRDMWtaV052Y21GMGFXOXVPaUJ1YjI1bE8xeHVmVnh1TG05MWRHeHBibVV0ZEc5dmJHSmhjbDlmWVc1amFHOXlPbWh2ZG1WeUlIdGNiaUFnWTI5c2IzSTZJQ013TlRnNU5ESTdYRzU5WEc0dWIzVjBiR2x1WlMxMGIyOXNZbUZ5WDE5cFkyOXVJSHRjYmlBZ2NHOXphWFJwYjI0NklHRmljMjlzZFhSbE8xeHVJQ0I2TFdsdVpHVjRPaUF5TzF4dUlDQjBiM0E2SURVd0pUdGNiaUFnYkdWbWREb2dOVEFsTzF4dUlDQjNhV1IwYURvZ01qQndlRHRjYmlBZ2FHVnBaMmgwT2lBeU1IQjRPMXh1SUNCMGNtRnVjMlp2Y20wNklIUnlZVzV6YkdGMFpTZ3ROVEFsTENBdE5UQWxLVHRjYmlBZ1ptbHNiRG9nWTNWeWNtVnVkR052Ykc5eU8xeHVJQ0J2ZG1WeVpteHZkem9nYUdsa1pHVnVPMXh1ZlZ4dUxtOTFkR3hwYm1VdGRHOXZiR0poY2w5aFkzUnBkbVV1YjNWMGJHbHVaUzEwYjI5c1ltRnlYMTlpZFhSMGIyNGdlMXh1SUNCamIyeHZjam9nSTJabVpqdGNiaUFnWW1GamEyZHliM1Z1WkMxamIyeHZjam9nSXpBMU9EazBNanRjYmlBZ1ltOXlaR1Z5TFdOdmJHOXlPaUFqTURVNE9UUXlPMXh1ZlZ4dUxtOTFkR3hwYm1VdGRHOXZiR0poY2w5aFkzUnBkbVV1YjNWMGJHbHVaUzEwYjI5c1ltRnlYMTlpZFhSMGIyNDZhRzkyWlhJZ2UxeHVJQ0JqYjJ4dmNqb2dJMlptWmp0Y2JuMWNiaTV2ZFhSc2FXNWxMWFJ2YjJ4aVlYSmZZV04wYVhabElDNXZkWFJzYVc1bExYUnZiMnhpWVhKZlgyRnVZMmh2Y2pwc2FXNXJMRnh1TG05MWRHeHBibVV0ZEc5dmJHSmhjbDloWTNScGRtVWdMbTkxZEd4cGJtVXRkRzl2YkdKaGNsOWZZVzVqYUc5eU9uWnBjMmwwWldRc1hHNHViM1YwYkdsdVpTMTBiMjlzWW1GeVgyRmpkR2wyWlNBdWIzVjBiR2x1WlMxMGIyOXNZbUZ5WDE5aGJtTm9iM0k2YUc5MlpYSWdlMXh1SUNCamIyeHZjam9nSTJabVpqdGNibjFjYmk1dmRYUnNhVzVsTFhSdmIyeGlZWEpmY205MWJtUmxaQzV2ZFhSc2FXNWxMWFJ2YjJ4aVlYSmZYMkoxZEhSdmJpQjdYRzRnSUdKdmNtUmxjaTF5WVdScGRYTTZJREU0Y0hnN1hHNTlYRzR1YjNWMGJHbHVaUzEwYjI5c1ltRnlYMlJwYzJGaWJHVmtMbTkxZEd4cGJtVXRkRzl2YkdKaGNsOWZZVzVqYUc5eU9teHBibXNzWEc0dWIzVjBiR2x1WlMxMGIyOXNZbUZ5WDJScGMyRmliR1ZrSUM1dmRYUnNhVzVsTFhSdmIyeGlZWEpmWDJGdVkyaHZjanBzYVc1ckxGeHVMbTkxZEd4cGJtVXRkRzl2YkdKaGNsOWthWE5oWW14bFpDNXZkWFJzYVc1bExYUnZiMnhpWVhKZlgyRnVZMmh2Y2pwMmFYTnBkR1ZrTEZ4dUxtOTFkR3hwYm1VdGRHOXZiR0poY2w5a2FYTmhZbXhsWkNBdWIzVjBiR2x1WlMxMGIyOXNZbUZ5WDE5aGJtTm9iM0k2ZG1semFYUmxaQ3hjYmk1dmRYUnNhVzVsTFhSdmIyeGlZWEpmWkdsellXSnNaV1F1YjNWMGJHbHVaUzEwYjI5c1ltRnlYMTloYm1Ob2IzSTZhRzkyWlhJc1hHNHViM1YwYkdsdVpTMTBiMjlzWW1GeVgyUnBjMkZpYkdWa0lDNXZkWFJzYVc1bExYUnZiMnhpWVhKZlgyRnVZMmh2Y2pwb2IzWmxjaXhjYmk1dmRYUnNhVzVsTFhSdmIyeGlZWEpmWkdsellXSnNaV1F1YjNWMGJHbHVaUzEwYjI5c1ltRnlYMTlpZFhSMGIyNHNYRzR1YjNWMGJHbHVaUzEwYjI5c1ltRnlYMlJwYzJGaWJHVmtJQzV2ZFhSc2FXNWxMWFJ2YjJ4aVlYSmZYMkoxZEhSdmJpQjdYRzRnSUdOMWNuTnZjam9nYm05MExXRnNiRzkzWldRN1hHNGdJR052Ykc5eU9pQWpPVGs1TzF4dUlDQmliM0prWlhJdFkyOXNiM0k2SUNNNU9UazdYRzU5WEc0dWIzVjBiR2x1WlMxMGIyOXNZbUZ5WDJScGMyRmliR1ZrTG05MWRHeHBibVV0ZEc5dmJHSmhjbDlmWVc1amFHOXlPbXhwYm1zNmFHOTJaWElzWEc0dWIzVjBiR2x1WlMxMGIyOXNZbUZ5WDJScGMyRmliR1ZrSUM1dmRYUnNhVzVsTFhSdmIyeGlZWEpmWDJGdVkyaHZjanBzYVc1ck9taHZkbVZ5TEZ4dUxtOTFkR3hwYm1VdGRHOXZiR0poY2w5a2FYTmhZbXhsWkM1dmRYUnNhVzVsTFhSdmIyeGlZWEpmWDJGdVkyaHZjanAyYVhOcGRHVmtPbWh2ZG1WeUxGeHVMbTkxZEd4cGJtVXRkRzl2YkdKaGNsOWthWE5oWW14bFpDQXViM1YwYkdsdVpTMTBiMjlzWW1GeVgxOWhibU5vYjNJNmRtbHphWFJsWkRwb2IzWmxjaXhjYmk1dmRYUnNhVzVsTFhSdmIyeGlZWEpmWkdsellXSnNaV1F1YjNWMGJHbHVaUzEwYjI5c1ltRnlYMTloYm1Ob2IzSTZhRzkyWlhJNmFHOTJaWElzWEc0dWIzVjBiR2x1WlMxMGIyOXNZbUZ5WDJScGMyRmliR1ZrSUM1dmRYUnNhVzVsTFhSdmIyeGlZWEpmWDJGdVkyaHZjanBvYjNabGNqcG9iM1psY2l4Y2JpNXZkWFJzYVc1bExYUnZiMnhpWVhKZlpHbHpZV0pzWldRdWIzVjBiR2x1WlMxMGIyOXNZbUZ5WDE5aWRYUjBiMjQ2YUc5MlpYSXNYRzR1YjNWMGJHbHVaUzEwYjI5c1ltRnlYMlJwYzJGaWJHVmtJQzV2ZFhSc2FXNWxMWFJ2YjJ4aVlYSmZYMkoxZEhSdmJqcG9iM1psY2lCN1hHNGdJR052Ykc5eU9pQWpPVGs1TzF4dUlDQmliM0prWlhJdFkyOXNiM0k2SUNNNU9UazdYRzU5WEc0dWIzVjBiR2x1WlMxMGIyOXNZbUZ5WDJScGMyRmliR1ZrTG05MWRHeHBibVV0ZEc5dmJHSmhjbDlmWW5WMGRHOXVMRnh1TG05MWRHeHBibVV0ZEc5dmJHSmhjbDlrYVhOaFlteGxaQ0F1YjNWMGJHbHVaUzEwYjI5c1ltRnlYMTlpZFhSMGIyNGdlMXh1SUNCaVlXTnJaM0p2ZFc1a0xXTnZiRzl5T2lBalpqVm1OV1kxTzF4dWZWeHVMbTkxZEd4cGJtVXRkRzl2YkdKaGNsOTBkR0lzWEc0dWIzVjBiR2x1WlMxMGIyOXNZbUZ5WDJKMGRDQjdYRzRnSUd4bFpuUTZJRFV3SlR0Y2JpQWdkSEpoYm5ObWIzSnRPaUIwY21GdWMyeGhkR1ZZS0MwMU1DVXBPMXh1ZlZ4dUxtOTFkR3hwYm1VdGRHOXZiR0poY2w5MGRHSWdMbTkxZEd4cGJtVXRkRzl2YkdKaGNsOWZZblYwZEc5dUxGeHVMbTkxZEd4cGJtVXRkRzl2YkdKaGNsOWlkSFFnTG05MWRHeHBibVV0ZEc5dmJHSmhjbDlmWW5WMGRHOXVJSHRjYmlBZ1pHbHpjR3hoZVRvZ2FXNXNhVzVsTFdKc2IyTnJPMXh1ZlZ4dUxtOTFkR3hwYm1VdGRHOXZiR0poY2w5MGRHSWdlMXh1SUNCMGIzQTZJREV5Y0hnN1hHNTlYRzR1YjNWMGJHbHVaUzEwYjI5c1ltRnlYM1IwWWk1dmRYUnNhVzVsTFhSdmIyeGlZWEpmYUdsa1pHVnVJSHRjYmlBZ2RHOXdPaUF0TlRad2VEdGNibjFjYmk1dmRYUnNhVzVsTFhSdmIyeGlZWEpmWW5SMElIdGNiaUFnWW05MGRHOXRPaUF4TW5CNE8xeHVmVnh1TG05MWRHeHBibVV0ZEc5dmJHSmhjbDlpZEhRdWIzVjBiR2x1WlMxMGIyOXNZbUZ5WDJocFpHUmxiaUI3WEc0Z0lHSnZkSFJ2YlRvZ0xUVTJjSGc3WEc1OVhHNHViM1YwYkdsdVpTMTBiMjlzWW1GeVgzSjBiQ3hjYmk1dmRYUnNhVzVsTFhSdmIyeGlZWEpmYkhSeUlIdGNiaUFnZEhKaGJuTm1iM0p0T2lCMGNtRnVjMnhoZEdWWktDMDFNQ1VwTzF4dUlDQjNhV1IwYURvZ05UWndlRHRjYm4xY2JpNXZkWFJzYVc1bExYUnZiMnhpWVhKZmNuUnNJSHRjYmlBZ2RHOXdPaUExTUNVN1hHNGdJSEpwWjJoME9pQXhNbkI0TzF4dWZWeHVMbTkxZEd4cGJtVXRkRzl2YkdKaGNsOXlkR3d1YjNWMGJHbHVaUzEwYjI5c1ltRnlYMmhwWkdSbGJpQjdYRzRnSUhKcFoyaDBPaUF0T0Rad2VEdGNibjFjYmk1dmRYUnNhVzVsTFhSdmIyeGlZWEpmYkhSeUlIdGNiaUFnZEc5d09pQTFNQ1U3WEc0Z0lHeGxablE2SURFeWNIZzdYRzU5WEc0dWIzVjBiR2x1WlMxMGIyOXNZbUZ5WDJ4MGNpNXZkWFJzYVc1bExYUnZiMnhpWVhKZmFHbGtaR1Z1SUh0Y2JpQWdiR1ZtZERvZ0xUZzJjSGc3WEc1OVhHNHViM1YwYkdsdVpTMTBiMjlzWW1GeVgzUjBZaUF1YjNWMGJHbHVaUzEwYjI5c1ltRnlYMTlpZFhSMGIyNHViM1YwYkdsdVpTMTBiMjlzWW1GeVgyaHBaR1JsYml4Y2JpNXZkWFJzYVc1bExYUnZiMnhpWVhKZmNuUnNJQzV2ZFhSc2FXNWxMWFJ2YjJ4aVlYSmZYMkoxZEhSdmJpNXZkWFJzYVc1bExYUnZiMnhpWVhKZmFHbGtaR1Z1TEZ4dUxtOTFkR3hwYm1VdGRHOXZiR0poY2w5aWRIUWdMbTkxZEd4cGJtVXRkRzl2YkdKaGNsOWZZblYwZEc5dUxtOTFkR3hwYm1VdGRHOXZiR0poY2w5b2FXUmtaVzRzWEc0dWIzVjBiR2x1WlMxMGIyOXNZbUZ5WDJ4MGNpQXViM1YwYkdsdVpTMTBiMjlzWW1GeVgxOWlkWFIwYjI0dWIzVjBiR2x1WlMxMGIyOXNZbUZ5WDJocFpHUmxiaUI3WEc0Z0lHUnBjM0JzWVhrNklHNXZibVU3WEc1OVhHNHViM1YwYkdsdVpTMXRaWE56WVdkbElIdGNiaUFnWW05eVpHVnlMWEpoWkdsMWN6b2dNM0I0TzF4dUlDQmliM2d0YzJoaFpHOTNPaUF3SURBZ05uQjRJREZ3ZUNBalpHTmtabVUyTzF4dUlDQndiM05wZEdsdmJqb2dabWw0WldRN1hHNGdJSG90YVc1a1pYZzZJRGs1T1RrN1hHNGdJRzl3WVdOcGRIazZJREF1TVR0Y2JpQWdkRzl3T2lBdE5UQndlRHRjYmlBZ2JHVm1kRG9nTlRBbE8xeHVJQ0JvWldsbmFIUTZJRFF3Y0hnN1hHNGdJRzFoY21kcGJqb2dNRHRjYmlBZ2NHRmtaR2x1WnpvZ01DQTFNSEI0TzF4dUlDQnNhVzVsTFdobGFXZG9kRG9nTkRCd2VEdGNiaUFnWm05dWRDMXphWHBsT2lBeE0zQjRPMXh1SUNCaVlXTnJaM0p2ZFc1a0xXTnZiRzl5T2lBalptWm1PMXh1SUNCamIyeHZjam9nSXpZMk5qdGNiaUFnZEhKaGJuTnBkR2x2YmpvZ1lXeHNJREF1TlhNZ1pXRnpaUzFwYmkxdmRYUTdYRzRnSUhSeVlXNXpabTl5YlRvZ2RISmhibk5zWVhSbFdDZ3ROVEFsS1R0Y2JpQWdiM1psY21ac2IzYzZJR2hwWkdSbGJqdGNibjFjYmk1dmRYUnNhVzVsTFcxbGMzTmhaMlZmWDJOdmJuUmxiblFnZTF4dUlDQjNhR2wwWlMxemNHRmpaVG9nYm05M2NtRndPMXh1SUNCMFpYaDBMVzkyWlhKbWJHOTNPaUJsYkd4cGNITnBjenRjYmlBZ2JXRnlaMmx1T2lBd08xeHVJQ0J0WVhndGQybGtkR2c2SURjd01IQjRPMXh1SUNCb1pXbG5hSFE2SURRd2NIZzdYRzRnSUd4cGJtVXRhR1ZwWjJoME9pQTBNSEI0TzF4dUlDQm1iMjUwTFhOcGVtVTZJREV6Y0hnN1hHNGdJR052Ykc5eU9pQWpOalkyTzF4dUlDQnZkbVZ5Wm14dmR6b2dhR2xrWkdWdU8xeHVmVnh1TG05MWRHeHBibVV0YldWemMyRm5aVjlmWTJ4dmMyVXNYRzR1YjNWMGJHbHVaUzF0WlhOellXZGxYMTlwWTI5dUlIdGNiaUFnY0c5emFYUnBiMjQ2SUdGaWMyOXNkWFJsTzF4dUlDQjZMV2x1WkdWNE9pQXlPMXh1SUNCMGIzQTZJREE3WEc0Z0lIZHBaSFJvT2lBME1IQjRPMXh1SUNCb1pXbG5hSFE2SURRd2NIZzdYRzRnSUd4cGJtVXRhR1ZwWjJoME9pQTBNSEI0TzF4dUlDQjBaWGgwTFdGc2FXZHVPaUJqWlc1MFpYSTdYRzRnSUc5MlpYSm1iRzkzT2lCb2FXUmtaVzQ3WEc1OVhHNHViM1YwYkdsdVpTMXRaWE56WVdkbFgxOXBZMjl1SUh0Y2JpQWdiR1ZtZERvZ01EdGNiaUFnWTI5c2IzSTZJQ05tWm1ZN1hHNTlYRzR1YjNWMGJHbHVaUzF0WlhOellXZGxYMTlwWTI5dUlDNXZkWFJzYVc1bExXbGpiMjRnZTF4dUlDQndiM05wZEdsdmJqb2dZV0p6YjJ4MWRHVTdYRzRnSUhvdGFXNWtaWGc2SURJN1hHNGdJSFJ2Y0RvZ05UQWxPMXh1SUNCc1pXWjBPaUExTUNVN1hHNGdJSFJ5WVc1elptOXliVG9nZEhKaGJuTnNZWFJsS0MwMU1DVXNJQzAxTUNVcE8xeHVmVnh1TG05MWRHeHBibVV0YldWemMyRm5aVjlmWTJ4dmMyVWdlMXh1SUNCeWFXZG9kRG9nTUR0Y2JpQWdZM1Z5YzI5eU9pQndiMmx1ZEdWeU8xeHVJQ0JqYjJ4dmNqb2dJems1T1R0Y2JuMWNiaTV2ZFhSc2FXNWxMVzFsYzNOaFoyVmZYMk5zYjNObElDNXZkWFJzYVc1bExXbGpiMjRnZTF4dUlDQndiM05wZEdsdmJqb2dZV0p6YjJ4MWRHVTdYRzRnSUhvdGFXNWtaWGc2SURJN1hHNGdJSFJ2Y0RvZ05UQWxPMXh1SUNCc1pXWjBPaUExTUNVN1hHNGdJSFJ5WVc1elptOXliVG9nZEhKaGJuTnNZWFJsS0MwMU1DVXNJQzAxTUNVcE8xeHVmVnh1TG05MWRHeHBibVV0YldWemMyRm5aVjlmWTJ4dmMyVTZhRzkyWlhJZ2UxeHVJQ0JqYjJ4dmNqb2dJelkyTmp0Y2JuMWNiaTV2ZFhSc2FXNWxMVzFsYzNOaFoyVmZhVzVtYnlBdWIzVjBiR2x1WlMxdFpYTnpZV2RsWDE5cFkyOXVJSHRjYmlBZ1ltRmphMmR5YjNWdVpDMWpiMnh2Y2pvZ0l6VXdOMkZtWlR0Y2JuMWNiaTV2ZFhSc2FXNWxMVzFsYzNOaFoyVmZkMkZ5Ym1sdVp5QXViM1YwYkdsdVpTMXRaWE56WVdkbFgxOXBZMjl1SUh0Y2JpQWdZbUZqYTJkeWIzVnVaQzFqYjJ4dmNqb2dJMlptT1Rrd01UdGNibjFjYmk1dmRYUnNhVzVsTFcxbGMzTmhaMlZmYzNWalkyVnpjeUF1YjNWMGJHbHVaUzF0WlhOellXZGxYMTlwWTI5dUlIdGNiaUFnWW1GamEyZHliM1Z1WkMxamIyeHZjam9nSXpBMU9EazBNanRjYm4xY2JpNXZkWFJzYVc1bExXMWxjM05oWjJWZlpYSnliM0lnTG05MWRHeHBibVV0YldWemMyRm5aVjlmYVdOdmJpQjdYRzRnSUdKaFkydG5jbTkxYm1RdFkyOXNiM0k2SUNObVpqVmtOV1E3WEc1OVhHNHViM1YwYkdsdVpTMXRaWE56WVdkbFgzQnNZV2x1SUh0Y2JpQWdiV2x1TFhkcFpIUm9PaUF4T1RCd2VEdGNiaUFnY0dGa1pHbHVaem9nTUNBMU1IQjRJREFnTVRWd2VEdGNibjFjYmk1dmRYUnNhVzVsTFcxbGMzTmhaMlZmY0d4aGFXNHViM1YwYkdsdVpTMXRaWE56WVdkbFgybHVabThnZTF4dUlDQmliM0prWlhJdGJHVm1kRG9nTlhCNElITnZiR2xrSUNNMU1EZGhabVU3WEc0Z0lHSmhZMnRuY205MWJtUXRZMjlzYjNJNklDTmxZMlk0Wm1ZN1hHNTlYRzR1YjNWMGJHbHVaUzF0WlhOellXZGxYM0JzWVdsdUxtOTFkR3hwYm1VdGJXVnpjMkZuWlY5M1lYSnVhVzVuSUh0Y2JpQWdZbTl5WkdWeUxXeGxablE2SURWd2VDQnpiMnhwWkNBalptWTVPVEF4TzF4dUlDQmlZV05yWjNKdmRXNWtMV052Ykc5eU9pQWpabVptWW1VMk8xeHVmVnh1TG05MWRHeHBibVV0YldWemMyRm5aVjl3YkdGcGJpNXZkWFJzYVc1bExXMWxjM05oWjJWZmMzVmpZMlZ6Y3lCN1hHNGdJR0p2Y21SbGNpMXNaV1owT2lBMWNIZ2djMjlzYVdRZ0l6QTFPRGswTWp0Y2JpQWdZbUZqYTJkeWIzVnVaQzFqYjJ4dmNqb2dJMlV4WmpabFlqdGNibjFjYmk1dmRYUnNhVzVsTFcxbGMzTmhaMlZmY0d4aGFXNHViM1YwYkdsdVpTMXRaWE56WVdkbFgyVnljbTl5SUh0Y2JpQWdZbTl5WkdWeUxXeGxablE2SURWd2VDQnpiMnhwWkNBalptWTFaRFZrTzF4dUlDQmlZV05yWjNKdmRXNWtMV052Ykc5eU9pQWpabVptTVdZd08xeHVmVnh1TG05MWRHeHBibVV0YldWemMyRm5aVjl3YkdGcGJpQXViM1YwYkdsdVpTMXRaWE56WVdkbFgxOXBZMjl1SUh0Y2JpQWdkMmxrZEdnNklEQTdYRzRnSUdScGMzQnNZWGs2SUc1dmJtVTdYRzU5WEc0dWIzVjBiR2x1WlMxdFpYTnpZV2RsWDNCc1lXbHVJQzV2ZFhSc2FXNWxMVzFsYzNOaFoyVmZYMmxqYjI0Z0xtOTFkR3hwYm1VdGFXTnZiaUI3WEc0Z0lHUnBjM0JzWVhrNklHNXZibVU3WEc1OVhHNHViM1YwYkdsdVpTMXRaWE56WVdkbFgyeHBaMmgwSUh0Y2JpQWdiV2x1TFhkcFpIUm9PaUF4T0RCd2VEdGNiaUFnY0dGa1pHbHVaem9nTUNBME1IQjRPMXh1ZlZ4dUxtOTFkR3hwYm1VdGJXVnpjMkZuWlY5c2FXZG9kQzV2ZFhSc2FXNWxMVzFsYzNOaFoyVmZhVzVtYnlBdWIzVjBiR2x1WlMxdFpYTnpZV2RsWDE5cFkyOXVJSHRjYmlBZ1kyOXNiM0k2SUNNMU1EZGhabVU3WEc1OVhHNHViM1YwYkdsdVpTMXRaWE56WVdkbFgyeHBaMmgwTG05MWRHeHBibVV0YldWemMyRm5aVjkzWVhKdWFXNW5JQzV2ZFhSc2FXNWxMVzFsYzNOaFoyVmZYMmxqYjI0Z2UxeHVJQ0JqYjJ4dmNqb2dJMlptT1Rrd01UdGNibjFjYmk1dmRYUnNhVzVsTFcxbGMzTmhaMlZmYkdsbmFIUXViM1YwYkdsdVpTMXRaWE56WVdkbFgzTjFZMk5sYzNNZ0xtOTFkR3hwYm1VdGJXVnpjMkZuWlY5ZmFXTnZiaUI3WEc0Z0lHTnZiRzl5T2lBak1EVTRPVFF5TzF4dWZWeHVMbTkxZEd4cGJtVXRiV1Z6YzJGblpWOXNhV2RvZEM1dmRYUnNhVzVsTFcxbGMzTmhaMlZmWlhKeWIzSWdMbTkxZEd4cGJtVXRiV1Z6YzJGblpWOWZhV052YmlCN1hHNGdJR052Ykc5eU9pQWpabVkxWkRWa08xeHVmVnh1TG05MWRHeHBibVV0YldWemMyRm5aVjlzYVdkb2RDQXViM1YwYkdsdVpTMXRaWE56WVdkbFgxOXBZMjl1SUh0Y2JpQWdZbUZqYTJkeWIzVnVaQzFqYjJ4dmNqb2dJMlptWmp0Y2JuMWNiaTV2ZFhSc2FXNWxMVzFsYzNOaFoyVmZjbTkxYm1RZ2UxeHVJQ0JpYjNKa1pYSXRjbUZrYVhWek9pQXlNSEI0TzF4dWZWeHVMbTkxZEd4cGJtVXRiV1Z6YzJGblpWOXliM1Z1WkM1dmRYUnNhVzVsTFcxbGMzTmhaMlZmWkdWbVlYVnNkQ0I3WEc0Z0lHMXBiaTEzYVdSMGFEb2dNVGd3Y0hnN1hHNGdJSEJoWkdScGJtYzZJREFnTkRCd2VEdGNibjFjYmk1dmRYUnNhVzVsTFcxbGMzTmhaMlZmY205MWJtUXViM1YwYkdsdVpTMXRaWE56WVdkbFgyUmxabUYxYkhRZ0xtOTFkR3hwYm1VdGJXVnpjMkZuWlY5ZmFXTnZiaUI3WEc0Z0lHSnZjbVJsY2kxeVlXUnBkWE02SURFd2NIZzdYRzRnSUhSdmNEb2dNVEJ3ZUR0Y2JpQWdiR1ZtZERvZ01UQndlRHRjYmlBZ2QybGtkR2c2SURJd2NIZzdYRzRnSUdobGFXZG9kRG9nTWpCd2VEdGNiaUFnYkdsdVpTMW9aV2xuYUhRNklESXdjSGc3WEc1OVhHNHViM1YwYkdsdVpTMXRaWE56WVdkbFgzSnZkVzVrTG05MWRHeHBibVV0YldWemMyRm5aVjlrWldaaGRXeDBMbTkxZEd4cGJtVXRiV1Z6YzJGblpWOW1kV3hzTFhkcFpIUm9JSHRjYmlBZ2JXbHVMWGRwWkhSb09pQXlNREJ3ZUR0Y2JpQWdjR0ZrWkdsdVp6b2dNQ0F5TUhCNElEQWdOREJ3ZUR0Y2JuMWNiaTV2ZFhSc2FXNWxMVzFsYzNOaFoyVmZjbTkxYm1RdWIzVjBiR2x1WlMxdFpYTnpZV2RsWDNCc1lXbHVJSHRjYmlBZ2JXbHVMWGRwWkhSb09pQXhPVFZ3ZUR0Y2JpQWdjR0ZrWkdsdVp6b2dNQ0EwTUhCNElEQWdNakJ3ZUR0Y2JuMWNiaTV2ZFhSc2FXNWxMVzFsYzNOaFoyVmZjbTkxYm1RdWIzVjBiR2x1WlMxdFpYTnpZV2RsWDNCc1lXbHVMbTkxZEd4cGJtVXRiV1Z6YzJGblpWOW1kV3hzTFhkcFpIUm9JSHRjYmlBZ2JXbHVMWGRwWkhSb09pQXlNVFZ3ZUR0Y2JpQWdjR0ZrWkdsdVp6b2dNQ0F5TUhCNE8xeHVmVnh1TG05MWRHeHBibVV0YldWemMyRm5aVjltZFd4c0xYZHBaSFJvSUh0Y2JpQWdiV2x1TFhkcFpIUm9PaUF5TURCd2VEdGNiaUFnY0dGa1pHbHVaem9nTUNBeE1IQjRJREFnTlRCd2VEdGNibjFjYmk1dmRYUnNhVzVsTFcxbGMzTmhaMlZmWm5Wc2JDMTNhV1IwYUM1dmRYUnNhVzVsTFcxbGMzTmhaMlZmY0d4aGFXNGdlMXh1SUNCdGFXNHRkMmxrZEdnNklESXpNSEI0TzF4dUlDQndZV1JrYVc1bk9pQXdJREV3Y0hnZ01DQXhOWEI0TzF4dWZWeHVMbTkxZEd4cGJtVXRiV1Z6YzJGblpWOW1kV3hzTFhkcFpIUm9MbTkxZEd4cGJtVXRiV1Z6YzJGblpWOXNhV2RvZENCN1hHNGdJRzFwYmkxM2FXUjBhRG9nTWpFd2NIZzdYRzRnSUhCaFpHUnBibWM2SURBZ01UQndlQ0F3SURRd2NIZzdYRzU5WEc0dWIzVjBiR2x1WlMxdFpYTnpZV2RsWDNacGMybGliR1VnZTF4dUlDQnZjR0ZqYVhSNU9pQXhPMXh1ZlZ4dUxtOTFkR3hwYm1VdGJXVnpjMkZuWlY5b2FXUmtaVzRnZTF4dUlDQmthWE53YkdGNU9pQnViMjVsTzF4dWZWeHVMeW9nUFQwOVBUMGdVMk55YjJ4c1ltRnlJRDA5UFQwOUlDb3ZYRzQ2T2kxM1pXSnJhWFF0YzJOeWIyeHNZbUZ5SUh0Y2JpQWdkMmxrZEdnNklEZHdlRHRjYmlBZ2FHVnBaMmgwT2lBM2NIZzdYRzRnSUMxM1pXSnJhWFF0WW05eVpHVnlMWEpoWkdsMWN6b2dOWEI0TzF4dWZWeHVPam90ZDJWaWEybDBMWE5qY205c2JHSmhjaTEwY21GamF5MXdhV1ZqWlNCN1hHNGdJQzEzWldKcmFYUXRZbTl5WkdWeUxYSmhaR2wxY3pvZ05YQjRPMXh1ZlZ4dU9qb3RkMlZpYTJsMExYTmpjbTlzYkdKaGNpMTBhSFZ0WWpwMlpYSjBhV05oYkNCN1hHNGdJR0poWTJ0bmNtOTFibVF0WTI5c2IzSTZJSEpuWW1Fb01Dd2dNQ3dnTUN3Z01DNHlOU2s3WEc0Z0lDMTNaV0pyYVhRdFltOXlaR1Z5TFhKaFpHbDFjem9nTlhCNE8xeHVmVnh1T2pvdGQyVmlhMmwwTFhOamNtOXNiR0poY2kxMGFIVnRZanBvYjNKcGVtOXVkR0ZzSUh0Y2JpQWdZbUZqYTJkeWIzVnVaQzFqYjJ4dmNqb2djbWRpWVNnd0xDQXdMQ0F3TENBd0xqSTFLVHRjYmlBZ0xYZGxZbXRwZEMxaWIzSmtaWEl0Y21Ga2FYVnpPaUExY0hnN1hHNTlYRzQ2T2kxM1pXSnJhWFF0YzJOeWIyeHNZbUZ5TFhSb2RXMWlPbWh2ZG1WeUlIdGNiaUFnWW1GamEyZHliM1Z1WkMxamIyeHZjam9nY21kaVlTZ3dMQ0F3TENBd0xDQXdMak0xS1R0Y2JuMWNiam82TFhkbFltdHBkQzF6WTNKdmJHeGlZWEk2YUc5MlpYSWdlMXh1SUNCaVlXTnJaM0p2ZFc1a0xXTnZiRzl5T2lCeVoySmhLREFzSURBc0lEQXNJREF1TVRVcE8xeHVmVnh1SWl3aUx5b2hJRzV2Y20xaGJHbDZaUzVqYzNNZ2RqZ3VNQzR4SUh3Z1RVbFVJRXhwWTJWdWMyVWdmQ0JuYVhSb2RXSXVZMjl0TDI1bFkyOXNZWE12Ym05eWJXRnNhWHBsTG1OemN5QXFMMXh5WEc1Y2NseHVMeW9nUkc5amRXMWxiblJjY2x4dUlDQWdQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDBnS2k5Y2NseHVYSEpjYmk4cUtseHlYRzRnS2lBeExpQkRiM0p5WldOMElIUm9aU0JzYVc1bElHaGxhV2RvZENCcGJpQmhiR3dnWW5KdmQzTmxjbk11WEhKY2JpQXFJREl1SUZCeVpYWmxiblFnWVdScWRYTjBiV1Z1ZEhNZ2IyWWdabTl1ZENCemFYcGxJR0ZtZEdWeUlHOXlhV1Z1ZEdGMGFXOXVJR05vWVc1blpYTWdhVzRnYVU5VExseHlYRzRnS2k5Y2NseHVYSEpjYm1oMGJXd2dlMXh5WEc0Z0lHeHBibVV0YUdWcFoyaDBPaUF4TGpFMU95QXZLaUF4SUNvdlhISmNiaUFnTFhkbFltdHBkQzEwWlhoMExYTnBlbVV0WVdScWRYTjBPaUF4TURBbE95QXZLaUF5SUNvdlhISmNibjFjY2x4dVhISmNiaThxSUZObFkzUnBiMjV6WEhKY2JpQWdJRDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5SUNvdlhISmNibHh5WEc0dktpcGNjbHh1SUNvZ1VtVnRiM1psSUhSb1pTQnRZWEpuYVc0Z2FXNGdZV3hzSUdKeWIzZHpaWEp6TGx4eVhHNGdLaTljY2x4dVhISmNibUp2WkhrZ2UxeHlYRzRnSUcxaGNtZHBiam9nTUR0Y2NseHVmVnh5WEc1Y2NseHVMeW9xWEhKY2JpQXFJRkpsYm1SbGNpQjBhR1VnWUcxaGFXNWdJR1ZzWlcxbGJuUWdZMjl1YzJsemRHVnVkR3g1SUdsdUlFbEZMbHh5WEc0Z0tpOWNjbHh1WEhKY2JtMWhhVzRnZTF4eVhHNGdJR1JwYzNCc1lYazZJR0pzYjJOck8xeHlYRzU5WEhKY2JseHlYRzR2S2lwY2NseHVJQ29nUTI5eWNtVmpkQ0IwYUdVZ1ptOXVkQ0J6YVhwbElHRnVaQ0J0WVhKbmFXNGdiMjRnWUdneFlDQmxiR1Z0Wlc1MGN5QjNhWFJvYVc0Z1lITmxZM1JwYjI1Z0lHRnVaRnh5WEc0Z0tpQmdZWEowYVdOc1pXQWdZMjl1ZEdWNGRITWdhVzRnUTJoeWIyMWxMQ0JHYVhKbFptOTRMQ0JoYm1RZ1UyRm1ZWEpwTGx4eVhHNGdLaTljY2x4dVhISmNibWd4SUh0Y2NseHVJQ0JtYjI1MExYTnBlbVU2SURKbGJUdGNjbHh1SUNCdFlYSm5hVzQ2SURBdU5qZGxiU0F3TzF4eVhHNTlYSEpjYmx4eVhHNHZLaUJIY205MWNHbHVaeUJqYjI1MFpXNTBYSEpjYmlBZ0lEMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlJQ292WEhKY2JseHlYRzR2S2lwY2NseHVJQ29nTVM0Z1FXUmtJSFJvWlNCamIzSnlaV04wSUdKdmVDQnphWHBwYm1jZ2FXNGdSbWx5WldadmVDNWNjbHh1SUNvZ01pNGdVMmh2ZHlCMGFHVWdiM1psY21ac2IzY2dhVzRnUldSblpTQmhibVFnU1VVdVhISmNiaUFxTDF4eVhHNWNjbHh1YUhJZ2UxeHlYRzRnSUdKdmVDMXphWHBwYm1jNklHTnZiblJsYm5RdFltOTRPeUF2S2lBeElDb3ZYSEpjYmlBZ2FHVnBaMmgwT2lBd095QXZLaUF4SUNvdlhISmNiaUFnYjNabGNtWnNiM2M2SUhacGMybGliR1U3SUM4cUlESWdLaTljY2x4dWZWeHlYRzVjY2x4dUx5b3FYSEpjYmlBcUlERXVJRU52Y25KbFkzUWdkR2hsSUdsdWFHVnlhWFJoYm1ObElHRnVaQ0J6WTJGc2FXNW5JRzltSUdadmJuUWdjMmw2WlNCcGJpQmhiR3dnWW5KdmQzTmxjbk11WEhKY2JpQXFJREl1SUVOdmNuSmxZM1FnZEdobElHOWtaQ0JnWlcxZ0lHWnZiblFnYzJsNmFXNW5JR2x1SUdGc2JDQmljbTkzYzJWeWN5NWNjbHh1SUNvdlhISmNibHh5WEc1d2NtVWdlMXh5WEc0Z0lHWnZiblF0Wm1GdGFXeDVPaUJ0YjI1dmMzQmhZMlVzSUcxdmJtOXpjR0ZqWlRzZ0x5b2dNU0FxTDF4eVhHNGdJR1p2Ym5RdGMybDZaVG9nTVdWdE95QXZLaUF5SUNvdlhISmNibjFjY2x4dVhISmNiaThxSUZSbGVIUXRiR1YyWld3Z2MyVnRZVzUwYVdOelhISmNiaUFnSUQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOUlDb3ZYSEpjYmx4eVhHNHZLaXBjY2x4dUlDb2dVbVZ0YjNabElIUm9aU0JuY21GNUlHSmhZMnRuY205MWJtUWdiMjRnWVdOMGFYWmxJR3hwYm10eklHbHVJRWxGSURFd0xseHlYRzRnS2k5Y2NseHVYSEpjYm1FZ2UxeHlYRzRnSUdKaFkydG5jbTkxYm1RdFkyOXNiM0k2SUhSeVlXNXpjR0Z5Wlc1ME8xeHlYRzU5WEhKY2JseHlYRzR2S2lwY2NseHVJQ29nTVM0Z1VtVnRiM1psSUhSb1pTQmliM1IwYjIwZ1ltOXlaR1Z5SUdsdUlFTm9jbTl0WlNBMU55MWNjbHh1SUNvZ01pNGdRV1JrSUhSb1pTQmpiM0p5WldOMElIUmxlSFFnWkdWamIzSmhkR2x2YmlCcGJpQkRhSEp2YldVc0lFVmtaMlVzSUVsRkxDQlBjR1Z5WVN3Z1lXNWtJRk5oWm1GeWFTNWNjbHh1SUNvdlhISmNibHh5WEc1aFltSnlXM1JwZEd4bFhTQjdYSEpjYmlBZ1ltOXlaR1Z5TFdKdmRIUnZiVG9nYm05dVpUc2dMeW9nTVNBcUwxeHlYRzRnSUhSbGVIUXRaR1ZqYjNKaGRHbHZiam9nZFc1a1pYSnNhVzVsT3lBdktpQXlJQ292WEhKY2JpQWdkR1Y0ZEMxa1pXTnZjbUYwYVc5dU9pQjFibVJsY214cGJtVWdaRzkwZEdWa095QXZLaUF5SUNvdlhISmNibjFjY2x4dVhISmNiaThxS2x4eVhHNGdLaUJCWkdRZ2RHaGxJR052Y25KbFkzUWdabTl1ZENCM1pXbG5hSFFnYVc0Z1EyaHliMjFsTENCRlpHZGxMQ0JoYm1RZ1UyRm1ZWEpwTGx4eVhHNGdLaTljY2x4dVhISmNibUlzWEhKY2JuTjBjbTl1WnlCN1hISmNiaUFnWm05dWRDMTNaV2xuYUhRNklHSnZiR1JsY2p0Y2NseHVmVnh5WEc1Y2NseHVMeW9xWEhKY2JpQXFJREV1SUVOdmNuSmxZM1FnZEdobElHbHVhR1Z5YVhSaGJtTmxJR0Z1WkNCelkyRnNhVzVuSUc5bUlHWnZiblFnYzJsNlpTQnBiaUJoYkd3Z1luSnZkM05sY25NdVhISmNiaUFxSURJdUlFTnZjbkpsWTNRZ2RHaGxJRzlrWkNCZ1pXMWdJR1p2Ym5RZ2MybDZhVzVuSUdsdUlHRnNiQ0JpY205M2MyVnljeTVjY2x4dUlDb3ZYSEpjYmx4eVhHNWpiMlJsTEZ4eVhHNXJZbVFzWEhKY2JuTmhiWEFnZTF4eVhHNGdJR1p2Ym5RdFptRnRhV3g1T2lCdGIyNXZjM0JoWTJVc0lHMXZibTl6Y0dGalpUc2dMeW9nTVNBcUwxeHlYRzRnSUdadmJuUXRjMmw2WlRvZ01XVnRPeUF2S2lBeUlDb3ZYSEpjYm4xY2NseHVYSEpjYmk4cUtseHlYRzRnS2lCQlpHUWdkR2hsSUdOdmNuSmxZM1FnWm05dWRDQnphWHBsSUdsdUlHRnNiQ0JpY205M2MyVnljeTVjY2x4dUlDb3ZYSEpjYmx4eVhHNXpiV0ZzYkNCN1hISmNiaUFnWm05dWRDMXphWHBsT2lBNE1DVTdYSEpjYm4xY2NseHVYSEpjYmk4cUtseHlYRzRnS2lCUWNtVjJaVzUwSUdCemRXSmdJR0Z1WkNCZ2MzVndZQ0JsYkdWdFpXNTBjeUJtY205dElHRm1abVZqZEdsdVp5QjBhR1VnYkdsdVpTQm9aV2xuYUhRZ2FXNWNjbHh1SUNvZ1lXeHNJR0p5YjNkelpYSnpMbHh5WEc0Z0tpOWNjbHh1WEhKY2JuTjFZaXhjY2x4dWMzVndJSHRjY2x4dUlDQm1iMjUwTFhOcGVtVTZJRGMxSlR0Y2NseHVJQ0JzYVc1bExXaGxhV2RvZERvZ01EdGNjbHh1SUNCd2IzTnBkR2x2YmpvZ2NtVnNZWFJwZG1VN1hISmNiaUFnZG1WeWRHbGpZV3d0WVd4cFoyNDZJR0poYzJWc2FXNWxPMXh5WEc1OVhISmNibHh5WEc1emRXSWdlMXh5WEc0Z0lHSnZkSFJ2YlRvZ0xUQXVNalZsYlR0Y2NseHVmVnh5WEc1Y2NseHVjM1Z3SUh0Y2NseHVJQ0IwYjNBNklDMHdMalZsYlR0Y2NseHVmVnh5WEc1Y2NseHVMeW9nUlcxaVpXUmtaV1FnWTI5dWRHVnVkRnh5WEc0Z0lDQTlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQU0FxTDF4eVhHNWNjbHh1THlvcVhISmNiaUFxSUZKbGJXOTJaU0IwYUdVZ1ltOXlaR1Z5SUc5dUlHbHRZV2RsY3lCcGJuTnBaR1VnYkdsdWEzTWdhVzRnU1VVZ01UQXVYSEpjYmlBcUwxeHlYRzVjY2x4dWFXMW5JSHRjY2x4dUlDQmliM0prWlhJdGMzUjViR1U2SUc1dmJtVTdYSEpjYm4xY2NseHVYSEpjYmk4cUlFWnZjbTF6WEhKY2JpQWdJRDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5SUNvdlhISmNibHh5WEc0dktpcGNjbHh1SUNvZ01TNGdRMmhoYm1kbElIUm9aU0JtYjI1MElITjBlV3hsY3lCcGJpQmhiR3dnWW5KdmQzTmxjbk11WEhKY2JpQXFJREl1SUZKbGJXOTJaU0IwYUdVZ2JXRnlaMmx1SUdsdUlFWnBjbVZtYjNnZ1lXNWtJRk5oWm1GeWFTNWNjbHh1SUNvdlhISmNibHh5WEc1aWRYUjBiMjRzWEhKY2JtbHVjSFYwTEZ4eVhHNXZjSFJuY205MWNDeGNjbHh1YzJWc1pXTjBMRnh5WEc1MFpYaDBZWEpsWVNCN1hISmNiaUFnWm05dWRDMW1ZVzFwYkhrNklHbHVhR1Z5YVhRN0lDOHFJREVnS2k5Y2NseHVJQ0JtYjI1MExYTnBlbVU2SURFd01DVTdJQzhxSURFZ0tpOWNjbHh1SUNCc2FXNWxMV2hsYVdkb2REb2dNUzR4TlRzZ0x5b2dNU0FxTDF4eVhHNGdJRzFoY21kcGJqb2dNRHNnTHlvZ01pQXFMMXh5WEc1OVhISmNibHh5WEc0dktpcGNjbHh1SUNvZ1UyaHZkeUIwYUdVZ2IzWmxjbVpzYjNjZ2FXNGdTVVV1WEhKY2JpQXFJREV1SUZOb2IzY2dkR2hsSUc5MlpYSm1iRzkzSUdsdUlFVmtaMlV1WEhKY2JpQXFMMXh5WEc1Y2NseHVZblYwZEc5dUxGeHlYRzVwYm5CMWRDQjdYSEpjYmlBZ0x5b2dNU0FxTDF4eVhHNGdJRzkyWlhKbWJHOTNPaUIyYVhOcFlteGxPMXh5WEc1OVhISmNibHh5WEc0dktpcGNjbHh1SUNvZ1VtVnRiM1psSUhSb1pTQnBibWhsY21sMFlXNWpaU0J2WmlCMFpYaDBJSFJ5WVc1elptOXliU0JwYmlCRlpHZGxMQ0JHYVhKbFptOTRMQ0JoYm1RZ1NVVXVYSEpjYmlBcUlERXVJRkpsYlc5MlpTQjBhR1VnYVc1b1pYSnBkR0Z1WTJVZ2IyWWdkR1Y0ZENCMGNtRnVjMlp2Y20wZ2FXNGdSbWx5WldadmVDNWNjbHh1SUNvdlhISmNibHh5WEc1aWRYUjBiMjRzWEhKY2JuTmxiR1ZqZENCN1hISmNiaUFnTHlvZ01TQXFMMXh5WEc0Z0lIUmxlSFF0ZEhKaGJuTm1iM0p0T2lCdWIyNWxPMXh5WEc1OVhISmNibHh5WEc0dktpcGNjbHh1SUNvZ1EyOXljbVZqZENCMGFHVWdhVzVoWW1sc2FYUjVJSFJ2SUhOMGVXeGxJR05zYVdOcllXSnNaU0IwZVhCbGN5QnBiaUJwVDFNZ1lXNWtJRk5oWm1GeWFTNWNjbHh1SUNvdlhISmNibHh5WEc1aWRYUjBiMjRzWEhKY2JsdDBlWEJsUFNkaWRYUjBiMjRuWFN4Y2NseHVXM1I1Y0dVOUozSmxjMlYwSjEwc1hISmNibHQwZVhCbFBTZHpkV0p0YVhRblhTQjdYSEpjYmlBZ0xYZGxZbXRwZEMxaGNIQmxZWEpoYm1ObE9pQmlkWFIwYjI0N1hISmNibjFjY2x4dVhISmNiaThxS2x4eVhHNGdLaUJTWlcxdmRtVWdkR2hsSUdsdWJtVnlJR0p2Y21SbGNpQmhibVFnY0dGa1pHbHVaeUJwYmlCR2FYSmxabTk0TGx4eVhHNGdLaTljY2x4dVhISmNibUoxZEhSdmJqbzZMVzF2ZWkxbWIyTjFjeTFwYm01bGNpeGNjbHh1VzNSNWNHVTlKMkoxZEhSdmJpZGRPam90Ylc5NkxXWnZZM1Z6TFdsdWJtVnlMRnh5WEc1YmRIbHdaVDBuY21WelpYUW5YVG82TFcxdmVpMW1iMk4xY3kxcGJtNWxjaXhjY2x4dVczUjVjR1U5SjNOMVltMXBkQ2RkT2pvdGJXOTZMV1p2WTNWekxXbHVibVZ5SUh0Y2NseHVJQ0JpYjNKa1pYSXRjM1I1YkdVNklHNXZibVU3WEhKY2JpQWdjR0ZrWkdsdVp6b2dNRHRjY2x4dWZWeHlYRzVjY2x4dUx5b3FYSEpjYmlBcUlGSmxjM1J2Y21VZ2RHaGxJR1p2WTNWeklITjBlV3hsY3lCMWJuTmxkQ0JpZVNCMGFHVWdjSEpsZG1sdmRYTWdjblZzWlM1Y2NseHVJQ292WEhKY2JseHlYRzVpZFhSMGIyNDZMVzF2ZWkxbWIyTjFjM0pwYm1jc1hISmNibHQwZVhCbFBTZGlkWFIwYjI0blhUb3RiVzk2TFdadlkzVnpjbWx1Wnl4Y2NseHVXM1I1Y0dVOUozSmxjMlYwSjEwNkxXMXZlaTFtYjJOMWMzSnBibWNzWEhKY2JsdDBlWEJsUFNkemRXSnRhWFFuWFRvdGJXOTZMV1p2WTNWemNtbHVaeUI3WEhKY2JpQWdiM1YwYkdsdVpUb2dNWEI0SUdSdmRIUmxaQ0JDZFhSMGIyNVVaWGgwTzF4eVhHNTlYSEpjYmx4eVhHNHZLaXBjY2x4dUlDb2dRMjl5Y21WamRDQjBhR1VnY0dGa1pHbHVaeUJwYmlCR2FYSmxabTk0TGx4eVhHNGdLaTljY2x4dVhISmNibVpwWld4a2MyVjBJSHRjY2x4dUlDQndZV1JrYVc1bk9pQXdMak0xWlcwZ01DNDNOV1Z0SURBdU5qSTFaVzA3WEhKY2JuMWNjbHh1WEhKY2JpOHFLbHh5WEc0Z0tpQXhMaUJEYjNKeVpXTjBJSFJvWlNCMFpYaDBJSGR5WVhCd2FXNW5JR2x1SUVWa1oyVWdZVzVrSUVsRkxseHlYRzRnS2lBeUxpQkRiM0p5WldOMElIUm9aU0JqYjJ4dmNpQnBibWhsY21sMFlXNWpaU0JtY205dElHQm1hV1ZzWkhObGRHQWdaV3hsYldWdWRITWdhVzRnU1VVdVhISmNiaUFxSURNdUlGSmxiVzkyWlNCMGFHVWdjR0ZrWkdsdVp5QnpieUJrWlhabGJHOXdaWEp6SUdGeVpTQnViM1FnWTJGMVoyaDBJRzkxZENCM2FHVnVJSFJvWlhrZ2VtVnlieUJ2ZFhSY2NseHVJQ29nSUNBZ1lHWnBaV3hrYzJWMFlDQmxiR1Z0Wlc1MGN5QnBiaUJoYkd3Z1luSnZkM05sY25NdVhISmNiaUFxTDF4eVhHNWNjbHh1YkdWblpXNWtJSHRjY2x4dUlDQmliM2d0YzJsNmFXNW5PaUJpYjNKa1pYSXRZbTk0T3lBdktpQXhJQ292WEhKY2JpQWdZMjlzYjNJNklHbHVhR1Z5YVhRN0lDOHFJRElnS2k5Y2NseHVJQ0JrYVhOd2JHRjVPaUIwWVdKc1pUc2dMeW9nTVNBcUwxeHlYRzRnSUcxaGVDMTNhV1IwYURvZ01UQXdKVHNnTHlvZ01TQXFMMXh5WEc0Z0lIQmhaR1JwYm1jNklEQTdJQzhxSURNZ0tpOWNjbHh1SUNCM2FHbDBaUzF6Y0dGalpUb2dibTl5YldGc095QXZLaUF4SUNvdlhISmNibjFjY2x4dVhISmNiaThxS2x4eVhHNGdLaUJCWkdRZ2RHaGxJR052Y25KbFkzUWdkbVZ5ZEdsallXd2dZV3hwWjI1dFpXNTBJR2x1SUVOb2NtOXRaU3dnUm1seVpXWnZlQ3dnWVc1a0lFOXdaWEpoTGx4eVhHNGdLaTljY2x4dVhISmNibkJ5YjJkeVpYTnpJSHRjY2x4dUlDQjJaWEowYVdOaGJDMWhiR2xuYmpvZ1ltRnpaV3hwYm1VN1hISmNibjFjY2x4dVhISmNiaThxS2x4eVhHNGdLaUJTWlcxdmRtVWdkR2hsSUdSbFptRjFiSFFnZG1WeWRHbGpZV3dnYzJOeWIyeHNZbUZ5SUdsdUlFbEZJREV3S3k1Y2NseHVJQ292WEhKY2JseHlYRzUwWlhoMFlYSmxZU0I3WEhKY2JpQWdiM1psY21ac2IzYzZJR0YxZEc4N1hISmNibjFjY2x4dVhISmNiaThxS2x4eVhHNGdLaUF4TGlCQlpHUWdkR2hsSUdOdmNuSmxZM1FnWW05NElITnBlbWx1WnlCcGJpQkpSU0F4TUM1Y2NseHVJQ29nTWk0Z1VtVnRiM1psSUhSb1pTQndZV1JrYVc1bklHbHVJRWxGSURFd0xseHlYRzRnS2k5Y2NseHVYSEpjYmx0MGVYQmxQU2RqYUdWamEySnZlQ2RkTEZ4eVhHNWJkSGx3WlQwbmNtRmthVzhuWFNCN1hISmNiaUFnWW05NExYTnBlbWx1WnpvZ1ltOXlaR1Z5TFdKdmVEc2dMeW9nTVNBcUwxeHlYRzRnSUhCaFpHUnBibWM2SURBN0lDOHFJRElnS2k5Y2NseHVmVnh5WEc1Y2NseHVMeW9xWEhKY2JpQXFJRU52Y25KbFkzUWdkR2hsSUdOMWNuTnZjaUJ6ZEhsc1pTQnZaaUJwYm1OeVpXMWxiblFnWVc1a0lHUmxZM0psYldWdWRDQmlkWFIwYjI1eklHbHVJRU5vY205dFpTNWNjbHh1SUNvdlhISmNibHh5WEc1YmRIbHdaVDBuYm5WdFltVnlKMTA2T2kxM1pXSnJhWFF0YVc1dVpYSXRjM0JwYmkxaWRYUjBiMjRzWEhKY2JsdDBlWEJsUFNkdWRXMWlaWEluWFRvNkxYZGxZbXRwZEMxdmRYUmxjaTF6Y0dsdUxXSjFkSFJ2YmlCN1hISmNiaUFnYUdWcFoyaDBPaUJoZFhSdk8xeHlYRzU5WEhKY2JseHlYRzR2S2lwY2NseHVJQ29nTVM0Z1EyOXljbVZqZENCMGFHVWdiMlJrSUdGd2NHVmhjbUZ1WTJVZ2FXNGdRMmh5YjIxbElHRnVaQ0JUWVdaaGNta3VYSEpjYmlBcUlESXVJRU52Y25KbFkzUWdkR2hsSUc5MWRHeHBibVVnYzNSNWJHVWdhVzRnVTJGbVlYSnBMbHh5WEc0Z0tpOWNjbHh1WEhKY2JsdDBlWEJsUFNkelpXRnlZMmduWFNCN1hISmNiaUFnTFhkbFltdHBkQzFoY0hCbFlYSmhibU5sT2lCMFpYaDBabWxsYkdRN0lDOHFJREVnS2k5Y2NseHVJQ0J2ZFhSc2FXNWxMVzltWm5ObGREb2dMVEp3ZURzZ0x5b2dNaUFxTDF4eVhHNTlYSEpjYmx4eVhHNHZLaXBjY2x4dUlDb2dVbVZ0YjNabElIUm9aU0JwYm01bGNpQndZV1JrYVc1bklHbHVJRU5vY205dFpTQmhibVFnVTJGbVlYSnBJRzl1SUcxaFkwOVRMbHh5WEc0Z0tpOWNjbHh1WEhKY2JsdDBlWEJsUFNkelpXRnlZMmduWFRvNkxYZGxZbXRwZEMxelpXRnlZMmd0WkdWamIzSmhkR2x2YmlCN1hISmNiaUFnTFhkbFltdHBkQzFoY0hCbFlYSmhibU5sT2lCdWIyNWxPMXh5WEc1OVhISmNibHh5WEc0dktpcGNjbHh1SUNvZ01TNGdRMjl5Y21WamRDQjBhR1VnYVc1aFltbHNhWFI1SUhSdklITjBlV3hsSUdOc2FXTnJZV0pzWlNCMGVYQmxjeUJwYmlCcFQxTWdZVzVrSUZOaFptRnlhUzVjY2x4dUlDb2dNaTRnUTJoaGJtZGxJR1p2Ym5RZ2NISnZjR1Z5ZEdsbGN5QjBieUJnYVc1b1pYSnBkR0FnYVc0Z1UyRm1ZWEpwTGx4eVhHNGdLaTljY2x4dVhISmNiam82TFhkbFltdHBkQzFtYVd4bExYVndiRzloWkMxaWRYUjBiMjRnZTF4eVhHNGdJQzEzWldKcmFYUXRZWEJ3WldGeVlXNWpaVG9nWW5WMGRHOXVPeUF2S2lBeElDb3ZYSEpjYmlBZ1ptOXVkRG9nYVc1b1pYSnBkRHNnTHlvZ01pQXFMMXh5WEc1OVhISmNibHh5WEc0dktpQkpiblJsY21GamRHbDJaVnh5WEc0Z0lDQTlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQU0FxTDF4eVhHNWNjbHh1THlwY2NseHVJQ29nUVdSa0lIUm9aU0JqYjNKeVpXTjBJR1JwYzNCc1lYa2dhVzRnUldSblpTd2dTVVVnTVRBckxDQmhibVFnUm1seVpXWnZlQzVjY2x4dUlDb3ZYSEpjYmx4eVhHNWtaWFJoYVd4eklIdGNjbHh1SUNCa2FYTndiR0Y1T2lCaWJHOWphenRjY2x4dWZWeHlYRzVjY2x4dUx5cGNjbHh1SUNvZ1FXUmtJSFJvWlNCamIzSnlaV04wSUdScGMzQnNZWGtnYVc0Z1lXeHNJR0p5YjNkelpYSnpMbHh5WEc0Z0tpOWNjbHh1WEhKY2JuTjFiVzFoY25rZ2UxeHlYRzRnSUdScGMzQnNZWGs2SUd4cGMzUXRhWFJsYlR0Y2NseHVmVnh5WEc1Y2NseHVMeW9nVFdselkxeHlYRzRnSUNBOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBTQXFMMXh5WEc1Y2NseHVMeW9xWEhKY2JpQXFJRUZrWkNCMGFHVWdZMjl5Y21WamRDQmthWE53YkdGNUlHbHVJRWxGSURFd0t5NWNjbHh1SUNvdlhISmNibHh5WEc1MFpXMXdiR0YwWlNCN1hISmNiaUFnWkdsemNHeGhlVG9nYm05dVpUdGNjbHh1ZlZ4eVhHNWNjbHh1THlvcVhISmNiaUFxSUVGa1pDQjBhR1VnWTI5eWNtVmpkQ0JrYVhOd2JHRjVJR2x1SUVsRklERXdMbHh5WEc0Z0tpOWNjbHh1WEhKY2JsdG9hV1JrWlc1ZElIdGNjbHh1SUNCa2FYTndiR0Y1T2lCdWIyNWxPMXh5WEc1OVhISmNiaUlzSWtCcGJYQnZjblFnSnk0dlkyOXNiM0p6Snp0Y2NseHVYSEpjYmk4cUlEMDlQVDA5SUVKaGMyVWdQVDA5UFQwZ0tpOWNjbHh1YUhSdGJDeGNjbHh1WW05a2VTQjdYSEpjYmlBZ2FHVnBaMmgwT2lBeE1EQWxPMXh5WEc0Z0lHSmhZMnRuY205MWJtUTZJRUJpWjE5amIyeHZjanRjY2x4dUlDQmpiMnh2Y2pvZ1FIQnlhVzFoY25sZmRHVjRkRjlqYjJ4dmNqdGNjbHh1SUNCbWIyNTBMWE5wZW1VNklERTBjSGc3WEhKY2JpQWdiR2x1WlMxb1pXbG5hSFE2SURFMU1DVTdYSEpjYmlBZ1ptOXVkQzFtWVcxcGJIazZJQ2ROYVdOeWIzTnZablFnV1dGSVpXa2dWVWtuTENCQmNtbGhiQ3dnYzJGdWN5MXpaWEpwWmp0Y2NseHVJQ0J2ZG1WeVpteHZkem9nYUdsa1pHVnVPMXh5WEc1OVhISmNibHh5WEc1aElIdGNjbHh1SUNBbU9teHBibXNzWEhKY2JpQWdKanAyYVhOcGRHVmtMRnh5WEc0Z0lDWTZhRzkyWlhJZ2UxeHlYRzRnSUNBZ1kyOXNiM0k2SUVCemRXTmpaWE56WDJOdmJHOXlPMXh5WEc0Z0lDQWdkR1Y0ZEMxa1pXTnZjbUYwYVc5dU9pQnViMjVsTzF4eVhHNGdJSDFjY2x4dVhISmNiaUFnSmpwb2IzWmxjaUI3WEhKY2JpQWdJQ0IwWlhoMExXUmxZMjl5WVhScGIyNDZJSFZ1WkdWeWJHbHVaVHRjY2x4dUlDQjlYSEpjYm4xY2NseHVYSEpjYm1OdlpHVWdlMXh5WEc0Z0lHWnZiblF0Wm1GdGFXeDVPaUFuVTI5MWNtTmxJRU52WkdVZ1VISnZKeXdnUTI5dWMyOXNZWE1zSUVkbGIzSm5hV0VzSUUxdmJtRmpieXdnYlc5dWIzTndZV05sTENCQmNtbGhiQ3hjY2x4dUlDQWdJSE5oYm5NdGMyVnlhV1k3WEhKY2JuMWNjbHh1SWl3aUx5b2dQVDA5UFQwZ1UyTnliMnhzWW1GeUlEMDlQVDA5SUNvdlhISmNiam82TFhkbFltdHBkQzF6WTNKdmJHeGlZWElnZTF4eVhHNGdJSGRwWkhSb09pQTNjSGc3WEhKY2JpQWdhR1ZwWjJoME9pQTNjSGc3WEhKY2JpQWdMWGRsWW10cGRDMWliM0prWlhJdGNtRmthWFZ6T2lBMWNIZzdYSEpjYm4xY2NseHVYSEpjYmpvNkxYZGxZbXRwZEMxelkzSnZiR3hpWVhJdGRISmhZMnN0Y0dsbFkyVWdlMXh5WEc0Z0lDMTNaV0pyYVhRdFltOXlaR1Z5TFhKaFpHbDFjem9nTlhCNE8xeHlYRzU5WEhKY2JseHlYRzQ2T2kxM1pXSnJhWFF0YzJOeWIyeHNZbUZ5TFhSb2RXMWlPblpsY25ScFkyRnNJSHRjY2x4dUlDQmlZV05yWjNKdmRXNWtMV052Ykc5eU9pQnlaMkpoS0RBc0lEQXNJREFzSURBdU1qVXBPMXh5WEc0Z0lDMTNaV0pyYVhRdFltOXlaR1Z5TFhKaFpHbDFjem9nTlhCNE8xeHlYRzU5WEhKY2JseHlYRzQ2T2kxM1pXSnJhWFF0YzJOeWIyeHNZbUZ5TFhSb2RXMWlPbWh2Y21sNmIyNTBZV3dnZTF4eVhHNGdJR0poWTJ0bmNtOTFibVF0WTI5c2IzSTZJSEpuWW1Fb01Dd2dNQ3dnTUN3Z01DNHlOU2s3WEhKY2JpQWdMWGRsWW10cGRDMWliM0prWlhJdGNtRmthWFZ6T2lBMWNIZzdYSEpjYm4xY2NseHVYSEpjYmpvNkxYZGxZbXRwZEMxelkzSnZiR3hpWVhJNmFHOTJaWElnZTF4eVhHNGdJR0poWTJ0bmNtOTFibVF0WTI5c2IzSTZJSEpuWW1Fb01Dd2dNQ3dnTUN3Z01DNHhOU2s3WEhKY2JuMWNjbHh1WEhKY2JqbzZMWGRsWW10cGRDMXpZM0p2Ykd4aVlYSXRkR2gxYldJNmFHOTJaWElnZTF4eVhHNGdJR0poWTJ0bmNtOTFibVF0WTI5c2IzSTZJSEpuWW1Fb01Dd2dNQ3dnTUN3Z01DNHpOU2s3WEhKY2JuMWNjbHh1SWl3aVFHbHRjRzl5ZENBbkxpOWpiMnh2Y25Nbk8xeHlYRzVjY2x4dUx5b2dUR0Y1YjNWMElDb3ZYSEpjYmk1a2IyTnpJSHRjY2x4dUlDQmthWE53YkdGNU9pQm1iR1Y0TzF4eVhHNGdJR1pzWlhndFpHbHlaV04wYVc5dU9pQnliM2M3WEhKY2JpQWdabXhsZUMxM2NtRndPaUJ1YjNkeVlYQTdYSEpjYmlBZ2NHOXphWFJwYjI0NklISmxiR0YwYVhabE8xeHlYRzRnSUhvdGFXNWtaWGc2SURFN1hISmNiaUFnYUdWcFoyaDBPaUF4TURBbE8xeHlYRzRnSUhkcFpIUm9PaUF4TURBbE8xeHlYRzRnSUcxaGNtZHBiam9nTUR0Y2NseHVJQ0J2ZG1WeVpteHZkem9nYUdsa1pHVnVPMXh5WEc1OVhISmNibHh5WEc0dktpQkJjMmxrWlNBcUwxeHlYRzR1WVhOcFpHVWdlMXh5WEc0Z0lHUnBjM0JzWVhrNklHWnNaWGc3WEhKY2JpQWdabXhsZUMxemFISnBibXM2SURBN1hISmNiaUFnWm14bGVDMWthWEpsWTNScGIyNDZJR052YkhWdGJqdGNjbHh1SUNCbWJHVjRMWGR5WVhBNklHNXZkM0poY0R0Y2NseHVJQ0IzYVdSMGFEb2dNall3Y0hnN1hISmNiaUFnYldGeVoybHVPaUF3TzF4eVhHNGdJR2hsYVdkb2REb2dNVEF3SlR0Y2NseHVJQ0JpWVdOclozSnZkVzVrTFdOdmJHOXlPaUJBY0hKcGJXRnllVjkwWlhoMFgyTnZiRzl5TzF4eVhHNGdJR052Ykc5eU9pQkFZbTl5WkdWeVgyTnZiRzl5TzF4eVhHNGdJR0p2ZUMxemFHRmtiM2M2SURBZ01DQTFjSGdnTW5CNElFQmliM0prWlhKZlkyOXNiM0k3WEhKY2JpQWdkSEpoYm5OcGRHbHZiaTFrZFhKaGRHbHZiam9nTUM0emN6dGNjbHh1SUNCdmRtVnlabXh2ZHpvZ1lYVjBienRjY2x4dWZWeHlYRzVjY2x4dUx5b2dUV0ZwYmlBcUwxeHlYRzR1YldGcGJpQjdYSEpjYmlBZ1pteGxlRG9nTVR0Y2NseHVJQ0J3YjNOcGRHbHZiam9nY21Wc1lYUnBkbVU3WEhKY2JpQWdlaTFwYm1SbGVEb2dNVHRjY2x4dUlDQm9aV2xuYUhRNklERXdNQ1U3WEhKY2JpQWdZbUZqYTJkeWIzVnVaQzFqYjJ4dmNqb2dRSGRvYVhSbE8xeHlYRzRnSUc5MlpYSm1iRzkzT2lCaGRYUnZPMXh5WEc1OVhISmNibHh5WEc1QWJXVmthV0VnS0cxaGVDMTNhV1IwYURvZ05UQXdjSGdwSUh0Y2NseHVJQ0F1Wkc5amN5QjdYSEpjYmlBZ0lDQm1iR1Y0TFdScGNtVmpkR2x2YmpvZ1kyOXNkVzF1TzF4eVhHNGdJSDFjY2x4dVhISmNiaUFnTG1GemFXUmxMRnh5WEc0Z0lDNXRZV2x1SUh0Y2NseHVJQ0FnSUhkcFpIUm9PaUF4TURBbE8xeHlYRzRnSUgxY2NseHVYSEpjYmlBZ0xtRnphV1JsSUh0Y2NseHVJQ0FnSUhCdmMybDBhVzl1T2lCbWFYaGxaRHRjY2x4dUlDQWdJSG90YVc1a1pYZzZJRE03WEhKY2JpQWdJQ0IwYjNBNklEQTdYSEpjYmx4eVhHNGdJQ0FnSmk1dmRYUnNhVzVsTFc1aGRtbG5ZWFJ2Y2lCN1hISmNiaUFnSUNBZ0lDWmZabTlzWkdWa0lIdGNjbHh1SUNBZ0lDQWdJQ0JzWldaME9pQXRNVEF3SlR0Y2NseHVJQ0FnSUNBZ2ZWeHlYRzVjY2x4dUlDQWdJQ0FnSmw5bGVIQmhibVJsWkNCN1hISmNiaUFnSUNBZ0lDQWdiR1ZtZERvZ01EdGNjbHh1SUNBZ0lDQWdmVnh5WEc0Z0lDQWdmVnh5WEc0Z0lIMWNjbHh1ZlZ4eVhHNGlMQ0pBYVcxd2IzSjBJQ2N1TDJOdmJHOXljeWM3WEhKY2JseHlYRzR1WVhOcFpHVWdlMXh5WEc0Z0lHWnZiblF0Wm1GdGFXeDVPaUFuVTI5MWNtTmxJRU52WkdVZ1VISnZKeXdnUTI5dWMyOXNZWE1zSUVkbGIzSm5hV0VzSUUxdmJtRmpieXdnYlc5dWIzTndZV05sTENCQmNtbGhiQ3hjY2x4dUlDQWdJSE5oYm5NdGMyVnlhV1k3WEhKY2JseHlYRzRnSUNaZlgyaGxZV1JsY2lCN1hISmNiaUFnSUNCdFlYSm5hVzQ2SURBZ1lYVjBienRjY2x4dUlDQWdJR1pzWlhndGMyaHlhVzVyT2lBd08xeHlYRzRnSUNBZ2IzWmxjbVpzYjNjNklHaHBaR1JsYmp0Y2NseHVJQ0I5WEhKY2JseHlYRzRnSUNaZlgyNWhkaUI3WEhKY2JpQWdJQ0JtYkdWNE9pQXhPMXh5WEc0Z0lDQWdiM1psY21ac2IzYzZJR0YxZEc4N1hISmNiaUFnZlZ4eVhHNWNjbHh1SUNBbVgxOW9NaUI3WEhKY2JpQWdJQ0J0WVhKbmFXNDZJREFnWVhWMGJ6dGNjbHh1SUNBZ0lHaGxhV2RvZERvZ05UUndlRHRjY2x4dUlDQWdJR3hwYm1VdGFHVnBaMmgwT2lBMU5IQjRPMXh5WEc0Z0lDQWdabTl1ZEMxemFYcGxPaUF5TUhCNE8xeHlYRzRnSUNBZ1ptOXVkQzEzWldsbmFIUTZJRzV2Y20xaGJEdGNjbHh1SUNBZ0lHWnZiblF0Wm1GdGFXeDVPaUJIWlc5eVoybGhMQ0JEYjI1emIyeGhjeXdnUVhKcFlXd3NJSE5oYm5NdGMyVnlhV1k3WEhKY2JpQWdJQ0IwWlhoMExXRnNhV2R1T2lCalpXNTBaWEk3WEhKY2JpQWdJQ0J2ZG1WeVpteHZkem9nYUdsa1pHVnVPMXh5WEc0Z0lIMWNjbHh1WEhKY2JpQWdKbDlmYURNZ2UxeHlYRzRnSUNBZ2JXRnlaMmx1T2lBd0lHRjFkRzg3WEhKY2JpQWdJQ0J3WVdSa2FXNW5PaUF3SURJd2NIZzdYSEpjYmlBZ0lDQm1iMjUwTFhOcGVtVTZJREUyY0hnN1hISmNiaUFnSUNCdmRtVnlabXh2ZHpvZ2FHbGtaR1Z1TzF4eVhHNGdJSDFjY2x4dVhISmNiaUFnSmw5ZmJHbHpkQ0I3WEhKY2JpQWdJQ0J0WVhKbmFXNDZJREE3WEhKY2JpQWdJQ0J3WVdSa2FXNW5PaUF4TUhCNElEQTdYSEpjYmlBZ0lDQnZkbVZ5Wm14dmR6b2dhR2xrWkdWdU8xeHlYRzRnSUgxY2NseHVYSEpjYmlBZ0psOWZhWFJsYlNCN1hISmNiaUFnSUNCb1pXbG5hSFE2SURNeWNIZzdYSEpjYmlBZ0lDQnNhVzVsTFdobGFXZG9kRG9nTXpKd2VEdGNjbHh1SUNBZ0lIQmhaR1JwYm1jNklEQWdNekJ3ZUR0Y2NseHVJQ0FnSUdOMWNuTnZjam9nY0c5cGJuUmxjanRjY2x4dUlDQWdJR1p2Ym5RdGMybDZaVG9nTVROd2VEdGNjbHh1SUNBZ0lHOTJaWEptYkc5M09pQm9hV1JrWlc0N1hISmNiaUFnZlZ4eVhHNWNjbHh1SUNBbUxXNWhkbWxuWVhSdmNpQjdYSEpjYmlBZ0lDQm1iR1Y0T2lBeE8xeHlYRzVjY2x4dUlDQWdJQzV2ZFhSc2FXNWxMVzVoZG1sbllYUnZjaUI3WEhKY2JpQWdJQ0FnSUNaZlgyMWhhVzRnZTF4eVhHNGdJQ0FnSUNBZ0lDWTZPaTEzWldKcmFYUXRjMk55YjJ4c1ltRnlMWFJvZFcxaUlIdGNjbHh1SUNBZ0lDQWdJQ0FnSUdKaFkydG5jbTkxYm1RdFkyOXNiM0k2SUVCMGFHbHlaRjkwWlhoMFgyTnZiRzl5TzF4eVhHNWNjbHh1SUNBZ0lDQWdJQ0FnSUNZNmFHOTJaWElnZTF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0JpWVdOclozSnZkVzVrTFdOdmJHOXlPaUJBWm05MWNuUm9YM1JsZUhSZlkyOXNiM0k3WEhKY2JpQWdJQ0FnSUNBZ0lDQjlYSEpjYmlBZ0lDQWdJQ0FnZlZ4eVhHNGdJQ0FnSUNCOVhISmNibHh5WEc0Z0lDQWdJQ0FtWDE5d2JHRmpaV2h2YkdSbGNpQjdYSEpjYmlBZ0lDQWdJQ0FnWW1GamEyZHliM1Z1WkMxamIyeHZjam9nUUhObFkyOXVaR0Z5ZVY5MFpYaDBYMk52Ykc5eU8xeHlYRzRnSUNBZ0lDQWdJR0p2Y21SbGNpMXNaV1owT2lBemNIZ2djMjlzYVdRZ1FIZG9hWFJsTzF4eVhHNGdJQ0FnSUNCOVhISmNibHh5WEc0Z0lDQWdJQ0FtWDE5aGJtTm9iM0lnZTF4eVhHNGdJQ0FnSUNBZ0lDWTZiR2x1YXlCN1hISmNiaUFnSUNBZ0lDQWdJQ0JqYjJ4dmNqb2dRR0p2Y21SbGNsOWpiMnh2Y2p0Y2NseHVJQ0FnSUNBZ0lDQWdJSFJsZUhRdFpHVmpiM0poZEdsdmJqb2dibTl1WlR0Y2NseHVJQ0FnSUNBZ0lDQjlYSEpjYmx4eVhHNGdJQ0FnSUNBZ0lDWTZkbWx6YVhSbFpDQjdYSEpjYmlBZ0lDQWdJQ0FnSUNCamIyeHZjam9nUUdKdmNtUmxjbDlqYjJ4dmNqdGNjbHh1SUNBZ0lDQWdJQ0FnSUhSbGVIUXRaR1ZqYjNKaGRHbHZiam9nYm05dVpUdGNjbHh1SUNBZ0lDQWdJQ0I5WEhKY2JseHlYRzRnSUNBZ0lDQWdJQ1k2YUc5MlpYSWdlMXh5WEc0Z0lDQWdJQ0FnSUNBZ1kyOXNiM0k2SUVCaWIzSmtaWEpmWTI5c2IzSTdYSEpjYmlBZ0lDQWdJQ0FnSUNCMFpYaDBMV1JsWTI5eVlYUnBiMjQ2SUhWdVpHVnliR2x1WlR0Y2NseHVJQ0FnSUNBZ0lDQjlYSEpjYmlBZ0lDQWdJSDFjY2x4dVhISmNiaUFnSUNBZ0lDWmZZV04wYVhabElIdGNjbHh1SUNBZ0lDQWdJQ0FtTG05MWRHeHBibVV0Ym1GMmFXZGhkRzl5WDE5aGJtTm9iM0lnZTF4eVhHNGdJQ0FnSUNBZ0lDQWdKanBzYVc1ckxGeHlYRzRnSUNBZ0lDQWdJQ0FnSmpwMmFYTnBkR1ZrTEZ4eVhHNGdJQ0FnSUNBZ0lDQWdKanBvYjNabGNpQjdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lHTnZiRzl5T2lCQWQyaHBkR1U3WEhKY2JpQWdJQ0FnSUNBZ0lDQjlYSEpjYmlBZ0lDQWdJQ0FnZlZ4eVhHNGdJQ0FnSUNCOVhISmNiaUFnSUNCOVhISmNiaUFnZlZ4eVhHNTlYSEpjYmlJc0lrQnBiWEJ2Y25RZ0p5NHZZMjlzYjNKekp6dGNjbHh1WEhKY2JpNXRZV2x1SUh0Y2NseHVJQ0FtWDE5b1pXRmtaWElzWEhKY2JpQWdKbDlmWm05dmRHVnlJSHRjY2x4dUlDQWdJRzFoY21kcGJqb2dNQ0JoZFhSdk8xeHlYRzRnSUNBZ2NHRmtaR2x1WnpvZ01XVnRPMXh5WEc0Z0lDQWdkR1Y0ZEMxaGJHbG5iam9nWTJWdWRHVnlPMXh5WEc0Z0lDQWdiM1psY21ac2IzYzZJR2hwWkdSbGJqdGNjbHh1SUNCOVhISmNibHh5WEc0Z0lDWmZYMmd4SUh0Y2NseHVJQ0FnSUcxaGNtZHBiam9nTUNCaGRYUnZPMXh5WEc0Z0lDQWdjR0ZrWkdsdVp5MTBiM0E2SURGbGJUdGNjbHh1SUNBZ0lHWnZiblF0YzJsNlpUb2dOV1Z0TzF4eVhHNGdJQ0FnWm05dWRDMTNaV2xuYUhRNklHNXZjbTFoYkR0Y2NseHVJQ0FnSUd4cGJtVXRhR1ZwWjJoME9pQXlaVzA3WEhKY2JpQWdJQ0J2ZG1WeVpteHZkem9nYUdsa1pHVnVPMXh5WEc0Z0lIMWNjbHh1WEhKY2JpQWdKbDlmYm1GdFpTQjdYSEpjYmlBZ0lDQmpiMnh2Y2pvZ0l6VXdOMkZtWlR0Y2NseHVJQ0FnSUdadmJuUXRkMlZwWjJoME9pQnViM0p0WVd3N1hISmNiaUFnZlZ4eVhHNWNjbHh1SUNBbVgxOTBZV2RzYVc1bElIdGNjbHh1SUNBZ0lHMWhjbWRwYmpvZ01XVnRJR0YxZEc4N1hISmNiaUFnSUNCdFlYZ3RkMmxrZEdnNklEazJNSEI0TzF4eVhHNGdJQ0FnYkdsdVpTMW9aV2xuYUhRNklERXVNMlZ0TzF4eVhHNGdJQ0FnWm05dWRDMXphWHBsT2lBeVpXMDdYSEpjYmlBZ0lDQmpiMnh2Y2pvZ1FHWnZkWEowYUY5MFpYaDBYMk52Ykc5eU8xeHlYRzRnSUNBZ1ptOXVkQzEzWldsbmFIUTZJREV3TUR0Y2NseHVJQ0FnSUc5MlpYSm1iRzkzT2lCb2FXUmtaVzQ3WEhKY2JpQWdmVnh5WEc1Y2NseHVJQ0FtWDE5alpHNGdlMXh5WEc0Z0lDQWdiV0Z5WjJsdU9pQXlaVzBnTUR0Y2NseHVJQ0FnSUhCaFpHUnBibWM2SURKbGJUdGNjbHh1SUNBZ0lHWnZiblF0YzJsNlpUb2dNVFp3ZUR0Y2NseHVJQ0FnSUd4cGJtVXRhR1ZwWjJoME9pQXhOVEFsTzF4eVhHNGdJQ0FnZEdWNGRDMWhiR2xuYmpvZ1kyVnVkR1Z5TzF4eVhHNGdJQ0FnWW1GamEyZHliM1Z1WkMxamIyeHZjam9nUUdKblgyTnZiRzl5TzF4eVhHNGdJQ0FnWW05eVpHVnlMWFJ2Y0RvZ01YQjRJSE52Ykdsa0lFQmliM0prWlhKZlkyOXNiM0k3WEhKY2JpQWdJQ0JpYjNKa1pYSXRZbTkwZEc5dE9pQXhjSGdnYzI5c2FXUWdRR0p2Y21SbGNsOWpiMnh2Y2p0Y2NseHVJQ0FnSUdOdmJHOXlPaUJBZEdocGNtUmZkR1Y0ZEY5amIyeHZjanRjY2x4dUlDQWdJRzkyWlhKbWJHOTNPaUJvYVdSa1pXNDdYSEpjYmlBZ2ZWeHlYRzVjY2x4dUlDQW1YMTlrYjNkdWJHOWhaQ0I3WEhKY2JpQWdJQ0J0WVhKbmFXNDZJREZsYlNCaGRYUnZPMXh5WEc0Z0lDQWdkMmxrZEdnNklESXdNSEI0TzF4eVhHNGdJQ0FnZEdWNGRDMWhiR2xuYmpvZ1kyVnVkR1Z5TzF4eVhHNGdJQ0FnYjNabGNtWnNiM2M2SUdocFpHUmxianRjY2x4dUlDQjlYSEpjYmx4eVhHNGdJQ1pmWDJKMWRIUnZiaUI3WEhKY2JpQWdJQ0JrYVhOd2JHRjVPaUJwYm14cGJtVXRZbXh2WTJzN1hISmNiaUFnSUNCaWIzSmtaWEl0Y21Ga2FYVnpPaUEwY0hnN1hISmNiaUFnSUNCd1lXUmthVzVuT2lBeE5IQjRJREk1Y0hnN1hISmNiaUFnSUNCbWIyNTBMWE5wZW1VNklERTRjSGc3WEhKY2JpQWdJQ0JtYjI1MExXWmhiV2xzZVRvZ0oxTnZkWEpqWlNCRGIyUmxJRkJ5Ynljc0lFTnZibk52YkdGekxDQkhaVzl5WjJsaExDQk5iMjVoWTI4c0lHMXZibTl6Y0dGalpTd2dRWEpwWVd3c1hISmNiaUFnSUNBZ0lITmhibk10YzJWeWFXWTdYSEpjYmlBZ0lDQmlZV05yWjNKdmRXNWtMV052Ykc5eU9pQkFjM1ZqWTJWemMxOWpiMnh2Y2p0Y2NseHVJQ0FnSUc5MlpYSm1iRzkzT2lCb2FXUmtaVzQ3WEhKY2JseHlYRzRnSUNBZ0pqcHNhVzVyTEZ4eVhHNGdJQ0FnSmpwMmFYTnBkR1ZrTEZ4eVhHNGdJQ0FnSmpwb2IzWmxjaUI3WEhKY2JpQWdJQ0FnSUdOdmJHOXlPaUJBZDJocGRHVTdYSEpjYmlBZ0lDQWdJSFJsZUhRdFpHVmpiM0poZEdsdmJqb2dibTl1WlR0Y2NseHVJQ0FnSUgxY2NseHVJQ0I5WEhKY2JseHlYRzRnSUNaZlgyWnZiM1JsY2lCN1hISmNiaUFnSUNCdFlYSm5hVzQ2SURBZ00yVnRPMXh5WEc0Z0lDQWdZbTl5WkdWeUxYUnZjRG9nTVhCNElITnZiR2xrSUVCaWIzSmtaWEpmWTI5c2IzSTdYSEpjYmlBZ2ZWeHlYRzU5WEhKY2JpSXNJa0JwYlhCdmNuUWdKeTR2WTI5c2IzSnpKenRjY2x4dVhISmNiaTV6WldOMGFXOXVJSHRjY2x4dUlDQnRZWEpuYVc0NklERmxiU0F3TzF4eVhHNGdJRzkyWlhKbWJHOTNPaUJvYVdSa1pXNDdYSEpjYmx4eVhHNGdJQ1pmWDJobFlXUmxjaXhjY2x4dUlDQW1YMTlqYjI1MFpXNTBMRnh5WEc0Z0lDWmZYMlp2YjNSbGNpQjdYSEpjYmlBZ0lDQnRZWEpuYVc0NklEQTdYSEpjYmlBZ0lDQndZV1JrYVc1bk9pQXdJRE5sYlR0Y2NseHVJQ0FnSUc5MlpYSm1iRzkzT2lCb2FXUmtaVzQ3WEhKY2JpQWdmVnh5WEc1Y2NseHVJQ0FtWDE5MGFYUnNaU0I3WEhKY2JpQWdJQ0JqYjJ4dmNqb2dRSFJvYVhKa1gzUmxlSFJmWTI5c2IzSTdYSEpjYmlBZ2ZWeHlYRzVjY2x4dUlDQW1YMTlvTXlCN1hISmNiaUFnSUNCamIyeHZjam9nUUhCeWFXMWhjbmxmWTI5c2IzSTdYSEpjYmlBZ0lDQm1iMjUwTFhOcGVtVTZJREV1TXpWbGJUdGNjbHh1SUNCOVhISmNibHh5WEc0Z0lDWmZYMmcwSUh0Y2NseHVJQ0FnSUdadmJuUXRjMmw2WlRvZ01TNHhaVzA3WEhKY2JpQWdJQ0JqYjJ4dmNqb2dRSFJvYVhKa1gzUmxlSFJmWTI5c2IzSTdYSEpjYmlBZ2ZWeHlYRzVjY2x4dUlDQW1YMTlvTlNCN1hISmNiaUFnSUNCbWIyNTBMWE5wZW1VNklERmxiVHRjY2x4dUlDQWdJR052Ykc5eU9pQkFabTkxY25Sb1gzUmxlSFJmWTI5c2IzSTdYSEpjYmlBZ2ZWeHlYRzVjY2x4dUlDQW1YMTlrYkN4Y2NseHVJQ0FtWDE5a2RDeGNjbHh1SUNBbVgxOWtaQ0I3WEhKY2JpQWdJQ0J0WVhKbmFXNDZJREE3WEhKY2JpQWdJQ0J3WVdSa2FXNW5PaUF3TzF4eVhHNGdJQ0FnYjNabGNtWnNiM2M2SUdocFpHUmxianRjY2x4dUlDQjlYSEpjYmx4eVhHNGdJQ1pmWDJSc0lIdGNjbHh1SUNBZ0lIQnZjMmwwYVc5dU9pQnlaV3hoZEdsMlpUdGNjbHh1SUNBZ0lIb3RhVzVrWlhnNklERTdYSEpjYmlBZ2ZWeHlYRzVjY2x4dUlDQW1YMTlrZENCN1hISmNiaUFnSUNCa2FYTndiR0Y1T2lCcGJteHBibVV0WW14dlkyczdYSEpjYmlBZ2ZWeHlYRzVjY2x4dUlDQW1YMTlrWkNCN1hISmNiaUFnSUNCa2FYTndiR0Y1T2lCcGJteHBibVV0WW14dlkyczdYSEpjYmlBZ0lDQmpiMnh2Y2pvZ1FITjFZMk5sYzNOZlkyOXNiM0k3WEhKY2JpQWdmVnh5WEc1Y2NseHVJQ0FtWDE5d2NtVWdlMXh5WEc0Z0lDQWdiV0Z5WjJsdU9pQXlaVzBnTUR0Y2NseHVJQ0FnSUhCaFpHUnBibWM2SURGbGJUdGNjbHh1SUNBZ0lHWnZiblF0YzJsNlpUb2dNVFJ3ZUR0Y2NseHVJQ0FnSUd4cGJtVXRhR1ZwWjJoME9pQXhOVEFsTzF4eVhHNGdJQ0FnZEdWNGRDMWhiR2xuYmpvZ2JHVm1kRHRjY2x4dUlDQWdJR0poWTJ0bmNtOTFibVF0WTI5c2IzSTZJRUJpWjE5amIyeHZjanRjY2x4dUlDQWdJR0p2Y21SbGNqb2dNWEI0SUhOdmJHbGtJRUJpYjNKa1pYSmZZMjlzYjNJN1hISmNiaUFnSUNCaWIzSmtaWEl0Y21Ga2FYVnpPaUEwY0hnN1hISmNiaUFnSUNCamIyeHZjam9nUUhSb2FYSmtYM1JsZUhSZlkyOXNiM0k3WEhKY2JpQWdJQ0J2ZG1WeVpteHZkem9nWVhWMGJ6dGNjbHh1SUNCOVhISmNibHh5WEc0Z0lDWmZYMk52WkdVZ2UxeHlYRzRnSUNBZ1pHbHpjR3hoZVRvZ1lteHZZMnM3WEhKY2JpQWdJQ0J0WVhKbmFXNDZJREFnWVhWMGJ6dGNjbHh1SUNBZ0lHOTJaWEptYkc5M09pQm9hV1JrWlc0N1hISmNiaUFnZlZ4eVhHNWNjbHh1SUNBbVgxOW1iMjkwWlhJZ2UxeHlYRzRnSUNBZ1ltOXlaR1Z5TFhSdmNEb2dNWEI0SUhOdmJHbGtJRUJpYjNKa1pYSmZZMjlzYjNJN1hISmNiaUFnSUNCdFlYSm5hVzR0ZEc5d09pQXpaVzA3WEhKY2JpQWdJQ0JpWVdOclozSnZkVzVrTFdOdmJHOXlPaUJBWW1kZlkyOXNiM0k3WEhKY2JpQWdJQ0JqYjJ4dmNqb2dRR1p2ZFhKMGFGOTBaWGgwWDJOdmJHOXlPMXh5WEc0Z0lIMWNjbHh1WEhKY2JpQWdKbDlmZEdGaWJHVWdlMXh5WEc0Z0lDQWdiV0Z5WjJsdU9pQXhaVzBnWVhWMGJ6dGNjbHh1SUNBZ0lIZHBaSFJvT2lBeE1EQWxPMXh5WEc0Z0lDQWdZbTl5WkdWeUxYUnZjRG9nTVhCNElITnZiR2xrSUVCaWIzSmtaWEpmWTI5c2IzSTdYSEpjYmlBZ2ZWeHlYRzVjY2x4dUlDQW1YMTkwYUN4Y2NseHVJQ0FtWDE5MFpDQjdYSEpjYmlBZ0lDQndZV1JrYVc1bk9pQTFjSGdnTVRad2VEdGNjbHh1SUNBZ0lHeHBibVV0YUdWcFoyaDBPaUF5Tm5CNE8xeHlYRzRnSUNBZ1ltOXlaR1Z5TFdKdmRIUnZiVG9nTVhCNElITnZiR2xrSUVCaWIzSmtaWEpmWTI5c2IzSTdYSEpjYmlBZ2ZWeHlYRzVjY2x4dUlDQW1YMTkwYUNCN1hISmNiaUFnSUNCMFpYaDBMV0ZzYVdkdU9pQmpaVzUwWlhJN1hISmNiaUFnSUNCaVlXTnJaM0p2ZFc1a0xXTnZiRzl5T2lCQVltZGZZMjlzYjNJN1hISmNiaUFnZlZ4eVhHNTlYSEpjYmx4eVhHNUFiV1ZrYVdFZ0tHMWhlQzEzYVdSMGFEb2dOVEF3Y0hncElIdGNjbHh1SUNBdWMyVmpkR2x2YmlCN1hISmNiaUFnSUNBbVgxOW9aV0ZrWlhJc1hISmNiaUFnSUNBbVgxOWpiMjUwWlc1MElIdGNjbHh1SUNBZ0lDQWdjR0ZrWkdsdVp6b2dNQ0F4WlcwN1hISmNiaUFnSUNCOVhISmNiaUFnZlZ4eVhHNTlYSEpjYmlJc0lrQnBiWEJ2Y25RZ0p5NHZZMjlzYjNKekp6dGNjbHh1WEhKY2JpNWpZWE5sSUh0Y2NseHVJQ0J3YjNOcGRHbHZiam9nY21Wc1lYUnBkbVU3WEhKY2JpQWdlaTFwYm1SbGVEb2dNVHRjY2x4dUlDQmthWE53YkdGNU9pQm5jbWxrTzF4eVhHNGdJR2R5YVdRdGRHVnRjR3hoZEdVdFkyOXNkVzF1Y3pvZ2NtVndaV0YwS0RJc0lERm1jaWs3WEhKY2JpQWdaMkZ3T2lBME1IQjRPMXh5WEc0Z0lIQmhaR1JwYm1jNklERmxiVHRjY2x4dUlDQmliM0prWlhJdGRHOXdPaUF4Y0hnZ2MyOXNhV1FnUUdKdmNtUmxjbDlqYjJ4dmNqdGNjbHh1SUNCaWIzSmtaWEl0WW05MGRHOXRPaUF4Y0hnZ2MyOXNhV1FnUUdKdmNtUmxjbDlqYjJ4dmNqdGNjbHh1SUNCdmRtVnlabXh2ZHpvZ2FHbGtaR1Z1TzF4eVhHNWNjbHh1SUNBbU9tRm1kR1Z5SUh0Y2NseHVJQ0FnSUdOdmJuUmxiblE2SUNjbk8xeHlYRzRnSUNBZ2NHOXphWFJwYjI0NklHRmljMjlzZFhSbE8xeHlYRzRnSUNBZ2VpMXBibVJsZURvZ01qdGNjbHh1SUNBZ0lIUnZjRG9nTUR0Y2NseHVJQ0FnSUd4bFpuUTZJRFV3SlR0Y2NseHVJQ0FnSUdobGFXZG9kRG9nTVRBd0pUdGNjbHh1SUNBZ0lIZHBaSFJvT2lBd08xeHlYRzRnSUNBZ1ltOXlaR1Z5TFd4bFpuUTZJREZ3ZUNCemIyeHBaQ0JBWW05eVpHVnlYMk52Ykc5eU8xeHlYRzRnSUNBZ2IzWmxjbVpzYjNjNklHaHBaR1JsYmp0Y2NseHVJQ0I5WEhKY2JseHlYRzRnSUNaZlgzQnlaU3hjY2x4dUlDQW1YMTkwWlhoMFlYSmxZU0I3WEhKY2JpQWdJQ0JtYjI1MExYTnBlbVU2SURFemNIZzdYSEpjYmlBZ0lDQnNhVzVsTFdobGFXZG9kRG9nTVRVd0pUdGNjbHh1SUNCOVhISmNibHh5WEc0Z0lDWmZYM0J5WlN4Y2NseHVJQ0FtWDE5amIyUmxMRnh5WEc0Z0lDWmZYM1JsZUhSaGNtVmhJSHRjY2x4dUlDQWdJR1p2Ym5RdFptRnRhV3g1T2lBblEyOTFjbWxsY2lCT1pYY25MQ0JEYjI1emIyeGhjeXdnUjJWdmNtZHBZU3dnUVhKcFlXd3NJSE5oYm5NdGMyVnlhV1k3WEhKY2JpQWdmVnh5WEc1Y2NseHVJQ0FtWDE5d2NtVWdlMXh5WEc0Z0lDQWdiV0Z5WjJsdU9pQXdPMXh5WEc0Z0lDQWdjR0ZrWkdsdVp6b2dNV1Z0TzF4eVhHNGdJQ0FnWW1GamEyZHliM1Z1WkMxamIyeHZjam9nUUdKblgyTnZiRzl5TzF4eVhHNGdJQ0FnYUdWcFoyaDBPaUF4TURBbE8xeHlYRzRnSUNBZ1ltOXlaR1Z5TFhKaFpHbDFjem9nTkhCNE8xeHlYRzRnSUNBZ1ltOTRMWE5wZW1sdVp6b2dZbTl5WkdWeUxXSnZlRHRjY2x4dUlDQWdJRzkyWlhKbWJHOTNPaUJoZFhSdk8xeHlYRzRnSUgxY2NseHVYSEpjYmlBZ0psOWZkRzl2YkdKaGNpQjdYSEpjYmlBZ0lDQnRZWEpuYVc0NklEQWdZWFYwYnp0Y2NseHVJQ0FnSUdobGFXZG9kRG9nTXpad2VEdGNjbHh1SUNBZ0lHeHBibVV0YUdWcFoyaDBPaUF6Tm5CNE8xeHlYRzRnSUNBZ1ptOXVkQzF6YVhwbE9pQXhOSEI0TzF4eVhHNGdJQ0FnY0dGa1pHbHVaem9nTUNBeE5uQjRPMXh5WEc0Z0lDQWdkR1Y0ZEMxaGJHbG5iam9nY21sbmFIUTdYSEpjYmlBZ0lDQnZkbVZ5Wm14dmR6b2dhR2xrWkdWdU8xeHlYRzRnSUgxY2NseHVYSEpjYmlBZ0psOWZZV04wYVc5dUxGeHlYRzRnSUNaZlgzSmxiVzkyWlNCN1hISmNiaUFnSUNCamRYSnpiM0k2SUhCdmFXNTBaWEk3WEhKY2JpQWdJQ0JqYjJ4dmNqb2dRSE4xWTJObGMzTmZZMjlzYjNJN1hISmNiaUFnSUNCMWMyVnlMWE5sYkdWamREb2dibTl1WlR0Y2NseHVJQ0I5WEhKY2JseHlYRzRnSUNaZlgyRmpkR2x2YmlCN1hISmNiaUFnSUNCbWIyNTBMWE5wZW1VNklERXpjSGc3WEhKY2JpQWdJQ0J3WVdSa2FXNW5MV3hsWm5RNklERXdjSGc3WEhKY2JseHlYRzRnSUNBZ0pqcG1hWEp6ZEMxamFHbHNaQ0I3WEhKY2JpQWdJQ0FnSUhCaFpHUnBibWN0YkdWbWREb2dNRHRjY2x4dUlDQWdJSDFjY2x4dUlDQjlYSEpjYmx4eVhHNGdJQ1pmWDNKbGJXOTJaU0I3WEhKY2JpQWdJQ0JtYkc5aGREb2djbWxuYUhRN1hISmNiaUFnZlZ4eVhHNWNjbHh1SUNBbVgxOWpiMjV6YjJ4bElIdGNjbHh1SUNBZ0lHMWhjbWRwYmpvZ01DQmhkWFJ2TzF4eVhHNGdJQ0FnYUdWcFoyaDBPaUF4T0RCd2VEdGNjbHh1SUNBZ0lHSnZjbVJsY2pvZ01YQjRJSE52Ykdsa0lFQmliM0prWlhKZlkyOXNiM0k3WEhKY2JpQWdJQ0J2ZG1WeVpteHZkem9nYUdsa1pHVnVPMXh5WEc0Z0lIMWNjbHh1WEhKY2JpQWdKbDlmZEdWNGRHRnlaV0VnZTF4eVhHNGdJQ0FnYldGeVoybHVPaUF3SUdGMWRHODdYSEpjYmlBZ0lDQjNhV1IwYURvZ01UQXdKVHRjY2x4dUlDQWdJR2hsYVdkb2REb2dNVEF3SlR0Y2NseHVJQ0FnSUdKdmNtUmxjam9nYm05dVpUdGNjbHh1SUNBZ0lHOTFkR3hwYm1VNklHNXZibVU3WEhKY2JpQWdJQ0J3WVdSa2FXNW5PaUF4WlcwN1hISmNiaUFnSUNCaWIzZ3RjMmw2YVc1bk9pQmliM0prWlhJdFltOTRPMXh5WEc0Z0lDQWdiM1psY21ac2IzYzZJR0YxZEc4N1hISmNiaUFnZlZ4eVhHNWNjbHh1SUNBbVgxOXNhWE4wTEZ4eVhHNGdJQ1pmWDJsMFpXMGdlMXh5WEc0Z0lDQWdiV0Z5WjJsdU9pQXdPMXh5WEc0Z0lDQWdjR0ZrWkdsdVp6b2dNRHRjY2x4dUlDQWdJR3hwYzNRdGMzUjViR1V0ZEhsd1pUb2dibTl1WlR0Y2NseHVJQ0FnSUc5MlpYSm1iRzkzT2lCb2FXUmtaVzQ3WEhKY2JpQWdmVnh5WEc1Y2NseHVJQ0FtWDE5c2FYTjBJSHRjY2x4dUlDQWdJR2hsYVdkb2REb2dNell3Y0hnN1hISmNiaUFnSUNCaWIzSmtaWEl0ZEc5d09pQXhjSGdnYzI5c2FXUWdRR0p2Y21SbGNsOWpiMnh2Y2p0Y2NseHVJQ0FnSUdKdmNtUmxjaTFpYjNSMGIyMDZJREZ3ZUNCemIyeHBaQ0JBWW05eVpHVnlYMk52Ykc5eU8xeHlYRzRnSUNBZ1ptOXVkQzF6YVhwbE9pQXhNM0I0TzF4eVhHNGdJQ0FnYjNabGNtWnNiM2M2SUdGMWRHODdYSEpjYmlBZ2ZWeHlYRzVjY2x4dUlDQW1YMTlwZEdWdElIdGNjbHh1SUNBZ0lHaGxhV2RvZERvZ016WndlRHRjY2x4dUlDQWdJR3hwYm1VdGFHVnBaMmgwT2lBek5uQjRPMXh5WEc0Z0lDQWdZM1Z5YzI5eU9pQndiMmx1ZEdWeU8xeHlYRzRnSUNBZ2NHRmtaR2x1WnpvZ01DQXhObkI0TzF4eVhHNWNjbHh1SUNBZ0lDWTZhRzkyWlhJZ2UxeHlYRzRnSUNBZ0lDQmlZV05yWjNKdmRXNWtMV052Ykc5eU9pQkFhRzkyWlhKZlltZGZZMjlzYjNJN1hISmNiaUFnSUNCOVhISmNiaUFnZlZ4eVhHNTlYSEpjYmlJc0lqcHliMjkwSUh0Y2NseHVJQ0F0TFc5MWRHeHBibVV0ZWtsdVpHVjRPaUF5TURBd08xeHlYRzRnSUMwdGIzVjBiR2x1WlMxemRHbGphM2t0YUdWcFoyaDBPaUF4TURBbE8xeHlYRzRnSUMwdGIzVjBiR2x1WlMxdVlYWnBaMkYwYjNJdGQybGtkR2c2SURFd01DVTdYSEpjYm4xY2NseHVJaXdpTHlvZ1BUMDlQVDA5UFQwOVBTQnBZMjl1TG5Sb1pXMWxJQzBnYzNabklPV2J2dWFnaCtlYWhPYWd0K1c4anlBOVBUMDlQVDA5UFQwOUlDb3ZYSEpjYmk1dmRYUnNhVzVsTFdsamIyNGdlMXh5WEc0Z0lIQnZjMmwwYVc5dU9pQnlaV3hoZEdsMlpUdGNjbHh1SUNCNkxXbHVaR1Y0T2lBeE8xeHlYRzRnSUdScGMzQnNZWGs2SUdsdWJHbHVaUzFpYkc5amF6dGNjbHh1SUNCMlpYSjBhV05oYkMxaGJHbG5iam9nYldsa1pHeGxPMXh5WEc0Z0lIZHBaSFJvT2lBeFpXMDdYSEpjYmlBZ2FHVnBaMmgwT2lBeFpXMDdYSEpjYmlBZ2IzWmxjbVpzYjNjNklHaHBaR1JsYmp0Y2NseHVYSEpjYmlBZ0psOWZjM1puSUh0Y2NseHVJQ0FnSUhCdmMybDBhVzl1T2lCaFluTnZiSFYwWlR0Y2NseHVJQ0FnSUhvdGFXNWtaWGc2SURJN1hISmNiaUFnSUNCMGIzQTZJRFV3SlR0Y2NseHVJQ0FnSUd4bFpuUTZJRFV3SlR0Y2NseHVJQ0FnSUhkcFpIUm9PaUF4WlcwN1hISmNiaUFnSUNCb1pXbG5hSFE2SURGbGJUdGNjbHh1SUNBZ0lHWnBiR3c2SUdOMWNuSmxiblJqYjJ4dmNqdGNjbHh1SUNBZ0lIUnlZVzV6Wm05eWJUb2dkSEpoYm5Oc1lYUmxLQzAxTUNVc0lDMDFNQ1VwTzF4eVhHNGdJQ0FnYjNabGNtWnNiM2M2SUdocFpHUmxianRjY2x4dUlDQjlYSEpjYmx4eVhHNGdJQ1pmYUdsa1pHVnVJSHRjY2x4dUlDQWdJR1JwYzNCc1lYazZJRzV2Ym1VN1hISmNiaUFnZlZ4eVhHNTlYSEpjYmlJc0lrQnBiWEJ2Y25RZ0oyTnZiRzl5Y3ljN1hISmNibHh5WEc0dWIzVjBiR2x1WlMxb1pXRmthVzVuSUh0Y2NseHVJQ0J3YjNOcGRHbHZiam9nY21Wc1lYUnBkbVU3WEhKY2JpQWdlaTFwYm1SbGVEb2dNVHRjY2x4dUlDQnZkbVZ5Wm14dmR6b2dhR2xrWkdWdU8xeHlYRzVjY2x4dUlDQW1YMTloYm1Ob2IzSWdlMXh5WEc0Z0lDQWdaR2x6Y0d4aGVUb2dibTl1WlR0Y2NseHVYSEpjYmlBZ0lDQW1PbXhwYm1zc1hISmNiaUFnSUNBbU9uWnBjMmwwWldRc1hISmNiaUFnSUNBbU9taHZkbVZ5SUh0Y2NseHVJQ0FnSUNBZ1kyOXNiM0k2SUVCbWIzVnlkR2hmZEdWNGRGOWpiMnh2Y2p0Y2NseHVJQ0FnSUNBZ2RHVjRkQzFrWldOdmNtRjBhVzl1T2lCdWIyNWxPMXh5WEc0Z0lDQWdmVnh5WEc1Y2NseHVJQ0FnSUNZNmFHOTJaWElnZTF4eVhHNGdJQ0FnSUNCamIyeHZjam9nUUhCeWFXMWhjbmxmWTI5c2IzSTdYSEpjYmlBZ0lDQjlYSEpjYmlBZ2ZWeHlYRzVjY2x4dUlDQW1PbWh2ZG1WeUlIdGNjbHh1SUNBZ0lDNXZkWFJzYVc1bExXaGxZV1JwYm1kZlgyRnVZMmh2Y2lCN1hISmNiaUFnSUNBZ0lHUnBjM0JzWVhrNklHbHViR2x1WlMxaWJHOWphenRjY2x4dUlDQWdJSDFjY2x4dUlDQjlYSEpjYmx4eVhHNGdJQ1pmYzNSaGNuUWdlMXh5WEc0Z0lDQWdKanBvYjNabGNpQjdYSEpjYmlBZ0lDQWdJRzkyWlhKbWJHOTNPaUIyYVhOcFlteGxPMXh5WEc0Z0lDQWdmVnh5WEc1Y2NseHVJQ0FnSUM1dmRYUnNhVzVsTFdobFlXUnBibWRmWDJGdVkyaHZjaUI3WEhKY2JpQWdJQ0FnSUhCdmMybDBhVzl1T2lCaFluTnZiSFYwWlR0Y2NseHVJQ0FnSUNBZ2VpMXBibVJsZURvZ01qdGNjbHh1SUNBZ0lDQWdkRzl3T2lBMU1DVTdYSEpjYmlBZ0lDQWdJSFJ5WVc1elptOXliVG9nZEhKaGJuTnNZWFJsV1NndE5UQWxLVHRjY2x4dUlDQWdJQ0FnYkdWbWREb2dMVEZsYlR0Y2NseHVJQ0FnSUgxY2NseHVJQ0I5WEhKY2JuMWNjbHh1SWl3aVFHbHRjRzl5ZENBbkxpOTJZWEpwWVdKc1pYTW5PMXh5WEc1QWFXMXdiM0owSUNjdUwyTnZiRzl5Y3ljN1hISmNia0JwYlhCdmNuUWdKeTR2YzJoaFpHOTNKenRjY2x4dVhISmNiaTV2ZFhSc2FXNWxMV1J5WVhkbGNpQjdYSEpjYmlBZ2NHOXphWFJwYjI0NklISmxiR0YwYVhabE8xeHlYRzRnSUhvdGFXNWtaWGc2SUMweE8xeHlYRzRnSUhSdmNEb2dNRHRjY2x4dUlDQnNaV1owT2lBd08xeHlYRzRnSUcxaGNtZHBiam9nTUR0Y2NseHVJQ0IzYVdSMGFEb2dNVEF3SlR0Y2NseHVJQ0JvWldsbmFIUTZJREV3TUNVN1hISmNiaUFnWW05NExYTnBlbWx1WnpvZ1ltOXlaR1Z5TFdKdmVEdGNjbHh1SUNCMmFYTnBZbWxzYVhSNU9pQm9hV1JrWlc0N1hISmNiaUFnYjNabGNtWnNiM2M2SUdocFpHUmxianRjY2x4dVhISmNiaUFnSmw5ZmJXOWtZV3dnZTF4eVhHNGdJQ0FnTG5Ob1lXUnZkMTlzYVdkb2RGOXlaV2QxYkdGeUtDazdYSEpjYmlBZ0lDQmthWE53YkdGNU9pQm1iR1Y0TzF4eVhHNGdJQ0FnWm14bGVDMWthWEpsWTNScGIyNDZJR052YkhWdGJqdGNjbHh1SUNBZ0lHWnNaWGd0ZDNKaGNEb2dibTkzY21Gd08xeHlYRzRnSUNBZ2NHOXphWFJwYjI0NklHRmljMjlzZFhSbE8xeHlYRzRnSUNBZ2VpMXBibVJsZURvZ01qRTdYSEpjYmlBZ0lDQm9aV2xuYUhRNklERXdNQ1U3WEhKY2JpQWdJQ0JpWVdOclozSnZkVzVrTFdOdmJHOXlPaUJBZDJocGRHVTdYSEpjYmlBZ0lDQjBjbUZ1YzJsMGFXOXVMV1IxY21GMGFXOXVPaUF3TGpSek8xeHlYRzRnSUNBZ2IzWmxjbVpzYjNjNklHaHBaR1JsYmp0Y2NseHVJQ0I5WEhKY2JseHlYRzRnSUNaZlgyaGxZV1JsY2l4Y2NseHVJQ0FtWDE5dFlXbHVMRnh5WEc0Z0lDWmZYMlp2YjNSbGNpQjdYSEpjYmlBZ0lDQjNhV1IwYURvZ01UQXdKVHRjY2x4dUlDQWdJR0p2ZUMxemFYcHBibWM2SUdKdmNtUmxjaTFpYjNnN1hISmNiaUFnZlZ4eVhHNWNjbHh1SUNBbVgxOW9aV0ZrWlhJc1hISmNiaUFnSmw5ZlptOXZkR1Z5SUh0Y2NseHVJQ0FnSUdac1pYZ3RjMmh5YVc1ck9pQXdPMXh5WEc0Z0lIMWNjbHh1WEhKY2JpQWdKbDlmZEdsMGJHVXNYSEpjYmlBZ0psOWZiV0ZwYml4Y2NseHVJQ0FtWDE5bWIyOTBaWElnZTF4eVhHNGdJQ0FnY0dGa1pHbHVaem9nTUNBeE5uQjRPMXh5WEc0Z0lIMWNjbHh1WEhKY2JpQWdKbDlmYUdWaFpHVnlMRnh5WEc0Z0lDWmZYM1JwZEd4bElIdGNjbHh1SUNBZ0lIQnZjMmwwYVc5dU9pQnlaV3hoZEdsMlpUdGNjbHh1SUNBZ0lIb3RhVzVrWlhnNklERTdYSEpjYmlBZ0lDQnRZWEpuYVc0NklEQWdZWFYwYnp0Y2NseHVJQ0FnSUdobGFXZG9kRG9nTlRKd2VEdGNjbHh1SUNBZ0lHeHBibVV0YUdWcFoyaDBPaUExTW5CNE8xeHlYRzRnSUNBZ2IzWmxjbVpzYjNjNklHaHBaR1JsYmp0Y2NseHVJQ0I5WEhKY2JseHlYRzRnSUNaZlgzUnBkR3hsSUh0Y2NseHVJQ0FnSUdadmJuUXRjMmw2WlRvZ01UWndlRHRjY2x4dUlDQWdJR1p2Ym5RdGQyVnBaMmgwT2lBME1EQTdYSEpjYmlBZ0lDQnRZWEpuYVc0NklEQWdNVFp3ZUR0Y2NseHVJQ0FnSUdKdmVDMXphWHBwYm1jNklHSnZjbVJsY2kxaWIzZzdYSEpjYmlBZ0lDQmliM0prWlhJdFltOTBkRzl0T2lBeGNIZ2djMjlzYVdRZ1FIQnlhVzFoY25sZlltOXlaR1Z5WDJOdmJHOXlPMXh5WEc0Z0lIMWNjbHh1WEhKY2JpQWdKbDlmWTJ4dmMyVWdlMXh5WEc0Z0lDQWdjRzl6YVhScGIyNDZJR0ZpYzI5c2RYUmxPMXh5WEc0Z0lDQWdlaTFwYm1SbGVEb2dNanRjY2x4dUlDQWdJSFJ2Y0RvZ05UQWxPMXh5WEc0Z0lDQWdjbWxuYUhRNklERXljSGc3WEhKY2JpQWdJQ0IzYVdSMGFEb2dNakJ3ZUR0Y2NseHVJQ0FnSUdobGFXZG9kRG9nTWpCd2VEdGNjbHh1SUNBZ0lHeHBibVV0YUdWcFoyaDBPaUF5TUhCNE8xeHlYRzRnSUNBZ1kyOXNiM0k2SUVCbWIzVnlkR2hmZEdWNGRGOWpiMnh2Y2p0Y2NseHVJQ0FnSUdadmJuUXRjMmw2WlRvZ01qQndlRHRjY2x4dUlDQWdJSFJsZUhRdFlXeHBaMjQ2SUdObGJuUmxjanRjY2x4dUlDQWdJR04xY25OdmNqb2djRzlwYm5SbGNqdGNjbHh1SUNBZ0lIUnlZVzV6Wm05eWJUb2dkSEpoYm5Oc1lYUmxXU2d0TlRBbEtUdGNjbHh1SUNBZ0lHOTJaWEptYkc5M09pQm9hV1JrWlc0N1hISmNibHh5WEc0Z0lDQWdMbTkxZEd4cGJtVXRhV052YmlCN1hISmNiaUFnSUNBZ0lIQnZjMmwwYVc5dU9pQmhZbk52YkhWMFpUdGNjbHh1SUNBZ0lDQWdlaTFwYm1SbGVEb2dNanRjY2x4dUlDQWdJQ0FnZEc5d09pQXdPMXh5WEc0Z0lDQWdJQ0JzWldaME9pQXdPMXh5WEc0Z0lDQWdmVnh5WEc1Y2NseHVJQ0FnSUNZNmFHOTJaWElnZTF4eVhHNGdJQ0FnSUNCamIyeHZjam9nUUhSb2FYSmtYM1JsZUhSZlkyOXNiM0k3WEhKY2JpQWdJQ0I5WEhKY2JpQWdmVnh5WEc1Y2NseHVJQ0FtWDE5dFlXbHVJSHRjY2x4dUlDQWdJR1pzWlhnNklERTdYSEpjYmlBZ0lDQnZkbVZ5Wm14dmR6b2dZWFYwYnp0Y2NseHVYSEpjYmlBZ0lDQW1MbTkyWlhKbWJHOTNMV2hwWkdSbGJpQjdYSEpjYmlBZ0lDQWdJRzkyWlhKbWJHOTNPaUJvYVdSa1pXNDdYSEpjYmlBZ0lDQjlYSEpjYmlBZ2ZWeHlYRzVjY2x4dUlDQW1YMTltYjI5MFpYSWdlMXh5WEc0Z0lDQWdiV0Z5WjJsdU9pQXdJR0YxZEc4N1hISmNiaUFnSUNCMFpYaDBMV0ZzYVdkdU9pQnlhV2RvZER0Y2NseHVJQ0FnSUc5MlpYSm1iRzkzT2lCb2FXUmtaVzQ3WEhKY2JpQWdmVnh5WEc1Y2NseHVJQ0FtWDE5dmRtVnliR0Y1SUh0Y2NseHVJQ0FnSUdOdmJuUmxiblE2SUNjbk8xeHlYRzRnSUNBZ2NHOXphWFJwYjI0NklISmxiR0YwYVhabE8xeHlYRzRnSUNBZ2VpMXBibVJsZURvZ01UdGNjbHh1SUNBZ0lIUnZjRG9nTUR0Y2NseHVJQ0FnSUd4bFpuUTZJREE3WEhKY2JpQWdJQ0IzYVdSMGFEb2dNVEF3SlR0Y2NseHVJQ0FnSUdobGFXZG9kRG9nTVRBd0pUdGNjbHh1SUNBZ0lHSmhZMnRuY205MWJtUXRZMjlzYjNJNklFQjNhR2wwWlR0Y2NseHVJQ0FnSUc5d1lXTnBkSGs2SURBdU1UdGNjbHh1SUNBZ0lHOTJaWEptYkc5M09pQm9hV1JrWlc0N1hISmNiaUFnZlZ4eVhHNWNjbHh1SUNBbVgzSjBiQ3hjY2x4dUlDQW1YMngwY2lCN1hISmNiaUFnSUNBbUxtOTFkR3hwYm1VdFpISmhkMlZ5SUh0Y2NseHVJQ0FnSUNBZ0psOTBhVzU1SUh0Y2NseHVJQ0FnSUNBZ0lDQjNhV1IwYURvZ01qZ3djSGc3WEhKY2JpQWdJQ0FnSUgxY2NseHVYSEpjYmlBZ0lDQWdJQ1pmYldsdWFTQjdYSEpjYmlBZ0lDQWdJQ0FnZDJsa2RHZzZJRFE0TUhCNE8xeHlYRzRnSUNBZ0lDQjlYSEpjYmx4eVhHNGdJQ0FnSUNBbVgzTnRZV3hzSUh0Y2NseHVJQ0FnSUNBZ0lDQjNhV1IwYURvZ05UUXdjSGc3WEhKY2JpQWdJQ0FnSUgxY2NseHVYSEpjYmlBZ0lDQWdJQ1pmY21WbmRXeGhjaUI3WEhKY2JpQWdJQ0FnSUNBZ2QybGtkR2c2SURZNE1IQjRPMXh5WEc0Z0lDQWdJQ0I5WEhKY2JseHlYRzRnSUNBZ0lDQW1YMjFsWkdsMWJTQjdYSEpjYmlBZ0lDQWdJQ0FnZDJsa2RHZzZJRGN5TUhCNE8xeHlYRzRnSUNBZ0lDQjlYSEpjYmx4eVhHNGdJQ0FnSUNBbVgyeGhjbWRsSUh0Y2NseHVJQ0FnSUNBZ0lDQjNhV1IwYURvZ09UWXdjSGc3WEhKY2JpQWdJQ0FnSUgxY2NseHVJQ0FnSUgxY2NseHVJQ0I5WEhKY2JseHlYRzRnSUNaZmNuUnNJSHRjY2x4dUlDQWdJR0p2Y21SbGNpMXNaV1owT2lBeGNIZ2djMjlzYVdRZ1FIQnlhVzFoY25sZlltOXlaR1Z5WDJOdmJHOXlPMXh5WEc1Y2NseHVJQ0FnSUNZdWIzVjBiR2x1WlMxa2NtRjNaWElnZTF4eVhHNGdJQ0FnSUNBbVgzUnBibmtnZTF4eVhHNGdJQ0FnSUNBZ0lDWXViM1YwYkdsdVpTMWtjbUYzWlhKZlkyeHZjMlZrSUh0Y2NseHVJQ0FnSUNBZ0lDQWdJSEpwWjJoME9pQXRNamt3Y0hnN1hISmNiaUFnSUNBZ0lDQWdmVnh5WEc0Z0lDQWdJQ0I5WEhKY2JseHlYRzRnSUNBZ0lDQW1YMjFwYm1rZ2UxeHlYRzRnSUNBZ0lDQWdJQ1l1YjNWMGJHbHVaUzFrY21GM1pYSmZZMnh2YzJWa0lIdGNjbHh1SUNBZ0lDQWdJQ0FnSUhKcFoyaDBPaUF0TkRrd2NIZzdYSEpjYmlBZ0lDQWdJQ0FnZlZ4eVhHNGdJQ0FnSUNCOVhISmNibHh5WEc0Z0lDQWdJQ0FtWDNOdFlXeHNJSHRjY2x4dUlDQWdJQ0FnSUNBbUxtOTFkR3hwYm1VdFpISmhkMlZ5WDJOc2IzTmxaQ0I3WEhKY2JpQWdJQ0FnSUNBZ0lDQnlhV2RvZERvZ0xUVTFNSEI0TzF4eVhHNGdJQ0FnSUNBZ0lIMWNjbHh1SUNBZ0lDQWdmVnh5WEc1Y2NseHVJQ0FnSUNBZ0psOXlaV2QxYkdGeUlIdGNjbHh1SUNBZ0lDQWdJQ0FtTG05MWRHeHBibVV0WkhKaGQyVnlYMk5zYjNObFpDQjdYSEpjYmlBZ0lDQWdJQ0FnSUNCeWFXZG9kRG9nTFRZNU1IQjRPMXh5WEc0Z0lDQWdJQ0FnSUgxY2NseHVJQ0FnSUNBZ2ZWeHlYRzVjY2x4dUlDQWdJQ0FnSmw5dFpXUnBkVzBnZTF4eVhHNGdJQ0FnSUNBZ0lDWXViM1YwYkdsdVpTMWtjbUYzWlhKZlkyeHZjMlZrSUh0Y2NseHVJQ0FnSUNBZ0lDQWdJSEpwWjJoME9pQXROek13Y0hnN1hISmNiaUFnSUNBZ0lDQWdmVnh5WEc0Z0lDQWdJQ0I5WEhKY2JseHlYRzRnSUNBZ0lDQW1YMnhoY21kbElIdGNjbHh1SUNBZ0lDQWdJQ0FtTG05MWRHeHBibVV0WkhKaGQyVnlYMk5zYjNObFpDQjdYSEpjYmlBZ0lDQWdJQ0FnSUNCeWFXZG9kRG9nTFRrM01IQjRPMXh5WEc0Z0lDQWdJQ0FnSUgxY2NseHVJQ0FnSUNBZ2ZWeHlYRzRnSUNBZ2ZWeHlYRzRnSUgxY2NseHVYSEpjYmlBZ0psOXNkSElnZTF4eVhHNGdJQ0FnWW05eVpHVnlMWEpwWjJoME9pQXhjSGdnYzI5c2FXUWdRSEJ5YVcxaGNubGZZbTl5WkdWeVgyTnZiRzl5TzF4eVhHNWNjbHh1SUNBZ0lDWXViM1YwYkdsdVpTMWtjbUYzWlhJZ2UxeHlYRzRnSUNBZ0lDQW1YM1JwYm5rZ2UxeHlYRzRnSUNBZ0lDQWdJQ1l1YjNWMGJHbHVaUzFrY21GM1pYSmZZMnh2YzJWa0lIdGNjbHh1SUNBZ0lDQWdJQ0FnSUd4bFpuUTZJQzB5T1RCd2VEdGNjbHh1SUNBZ0lDQWdJQ0I5WEhKY2JpQWdJQ0FnSUgxY2NseHVYSEpjYmlBZ0lDQWdJQ1pmYldsdWFTQjdYSEpjYmlBZ0lDQWdJQ0FnSmk1dmRYUnNhVzVsTFdSeVlYZGxjbDlqYkc5elpXUWdlMXh5WEc0Z0lDQWdJQ0FnSUNBZ2JHVm1kRG9nTFRRNU1IQjRPMXh5WEc0Z0lDQWdJQ0FnSUgxY2NseHVJQ0FnSUNBZ2ZWeHlYRzVjY2x4dUlDQWdJQ0FnSmw5emJXRnNiQ0I3WEhKY2JpQWdJQ0FnSUNBZ0ppNXZkWFJzYVc1bExXUnlZWGRsY2w5amJHOXpaV1FnZTF4eVhHNGdJQ0FnSUNBZ0lDQWdiR1ZtZERvZ0xUVTFNSEI0TzF4eVhHNGdJQ0FnSUNBZ0lIMWNjbHh1SUNBZ0lDQWdmVnh5WEc1Y2NseHVJQ0FnSUNBZ0psOXlaV2QxYkdGeUlIdGNjbHh1SUNBZ0lDQWdJQ0FtTG05MWRHeHBibVV0WkhKaGQyVnlYMk5zYjNObFpDQjdYSEpjYmlBZ0lDQWdJQ0FnSUNCc1pXWjBPaUF0Tmprd2NIZzdYSEpjYmlBZ0lDQWdJQ0FnZlZ4eVhHNGdJQ0FnSUNCOVhISmNibHh5WEc0Z0lDQWdJQ0FtWDIxbFpHbDFiU0I3WEhKY2JpQWdJQ0FnSUNBZ0ppNXZkWFJzYVc1bExXUnlZWGRsY2w5amJHOXpaV1FnZTF4eVhHNGdJQ0FnSUNBZ0lDQWdiR1ZtZERvZ0xUY3pNSEI0TzF4eVhHNGdJQ0FnSUNBZ0lIMWNjbHh1SUNBZ0lDQWdmVnh5WEc1Y2NseHVJQ0FnSUNBZ0psOXNZWEpuWlNCN1hISmNiaUFnSUNBZ0lDQWdKaTV2ZFhSc2FXNWxMV1J5WVhkbGNsOWpiRzl6WldRZ2UxeHlYRzRnSUNBZ0lDQWdJQ0FnYkdWbWREb2dMVGszTUhCNE8xeHlYRzRnSUNBZ0lDQWdJSDFjY2x4dUlDQWdJQ0FnZlZ4eVhHNGdJQ0FnZlZ4eVhHNGdJSDFjY2x4dVhISmNiaUFnSmw5MGRHSXNYSEpjYmlBZ0psOWlkSFFnZTF4eVhHNGdJQ0FnYkdWbWREb2dNRHRjY2x4dUlDQWdJSGRwWkhSb09pQXhNREFsTzF4eVhHNWNjbHh1SUNBZ0lDWXViM1YwYkdsdVpTMWtjbUYzWlhJZ2UxeHlYRzRnSUNBZ0lDQW1YM1JwYm5rZ2UxeHlYRzRnSUNBZ0lDQWdJR2hsYVdkb2REb2dNalF3Y0hnN1hISmNiaUFnSUNBZ0lIMWNjbHh1WEhKY2JpQWdJQ0FnSUNaZmJXbHVhU0I3WEhKY2JpQWdJQ0FnSUNBZ2FHVnBaMmgwT2lBek1qQndlRHRjY2x4dUlDQWdJQ0FnZlZ4eVhHNWNjbHh1SUNBZ0lDQWdKbDl6YldGc2JDQjdYSEpjYmlBZ0lDQWdJQ0FnYUdWcFoyaDBPaUF6TmpCd2VEdGNjbHh1SUNBZ0lDQWdmVnh5WEc1Y2NseHVJQ0FnSUNBZ0psOXlaV2QxYkdGeUlIdGNjbHh1SUNBZ0lDQWdJQ0JvWldsbmFIUTZJRFF3TUhCNE8xeHlYRzRnSUNBZ0lDQjlYSEpjYmx4eVhHNGdJQ0FnSUNBbVgyMWxaR2wxYlNCN1hISmNiaUFnSUNBZ0lDQWdhR1ZwWjJoME9pQTBOREJ3ZUR0Y2NseHVJQ0FnSUNBZ2ZWeHlYRzVjY2x4dUlDQWdJQ0FnSmw5c1lYSm5aU0I3WEhKY2JpQWdJQ0FnSUNBZ2FHVnBaMmgwT2lBME9EQndlRHRjY2x4dUlDQWdJQ0FnZlZ4eVhHNGdJQ0FnZlZ4eVhHNGdJSDFjY2x4dVhISmNiaUFnSmw5MGRHSWdlMXh5WEc0Z0lDQWdZbTl5WkdWeUxXSnZkSFJ2YlRvZ01YQjRJSE52Ykdsa0lFQndjbWx0WVhKNVgySnZjbVJsY2w5amIyeHZjanRjY2x4dVhISmNiaUFnSUNBbUxtOTFkR3hwYm1VdFpISmhkMlZ5SUh0Y2NseHVJQ0FnSUNBZ0psOTBhVzU1SUh0Y2NseHVJQ0FnSUNBZ0lDQW1MbTkxZEd4cGJtVXRaSEpoZDJWeVgyTnNiM05sWkNCN1hISmNiaUFnSUNBZ0lDQWdJQ0IwYjNBNklDMHlOVEJ3ZUR0Y2NseHVJQ0FnSUNBZ0lDQjlYSEpjYmlBZ0lDQWdJSDFjY2x4dVhISmNiaUFnSUNBZ0lDWmZiV2x1YVNCN1hISmNiaUFnSUNBZ0lDQWdKaTV2ZFhSc2FXNWxMV1J5WVhkbGNsOWpiRzl6WldRZ2UxeHlYRzRnSUNBZ0lDQWdJQ0FnZEc5d09pQXRNek13Y0hnN1hISmNiaUFnSUNBZ0lDQWdmVnh5WEc0Z0lDQWdJQ0I5WEhKY2JseHlYRzRnSUNBZ0lDQW1YM050WVd4c0lIdGNjbHh1SUNBZ0lDQWdJQ0FtTG05MWRHeHBibVV0WkhKaGQyVnlYMk5zYjNObFpDQjdYSEpjYmlBZ0lDQWdJQ0FnSUNCMGIzQTZJQzB6TnpCd2VEdGNjbHh1SUNBZ0lDQWdJQ0I5WEhKY2JpQWdJQ0FnSUgxY2NseHVYSEpjYmlBZ0lDQWdJQ1pmY21WbmRXeGhjaUI3WEhKY2JpQWdJQ0FnSUNBZ0ppNXZkWFJzYVc1bExXUnlZWGRsY2w5amJHOXpaV1FnZTF4eVhHNGdJQ0FnSUNBZ0lDQWdkRzl3T2lBdE5ERXdjSGc3WEhKY2JpQWdJQ0FnSUNBZ2ZWeHlYRzRnSUNBZ0lDQjlYSEpjYmx4eVhHNGdJQ0FnSUNBbVgyMWxaR2wxYlNCN1hISmNiaUFnSUNBZ0lDQWdKaTV2ZFhSc2FXNWxMV1J5WVhkbGNsOWpiRzl6WldRZ2UxeHlYRzRnSUNBZ0lDQWdJQ0FnZEc5d09pQXRORFV3Y0hnN1hISmNiaUFnSUNBZ0lDQWdmVnh5WEc0Z0lDQWdJQ0I5WEhKY2JseHlYRzRnSUNBZ0lDQW1YMnhoY21kbElIdGNjbHh1SUNBZ0lDQWdJQ0FtTG05MWRHeHBibVV0WkhKaGQyVnlYMk5zYjNObFpDQjdYSEpjYmlBZ0lDQWdJQ0FnSUNCMGIzQTZJQzAwT1RCd2VEdGNjbHh1SUNBZ0lDQWdJQ0I5WEhKY2JpQWdJQ0FnSUgxY2NseHVJQ0FnSUgxY2NseHVJQ0I5WEhKY2JseHlYRzRnSUNaZlluUjBJSHRjY2x4dUlDQWdJSFJ2Y0RvZ2FXNXBkR2xoYkR0Y2NseHVJQ0FnSUdKdmNtUmxjaTEwYjNBNklERndlQ0J6YjJ4cFpDQkFjSEpwYldGeWVWOWliM0prWlhKZlkyOXNiM0k3WEhKY2JseHlYRzRnSUNBZ0ppNXZkWFJzYVc1bExXUnlZWGRsY2lCN1hISmNiaUFnSUNBZ0lDWmZkR2x1ZVNCN1hISmNiaUFnSUNBZ0lDQWdKaTV2ZFhSc2FXNWxMV1J5WVhkbGNsOWpiRzl6WldRZ2UxeHlYRzRnSUNBZ0lDQWdJQ0FnWW05MGRHOXRPaUF0TWpVd2NIZzdYSEpjYmlBZ0lDQWdJQ0FnZlZ4eVhHNGdJQ0FnSUNCOVhISmNibHh5WEc0Z0lDQWdJQ0FtWDIxcGJta2dlMXh5WEc0Z0lDQWdJQ0FnSUNZdWIzVjBiR2x1WlMxa2NtRjNaWEpmWTJ4dmMyVmtJSHRjY2x4dUlDQWdJQ0FnSUNBZ0lHSnZkSFJ2YlRvZ0xUTXpNSEI0TzF4eVhHNGdJQ0FnSUNBZ0lIMWNjbHh1SUNBZ0lDQWdmVnh5WEc1Y2NseHVJQ0FnSUNBZ0psOXpiV0ZzYkNCN1hISmNiaUFnSUNBZ0lDQWdKaTV2ZFhSc2FXNWxMV1J5WVhkbGNsOWpiRzl6WldRZ2UxeHlYRzRnSUNBZ0lDQWdJQ0FnWW05MGRHOXRPaUF0TXpjd2NIZzdYSEpjYmlBZ0lDQWdJQ0FnZlZ4eVhHNGdJQ0FnSUNCOVhISmNibHh5WEc0Z0lDQWdJQ0FtWDNKbFozVnNZWElnZTF4eVhHNGdJQ0FnSUNBZ0lDWXViM1YwYkdsdVpTMWtjbUYzWlhKZlkyeHZjMlZrSUh0Y2NseHVJQ0FnSUNBZ0lDQWdJR0p2ZEhSdmJUb2dMVFF4TUhCNE8xeHlYRzRnSUNBZ0lDQWdJSDFjY2x4dUlDQWdJQ0FnZlZ4eVhHNWNjbHh1SUNBZ0lDQWdKbDl0WldScGRXMGdlMXh5WEc0Z0lDQWdJQ0FnSUNZdWIzVjBiR2x1WlMxa2NtRjNaWEpmWTJ4dmMyVmtJSHRjY2x4dUlDQWdJQ0FnSUNBZ0lHSnZkSFJ2YlRvZ0xUUTFNSEI0TzF4eVhHNGdJQ0FnSUNBZ0lIMWNjbHh1SUNBZ0lDQWdmVnh5WEc1Y2NseHVJQ0FnSUNBZ0psOXNZWEpuWlNCN1hISmNiaUFnSUNBZ0lDQWdKaTV2ZFhSc2FXNWxMV1J5WVhkbGNsOWpiRzl6WldRZ2UxeHlYRzRnSUNBZ0lDQWdJQ0FnWW05MGRHOXRPaUF0TkRrd2NIZzdYSEpjYmlBZ0lDQWdJQ0FnZlZ4eVhHNGdJQ0FnSUNCOVhISmNiaUFnSUNCOVhISmNiaUFnZlZ4eVhHNWNjbHh1SUNBbVgyOXdaVzVsWkNCN1hISmNiaUFnSUNCMmFYTnBZbWxzYVhSNU9pQjJhWE5wWW14bE8xeHlYRzRnSUNBZ2VpMXBibVJsZURvZ2RtRnlLQzB0YjNWMGJHbHVaUzE2U1c1a1pYZ3BPMXh5WEc1Y2NseHVJQ0FnSUNZdWIzVjBiR2x1WlMxa2NtRjNaWElnZTF4eVhHNGdJQ0FnSUNCd2IzTnBkR2x2YmpvZ1ptbDRaV1E3WEhKY2JseHlYRzRnSUNBZ0lDQW1YM0owYkNCN1hISmNiaUFnSUNBZ0lDQWdjbWxuYUhRNklEQTdYSEpjYmlBZ0lDQWdJSDFjY2x4dVhISmNiaUFnSUNBZ0lDWmZiSFJ5SUh0Y2NseHVJQ0FnSUNBZ0lDQnNaV1owT2lBd08xeHlYRzRnSUNBZ0lDQjlYSEpjYmx4eVhHNGdJQ0FnSUNBbVgzUjBZaUI3WEhKY2JpQWdJQ0FnSUNBZ2RHOXdPaUF3TzF4eVhHNGdJQ0FnSUNCOVhISmNibHh5WEc0Z0lDQWdJQ0FtWDJKMGRDQjdYSEpjYmlBZ0lDQWdJQ0FnWW05MGRHOXRPaUF3TzF4eVhHNGdJQ0FnSUNCOVhISmNiaUFnSUNCOVhISmNiaUFnZlZ4eVhHNWNjbHh1SUNBbVgyOW1abk5sZENCN1hISmNiaUFnSUNBbUxtOTFkR3hwYm1VdFpISmhkMlZ5SUh0Y2NseHVJQ0FnSUNBZ0psOXlkR3dzWEhKY2JpQWdJQ0FnSUNaZmJIUnlJSHRjY2x4dUlDQWdJQ0FnSUNCb1pXbG5hSFE2SUdOaGJHTW9NVEF3SlNBdElEUmxiU2s3WEhKY2JpQWdJQ0FnSUNBZ2RHOXdPaUExTUNVN1hISmNiaUFnSUNBZ0lDQWdkSEpoYm5ObWIzSnRPaUIwY21GdWMyeGhkR1ZaS0MwMU1DVXBPMXh5WEc0Z0lDQWdJQ0I5WEhKY2JseHlYRzRnSUNBZ0lDQW1YM1IwWWl4Y2NseHVJQ0FnSUNBZ0psOWlkSFFnZTF4eVhHNGdJQ0FnSUNBZ0lIZHBaSFJvT2lCallXeGpLREV3TUNVZ0xTQTBaVzBwTzF4eVhHNGdJQ0FnSUNBZ0lHeGxablE2SURVd0pUdGNjbHh1SUNBZ0lDQWdJQ0IwY21GdWMyWnZjbTA2SUhSeVlXNXpiR0YwWlZnb0xUVXdKU2s3WEhKY2JpQWdJQ0FnSUgxY2NseHVYSEpjYmlBZ0lDQWdJQ1pmYjNCbGJtVmtJSHRjY2x4dUlDQWdJQ0FnSUNBbUxtOTFkR3hwYm1VdFpISmhkMlZ5SUh0Y2NseHVJQ0FnSUNBZ0lDQWdJQ1pmY25Sc0lIdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ2NtbG5hSFE2SURKbGJUdGNjbHh1SUNBZ0lDQWdJQ0FnSUgxY2NseHVYSEpjYmlBZ0lDQWdJQ0FnSUNBbVgyeDBjaUI3WEhKY2JpQWdJQ0FnSUNBZ0lDQWdJR3hsWm5RNklESmxiVHRjY2x4dUlDQWdJQ0FnSUNBZ0lIMWNjbHh1WEhKY2JpQWdJQ0FnSUNBZ0lDQW1YM1IwWWlCN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUhSdmNEb2dNbVZ0TzF4eVhHNGdJQ0FnSUNBZ0lDQWdmVnh5WEc1Y2NseHVJQ0FnSUNBZ0lDQWdJQ1pmWW5SMElIdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ1ltOTBkRzl0T2lBeVpXMDdYSEpjYmlBZ0lDQWdJQ0FnSUNCOVhISmNiaUFnSUNBZ0lDQWdmVnh5WEc0Z0lDQWdJQ0I5WEhKY2JpQWdJQ0I5WEhKY2JpQWdmVnh5WEc1Y2NseHVJQ0FtWDJGMWRHOGdlMXh5WEc0Z0lDQWdKaTV2ZFhSc2FXNWxMV1J5WVhkbGNpQjdYSEpjYmlBZ0lDQWdJQ1pmY25Sc0xGeHlYRzRnSUNBZ0lDQW1YMngwY2lCN1hISmNiaUFnSUNBZ0lDQWdhR1ZwWjJoME9pQmhkWFJ2TzF4eVhHNGdJQ0FnSUNBZ0lHMWhlQzFvWldsbmFIUTZJR05oYkdNb01UQXdKU0F0SURSbGJTazdYSEpjYmlBZ0lDQWdJSDFjY2x4dUlDQWdJSDFjY2x4dUlDQjlYSEpjYmx4eVhHNGdJQ1pmWm5Wc2JDQjdYSEpjYmlBZ0lDQndZV1JrYVc1bk9pQXdPMXh5WEc0Z0lIMWNjbHh1ZlZ4eVhHNGlMQ0l2S2lwY2NseHVJQ29nYzJoaFpHOTNMbXhsYzNNZ0xTRHBtTFRsdmJIbW9MZmx2SS9vcnI3bnZhNGdiV2w0YVc1NElPV0h2ZWFWc0Z4eVhHNGdLaUE5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlYSEpjYmlBcUlFTnlaV0YwWldRZ1FuazZJRmxoYjJoaGFYaHBZVzljY2x4dUlDb2dWWEJrWVhSbE9pQXlNREl5TGpNdU1qQmNjbHh1SUNvdlhISmNia0JwYlhCdmNuUWdKeTR2WTI5c2IzSnpKenRjY2x4dVhISmNiaThxSUQwOVBUMDlQU0RwbUxUbHZiSG1vTGZsdkkvb3JyN252YTdsaDczbWxiQWdQVDA5UFQwOUlDb3ZYSEpjYmk1emFHRmtiM2NvUUc5bVpuTmxkRG9nTUNBd0lEWndlQ0F4Y0hnc0lFQmpiMnh2Y2pvZ1FIQnlhVzFoY25sZlltOXlaR1Z5WDJOdmJHOXlLU0I3WEhKY2JpQWdZbTk0TFhOb1lXUnZkem9nUUc5bVpuTmxkQ0JBWTI5c2IzSTdYSEpjYm4xY2NseHVYSEpjYmk1emFHRmtiM2RmY21WbmRXeGhjaWhBWTI5c2IzSTZJRUJ3Y21sdFlYSjVYMkp2Y21SbGNsOWpiMnh2Y2lrZ2UxeHlYRzRnSUM1emFHRmtiM2NvTUNBd0lEWndlQ0F4Y0hnc0lFQmpiMnh2Y2lrN1hISmNibjFjY2x4dVhISmNiaTV6YUdGa2IzZGZiR0Z5WjJVb1FHTnZiRzl5T2lCQWNISnBiV0Z5ZVY5aWIzSmtaWEpmWTI5c2IzSXBJSHRjY2x4dUlDQXVjMmhoWkc5M0tEQWdNQ0F4TW5CNElERndlQ3dnUUdOdmJHOXlLVHRjY2x4dWZWeHlYRzVjY2x4dUxuTm9ZV1J2ZDE5c2FXZG9kRjl5WldkMWJHRnlLQ2tnZTF4eVhHNGdJQzV6YUdGa2IzZGZjbVZuZFd4aGNpZ3BPMXh5WEc1OVhISmNibHh5WEc0dWMyaGhaRzkzWDJ4cFoyaDBYMnhoY21kbEtDa2dlMXh5WEc0Z0lDNXphR0ZrYjNkZmJHRnlaMlVvS1R0Y2NseHVmVnh5WEc1Y2NseHVMbk5vWVdSdmQxOWtZWEpyWDNKbFozVnNZWElvS1NCN1hISmNiaUFnTG5Ob1lXUnZkMTl5WldkMWJHRnlLRUJ6WldOdmJtUmhjbmxmWW05eVpHVnlYMk52Ykc5eUtUdGNjbHh1ZlZ4eVhHNWNjbHh1TG5Ob1lXUnZkMTlrWVhKclgyeGhjbWRsS0NrZ2UxeHlYRzRnSUM1emFHRmtiM2RmYkdGeVoyVW9RSE5sWTI5dVpHRnllVjlpYjNKa1pYSmZZMjlzYjNJcE8xeHlYRzU5WEhKY2JpSXNJa0JwYlhCdmNuUWdKeTR2ZG1GeWFXRmliR1Z6Snp0Y2NseHVRR2x0Y0c5eWRDQW5MaTlqYjJ4dmNuTW5PMXh5WEc1QWFXMXdiM0owSUNjdUwyVnNiR2x3YzJsekp6dGNjbHh1WEhKY2JpNXZkWFJzYVc1bExXNWhkbWxuWVhSdmNpQjdYSEpjYmlBZ2NHOXphWFJwYjI0NklISmxiR0YwYVhabE8xeHlYRzRnSUhvdGFXNWtaWGc2SURFN1hISmNiaUFnYldGeVoybHVPaUF3TzF4eVhHNGdJSGRwWkhSb09pQjJZWElvTFMxdmRYUnNhVzVsTFc1aGRtbG5ZWFJ2Y2kxM2FXUjBhQ2s3WEhKY2JpQWdiM1psY21ac2IzYzZJR0YxZEc4N1hISmNibHh5WEc0Z0lDWXRjR0Z5Wlc1MElIdGNjbHh1SUNBZ0lIUnlZVzV6YVhScGIyNDZJREF1TTNNZ1pXRnpaUzFwYmkxdmRYUTdYSEpjYmlBZ2ZWeHlYRzVjY2x4dUlDQW1YMTkwYVhSc1pTQjdYSEpjYmlBZ0lDQnRZWEpuYVc0NklEQWdNVFp3ZUR0Y2NseHVJQ0FnSUdobGFXZG9kRG9nTkRCd2VEdGNjbHh1SUNBZ0lHeHBibVV0YUdWcFoyaDBPaUEwTUhCNE8xeHlYRzRnSUNBZ2NHRmtaR2x1WnpvZ01DQXhObkI0TzF4eVhHNGdJQ0FnWW05eVpHVnlMV0p2ZEhSdmJUb2dNWEI0SUhOdmJHbGtJRUJ3Y21sdFlYSjVYMkp2Y21SbGNsOWpiMnh2Y2p0Y2NseHVJQ0FnSUdadmJuUXRjMmw2WlRvZ01UWndlRHRjY2x4dUlDQWdJR1p2Ym5RdGQyVnBaMmgwT2lBME1EQTdYSEpjYmlBZ0lDQnZkbVZ5Wm14dmR6b2dhR2xrWkdWdU8xeHlYRzRnSUgxY2NseHVYSEpjYmlBZ0psOWZiV0ZwYmlCN1hISmNiaUFnSUNCd2IzTnBkR2x2YmpvZ2NtVnNZWFJwZG1VN1hISmNiaUFnSUNCNkxXbHVaR1Y0T2lBeE8xeHlYRzRnSUNBZ2JXRnlaMmx1T2lBd08xeHlYRzRnSUNBZ2IzWmxjbVpzYjNjNklHaHBaR1JsYmp0Y2NseHVJQ0I5WEhKY2JseHlYRzRnSUNaZlgyeHBjM1FzWEhKY2JpQWdKbDlmYzNWaWFtVmpkQ3hjY2x4dUlDQW1YMTlwZEdWdElIdGNjbHh1SUNBZ0lIQnZjMmwwYVc5dU9pQnlaV3hoZEdsMlpUdGNjbHh1SUNBZ0lIb3RhVzVrWlhnNklESTdYSEpjYmlBZ0lDQnRZWEpuYVc0NklEQTdYSEpjYmlBZ0lDQndZV1JrYVc1bk9pQXdPMXh5WEc0Z0lDQWdiR2x6ZEMxemRIbHNaUzEwZVhCbE9pQnViMjVsTzF4eVhHNGdJQ0FnYjNabGNtWnNiM2M2SUdocFpHUmxianRjY2x4dUlDQjlYSEpjYmx4eVhHNGdJQ1pmWDJ4cGMzUWdlMXh5WEc0Z0lDQWdjR0ZrWkdsdVp6b2dNQzQxWlcwZ01EdGNjbHh1SUNCOVhISmNibHh5WEc0Z0lDWmZYM04xWW1wbFkzUWdlMXh5WEc0Z0lDQWdjR0ZrWkdsdVp5MXNaV1owT2lBeFpXMDdYSEpjYmlBZ2ZWeHlYRzVjY2x4dUlDQW1YMTlwZEdWdElIdGNjbHh1SUNBZ0lHMWhjbWRwYmpvZ01EdGNjbHh1SUNBZ0lHeHBibVV0YUdWcFoyaDBPaUF6TUhCNE8xeHlYRzRnSUNBZ1ptOXVkQzF6YVhwbE9pQXhNM0I0TzF4eVhHNGdJQ0FnYjNabGNtWnNiM2M2SUdocFpHUmxianRjY2x4dUlDQjlYSEpjYmx4eVhHNGdJQ1pmWDNCc1lXTmxhRzlzWkdWeUlIdGNjbHh1SUNBZ0lIQnZjMmwwYVc5dU9pQmhZbk52YkhWMFpUdGNjbHh1SUNBZ0lIb3RhVzVrWlhnNklERTdYSEpjYmlBZ0lDQjBiM0E2SURBN1hISmNiaUFnSUNCc1pXWjBPaUF3TzF4eVhHNGdJQ0FnZDJsa2RHZzZJREV3TUNVN1hISmNiaUFnSUNCb1pXbG5hSFE2SURNd2NIZzdYSEpjYmlBZ0lDQmlZV05yWjNKdmRXNWtMV052Ykc5eU9pQkFhRzkyWlhKZlltZGZZMjlzYjNJN1hISmNiaUFnSUNCaWIzSmtaWEl0YkdWbWREb2dNbkI0SUhOdmJHbGtJRUJ6ZFdOalpYTnpYMk52Ykc5eU8xeHlYRzRnSUNBZ2RISmhibk5wZEdsdmJpMWtkWEpoZEdsdmJqb2dNQzR5Y3p0Y2NseHVJQ0FnSUdKdmVDMXphWHBwYm1jNklHSnZjbVJsY2kxaWIzZzdYSEpjYmlBZ0lDQnZkbVZ5Wm14dmR6b2dhR2xrWkdWdU8xeHlYRzRnSUgxY2NseHVYSEpjYmlBZ0psOWZZVzVqYUc5eUlIdGNjbHh1SUNBZ0lDNWxiR3hwY0hOcGN5Z3hLVHRjY2x4dUlDQWdJR1JwYzNCc1lYazZJR0pzYjJOck8xeHlYRzRnSUNBZ2NHRmtaR2x1WnpvZ01DQXhMalZsYlR0Y2NseHVYSEpjYmlBZ0lDQW1PbXhwYm1zc1hISmNiaUFnSUNBbU9uWnBjMmwwWldRc1hISmNiaUFnSUNBbU9taHZkbVZ5SUh0Y2NseHVJQ0FnSUNBZ2RHVjRkQzFrWldOdmNtRjBhVzl1T2lCdWIyNWxPMXh5WEc0Z0lDQWdJQ0JqYjJ4dmNqb2dRSE5sWTI5dVpHRnllVjkwWlhoMFgyTnZiRzl5TzF4eVhHNGdJQ0FnZlZ4eVhHNWNjbHh1SUNBZ0lDWTZhRzkyWlhJZ2UxeHlYRzRnSUNBZ0lDQmpiMnh2Y2pvZ1FITjFZMk5sYzNOZlkyOXNiM0k3WEhKY2JpQWdJQ0I5WEhKY2JpQWdmVnh5WEc1Y2NseHVJQ0FtWDE5amIyUmxJSHRjY2x4dUlDQWdJSEJoWkdScGJtY3RjbWxuYUhRNklEQXVOV1Z0TzF4eVhHNGdJSDFjY2x4dVhISmNiaUFnSmw5b2FXZG9iR2xuYUhRZ2UxeHlYRzRnSUNBZ0ppNXZkWFJzYVc1bExXNWhkbWxuWVhSdmNsOWZZVzVqYUc5eUlIdGNjbHh1SUNBZ0lDQWdKanBzYVc1ckxGeHlYRzRnSUNBZ0lDQW1PblpwYzJsMFpXUXNYSEpjYmlBZ0lDQWdJQ1k2YUc5MlpYSWdlMXh5WEc0Z0lDQWdJQ0FnSUdOdmJHOXlPaUJBYzNWalkyVnpjMTlqYjJ4dmNqdGNjbHh1SUNBZ0lDQWdJQ0JtYjI1MExYZGxhV2RvZERvZ1ltOXNaRHRjY2x4dUlDQWdJQ0FnZlZ4eVhHNGdJQ0FnZlZ4eVhHNGdJSDFjY2x4dVhISmNiaUFnSmw5emRHbGphM2tzWEhKY2JpQWdKbDltYVhobFpDQjdYSEpjYmlBZ0lDQmthWE53YkdGNU9pQm1iR1Y0TzF4eVhHNGdJQ0FnWm14bGVDMTNjbUZ3T2lCdWIzZHlZWEE3WEhKY2JpQWdJQ0JtYkdWNExXUnBjbVZqZEdsdmJqb2dZMjlzZFcxdU8xeHlYRzRnSUNBZ2VpMXBibVJsZURvZ2RtRnlLQzB0YjNWMGJHbHVaUzE2U1c1a1pYZ3BPMXh5WEc0Z0lDQWdkRzl3T2lBd08xeHlYRzRnSUNBZ2IzWmxjbVpzYjNjNklHaHBaR1JsYmp0Y2NseHVYSEpjYmlBZ0lDQXViM1YwYkdsdVpTMXVZWFpwWjJGMGIzSWdlMXh5WEc0Z0lDQWdJQ0FtWDE5MGFYUnNaU3hjY2x4dUlDQWdJQ0FnSmw5ZmJXRnBiaUI3WEhKY2JpQWdJQ0FnSUNBZ1ltOTRMWE5wZW1sdVp6b2dZbTl5WkdWeUxXSnZlRHRjY2x4dUlDQWdJQ0FnZlZ4eVhHNWNjbHh1SUNBZ0lDQWdKbDlmZEdsMGJHVWdlMXh5WEc0Z0lDQWdJQ0FnSUdac1pYZ3RjMmh5YVc1ck9pQXdPMXh5WEc0Z0lDQWdJQ0I5WEhKY2JseHlYRzRnSUNBZ0lDQW1YMTl0WVdsdUlIdGNjbHh1SUNBZ0lDQWdJQ0JtYkdWNE9pQXhPMXh5WEc0Z0lDQWdJQ0FnSUc5MlpYSm1iRzkzT2lCaGRYUnZPMXh5WEc0Z0lDQWdJQ0I5WEhKY2JpQWdJQ0I5WEhKY2JpQWdmVnh5WEc1Y2NseHVJQ0FtWDNOMGFXTnJlU0I3WEhKY2JpQWdJQ0J3YjNOcGRHbHZiam9nYzNScFkydDVPMXh5WEc0Z0lDQWdiV0Y0TFdobGFXZG9kRG9nZG1GeUtDMHRiM1YwYkdsdVpTMXpkR2xqYTNrdGFHVnBaMmgwS1R0Y2NseHVJQ0I5WEhKY2JseHlYRzRnSUNaZlptbDRaV1FnZTF4eVhHNGdJQ0FnY0c5emFYUnBiMjQ2SUdacGVHVmtPMXh5WEc0Z0lDQWdiV0Y0TFdobGFXZG9kRG9nTVRBd0pUdGNjbHh1SUNCOVhISmNibHh5WEc0Z0lDWmZhR2xrWkdWdUlIdGNjbHh1SUNBZ0lHUnBjM0JzWVhrNklHNXZibVU3WEhKY2JpQWdmVnh5WEc1Y2NseHVJQ0FtWDJadmJHUmxaQ0I3WEhKY2JpQWdJQ0IzYVdSMGFEb2dNRHRjY2x4dUlDQWdJRzkyWlhKbWJHOTNPaUJvYVdSa1pXNDdYSEpjYmlBZ2ZWeHlYRzU5WEhKY2JpSXNJaThxS2x4eVhHNGdLaUJsYkd4cGNITnBjeTVzWlhOeklDMGc1cGFINXB5czU1eUI1NVdsSUcxcGVHbHVlQ0RsaDczbWxiQmNjbHh1SUNvZ1BUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFZ4eVhHNGdLaUJEY21WaGRHVmtJRUo1T2lCWllXOW9ZV2w0YVdGdlhISmNiaUFxSUZWd1pHRjBaVG9nTWpBeU1pNHpMakV4WEhKY2JpQXFMMXh5WEc1Y2NseHVMeW9nUFQwOVBUMDlJT2FXaCthY3JPZWNnZWVWcGVXSHZlYVZzQ0E5UFQwOVBUMGdLaTljY2x4dUxtVnNiR2x3YzJseklDaEFiR2x1WlhNcElIZG9aVzRnS0VCc2FXNWxjejB4S1NCN1hISmNiaUFnZDJocGRHVXRjM0JoWTJVNklHNXZkM0poY0R0Y2NseHVJQ0IwWlhoMExXOTJaWEptYkc5M09pQmxiR3hwY0hOcGN6dGNjbHh1SUNCdmRtVnlabXh2ZHpvZ2FHbGtaR1Z1TzF4eVhHNTlYSEpjYmx4eVhHNHVaV3hzYVhCemFYTWdLRUJzYVc1bGN5a2dkMmhsYmlBb1FHeHBibVZ6UGoweUtTQjdYSEpjYmlBZ0xYZGxZbXRwZEMxc2FXNWxMV05zWVcxd09pQkFiR2x1WlhNN1hISmNiaUFnWkdsemNHeGhlVG9nWW05NE8xeHlYRzRnSUMxM1pXSnJhWFF0WW05NExXOXlhV1Z1ZERvZ2RtVnlkR2xqWVd3N1hISmNiaUFnZEdWNGRDMXZkbVZ5Wm14dmR6b2daV3hzYVhCemFYTTdYSEpjYmlBZ2IzWmxjbVpzYjNjNklHaHBaR1JsYmp0Y2NseHVmVnh5WEc0aUxDSkFhVzF3YjNKMElDY3VMMk52Ykc5eWN5YzdYSEpjYmtCcGJYQnZjblFnSnk0dlptOXVkQ2M3WEhKY2JrQnBiWEJ2Y25RZ0p5NHZiV2w0YVc1ekp6dGNjbHh1WEhKY2JpNXZkWFJzYVc1bExYSmxZV1JsY2lCN1hISmNiaUFnSmw5ZmNISnZaM0psYzNNZ2UxeHlYRzRnSUNBZ2NHOXphWFJwYjI0NklHWnBlR1ZrTzF4eVhHNGdJQ0FnZEc5d09pQXdPMXh5WEc0Z0lDQWdiR1ZtZERvZ01EdGNjbHh1SUNBZ0lIb3RhVzVrWlhnNklETTdYSEpjYmlBZ0lDQm9aV2xuYUhRNklEUndlRHRjY2x4dUlDQWdJSGRwWkhSb09pQXhNREFsTzF4eVhHNGdJQ0FnWW1GamEyZHliM1Z1WkMxamIyeHZjam9nUUhCeWFXMWhjbmxmWTI5c2IzSTdYSEpjYmlBZ0lDQnpZMkZzWlRvZ01DQXhPMXh5WEc0Z0lDQWdkSEpoYm5ObWIzSnRMVzl5YVdkcGJqb2diR1ZtZER0Y2NseHVJQ0FnSUdGdWFXMWhkR2x2YmpvZ2IzVjBiR2x1WlMxeVpXRmtaWEl0Y0hKdlozSmxjM01nYkdsdVpXRnlPMXh5WEc0Z0lDQWdZVzVwYldGMGFXOXVMWFJwYldWc2FXNWxPaUF0TFZCeWIyZHlaWE56VkdsdFpXeHBibVU3WEhKY2JpQWdmVnh5WEc1Y2NseHVJQ0FtWDE5d1lYQmxjaUI3WEhKY2JpQWdJQ0F1YzJoaFpHOTNYMlJoY210ZmNtVm5kV3hoY2lncE8xeHlYRzRnSUNBZ2JXRnlaMmx1T2lBeVpXMGdZWFYwYnp0Y2NseHVJQ0FnSUcxaGVDMTNhV1IwYURvZ01USXdNSEI0TzF4eVhHNGdJQ0FnY0dGa1pHbHVaem9nTXk0eVpXMDdYSEpjYmlBZ0lDQmliM2d0YzJsNmFXNW5PaUJpYjNKa1pYSXRZbTk0TzF4eVhHNGdJQ0FnWW1GamEyZHliM1Z1WkMxamIyeHZjam9nUUhkb2FYUmxPMXh5WEc0Z0lDQWdiM1psY21ac2IzYzZJR2hwWkdSbGJqdGNjbHh1SUNCOVhISmNibHh5WEc0Z0lDWmZYM1JwZEd4bElIdGNjbHh1SUNBZ0lHMWhjbWRwYmpvZ01DNDJOMlZ0SURBN1hISmNiaUFnSUNCMFpYaDBMV0ZzYVdkdU9pQmpaVzUwWlhJN1hISmNiaUFnSUNCbWIyNTBMV1poYldsc2VUb2dRR1p2Ym5SZmRHVjRkRjltWVcxcGJIazdYSEpjYmlBZ0lDQm1iMjUwTFhkbGFXZG9kRG9nYm05eWJXRnNPMXh5WEc0Z0lDQWdiR2x1WlMxb1pXbG5hSFE2SURFdU0yVnRPMXh5WEc0Z0lDQWdabTl1ZEMxemFYcGxPaUEwTGpKbGJUdGNjbHh1SUNBZ0lHOTJaWEptYkc5M09pQm9hV1JrWlc0N1hISmNiaUFnZlZ4eVhHNWNjbHh1SUNBbVgxOWhjblJwWTJ4bElIdGNjbHh1SUNBZ0lDNXZkWFJzYVc1bExYSmxZV1JsY2w5ZmNISnZaM0psYzNNZ2UxeHlYRzRnSUNBZ0lDQmthWE53YkdGNU9pQnViMjVsTzF4eVhHNGdJQ0FnZlZ4eVhHNGdJSDFjY2x4dVhISmNiaUFnSmw5b2FXUmtaVzRnZTF4eVhHNGdJQ0FnWkdsemNHeGhlVG9nYm05dVpUdGNjbHh1WEhKY2JpQWdJQ0FtTG05MWRHeHBibVV0Y21WaFpHVnlYM05wWW14cGJtY2dlMXh5WEc0Z0lDQWdJQ0JrYVhOd2JHRjVPaUJ1YjI1bElDRnBiWEJ2Y25SaGJuUTdYSEpjYmx4eVhHNGdJQ0FnSUNBbUxuZHlZWEJ3WlhJZ2UxeHlYRzRnSUNBZ0lDQWdJQ1l1Y0c5emRDQjdYSEpjYmlBZ0lDQWdJQ0FnSUNCa2FYTndiR0Y1T2lCdWIyNWxPMXh5WEc0Z0lDQWdJQ0FnSUgxY2NseHVJQ0FnSUNBZ2ZWeHlYRzRnSUNBZ2ZWeHlYRzRnSUgxY2NseHVYSEpjYmlBZ0ppMHRjbVZoWkdsdVp5QjdYSEpjYmlBZ0lDQmthWE53YkdGNU9pQmliRzlqYXp0Y2NseHVJQ0FnSUhCdmMybDBhVzl1T2lCbWFYaGxaRHRjY2x4dUlDQWdJSG90YVc1a1pYZzZJREk3WEhKY2JpQWdJQ0IwYjNBNklEQTdYSEpjYmlBZ0lDQnNaV1owT2lBd08xeHlYRzRnSUNBZ2QybGtkR2c2SURFd01DVTdYSEpjYmlBZ0lDQm9aV2xuYUhRNklERXdNQ1U3WEhKY2JpQWdJQ0J0WVhKbmFXNDZJREE3WEhKY2JpQWdJQ0JpYjNndGMybDZhVzVuT2lCaWIzSmtaWEl0WW05NE8xeHlYRzRnSUNBZ2NHRmtaR2x1WnpvZ00yVnRJRFJsYlR0Y2NseHVJQ0FnSUdKaFkydG5jbTkxYm1RdFkyOXNiM0k2SUVCaVoxOWpiMnh2Y2p0Y2NseHVJQ0FnSUhOamNtOXNiQzEwYVcxbGJHbHVaUzF1WVcxbE9pQXRMVkJ5YjJkeVpYTnpWR2x0Wld4cGJtVTdYSEpjYmlBZ0lDQnZkbVZ5Wm14dmR6b2djMk55YjJ4c08xeHlYRzRnSUgxY2NseHVmVnh5WEc1Y2NseHVRR3RsZVdaeVlXMWxjeUJ2ZFhSc2FXNWxMWEpsWVdSbGNpMXdjbTluY21WemN5QjdYSEpjYmlBZ2RHOGdlMXh5WEc0Z0lDQWdjMk5oYkdVNklERWdNVHRjY2x4dUlDQjlYSEpjYm4xY2NseHVYSEpjYmtCdFpXUnBZU0FvYldGNExYZHBaSFJvT2lBMU1EQndlQ2tnZTF4eVhHNGdJQzV2ZFhSc2FXNWxJSHRjY2x4dUlDQWdJQ1l0Y21WaFpHVnlJSHRjY2x4dUlDQWdJQ0FnYjNabGNtWnNiM2M2SUdocFpHUmxianRjY2x4dVhISmNiaUFnSUNBZ0lDNXZkWFJzYVc1bExYUnZiMnhpWVhJZ2UxeHlYRzRnSUNBZ0lDQWdJR1JwYzNCc1lYazZJR1pzWlhnN1hISmNiaUFnSUNBZ0lDQWdabXhsZUMxa2FYSmxZM1JwYjI0NklISnZkenRjY2x4dUlDQWdJQ0FnSUNCbWJHVjRMWGR5WVhBNklHNXZkM0poY0R0Y2NseHVJQ0FnSUNBZ0lDQmhiR2xuYmkxcGRHVnRjem9nWTJWdWRHVnlPMXh5WEc0Z0lDQWdJQ0FnSUdGc2FXZHVMWE5sYkdZNklHRjFkRzg3WEhKY2JpQWdJQ0FnSUNBZ2RHOXdPaUF4TURBbE8xeHlYRzRnSUNBZ0lDQWdJSEpwWjJoME9pQXdPMXh5WEc0Z0lDQWdJQ0FnSUhSeVlXNXpabTl5YlRvZ2RISmhibk5zWVhSbFdTZ3RORGh3ZUNrN1hISmNiaUFnSUNBZ0lDQWdkMmxrZEdnNklERXdNQ1U3WEhKY2JpQWdJQ0FnSUNBZ2FHVnBaMmgwT2lBME9IQjRPMXh5WEc0Z0lDQWdJQ0FnSUdKdmVDMXphWHBwYm1jNklHSnZjbVJsY2kxaWIzZzdYSEpjYmlBZ0lDQWdJQ0FnWW05eVpHVnlMWFJ2Y0RvZ01YQjRJSE52Ykdsa0lFQmliM0prWlhKZlkyOXNiM0k3WEhKY2JpQWdJQ0FnSUNBZ1ltRmphMmR5YjNWdVpDMWpiMnh2Y2pvZ1FIZG9hWFJsTzF4eVhHNGdJQ0FnSUNBZ0lIQmhaR1JwYm1jNklEQWdNVFp3ZUR0Y2NseHVYSEpjYmlBZ0lDQWdJQ0FnSmw5ZlluVjBkRzl1SUh0Y2NseHVJQ0FnSUNBZ0lDQWdJQzV5WVdScGRYTmZibTl1WlNncE8xeHlYRzRnSUNBZ0lDQWdJQ0FnWm14bGVEb2dNVHRjY2x4dUlDQWdJQ0FnSUNBZ0lHSnZjbVJsY2pvZ2JtOXVaVHRjY2x4dUlDQWdJQ0FnSUNBZ0lHSnZlQzF6YUdGa2IzYzZJRzV2Ym1VN1hISmNiaUFnSUNBZ0lDQWdmVnh5WEc0Z0lDQWdJQ0I5WEhKY2JseHlYRzRnSUNBZ0lDQW1MUzF5WldGa2FXNW5JSHRjY2x4dUlDQWdJQ0FnSUNCd1lXUmthVzVuT2lBd08xeHlYRzRnSUNBZ0lDQWdJR0poWTJ0bmNtOTFibVF0WTI5c2IzSTZJRUIzYUdsMFpUdGNjbHh1SUNBZ0lDQWdJQ0JpYjNndGMybDZhVzVuT2lCaWIzSmtaWEl0WW05NE8xeHlYRzRnSUNBZ0lDQjlYSEpjYmx4eVhHNGdJQ0FnSUNBbVgxOXdZWEJsY2lCN1hISmNiaUFnSUNBZ0lDQWdjRzl6YVhScGIyNDZJSEpsYkdGMGFYWmxPMXh5WEc0Z0lDQWdJQ0FnSUhvdGFXNWtaWGc2SURFN1hISmNiaUFnSUNBZ0lDQWdiV0Z5WjJsdU9pQXdPMXh5WEc0Z0lDQWdJQ0FnSUhCaFpHUnBibWM2SURBN1hISmNiaUFnSUNBZ0lDQWdhR1ZwWjJoME9pQXhNREFsTzF4eVhHNGdJQ0FnSUNBZ0lHSnZlQzF6YUdGa2IzYzZJRzV2Ym1VN1hISmNiaUFnSUNBZ0lDQWdiM1psY21ac2IzYzZJR2hwWkdSbGJqdGNjbHh1SUNBZ0lDQWdmVnh5WEc1Y2NseHVJQ0FnSUNBZ0psOWZkR2wwYkdVZ2UxeHlYRzRnSUNBZ0lDQWdJQzVsYkd4cGNITnBjeWd4S1R0Y2NseHVJQ0FnSUNBZ0lDQndiM05wZEdsdmJqb2dZV0p6YjJ4MWRHVTdYSEpjYmlBZ0lDQWdJQ0FnZWkxcGJtUmxlRG9nTXp0Y2NseHVJQ0FnSUNBZ0lDQjBiM0E2SURBN1hISmNiaUFnSUNBZ0lDQWdiR1ZtZERvZ01EdGNjbHh1SUNBZ0lDQWdJQ0J0WVhKbmFXNDZJREE3WEhKY2JpQWdJQ0FnSUNBZ2QybGtkR2c2SURFd01DVTdYSEpjYmlBZ0lDQWdJQ0FnYUdWcFoyaDBPaUEwT0hCNE8xeHlYRzRnSUNBZ0lDQWdJR3hwYm1VdGFHVnBaMmgwT2lBME9IQjRPMXh5WEc0Z0lDQWdJQ0FnSUdKdmNtUmxjaTFpYjNSMGIyMDZJREZ3ZUNCemIyeHBaQ0JBWW05eVpHVnlYMk52Ykc5eU8xeHlYRzRnSUNBZ0lDQWdJR1p2Ym5RdGMybDZaVG9nTVM0NFpXMDdYSEpjYmlBZ0lDQWdJQ0FnWm05dWRDMTNaV2xuYUhRNklEUXdNRHRjY2x4dUlDQWdJQ0FnSUNCaVlXTnJaM0p2ZFc1a0xXTnZiRzl5T2lCQWQyaHBkR1U3WEhKY2JpQWdJQ0FnSUNBZ2IzWmxjbVpzYjNjNklHaHBaR1JsYmp0Y2NseHVJQ0FnSUNBZ2ZWeHlYRzVjY2x4dUlDQWdJQ0FnSmw5ZllYSjBhV05zWlNCN1hISmNiaUFnSUNBZ0lDQWdiV0Z5WjJsdU9pQTBPSEI0SURBN1hISmNiaUFnSUNBZ0lDQWdhR1ZwWjJoME9pQmpZV3hqS0RFd01DVWdMU0E1Tm5CNEtUdGNjbHh1SUNBZ0lDQWdJQ0J3WVdSa2FXNW5PaUF3SURFdU1qVmxiVHRjY2x4dUlDQWdJQ0FnSUNCelkzSnZiR3d0ZEdsdFpXeHBibVV0Ym1GdFpUb2dMUzFOYjJKcGJHVlFjbTluY21WemMxUnBiV1ZzYVc1bE8xeHlYRzRnSUNBZ0lDQWdJRzkyWlhKbWJHOTNMWGc2SUdocFpHUmxianRjY2x4dUlDQWdJQ0FnSUNCdmRtVnlabXh2ZHkxNU9pQnpZM0p2Ykd3N1hISmNibHh5WEc0Z0lDQWdJQ0FnSUM1dmRYUnNhVzVsTFhKbFlXUmxjbDlmY0hKdlozSmxjM01nZTF4eVhHNGdJQ0FnSUNBZ0lDQWdlaTFwYm1SbGVEb2dORHRjY2x4dUlDQWdJQ0FnSUNBZ0lHRnVhVzFoZEdsdmJqb2diM1YwYkdsdVpTMXlaV0ZrWlhJdGNISnZaM0psYzNNZ2JHbHVaV0Z5TzF4eVhHNGdJQ0FnSUNBZ0lDQWdZVzVwYldGMGFXOXVMWFJwYldWc2FXNWxPaUF0TFUxdlltbHNaVkJ5YjJkeVpYTnpWR2x0Wld4cGJtVTdYSEpjYmlBZ0lDQWdJQ0FnSUNCa2FYTndiR0Y1T2lCaWJHOWphenRjY2x4dUlDQWdJQ0FnSUNCOVhISmNiaUFnSUNBZ0lIMWNjbHh1SUNBZ0lIMWNjbHh1SUNCOVhISmNibjFjY2x4dVhISmNia0J0WldScFlTQndjbWx1ZENCN1hISmNiaUFnYUhSdGJDeGNjbHh1SUNCaWIyUjVJSHRjY2x4dUlDQWdJQzhxSU9hSmsrV05zT2VhaE9XZnV1ZWhnT1d0bCtTOWsrV2twK1d3anlBcUwxeHlYRzRnSUNBZ1ptOXVkQzF6YVhwbE9pQXhNbkIwTzF4eVhHNGdJQ0FnTHlvZzVwaSs1NlM2Nks2KzU3MnU1cGFINWEyWDZhS2M2SW15NVpLTTZJT001cG12NmFLYzZJbXlJQ292WEhKY2JpQWdJQ0JpWVdOclozSnZkVzVrTFdOdmJHOXlPaUJBZDJocGRHVTdYSEpjYmlBZ0lDQmpiMnh2Y2pvZ1FIQnlhVzFoY25sZmRHVjRkRjlqYjJ4dmNqdGNjbHh1SUNBZ0lHaGxhV2RvZERvZ2FXNXBkR2xoYkNBaGFXMXdiM0owWVc1ME8xeHlYRzRnSUgxY2NseHVYSEpjYmlBZ0x5b2c2SzYrNTcydTZaTys1bzZsNXFDMzVieVBJQ292WEhKY2JpQWdZVHBzYVc1ckxGeHlYRzRnSUdFNmRtbHphWFJsWkN4Y2NseHVJQ0JoT21odmRtVnlJSHRjY2x4dUlDQWdJSFJsZUhRdFpHVmpiM0poZEdsdmJqb2dkVzVrWlhKc2FXNWxJQ0ZwYlhCdmNuUmhiblE3WEhKY2JpQWdJQ0JqYjJ4dmNqb2dRSEJ5YVcxaGNubGZZMjlzYjNJN1hISmNiaUFnZlZ4eVhHNWNjbHh1SUNBdktpRHBtcERvbDQvbHFwTGt2WlBtb0lmbnJiNGdLaTljY2x4dUlDQjJhV1JsYnl4Y2NseHVJQ0JoZFdScGJ5QjdYSEpjYmlBZ0lDQmthWE53YkdGNU9pQnViMjVsSUNGcGJYQnZjblJoYm5RN1hISmNiaUFnZlZ4eVhHNWNjbHh1SUNBdktpRG5vYTdrdjUzb29ham1vTHpsbktqbWlaUGxqYkRtbDdibm1vVG92cm5tb1libGtvemxyN25wdlpEbWxybmx2SS9tdUlYbW1iQWdLaTljY2x4dUlDQjBZV0pzWlNCN1hISmNiaUFnSUNCM2FXUjBhRG9nTVRBd0pUdGNjbHh1SUNBZ0lHSnZjbVJsY2kxamIyeHNZWEJ6WlRvZ1kyOXNiR0Z3YzJVN1hISmNiaUFnZlZ4eVhHNGdJSFJvTEZ4eVhHNGdJSFJrSUh0Y2NseHVJQ0FnSUdKdmNtUmxjam9nTVhCNElITnZiR2xrSUVCd2NtbHRZWEo1WDJKdmNtUmxjbDlqYjJ4dmNqdGNjbHh1SUNBZ0lIQmhaR1JwYm1jNklEaHdlQ0F5TUhCNE8xeHlYRzRnSUgxY2NseHVYSEpjYmlBZ0xtOTFkR3hwYm1VZ2UxeHlYRzRnSUNBZ0ppMXRaWE56WVdkbExGeHlYRzRnSUNBZ0ppMTBiMjlzWW1GeUlIdGNjbHh1SUNBZ0lDQWdMeW9nNlpxUTZKZVA1THFHNWJlbDVZVzM1cUNQNVpLTTVMK2g1b0d2NW8rUTU2UzY1cUdHSUNvdlhISmNiaUFnSUNBZ0lHUnBjM0JzWVhrNklHNXZibVVnSVdsdGNHOXlkR0Z1ZER0Y2NseHVJQ0FnSUgxY2NseHVYSEpjYmlBZ0lDQW1MWEpsWVdSbGNpQjdYSEpjYmlBZ0lDQWdJR1JwYzNCc1lYazZJR0pzYjJOcklDRnBiWEJ2Y25SaGJuUTdYSEpjYmlBZ0lDQWdJRzkyWlhKbWJHOTNPaUJvYVdSa1pXNDdYSEpjYmx4eVhHNGdJQ0FnSUNBbVgxOTBhWFJzWlNCN1hISmNiaUFnSUNBZ0lDQWdiV0Z5WjJsdU9pQXhNeTQwY0hRZ01DQXlPSEIwSUNGcGJYQnZjblJoYm5RN1hISmNiaUFnSUNBZ0lDQWdkR1Y0ZEMxaGJHbG5iam9nWTJWdWRHVnlJQ0ZwYlhCdmNuUmhiblE3WEhKY2JpQWdJQ0FnSUNBZ1ptOXVkQzF6YVhwbE9pQXpNbkIwSUNGcGJYQnZjblJoYm5RN1hISmNiaUFnSUNBZ0lIMWNjbHh1WEhKY2JpQWdJQ0FnSUM4cUlPV1BsdWEyaU9TNmh1ZTduZVd2dWVXdW11UzlqU0FxTDF4eVhHNGdJQ0FnSUNBbUxTMXlaV0ZrYVc1bklIdGNjbHh1SUNBZ0lDQWdJQ0J3YjNOcGRHbHZiam9nY21Wc1lYUnBkbVVnSVdsdGNHOXlkR0Z1ZER0Y2NseHVJQ0FnSUNBZ0lDQm9aV2xuYUhRNklHRjFkRzhnSVdsdGNHOXlkR0Z1ZER0Y2NseHVJQ0FnSUNBZ0lDQndZV1JrYVc1bk9pQXdJQ0ZwYlhCdmNuUmhiblE3WEhKY2JpQWdJQ0FnSUNBZ1ltRmphMmR5YjNWdVpDMWpiMnh2Y2pvZ1FIZG9hWFJsTzF4eVhHNGdJQ0FnSUNBZ0lHOTJaWEptYkc5M09pQm9hV1JrWlc0Z0lXbHRjRzl5ZEdGdWREdGNjbHh1SUNBZ0lDQWdmVnh5WEc1Y2NseHVJQ0FnSUNBZ0x5b2c2WnFRNkplUDZaaUY2Sys3NkwrYjVicW01cDJoSUNvdlhISmNiaUFnSUNBZ0lDWmZYM0J5YjJkeVpYTnpJSHRjY2x4dUlDQWdJQ0FnSUNCa2FYTndiR0Y1T2lCdWIyNWxJQ0ZwYlhCdmNuUmhiblE3WEhKY2JpQWdJQ0FnSUgxY2NseHVYSEpjYmlBZ0lDQWdJQzhxSU9hSmsrV05zT2FYdHVTNGplYVl2dWVrdXVhdG8rYVdoeUJFVDAwZzU1cUU2WmkwNWIyeDVwV0k1cDZjSUNvdlhISmNiaUFnSUNBZ0lDWmZYM0JoY0dWeUlIdGNjbHh1SUNBZ0lDQWdJQ0JpYjNndGMyaGhaRzkzT2lCdWIyNWxPMXh5WEc0Z0lDQWdJQ0I5WEhKY2JseHlYRzRnSUNBZ0lDQndjbVVnZTF4eVhHNGdJQ0FnSUNBZ0lIQmhaR1JwYm1jNklERmxiU0FoYVcxd2IzSjBZVzUwTzF4eVhHNGdJQ0FnSUNBZ0lHSnZjbVJsY2pvZ01YQjRJSE52Ykdsa0lFQmliM0prWlhKZlkyOXNiM0lnSVdsdGNHOXlkR0Z1ZER0Y2NseHVJQ0FnSUNBZ0lDQmliM0prWlhJdGNtRmthWFZ6T2lBMGNIZ2dJV2x0Y0c5eWRHRnVkRHRjY2x4dUlDQWdJQ0FnZlZ4eVhHNWNjbHh1SUNBZ0lDQWdjSEpsTEZ4eVhHNGdJQ0FnSUNCamIyUmxJSHRjY2x4dUlDQWdJQ0FnSUNCaVlXTnJaM0p2ZFc1a0xXTnZiRzl5T2lCQWQyaHBkR1VnSVdsdGNHOXlkR0Z1ZER0Y2NseHVJQ0FnSUNBZ2ZWeHlYRzVjY2x4dUlDQWdJQ0FnZEdGaWJHVXNYSEpjYmlBZ0lDQWdJR2x0Wnl4Y2NseHVJQ0FnSUNBZ2MzWm5JSHRjY2x4dUlDQWdJQ0FnSUNCaWNtVmhheTFwYm5OcFpHVTZJR0YyYjJsa08xeHlYRzRnSUNBZ0lDQjlYSEpjYmx4eVhHNGdJQ0FnSUNBdktpRG1pWURtbklubWxvZm5xNkRsaG9YbHJya2dSRTlOSU9lYnVPV0ZzK2VhaE9tQ3UrV3hoZWlLZ3VlQ3VlbUR2ZW1ha09pWGorUzZoaUFxTDF4eVhHNGdJQ0FnSUNBbVgzTnBZbXhwYm1jZ2UxeHlYRzRnSUNBZ0lDQWdJR1JwYzNCc1lYazZJRzV2Ym1VZ0lXbHRjRzl5ZEdGdWREdGNjbHh1SUNBZ0lDQWdmVnh5WEc0Z0lDQWdmVnh5WEc0Z0lIMWNjbHh1ZlZ4eVhHNGlMQ0l2S2lwY2NseHVJQ29nY21Ga2FYVnpMbXhsYzNNZ0xTRGxuSWJvcDVMb3JyN252YTRnYldsNGFXNTRJT1dIdmVhVnNGeHlYRzRnS2lBOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5WEhKY2JpQXFJRU55WldGMFpXUWdRbms2SUZsaGIyaGhhWGhwWVc5Y2NseHVJQ29nVlhCa1lYUmxPaUF5TURJMExqUXVNVFpjY2x4dUlDb3ZYSEpjYmx4eVhHNHZLaUE5UFQwOVBUMGc1WnlHNktlUzVxQzM1YnlQNks2KzU3MnU1WWU5NXBXd0lEMDlQVDA5UFNBcUwxeHlYRzR1Y21Ga2FYVnpLRUJ1ZFcwNklESndlQ2tnZTF4eVhHNGdJR0p2Y21SbGNpMXlZV1JwZFhNNklFQnVkVzA3WEhKY2JuMWNjbHh1WEhKY2JpNXlZV1JwZFhOZmJtOXVaU2dwSUh0Y2NseHVJQ0F1Y21Ga2FYVnpLREFwTzF4eVhHNTlYSEpjYmx4eVhHNHVjbUZrYVhWelgyMXBibWtvS1NCN1hISmNiaUFnTG5KaFpHbDFjeWd5Y0hncE8xeHlYRzU5WEhKY2JseHlYRzR1Y21Ga2FYVnpYM050WVd4c0tDa2dlMXh5WEc0Z0lDNXlZV1JwZFhNb00zQjRLVHRjY2x4dWZWeHlYRzVjY2x4dUxuSmhaR2wxYzE5eVpXZDFiR0Z5S0NrZ2UxeHlYRzRnSUM1eVlXUnBkWE1vTkhCNEtUdGNjbHh1ZlZ4eVhHNWNjbHh1TG5KaFpHbDFjMTl0WldScGRXMG9LU0I3WEhKY2JpQWdMbkpoWkdsMWN5ZzFjSGdwTzF4eVhHNTlYSEpjYmx4eVhHNHVjbUZrYVhWelgyeGhjbWRsS0NrZ2UxeHlYRzRnSUM1eVlXUnBkWE1vTVRCd2VDazdYSEpjYm4xY2NseHVYSEpjYmk1eVlXUnBkWE5mYUhWblpTZ3BJSHRjY2x4dUlDQXVjbUZrYVhWektERTJjSGdwTzF4eVhHNTlYSEpjYmx4eVhHNHVjbUZrYVhWelgzSnZkVzVrS0NrZ2UxeHlYRzRnSUM1eVlXUnBkWE1vTXpCd2VDazdYSEpjYm4xY2NseHVJaXdpTHlvZ1BUMDlQVDA5UFQwOVBTQmlkWFIwYjI1ekxuUm9aVzFsSUMwZzVveUo2Wkt1NWErODZJaXE1cUMzNWJ5UElEMDlQVDA5UFQwOVBUMGdLaTljY2x4dVFHbHRjRzl5ZENBbkxpOWpiMnh2Y25Nbk8xeHlYRzVBYVcxd2IzSjBJQ2N1TDNOb1lXUnZkeWM3WEhKY2JseHlYRzR1YjNWMGJHbHVaUzEwYjI5c1ltRnlJSHRjY2x4dUlDQndiM05wZEdsdmJqb2dabWw0WldRN1hISmNiaUFnZWkxcGJtUmxlRG9nT1RrNU9UazdYSEpjYmlBZ2JXRnlaMmx1T2lBd08xeHlYRzRnSUhSeVlXNXphWFJwYjI0dFpIVnlZWFJwYjI0NklEQXVNM003WEhKY2JpQWdiM1psY21ac2IzYzZJR2hwWkdSbGJqdGNjbHh1WEhKY2JpQWdKbDlmWW5WMGRHOXVJSHRjY2x4dUlDQWdJQzV6YUdGa2IzZGZiR2xuYUhSZmNtVm5kV3hoY2lncE8xeHlYRzRnSUNBZ2NHOXphWFJwYjI0NklISmxiR0YwYVhabE8xeHlYRzRnSUNBZ2VpMXBibVJsZURvZ01UdGNjbHh1SUNBZ0lHMWhjbWRwYmpvZ01UQndlRHRjY2x4dUlDQWdJSGRwWkhSb09pQXpObkI0TzF4eVhHNGdJQ0FnYUdWcFoyaDBPaUF6Tm5CNE8xeHlYRzRnSUNBZ1ltOXlaR1Z5T2lBeGNIZ2djMjlzYVdRZ1FIQnlhVzFoY25sZlltOXlaR1Z5WDJOdmJHOXlPMXh5WEc0Z0lDQWdZbTl5WkdWeUxYSmhaR2wxY3pvZ00zQjRPMXh5WEc0Z0lDQWdZbTk0TFhOcGVtbHVaem9nWW05eVpHVnlMV0p2ZUR0Y2NseHVJQ0FnSUdKaFkydG5jbTkxYm1RdFkyOXNiM0k2SUVCM2FHbDBaVHRjY2x4dUlDQWdJR04xY25OdmNqb2djRzlwYm5SbGNqdGNjbHh1SUNBZ0lIUmxlSFF0WVd4cFoyNDZJR05sYm5SbGNqdGNjbHh1SUNBZ0lHTnZiRzl5T2lCQVptOTFjblJvWDNSbGVIUmZZMjlzYjNJN1hISmNiaUFnSUNCMGNtRnVjMmwwYVc5dU9pQmhiR3dnTUM0emN5QXdMakZ6SUdWaGMyVXRhVzR0YjNWME8xeHlYRzRnSUNBZ2IzWmxjbVpzYjNjNklHaHBaR1JsYmp0Y2NseHVYSEpjYmlBZ0lDQW1PbWh2ZG1WeUlIdGNjbHh1SUNBZ0lDQWdZMjlzYjNJNklFQnpkV05qWlhOelgyTnZiRzl5TzF4eVhHNGdJQ0FnSUNCaWIzSmtaWEl0WTI5c2IzSTZJRUJ6ZFdOalpYTnpYMk52Ykc5eU8xeHlYRzRnSUNBZ0lDQjBjbUZ1YzJadmNtMDZJSE5qWVd4bEtERXVNelVwTzF4eVhHNGdJQ0FnZlZ4eVhHNWNjbHh1SUNBZ0lDWXVhR2xrWlNCN1hISmNiaUFnSUNBZ0lHUnBjM0JzWVhrNklHNXZibVU3WEhKY2JpQWdJQ0I5WEhKY2JpQWdmVnh5WEc1Y2NseHVJQ0FtWDE5aGJtTm9iM0lnZTF4eVhHNGdJQ0FnSmpwc2FXNXJMRnh5WEc0Z0lDQWdKanAyYVhOcGRHVmtMRnh5WEc0Z0lDQWdKanBvYjNabGNpQjdYSEpjYmlBZ0lDQWdJR052Ykc5eU9pQkFabTkxY25Sb1gzUmxlSFJmWTI5c2IzSTdYSEpjYmlBZ0lDQWdJSFJsZUhRdFpHVmpiM0poZEdsdmJqb2dibTl1WlR0Y2NseHVJQ0FnSUgxY2NseHVYSEpjYmlBZ0lDQW1PbWh2ZG1WeUlIdGNjbHh1SUNBZ0lDQWdZMjlzYjNJNklFQnpkV05qWlhOelgyTnZiRzl5TzF4eVhHNGdJQ0FnZlZ4eVhHNGdJSDFjY2x4dVhISmNiaUFnSmw5ZmFXTnZiaUI3WEhKY2JpQWdJQ0J3YjNOcGRHbHZiam9nWVdKemIyeDFkR1U3WEhKY2JpQWdJQ0I2TFdsdVpHVjRPaUF5TzF4eVhHNGdJQ0FnZEc5d09pQTFNQ1U3WEhKY2JpQWdJQ0JzWldaME9pQTFNQ1U3WEhKY2JpQWdJQ0IzYVdSMGFEb2dNakJ3ZUR0Y2NseHVJQ0FnSUdobGFXZG9kRG9nTWpCd2VEdGNjbHh1SUNBZ0lIUnlZVzV6Wm05eWJUb2dkSEpoYm5Oc1lYUmxLQzAxTUNVc0lDMDFNQ1VwTzF4eVhHNGdJQ0FnWm1sc2JEb2dZM1Z5Y21WdWRHTnZiRzl5TzF4eVhHNGdJQ0FnYjNabGNtWnNiM2M2SUdocFpHUmxianRjY2x4dUlDQjlYSEpjYmx4eVhHNGdJQ1pmWVdOMGFYWmxJSHRjY2x4dUlDQWdJQ1l1YjNWMGJHbHVaUzEwYjI5c1ltRnlJSHRjY2x4dUlDQWdJQ0FnSmw5ZlluVjBkRzl1SUh0Y2NseHVJQ0FnSUNBZ0lDQmpiMnh2Y2pvZ1FIZG9hWFJsTzF4eVhHNGdJQ0FnSUNBZ0lHSmhZMnRuY205MWJtUXRZMjlzYjNJNklFQnpkV05qWlhOelgyTnZiRzl5TzF4eVhHNGdJQ0FnSUNBZ0lHSnZjbVJsY2kxamIyeHZjam9nUUhOMVkyTmxjM05mWTI5c2IzSTdYSEpjYmx4eVhHNGdJQ0FnSUNBZ0lDWTZhRzkyWlhJZ2UxeHlYRzRnSUNBZ0lDQWdJQ0FnWTI5c2IzSTZJRUIzYUdsMFpUdGNjbHh1SUNBZ0lDQWdJQ0I5WEhKY2JpQWdJQ0FnSUgxY2NseHVJQ0FnSUgxY2NseHVYSEpjYmlBZ0lDQXViM1YwYkdsdVpTMTBiMjlzWW1GeVgxOWhibU5vYjNJZ2UxeHlYRzRnSUNBZ0lDQW1PbXhwYm1zc1hISmNiaUFnSUNBZ0lDWTZkbWx6YVhSbFpDeGNjbHh1SUNBZ0lDQWdKanBvYjNabGNpQjdYSEpjYmlBZ0lDQWdJQ0FnWTI5c2IzSTZJRUIzYUdsMFpUdGNjbHh1SUNBZ0lDQWdmVnh5WEc0Z0lDQWdmVnh5WEc0Z0lIMWNjbHh1WEhKY2JpQWdKbDl5YjNWdVpHVmtJSHRjY2x4dUlDQWdJQ1l1YjNWMGJHbHVaUzEwYjI5c1ltRnlYMTlpZFhSMGIyNGdlMXh5WEc0Z0lDQWdJQ0JpYjNKa1pYSXRjbUZrYVhWek9pQXhPSEI0TzF4eVhHNGdJQ0FnZlZ4eVhHNGdJSDFjY2x4dVhISmNiaUFnSmw5a2FYTmhZbXhsWkNCN1hISmNiaUFnSUNBbUxtOTFkR3hwYm1VdGRHOXZiR0poY2l4Y2NseHVJQ0FnSUM1dmRYUnNhVzVsTFhSdmIyeGlZWElnZTF4eVhHNGdJQ0FnSUNBbVgxOWhibU5vYjNJNmJHbHVheXhjY2x4dUlDQWdJQ0FnSmw5ZllXNWphRzl5T25acGMybDBaV1FzWEhKY2JpQWdJQ0FnSUNaZlgyRnVZMmh2Y2pwb2IzWmxjaXhjY2x4dUlDQWdJQ0FnSmw5ZlluVjBkRzl1SUh0Y2NseHVJQ0FnSUNBZ0lDQmpkWEp6YjNJNklHNXZkQzFoYkd4dmQyVmtPMXh5WEc0Z0lDQWdJQ0FnSUdOdmJHOXlPaUJBWm05MWNuUm9YM1JsZUhSZlkyOXNiM0k3WEhKY2JpQWdJQ0FnSUNBZ1ltOXlaR1Z5TFdOdmJHOXlPaUJBWm05MWNuUm9YM1JsZUhSZlkyOXNiM0k3WEhKY2JseHlYRzRnSUNBZ0lDQWdJQ1k2YUc5MlpYSWdlMXh5WEc0Z0lDQWdJQ0FnSUNBZ1kyOXNiM0k2SUVCbWIzVnlkR2hmZEdWNGRGOWpiMnh2Y2p0Y2NseHVJQ0FnSUNBZ0lDQWdJR0p2Y21SbGNpMWpiMnh2Y2pvZ1FHWnZkWEowYUY5MFpYaDBYMk52Ykc5eU8xeHlYRzRnSUNBZ0lDQWdJSDFjY2x4dUlDQWdJQ0FnZlZ4eVhHNWNjbHh1SUNBZ0lDQWdKbDlmWW5WMGRHOXVJSHRjY2x4dUlDQWdJQ0FnSUNCaVlXTnJaM0p2ZFc1a0xXTnZiRzl5T2lCQVpHbHpZV0pzWldSZlltZGZZMjlzYjNJN1hISmNiaUFnSUNBZ0lIMWNjbHh1SUNBZ0lIMWNjbHh1SUNCOVhISmNibHh5WEc0Z0lDWmZkSFJpTEZ4eVhHNGdJQ1pmWW5SMElIdGNjbHh1SUNBZ0lHeGxablE2SURVd0pUdGNjbHh1SUNBZ0lIUnlZVzV6Wm05eWJUb2dkSEpoYm5Oc1lYUmxXQ2d0TlRBbEtUdGNjbHh1WEhKY2JpQWdJQ0F1YjNWMGJHbHVaUzEwYjI5c1ltRnlYMTlpZFhSMGIyNGdlMXh5WEc0Z0lDQWdJQ0JrYVhOd2JHRjVPaUJwYm14cGJtVXRZbXh2WTJzN1hISmNiaUFnSUNCOVhISmNiaUFnZlZ4eVhHNWNjbHh1SUNBbVgzUjBZaUI3WEhKY2JpQWdJQ0IwYjNBNklERXljSGc3WEhKY2JseHlYRzRnSUNBZ0ppNXZkWFJzYVc1bExYUnZiMnhpWVhKZmFHbGtaR1Z1SUh0Y2NseHVJQ0FnSUNBZ2RHOXdPaUF0TlRad2VEdGNjbHh1SUNBZ0lIMWNjbHh1SUNCOVhISmNibHh5WEc0Z0lDWmZZblIwSUh0Y2NseHVJQ0FnSUdKdmRIUnZiVG9nTVRKd2VEdGNjbHh1WEhKY2JpQWdJQ0FtTG05MWRHeHBibVV0ZEc5dmJHSmhjbDlvYVdSa1pXNGdlMXh5WEc0Z0lDQWdJQ0JpYjNSMGIyMDZJQzAxTm5CNE8xeHlYRzRnSUNBZ2ZWeHlYRzRnSUgxY2NseHVYSEpjYmlBZ0psOXlkR3dzWEhKY2JpQWdKbDlzZEhJZ2UxeHlYRzRnSUNBZ2RISmhibk5tYjNKdE9pQjBjbUZ1YzJ4aGRHVlpLQzAxTUNVcE8xeHlYRzRnSUNBZ2QybGtkR2c2SURVMmNIZzdYSEpjYmlBZ2ZWeHlYRzVjY2x4dUlDQW1YM0owYkNCN1hISmNiaUFnSUNCMGIzQTZJRFV3SlR0Y2NseHVJQ0FnSUhKcFoyaDBPaUF4TW5CNE8xeHlYRzVjY2x4dUlDQWdJQ1l1YjNWMGJHbHVaUzEwYjI5c1ltRnlYMmhwWkdSbGJpQjdYSEpjYmlBZ0lDQWdJSEpwWjJoME9pQXRPRFp3ZUR0Y2NseHVJQ0FnSUgxY2NseHVJQ0I5WEhKY2JseHlYRzRnSUNaZmJIUnlJSHRjY2x4dUlDQWdJSFJ2Y0RvZ05UQWxPMXh5WEc0Z0lDQWdiR1ZtZERvZ01USndlRHRjY2x4dVhISmNiaUFnSUNBbUxtOTFkR3hwYm1VdGRHOXZiR0poY2w5b2FXUmtaVzRnZTF4eVhHNGdJQ0FnSUNCc1pXWjBPaUF0T0Rad2VEdGNjbHh1SUNBZ0lIMWNjbHh1SUNCOVhISmNibHh5WEc0Z0lDWmZkSFJpTEZ4eVhHNGdJQ1pmY25Sc0xGeHlYRzRnSUNaZlluUjBMRnh5WEc0Z0lDWmZiSFJ5SUh0Y2NseHVJQ0FnSUM1dmRYUnNhVzVsTFhSdmIyeGlZWEpmWDJKMWRIUnZiaUI3WEhKY2JpQWdJQ0FnSUNZdWIzVjBiR2x1WlMxMGIyOXNZbUZ5WDJocFpHUmxiaUI3WEhKY2JpQWdJQ0FnSUNBZ1pHbHpjR3hoZVRvZ2JtOXVaVHRjY2x4dUlDQWdJQ0FnZlZ4eVhHNGdJQ0FnZlZ4eVhHNGdJSDFjY2x4dWZWeHlYRzRpTENKQWFXMXdiM0owSUNjdUwyTnZiRzl5Y3ljN1hISmNia0JwYlhCdmNuUWdKeTR2Wm05dWRDYzdYSEpjYmtCcGJYQnZjblFnSnk0dmFXTnZibk1uTzF4eVhHNUFhVzF3YjNKMElDY3VMMjFwZUdsdWN5YzdYSEpjYmx4eVhHNHViM1YwYkdsdVpTMXRaWE56WVdkbElIdGNjbHh1SUNBdWNtRmthWFZ6WDNOdFlXeHNLQ2s3WEhKY2JpQWdMbk5vWVdSdmQxOXNhV2RvZEY5eVpXZDFiR0Z5S0NrN1hISmNiaUFnY0c5emFYUnBiMjQ2SUdacGVHVmtPMXh5WEc0Z0lIb3RhVzVrWlhnNklEazVPVGs3WEhKY2JpQWdiM0JoWTJsMGVUb2dNQzR4TzF4eVhHNGdJSFJ2Y0RvZ0xUVXdjSGc3WEhKY2JpQWdiR1ZtZERvZ05UQWxPMXh5WEc0Z0lHaGxhV2RvZERvZ05EQndlRHRjY2x4dUlDQnRZWEpuYVc0NklEQTdYSEpjYmlBZ2NHRmtaR2x1WnpvZ01DQTFNSEI0TzF4eVhHNGdJR3hwYm1VdGFHVnBaMmgwT2lBME1IQjRPMXh5WEc0Z0lHWnZiblF0YzJsNlpUb2dRR1p2Ym5SZmMybDZaVjl6YldGc2JEdGNjbHh1SUNCaVlXTnJaM0p2ZFc1a0xXTnZiRzl5T2lCQWQyaHBkR1U3WEhKY2JpQWdZMjlzYjNJNklFQjBhR2x5WkY5MFpYaDBYMk52Ykc5eU8xeHlYRzRnSUhSeVlXNXphWFJwYjI0NklHRnNiQ0F3TGpWeklHVmhjMlV0YVc0dGIzVjBPMXh5WEc0Z0lIUnlZVzV6Wm05eWJUb2dkSEpoYm5Oc1lYUmxXQ2d0TlRBbEtUdGNjbHh1SUNCdmRtVnlabXh2ZHpvZ2FHbGtaR1Z1TzF4eVhHNWNjbHh1SUNBbVgxOWpiMjUwWlc1MElIdGNjbHh1SUNBZ0lDNWxiR3hwY0hOcGN5Z3hLVHRjY2x4dUlDQWdJRzFoY21kcGJqb2dNRHRjY2x4dUlDQWdJRzFoZUMxM2FXUjBhRG9nTnpBd2NIZzdYSEpjYmlBZ0lDQm9aV2xuYUhRNklEUXdjSGc3WEhKY2JpQWdJQ0JzYVc1bExXaGxhV2RvZERvZ05EQndlRHRjY2x4dUlDQWdJR1p2Ym5RdGMybDZaVG9nTVROd2VEdGNjbHh1SUNBZ0lHTnZiRzl5T2lCQWRHaHBjbVJmZEdWNGRGOWpiMnh2Y2p0Y2NseHVJQ0FnSUc5MlpYSm1iRzkzT2lCb2FXUmtaVzQ3WEhKY2JpQWdmVnh5WEc1Y2NseHVJQ0FtWDE5amJHOXpaU3hjY2x4dUlDQW1YMTlwWTI5dUlIdGNjbHh1SUNBZ0lIQnZjMmwwYVc5dU9pQmhZbk52YkhWMFpUdGNjbHh1SUNBZ0lIb3RhVzVrWlhnNklESTdYSEpjYmlBZ0lDQjBiM0E2SURBN1hISmNiaUFnSUNCM2FXUjBhRG9nTkRCd2VEdGNjbHh1SUNBZ0lHaGxhV2RvZERvZ05EQndlRHRjY2x4dUlDQWdJR3hwYm1VdGFHVnBaMmgwT2lBME1IQjRPMXh5WEc0Z0lDQWdkR1Y0ZEMxaGJHbG5iam9nWTJWdWRHVnlPMXh5WEc0Z0lDQWdiM1psY21ac2IzYzZJR2hwWkdSbGJqdGNjbHh1SUNCOVhISmNibHh5WEc0Z0lDWmZYMmxqYjI0Z2UxeHlYRzRnSUNBZ2JHVm1kRG9nTUR0Y2NseHVJQ0FnSUdOdmJHOXlPaUJBZDJocGRHVTdYSEpjYmx4eVhHNGdJQ0FnTG05MWRHeHBibVV0YVdOdmJpQjdYSEpjYmlBZ0lDQWdJSEJ2YzJsMGFXOXVPaUJoWW5OdmJIVjBaVHRjY2x4dUlDQWdJQ0FnZWkxcGJtUmxlRG9nTWp0Y2NseHVJQ0FnSUNBZ2RHOXdPaUExTUNVN1hISmNiaUFnSUNBZ0lHeGxablE2SURVd0pUdGNjbHh1SUNBZ0lDQWdkSEpoYm5ObWIzSnRPaUIwY21GdWMyeGhkR1VvTFRVd0pTd2dMVFV3SlNrN1hISmNiaUFnSUNCOVhISmNiaUFnZlZ4eVhHNWNjbHh1SUNBbVgxOWpiRzl6WlNCN1hISmNiaUFnSUNCeWFXZG9kRG9nTUR0Y2NseHVJQ0FnSUdOMWNuTnZjam9nY0c5cGJuUmxjanRjY2x4dUlDQWdJR052Ykc5eU9pQkFabTkxY25Sb1gzUmxlSFJmWTI5c2IzSTdYSEpjYmx4eVhHNGdJQ0FnTG05MWRHeHBibVV0YVdOdmJpQjdYSEpjYmlBZ0lDQWdJSEJ2YzJsMGFXOXVPaUJoWW5OdmJIVjBaVHRjY2x4dUlDQWdJQ0FnZWkxcGJtUmxlRG9nTWp0Y2NseHVJQ0FnSUNBZ2RHOXdPaUExTUNVN1hISmNiaUFnSUNBZ0lHeGxablE2SURVd0pUdGNjbHh1SUNBZ0lDQWdkSEpoYm5ObWIzSnRPaUIwY21GdWMyeGhkR1VvTFRVd0pTd2dMVFV3SlNrN1hISmNiaUFnSUNCOVhISmNibHh5WEc0Z0lDQWdKanBvYjNabGNpQjdYSEpjYmlBZ0lDQWdJR052Ykc5eU9pQkFkR2hwY21SZmRHVjRkRjlqYjJ4dmNqdGNjbHh1SUNBZ0lIMWNjbHh1SUNCOVhISmNibHh5WEc0Z0lDWmZhVzVtYnlCN1hISmNiaUFnSUNBdWIzVjBiR2x1WlMxdFpYTnpZV2RsWDE5cFkyOXVJSHRjY2x4dUlDQWdJQ0FnWW1GamEyZHliM1Z1WkMxamIyeHZjam9nUUhCeWFXMWhjbmxmWTI5c2IzSTdYSEpjYmlBZ0lDQjlYSEpjYmlBZ2ZWeHlYRzVjY2x4dUlDQW1YM2RoY201cGJtY2dlMXh5WEc0Z0lDQWdMbTkxZEd4cGJtVXRiV1Z6YzJGblpWOWZhV052YmlCN1hISmNiaUFnSUNBZ0lHSmhZMnRuY205MWJtUXRZMjlzYjNJNklFQjNZWEp1YVc1blgyTnZiRzl5TzF4eVhHNGdJQ0FnZlZ4eVhHNGdJSDFjY2x4dVhISmNiaUFnSmw5emRXTmpaWE56SUh0Y2NseHVJQ0FnSUM1dmRYUnNhVzVsTFcxbGMzTmhaMlZmWDJsamIyNGdlMXh5WEc0Z0lDQWdJQ0JpWVdOclozSnZkVzVrTFdOdmJHOXlPaUJBYzNWalkyVnpjMTlqYjJ4dmNqdGNjbHh1SUNBZ0lIMWNjbHh1SUNCOVhISmNibHh5WEc0Z0lDWmZaWEp5YjNJZ2UxeHlYRzRnSUNBZ0xtOTFkR3hwYm1VdGJXVnpjMkZuWlY5ZmFXTnZiaUI3WEhKY2JpQWdJQ0FnSUdKaFkydG5jbTkxYm1RdFkyOXNiM0k2SUVCa1lXNW5aWEpmWTI5c2IzSTdYSEpjYmlBZ0lDQjlYSEpjYmlBZ2ZWeHlYRzVjY2x4dUlDQW1YM0JzWVdsdUlIdGNjbHh1SUNBZ0lHMXBiaTEzYVdSMGFEb2dNVGt3Y0hnN1hISmNiaUFnSUNCd1lXUmthVzVuT2lBd0lEVXdjSGdnTUNBeE5YQjRPMXh5WEc1Y2NseHVJQ0FnSUNZdWIzVjBiR2x1WlMxdFpYTnpZV2RsSUh0Y2NseHVJQ0FnSUNBZ0psOXBibVp2SUh0Y2NseHVJQ0FnSUNBZ0lDQmliM0prWlhJdGJHVm1kRG9nTlhCNElITnZiR2xrSUVCd2NtbHRZWEo1WDJOdmJHOXlPMXh5WEc0Z0lDQWdJQ0FnSUdKaFkydG5jbTkxYm1RdFkyOXNiM0k2SUVCcGJtWnZYM1JwY0Y5aVoxOWpiMnh2Y2p0Y2NseHVJQ0FnSUNBZ2ZWeHlYRzVjY2x4dUlDQWdJQ0FnSmw5M1lYSnVhVzVuSUh0Y2NseHVJQ0FnSUNBZ0lDQmliM0prWlhJdGJHVm1kRG9nTlhCNElITnZiR2xrSUVCM1lYSnVhVzVuWDJOdmJHOXlPMXh5WEc0Z0lDQWdJQ0FnSUdKaFkydG5jbTkxYm1RdFkyOXNiM0k2SUVCM1lYSnVhVzVuWDNScGNGOWlaMTlqYjJ4dmNqdGNjbHh1SUNBZ0lDQWdmVnh5WEc1Y2NseHVJQ0FnSUNBZ0psOXpkV05qWlhOeklIdGNjbHh1SUNBZ0lDQWdJQ0JpYjNKa1pYSXRiR1ZtZERvZ05YQjRJSE52Ykdsa0lFQnpkV05qWlhOelgyTnZiRzl5TzF4eVhHNGdJQ0FnSUNBZ0lHSmhZMnRuY205MWJtUXRZMjlzYjNJNklFQnpkV05qWlhOelgzUnBjRjlpWjE5amIyeHZjanRjY2x4dUlDQWdJQ0FnZlZ4eVhHNWNjbHh1SUNBZ0lDQWdKbDlsY25KdmNpQjdYSEpjYmlBZ0lDQWdJQ0FnWW05eVpHVnlMV3hsWm5RNklEVndlQ0J6YjJ4cFpDQkFaR0Z1WjJWeVgyTnZiRzl5TzF4eVhHNGdJQ0FnSUNBZ0lHSmhZMnRuY205MWJtUXRZMjlzYjNJNklFQmtZVzVuWlhKZmRHbHdYMkpuWDJOdmJHOXlPMXh5WEc0Z0lDQWdJQ0I5WEhKY2JpQWdJQ0I5WEhKY2JseHlYRzRnSUNBZ0xtOTFkR3hwYm1VdGJXVnpjMkZuWlY5ZmFXTnZiaUI3WEhKY2JpQWdJQ0FnSUhkcFpIUm9PaUF3TzF4eVhHNGdJQ0FnSUNCa2FYTndiR0Y1T2lCdWIyNWxPMXh5WEc1Y2NseHVJQ0FnSUNBZ0xtOTFkR3hwYm1VdGFXTnZiaUI3WEhKY2JpQWdJQ0FnSUNBZ1pHbHpjR3hoZVRvZ2JtOXVaVHRjY2x4dUlDQWdJQ0FnZlZ4eVhHNGdJQ0FnZlZ4eVhHNGdJSDFjY2x4dVhISmNiaUFnSmw5c2FXZG9kQ0I3WEhKY2JpQWdJQ0J0YVc0dGQybGtkR2c2SURFNE1IQjRPMXh5WEc0Z0lDQWdjR0ZrWkdsdVp6b2dNQ0EwTUhCNE8xeHlYRzVjY2x4dUlDQWdJQ1l1YjNWMGJHbHVaUzF0WlhOellXZGxJSHRjY2x4dUlDQWdJQ0FnSmw5cGJtWnZJSHRjY2x4dUlDQWdJQ0FnSUNBdWIzVjBiR2x1WlMxdFpYTnpZV2RsWDE5cFkyOXVJSHRjY2x4dUlDQWdJQ0FnSUNBZ0lHTnZiRzl5T2lCQWNISnBiV0Z5ZVY5amIyeHZjanRjY2x4dUlDQWdJQ0FnSUNCOVhISmNiaUFnSUNBZ0lIMWNjbHh1WEhKY2JpQWdJQ0FnSUNaZmQyRnlibWx1WnlCN1hISmNiaUFnSUNBZ0lDQWdMbTkxZEd4cGJtVXRiV1Z6YzJGblpWOWZhV052YmlCN1hISmNiaUFnSUNBZ0lDQWdJQ0JqYjJ4dmNqb2dRSGRoY201cGJtZGZZMjlzYjNJN1hISmNiaUFnSUNBZ0lDQWdmVnh5WEc0Z0lDQWdJQ0I5WEhKY2JseHlYRzRnSUNBZ0lDQW1YM04xWTJObGMzTWdlMXh5WEc0Z0lDQWdJQ0FnSUM1dmRYUnNhVzVsTFcxbGMzTmhaMlZmWDJsamIyNGdlMXh5WEc0Z0lDQWdJQ0FnSUNBZ1kyOXNiM0k2SUVCemRXTmpaWE56WDJOdmJHOXlPMXh5WEc0Z0lDQWdJQ0FnSUgxY2NseHVJQ0FnSUNBZ2ZWeHlYRzVjY2x4dUlDQWdJQ0FnSmw5bGNuSnZjaUI3WEhKY2JpQWdJQ0FnSUNBZ0xtOTFkR3hwYm1VdGJXVnpjMkZuWlY5ZmFXTnZiaUI3WEhKY2JpQWdJQ0FnSUNBZ0lDQmpiMnh2Y2pvZ1FHUmhibWRsY2w5amIyeHZjanRjY2x4dUlDQWdJQ0FnSUNCOVhISmNiaUFnSUNBZ0lIMWNjbHh1SUNBZ0lIMWNjbHh1WEhKY2JpQWdJQ0F1YjNWMGJHbHVaUzF0WlhOellXZGxYMTlwWTI5dUlIdGNjbHh1SUNBZ0lDQWdZbUZqYTJkeWIzVnVaQzFqYjJ4dmNqb2dRSGRvYVhSbE8xeHlYRzRnSUNBZ2ZWeHlYRzRnSUgxY2NseHVYSEpjYmlBZ0psOXliM1Z1WkNCN1hISmNiaUFnSUNBdWNtRmthWFZ6S0RJd2NIZ3BPMXh5WEc1Y2NseHVJQ0FnSUNZdWIzVjBiR2x1WlMxdFpYTnpZV2RsSUh0Y2NseHVJQ0FnSUNBZ0psOWtaV1poZFd4MElIdGNjbHh1SUNBZ0lDQWdJQ0J0YVc0dGQybGtkR2c2SURFNE1IQjRPMXh5WEc0Z0lDQWdJQ0FnSUhCaFpHUnBibWM2SURBZ05EQndlRHRjY2x4dVhISmNiaUFnSUNBZ0lDQWdMbTkxZEd4cGJtVXRiV1Z6YzJGblpWOWZhV052YmlCN1hISmNiaUFnSUNBZ0lDQWdJQ0F1Y21Ga2FYVnpLREV3Y0hncE8xeHlYRzRnSUNBZ0lDQWdJQ0FnZEc5d09pQXhNSEI0TzF4eVhHNGdJQ0FnSUNBZ0lDQWdiR1ZtZERvZ01UQndlRHRjY2x4dUlDQWdJQ0FnSUNBZ0lIZHBaSFJvT2lBeU1IQjRPMXh5WEc0Z0lDQWdJQ0FnSUNBZ2FHVnBaMmgwT2lBeU1IQjRPMXh5WEc0Z0lDQWdJQ0FnSUNBZ2JHbHVaUzFvWldsbmFIUTZJREl3Y0hnN1hISmNiaUFnSUNBZ0lDQWdmVnh5WEc1Y2NseHVJQ0FnSUNBZ0lDQW1MbTkxZEd4cGJtVXRiV1Z6YzJGblpWOW1kV3hzTFhkcFpIUm9JSHRjY2x4dUlDQWdJQ0FnSUNBZ0lHMXBiaTEzYVdSMGFEb2dNakF3Y0hnN1hISmNiaUFnSUNBZ0lDQWdJQ0J3WVdSa2FXNW5PaUF3SURJd2NIZ2dNQ0EwTUhCNE8xeHlYRzRnSUNBZ0lDQWdJSDFjY2x4dUlDQWdJQ0FnZlZ4eVhHNWNjbHh1SUNBZ0lDQWdKbDl3YkdGcGJpQjdYSEpjYmlBZ0lDQWdJQ0FnYldsdUxYZHBaSFJvT2lBeE9UVndlRHRjY2x4dUlDQWdJQ0FnSUNCd1lXUmthVzVuT2lBd0lEUXdjSGdnTUNBeU1IQjRPMXh5WEc1Y2NseHVJQ0FnSUNBZ0lDQW1MbTkxZEd4cGJtVXRiV1Z6YzJGblpWOW1kV3hzTFhkcFpIUm9JSHRjY2x4dUlDQWdJQ0FnSUNBZ0lHMXBiaTEzYVdSMGFEb2dNakUxY0hnN1hISmNiaUFnSUNBZ0lDQWdJQ0J3WVdSa2FXNW5PaUF3SURJd2NIZzdYSEpjYmlBZ0lDQWdJQ0FnZlZ4eVhHNGdJQ0FnSUNCOVhISmNiaUFnSUNCOVhISmNiaUFnZlZ4eVhHNWNjbHh1SUNBbVgyWjFiR3d0ZDJsa2RHZ2dlMXh5WEc0Z0lDQWdiV2x1TFhkcFpIUm9PaUF5TURCd2VEdGNjbHh1SUNBZ0lIQmhaR1JwYm1jNklEQWdNVEJ3ZUNBd0lEVXdjSGc3WEhKY2JseHlYRzRnSUNBZ0ppNXZkWFJzYVc1bExXMWxjM05oWjJVZ2UxeHlYRzRnSUNBZ0lDQW1YM0JzWVdsdUlIdGNjbHh1SUNBZ0lDQWdJQ0J0YVc0dGQybGtkR2c2SURJek1IQjRPMXh5WEc0Z0lDQWdJQ0FnSUhCaFpHUnBibWM2SURBZ01UQndlQ0F3SURFMWNIZzdYSEpjYmlBZ0lDQWdJSDFjY2x4dVhISmNiaUFnSUNBZ0lDWmZiR2xuYUhRZ2UxeHlYRzRnSUNBZ0lDQWdJRzFwYmkxM2FXUjBhRG9nTWpFd2NIZzdYSEpjYmlBZ0lDQWdJQ0FnY0dGa1pHbHVaem9nTUNBeE1IQjRJREFnTkRCd2VEdGNjbHh1SUNBZ0lDQWdmVnh5WEc0Z0lDQWdmVnh5WEc0Z0lIMWNjbHh1WEhKY2JpQWdKbDkyYVhOcFlteGxJSHRjY2x4dUlDQWdJRzl3WVdOcGRIazZJREU3WEhKY2JpQWdmVnh5WEc1Y2NseHVJQ0FtWDJocFpHUmxiaUI3WEhKY2JpQWdJQ0JrYVhOd2JHRjVPaUJ1YjI1bE8xeHlYRzRnSUgxY2NseHVmVnh5WEc0aUxDSXZLaUE5UFQwOVBTQlRZM0p2Ykd4aVlYSWdQVDA5UFQwZ0tpOWNjbHh1T2pvdGQyVmlhMmwwTFhOamNtOXNiR0poY2lCN1hISmNiaUFnZDJsa2RHZzZJRGR3ZUR0Y2NseHVJQ0JvWldsbmFIUTZJRGR3ZUR0Y2NseHVJQ0F0ZDJWaWEybDBMV0p2Y21SbGNpMXlZV1JwZFhNNklEVndlRHRjY2x4dVhISmNiaUFnSmkxMGNtRmpheTF3YVdWalpTQjdYSEpjYmlBZ0lDQXRkMlZpYTJsMExXSnZjbVJsY2kxeVlXUnBkWE02SURWd2VEdGNjbHh1SUNCOVhISmNibHh5WEc0Z0lDWXRkR2gxYldJZ2UxeHlYRzRnSUNBZ0pqcDJaWEowYVdOaGJDQjdYSEpjYmlBZ0lDQWdJR0poWTJ0bmNtOTFibVF0WTI5c2IzSTZJSEpuWW1Fb01Dd2dNQ3dnTUN3Z01DNHlOU2s3WEhKY2JpQWdJQ0FnSUMxM1pXSnJhWFF0WW05eVpHVnlMWEpoWkdsMWN6b2dOWEI0TzF4eVhHNGdJQ0FnZlZ4eVhHNWNjbHh1SUNBZ0lDWTZhRzl5YVhwdmJuUmhiQ0I3WEhKY2JpQWdJQ0FnSUdKaFkydG5jbTkxYm1RdFkyOXNiM0k2SUhKblltRW9NQ3dnTUN3Z01Dd2dNQzR5TlNrN1hISmNiaUFnSUNBZ0lDMTNaV0pyYVhRdFltOXlaR1Z5TFhKaFpHbDFjem9nTlhCNE8xeHlYRzRnSUNBZ2ZWeHlYRzVjY2x4dUlDQWdJQ1k2YUc5MlpYSWdlMXh5WEc0Z0lDQWdJQ0JpWVdOclozSnZkVzVrTFdOdmJHOXlPaUJ5WjJKaEtEQXNJREFzSURBc0lEQXVNelVwTzF4eVhHNGdJQ0FnZlZ4eVhHNGdJSDFjY2x4dVhISmNiaUFnSmpwb2IzWmxjaUI3WEhKY2JpQWdJQ0JpWVdOclozSnZkVzVrTFdOdmJHOXlPaUJ5WjJKaEtEQXNJREFzSURBc0lEQXVNVFVwTzF4eVhHNGdJSDFjY2x4dWZWeHlYRzRpWFgwPSAqL1xuIl0sImZpbGUiOiJjc3MvZG9jcy5taW4uY3NzIn0= */ +/*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */button,hr,input{overflow:visible}progress,sub,sup{vertical-align:baseline}.outline-heading__anchor,.outline-icon_hidden,[hidden],template{display:none}.docs,.main{position:relative;z-index:1}.case:after,.outline-drawer__overlay{content:''}html{-webkit-text-size-adjust:100%}body{margin:0}details,main{display:block}h1{font-size:2em;margin:.67em 0}hr{-webkit-box-sizing:content-box;box-sizing:content-box;height:0}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}a{background-color:transparent}abbr[title]{border-bottom:none;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}b,strong{font-weight:bolder}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}img{border-style:none}button,input,optgroup,select,textarea{font-family:inherit;font-size:100%;line-height:1.15;margin:0}button,select{text-transform:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:ButtonText dotted 1px}fieldset{padding:.35em .75em .625em}legend{-webkit-box-sizing:border-box;box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}textarea{overflow:auto}[type=checkbox],[type=radio]{-webkit-box-sizing:border-box;box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}.docs,body,html{height:100%;overflow:hidden}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}body,html{background:#fafafa;color:#333;font-size:14px;line-height:150%;font-family:'Microsoft YaHei UI',Arial,sans-serif}.aside,code{font-family:'Source Code Pro',Consolas,Georgia,Monaco,monospace,Arial,sans-serif}a:hover,a:link,a:visited{color:#058942;text-decoration:none}a:hover{text-decoration:underline}.docs{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;-ms-flex-wrap:nowrap;flex-wrap:nowrap;width:100%;margin:0}.aside,.outline-drawer__modal,.outline-navigator_fixed,.outline-navigator_sticky{-webkit-box-orient:vertical;-webkit-box-direction:normal}.aside,.main{height:100%;overflow:auto}.aside{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-negative:0;flex-shrink:0;-ms-flex-direction:column;flex-direction:column;-ms-flex-wrap:nowrap;flex-wrap:nowrap;width:260px;margin:0;background-color:#333;color:#ddd;-webkit-box-shadow:0 0 5px 2px #ddd;box-shadow:0 0 5px 2px #ddd;-webkit-transition-duration:.3s;transition-duration:.3s}.main__button,.outline-icon,.section__dd,.section__dt{display:inline-block}.aside__nav,.main{-webkit-box-flex:1}.main{-ms-flex:1;flex:1;background-color:#fff}@media (max-width:500px){.docs{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.aside,.main{width:100%}.aside{position:fixed;z-index:3;top:0}.aside.outline-navigator_folded{left:-100%}.aside.outline-navigator_expanded{left:0}}.case,.outline-icon,.section__dl{position:relative;z-index:1}.aside__header{margin:0 auto;-ms-flex-negative:0;flex-shrink:0;overflow:hidden}.aside__nav{-ms-flex:1;flex:1;overflow:auto}.aside__h2{margin:0 auto;height:54px;line-height:54px;font-size:20px;font-weight:400;font-family:Georgia,Consolas,Arial,sans-serif;text-align:center;overflow:hidden}.aside__h3{margin:0 auto;padding:0 20px;font-size:16px;overflow:hidden}.aside__list{margin:0;padding:10px 0;overflow:hidden}.aside__item{height:32px;line-height:32px;padding:0 30px;cursor:pointer;font-size:13px;overflow:hidden}.aside-navigator{-webkit-box-flex:1;-ms-flex:1;flex:1}.aside-navigator .outline-navigator__main::-webkit-scrollbar-thumb{background-color:#666}.aside-navigator .outline-navigator__main::-webkit-scrollbar-thumb:hover{background-color:#999}.aside-navigator .outline-navigator__placeholder{background-color:#555;border-left:3px solid #fff}.aside-navigator .outline-navigator__anchor:link,.aside-navigator .outline-navigator__anchor:visited{color:#ddd;text-decoration:none}.aside-navigator .outline-navigator__anchor:hover{color:#ddd;text-decoration:underline}.aside-navigator .outline-navigator_active.outline-navigator__anchor:hover,.aside-navigator .outline-navigator_active.outline-navigator__anchor:link,.aside-navigator .outline-navigator_active.outline-navigator__anchor:visited{color:#fff}.main__footer,.main__header{margin:0 auto;padding:1em;text-align:center;overflow:hidden}.main__h1{margin:0 auto;padding-top:1em;font-size:5em;font-weight:400;line-height:2em;overflow:hidden}.main__name{color:#507afe;font-weight:400}.main__tagline{margin:1em auto;max-width:960px;line-height:1.3em;font-size:2em;color:#999;font-weight:100;overflow:hidden}.main__cdn,.section__pre{line-height:150%;background-color:#fafafa}.main__cdn{margin:2em 0;padding:2em;font-size:16px;text-align:center;border-top:1px solid #ddd;border-bottom:1px solid #ddd;color:#666;overflow:hidden}.main__download{margin:1em auto;width:200px;text-align:center;overflow:hidden}.main__button{border-radius:4px;padding:14px 29px;font-size:18px;font-family:'Source Code Pro',Consolas,Georgia,Monaco,monospace,Arial,sans-serif;background-color:#058942;overflow:hidden}.main__button:hover,.main__button:link,.main__button:visited{color:#fff;text-decoration:none}.main__footer{margin:0 3em;border-top:1px solid #ddd}.section{margin:1em 0;overflow:hidden}.section__content,.section__footer,.section__header{margin:0;padding:0 3em;overflow:hidden}.section__title{color:#666}.section__h3{color:#507afe;font-size:1.35em}.section__h4{font-size:1.1em;color:#666}.section__h5{font-size:1em;color:#999}.section__dd,.section__dl,.section__dt{margin:0;padding:0;overflow:hidden}.section__dd{color:#058942}.section__pre{margin:2em 0;padding:1em;font-size:14px;text-align:left;border:1px solid #ddd;border-radius:4px;color:#666;overflow:auto}.case,.case:after,.case__console,.case__toolbar,.section__code{overflow:hidden}.section__code{display:block;margin:0 auto}.section__footer{border-top:1px solid #ddd;margin-top:3em;background-color:#fafafa;color:#999}.section__table{margin:1em auto;width:100%;border-top:1px solid #ddd}.section__td,.section__th{padding:5px 16px;line-height:26px;border-bottom:1px solid #ddd}.section__th{text-align:center;background-color:#fafafa}@media (max-width:500px){.section__content,.section__header{padding:0 1em}}.case{display:grid;grid-template-columns:repeat(2,1fr);gap:40px;padding:1em;border-top:1px solid #ddd;border-bottom:1px solid #ddd}.case:after{position:absolute;z-index:2;top:0;left:50%;height:100%;width:0;border-left:1px solid #ddd}.case__pre,.case__textarea{font-size:13px;line-height:150%}.case__code,.case__pre,.case__textarea{font-family:'Courier New',Consolas,Georgia,Arial,sans-serif}.case__pre{margin:0;padding:1em;background-color:#fafafa;height:100%;border-radius:4px;-webkit-box-sizing:border-box;box-sizing:border-box;overflow:auto}.case__toolbar{margin:0 auto;height:36px;line-height:36px;font-size:14px;padding:0 16px;text-align:right}.case__action,.case__remove{cursor:pointer;color:#058942;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.case__action{font-size:13px;padding-left:10px}.case__action:first-child{padding-left:0}.case__remove{float:right}.case__console{margin:0 auto;height:180px;border:1px solid #ddd}.case__textarea{margin:0 auto;width:100%;height:100%;border:none;outline:0;padding:1em;-webkit-box-sizing:border-box;box-sizing:border-box;overflow:auto}.case__item,.case__list{margin:0;padding:0;list-style-type:none;overflow:hidden}.case__item,.outline-drawer__footer,.outline-drawer__main,.outline-drawer__title{padding:0 16px}.case__list{height:360px;border-top:1px solid #ddd;border-bottom:1px solid #ddd;font-size:13px;overflow:auto}.outline-drawer__title,.outline-drawer_ttb,.outline-navigator__title{border-bottom:1px solid #dcdfe6}.case__item{height:36px;line-height:36px;cursor:pointer}.outline-icon,.outline-icon__svg{width:1em;height:1em;overflow:hidden}.case__item:hover{background-color:#f7f8f9}:root{--outline-zIndex:2000;--outline-sticky-height:100%;--outline-navigator-width:100%}.outline-icon{vertical-align:middle}.outline-icon__svg{position:absolute;z-index:2;top:50%;left:50%;fill:currentcolor;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%)}::-webkit-scrollbar{width:7px;height:7px;-webkit-border-radius:5px}::-webkit-scrollbar-track-piece{-webkit-border-radius:5px}::-webkit-scrollbar-thumb:vertical{background-color:rgba(0,0,0,.25);-webkit-border-radius:5px}::-webkit-scrollbar-thumb:horizontal{background-color:rgba(0,0,0,.25);-webkit-border-radius:5px}::-webkit-scrollbar-thumb:hover{background-color:rgba(0,0,0,.35)}::-webkit-scrollbar:hover{background-color:rgba(0,0,0,.15)}.outline-heading{position:relative;z-index:1;overflow:hidden}.outline-heading__anchor:hover,.outline-heading__anchor:link,.outline-heading__anchor:visited{color:#999;text-decoration:none}.outline-heading__anchor:hover{color:#507afe}.outline-heading:hover .outline-heading__anchor{display:inline-block}.outline-heading_start:hover{overflow:visible}.outline-heading_start .outline-heading__anchor{position:absolute;z-index:2;top:50%;-webkit-transform:translateY(-50%);transform:translateY(-50%);left:-1em}.outline-drawer{position:relative;z-index:-1;top:0;left:0;margin:0;width:100%;height:100%;-webkit-box-sizing:border-box;box-sizing:border-box;visibility:hidden;overflow:hidden}.outline-drawer__modal{-webkit-box-shadow:0 0 6px 1px #dcdfe6;box-shadow:0 0 6px 1px #dcdfe6;display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;-ms-flex-wrap:nowrap;flex-wrap:nowrap;position:absolute;z-index:21;height:100%;background-color:#fff;-webkit-transition-duration:.4s;transition-duration:.4s;overflow:hidden}.outline-drawer__footer,.outline-drawer__header,.outline-drawer__main{width:100%;-webkit-box-sizing:border-box;box-sizing:border-box}.outline-drawer__footer,.outline-drawer__header{-ms-flex-negative:0;flex-shrink:0}.outline-drawer__header,.outline-drawer__title{position:relative;z-index:1;margin:0 auto;height:52px;line-height:52px;overflow:hidden}.outline-drawer__title{font-size:16px;font-weight:400;margin:0 16px;-webkit-box-sizing:border-box;box-sizing:border-box}.outline-drawer__close{position:absolute;z-index:2;top:50%;right:12px;width:20px;height:20px;line-height:20px;color:#999;font-size:20px;text-align:center;cursor:pointer;-webkit-transform:translateY(-50%);transform:translateY(-50%);overflow:hidden}.outline-drawer__close .outline-icon{position:absolute;z-index:2;top:0;left:0}.outline-drawer__close:hover{color:#666}.outline-drawer__main{-webkit-box-flex:1;-ms-flex:1;flex:1;overflow:auto}.outline-drawer__main.overflow-hidden{overflow:hidden}.outline-drawer__footer{margin:0 auto;text-align:right;overflow:hidden}.outline-drawer__overlay{position:relative;z-index:1;top:0;left:0;width:100%;height:100%;background-color:#fff;opacity:.1;overflow:hidden}.outline-drawer_ltr.outline-drawer_tiny,.outline-drawer_rtl.outline-drawer_tiny{width:280px}.outline-drawer_ltr.outline-drawer_mini,.outline-drawer_rtl.outline-drawer_mini{width:480px}.outline-drawer_ltr.outline-drawer_small,.outline-drawer_rtl.outline-drawer_small{width:540px}.outline-drawer_ltr.outline-drawer_regular,.outline-drawer_rtl.outline-drawer_regular{width:680px}.outline-drawer_ltr.outline-drawer_medium,.outline-drawer_rtl.outline-drawer_medium{width:720px}.outline-drawer_ltr.outline-drawer_large,.outline-drawer_rtl.outline-drawer_large{width:960px}.outline-drawer_rtl{border-left:1px solid #dcdfe6}.outline-drawer_rtl.outline-drawer_tiny.outline-drawer_closed{right:-290px}.outline-drawer_rtl.outline-drawer_mini.outline-drawer_closed{right:-490px}.outline-drawer_rtl.outline-drawer_small.outline-drawer_closed{right:-550px}.outline-drawer_rtl.outline-drawer_regular.outline-drawer_closed{right:-690px}.outline-drawer_rtl.outline-drawer_medium.outline-drawer_closed{right:-730px}.outline-drawer_rtl.outline-drawer_large.outline-drawer_closed{right:-970px}.outline-drawer_ltr{border-right:1px solid #dcdfe6}.outline-drawer_ltr.outline-drawer_tiny.outline-drawer_closed{left:-290px}.outline-drawer_ltr.outline-drawer_mini.outline-drawer_closed{left:-490px}.outline-drawer_ltr.outline-drawer_small.outline-drawer_closed{left:-550px}.outline-drawer_ltr.outline-drawer_regular.outline-drawer_closed{left:-690px}.outline-drawer_ltr.outline-drawer_medium.outline-drawer_closed{left:-730px}.outline-drawer_ltr.outline-drawer_large.outline-drawer_closed{left:-970px}.outline-drawer_btt,.outline-drawer_ttb{left:0;width:100%}.outline-drawer_btt.outline-drawer_tiny,.outline-drawer_ttb.outline-drawer_tiny{height:240px}.outline-drawer_btt.outline-drawer_mini,.outline-drawer_ttb.outline-drawer_mini{height:320px}.outline-drawer_btt.outline-drawer_small,.outline-drawer_ttb.outline-drawer_small{height:360px}.outline-drawer_btt.outline-drawer_regular,.outline-drawer_ttb.outline-drawer_regular{height:400px}.outline-drawer_btt.outline-drawer_medium,.outline-drawer_ttb.outline-drawer_medium{height:440px}.outline-drawer_btt.outline-drawer_large,.outline-drawer_ttb.outline-drawer_large{height:480px}.outline-drawer_ttb.outline-drawer_tiny.outline-drawer_closed{top:-250px}.outline-drawer_ttb.outline-drawer_mini.outline-drawer_closed{top:-330px}.outline-drawer_ttb.outline-drawer_small.outline-drawer_closed{top:-370px}.outline-drawer_ttb.outline-drawer_regular.outline-drawer_closed{top:-410px}.outline-drawer_ttb.outline-drawer_medium.outline-drawer_closed{top:-450px}.outline-drawer_ttb.outline-drawer_large.outline-drawer_closed{top:-490px}.outline-drawer_btt{top:initial;border-top:1px solid #dcdfe6}.outline-drawer_btt.outline-drawer_tiny.outline-drawer_closed{bottom:-250px}.outline-drawer_btt.outline-drawer_mini.outline-drawer_closed{bottom:-330px}.outline-drawer_btt.outline-drawer_small.outline-drawer_closed{bottom:-370px}.outline-drawer_btt.outline-drawer_regular.outline-drawer_closed{bottom:-410px}.outline-drawer_btt.outline-drawer_medium.outline-drawer_closed{bottom:-450px}.outline-drawer_btt.outline-drawer_large.outline-drawer_closed{bottom:-490px}.outline-drawer_opened{visibility:visible;z-index:var(--outline-zIndex)}.outline-drawer_opened.outline-drawer{position:fixed}.outline-drawer_opened.outline-drawer_rtl{right:0}.outline-drawer_opened.outline-drawer_ltr{left:0}.outline-drawer_opened.outline-drawer_ttb{top:0}.outline-drawer_opened.outline-drawer_btt{bottom:0}.outline-drawer_offset.outline-drawer_ltr,.outline-drawer_offset.outline-drawer_rtl{height:calc(100% - 4em);top:50%;-webkit-transform:translateY(-50%);transform:translateY(-50%)}.outline-drawer_offset.outline-drawer_btt,.outline-drawer_offset.outline-drawer_ttb{width:calc(100% - 4em);left:50%;-webkit-transform:translateX(-50%);transform:translateX(-50%)}.outline-drawer_offset.outline-drawer_opened.outline-drawer_rtl{right:2em}.outline-drawer_offset.outline-drawer_opened.outline-drawer_ltr{left:2em}.outline-drawer_offset.outline-drawer_opened.outline-drawer_ttb{top:2em}.outline-drawer_offset.outline-drawer_opened.outline-drawer_btt{bottom:2em}.outline-drawer_auto.outline-drawer_ltr,.outline-drawer_auto.outline-drawer_rtl{height:auto;max-height:calc(100% - 4em)}.outline-drawer_full{padding:0}.outline-navigator{position:relative;z-index:1;margin:0;width:var(--outline-navigator-width);overflow:auto}.outline-navigator-parent{-webkit-transition:.3s ease-in-out;transition:.3s ease-in-out}.outline-navigator__title{margin:0 16px;height:40px;line-height:40px;padding:0 16px;font-size:16px;font-weight:400;overflow:hidden}.outline-navigator__main{position:relative;z-index:1;margin:0;overflow:hidden}.outline-navigator__item,.outline-navigator__list,.outline-navigator__subject{position:relative;z-index:2;margin:0;padding:0;list-style-type:none;overflow:hidden}.outline-navigator__list{padding:.5em 0}.outline-navigator__subject{padding-left:1em}.outline-navigator__item{margin:0;line-height:30px;font-size:13px;overflow:hidden}.outline-navigator__placeholder{position:absolute;z-index:1;top:0;left:0;width:100%;height:30px;background-color:#f7f8f9;border-left:2px solid #058942;-webkit-transition-duration:.2s;transition-duration:.2s;-webkit-box-sizing:border-box;box-sizing:border-box;overflow:hidden}.outline-navigator__anchor{white-space:nowrap;text-overflow:ellipsis;overflow:hidden;display:block;padding:0 1.5em}.outline-navigator__anchor:hover,.outline-navigator__anchor:link,.outline-navigator__anchor:visited{text-decoration:none;color:#555}.outline-navigator__anchor:hover{color:#058942}.outline-navigator__code{padding-right:.5em}.outline-navigator_highlight.outline-navigator__anchor:hover,.outline-navigator_highlight.outline-navigator__anchor:link,.outline-navigator_highlight.outline-navigator__anchor:visited{color:#058942;font-weight:700}.outline-navigator_fixed,.outline-navigator_sticky{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-ms-flex-direction:column;flex-direction:column;z-index:var(--outline-zIndex);top:0;overflow:hidden}.outline-navigator_hidden,.outline-reader__article .outline-reader__progress,.outline-reader_hidden{display:none}.outline-navigator_fixed .outline-navigator__main,.outline-navigator_fixed .outline-navigator__title,.outline-navigator_sticky .outline-navigator__main,.outline-navigator_sticky .outline-navigator__title{-webkit-box-sizing:border-box;box-sizing:border-box}.outline-navigator_fixed .outline-navigator__title,.outline-navigator_sticky .outline-navigator__title{-ms-flex-negative:0;flex-shrink:0}.outline-navigator_fixed .outline-navigator__main,.outline-navigator_sticky .outline-navigator__main{-webkit-box-flex:1;-ms-flex:1;flex:1;overflow:auto}.outline-navigator_sticky{position:sticky;max-height:var(--outline-sticky-height)}.outline-navigator_fixed{position:fixed;max-height:100%}.outline-navigator_folded{width:0;overflow:hidden}.outline-reader__progress{position:fixed;top:0;left:0;z-index:3;height:4px;width:100%;background-color:#507afe;scale:0 1;-webkit-transform-origin:left;transform-origin:left;-webkit-animation:outline-reader-progress linear;animation:outline-reader-progress linear;animation-timeline:--ProgressTimeline}.outline-reader__paper{-webkit-box-shadow:0 0 6px 1px #ddd;box-shadow:0 0 6px 1px #ddd;margin:2em auto;max-width:1200px;padding:3.2em;-webkit-box-sizing:border-box;box-sizing:border-box;background-color:#fff;overflow:hidden}.outline-reader__title{margin:.67em 0;text-align:center;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI','PingFang SC','Hiragino Sans GB','Microsoft YaHei','Helvetica Neue','Apple Color Emoji','Segoe UI Emoji','Segoe UI Symbol',Helvetica,Arial,sans-serif;font-weight:400;line-height:1.3em;font-size:4.2em;overflow:hidden}.outline-reader_hidden.outline-reader_sibling{display:none!important}.outline-reader_hidden.outline-reader_sibling.wrapper.post{display:none}.outline-reader--reading{display:block;position:fixed;z-index:2;top:0;left:0;width:100%;height:100%;margin:0;-webkit-box-sizing:border-box;box-sizing:border-box;padding:3em 4em;background-color:#fafafa;scroll-timeline-name:--ProgressTimeline;overflow:scroll}@-webkit-keyframes outline-reader-progress{to{scale:1 1}}@keyframes outline-reader-progress{to{scale:1 1}}@media (max-width:500px){.outline-reader{overflow:hidden}.outline-reader .outline-toolbar{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-ms-flex-item-align:auto;align-self:auto;top:100%;right:0;-webkit-transform:translateY(-48px);transform:translateY(-48px);width:100%;height:48px;-webkit-box-sizing:border-box;box-sizing:border-box;border-top:1px solid #ddd;background-color:#fff;padding:0 16px}.outline-reader .outline-toolbar__button{border-radius:0;-webkit-box-flex:1;-ms-flex:1;flex:1;border:none;-webkit-box-shadow:none;box-shadow:none}.outline-reader--reading{padding:0;background-color:#fff;-webkit-box-sizing:border-box;box-sizing:border-box}.outline-reader__paper{position:relative;z-index:1;margin:0;padding:0;height:100%;-webkit-box-shadow:none;box-shadow:none;overflow:hidden}.outline-reader__title{white-space:nowrap;text-overflow:ellipsis;position:absolute;z-index:3;top:0;left:0;margin:0;width:100%;height:48px;line-height:48px;border-bottom:1px solid #ddd;font-size:1.8em;font-weight:400;background-color:#fff;overflow:hidden}.outline-reader__article{margin:48px 0;height:calc(100% - 96px);padding:0 1.25em;scroll-timeline-name:--MobileProgressTimeline;overflow-x:hidden;overflow-y:scroll}.outline-reader__article .outline-reader__progress{z-index:4;-webkit-animation:outline-reader-progress linear;animation:outline-reader-progress linear;animation-timeline:--MobileProgressTimeline;display:block}}@media print{body,html{font-size:12pt;background-color:#fff;color:#333;height:initial!important}a:hover,a:link,a:visited{text-decoration:underline!important;color:#507afe}.outline-message,.outline-toolbar,audio,video{display:none!important}table{width:100%;border-collapse:collapse}td,th{border:1px solid #dcdfe6;padding:8px 20px}.outline-reader{display:block!important;overflow:hidden}.outline-reader__progress,.outline-reader_sibling{display:none!important}.outline-reader__title{margin:13.4pt 0 28pt!important;text-align:center!important;font-size:32pt!important}.outline-reader--reading{position:relative!important;height:auto!important;padding:0!important;background-color:#fff;overflow:hidden!important}.outline-reader__paper{-webkit-box-shadow:none;box-shadow:none}.outline-reader pre{padding:1em!important;border:1px solid #ddd!important;border-radius:4px!important}.outline-reader code,.outline-reader pre{background-color:#fff!important}.outline-reader img,.outline-reader svg,.outline-reader table{-webkit-column-break-inside:avoid;-moz-column-break-inside:avoid;break-inside:avoid}}.outline-toolbar{position:fixed;z-index:99999;margin:0;-webkit-transition-duration:.3s;transition-duration:.3s;overflow:hidden}.outline-toolbar__button{-webkit-box-shadow:0 0 6px 1px #dcdfe6;box-shadow:0 0 6px 1px #dcdfe6;position:relative;z-index:1;margin:10px;width:36px;height:36px;border:1px solid #dcdfe6;border-radius:3px;-webkit-box-sizing:border-box;box-sizing:border-box;background-color:#fff;cursor:pointer;text-align:center;color:#999;-webkit-transition:all .3s .1s ease-in-out;transition:all .3s .1s ease-in-out;overflow:hidden}.outline-toolbar__button:hover{color:#058942;border-color:#058942;-webkit-transform:scale(1.35);transform:scale(1.35)}.outline-toolbar__button.hide{display:none}.outline-toolbar__anchor:hover,.outline-toolbar__anchor:link,.outline-toolbar__anchor:visited{color:#999;text-decoration:none}.outline-toolbar__anchor:hover{color:#058942}.outline-toolbar__icon{position:absolute;z-index:2;top:50%;left:50%;width:20px;height:20px;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%);fill:currentcolor;overflow:hidden}.outline-toolbar_active.outline-toolbar__button{color:#fff;background-color:#058942;border-color:#058942}.outline-toolbar_active .outline-toolbar__anchor:hover,.outline-toolbar_active .outline-toolbar__anchor:link,.outline-toolbar_active .outline-toolbar__anchor:visited,.outline-toolbar_active.outline-toolbar__button:hover{color:#fff}.outline-toolbar_rounded.outline-toolbar__button{border-radius:18px}.outline-toolbar_disabled .outline-toolbar__anchor:hover,.outline-toolbar_disabled .outline-toolbar__anchor:link,.outline-toolbar_disabled .outline-toolbar__anchor:visited,.outline-toolbar_disabled .outline-toolbar__button,.outline-toolbar_disabled.outline-toolbar__anchor:hover,.outline-toolbar_disabled.outline-toolbar__anchor:link,.outline-toolbar_disabled.outline-toolbar__anchor:visited,.outline-toolbar_disabled.outline-toolbar__button{cursor:not-allowed;color:#999;border-color:#999}.outline-toolbar_disabled .outline-toolbar__anchor:hover:hover,.outline-toolbar_disabled .outline-toolbar__anchor:link:hover,.outline-toolbar_disabled .outline-toolbar__anchor:visited:hover,.outline-toolbar_disabled .outline-toolbar__button:hover,.outline-toolbar_disabled.outline-toolbar__anchor:hover:hover,.outline-toolbar_disabled.outline-toolbar__anchor:link:hover,.outline-toolbar_disabled.outline-toolbar__anchor:visited:hover,.outline-toolbar_disabled.outline-toolbar__button:hover{color:#999;border-color:#999}.outline-toolbar_disabled .outline-toolbar__button,.outline-toolbar_disabled.outline-toolbar__button{background-color:#f5f5f5}.outline-toolbar_btt,.outline-toolbar_ttb{left:50%;-webkit-transform:translateX(-50%);transform:translateX(-50%)}.outline-toolbar_btt .outline-toolbar__button,.outline-toolbar_ttb .outline-toolbar__button{display:inline-block}.outline-toolbar_ttb{top:12px}.outline-toolbar_ttb.outline-toolbar_hidden{top:-56px}.outline-toolbar_btt{bottom:12px}.outline-toolbar_btt.outline-toolbar_hidden{bottom:-56px}.outline-toolbar_ltr,.outline-toolbar_rtl{-webkit-transform:translateY(-50%);transform:translateY(-50%);width:56px}.outline-toolbar_rtl{top:50%;right:12px}.outline-toolbar_rtl.outline-toolbar_hidden{right:-86px}.outline-toolbar_ltr{top:50%;left:12px}.outline-toolbar_ltr.outline-toolbar_hidden{left:-86px}.outline-toolbar_btt .outline-toolbar__button.outline-toolbar_hidden,.outline-toolbar_ltr .outline-toolbar__button.outline-toolbar_hidden,.outline-toolbar_rtl .outline-toolbar__button.outline-toolbar_hidden,.outline-toolbar_ttb .outline-toolbar__button.outline-toolbar_hidden{display:none} +/*# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlcyI6WyJjc3MvZG9jcy5jc3MiXSwic291cmNlc0NvbnRlbnQiOlsiLyohIG5vcm1hbGl6ZS5jc3MgdjguMC4xIHwgTUlUIExpY2Vuc2UgfCBnaXRodWIuY29tL25lY29sYXMvbm9ybWFsaXplLmNzcyAqL1xuLyogRG9jdW1lbnRcbiAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXG4vKipcbiAqIDEuIENvcnJlY3QgdGhlIGxpbmUgaGVpZ2h0IGluIGFsbCBicm93c2Vycy5cbiAqIDIuIFByZXZlbnQgYWRqdXN0bWVudHMgb2YgZm9udCBzaXplIGFmdGVyIG9yaWVudGF0aW9uIGNoYW5nZXMgaW4gaU9TLlxuICovXG5odG1sIHtcbiAgbGluZS1oZWlnaHQ6IDEuMTU7XG4gIC8qIDEgKi9cbiAgLXdlYmtpdC10ZXh0LXNpemUtYWRqdXN0OiAxMDAlO1xuICAvKiAyICovXG59XG4vKiBTZWN0aW9uc1xuICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cbi8qKlxuICogUmVtb3ZlIHRoZSBtYXJnaW4gaW4gYWxsIGJyb3dzZXJzLlxuICovXG5ib2R5IHtcbiAgbWFyZ2luOiAwO1xufVxuLyoqXG4gKiBSZW5kZXIgdGhlIGBtYWluYCBlbGVtZW50IGNvbnNpc3RlbnRseSBpbiBJRS5cbiAqL1xubWFpbiB7XG4gIGRpc3BsYXk6IGJsb2NrO1xufVxuLyoqXG4gKiBDb3JyZWN0IHRoZSBmb250IHNpemUgYW5kIG1hcmdpbiBvbiBgaDFgIGVsZW1lbnRzIHdpdGhpbiBgc2VjdGlvbmAgYW5kXG4gKiBgYXJ0aWNsZWAgY29udGV4dHMgaW4gQ2hyb21lLCBGaXJlZm94LCBhbmQgU2FmYXJpLlxuICovXG5oMSB7XG4gIGZvbnQtc2l6ZTogMmVtO1xuICBtYXJnaW46IDAuNjdlbSAwO1xufVxuLyogR3JvdXBpbmcgY29udGVudFxuICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cbi8qKlxuICogMS4gQWRkIHRoZSBjb3JyZWN0IGJveCBzaXppbmcgaW4gRmlyZWZveC5cbiAqIDIuIFNob3cgdGhlIG92ZXJmbG93IGluIEVkZ2UgYW5kIElFLlxuICovXG5ociB7XG4gIC13ZWJraXQtYm94LXNpemluZzogY29udGVudC1ib3g7XG4gICAgICAgICAgYm94LXNpemluZzogY29udGVudC1ib3g7XG4gIC8qIDEgKi9cbiAgaGVpZ2h0OiAwO1xuICAvKiAxICovXG4gIG92ZXJmbG93OiB2aXNpYmxlO1xuICAvKiAyICovXG59XG4vKipcbiAqIDEuIENvcnJlY3QgdGhlIGluaGVyaXRhbmNlIGFuZCBzY2FsaW5nIG9mIGZvbnQgc2l6ZSBpbiBhbGwgYnJvd3NlcnMuXG4gKiAyLiBDb3JyZWN0IHRoZSBvZGQgYGVtYCBmb250IHNpemluZyBpbiBhbGwgYnJvd3NlcnMuXG4gKi9cbnByZSB7XG4gIGZvbnQtZmFtaWx5OiBtb25vc3BhY2UsIG1vbm9zcGFjZTtcbiAgLyogMSAqL1xuICBmb250LXNpemU6IDFlbTtcbiAgLyogMiAqL1xufVxuLyogVGV4dC1sZXZlbCBzZW1hbnRpY3NcbiAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXG4vKipcbiAqIFJlbW92ZSB0aGUgZ3JheSBiYWNrZ3JvdW5kIG9uIGFjdGl2ZSBsaW5rcyBpbiBJRSAxMC5cbiAqL1xuYSB7XG4gIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50O1xufVxuLyoqXG4gKiAxLiBSZW1vdmUgdGhlIGJvdHRvbSBib3JkZXIgaW4gQ2hyb21lIDU3LVxuICogMi4gQWRkIHRoZSBjb3JyZWN0IHRleHQgZGVjb3JhdGlvbiBpbiBDaHJvbWUsIEVkZ2UsIElFLCBPcGVyYSwgYW5kIFNhZmFyaS5cbiAqL1xuYWJiclt0aXRsZV0ge1xuICBib3JkZXItYm90dG9tOiBub25lO1xuICAvKiAxICovXG4gIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lO1xuICAvKiAyICovXG4gIC13ZWJraXQtdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmUgZG90dGVkO1xuICAgICAgICAgIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lIGRvdHRlZDtcbiAgLyogMiAqL1xufVxuLyoqXG4gKiBBZGQgdGhlIGNvcnJlY3QgZm9udCB3ZWlnaHQgaW4gQ2hyb21lLCBFZGdlLCBhbmQgU2FmYXJpLlxuICovXG5iLFxuc3Ryb25nIHtcbiAgZm9udC13ZWlnaHQ6IGJvbGRlcjtcbn1cbi8qKlxuICogMS4gQ29ycmVjdCB0aGUgaW5oZXJpdGFuY2UgYW5kIHNjYWxpbmcgb2YgZm9udCBzaXplIGluIGFsbCBicm93c2Vycy5cbiAqIDIuIENvcnJlY3QgdGhlIG9kZCBgZW1gIGZvbnQgc2l6aW5nIGluIGFsbCBicm93c2Vycy5cbiAqL1xuY29kZSxcbmtiZCxcbnNhbXAge1xuICBmb250LWZhbWlseTogbW9ub3NwYWNlLCBtb25vc3BhY2U7XG4gIC8qIDEgKi9cbiAgZm9udC1zaXplOiAxZW07XG4gIC8qIDIgKi9cbn1cbi8qKlxuICogQWRkIHRoZSBjb3JyZWN0IGZvbnQgc2l6ZSBpbiBhbGwgYnJvd3NlcnMuXG4gKi9cbnNtYWxsIHtcbiAgZm9udC1zaXplOiA4MCU7XG59XG4vKipcbiAqIFByZXZlbnQgYHN1YmAgYW5kIGBzdXBgIGVsZW1lbnRzIGZyb20gYWZmZWN0aW5nIHRoZSBsaW5lIGhlaWdodCBpblxuICogYWxsIGJyb3dzZXJzLlxuICovXG5zdWIsXG5zdXAge1xuICBmb250LXNpemU6IDc1JTtcbiAgbGluZS1oZWlnaHQ6IDA7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgdmVydGljYWwtYWxpZ246IGJhc2VsaW5lO1xufVxuc3ViIHtcbiAgYm90dG9tOiAtMC4yNWVtO1xufVxuc3VwIHtcbiAgdG9wOiAtMC41ZW07XG59XG4vKiBFbWJlZGRlZCBjb250ZW50XG4gICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xuLyoqXG4gKiBSZW1vdmUgdGhlIGJvcmRlciBvbiBpbWFnZXMgaW5zaWRlIGxpbmtzIGluIElFIDEwLlxuICovXG5pbWcge1xuICBib3JkZXItc3R5bGU6IG5vbmU7XG59XG4vKiBGb3Jtc1xuICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cbi8qKlxuICogMS4gQ2hhbmdlIHRoZSBmb250IHN0eWxlcyBpbiBhbGwgYnJvd3NlcnMuXG4gKiAyLiBSZW1vdmUgdGhlIG1hcmdpbiBpbiBGaXJlZm94IGFuZCBTYWZhcmkuXG4gKi9cbmJ1dHRvbixcbmlucHV0LFxub3B0Z3JvdXAsXG5zZWxlY3QsXG50ZXh0YXJlYSB7XG4gIGZvbnQtZmFtaWx5OiBpbmhlcml0O1xuICAvKiAxICovXG4gIGZvbnQtc2l6ZTogMTAwJTtcbiAgLyogMSAqL1xuICBsaW5lLWhlaWdodDogMS4xNTtcbiAgLyogMSAqL1xuICBtYXJnaW46IDA7XG4gIC8qIDIgKi9cbn1cbi8qKlxuICogU2hvdyB0aGUgb3ZlcmZsb3cgaW4gSUUuXG4gKiAxLiBTaG93IHRoZSBvdmVyZmxvdyBpbiBFZGdlLlxuICovXG5idXR0b24sXG5pbnB1dCB7XG4gIC8qIDEgKi9cbiAgb3ZlcmZsb3c6IHZpc2libGU7XG59XG4vKipcbiAqIFJlbW92ZSB0aGUgaW5oZXJpdGFuY2Ugb2YgdGV4dCB0cmFuc2Zvcm0gaW4gRWRnZSwgRmlyZWZveCwgYW5kIElFLlxuICogMS4gUmVtb3ZlIHRoZSBpbmhlcml0YW5jZSBvZiB0ZXh0IHRyYW5zZm9ybSBpbiBGaXJlZm94LlxuICovXG5idXR0b24sXG5zZWxlY3Qge1xuICAvKiAxICovXG4gIHRleHQtdHJhbnNmb3JtOiBub25lO1xufVxuLyoqXG4gKiBDb3JyZWN0IHRoZSBpbmFiaWxpdHkgdG8gc3R5bGUgY2xpY2thYmxlIHR5cGVzIGluIGlPUyBhbmQgU2FmYXJpLlxuICovXG5idXR0b24sXG5bdHlwZT0nYnV0dG9uJ10sXG5bdHlwZT0ncmVzZXQnXSxcblt0eXBlPSdzdWJtaXQnXSB7XG4gIC13ZWJraXQtYXBwZWFyYW5jZTogYnV0dG9uO1xufVxuLyoqXG4gKiBSZW1vdmUgdGhlIGlubmVyIGJvcmRlciBhbmQgcGFkZGluZyBpbiBGaXJlZm94LlxuICovXG5idXR0b246Oi1tb3otZm9jdXMtaW5uZXIsXG5bdHlwZT0nYnV0dG9uJ106Oi1tb3otZm9jdXMtaW5uZXIsXG5bdHlwZT0ncmVzZXQnXTo6LW1vei1mb2N1cy1pbm5lcixcblt0eXBlPSdzdWJtaXQnXTo6LW1vei1mb2N1cy1pbm5lciB7XG4gIGJvcmRlci1zdHlsZTogbm9uZTtcbiAgcGFkZGluZzogMDtcbn1cbi8qKlxuICogUmVzdG9yZSB0aGUgZm9jdXMgc3R5bGVzIHVuc2V0IGJ5IHRoZSBwcmV2aW91cyBydWxlLlxuICovXG5idXR0b246LW1vei1mb2N1c3JpbmcsXG5bdHlwZT0nYnV0dG9uJ106LW1vei1mb2N1c3JpbmcsXG5bdHlwZT0ncmVzZXQnXTotbW96LWZvY3VzcmluZyxcblt0eXBlPSdzdWJtaXQnXTotbW96LWZvY3VzcmluZyB7XG4gIG91dGxpbmU6IDFweCBkb3R0ZWQgQnV0dG9uVGV4dDtcbn1cbi8qKlxuICogQ29ycmVjdCB0aGUgcGFkZGluZyBpbiBGaXJlZm94LlxuICovXG5maWVsZHNldCB7XG4gIHBhZGRpbmc6IDAuMzVlbSAwLjc1ZW0gMC42MjVlbTtcbn1cbi8qKlxuICogMS4gQ29ycmVjdCB0aGUgdGV4dCB3cmFwcGluZyBpbiBFZGdlIGFuZCBJRS5cbiAqIDIuIENvcnJlY3QgdGhlIGNvbG9yIGluaGVyaXRhbmNlIGZyb20gYGZpZWxkc2V0YCBlbGVtZW50cyBpbiBJRS5cbiAqIDMuIFJlbW92ZSB0aGUgcGFkZGluZyBzbyBkZXZlbG9wZXJzIGFyZSBub3QgY2F1Z2h0IG91dCB3aGVuIHRoZXkgemVybyBvdXRcbiAqICAgIGBmaWVsZHNldGAgZWxlbWVudHMgaW4gYWxsIGJyb3dzZXJzLlxuICovXG5sZWdlbmQge1xuICAtd2Via2l0LWJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgLyogMSAqL1xuICBjb2xvcjogaW5oZXJpdDtcbiAgLyogMiAqL1xuICBkaXNwbGF5OiB0YWJsZTtcbiAgLyogMSAqL1xuICBtYXgtd2lkdGg6IDEwMCU7XG4gIC8qIDEgKi9cbiAgcGFkZGluZzogMDtcbiAgLyogMyAqL1xuICB3aGl0ZS1zcGFjZTogbm9ybWFsO1xuICAvKiAxICovXG59XG4vKipcbiAqIEFkZCB0aGUgY29ycmVjdCB2ZXJ0aWNhbCBhbGlnbm1lbnQgaW4gQ2hyb21lLCBGaXJlZm94LCBhbmQgT3BlcmEuXG4gKi9cbnByb2dyZXNzIHtcbiAgdmVydGljYWwtYWxpZ246IGJhc2VsaW5lO1xufVxuLyoqXG4gKiBSZW1vdmUgdGhlIGRlZmF1bHQgdmVydGljYWwgc2Nyb2xsYmFyIGluIElFIDEwKy5cbiAqL1xudGV4dGFyZWEge1xuICBvdmVyZmxvdzogYXV0bztcbn1cbi8qKlxuICogMS4gQWRkIHRoZSBjb3JyZWN0IGJveCBzaXppbmcgaW4gSUUgMTAuXG4gKiAyLiBSZW1vdmUgdGhlIHBhZGRpbmcgaW4gSUUgMTAuXG4gKi9cblt0eXBlPSdjaGVja2JveCddLFxuW3R5cGU9J3JhZGlvJ10ge1xuICAtd2Via2l0LWJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgLyogMSAqL1xuICBwYWRkaW5nOiAwO1xuICAvKiAyICovXG59XG4vKipcbiAqIENvcnJlY3QgdGhlIGN1cnNvciBzdHlsZSBvZiBpbmNyZW1lbnQgYW5kIGRlY3JlbWVudCBidXR0b25zIGluIENocm9tZS5cbiAqL1xuW3R5cGU9J251bWJlciddOjotd2Via2l0LWlubmVyLXNwaW4tYnV0dG9uLFxuW3R5cGU9J251bWJlciddOjotd2Via2l0LW91dGVyLXNwaW4tYnV0dG9uIHtcbiAgaGVpZ2h0OiBhdXRvO1xufVxuLyoqXG4gKiAxLiBDb3JyZWN0IHRoZSBvZGQgYXBwZWFyYW5jZSBpbiBDaHJvbWUgYW5kIFNhZmFyaS5cbiAqIDIuIENvcnJlY3QgdGhlIG91dGxpbmUgc3R5bGUgaW4gU2FmYXJpLlxuICovXG5bdHlwZT0nc2VhcmNoJ10ge1xuICAtd2Via2l0LWFwcGVhcmFuY2U6IHRleHRmaWVsZDtcbiAgLyogMSAqL1xuICBvdXRsaW5lLW9mZnNldDogLTJweDtcbiAgLyogMiAqL1xufVxuLyoqXG4gKiBSZW1vdmUgdGhlIGlubmVyIHBhZGRpbmcgaW4gQ2hyb21lIGFuZCBTYWZhcmkgb24gbWFjT1MuXG4gKi9cblt0eXBlPSdzZWFyY2gnXTo6LXdlYmtpdC1zZWFyY2gtZGVjb3JhdGlvbiB7XG4gIC13ZWJraXQtYXBwZWFyYW5jZTogbm9uZTtcbn1cbi8qKlxuICogMS4gQ29ycmVjdCB0aGUgaW5hYmlsaXR5IHRvIHN0eWxlIGNsaWNrYWJsZSB0eXBlcyBpbiBpT1MgYW5kIFNhZmFyaS5cbiAqIDIuIENoYW5nZSBmb250IHByb3BlcnRpZXMgdG8gYGluaGVyaXRgIGluIFNhZmFyaS5cbiAqL1xuOjotd2Via2l0LWZpbGUtdXBsb2FkLWJ1dHRvbiB7XG4gIC13ZWJraXQtYXBwZWFyYW5jZTogYnV0dG9uO1xuICAvKiAxICovXG4gIGZvbnQ6IGluaGVyaXQ7XG4gIC8qIDIgKi9cbn1cbi8qIEludGVyYWN0aXZlXG4gICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xuLypcbiAqIEFkZCB0aGUgY29ycmVjdCBkaXNwbGF5IGluIEVkZ2UsIElFIDEwKywgYW5kIEZpcmVmb3guXG4gKi9cbmRldGFpbHMge1xuICBkaXNwbGF5OiBibG9jaztcbn1cbi8qXG4gKiBBZGQgdGhlIGNvcnJlY3QgZGlzcGxheSBpbiBhbGwgYnJvd3NlcnMuXG4gKi9cbnN1bW1hcnkge1xuICBkaXNwbGF5OiBsaXN0LWl0ZW07XG59XG4vKiBNaXNjXG4gICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xuLyoqXG4gKiBBZGQgdGhlIGNvcnJlY3QgZGlzcGxheSBpbiBJRSAxMCsuXG4gKi9cbnRlbXBsYXRlIHtcbiAgZGlzcGxheTogbm9uZTtcbn1cbi8qKlxuICogQWRkIHRoZSBjb3JyZWN0IGRpc3BsYXkgaW4gSUUgMTAuXG4gKi9cbltoaWRkZW5dIHtcbiAgZGlzcGxheTogbm9uZTtcbn1cbi8qID09PT09IEJhc2UgPT09PT0gKi9cbmh0bWwsXG5ib2R5IHtcbiAgaGVpZ2h0OiAxMDAlO1xuICBiYWNrZ3JvdW5kOiAjZmFmYWZhO1xuICBjb2xvcjogIzMzMztcbiAgZm9udC1zaXplOiAxNHB4O1xuICBsaW5lLWhlaWdodDogMTUwJTtcbiAgZm9udC1mYW1pbHk6ICdNaWNyb3NvZnQgWWFIZWkgVUknLCBBcmlhbCwgc2Fucy1zZXJpZjtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbmE6bGluayxcbmE6dmlzaXRlZCxcbmE6aG92ZXIge1xuICBjb2xvcjogIzA1ODk0MjtcbiAgdGV4dC1kZWNvcmF0aW9uOiBub25lO1xufVxuYTpob3ZlciB7XG4gIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lO1xufVxuY29kZSB7XG4gIGZvbnQtZmFtaWx5OiAnU291cmNlIENvZGUgUHJvJywgQ29uc29sYXMsIEdlb3JnaWEsIE1vbmFjbywgbW9ub3NwYWNlLCBBcmlhbCwgc2Fucy1zZXJpZjtcbn1cbi8qID09PT09IFNjcm9sbGJhciA9PT09PSAqL1xuOjotd2Via2l0LXNjcm9sbGJhciB7XG4gIHdpZHRoOiA3cHg7XG4gIGhlaWdodDogN3B4O1xuICAtd2Via2l0LWJvcmRlci1yYWRpdXM6IDVweDtcbn1cbjo6LXdlYmtpdC1zY3JvbGxiYXItdHJhY2stcGllY2Uge1xuICAtd2Via2l0LWJvcmRlci1yYWRpdXM6IDVweDtcbn1cbjo6LXdlYmtpdC1zY3JvbGxiYXItdGh1bWI6dmVydGljYWwge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuMjUpO1xuICAtd2Via2l0LWJvcmRlci1yYWRpdXM6IDVweDtcbn1cbjo6LXdlYmtpdC1zY3JvbGxiYXItdGh1bWI6aG9yaXpvbnRhbCB7XG4gIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMCwgMCwgMCwgMC4yNSk7XG4gIC13ZWJraXQtYm9yZGVyLXJhZGl1czogNXB4O1xufVxuOjotd2Via2l0LXNjcm9sbGJhcjpob3ZlciB7XG4gIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMCwgMCwgMCwgMC4xNSk7XG59XG46Oi13ZWJraXQtc2Nyb2xsYmFyLXRodW1iOmhvdmVyIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjM1KTtcbn1cbi8qIExheW91dCAqL1xuLmRvY3Mge1xuICBkaXNwbGF5OiAtd2Via2l0LWJveDtcbiAgZGlzcGxheTogLW1zLWZsZXhib3g7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIC13ZWJraXQtYm94LW9yaWVudDogaG9yaXpvbnRhbDtcbiAgLXdlYmtpdC1ib3gtZGlyZWN0aW9uOiBub3JtYWw7XG4gICAgICAtbXMtZmxleC1kaXJlY3Rpb246IHJvdztcbiAgICAgICAgICBmbGV4LWRpcmVjdGlvbjogcm93O1xuICAtbXMtZmxleC13cmFwOiBub3dyYXA7XG4gICAgICBmbGV4LXdyYXA6IG5vd3JhcDtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICB6LWluZGV4OiAxO1xuICBoZWlnaHQ6IDEwMCU7XG4gIHdpZHRoOiAxMDAlO1xuICBtYXJnaW46IDA7XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4vKiBBc2lkZSAqL1xuLmFzaWRlIHtcbiAgZGlzcGxheTogLXdlYmtpdC1ib3g7XG4gIGRpc3BsYXk6IC1tcy1mbGV4Ym94O1xuICBkaXNwbGF5OiBmbGV4O1xuICAtbXMtZmxleC1uZWdhdGl2ZTogMDtcbiAgICAgIGZsZXgtc2hyaW5rOiAwO1xuICAtd2Via2l0LWJveC1vcmllbnQ6IHZlcnRpY2FsO1xuICAtd2Via2l0LWJveC1kaXJlY3Rpb246IG5vcm1hbDtcbiAgICAgIC1tcy1mbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gIC1tcy1mbGV4LXdyYXA6IG5vd3JhcDtcbiAgICAgIGZsZXgtd3JhcDogbm93cmFwO1xuICB3aWR0aDogMjYwcHg7XG4gIG1hcmdpbjogMDtcbiAgaGVpZ2h0OiAxMDAlO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjMzMzO1xuICBjb2xvcjogI2RkZDtcbiAgLXdlYmtpdC1ib3gtc2hhZG93OiAwIDAgNXB4IDJweCAjZGRkO1xuICAgICAgICAgIGJveC1zaGFkb3c6IDAgMCA1cHggMnB4ICNkZGQ7XG4gIC13ZWJraXQtdHJhbnNpdGlvbi1kdXJhdGlvbjogMC4zcztcbiAgICAgICAgICB0cmFuc2l0aW9uLWR1cmF0aW9uOiAwLjNzO1xuICBvdmVyZmxvdzogYXV0bztcbn1cbi8qIE1haW4gKi9cbi5tYWluIHtcbiAgLXdlYmtpdC1ib3gtZmxleDogMTtcbiAgICAgIC1tcy1mbGV4OiAxO1xuICAgICAgICAgIGZsZXg6IDE7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgei1pbmRleDogMTtcbiAgaGVpZ2h0OiAxMDAlO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmO1xuICBvdmVyZmxvdzogYXV0bztcbn1cbkBtZWRpYSAobWF4LXdpZHRoOiA1MDBweCkge1xuICAuZG9jcyB7XG4gICAgLXdlYmtpdC1ib3gtb3JpZW50OiB2ZXJ0aWNhbDtcbiAgICAtd2Via2l0LWJveC1kaXJlY3Rpb246IG5vcm1hbDtcbiAgICAgICAgLW1zLWZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICB9XG4gIC5hc2lkZSxcbiAgLm1haW4ge1xuICAgIHdpZHRoOiAxMDAlO1xuICB9XG4gIC5hc2lkZSB7XG4gICAgcG9zaXRpb246IGZpeGVkO1xuICAgIHotaW5kZXg6IDM7XG4gICAgdG9wOiAwO1xuICB9XG4gIC5hc2lkZS5vdXRsaW5lLW5hdmlnYXRvcl9mb2xkZWQge1xuICAgIGxlZnQ6IC0xMDAlO1xuICB9XG4gIC5hc2lkZS5vdXRsaW5lLW5hdmlnYXRvcl9leHBhbmRlZCB7XG4gICAgbGVmdDogMDtcbiAgfVxufVxuLmFzaWRlIHtcbiAgZm9udC1mYW1pbHk6ICdTb3VyY2UgQ29kZSBQcm8nLCBDb25zb2xhcywgR2VvcmdpYSwgTW9uYWNvLCBtb25vc3BhY2UsIEFyaWFsLCBzYW5zLXNlcmlmO1xufVxuLmFzaWRlX19oZWFkZXIge1xuICBtYXJnaW46IDAgYXV0bztcbiAgLW1zLWZsZXgtbmVnYXRpdmU6IDA7XG4gICAgICBmbGV4LXNocmluazogMDtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi5hc2lkZV9fbmF2IHtcbiAgLXdlYmtpdC1ib3gtZmxleDogMTtcbiAgICAgIC1tcy1mbGV4OiAxO1xuICAgICAgICAgIGZsZXg6IDE7XG4gIG92ZXJmbG93OiBhdXRvO1xufVxuLmFzaWRlX19oMiB7XG4gIG1hcmdpbjogMCBhdXRvO1xuICBoZWlnaHQ6IDU0cHg7XG4gIGxpbmUtaGVpZ2h0OiA1NHB4O1xuICBmb250LXNpemU6IDIwcHg7XG4gIGZvbnQtd2VpZ2h0OiBub3JtYWw7XG4gIGZvbnQtZmFtaWx5OiBHZW9yZ2lhLCBDb25zb2xhcywgQXJpYWwsIHNhbnMtc2VyaWY7XG4gIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi5hc2lkZV9faDMge1xuICBtYXJnaW46IDAgYXV0bztcbiAgcGFkZGluZzogMCAyMHB4O1xuICBmb250LXNpemU6IDE2cHg7XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4uYXNpZGVfX2xpc3Qge1xuICBtYXJnaW46IDA7XG4gIHBhZGRpbmc6IDEwcHggMDtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi5hc2lkZV9faXRlbSB7XG4gIGhlaWdodDogMzJweDtcbiAgbGluZS1oZWlnaHQ6IDMycHg7XG4gIHBhZGRpbmc6IDAgMzBweDtcbiAgY3Vyc29yOiBwb2ludGVyO1xuICBmb250LXNpemU6IDEzcHg7XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4uYXNpZGUtbmF2aWdhdG9yIHtcbiAgLXdlYmtpdC1ib3gtZmxleDogMTtcbiAgICAgIC1tcy1mbGV4OiAxO1xuICAgICAgICAgIGZsZXg6IDE7XG59XG4uYXNpZGUtbmF2aWdhdG9yIC5vdXRsaW5lLW5hdmlnYXRvcl9fbWFpbjo6LXdlYmtpdC1zY3JvbGxiYXItdGh1bWIge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjNjY2O1xufVxuLmFzaWRlLW5hdmlnYXRvciAub3V0bGluZS1uYXZpZ2F0b3JfX21haW46Oi13ZWJraXQtc2Nyb2xsYmFyLXRodW1iOmhvdmVyIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogIzk5OTtcbn1cbi5hc2lkZS1uYXZpZ2F0b3IgLm91dGxpbmUtbmF2aWdhdG9yX19wbGFjZWhvbGRlciB7XG4gIGJhY2tncm91bmQtY29sb3I6ICM1NTU7XG4gIGJvcmRlci1sZWZ0OiAzcHggc29saWQgI2ZmZjtcbn1cbi5hc2lkZS1uYXZpZ2F0b3IgLm91dGxpbmUtbmF2aWdhdG9yX19hbmNob3I6bGluayB7XG4gIGNvbG9yOiAjZGRkO1xuICB0ZXh0LWRlY29yYXRpb246IG5vbmU7XG59XG4uYXNpZGUtbmF2aWdhdG9yIC5vdXRsaW5lLW5hdmlnYXRvcl9fYW5jaG9yOnZpc2l0ZWQge1xuICBjb2xvcjogI2RkZDtcbiAgdGV4dC1kZWNvcmF0aW9uOiBub25lO1xufVxuLmFzaWRlLW5hdmlnYXRvciAub3V0bGluZS1uYXZpZ2F0b3JfX2FuY2hvcjpob3ZlciB7XG4gIGNvbG9yOiAjZGRkO1xuICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTtcbn1cbi5hc2lkZS1uYXZpZ2F0b3IgLm91dGxpbmUtbmF2aWdhdG9yX2FjdGl2ZS5vdXRsaW5lLW5hdmlnYXRvcl9fYW5jaG9yOmxpbmssXG4uYXNpZGUtbmF2aWdhdG9yIC5vdXRsaW5lLW5hdmlnYXRvcl9hY3RpdmUub3V0bGluZS1uYXZpZ2F0b3JfX2FuY2hvcjp2aXNpdGVkLFxuLmFzaWRlLW5hdmlnYXRvciAub3V0bGluZS1uYXZpZ2F0b3JfYWN0aXZlLm91dGxpbmUtbmF2aWdhdG9yX19hbmNob3I6aG92ZXIge1xuICBjb2xvcjogI2ZmZjtcbn1cbi5tYWluX19oZWFkZXIsXG4ubWFpbl9fZm9vdGVyIHtcbiAgbWFyZ2luOiAwIGF1dG87XG4gIHBhZGRpbmc6IDFlbTtcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLm1haW5fX2gxIHtcbiAgbWFyZ2luOiAwIGF1dG87XG4gIHBhZGRpbmctdG9wOiAxZW07XG4gIGZvbnQtc2l6ZTogNWVtO1xuICBmb250LXdlaWdodDogbm9ybWFsO1xuICBsaW5lLWhlaWdodDogMmVtO1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLm1haW5fX25hbWUge1xuICBjb2xvcjogIzUwN2FmZTtcbiAgZm9udC13ZWlnaHQ6IG5vcm1hbDtcbn1cbi5tYWluX190YWdsaW5lIHtcbiAgbWFyZ2luOiAxZW0gYXV0bztcbiAgbWF4LXdpZHRoOiA5NjBweDtcbiAgbGluZS1oZWlnaHQ6IDEuM2VtO1xuICBmb250LXNpemU6IDJlbTtcbiAgY29sb3I6ICM5OTk7XG4gIGZvbnQtd2VpZ2h0OiAxMDA7XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4ubWFpbl9fY2RuIHtcbiAgbWFyZ2luOiAyZW0gMDtcbiAgcGFkZGluZzogMmVtO1xuICBmb250LXNpemU6IDE2cHg7XG4gIGxpbmUtaGVpZ2h0OiAxNTAlO1xuICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gIGJhY2tncm91bmQtY29sb3I6ICNmYWZhZmE7XG4gIGJvcmRlci10b3A6IDFweCBzb2xpZCAjZGRkO1xuICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI2RkZDtcbiAgY29sb3I6ICM2NjY7XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4ubWFpbl9fZG93bmxvYWQge1xuICBtYXJnaW46IDFlbSBhdXRvO1xuICB3aWR0aDogMjAwcHg7XG4gIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi5tYWluX19idXR0b24ge1xuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gIGJvcmRlci1yYWRpdXM6IDRweDtcbiAgcGFkZGluZzogMTRweCAyOXB4O1xuICBmb250LXNpemU6IDE4cHg7XG4gIGZvbnQtZmFtaWx5OiAnU291cmNlIENvZGUgUHJvJywgQ29uc29sYXMsIEdlb3JnaWEsIE1vbmFjbywgbW9ub3NwYWNlLCBBcmlhbCwgc2Fucy1zZXJpZjtcbiAgYmFja2dyb3VuZC1jb2xvcjogIzA1ODk0MjtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi5tYWluX19idXR0b246bGluayxcbi5tYWluX19idXR0b246dmlzaXRlZCxcbi5tYWluX19idXR0b246aG92ZXIge1xuICBjb2xvcjogI2ZmZjtcbiAgdGV4dC1kZWNvcmF0aW9uOiBub25lO1xufVxuLm1haW5fX2Zvb3RlciB7XG4gIG1hcmdpbjogMCAzZW07XG4gIGJvcmRlci10b3A6IDFweCBzb2xpZCAjZGRkO1xufVxuLnNlY3Rpb24ge1xuICBtYXJnaW46IDFlbSAwO1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLnNlY3Rpb25fX2hlYWRlcixcbi5zZWN0aW9uX19jb250ZW50LFxuLnNlY3Rpb25fX2Zvb3RlciB7XG4gIG1hcmdpbjogMDtcbiAgcGFkZGluZzogMCAzZW07XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4uc2VjdGlvbl9fdGl0bGUge1xuICBjb2xvcjogIzY2Njtcbn1cbi5zZWN0aW9uX19oMyB7XG4gIGNvbG9yOiAjNTA3YWZlO1xuICBmb250LXNpemU6IDEuMzVlbTtcbn1cbi5zZWN0aW9uX19oNCB7XG4gIGZvbnQtc2l6ZTogMS4xZW07XG4gIGNvbG9yOiAjNjY2O1xufVxuLnNlY3Rpb25fX2g1IHtcbiAgZm9udC1zaXplOiAxZW07XG4gIGNvbG9yOiAjOTk5O1xufVxuLnNlY3Rpb25fX2RsLFxuLnNlY3Rpb25fX2R0LFxuLnNlY3Rpb25fX2RkIHtcbiAgbWFyZ2luOiAwO1xuICBwYWRkaW5nOiAwO1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLnNlY3Rpb25fX2RsIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICB6LWluZGV4OiAxO1xufVxuLnNlY3Rpb25fX2R0IHtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xufVxuLnNlY3Rpb25fX2RkIHtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICBjb2xvcjogIzA1ODk0Mjtcbn1cbi5zZWN0aW9uX19wcmUge1xuICBtYXJnaW46IDJlbSAwO1xuICBwYWRkaW5nOiAxZW07XG4gIGZvbnQtc2l6ZTogMTRweDtcbiAgbGluZS1oZWlnaHQ6IDE1MCU7XG4gIHRleHQtYWxpZ246IGxlZnQ7XG4gIGJhY2tncm91bmQtY29sb3I6ICNmYWZhZmE7XG4gIGJvcmRlcjogMXB4IHNvbGlkICNkZGQ7XG4gIGJvcmRlci1yYWRpdXM6IDRweDtcbiAgY29sb3I6ICM2NjY7XG4gIG92ZXJmbG93OiBhdXRvO1xufVxuLnNlY3Rpb25fX2NvZGUge1xuICBkaXNwbGF5OiBibG9jaztcbiAgbWFyZ2luOiAwIGF1dG87XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4uc2VjdGlvbl9fZm9vdGVyIHtcbiAgYm9yZGVyLXRvcDogMXB4IHNvbGlkICNkZGQ7XG4gIG1hcmdpbi10b3A6IDNlbTtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ZhZmFmYTtcbiAgY29sb3I6ICM5OTk7XG59XG4uc2VjdGlvbl9fdGFibGUge1xuICBtYXJnaW46IDFlbSBhdXRvO1xuICB3aWR0aDogMTAwJTtcbiAgYm9yZGVyLXRvcDogMXB4IHNvbGlkICNkZGQ7XG59XG4uc2VjdGlvbl9fdGgsXG4uc2VjdGlvbl9fdGQge1xuICBwYWRkaW5nOiA1cHggMTZweDtcbiAgbGluZS1oZWlnaHQ6IDI2cHg7XG4gIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjZGRkO1xufVxuLnNlY3Rpb25fX3RoIHtcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmFmYWZhO1xufVxuQG1lZGlhIChtYXgtd2lkdGg6IDUwMHB4KSB7XG4gIC5zZWN0aW9uX19oZWFkZXIsXG4gIC5zZWN0aW9uX19jb250ZW50IHtcbiAgICBwYWRkaW5nOiAwIDFlbTtcbiAgfVxufVxuLmNhc2Uge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIHotaW5kZXg6IDE7XG4gIGRpc3BsYXk6IGdyaWQ7XG4gIGdyaWQtdGVtcGxhdGUtY29sdW1uczogcmVwZWF0KDIsIDFmcik7XG4gIGdhcDogNDBweDtcbiAgcGFkZGluZzogMWVtO1xuICBib3JkZXItdG9wOiAxcHggc29saWQgI2RkZDtcbiAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNkZGQ7XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4uY2FzZTphZnRlciB7XG4gIGNvbnRlbnQ6ICcnO1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHotaW5kZXg6IDI7XG4gIHRvcDogMDtcbiAgbGVmdDogNTAlO1xuICBoZWlnaHQ6IDEwMCU7XG4gIHdpZHRoOiAwO1xuICBib3JkZXItbGVmdDogMXB4IHNvbGlkICNkZGQ7XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4uY2FzZV9fcHJlLFxuLmNhc2VfX3RleHRhcmVhIHtcbiAgZm9udC1zaXplOiAxM3B4O1xuICBsaW5lLWhlaWdodDogMTUwJTtcbn1cbi5jYXNlX19wcmUsXG4uY2FzZV9fY29kZSxcbi5jYXNlX190ZXh0YXJlYSB7XG4gIGZvbnQtZmFtaWx5OiAnQ291cmllciBOZXcnLCBDb25zb2xhcywgR2VvcmdpYSwgQXJpYWwsIHNhbnMtc2VyaWY7XG59XG4uY2FzZV9fcHJlIHtcbiAgbWFyZ2luOiAwO1xuICBwYWRkaW5nOiAxZW07XG4gIGJhY2tncm91bmQtY29sb3I6ICNmYWZhZmE7XG4gIGhlaWdodDogMTAwJTtcbiAgYm9yZGVyLXJhZGl1czogNHB4O1xuICAtd2Via2l0LWJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgb3ZlcmZsb3c6IGF1dG87XG59XG4uY2FzZV9fdG9vbGJhciB7XG4gIG1hcmdpbjogMCBhdXRvO1xuICBoZWlnaHQ6IDM2cHg7XG4gIGxpbmUtaGVpZ2h0OiAzNnB4O1xuICBmb250LXNpemU6IDE0cHg7XG4gIHBhZGRpbmc6IDAgMTZweDtcbiAgdGV4dC1hbGlnbjogcmlnaHQ7XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4uY2FzZV9fYWN0aW9uLFxuLmNhc2VfX3JlbW92ZSB7XG4gIGN1cnNvcjogcG9pbnRlcjtcbiAgY29sb3I6ICMwNTg5NDI7XG4gIC13ZWJraXQtdXNlci1zZWxlY3Q6IG5vbmU7XG4gICAgIC1tb3otdXNlci1zZWxlY3Q6IG5vbmU7XG4gICAgICAtbXMtdXNlci1zZWxlY3Q6IG5vbmU7XG4gICAgICAgICAgdXNlci1zZWxlY3Q6IG5vbmU7XG59XG4uY2FzZV9fYWN0aW9uIHtcbiAgZm9udC1zaXplOiAxM3B4O1xuICBwYWRkaW5nLWxlZnQ6IDEwcHg7XG59XG4uY2FzZV9fYWN0aW9uOmZpcnN0LWNoaWxkIHtcbiAgcGFkZGluZy1sZWZ0OiAwO1xufVxuLmNhc2VfX3JlbW92ZSB7XG4gIGZsb2F0OiByaWdodDtcbn1cbi5jYXNlX19jb25zb2xlIHtcbiAgbWFyZ2luOiAwIGF1dG87XG4gIGhlaWdodDogMTgwcHg7XG4gIGJvcmRlcjogMXB4IHNvbGlkICNkZGQ7XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4uY2FzZV9fdGV4dGFyZWEge1xuICBtYXJnaW46IDAgYXV0bztcbiAgd2lkdGg6IDEwMCU7XG4gIGhlaWdodDogMTAwJTtcbiAgYm9yZGVyOiBub25lO1xuICBvdXRsaW5lOiBub25lO1xuICBwYWRkaW5nOiAxZW07XG4gIC13ZWJraXQtYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICBvdmVyZmxvdzogYXV0bztcbn1cbi5jYXNlX19saXN0LFxuLmNhc2VfX2l0ZW0ge1xuICBtYXJnaW46IDA7XG4gIHBhZGRpbmc6IDA7XG4gIGxpc3Qtc3R5bGUtdHlwZTogbm9uZTtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi5jYXNlX19saXN0IHtcbiAgaGVpZ2h0OiAzNjBweDtcbiAgYm9yZGVyLXRvcDogMXB4IHNvbGlkICNkZGQ7XG4gIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjZGRkO1xuICBmb250LXNpemU6IDEzcHg7XG4gIG92ZXJmbG93OiBhdXRvO1xufVxuLmNhc2VfX2l0ZW0ge1xuICBoZWlnaHQ6IDM2cHg7XG4gIGxpbmUtaGVpZ2h0OiAzNnB4O1xuICBjdXJzb3I6IHBvaW50ZXI7XG4gIHBhZGRpbmc6IDAgMTZweDtcbn1cbi5jYXNlX19pdGVtOmhvdmVyIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2Y3ZjhmOTtcbn1cbjpyb290IHtcbiAgLS1vdXRsaW5lLXpJbmRleDogMjAwMDtcbiAgLS1vdXRsaW5lLXN0aWNreS1oZWlnaHQ6IDEwMCU7XG4gIC0tb3V0bGluZS1uYXZpZ2F0b3Itd2lkdGg6IDEwMCU7XG59XG4vKiA9PT09PT09PT09IGNvbG9ycy50aGVtZSAtIOWfuuehgOminOiJsuWPmOmHj+mbhuWQiCA9PT09PT09PT09ICovXG4vKipcbiAqIGVsbGlwc2lzLmxlc3MgLSDmlofmnKznnIHnlaUgbWl4aW54IOWHveaVsFxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogQ3JlYXRlZCBCeTogWWFvaGFpeGlhb1xuICogVXBkYXRlOiAyMDIyLjMuMTFcbiAqL1xuLyogPT09PT09IOaWh+acrOecgeeVpeWHveaVsCA9PT09PT0gKi9cbi8qKlxuICogc2hhZG93Lmxlc3MgLSDpmLTlvbHmoLflvI/orr7nva4gbWl4aW54IOWHveaVsFxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogQ3JlYXRlZCBCeTogWWFvaGFpeGlhb1xuICogVXBkYXRlOiAyMDIyLjMuMjBcbiAqL1xuLyogPT09PT09IOmYtOW9seagt+W8j+iuvue9ruWHveaVsCA9PT09PT0gKi9cbi8qID09PT09PT09PT0gaWNvbi50aGVtZSAtIHN2ZyDlm77moIfnmoTmoLflvI8gPT09PT09PT09PSAqL1xuLm91dGxpbmUtaWNvbiB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgei1pbmRleDogMTtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO1xuICB3aWR0aDogMWVtO1xuICBoZWlnaHQ6IDFlbTtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi5vdXRsaW5lLWljb25fX3N2ZyB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgei1pbmRleDogMjtcbiAgdG9wOiA1MCU7XG4gIGxlZnQ6IDUwJTtcbiAgd2lkdGg6IDFlbTtcbiAgaGVpZ2h0OiAxZW07XG4gIGZpbGw6IGN1cnJlbnRjb2xvcjtcbiAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCAtNTAlKTtcbiAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCAtNTAlKTtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi5vdXRsaW5lLWljb25faGlkZGVuIHtcbiAgZGlzcGxheTogbm9uZTtcbn1cbi8qID09PT09IFNjcm9sbGJhciA9PT09PSAqL1xuOjotd2Via2l0LXNjcm9sbGJhciB7XG4gIHdpZHRoOiA3cHg7XG4gIGhlaWdodDogN3B4O1xuICAtd2Via2l0LWJvcmRlci1yYWRpdXM6IDVweDtcbn1cbjo6LXdlYmtpdC1zY3JvbGxiYXItdHJhY2stcGllY2Uge1xuICAtd2Via2l0LWJvcmRlci1yYWRpdXM6IDVweDtcbn1cbjo6LXdlYmtpdC1zY3JvbGxiYXItdGh1bWI6dmVydGljYWwge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuMjUpO1xuICAtd2Via2l0LWJvcmRlci1yYWRpdXM6IDVweDtcbn1cbjo6LXdlYmtpdC1zY3JvbGxiYXItdGh1bWI6aG9yaXpvbnRhbCB7XG4gIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMCwgMCwgMCwgMC4yNSk7XG4gIC13ZWJraXQtYm9yZGVyLXJhZGl1czogNXB4O1xufVxuOjotd2Via2l0LXNjcm9sbGJhci10aHVtYjpob3ZlciB7XG4gIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMCwgMCwgMCwgMC4zNSk7XG59XG46Oi13ZWJraXQtc2Nyb2xsYmFyOmhvdmVyIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjE1KTtcbn1cbi5vdXRsaW5lLWhlYWRpbmcge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIHotaW5kZXg6IDE7XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4ub3V0bGluZS1oZWFkaW5nX19hbmNob3Ige1xuICBkaXNwbGF5OiBub25lO1xufVxuLm91dGxpbmUtaGVhZGluZ19fYW5jaG9yOmxpbmssXG4ub3V0bGluZS1oZWFkaW5nX19hbmNob3I6dmlzaXRlZCxcbi5vdXRsaW5lLWhlYWRpbmdfX2FuY2hvcjpob3ZlciB7XG4gIGNvbG9yOiAjOTk5O1xuICB0ZXh0LWRlY29yYXRpb246IG5vbmU7XG59XG4ub3V0bGluZS1oZWFkaW5nX19hbmNob3I6aG92ZXIge1xuICBjb2xvcjogIzUwN2FmZTtcbn1cbi5vdXRsaW5lLWhlYWRpbmc6aG92ZXIgLm91dGxpbmUtaGVhZGluZ19fYW5jaG9yIHtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xufVxuLm91dGxpbmUtaGVhZGluZ19zdGFydDpob3ZlciB7XG4gIG92ZXJmbG93OiB2aXNpYmxlO1xufVxuLm91dGxpbmUtaGVhZGluZ19zdGFydCAub3V0bGluZS1oZWFkaW5nX19hbmNob3Ige1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHotaW5kZXg6IDI7XG4gIHRvcDogNTAlO1xuICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlWSgtNTAlKTtcbiAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTUwJSk7XG4gIGxlZnQ6IC0xZW07XG59XG4ub3V0bGluZS1kcmF3ZXIge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIHotaW5kZXg6IC0xO1xuICB0b3A6IDA7XG4gIGxlZnQ6IDA7XG4gIG1hcmdpbjogMDtcbiAgd2lkdGg6IDEwMCU7XG4gIGhlaWdodDogMTAwJTtcbiAgLXdlYmtpdC1ib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gIHZpc2liaWxpdHk6IGhpZGRlbjtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi5vdXRsaW5lLWRyYXdlcl9fbW9kYWwge1xuICAtd2Via2l0LWJveC1zaGFkb3c6IDAgMCA2cHggMXB4ICNkY2RmZTY7XG4gICAgICAgICAgYm94LXNoYWRvdzogMCAwIDZweCAxcHggI2RjZGZlNjtcbiAgZGlzcGxheTogLXdlYmtpdC1ib3g7XG4gIGRpc3BsYXk6IC1tcy1mbGV4Ym94O1xuICBkaXNwbGF5OiBmbGV4O1xuICAtd2Via2l0LWJveC1vcmllbnQ6IHZlcnRpY2FsO1xuICAtd2Via2l0LWJveC1kaXJlY3Rpb246IG5vcm1hbDtcbiAgICAgIC1tcy1mbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gIC1tcy1mbGV4LXdyYXA6IG5vd3JhcDtcbiAgICAgIGZsZXgtd3JhcDogbm93cmFwO1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHotaW5kZXg6IDIxO1xuICBoZWlnaHQ6IDEwMCU7XG4gIGJhY2tncm91bmQtY29sb3I6ICNmZmY7XG4gIC13ZWJraXQtdHJhbnNpdGlvbi1kdXJhdGlvbjogMC40cztcbiAgICAgICAgICB0cmFuc2l0aW9uLWR1cmF0aW9uOiAwLjRzO1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLm91dGxpbmUtZHJhd2VyX19oZWFkZXIsXG4ub3V0bGluZS1kcmF3ZXJfX21haW4sXG4ub3V0bGluZS1kcmF3ZXJfX2Zvb3RlciB7XG4gIHdpZHRoOiAxMDAlO1xuICAtd2Via2l0LWJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbn1cbi5vdXRsaW5lLWRyYXdlcl9faGVhZGVyLFxuLm91dGxpbmUtZHJhd2VyX19mb290ZXIge1xuICAtbXMtZmxleC1uZWdhdGl2ZTogMDtcbiAgICAgIGZsZXgtc2hyaW5rOiAwO1xufVxuLm91dGxpbmUtZHJhd2VyX190aXRsZSxcbi5vdXRsaW5lLWRyYXdlcl9fbWFpbixcbi5vdXRsaW5lLWRyYXdlcl9fZm9vdGVyIHtcbiAgcGFkZGluZzogMCAxNnB4O1xufVxuLm91dGxpbmUtZHJhd2VyX19oZWFkZXIsXG4ub3V0bGluZS1kcmF3ZXJfX3RpdGxlIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICB6LWluZGV4OiAxO1xuICBtYXJnaW46IDAgYXV0bztcbiAgaGVpZ2h0OiA1MnB4O1xuICBsaW5lLWhlaWdodDogNTJweDtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi5vdXRsaW5lLWRyYXdlcl9fdGl0bGUge1xuICBmb250LXNpemU6IDE2cHg7XG4gIGZvbnQtd2VpZ2h0OiA0MDA7XG4gIG1hcmdpbjogMCAxNnB4O1xuICAtd2Via2l0LWJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNkY2RmZTY7XG59XG4ub3V0bGluZS1kcmF3ZXJfX2Nsb3NlIHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB6LWluZGV4OiAyO1xuICB0b3A6IDUwJTtcbiAgcmlnaHQ6IDEycHg7XG4gIHdpZHRoOiAyMHB4O1xuICBoZWlnaHQ6IDIwcHg7XG4gIGxpbmUtaGVpZ2h0OiAyMHB4O1xuICBjb2xvcjogIzk5OTtcbiAgZm9udC1zaXplOiAyMHB4O1xuICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gIGN1cnNvcjogcG9pbnRlcjtcbiAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTUwJSk7XG4gICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC01MCUpO1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLm91dGxpbmUtZHJhd2VyX19jbG9zZSAub3V0bGluZS1pY29uIHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB6LWluZGV4OiAyO1xuICB0b3A6IDA7XG4gIGxlZnQ6IDA7XG59XG4ub3V0bGluZS1kcmF3ZXJfX2Nsb3NlOmhvdmVyIHtcbiAgY29sb3I6ICM2NjY7XG59XG4ub3V0bGluZS1kcmF3ZXJfX21haW4ge1xuICAtd2Via2l0LWJveC1mbGV4OiAxO1xuICAgICAgLW1zLWZsZXg6IDE7XG4gICAgICAgICAgZmxleDogMTtcbiAgb3ZlcmZsb3c6IGF1dG87XG59XG4ub3V0bGluZS1kcmF3ZXJfX21haW4ub3ZlcmZsb3ctaGlkZGVuIHtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi5vdXRsaW5lLWRyYXdlcl9fZm9vdGVyIHtcbiAgbWFyZ2luOiAwIGF1dG87XG4gIHRleHQtYWxpZ246IHJpZ2h0O1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLm91dGxpbmUtZHJhd2VyX19vdmVybGF5IHtcbiAgY29udGVudDogJyc7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgei1pbmRleDogMTtcbiAgdG9wOiAwO1xuICBsZWZ0OiAwO1xuICB3aWR0aDogMTAwJTtcbiAgaGVpZ2h0OiAxMDAlO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmO1xuICBvcGFjaXR5OiAwLjE7XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4ub3V0bGluZS1kcmF3ZXJfcnRsLm91dGxpbmUtZHJhd2VyX3RpbnksXG4ub3V0bGluZS1kcmF3ZXJfbHRyLm91dGxpbmUtZHJhd2VyX3Rpbnkge1xuICB3aWR0aDogMjgwcHg7XG59XG4ub3V0bGluZS1kcmF3ZXJfcnRsLm91dGxpbmUtZHJhd2VyX21pbmksXG4ub3V0bGluZS1kcmF3ZXJfbHRyLm91dGxpbmUtZHJhd2VyX21pbmkge1xuICB3aWR0aDogNDgwcHg7XG59XG4ub3V0bGluZS1kcmF3ZXJfcnRsLm91dGxpbmUtZHJhd2VyX3NtYWxsLFxuLm91dGxpbmUtZHJhd2VyX2x0ci5vdXRsaW5lLWRyYXdlcl9zbWFsbCB7XG4gIHdpZHRoOiA1NDBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl9ydGwub3V0bGluZS1kcmF3ZXJfcmVndWxhcixcbi5vdXRsaW5lLWRyYXdlcl9sdHIub3V0bGluZS1kcmF3ZXJfcmVndWxhciB7XG4gIHdpZHRoOiA2ODBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl9ydGwub3V0bGluZS1kcmF3ZXJfbWVkaXVtLFxuLm91dGxpbmUtZHJhd2VyX2x0ci5vdXRsaW5lLWRyYXdlcl9tZWRpdW0ge1xuICB3aWR0aDogNzIwcHg7XG59XG4ub3V0bGluZS1kcmF3ZXJfcnRsLm91dGxpbmUtZHJhd2VyX2xhcmdlLFxuLm91dGxpbmUtZHJhd2VyX2x0ci5vdXRsaW5lLWRyYXdlcl9sYXJnZSB7XG4gIHdpZHRoOiA5NjBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl9ydGwge1xuICBib3JkZXItbGVmdDogMXB4IHNvbGlkICNkY2RmZTY7XG59XG4ub3V0bGluZS1kcmF3ZXJfcnRsLm91dGxpbmUtZHJhd2VyX3Rpbnkub3V0bGluZS1kcmF3ZXJfY2xvc2VkIHtcbiAgcmlnaHQ6IC0yOTBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl9ydGwub3V0bGluZS1kcmF3ZXJfbWluaS5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xuICByaWdodDogLTQ5MHB4O1xufVxuLm91dGxpbmUtZHJhd2VyX3J0bC5vdXRsaW5lLWRyYXdlcl9zbWFsbC5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xuICByaWdodDogLTU1MHB4O1xufVxuLm91dGxpbmUtZHJhd2VyX3J0bC5vdXRsaW5lLWRyYXdlcl9yZWd1bGFyLm91dGxpbmUtZHJhd2VyX2Nsb3NlZCB7XG4gIHJpZ2h0OiAtNjkwcHg7XG59XG4ub3V0bGluZS1kcmF3ZXJfcnRsLm91dGxpbmUtZHJhd2VyX21lZGl1bS5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xuICByaWdodDogLTczMHB4O1xufVxuLm91dGxpbmUtZHJhd2VyX3J0bC5vdXRsaW5lLWRyYXdlcl9sYXJnZS5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xuICByaWdodDogLTk3MHB4O1xufVxuLm91dGxpbmUtZHJhd2VyX2x0ciB7XG4gIGJvcmRlci1yaWdodDogMXB4IHNvbGlkICNkY2RmZTY7XG59XG4ub3V0bGluZS1kcmF3ZXJfbHRyLm91dGxpbmUtZHJhd2VyX3Rpbnkub3V0bGluZS1kcmF3ZXJfY2xvc2VkIHtcbiAgbGVmdDogLTI5MHB4O1xufVxuLm91dGxpbmUtZHJhd2VyX2x0ci5vdXRsaW5lLWRyYXdlcl9taW5pLm91dGxpbmUtZHJhd2VyX2Nsb3NlZCB7XG4gIGxlZnQ6IC00OTBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl9sdHIub3V0bGluZS1kcmF3ZXJfc21hbGwub3V0bGluZS1kcmF3ZXJfY2xvc2VkIHtcbiAgbGVmdDogLTU1MHB4O1xufVxuLm91dGxpbmUtZHJhd2VyX2x0ci5vdXRsaW5lLWRyYXdlcl9yZWd1bGFyLm91dGxpbmUtZHJhd2VyX2Nsb3NlZCB7XG4gIGxlZnQ6IC02OTBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl9sdHIub3V0bGluZS1kcmF3ZXJfbWVkaXVtLm91dGxpbmUtZHJhd2VyX2Nsb3NlZCB7XG4gIGxlZnQ6IC03MzBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl9sdHIub3V0bGluZS1kcmF3ZXJfbGFyZ2Uub3V0bGluZS1kcmF3ZXJfY2xvc2VkIHtcbiAgbGVmdDogLTk3MHB4O1xufVxuLm91dGxpbmUtZHJhd2VyX3R0Yixcbi5vdXRsaW5lLWRyYXdlcl9idHQge1xuICBsZWZ0OiAwO1xuICB3aWR0aDogMTAwJTtcbn1cbi5vdXRsaW5lLWRyYXdlcl90dGIub3V0bGluZS1kcmF3ZXJfdGlueSxcbi5vdXRsaW5lLWRyYXdlcl9idHQub3V0bGluZS1kcmF3ZXJfdGlueSB7XG4gIGhlaWdodDogMjQwcHg7XG59XG4ub3V0bGluZS1kcmF3ZXJfdHRiLm91dGxpbmUtZHJhd2VyX21pbmksXG4ub3V0bGluZS1kcmF3ZXJfYnR0Lm91dGxpbmUtZHJhd2VyX21pbmkge1xuICBoZWlnaHQ6IDMyMHB4O1xufVxuLm91dGxpbmUtZHJhd2VyX3R0Yi5vdXRsaW5lLWRyYXdlcl9zbWFsbCxcbi5vdXRsaW5lLWRyYXdlcl9idHQub3V0bGluZS1kcmF3ZXJfc21hbGwge1xuICBoZWlnaHQ6IDM2MHB4O1xufVxuLm91dGxpbmUtZHJhd2VyX3R0Yi5vdXRsaW5lLWRyYXdlcl9yZWd1bGFyLFxuLm91dGxpbmUtZHJhd2VyX2J0dC5vdXRsaW5lLWRyYXdlcl9yZWd1bGFyIHtcbiAgaGVpZ2h0OiA0MDBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl90dGIub3V0bGluZS1kcmF3ZXJfbWVkaXVtLFxuLm91dGxpbmUtZHJhd2VyX2J0dC5vdXRsaW5lLWRyYXdlcl9tZWRpdW0ge1xuICBoZWlnaHQ6IDQ0MHB4O1xufVxuLm91dGxpbmUtZHJhd2VyX3R0Yi5vdXRsaW5lLWRyYXdlcl9sYXJnZSxcbi5vdXRsaW5lLWRyYXdlcl9idHQub3V0bGluZS1kcmF3ZXJfbGFyZ2Uge1xuICBoZWlnaHQ6IDQ4MHB4O1xufVxuLm91dGxpbmUtZHJhd2VyX3R0YiB7XG4gIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjZGNkZmU2O1xufVxuLm91dGxpbmUtZHJhd2VyX3R0Yi5vdXRsaW5lLWRyYXdlcl90aW55Lm91dGxpbmUtZHJhd2VyX2Nsb3NlZCB7XG4gIHRvcDogLTI1MHB4O1xufVxuLm91dGxpbmUtZHJhd2VyX3R0Yi5vdXRsaW5lLWRyYXdlcl9taW5pLm91dGxpbmUtZHJhd2VyX2Nsb3NlZCB7XG4gIHRvcDogLTMzMHB4O1xufVxuLm91dGxpbmUtZHJhd2VyX3R0Yi5vdXRsaW5lLWRyYXdlcl9zbWFsbC5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xuICB0b3A6IC0zNzBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl90dGIub3V0bGluZS1kcmF3ZXJfcmVndWxhci5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xuICB0b3A6IC00MTBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl90dGIub3V0bGluZS1kcmF3ZXJfbWVkaXVtLm91dGxpbmUtZHJhd2VyX2Nsb3NlZCB7XG4gIHRvcDogLTQ1MHB4O1xufVxuLm91dGxpbmUtZHJhd2VyX3R0Yi5vdXRsaW5lLWRyYXdlcl9sYXJnZS5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xuICB0b3A6IC00OTBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl9idHQge1xuICB0b3A6IGluaXRpYWw7XG4gIGJvcmRlci10b3A6IDFweCBzb2xpZCAjZGNkZmU2O1xufVxuLm91dGxpbmUtZHJhd2VyX2J0dC5vdXRsaW5lLWRyYXdlcl90aW55Lm91dGxpbmUtZHJhd2VyX2Nsb3NlZCB7XG4gIGJvdHRvbTogLTI1MHB4O1xufVxuLm91dGxpbmUtZHJhd2VyX2J0dC5vdXRsaW5lLWRyYXdlcl9taW5pLm91dGxpbmUtZHJhd2VyX2Nsb3NlZCB7XG4gIGJvdHRvbTogLTMzMHB4O1xufVxuLm91dGxpbmUtZHJhd2VyX2J0dC5vdXRsaW5lLWRyYXdlcl9zbWFsbC5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xuICBib3R0b206IC0zNzBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl9idHQub3V0bGluZS1kcmF3ZXJfcmVndWxhci5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xuICBib3R0b206IC00MTBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl9idHQub3V0bGluZS1kcmF3ZXJfbWVkaXVtLm91dGxpbmUtZHJhd2VyX2Nsb3NlZCB7XG4gIGJvdHRvbTogLTQ1MHB4O1xufVxuLm91dGxpbmUtZHJhd2VyX2J0dC5vdXRsaW5lLWRyYXdlcl9sYXJnZS5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xuICBib3R0b206IC00OTBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl9vcGVuZWQge1xuICB2aXNpYmlsaXR5OiB2aXNpYmxlO1xuICB6LWluZGV4OiB2YXIoLS1vdXRsaW5lLXpJbmRleCk7XG59XG4ub3V0bGluZS1kcmF3ZXJfb3BlbmVkLm91dGxpbmUtZHJhd2VyIHtcbiAgcG9zaXRpb246IGZpeGVkO1xufVxuLm91dGxpbmUtZHJhd2VyX29wZW5lZC5vdXRsaW5lLWRyYXdlcl9ydGwge1xuICByaWdodDogMDtcbn1cbi5vdXRsaW5lLWRyYXdlcl9vcGVuZWQub3V0bGluZS1kcmF3ZXJfbHRyIHtcbiAgbGVmdDogMDtcbn1cbi5vdXRsaW5lLWRyYXdlcl9vcGVuZWQub3V0bGluZS1kcmF3ZXJfdHRiIHtcbiAgdG9wOiAwO1xufVxuLm91dGxpbmUtZHJhd2VyX29wZW5lZC5vdXRsaW5lLWRyYXdlcl9idHQge1xuICBib3R0b206IDA7XG59XG4ub3V0bGluZS1kcmF3ZXJfb2Zmc2V0Lm91dGxpbmUtZHJhd2VyX3J0bCxcbi5vdXRsaW5lLWRyYXdlcl9vZmZzZXQub3V0bGluZS1kcmF3ZXJfbHRyIHtcbiAgaGVpZ2h0OiBjYWxjKDEwMCUgLSA0ZW0pO1xuICB0b3A6IDUwJTtcbiAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTUwJSk7XG4gICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC01MCUpO1xufVxuLm91dGxpbmUtZHJhd2VyX29mZnNldC5vdXRsaW5lLWRyYXdlcl90dGIsXG4ub3V0bGluZS1kcmF3ZXJfb2Zmc2V0Lm91dGxpbmUtZHJhd2VyX2J0dCB7XG4gIHdpZHRoOiBjYWxjKDEwMCUgLSA0ZW0pO1xuICBsZWZ0OiA1MCU7XG4gIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC01MCUpO1xuICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgtNTAlKTtcbn1cbi5vdXRsaW5lLWRyYXdlcl9vZmZzZXQub3V0bGluZS1kcmF3ZXJfb3BlbmVkLm91dGxpbmUtZHJhd2VyX3J0bCB7XG4gIHJpZ2h0OiAyZW07XG59XG4ub3V0bGluZS1kcmF3ZXJfb2Zmc2V0Lm91dGxpbmUtZHJhd2VyX29wZW5lZC5vdXRsaW5lLWRyYXdlcl9sdHIge1xuICBsZWZ0OiAyZW07XG59XG4ub3V0bGluZS1kcmF3ZXJfb2Zmc2V0Lm91dGxpbmUtZHJhd2VyX29wZW5lZC5vdXRsaW5lLWRyYXdlcl90dGIge1xuICB0b3A6IDJlbTtcbn1cbi5vdXRsaW5lLWRyYXdlcl9vZmZzZXQub3V0bGluZS1kcmF3ZXJfb3BlbmVkLm91dGxpbmUtZHJhd2VyX2J0dCB7XG4gIGJvdHRvbTogMmVtO1xufVxuLm91dGxpbmUtZHJhd2VyX2F1dG8ub3V0bGluZS1kcmF3ZXJfcnRsLFxuLm91dGxpbmUtZHJhd2VyX2F1dG8ub3V0bGluZS1kcmF3ZXJfbHRyIHtcbiAgaGVpZ2h0OiBhdXRvO1xuICBtYXgtaGVpZ2h0OiBjYWxjKDEwMCUgLSA0ZW0pO1xufVxuLm91dGxpbmUtZHJhd2VyX2Z1bGwge1xuICBwYWRkaW5nOiAwO1xufVxuLm91dGxpbmUtbmF2aWdhdG9yIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICB6LWluZGV4OiAxO1xuICBtYXJnaW46IDA7XG4gIHdpZHRoOiB2YXIoLS1vdXRsaW5lLW5hdmlnYXRvci13aWR0aCk7XG4gIG92ZXJmbG93OiBhdXRvO1xufVxuLm91dGxpbmUtbmF2aWdhdG9yLXBhcmVudCB7XG4gIC13ZWJraXQtdHJhbnNpdGlvbjogMC4zcyBlYXNlLWluLW91dDtcbiAgdHJhbnNpdGlvbjogMC4zcyBlYXNlLWluLW91dDtcbn1cbi5vdXRsaW5lLW5hdmlnYXRvcl9fdGl0bGUge1xuICBtYXJnaW46IDAgMTZweDtcbiAgaGVpZ2h0OiA0MHB4O1xuICBsaW5lLWhlaWdodDogNDBweDtcbiAgcGFkZGluZzogMCAxNnB4O1xuICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI2RjZGZlNjtcbiAgZm9udC1zaXplOiAxNnB4O1xuICBmb250LXdlaWdodDogNDAwO1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLm91dGxpbmUtbmF2aWdhdG9yX19tYWluIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICB6LWluZGV4OiAxO1xuICBtYXJnaW46IDA7XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4ub3V0bGluZS1uYXZpZ2F0b3JfX2xpc3QsXG4ub3V0bGluZS1uYXZpZ2F0b3JfX3N1YmplY3QsXG4ub3V0bGluZS1uYXZpZ2F0b3JfX2l0ZW0ge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIHotaW5kZXg6IDI7XG4gIG1hcmdpbjogMDtcbiAgcGFkZGluZzogMDtcbiAgbGlzdC1zdHlsZS10eXBlOiBub25lO1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLm91dGxpbmUtbmF2aWdhdG9yX19saXN0IHtcbiAgcGFkZGluZzogMC41ZW0gMDtcbn1cbi5vdXRsaW5lLW5hdmlnYXRvcl9fc3ViamVjdCB7XG4gIHBhZGRpbmctbGVmdDogMWVtO1xufVxuLm91dGxpbmUtbmF2aWdhdG9yX19pdGVtIHtcbiAgbWFyZ2luOiAwO1xuICBsaW5lLWhlaWdodDogMzBweDtcbiAgZm9udC1zaXplOiAxM3B4O1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLm91dGxpbmUtbmF2aWdhdG9yX19wbGFjZWhvbGRlciB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgei1pbmRleDogMTtcbiAgdG9wOiAwO1xuICBsZWZ0OiAwO1xuICB3aWR0aDogMTAwJTtcbiAgaGVpZ2h0OiAzMHB4O1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjdmOGY5O1xuICBib3JkZXItbGVmdDogMnB4IHNvbGlkICMwNTg5NDI7XG4gIC13ZWJraXQtdHJhbnNpdGlvbi1kdXJhdGlvbjogMC4ycztcbiAgICAgICAgICB0cmFuc2l0aW9uLWR1cmF0aW9uOiAwLjJzO1xuICAtd2Via2l0LWJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi5vdXRsaW5lLW5hdmlnYXRvcl9fYW5jaG9yIHtcbiAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbiAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7XG4gIG92ZXJmbG93OiBoaWRkZW47XG4gIGRpc3BsYXk6IGJsb2NrO1xuICBwYWRkaW5nOiAwIDEuNWVtO1xufVxuLm91dGxpbmUtbmF2aWdhdG9yX19hbmNob3I6bGluayxcbi5vdXRsaW5lLW5hdmlnYXRvcl9fYW5jaG9yOnZpc2l0ZWQsXG4ub3V0bGluZS1uYXZpZ2F0b3JfX2FuY2hvcjpob3ZlciB7XG4gIHRleHQtZGVjb3JhdGlvbjogbm9uZTtcbiAgY29sb3I6ICM1NTU7XG59XG4ub3V0bGluZS1uYXZpZ2F0b3JfX2FuY2hvcjpob3ZlciB7XG4gIGNvbG9yOiAjMDU4OTQyO1xufVxuLm91dGxpbmUtbmF2aWdhdG9yX19jb2RlIHtcbiAgcGFkZGluZy1yaWdodDogMC41ZW07XG59XG4ub3V0bGluZS1uYXZpZ2F0b3JfaGlnaGxpZ2h0Lm91dGxpbmUtbmF2aWdhdG9yX19hbmNob3I6bGluayxcbi5vdXRsaW5lLW5hdmlnYXRvcl9oaWdobGlnaHQub3V0bGluZS1uYXZpZ2F0b3JfX2FuY2hvcjp2aXNpdGVkLFxuLm91dGxpbmUtbmF2aWdhdG9yX2hpZ2hsaWdodC5vdXRsaW5lLW5hdmlnYXRvcl9fYW5jaG9yOmhvdmVyIHtcbiAgY29sb3I6ICMwNTg5NDI7XG4gIGZvbnQtd2VpZ2h0OiBib2xkO1xufVxuLm91dGxpbmUtbmF2aWdhdG9yX3N0aWNreSxcbi5vdXRsaW5lLW5hdmlnYXRvcl9maXhlZCB7XG4gIGRpc3BsYXk6IC13ZWJraXQtYm94O1xuICBkaXNwbGF5OiAtbXMtZmxleGJveDtcbiAgZGlzcGxheTogZmxleDtcbiAgLW1zLWZsZXgtd3JhcDogbm93cmFwO1xuICAgICAgZmxleC13cmFwOiBub3dyYXA7XG4gIC13ZWJraXQtYm94LW9yaWVudDogdmVydGljYWw7XG4gIC13ZWJraXQtYm94LWRpcmVjdGlvbjogbm9ybWFsO1xuICAgICAgLW1zLWZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgei1pbmRleDogdmFyKC0tb3V0bGluZS16SW5kZXgpO1xuICB0b3A6IDA7XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4ub3V0bGluZS1uYXZpZ2F0b3Jfc3RpY2t5IC5vdXRsaW5lLW5hdmlnYXRvcl9fdGl0bGUsXG4ub3V0bGluZS1uYXZpZ2F0b3JfZml4ZWQgLm91dGxpbmUtbmF2aWdhdG9yX190aXRsZSxcbi5vdXRsaW5lLW5hdmlnYXRvcl9zdGlja3kgLm91dGxpbmUtbmF2aWdhdG9yX19tYWluLFxuLm91dGxpbmUtbmF2aWdhdG9yX2ZpeGVkIC5vdXRsaW5lLW5hdmlnYXRvcl9fbWFpbiB7XG4gIC13ZWJraXQtYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xufVxuLm91dGxpbmUtbmF2aWdhdG9yX3N0aWNreSAub3V0bGluZS1uYXZpZ2F0b3JfX3RpdGxlLFxuLm91dGxpbmUtbmF2aWdhdG9yX2ZpeGVkIC5vdXRsaW5lLW5hdmlnYXRvcl9fdGl0bGUge1xuICAtbXMtZmxleC1uZWdhdGl2ZTogMDtcbiAgICAgIGZsZXgtc2hyaW5rOiAwO1xufVxuLm91dGxpbmUtbmF2aWdhdG9yX3N0aWNreSAub3V0bGluZS1uYXZpZ2F0b3JfX21haW4sXG4ub3V0bGluZS1uYXZpZ2F0b3JfZml4ZWQgLm91dGxpbmUtbmF2aWdhdG9yX19tYWluIHtcbiAgLXdlYmtpdC1ib3gtZmxleDogMTtcbiAgICAgIC1tcy1mbGV4OiAxO1xuICAgICAgICAgIGZsZXg6IDE7XG4gIG92ZXJmbG93OiBhdXRvO1xufVxuLm91dGxpbmUtbmF2aWdhdG9yX3N0aWNreSB7XG4gIHBvc2l0aW9uOiBzdGlja3k7XG4gIG1heC1oZWlnaHQ6IHZhcigtLW91dGxpbmUtc3RpY2t5LWhlaWdodCk7XG59XG4ub3V0bGluZS1uYXZpZ2F0b3JfZml4ZWQge1xuICBwb3NpdGlvbjogZml4ZWQ7XG4gIG1heC1oZWlnaHQ6IDEwMCU7XG59XG4ub3V0bGluZS1uYXZpZ2F0b3JfaGlkZGVuIHtcbiAgZGlzcGxheTogbm9uZTtcbn1cbi5vdXRsaW5lLW5hdmlnYXRvcl9mb2xkZWQge1xuICB3aWR0aDogMDtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi8qKlxuICogZm9udC5sZXNzIC0g5a2X5L2T55u45YWz5qC35byPXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBDcmVhdGVkIEJ5OiBZYW9oYWl4aWFvXG4gKiBVcGRhdGU6IDIwMjIuMy4xNlxuICovXG4vKiA9PT09PT0g5a2X5L2TID09PT09PSAqL1xuLyogPT09PT09IOWtl+mHjSA9PT09PT0gKi9cbi8qID09PT09PSDlrZflj7cgPT09PT09ICovXG4vKipcbiAqIG1peGlucy5sZXNzIC0g5bel5YW35Ye95pWwXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBDcmVhdGVkIEJ5OiBZYW9oYWl4aWFvXG4gKiBVcGRhdGU6IDIwMjIuMy4xMVxuICovXG4vKipcbiAqIHJhZGl1cy5sZXNzIC0g5ZyG6KeS6K6+572uIG1peGlueCDlh73mlbBcbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIENyZWF0ZWQgQnk6IFlhb2hhaXhpYW9cbiAqIFVwZGF0ZTogMjAyNC40LjE2XG4gKi9cbi8qID09PT09PSDlnIbop5LmoLflvI/orr7nva7lh73mlbAgPT09PT09ICovXG4ub3V0bGluZS1yZWFkZXJfX3Byb2dyZXNzIHtcbiAgcG9zaXRpb246IGZpeGVkO1xuICB0b3A6IDA7XG4gIGxlZnQ6IDA7XG4gIHotaW5kZXg6IDM7XG4gIGhlaWdodDogNHB4O1xuICB3aWR0aDogMTAwJTtcbiAgYmFja2dyb3VuZC1jb2xvcjogIzUwN2FmZTtcbiAgc2NhbGU6IDAgMTtcbiAgLXdlYmtpdC10cmFuc2Zvcm0tb3JpZ2luOiBsZWZ0O1xuICAgICAgICAgIHRyYW5zZm9ybS1vcmlnaW46IGxlZnQ7XG4gIC13ZWJraXQtYW5pbWF0aW9uOiBvdXRsaW5lLXJlYWRlci1wcm9ncmVzcyBsaW5lYXI7XG4gICAgICAgICAgYW5pbWF0aW9uOiBvdXRsaW5lLXJlYWRlci1wcm9ncmVzcyBsaW5lYXI7XG4gIGFuaW1hdGlvbi10aW1lbGluZTogLS1Qcm9ncmVzc1RpbWVsaW5lO1xufVxuLm91dGxpbmUtcmVhZGVyX19wYXBlciB7XG4gIC13ZWJraXQtYm94LXNoYWRvdzogMCAwIDZweCAxcHggI2RkZDtcbiAgICAgICAgICBib3gtc2hhZG93OiAwIDAgNnB4IDFweCAjZGRkO1xuICBtYXJnaW46IDJlbSBhdXRvO1xuICBtYXgtd2lkdGg6IDEyMDBweDtcbiAgcGFkZGluZzogMy4yZW07XG4gIC13ZWJraXQtYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmO1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLm91dGxpbmUtcmVhZGVyX190aXRsZSB7XG4gIG1hcmdpbjogMC42N2VtIDA7XG4gIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgZm9udC1mYW1pbHk6IC1hcHBsZS1zeXN0ZW0sIEJsaW5rTWFjU3lzdGVtRm9udCwgJ1NlZ29lIFVJJywgJ1BpbmdGYW5nIFNDJywgJ0hpcmFnaW5vIFNhbnMgR0InLCAnTWljcm9zb2Z0IFlhSGVpJywgJ0hlbHZldGljYSBOZXVlJywgJ0FwcGxlIENvbG9yIEVtb2ppJywgJ1NlZ29lIFVJIEVtb2ppJywgJ1NlZ29lIFVJIFN5bWJvbCcsIEhlbHZldGljYSwgQXJpYWwsIHNhbnMtc2VyaWY7XG4gIGZvbnQtd2VpZ2h0OiBub3JtYWw7XG4gIGxpbmUtaGVpZ2h0OiAxLjNlbTtcbiAgZm9udC1zaXplOiA0LjJlbTtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi5vdXRsaW5lLXJlYWRlcl9fYXJ0aWNsZSAub3V0bGluZS1yZWFkZXJfX3Byb2dyZXNzIHtcbiAgZGlzcGxheTogbm9uZTtcbn1cbi5vdXRsaW5lLXJlYWRlcl9oaWRkZW4ge1xuICBkaXNwbGF5OiBub25lO1xufVxuLm91dGxpbmUtcmVhZGVyX2hpZGRlbi5vdXRsaW5lLXJlYWRlcl9zaWJsaW5nIHtcbiAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50O1xufVxuLm91dGxpbmUtcmVhZGVyX2hpZGRlbi5vdXRsaW5lLXJlYWRlcl9zaWJsaW5nLndyYXBwZXIucG9zdCB7XG4gIGRpc3BsYXk6IG5vbmU7XG59XG4ub3V0bGluZS1yZWFkZXItLXJlYWRpbmcge1xuICBkaXNwbGF5OiBibG9jaztcbiAgcG9zaXRpb246IGZpeGVkO1xuICB6LWluZGV4OiAyO1xuICB0b3A6IDA7XG4gIGxlZnQ6IDA7XG4gIHdpZHRoOiAxMDAlO1xuICBoZWlnaHQ6IDEwMCU7XG4gIG1hcmdpbjogMDtcbiAgLXdlYmtpdC1ib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gIHBhZGRpbmc6IDNlbSA0ZW07XG4gIGJhY2tncm91bmQtY29sb3I6ICNmYWZhZmE7XG4gIHNjcm9sbC10aW1lbGluZS1uYW1lOiAtLVByb2dyZXNzVGltZWxpbmU7XG4gIG92ZXJmbG93OiBzY3JvbGw7XG59XG5ALXdlYmtpdC1rZXlmcmFtZXMgb3V0bGluZS1yZWFkZXItcHJvZ3Jlc3Mge1xuICB0byB7XG4gICAgc2NhbGU6IDEgMTtcbiAgfVxufVxuQGtleWZyYW1lcyBvdXRsaW5lLXJlYWRlci1wcm9ncmVzcyB7XG4gIHRvIHtcbiAgICBzY2FsZTogMSAxO1xuICB9XG59XG5AbWVkaWEgKG1heC13aWR0aDogNTAwcHgpIHtcbiAgLm91dGxpbmUtcmVhZGVyIHtcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xuICB9XG4gIC5vdXRsaW5lLXJlYWRlciAub3V0bGluZS10b29sYmFyIHtcbiAgICBkaXNwbGF5OiAtd2Via2l0LWJveDtcbiAgICBkaXNwbGF5OiAtbXMtZmxleGJveDtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIC13ZWJraXQtYm94LW9yaWVudDogaG9yaXpvbnRhbDtcbiAgICAtd2Via2l0LWJveC1kaXJlY3Rpb246IG5vcm1hbDtcbiAgICAgICAgLW1zLWZsZXgtZGlyZWN0aW9uOiByb3c7XG4gICAgICAgICAgICBmbGV4LWRpcmVjdGlvbjogcm93O1xuICAgIC1tcy1mbGV4LXdyYXA6IG5vd3JhcDtcbiAgICAgICAgZmxleC13cmFwOiBub3dyYXA7XG4gICAgLXdlYmtpdC1ib3gtYWxpZ246IGNlbnRlcjtcbiAgICAgICAgLW1zLWZsZXgtYWxpZ246IGNlbnRlcjtcbiAgICAgICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgLW1zLWZsZXgtaXRlbS1hbGlnbjogYXV0bztcbiAgICAgICAgYWxpZ24tc2VsZjogYXV0bztcbiAgICB0b3A6IDEwMCU7XG4gICAgcmlnaHQ6IDA7XG4gICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTQ4cHgpO1xuICAgICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC00OHB4KTtcbiAgICB3aWR0aDogMTAwJTtcbiAgICBoZWlnaHQ6IDQ4cHg7XG4gICAgLXdlYmtpdC1ib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgICAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICBib3JkZXItdG9wOiAxcHggc29saWQgI2RkZDtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmO1xuICAgIHBhZGRpbmc6IDAgMTZweDtcbiAgfVxuICAub3V0bGluZS1yZWFkZXIgLm91dGxpbmUtdG9vbGJhcl9fYnV0dG9uIHtcbiAgICBib3JkZXItcmFkaXVzOiAwO1xuICAgIC13ZWJraXQtYm94LWZsZXg6IDE7XG4gICAgICAgIC1tcy1mbGV4OiAxO1xuICAgICAgICAgICAgZmxleDogMTtcbiAgICBib3JkZXI6IG5vbmU7XG4gICAgLXdlYmtpdC1ib3gtc2hhZG93OiBub25lO1xuICAgICAgICAgICAgYm94LXNoYWRvdzogbm9uZTtcbiAgfVxuICAub3V0bGluZS1yZWFkZXItLXJlYWRpbmcge1xuICAgIHBhZGRpbmc6IDA7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjtcbiAgICAtd2Via2l0LWJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICB9XG4gIC5vdXRsaW5lLXJlYWRlcl9fcGFwZXIge1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICB6LWluZGV4OiAxO1xuICAgIG1hcmdpbjogMDtcbiAgICBwYWRkaW5nOiAwO1xuICAgIGhlaWdodDogMTAwJTtcbiAgICAtd2Via2l0LWJveC1zaGFkb3c6IG5vbmU7XG4gICAgICAgICAgICBib3gtc2hhZG93OiBub25lO1xuICAgIG92ZXJmbG93OiBoaWRkZW47XG4gIH1cbiAgLm91dGxpbmUtcmVhZGVyX190aXRsZSB7XG4gICAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpcztcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgei1pbmRleDogMztcbiAgICB0b3A6IDA7XG4gICAgbGVmdDogMDtcbiAgICBtYXJnaW46IDA7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgaGVpZ2h0OiA0OHB4O1xuICAgIGxpbmUtaGVpZ2h0OiA0OHB4O1xuICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjZGRkO1xuICAgIGZvbnQtc2l6ZTogMS44ZW07XG4gICAgZm9udC13ZWlnaHQ6IDQwMDtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmO1xuICAgIG92ZXJmbG93OiBoaWRkZW47XG4gIH1cbiAgLm91dGxpbmUtcmVhZGVyX19hcnRpY2xlIHtcbiAgICBtYXJnaW46IDQ4cHggMDtcbiAgICBoZWlnaHQ6IGNhbGMoMTAwJSAtIDk2cHgpO1xuICAgIHBhZGRpbmc6IDAgMS4yNWVtO1xuICAgIHNjcm9sbC10aW1lbGluZS1uYW1lOiAtLU1vYmlsZVByb2dyZXNzVGltZWxpbmU7XG4gICAgb3ZlcmZsb3cteDogaGlkZGVuO1xuICAgIG92ZXJmbG93LXk6IHNjcm9sbDtcbiAgfVxuICAub3V0bGluZS1yZWFkZXJfX2FydGljbGUgLm91dGxpbmUtcmVhZGVyX19wcm9ncmVzcyB7XG4gICAgei1pbmRleDogNDtcbiAgICAtd2Via2l0LWFuaW1hdGlvbjogb3V0bGluZS1yZWFkZXItcHJvZ3Jlc3MgbGluZWFyO1xuICAgICAgICAgICAgYW5pbWF0aW9uOiBvdXRsaW5lLXJlYWRlci1wcm9ncmVzcyBsaW5lYXI7XG4gICAgYW5pbWF0aW9uLXRpbWVsaW5lOiAtLU1vYmlsZVByb2dyZXNzVGltZWxpbmU7XG4gICAgZGlzcGxheTogYmxvY2s7XG4gIH1cbn1cbkBtZWRpYSBwcmludCB7XG4gIGh0bWwsXG4gIGJvZHkge1xuICAgIC8qIOaJk+WNsOeahOWfuuehgOWtl+S9k+Wkp+WwjyAqL1xuICAgIGZvbnQtc2l6ZTogMTJwdDtcbiAgICAvKiDmmL7npLrorr7nva7mloflrZfpopzoibLlkozog4zmma/popzoibIgKi9cbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmO1xuICAgIGNvbG9yOiAjMzMzO1xuICAgIGhlaWdodDogaW5pdGlhbCAhaW1wb3J0YW50O1xuICB9XG4gIC8qIOiuvue9rumTvuaOpeagt+W8jyAqL1xuICBhOmxpbmssXG4gIGE6dmlzaXRlZCxcbiAgYTpob3ZlciB7XG4gICAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmUgIWltcG9ydGFudDtcbiAgICBjb2xvcjogIzUwN2FmZTtcbiAgfVxuICAvKiDpmpDol4/lqpLkvZPmoIfnrb4gKi9cbiAgdmlkZW8sXG4gIGF1ZGlvIHtcbiAgICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7XG4gIH1cbiAgLyog56Gu5L+d6KGo5qC85Zyo5omT5Y2w5pe255qE6L655qGG5ZKM5a+56b2Q5pa55byP5riF5pmwICovXG4gIHRhYmxlIHtcbiAgICB3aWR0aDogMTAwJTtcbiAgICBib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlO1xuICB9XG4gIHRoLFxuICB0ZCB7XG4gICAgYm9yZGVyOiAxcHggc29saWQgI2RjZGZlNjtcbiAgICBwYWRkaW5nOiA4cHggMjBweDtcbiAgfVxuICAub3V0bGluZS1tZXNzYWdlLFxuICAub3V0bGluZS10b29sYmFyIHtcbiAgICAvKiDpmpDol4/kuoblt6XlhbfmoI/lkozkv6Hmga/mj5DnpLrmoYYgKi9cbiAgICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7XG4gIH1cbiAgLm91dGxpbmUtcmVhZGVyIHtcbiAgICBkaXNwbGF5OiBibG9jayAhaW1wb3J0YW50O1xuICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgLyog5Y+W5raI5LqG57ud5a+55a6a5L2NICovXG4gICAgLyog6ZqQ6JeP6ZiF6K+76L+b5bqm5p2hICovXG4gICAgLyog5omT5Y2w5pe25LiN5pi+56S65q2j5paHIERPTSDnmoTpmLTlvbHmlYjmnpwgKi9cbiAgICAvKiDmiYDmnInmlofnq6DlhoXlrrkgRE9NIOebuOWFs+eahOmCu+WxheiKgueCuemDvemakOiXj+S6hiAqL1xuICB9XG4gIC5vdXRsaW5lLXJlYWRlcl9fdGl0bGUge1xuICAgIG1hcmdpbjogMTMuNHB0IDAgMjhwdCAhaW1wb3J0YW50O1xuICAgIHRleHQtYWxpZ246IGNlbnRlciAhaW1wb3J0YW50O1xuICAgIGZvbnQtc2l6ZTogMzJwdCAhaW1wb3J0YW50O1xuICB9XG4gIC5vdXRsaW5lLXJlYWRlci0tcmVhZGluZyB7XG4gICAgcG9zaXRpb246IHJlbGF0aXZlICFpbXBvcnRhbnQ7XG4gICAgaGVpZ2h0OiBhdXRvICFpbXBvcnRhbnQ7XG4gICAgcGFkZGluZzogMCAhaW1wb3J0YW50O1xuICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmY7XG4gICAgb3ZlcmZsb3c6IGhpZGRlbiAhaW1wb3J0YW50O1xuICB9XG4gIC5vdXRsaW5lLXJlYWRlcl9fcHJvZ3Jlc3Mge1xuICAgIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDtcbiAgfVxuICAub3V0bGluZS1yZWFkZXJfX3BhcGVyIHtcbiAgICAtd2Via2l0LWJveC1zaGFkb3c6IG5vbmU7XG4gICAgICAgICAgICBib3gtc2hhZG93OiBub25lO1xuICB9XG4gIC5vdXRsaW5lLXJlYWRlciBwcmUge1xuICAgIHBhZGRpbmc6IDFlbSAhaW1wb3J0YW50O1xuICAgIGJvcmRlcjogMXB4IHNvbGlkICNkZGQgIWltcG9ydGFudDtcbiAgICBib3JkZXItcmFkaXVzOiA0cHggIWltcG9ydGFudDtcbiAgfVxuICAub3V0bGluZS1yZWFkZXIgcHJlLFxuICAub3V0bGluZS1yZWFkZXIgY29kZSB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZiAhaW1wb3J0YW50O1xuICB9XG4gIC5vdXRsaW5lLXJlYWRlciB0YWJsZSxcbiAgLm91dGxpbmUtcmVhZGVyIGltZyxcbiAgLm91dGxpbmUtcmVhZGVyIHN2ZyB7XG4gICAgLXdlYmtpdC1jb2x1bW4tYnJlYWstaW5zaWRlOiBhdm9pZDtcbiAgICAgICAtbW96LWNvbHVtbi1icmVhay1pbnNpZGU6IGF2b2lkO1xuICAgICAgICAgICAgYnJlYWstaW5zaWRlOiBhdm9pZDtcbiAgfVxuICAub3V0bGluZS1yZWFkZXJfc2libGluZyB7XG4gICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50O1xuICB9XG59XG4ub3V0bGluZS10b29sYmFyIHtcbiAgcG9zaXRpb246IGZpeGVkO1xuICB6LWluZGV4OiA5OTk5OTtcbiAgbWFyZ2luOiAwO1xuICAtd2Via2l0LXRyYW5zaXRpb24tZHVyYXRpb246IDAuM3M7XG4gICAgICAgICAgdHJhbnNpdGlvbi1kdXJhdGlvbjogMC4zcztcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi5vdXRsaW5lLXRvb2xiYXJfX2J1dHRvbiB7XG4gIC13ZWJraXQtYm94LXNoYWRvdzogMCAwIDZweCAxcHggI2RjZGZlNjtcbiAgICAgICAgICBib3gtc2hhZG93OiAwIDAgNnB4IDFweCAjZGNkZmU2O1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIHotaW5kZXg6IDE7XG4gIG1hcmdpbjogMTBweDtcbiAgd2lkdGg6IDM2cHg7XG4gIGhlaWdodDogMzZweDtcbiAgYm9yZGVyOiAxcHggc29saWQgI2RjZGZlNjtcbiAgYm9yZGVyLXJhZGl1czogM3B4O1xuICAtd2Via2l0LWJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjtcbiAgY3Vyc29yOiBwb2ludGVyO1xuICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gIGNvbG9yOiAjOTk5O1xuICAtd2Via2l0LXRyYW5zaXRpb246IGFsbCAwLjNzIDAuMXMgZWFzZS1pbi1vdXQ7XG4gIHRyYW5zaXRpb246IGFsbCAwLjNzIDAuMXMgZWFzZS1pbi1vdXQ7XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4ub3V0bGluZS10b29sYmFyX19idXR0b246aG92ZXIge1xuICBjb2xvcjogIzA1ODk0MjtcbiAgYm9yZGVyLWNvbG9yOiAjMDU4OTQyO1xuICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGUoMS4zNSk7XG4gICAgICAgICAgdHJhbnNmb3JtOiBzY2FsZSgxLjM1KTtcbn1cbi5vdXRsaW5lLXRvb2xiYXJfX2J1dHRvbi5oaWRlIHtcbiAgZGlzcGxheTogbm9uZTtcbn1cbi5vdXRsaW5lLXRvb2xiYXJfX2FuY2hvcjpsaW5rLFxuLm91dGxpbmUtdG9vbGJhcl9fYW5jaG9yOnZpc2l0ZWQsXG4ub3V0bGluZS10b29sYmFyX19hbmNob3I6aG92ZXIge1xuICBjb2xvcjogIzk5OTtcbiAgdGV4dC1kZWNvcmF0aW9uOiBub25lO1xufVxuLm91dGxpbmUtdG9vbGJhcl9fYW5jaG9yOmhvdmVyIHtcbiAgY29sb3I6ICMwNTg5NDI7XG59XG4ub3V0bGluZS10b29sYmFyX19pY29uIHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB6LWluZGV4OiAyO1xuICB0b3A6IDUwJTtcbiAgbGVmdDogNTAlO1xuICB3aWR0aDogMjBweDtcbiAgaGVpZ2h0OiAyMHB4O1xuICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIC01MCUpO1xuICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIC01MCUpO1xuICBmaWxsOiBjdXJyZW50Y29sb3I7XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4ub3V0bGluZS10b29sYmFyX2FjdGl2ZS5vdXRsaW5lLXRvb2xiYXJfX2J1dHRvbiB7XG4gIGNvbG9yOiAjZmZmO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjMDU4OTQyO1xuICBib3JkZXItY29sb3I6ICMwNTg5NDI7XG59XG4ub3V0bGluZS10b29sYmFyX2FjdGl2ZS5vdXRsaW5lLXRvb2xiYXJfX2J1dHRvbjpob3ZlciB7XG4gIGNvbG9yOiAjZmZmO1xufVxuLm91dGxpbmUtdG9vbGJhcl9hY3RpdmUgLm91dGxpbmUtdG9vbGJhcl9fYW5jaG9yOmxpbmssXG4ub3V0bGluZS10b29sYmFyX2FjdGl2ZSAub3V0bGluZS10b29sYmFyX19hbmNob3I6dmlzaXRlZCxcbi5vdXRsaW5lLXRvb2xiYXJfYWN0aXZlIC5vdXRsaW5lLXRvb2xiYXJfX2FuY2hvcjpob3ZlciB7XG4gIGNvbG9yOiAjZmZmO1xufVxuLm91dGxpbmUtdG9vbGJhcl9yb3VuZGVkLm91dGxpbmUtdG9vbGJhcl9fYnV0dG9uIHtcbiAgYm9yZGVyLXJhZGl1czogMThweDtcbn1cbi5vdXRsaW5lLXRvb2xiYXJfZGlzYWJsZWQub3V0bGluZS10b29sYmFyX19hbmNob3I6bGluayxcbi5vdXRsaW5lLXRvb2xiYXJfZGlzYWJsZWQgLm91dGxpbmUtdG9vbGJhcl9fYW5jaG9yOmxpbmssXG4ub3V0bGluZS10b29sYmFyX2Rpc2FibGVkLm91dGxpbmUtdG9vbGJhcl9fYW5jaG9yOnZpc2l0ZWQsXG4ub3V0bGluZS10b29sYmFyX2Rpc2FibGVkIC5vdXRsaW5lLXRvb2xiYXJfX2FuY2hvcjp2aXNpdGVkLFxuLm91dGxpbmUtdG9vbGJhcl9kaXNhYmxlZC5vdXRsaW5lLXRvb2xiYXJfX2FuY2hvcjpob3Zlcixcbi5vdXRsaW5lLXRvb2xiYXJfZGlzYWJsZWQgLm91dGxpbmUtdG9vbGJhcl9fYW5jaG9yOmhvdmVyLFxuLm91dGxpbmUtdG9vbGJhcl9kaXNhYmxlZC5vdXRsaW5lLXRvb2xiYXJfX2J1dHRvbixcbi5vdXRsaW5lLXRvb2xiYXJfZGlzYWJsZWQgLm91dGxpbmUtdG9vbGJhcl9fYnV0dG9uIHtcbiAgY3Vyc29yOiBub3QtYWxsb3dlZDtcbiAgY29sb3I6ICM5OTk7XG4gIGJvcmRlci1jb2xvcjogIzk5OTtcbn1cbi5vdXRsaW5lLXRvb2xiYXJfZGlzYWJsZWQub3V0bGluZS10b29sYmFyX19hbmNob3I6bGluazpob3Zlcixcbi5vdXRsaW5lLXRvb2xiYXJfZGlzYWJsZWQgLm91dGxpbmUtdG9vbGJhcl9fYW5jaG9yOmxpbms6aG92ZXIsXG4ub3V0bGluZS10b29sYmFyX2Rpc2FibGVkLm91dGxpbmUtdG9vbGJhcl9fYW5jaG9yOnZpc2l0ZWQ6aG92ZXIsXG4ub3V0bGluZS10b29sYmFyX2Rpc2FibGVkIC5vdXRsaW5lLXRvb2xiYXJfX2FuY2hvcjp2aXNpdGVkOmhvdmVyLFxuLm91dGxpbmUtdG9vbGJhcl9kaXNhYmxlZC5vdXRsaW5lLXRvb2xiYXJfX2FuY2hvcjpob3Zlcjpob3Zlcixcbi5vdXRsaW5lLXRvb2xiYXJfZGlzYWJsZWQgLm91dGxpbmUtdG9vbGJhcl9fYW5jaG9yOmhvdmVyOmhvdmVyLFxuLm91dGxpbmUtdG9vbGJhcl9kaXNhYmxlZC5vdXRsaW5lLXRvb2xiYXJfX2J1dHRvbjpob3Zlcixcbi5vdXRsaW5lLXRvb2xiYXJfZGlzYWJsZWQgLm91dGxpbmUtdG9vbGJhcl9fYnV0dG9uOmhvdmVyIHtcbiAgY29sb3I6ICM5OTk7XG4gIGJvcmRlci1jb2xvcjogIzk5OTtcbn1cbi5vdXRsaW5lLXRvb2xiYXJfZGlzYWJsZWQub3V0bGluZS10b29sYmFyX19idXR0b24sXG4ub3V0bGluZS10b29sYmFyX2Rpc2FibGVkIC5vdXRsaW5lLXRvb2xiYXJfX2J1dHRvbiB7XG4gIGJhY2tncm91bmQtY29sb3I6ICNmNWY1ZjU7XG59XG4ub3V0bGluZS10b29sYmFyX3R0Yixcbi5vdXRsaW5lLXRvb2xiYXJfYnR0IHtcbiAgbGVmdDogNTAlO1xuICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlWCgtNTAlKTtcbiAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTUwJSk7XG59XG4ub3V0bGluZS10b29sYmFyX3R0YiAub3V0bGluZS10b29sYmFyX19idXR0b24sXG4ub3V0bGluZS10b29sYmFyX2J0dCAub3V0bGluZS10b29sYmFyX19idXR0b24ge1xuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG59XG4ub3V0bGluZS10b29sYmFyX3R0YiB7XG4gIHRvcDogMTJweDtcbn1cbi5vdXRsaW5lLXRvb2xiYXJfdHRiLm91dGxpbmUtdG9vbGJhcl9oaWRkZW4ge1xuICB0b3A6IC01NnB4O1xufVxuLm91dGxpbmUtdG9vbGJhcl9idHQge1xuICBib3R0b206IDEycHg7XG59XG4ub3V0bGluZS10b29sYmFyX2J0dC5vdXRsaW5lLXRvb2xiYXJfaGlkZGVuIHtcbiAgYm90dG9tOiAtNTZweDtcbn1cbi5vdXRsaW5lLXRvb2xiYXJfcnRsLFxuLm91dGxpbmUtdG9vbGJhcl9sdHIge1xuICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlWSgtNTAlKTtcbiAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTUwJSk7XG4gIHdpZHRoOiA1NnB4O1xufVxuLm91dGxpbmUtdG9vbGJhcl9ydGwge1xuICB0b3A6IDUwJTtcbiAgcmlnaHQ6IDEycHg7XG59XG4ub3V0bGluZS10b29sYmFyX3J0bC5vdXRsaW5lLXRvb2xiYXJfaGlkZGVuIHtcbiAgcmlnaHQ6IC04NnB4O1xufVxuLm91dGxpbmUtdG9vbGJhcl9sdHIge1xuICB0b3A6IDUwJTtcbiAgbGVmdDogMTJweDtcbn1cbi5vdXRsaW5lLXRvb2xiYXJfbHRyLm91dGxpbmUtdG9vbGJhcl9oaWRkZW4ge1xuICBsZWZ0OiAtODZweDtcbn1cbi5vdXRsaW5lLXRvb2xiYXJfdHRiIC5vdXRsaW5lLXRvb2xiYXJfX2J1dHRvbi5vdXRsaW5lLXRvb2xiYXJfaGlkZGVuLFxuLm91dGxpbmUtdG9vbGJhcl9ydGwgLm91dGxpbmUtdG9vbGJhcl9fYnV0dG9uLm91dGxpbmUtdG9vbGJhcl9oaWRkZW4sXG4ub3V0bGluZS10b29sYmFyX2J0dCAub3V0bGluZS10b29sYmFyX19idXR0b24ub3V0bGluZS10b29sYmFyX2hpZGRlbixcbi5vdXRsaW5lLXRvb2xiYXJfbHRyIC5vdXRsaW5lLXRvb2xiYXJfX2J1dHRvbi5vdXRsaW5lLXRvb2xiYXJfaGlkZGVuIHtcbiAgZGlzcGxheTogbm9uZTtcbn1cblxuLyojIHNvdXJjZU1hcHBpbmdVUkw9ZGF0YTphcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9dXRmODtiYXNlNjQsZXlKMlpYSnphVzl1SWpvekxDSnpiM1Z5WTJWeklqcGJJaTR1THk0dUx6eHBibkIxZENCamMzTWdNVDRpTENKdWIzSnRZV3hwZW1VdWJHVnpjeUlzSW1KaGMyVXViR1Z6Y3lJc0luTmpjbTlzYkdKaGNpNXNaWE56SWl3aWJHRjViM1YwTG14bGMzTWlMQ0poYzJsa1pTNXNaWE56SWl3aWJXRnBiaTVzWlhOeklpd2ljMlZqZEdsdmJpNXNaWE56SWl3aVkyRnpaUzVzWlhOeklpd2lMaTR2TGk0dmRHaGxiV1V2ZG1GeWFXRmliR1Z6TG14bGMzTWlMQ0l1TGk4dUxpOTBhR1Z0WlM5cFkyOXVjeTVzWlhOeklpd2lMaTR2TGk0dmRHaGxiV1V2YzJOeWIyeHNZbUZ5TG14bGMzTWlMQ0l1TGk4dUxpOWhibU5vYjNKekwyRnVZMmh2Y25NdWJHVnpjeUlzSWk0dUx5NHVMMlJ5WVhkbGNpOWtjbUYzWlhJdWJHVnpjeUlzSWk0dUx5NHVMM1JvWlcxbEwzTm9ZV1J2ZHk1c1pYTnpJaXdpTGk0dkxpNHZibUYyYVdkaGRHOXlMMjVoZG1sbllYUnZjaTVzWlhOeklpd2lMaTR2TGk0dmRHaGxiV1V2Wld4c2FYQnphWE11YkdWemN5SXNJaTR1THk0dUwzSmxZV1JsY2k5eVpXRmtaWEl1YkdWemN5SXNJaTR1THk0dUwzUm9aVzFsTDNKaFpHbDFjeTVzWlhOeklpd2lMaTR2TGk0dmRHOXZiR0poY2k5MGIyOXNZbUZ5TG14bGMzTWlYU3dpYm1GdFpYTWlPbHRkTENKdFlYQndhVzVuY3lJNklrRkJRVUVzTkVWQlFUUkZPMEZCUXpWRk8yZEdRVU5uUmp0QlFVTm9SanM3TzBkQlIwYzdRVU5KU0R0RlFVTkZMR3RDUVVGQk8wVkVSa0VzVDBGQlR6dEZRMGRRTEN0Q1FVRkJPMFZFUkVFc1QwRkJUenREUVVOU08wRkJRMFE3WjBaQlEyZEdPMEZCUTJoR096dEhRVVZITzBGRFMwZzdSVUZEUlN4VlFVRkJPME5FU0VRN1FVRkRSRHM3UjBGRlJ6dEJRMDlJTzBWQlEwVXNaVUZCUVR0RFJFeEVPMEZCUTBRN096dEhRVWRITzBGRFUwZzdSVUZEUlN4bFFVRkJPMFZCUTBFc2FVSkJRVUU3UTBSUVJEdEJRVU5FTzJkR1FVTm5SanRCUVVOb1JqczdPMGRCUjBjN1FVTlpTRHRGUVVORkxHZERRVUZCTzFWQlFVRXNkMEpCUVVFN1JVUldRU3hQUVVGUE8wVkRWMUFzVlVGQlFUdEZSRlJCTEU5QlFVODdSVU5WVUN4clFrRkJRVHRGUkZKQkxFOUJRVTg3UTBGRFVqdEJRVU5FT3pzN1IwRkhSenRCUTFkSU8wVkJRMFVzYTBOQlFVRTdSVVJVUVN4UFFVRlBPMFZEVlZBc1pVRkJRVHRGUkZKQkxFOUJRVTg3UTBGRFVqdEJRVU5FTzJkR1FVTm5SanRCUVVOb1JqczdSMEZGUnp0QlExbElPMFZCUTBVc09FSkJRVUU3UTBSV1JEdEJRVU5FT3pzN1IwRkhSenRCUTJOSU8wVkJRMFVzYjBKQlFVRTdSVVJhUVN4UFFVRlBPMFZEWVZBc01rSkJRVUU3UlVSWVFTeFBRVUZQTzBWRFdWQXNNRU5CUVVFN1ZVRkJRU3hyUTBGQlFUdEZSRlpCTEU5QlFVODdRMEZEVWp0QlFVTkVPenRIUVVWSE8wRkRZVWc3TzBWQlJVVXNiMEpCUVVFN1EwUllSRHRCUVVORU96czdSMEZIUnp0QlEyVklPenM3UlVGSFJTeHJRMEZCUVR0RlJHSkJMRTlCUVU4N1JVTmpVQ3hsUVVGQk8wVkVXa0VzVDBGQlR6dERRVU5TTzBGQlEwUTdPMGRCUlVjN1FVTmxTRHRGUVVORkxHVkJRVUU3UTBSaVJEdEJRVU5FT3pzN1IwRkhSenRCUTJsQ1NEczdSVUZGUlN4bFFVRkJPMFZCUTBFc1pVRkJRVHRGUVVOQkxHMUNRVUZCTzBWQlEwRXNlVUpCUVVFN1EwUm1SRHRCUTJ0Q1JEdEZRVU5GTEdkQ1FVRkJPME5FYUVKRU8wRkRiVUpFTzBWQlEwVXNXVUZCUVR0RFJHcENSRHRCUVVORU8yZEdRVU5uUmp0QlFVTm9SanM3UjBGRlJ6dEJRM05DU0R0RlFVTkZMRzFDUVVGQk8wTkVjRUpFTzBGQlEwUTdaMFpCUTJkR08wRkJRMmhHT3pzN1IwRkhSenRCUTNsQ1NEczdPenM3UlVGTFJTeHhRa0ZCUVR0RlJIWkNRU3hQUVVGUE8wVkRkMEpRTEdkQ1FVRkJPMFZFZEVKQkxFOUJRVTg3UlVOMVFsQXNhMEpCUVVFN1JVUnlRa0VzVDBGQlR6dEZRM05DVUN4VlFVRkJPMFZFY0VKQkxFOUJRVTg3UTBGRFVqdEJRVU5FT3pzN1IwRkhSenRCUTNWQ1NEczdSVVJ3UWtVc1QwRkJUenRGUTNWQ1VDeHJRa0ZCUVR0RFJISkNSRHRCUVVORU96czdSMEZIUnp0QlEzbENTRHM3UlVSMFFrVXNUMEZCVHp0RlEzbENVQ3h4UWtGQlFUdERSSFpDUkR0QlFVTkVPenRIUVVWSE8wRkRNa0pJT3pzN08wVkJTVVVzTWtKQlFVRTdRMFI2UWtRN1FVRkRSRHM3UjBGRlJ6dEJRelpDU0RzN096dEZRVWxGTEcxQ1FVRkJPMFZCUTBFc1YwRkJRVHREUkROQ1JEdEJRVU5FT3p0SFFVVkhPMEZESzBKSU96czdPMFZCU1VVc0swSkJRVUU3UTBRM1FrUTdRVUZEUkRzN1IwRkZSenRCUTJsRFNEdEZRVU5GTEN0Q1FVRkJPME5FTDBKRU8wRkJRMFE3T3pzN08wZEJTMGM3UVVOdFEwZzdSVUZEUlN3clFrRkJRVHRWUVVGQkxIVkNRVUZCTzBWRWFrTkJMRTlCUVU4N1JVTnJRMUFzWlVGQlFUdEZSR2hEUVN4UFFVRlBPMFZEYVVOUUxHVkJRVUU3UlVRdlFrRXNUMEZCVHp0RlEyZERVQ3huUWtGQlFUdEZSRGxDUVN4UFFVRlBPMFZESzBKUUxGZEJRVUU3UlVRM1FrRXNUMEZCVHp0RlF6aENVQ3h2UWtGQlFUdEZSRFZDUVN4UFFVRlBPME5CUTFJN1FVRkRSRHM3UjBGRlJ6dEJReXRDU0R0RlFVTkZMSGxDUVVGQk8wTkVOMEpFTzBGQlEwUTdPMGRCUlVjN1FVTnBRMGc3UlVGRFJTeGxRVUZCTzBORUwwSkVPMEZCUTBRN096dEhRVWRITzBGRGJVTklPenRGUVVWRkxDdENRVUZCTzFWQlFVRXNkVUpCUVVFN1JVUnFRMEVzVDBGQlR6dEZRMnREVUN4WFFVRkJPMFZFYUVOQkxFOUJRVTg3UTBGRFVqdEJRVU5FT3p0SFFVVkhPMEZEYlVOSU96dEZRVVZGTEdGQlFVRTdRMFJxUTBRN1FVRkRSRHM3TzBkQlIwYzdRVU54UTBnN1JVRkRSU3c0UWtGQlFUdEZSRzVEUVN4UFFVRlBPMFZEYjBOUUxIRkNRVUZCTzBWRWJFTkJMRTlCUVU4N1EwRkRVanRCUVVORU96dEhRVVZITzBGRGNVTklPMFZCUTBVc2VVSkJRVUU3UTBSdVEwUTdRVUZEUkRzN08wZEJSMGM3UVVOMVEwZzdSVUZEUlN3eVFrRkJRVHRGUkhKRFFTeFBRVUZQTzBWRGMwTlFMR05CUVVFN1JVUndRMEVzVDBGQlR6dERRVU5TTzBGQlEwUTdaMFpCUTJkR08wRkJRMmhHT3p0SFFVVkhPMEZEZDBOSU8wVkJRMFVzWlVGQlFUdERSSFJEUkR0QlFVTkVPenRIUVVWSE8wRkRNRU5JTzBWQlEwVXNiVUpCUVVFN1EwUjRRMFE3UVVGRFJEdG5Sa0ZEWjBZN1FVRkRhRVk3TzBkQlJVYzdRVU0yUTBnN1JVRkRSU3hqUVVGQk8wTkVNME5FTzBGQlEwUTdPMGRCUlVjN1FVTXJRMGc3UlVGRFJTeGpRVUZCTzBORU4wTkVPMEZCUTBRc2MwSkJRWE5DTzBGRk9WTjBRanM3UlVGRlJTeGhRVUZCTzBWQlEwRXNiMEpCUVVFN1JVRkRRU3haUVVGQk8wVkJRMEVzWjBKQlFVRTdSVUZEUVN4clFrRkJRVHRGUVVOQkxIRkVRVUZCTzBWQlEwRXNhVUpCUVVFN1EwWm5WRVE3UVVVMVUwTTdPenRGUVVkRkxHVkJRVUU3UlVGRFFTeHpRa0ZCUVR0RFJqaFRTRHRCUlROVFF6dEZRVU5GTERKQ1FVRkJPME5HTmxOSU8wRkZlbE5FTzBWQlEwVXNkMFpCUVVFN1EwWXlVMFE3UVVGRFJDd3lRa0ZCTWtJN1FVZDJWVE5DTzBWQlEwVXNWMEZCUVR0RlFVTkJMRmxCUVVFN1JVRkRRU3d5UWtGQlFUdERTSGxWUkR0QlIzUlZSRHRGUVVORkxESkNRVUZCTzBOSWQxVkVPMEZIY2xWRU8wVkJRMFVzYzBOQlFVRTdSVUZEUVN3eVFrRkJRVHREU0hWVlJEdEJSM0JWUkR0RlFVTkZMSE5EUVVGQk8wVkJRMEVzTWtKQlFVRTdRMGh6VlVRN1FVZHVWVVE3UlVGRFJTeHpRMEZCUVR0RFNIRlZSRHRCUjJ4VlJEdEZRVU5GTEhORFFVRkJPME5JYjFWRU8wRkJRMFFzV1VGQldUdEJTVFZXV2p0RlFVTkZMSEZDUVVGQk8wVkJRVUVzY1VKQlFVRTdSVUZCUVN4alFVRkJPMFZCUTBFc0swSkJRVUU3UlVGQlFTdzRRa0ZCUVR0TlFVRkJMSGRDUVVGQk8xVkJRVUVzYjBKQlFVRTdSVUZEUVN4elFrRkJRVHROUVVGQkxHdENRVUZCTzBWQlEwRXNiVUpCUVVFN1JVRkRRU3hYUVVGQk8wVkJRMEVzWVVGQlFUdEZRVU5CTEZsQlFVRTdSVUZEUVN4VlFVRkJPMFZCUTBFc2FVSkJRVUU3UTBvNFZrUTdRVUZEUkN4WFFVRlhPMEZKTTFaWU8wVkJRMFVzY1VKQlFVRTdSVUZCUVN4eFFrRkJRVHRGUVVGQkxHTkJRVUU3UlVGRFFTeHhRa0ZCUVR0TlFVRkJMR1ZCUVVFN1JVRkRRU3cyUWtGQlFUdEZRVUZCTERoQ1FVRkJPMDFCUVVFc01rSkJRVUU3VlVGQlFTeDFRa0ZCUVR0RlFVTkJMSE5DUVVGQk8wMUJRVUVzYTBKQlFVRTdSVUZEUVN4aFFVRkJPMFZCUTBFc1ZVRkJRVHRGUVVOQkxHRkJRVUU3UlVGRFFTeDFRa0ZCUVR0RlFVTkJMRmxCUVVFN1JVRkRRU3h4UTBGQlFUdFZRVUZCTERaQ1FVRkJPMFZCUTBFc2EwTkJRVUU3VlVGQlFTd3dRa0ZCUVR0RlFVTkJMR1ZCUVVFN1EwbzJWa1E3UVVGRFJDeFZRVUZWTzBGSk1WWldPMFZCUTBVc2IwSkJRVUU3VFVGQlFTeFpRVUZCTzFWQlFVRXNVVUZCUVR0RlFVTkJMRzFDUVVGQk8wVkJRMEVzVjBGQlFUdEZRVU5CTEdGQlFVRTdSVUZEUVN4MVFrRkJRVHRGUVVOQkxHVkJRVUU3UTBvMFZrUTdRVWw2VmtRN1JVRkRSVHRKUVVORkxEWkNRVUZCTzBsQlFVRXNPRUpCUVVFN1VVRkJRU3d5UWtGQlFUdFpRVUZCTEhWQ1FVRkJPMGRLTWxaRU8wVkplRlpFT3p0SlFVVkZMRmxCUVVFN1Iwb3dWa1E3UlVsMlZrUTdTVUZEUlN4blFrRkJRVHRKUVVOQkxGZEJRVUU3U1VGRFFTeFBRVUZCTzBkS2VWWkVPMFZKZEZaSE8wbEJRMFVzV1VGQlFUdEhTbmRXVER0RlNYSldSenRKUVVORkxGRkJRVUU3UjBwMVZrdzdRMEZEUmp0QlMzQmFSRHRGUVVORkxIZEdRVUZCTzBOTWMxcEVPMEZMYmxwRE8wVkJRMFVzWlVGQlFUdEZRVU5CTEhGQ1FVRkJPMDFCUVVFc1pVRkJRVHRGUVVOQkxHbENRVUZCTzBOTWNWcElPMEZMYkZwRE8wVkJRMFVzYjBKQlFVRTdUVUZCUVN4WlFVRkJPMVZCUVVFc1VVRkJRVHRGUVVOQkxHVkJRVUU3UTB4dldrZzdRVXRxV2tNN1JVRkRSU3hsUVVGQk8wVkJRMEVzWVVGQlFUdEZRVU5CTEd0Q1FVRkJPMFZCUTBFc1owSkJRVUU3UlVGRFFTeHZRa0ZCUVR0RlFVTkJMR3RFUVVGQk8wVkJRMEVzYlVKQlFVRTdSVUZEUVN4cFFrRkJRVHREVEcxYVNEdEJTMmhhUXp0RlFVTkZMR1ZCUVVFN1JVRkRRU3huUWtGQlFUdEZRVU5CTEdkQ1FVRkJPMFZCUTBFc2FVSkJRVUU3UTB4cldrZzdRVXN2V1VNN1JVRkRSU3hWUVVGQk8wVkJRMEVzWjBKQlFVRTdSVUZEUVN4cFFrRkJRVHREVEdsYVNEdEJTemxaUXp0RlFVTkZMR0ZCUVVFN1JVRkRRU3hyUWtGQlFUdEZRVU5CTEdkQ1FVRkJPMFZCUTBFc1owSkJRVUU3UlVGRFFTeG5Ra0ZCUVR0RlFVTkJMR2xDUVVGQk8wTk1aMXBJTzBGTE4xbERPMFZCUTBVc2IwSkJRVUU3VFVGQlFTeFpRVUZCTzFWQlFVRXNVVUZCUVR0RFRDdFpTRHRCU3pOWlR6dEZRVU5GTEhWQ1FVRkJPME5NTmxsVU8wRkxNMWxUTzBWQlEwVXNkVUpCUVVFN1EwdzJXVmc3UVV0NFdVczdSVUZEUlN4MVFrRkJRVHRGUVVOQkxEUkNRVUZCTzBOTU1GbFFPMEZMZEZsUE8wVkJRMFVzV1VGQlFUdEZRVU5CTEhOQ1FVRkJPME5NZDFsVU8wRkxjbGxQTzBWQlEwVXNXVUZCUVR0RlFVTkJMSE5DUVVGQk8wTk1kVmxVTzBGTGNGbFBPMFZCUTBVc1dVRkJRVHRGUVVOQkxESkNRVUZCTzBOTWMxbFVPMEZMYUZsVE96czdSVUZIUlN4WlFVRkJPME5NYTFsWU8wRk5NV1JET3p0RlFVVkZMR1ZCUVVFN1JVRkRRU3hoUVVGQk8wVkJRMEVzYlVKQlFVRTdSVUZEUVN4cFFrRkJRVHREVGpSa1NEdEJUWHBrUXp0RlFVTkZMR1ZCUVVFN1JVRkRRU3hwUWtGQlFUdEZRVU5CTEdWQlFVRTdSVUZEUVN4dlFrRkJRVHRGUVVOQkxHbENRVUZCTzBWQlEwRXNhVUpCUVVFN1EwNHlaRWc3UVUxNFpFTTdSVUZEUlN4bFFVRkJPMFZCUTBFc2IwSkJRVUU3UTA0d1pFZzdRVTEyWkVNN1JVRkRSU3hwUWtGQlFUdEZRVU5CTEdsQ1FVRkJPMFZCUTBFc2JVSkJRVUU3UlVGRFFTeGxRVUZCTzBWQlEwRXNXVUZCUVR0RlFVTkJMR2xDUVVGQk8wVkJRMEVzYVVKQlFVRTdRMDU1WkVnN1FVMTBaRU03UlVGRFJTeGpRVUZCTzBWQlEwRXNZVUZCUVR0RlFVTkJMR2RDUVVGQk8wVkJRMEVzYTBKQlFVRTdSVUZEUVN4dFFrRkJRVHRGUVVOQkxEQkNRVUZCTzBWQlEwRXNNa0pCUVVFN1JVRkRRU3c0UWtGQlFUdEZRVU5CTEZsQlFVRTdSVUZEUVN4cFFrRkJRVHREVG5ka1NEdEJUWEprUXp0RlFVTkZMR2xDUVVGQk8wVkJRMEVzWVVGQlFUdEZRVU5CTEcxQ1FVRkJPMFZCUTBFc2FVSkJRVUU3UTA1MVpFZzdRVTF3WkVNN1JVRkRSU3h6UWtGQlFUdEZRVU5CTEcxQ1FVRkJPMFZCUTBFc2JVSkJRVUU3UlVGRFFTeG5Ra0ZCUVR0RlFVTkJMSGRHUVVGQk8wVkJSVUVzTUVKQlFVRTdSVUZEUVN4cFFrRkJRVHREVG5Ga1NEdEJUVzVrUnpzN08wVkJSMFVzV1VGQlFUdEZRVU5CTEhOQ1FVRkJPME5PY1dSTU8wRk5hbVJETzBWQlEwVXNZMEZCUVR0RlFVTkJMREpDUVVGQk8wTk9iV1JJTzBGUE5XaENSRHRGUVVORkxHTkJRVUU3UlVGRFFTeHBRa0ZCUVR0RFVEaG9Ra1E3UVU4MWFFSkRPenM3UlVGSFJTeFZRVUZCTzBWQlEwRXNaVUZCUVR0RlFVTkJMR2xDUVVGQk8wTlFPR2hDU0R0QlR6Tm9Ra003UlVGRFJTeFpRVUZCTzBOUU5taENTRHRCVHpGb1FrTTdSVUZEUlN4bFFVRkJPMFZCUTBFc2EwSkJRVUU3UTFBMGFFSklPMEZQZW1oQ1F6dEZRVU5GTEdsQ1FVRkJPMFZCUTBFc1dVRkJRVHREVURKb1FrZzdRVTk0YUVKRE8wVkJRMFVzWlVGQlFUdEZRVU5CTEZsQlFVRTdRMUF3YUVKSU8wRlBkbWhDUXpzN08wVkJSMFVzVlVGQlFUdEZRVU5CTEZkQlFVRTdSVUZEUVN4cFFrRkJRVHREVUhsb1FrZzdRVTkwYUVKRE8wVkJRMFVzYlVKQlFVRTdSVUZEUVN4WFFVRkJPME5RZDJoQ1NEdEJUM0pvUWtNN1JVRkRSU3h6UWtGQlFUdERVSFZvUWtnN1FVOXdhRUpETzBWQlEwVXNjMEpCUVVFN1JVRkRRU3hsUVVGQk8wTlFjMmhDU0R0QlQyNW9Ra003UlVGRFJTeGpRVUZCTzBWQlEwRXNZVUZCUVR0RlFVTkJMR2RDUVVGQk8wVkJRMEVzYTBKQlFVRTdSVUZEUVN4cFFrRkJRVHRGUVVOQkxEQkNRVUZCTzBWQlEwRXNkVUpCUVVFN1JVRkRRU3h0UWtGQlFUdEZRVU5CTEZsQlFVRTdSVUZEUVN4bFFVRkJPME5RY1doQ1NEdEJUMnhvUWtNN1JVRkRSU3hsUVVGQk8wVkJRMEVzWlVGQlFUdEZRVU5CTEdsQ1FVRkJPME5RYjJoQ1NEdEJUMnBvUWtNN1JVRkRSU3d5UWtGQlFUdEZRVU5CTEdkQ1FVRkJPMFZCUTBFc01FSkJRVUU3UlVGRFFTeFpRVUZCTzBOUWJXaENTRHRCVDJob1FrTTdSVUZEUlN4cFFrRkJRVHRGUVVOQkxGbEJRVUU3UlVGRFFTd3lRa0ZCUVR0RFVHdG9Ra2c3UVU4dlowSkRPenRGUVVWRkxHdENRVUZCTzBWQlEwRXNhMEpCUVVFN1JVRkRRU3c0UWtGQlFUdERVR2xvUWtnN1FVODVaMEpETzBWQlEwVXNiVUpCUVVFN1JVRkRRU3d3UWtGQlFUdERVR2RvUWtnN1FVODFaMEpFTzBWQlJVazdPMGxCUlVVc1pVRkJRVHRIVURablFrZzdRMEZEUmp0QlVYQnVRa1E3UlVGRFJTeHRRa0ZCUVR0RlFVTkJMRmRCUVVFN1JVRkRRU3hqUVVGQk8wVkJRMEVzYzBOQlFVRTdSVUZEUVN4VlFVRkJPMFZCUTBFc1lVRkJRVHRGUVVOQkxESkNRVUZCTzBWQlEwRXNPRUpCUVVFN1JVRkRRU3hwUWtGQlFUdERVbk51UWtRN1FWRndia0pETzBWQlEwVXNXVUZCUVR0RlFVTkJMRzFDUVVGQk8wVkJRMEVzVjBGQlFUdEZRVU5CTEU5QlFVRTdSVUZEUVN4VlFVRkJPMFZCUTBFc1lVRkJRVHRGUVVOQkxGTkJRVUU3UlVGRFFTdzBRa0ZCUVR0RlFVTkJMR2xDUVVGQk8wTlNjMjVDU0R0QlVXNXVRa003TzBWQlJVVXNaMEpCUVVFN1JVRkRRU3hyUWtGQlFUdERVbkZ1UWtnN1FWRnNia0pET3pzN1JVRkhSU3hwUlVGQlFUdERVbTl1UWtnN1FWRnFia0pETzBWQlEwVXNWVUZCUVR0RlFVTkJMR0ZCUVVFN1JVRkRRU3d3UWtGQlFUdEZRVU5CTEdGQlFVRTdSVUZEUVN4dFFrRkJRVHRGUVVOQkxDdENRVUZCTzFWQlFVRXNkVUpCUVVFN1JVRkRRU3hsUVVGQk8wTlNiVzVDU0R0QlVXaHVRa003UlVGRFJTeGxRVUZCTzBWQlEwRXNZVUZCUVR0RlFVTkJMR3RDUVVGQk8wVkJRMEVzWjBKQlFVRTdSVUZEUVN4blFrRkJRVHRGUVVOQkxHdENRVUZCTzBWQlEwRXNhVUpCUVVFN1ExSnJia0pJTzBGUkwyMUNRenM3UlVGRlJTeG5Ra0ZCUVR0RlFVTkJMR1ZCUVVFN1JVRkRRU3d3UWtGQlFUdExRVUZCTEhWQ1FVRkJPMDFCUVVFc2MwSkJRVUU3VlVGQlFTeHJRa0ZCUVR0RFVtbHVRa2c3UVZFNWJVSkRPMFZCUTBVc1owSkJRVUU3UlVGRFFTeHRRa0ZCUVR0RFVtZHVRa2c3UVZFNWJVSkhPMFZCUTBVc1owSkJRVUU3UTFKbmJrSk1PMEZSTlcxQ1F6dEZRVU5GTEdGQlFVRTdRMUk0YlVKSU8wRlJNMjFDUXp0RlFVTkZMR1ZCUVVFN1JVRkRRU3hqUVVGQk8wVkJRMEVzZFVKQlFVRTdSVUZEUVN4cFFrRkJRVHREVWpadFFrZzdRVkV4YlVKRE8wVkJRMFVzWlVGQlFUdEZRVU5CTEZsQlFVRTdSVUZEUVN4aFFVRkJPMFZCUTBFc1lVRkJRVHRGUVVOQkxHTkJRVUU3UlVGRFFTeGhRVUZCTzBWQlEwRXNLMEpCUVVFN1ZVRkJRU3gxUWtGQlFUdEZRVU5CTEdWQlFVRTdRMUkwYlVKSU8wRlJlbTFDUXpzN1JVRkZSU3hWUVVGQk8wVkJRMEVzVjBGQlFUdEZRVU5CTEhOQ1FVRkJPMFZCUTBFc2FVSkJRVUU3UTFJeWJVSklPMEZSZUcxQ1F6dEZRVU5GTEdOQlFVRTdSVUZEUVN3eVFrRkJRVHRGUVVOQkxEaENRVUZCTzBWQlEwRXNaMEpCUVVFN1JVRkRRU3hsUVVGQk8wTlNNRzFDU0R0QlVYWnRRa003UlVGRFJTeGhRVUZCTzBWQlEwRXNhMEpCUVVFN1JVRkRRU3huUWtGQlFUdEZRVU5CTEdkQ1FVRkJPME5TZVcxQ1NEdEJVWFp0UWtjN1JVRkRSU3d3UWtGQlFUdERVbmx0UWt3N1FWTXZkRUpFTzBWQlEwTXNkVUpCUVVFN1JVRkRSQ3c0UWtGQlFUdEZRVUZwUXl4blEwRkJRVHREVkd0MVFtaERPMEZCUTBRc2JVUkJRVzFFTzBGQlEyNUVPenM3T3p0SFFVdEhPMEZCUTBnc01FSkJRVEJDTzBGQlF6RkNPenM3T3p0SFFVdEhPMEZCUTBnc05FSkJRVFJDTzBGQlF6VkNMR3RFUVVGclJEdEJWVzUyUW14RU8wVkJRMFVzYlVKQlFVRTdSVUZEUVN4WFFVRkJPMFZCUTBFc2MwSkJRVUU3UlVGRFFTeDFRa0ZCUVR0RlFVTkJMRmRCUVVFN1JVRkRRU3haUVVGQk8wVkJRMEVzYVVKQlFVRTdRMVp4ZGtKRU8wRlZiblpDUXp0RlFVTkZMRzFDUVVGQk8wVkJRMEVzVjBGQlFUdEZRVU5CTEZOQlFVRTdSVUZEUVN4VlFVRkJPMFZCUTBFc1YwRkJRVHRGUVVOQkxGbEJRVUU3UlVGRFFTeHRRa0ZCUVR0RlFVTkJMSGxEUVVGQk8xVkJRVUVzYVVOQlFVRTdSVUZEUVN4cFFrRkJRVHREVm5GMlFrZzdRVlZzZGtKRE8wVkJRMFVzWTBGQlFUdERWbTkyUWtnN1FVRkRSQ3d5UWtGQk1rSTdRVmN6ZDBJelFqdEZRVU5GTEZkQlFVRTdSVUZEUVN4WlFVRkJPMFZCUTBFc01rSkJRVUU3UTFnMmQwSkVPMEZYTTNkQ1F6dEZRVU5GTERKQ1FVRkJPME5ZTm5kQ1NEdEJWM3AzUWtjN1JVRkRSU3h6UTBGQlFUdEZRVU5CTERKQ1FVRkJPME5ZTW5kQ1REdEJWM2gzUWtjN1JVRkRSU3h6UTBGQlFUdEZRVU5CTERKQ1FVRkJPME5ZTUhkQ1REdEJWM1ozUWtjN1JVRkRSU3h6UTBGQlFUdERXSGwzUWt3N1FWZHlkMEpETzBWQlEwVXNjME5CUVVFN1ExaDFkMEpJTzBGWmFIbENSRHRGUVVORkxHMUNRVUZCTzBWQlEwRXNWMEZCUVR0RlFVTkJMR2xDUVVGQk8wTmFhM2xDUkR0QldXaDVRa003UlVGRFJTeGpRVUZCTzBOYWEzbENTRHRCV1doNVFrYzdPenRGUVVkRkxGbEJRVUU3UlVGRFFTeHpRa0ZCUVR0RFdtdDVRa3c3UVZrdmVFSkhPMFZCUTBVc1pVRkJRVHREV21sNVFrdzdRVmszZUVKRE8wVkJSVWtzYzBKQlFVRTdRMW80ZUVKTU8wRlplbmhDUnp0RlFVTkZMR3RDUVVGQk8wTmFNbmhDVER0QldUZDRRa003UlVGTlNTeHRRa0ZCUVR0RlFVTkJMRmRCUVVFN1JVRkRRU3hUUVVGQk8wVkJRMEVzYjBOQlFVRTdWVUZCUVN3MFFrRkJRVHRGUVVOQkxGZEJRVUU3UTFvd2VFSk1PMEZoTlhwQ1JEdEZRVU5GTEcxQ1FVRkJPMFZCUTBFc1dVRkJRVHRGUVVOQkxFOUJRVUU3UlVGRFFTeFJRVUZCTzBWQlEwRXNWVUZCUVR0RlFVTkJMRmxCUVVFN1JVRkRRU3hoUVVGQk8wVkJRMEVzSzBKQlFVRTdWVUZCUVN4MVFrRkJRVHRGUVVOQkxHMUNRVUZCTzBWQlEwRXNhVUpCUVVFN1EySTRla0pFTzBGaE5YcENRenRGUTFCelJDeDNRMEZCUVR0VlFVRkJMR2REUVVGQk8wVkVVM0JFTEhGQ1FVRkJPMFZCUVVFc2NVSkJRVUU3UlVGQlFTeGpRVUZCTzBWQlEwRXNOa0pCUVVFN1JVRkJRU3c0UWtGQlFUdE5RVUZCTERKQ1FVRkJPMVZCUVVFc2RVSkJRVUU3UlVGRFFTeHpRa0ZCUVR0TlFVRkJMR3RDUVVGQk8wVkJRMEVzYlVKQlFVRTdSVUZEUVN4WlFVRkJPMFZCUTBFc1lVRkJRVHRGUVVOQkxIVkNRVUZCTzBWQlEwRXNhME5CUVVFN1ZVRkJRU3d3UWtGQlFUdEZRVU5CTEdsQ1FVRkJPME5pT0hwQ1NEdEJZVE42UWtNN096dEZRVWRGTEZsQlFVRTdSVUZEUVN3clFrRkJRVHRWUVVGQkxIVkNRVUZCTzBOaU5ucENTRHRCWVRGNlFrTTdPMFZCUlVVc2NVSkJRVUU3VFVGQlFTeGxRVUZCTzBOaU5IcENTRHRCWVhwNlFrTTdPenRGUVVkRkxHZENRVUZCTzBOaU1ucENTRHRCWVhoNlFrTTdPMFZCUlVVc2JVSkJRVUU3UlVGRFFTeFhRVUZCTzBWQlEwRXNaVUZCUVR0RlFVTkJMR0ZCUVVFN1JVRkRRU3hyUWtGQlFUdEZRVU5CTEdsQ1FVRkJPME5pTUhwQ1NEdEJZWFo2UWtNN1JVRkRSU3huUWtGQlFUdEZRVU5CTEdsQ1FVRkJPMFZCUTBFc1pVRkJRVHRGUVVOQkxDdENRVUZCTzFWQlFVRXNkVUpCUVVFN1JVRkRRU3hwUTBGQlFUdERZbmw2UWtnN1FXRjBla0pETzBWQlEwVXNiVUpCUVVFN1JVRkRRU3hYUVVGQk8wVkJRMEVzVTBGQlFUdEZRVU5CTEZsQlFVRTdSVUZEUVN4WlFVRkJPMFZCUTBFc1lVRkJRVHRGUVVOQkxHdENRVUZCTzBWQlEwRXNXVUZCUVR0RlFVTkJMR2RDUVVGQk8wVkJRMEVzYlVKQlFVRTdSVUZEUVN4blFrRkJRVHRGUVVOQkxHOURRVUZCTzFWQlFVRXNORUpCUVVFN1JVRkRRU3hwUWtGQlFUdERZbmQ2UWtnN1FXRnlNRUpETzBWQlowSkpMRzFDUVVGQk8wVkJRMEVzVjBGQlFUdEZRVU5CTEU5QlFVRTdSVUZEUVN4UlFVRkJPME5pZDNwQ1REdEJZWEo2UWtjN1JVRkRSU3haUVVGQk8wTmlkWHBDVER0QllXNTZRa003UlVGRFJTeHZRa0ZCUVR0TlFVRkJMRmxCUVVFN1ZVRkJRU3hSUVVGQk8wVkJRMEVzWlVGQlFUdERZbkY2UWtnN1FXRnVla0pITzBWQlEwVXNhVUpCUVVFN1EySnhla0pNTzBGaGFucENRenRGUVVORkxHVkJRVUU3UlVGRFFTeHJRa0ZCUVR0RlFVTkJMR2xDUVVGQk8wTmliWHBDU0R0QllXaDZRa003UlVGRFJTeFpRVUZCTzBWQlEwRXNiVUpCUVVFN1JVRkRRU3hYUVVGQk8wVkJRMEVzVDBGQlFUdEZRVU5CTEZGQlFVRTdSVUZEUVN4WlFVRkJPMFZCUTBFc1lVRkJRVHRGUVVOQkxIVkNRVUZCTzBWQlEwRXNZVUZCUVR0RlFVTkJMR2xDUVVGQk8wTmlhM3BDU0R0QllUVjVRa3M3TzBWQlEwVXNZVUZCUVR0RFlpdDVRbEE3UVdFMWVVSkxPenRGUVVORkxHRkJRVUU3UTJJcmVVSlFPMEZoTlhsQ1N6czdSVUZEUlN4aFFVRkJPME5pSzNsQ1VEdEJZVFY1UWtzN08wVkJRMFVzWVVGQlFUdERZaXQ1UWxBN1FXRTFlVUpMT3p0RlFVTkZMR0ZCUVVFN1EySXJlVUpRTzBGaE5YbENTenM3UlVGRFJTeGhRVUZCTzBOaUszbENVRHRCWVRGNVFrTTdSVUZEUlN3clFrRkJRVHREWWpSNVFrZzdRV0Y0ZVVKUE8wVkJRMFVzWTBGQlFUdERZakI1UWxRN1FXRnllVUpQTzBWQlEwVXNZMEZCUVR0RFluVjVRbFE3UVdGc2VVSlBPMFZCUTBVc1kwRkJRVHREWW05NVFsUTdRV0V2ZUVKUE8wVkJRMFVzWTBGQlFUdERZbWw1UWxRN1FXRTFlRUpQTzBWQlEwVXNZMEZCUVR0RFlqaDRRbFE3UVdGNmVFSlBPMFZCUTBVc1kwRkJRVHREWWpKNFFsUTdRV0Z5ZUVKRE8wVkJRMFVzWjBOQlFVRTdRMkoxZUVKSU8wRmhibmhDVHp0RlFVTkZMR0ZCUVVFN1EySnhlRUpVTzBGaGFIaENUenRGUVVORkxHRkJRVUU3UTJKcmVFSlVPMEZoTjNkQ1R6dEZRVU5GTEdGQlFVRTdRMklyZDBKVU8wRmhNWGRDVHp0RlFVTkZMR0ZCUVVFN1EySTBkMEpVTzBGaGRuZENUenRGUVVORkxHRkJRVUU3UTJKNWQwSlVPMEZoY0hkQ1R6dEZRVU5GTEdGQlFVRTdRMkp6ZDBKVU8wRmhhSGRDUXpzN1JVRkZSU3hSUVVGQk8wVkJRMEVzV1VGQlFUdERZbXQzUWtnN1FXRXZka0pMT3p0RlFVTkZMR05CUVVFN1EySnJkMEpRTzBGaEwzWkNTenM3UlVGRFJTeGpRVUZCTzBOaWEzZENVRHRCWVM5MlFrczdPMFZCUTBVc1kwRkJRVHREWW10M1FsQTdRV0V2ZGtKTE96dEZRVU5GTEdOQlFVRTdRMkpyZDBKUU8wRmhMM1pDU3pzN1JVRkRSU3hqUVVGQk8wTmlhM2RDVUR0QllTOTJRa3M3TzBWQlEwVXNZMEZCUVR0RFltdDNRbEE3UVdFM2RrSkRPMFZCUTBVc2FVTkJRVUU3UTJJcmRrSklPMEZoTTNaQ1R6dEZRVU5GTEZsQlFVRTdRMkkyZGtKVU8wRmhlSFpDVHp0RlFVTkZMRmxCUVVFN1EySXdka0pVTzBGaGNuWkNUenRGUVVORkxGbEJRVUU3UTJKMWRrSlVPMEZoYkhaQ1R6dEZRVU5GTEZsQlFVRTdRMkp2ZGtKVU8wRmhMM1ZDVHp0RlFVTkZMRmxCUVVFN1EySnBka0pVTzBGaE5YVkNUenRGUVVORkxGbEJRVUU3UTJJNGRVSlVPMEZoZUhWQ1F6dEZRVU5GTEdGQlFVRTdSVUZEUVN3NFFrRkJRVHREWWpCMVFrZzdRV0YwZFVKUE8wVkJRMFVzWlVGQlFUdERZbmQxUWxRN1FXRnVkVUpQTzBWQlEwVXNaVUZCUVR0RFluRjFRbFE3UVdGb2RVSlBPMFZCUTBVc1pVRkJRVHREWW10MVFsUTdRV0UzZEVKUE8wVkJRMFVzWlVGQlFUdERZaXQwUWxRN1FXRXhkRUpQTzBWQlEwVXNaVUZCUVR0RFlqUjBRbFE3UVdGMmRFSlBPMFZCUTBVc1pVRkJRVHREWW5sMFFsUTdRV0Z1ZEVKRE8wVkJRMFVzYjBKQlFVRTdSVUZEUVN3clFrRkJRVHREWW5GMFFrZzdRV0Z1ZEVKSE8wVkJRMFVzWjBKQlFVRTdRMkp4ZEVKTU8wRmhiblJDU3p0RlFVTkZMRk5CUVVFN1EySnhkRUpRTzBGaGJIUkNTenRGUVVORkxGRkJRVUU3UTJKdmRFSlFPMEZoYW5SQ1N6dEZRVU5GTEU5QlFVRTdRMkp0ZEVKUU8wRmhhSFJDU3p0RlFVTkZMRlZCUVVFN1EySnJkRUpRTzBGaE0zTkNTenM3UlVGRlJTeDVRa0ZCUVR0RlFVTkJMRk5CUVVFN1JVRkRRU3h2UTBGQlFUdFZRVUZCTERSQ1FVRkJPME5pTm5OQ1VEdEJZVEZ6UWtzN08wVkJSVVVzZDBKQlFVRTdSVUZEUVN4VlFVRkJPMFZCUTBFc2IwTkJRVUU3VlVGQlFTdzBRa0ZCUVR0RFlqUnpRbEE3UVdGMmMwSlRPMFZCUTBVc1YwRkJRVHREWW5selFsZzdRV0YwYzBKVE8wVkJRMFVzVlVGQlFUdERZbmR6UWxnN1FXRnljMEpUTzBWQlEwVXNVMEZCUVR0RFluVnpRbGc3UVdGd2MwSlRPMFZCUTBVc1dVRkJRVHREWW5OelFsZzdRV0UzY2tKTE96dEZRVVZGTEdGQlFVRTdSVUZEUVN3MlFrRkJRVHREWWl0eVFsQTdRV0V4Y2tKRE8wVkJRMFVzVjBGQlFUdERZalJ5UWtnN1FXVm9iVU5FTzBWQlEwVXNiVUpCUVVFN1JVRkRRU3hYUVVGQk8wVkJRMEVzVlVGQlFUdEZRVU5CTEhORFFVRkJPMFZCUTBFc1pVRkJRVHREWm10dFEwUTdRV1ZvYlVORE8wVkJRMFVzY1VOQlFVRTdSVUZCUVN3MlFrRkJRVHREWm10dFEwZzdRV1V2YkVORE8wVkJRMFVzWlVGQlFUdEZRVU5CTEdGQlFVRTdSVUZEUVN4clFrRkJRVHRGUVVOQkxHZENRVUZCTzBWQlEwRXNhVU5CUVVFN1JVRkRRU3huUWtGQlFUdEZRVU5CTEdsQ1FVRkJPMFZCUTBFc2FVSkJRVUU3UTJacGJVTklPMEZsT1d4RFF6dEZRVU5GTEcxQ1FVRkJPMFZCUTBFc1YwRkJRVHRGUVVOQkxGVkJRVUU3UlVGRFFTeHBRa0ZCUVR0RFptZHRRMGc3UVdVM2JFTkRPenM3UlVGSFJTeHRRa0ZCUVR0RlFVTkJMRmRCUVVFN1JVRkRRU3hWUVVGQk8wVkJRMEVzVjBGQlFUdEZRVU5CTEhOQ1FVRkJPMFZCUTBFc2FVSkJRVUU3UTJZcmJFTklPMEZsTld4RFF6dEZRVU5GTEdsQ1FVRkJPME5tT0d4RFNEdEJaVE5zUTBNN1JVRkRSU3hyUWtGQlFUdERaalpzUTBnN1FXVXhiRU5ETzBWQlEwVXNWVUZCUVR0RlFVTkJMR3RDUVVGQk8wVkJRMEVzWjBKQlFVRTdSVUZEUVN4cFFrRkJRVHREWmpSc1EwZzdRV1Y2YkVORE8wVkJRMFVzYlVKQlFVRTdSVUZEUVN4WFFVRkJPMFZCUTBFc1QwRkJRVHRGUVVOQkxGRkJRVUU3UlVGRFFTeFpRVUZCTzBWQlEwRXNZVUZCUVR0RlFVTkJMREJDUVVGQk8wVkJRMEVzSzBKQlFVRTdSVUZEUVN4clEwRkJRVHRWUVVGQkxEQkNRVUZCTzBWQlEwRXNLMEpCUVVFN1ZVRkJRU3gxUWtGQlFUdEZRVU5CTEdsQ1FVRkJPME5tTW14RFNEdEJaWGhzUTBNN1JVTnFSVFpDTEc5Q1FVRkJPMFZCUTJZc2QwSkJRVUU3UlVGRFJ5eHBRa0ZCUVR0RlJHbEZaaXhsUVVGQk8wVkJRMEVzYVVKQlFVRTdRMlkwYkVOSU8wRmxNV3hEUnpzN08wVkJSMFVzYzBKQlFVRTdSVUZEUVN4WlFVRkJPME5tTkd4RFREdEJaWHBzUTBjN1JVRkRSU3hsUVVGQk8wTm1NbXhEVER0QlpYWnNRME03UlVGRFJTeHhRa0ZCUVR0RFpubHNRMGc3UVdWd2JFTkxPenM3UlVGSFJTeGxRVUZCTzBWQlEwRXNhMEpCUVVFN1EyWnpiRU5RTzBGbGFteERRenM3UlVGRlJTeHhRa0ZCUVR0RlFVRkJMSEZDUVVGQk8wVkJRVUVzWTBGQlFUdEZRVU5CTEhOQ1FVRkJPMDFCUVVFc2EwSkJRVUU3UlVGRFFTdzJRa0ZCUVR0RlFVRkJMRGhDUVVGQk8wMUJRVUVzTWtKQlFVRTdWVUZCUVN4MVFrRkJRVHRGUVVOQkxDdENRVUZCTzBWQlEwRXNUMEZCUVR0RlFVTkJMR2xDUVVGQk8wTm1iV3hEU0R0QlpXaHNRMHM3T3pzN1JVRkZSU3dyUWtGQlFUdFZRVUZCTEhWQ1FVRkJPME5tYjJ4RFVEdEJaV3BzUTBzN08wVkJRMFVzY1VKQlFVRTdUVUZCUVN4bFFVRkJPME5tYjJ4RFVEdEJaV3BzUTBzN08wVkJRMFVzYjBKQlFVRTdUVUZCUVN4WlFVRkJPMVZCUVVFc1VVRkJRVHRGUVVOQkxHVkJRVUU3UTJadmJFTlFPMEZsTDJ0RFF6dEZRVU5GTEdsQ1FVRkJPMFZCUTBFc2VVTkJRVUU3UTJacGJFTklPMEZsT1d0RFF6dEZRVU5GTEdkQ1FVRkJPMFZCUTBFc2FVSkJRVUU3UTJabmJFTklPMEZsTjJ0RFF6dEZRVU5GTEdOQlFVRTdRMllyYTBOSU8wRmxOV3REUXp0RlFVTkZMRk5CUVVFN1JVRkRRU3hwUWtGQlFUdERaamhyUTBnN1FVRkRSRHM3T3pzN1IwRkxSenRCUVVOSUxITkNRVUZ6UWp0QlFVTjBRaXh6UWtGQmMwSTdRVUZEZEVJc2MwSkJRWE5DTzBGQlEzUkNPenM3T3p0SFFVdEhPMEZCUTBnN096czdPMGRCUzBjN1FVRkRTQ3cwUWtGQk5FSTdRV2xDYkhaRE1VSTdSVUZEUlN4blFrRkJRVHRGUVVOQkxFOUJRVUU3UlVGRFFTeFJRVUZCTzBWQlEwRXNWMEZCUVR0RlFVTkJMRmxCUVVFN1JVRkRRU3haUVVGQk8wVkJRMEVzTUVKQlFVRTdSVUZEUVN4WFFVRkJPMFZCUTBFc0swSkJRVUU3VlVGQlFTeDFRa0ZCUVR0RlFVTkJMR3RFUVVGQk8xVkJRVUVzTUVOQlFVRTdSVUZEUVN4MVEwRkJRVHREYWtKdmRrTklPMEZwUW1wMlEwTTdSVWhXYzBRc2NVTkJRVUU3VlVGQlFTdzJRa0ZCUVR0RlIxbHdSQ3hwUWtGQlFUdEZRVU5CTEd0Q1FVRkJPMFZCUTBFc1pVRkJRVHRGUVVOQkxDdENRVUZCTzFWQlFVRXNkVUpCUVVFN1JVRkRRU3gxUWtGQlFUdEZRVU5CTEdsQ1FVRkJPME5xUW0xMlEwZzdRV2xDYUhaRFF6dEZRVU5GTEdsQ1FVRkJPMFZCUTBFc2JVSkJRVUU3UlVGRFFTd3lUa0ZCUVR0RlFVTkJMRzlDUVVGQk8wVkJRMEVzYlVKQlFVRTdSVUZEUVN4cFFrRkJRVHRGUVVOQkxHbENRVUZCTzBOcVFtdDJRMGc3UVdsQ0wzVkRRenRGUVVWSkxHTkJRVUU3UTJwQ1ozWkRURHRCYVVJMWRVTkRPMFZCUTBVc1kwRkJRVHREYWtJNGRVTklPMEZwUWpWMVEwYzdSVUZEUlN4NVFrRkJRVHREYWtJNGRVTk1PMEZwUWpOMVEwODdSVUZEUlN4alFVRkJPME5xUWpaMVExUTdRV2xDZG5WRFF6dEZRVU5GTEdWQlFVRTdSVUZEUVN4blFrRkJRVHRGUVVOQkxGZEJRVUU3UlVGRFFTeFBRVUZCTzBWQlEwRXNVVUZCUVR0RlFVTkJMRmxCUVVFN1JVRkRRU3hoUVVGQk8wVkJRMEVzVlVGQlFUdEZRVU5CTEN0Q1FVRkJPMVZCUVVFc2RVSkJRVUU3UlVGRFFTeHBRa0ZCUVR0RlFVTkJMREJDUVVGQk8wVkJRMEVzZVVOQlFVRTdSVUZEUVN4cFFrRkJRVHREYWtKNWRVTklPMEZwUW5KMVEwUTdSVUZEUlR0SlFVTkZMRmRCUVVFN1IycENkWFZEUkR0RFFVTkdPMEZwUWpGMVEwUTdSVUZEUlR0SlFVTkZMRmRCUVVFN1IycENkWFZEUkR0RFFVTkdPMEZwUW5CMVEwUTdSVUZGU1R0SlFVTkZMR2xDUVVGQk8wZHFRbkYxUTBnN1JXbENkSFZEUXp0SlFVbEpMSEZDUVVGQk8wbEJRVUVzY1VKQlFVRTdTVUZCUVN4alFVRkJPMGxCUTBFc0swSkJRVUU3U1VGQlFTdzRRa0ZCUVR0UlFVRkJMSGRDUVVGQk8xbEJRVUVzYjBKQlFVRTdTVUZEUVN4elFrRkJRVHRSUVVGQkxHdENRVUZCTzBsQlEwRXNNRUpCUVVFN1VVRkJRU3gxUWtGQlFUdFpRVUZCTEc5Q1FVRkJPMGxCUTBFc01FSkJRVUU3VVVGQlFTeHBRa0ZCUVR0SlFVTkJMRlZCUVVFN1NVRkRRU3hUUVVGQk8wbEJRMEVzY1VOQlFVRTdXVUZCUVN3MlFrRkJRVHRKUVVOQkxGbEJRVUU3U1VGRFFTeGhRVUZCTzBsQlEwRXNLMEpCUVVFN1dVRkJRU3gxUWtGQlFUdEpRVU5CTERKQ1FVRkJPMGxCUTBFc2RVSkJRVUU3U1VGRFFTeG5Ra0ZCUVR0SGFrSnhkVU5NTzBWcFFtNTFRMHM3U1VNNVJrNHNhVUpCUVVFN1NVUm5SMUVzYjBKQlFVRTdVVUZCUVN4WlFVRkJPMWxCUVVFc1VVRkJRVHRKUVVOQkxHRkJRVUU3U1VGRFFTeDVRa0ZCUVR0WlFVRkJMR2xDUVVGQk8wZHFRbkYxUTFBN1JXbENhblZEUnp0SlFVTkZMRmRCUVVFN1NVRkRRU3gxUWtGQlFUdEpRVU5CTEN0Q1FVRkJPMWxCUVVFc2RVSkJRVUU3UjJwQ2JYVkRURHRGYVVKb2RVTkhPMGxCUTBVc2JVSkJRVUU3U1VGRFFTeFhRVUZCTzBsQlEwRXNWVUZCUVR0SlFVTkJMRmRCUVVFN1NVRkRRU3hoUVVGQk8wbEJRMEVzZVVKQlFVRTdXVUZCUVN4cFFrRkJRVHRKUVVOQkxHbENRVUZCTzBkcVFtdDFRMHc3UldsQ0wzUkRSenRKUkhaSWVVSXNiMEpCUVVFN1NVRkRaaXgzUWtGQlFUdEpRM2RJVWl4dFFrRkJRVHRKUVVOQkxGZEJRVUU3U1VGRFFTeFBRVUZCTzBsQlEwRXNVVUZCUVR0SlFVTkJMRlZCUVVFN1NVRkRRU3haUVVGQk8wbEJRMEVzWVVGQlFUdEpRVU5CTEd0Q1FVRkJPMGxCUTBFc09FSkJRVUU3U1VGRFFTeHBRa0ZCUVR0SlFVTkJMR2xDUVVGQk8wbEJRMEVzZFVKQlFVRTdTVUZEUVN4cFFrRkJRVHRIYWtKcmRVTk1PMFZwUWk5MFEwYzdTVUZEUlN4bFFVRkJPMGxCUTBFc01FSkJRVUU3U1VGRFFTeHJRa0ZCUVR0SlFVTkJMQ3REUVVGQk8wbEJRMEVzYlVKQlFVRTdTVUZEUVN4dFFrRkJRVHRIYWtKcGRVTk1PMFZwUW5aMVEwYzdTVUZUU1N4WFFVRkJPMGxCUTBFc2EwUkJRVUU3V1VGQlFTd3dRMEZCUVR0SlFVTkJMRFpEUVVGQk8wbEJRMEVzWlVGQlFUdEhha0pwZFVOUU8wTkJRMFk3UVdsQ00zUkRSRHRGUVVORk96dEpha0k0ZEVORkxHVkJRV1U3U1dsQ00zUkRaaXhuUWtGQlFUdEpha0kyZEVOQkxHMUNRVUZ0UWp0SmFVSXpkRU51UWl4MVFrRkJRVHRKUVVOQkxGbEJRVUU3U1VGRFFTd3lRa0ZCUVR0SGFrSTJkRU5FTzBWQlEwUXNXVUZCV1R0RmFVSXhkRU5hT3pzN1NVRkhSU3h6UTBGQlFUdEpRVU5CTEdWQlFVRTdSMnBDTkhSRFJEdEZRVU5FTEZsQlFWazdSV2xDZW5SRFdqczdTVUZGUlN4NVFrRkJRVHRIYWtJeWRFTkVPMFZCUTBRc2QwSkJRWGRDTzBWcFFuaDBRM2hDTzBsQlEwVXNXVUZCUVR0SlFVTkJMREJDUVVGQk8wZHFRakIwUTBRN1JXbENlSFJEUkRzN1NVRkZSU3d3UWtGQlFUdEpRVU5CTEd0Q1FVRkJPMGRxUWpCMFEwUTdSV2xDZEhSRFF6czdTV3BDZVhSRFFTeHJRa0ZCYTBJN1NXbENkSFJEYUVJc2VVSkJRVUU3UjJwQ2QzUkRTRHRGYVVKeWRFTkRPMGxCUTBVc01FSkJRVUU3U1VGRFFTeHBRa0ZCUVR0SmFrSjFkRU5HTEdGQlFXRTdTVUZEWWl4aFFVRmhPMGxCUTJJc2QwSkJRWGRDTzBsQlEzaENMRFJDUVVFMFFqdEhRVU0zUWp0RmFVSjZkRU5ITzBsQlEwVXNhVU5CUVVFN1NVRkRRU3c0UWtGQlFUdEpRVU5CTERKQ1FVRkJPMGRxUWpKMFEwdzdSV2xDZG5SRFJ6dEpRVU5GTERoQ1FVRkJPMGxCUTBFc2QwSkJRVUU3U1VGRFFTeHpRa0ZCUVR0SlFVTkJMSFZDUVVGQk8wbEJRMEVzTkVKQlFVRTdSMnBDZVhSRFREdEZhVUp5ZEVOSE8wbEJRMFVzZVVKQlFVRTdSMnBDZFhSRFREdEZhVUp1ZEVOSE8wbEJRMFVzZVVKQlFVRTdXVUZCUVN4cFFrRkJRVHRIYWtKeGRFTk1PMFZwUWk5MVEwTTdTVUU0UWtrc2QwSkJRVUU3U1VGRFFTeHJRMEZCUVR0SlFVTkJMRGhDUVVGQk8wZHFRbTkwUTB3N1JXbENjSFpEUXpzN1NVRnhRMGtzYTBOQlFVRTdSMnBDYlhSRFREdEZhVUo0ZGtORE96czdTVUV5UTBrc2JVTkJRVUU3VDBGQlFTeG5RMEZCUVR0WlFVRkJMRzlDUVVGQk8wZHFRbXQwUTB3N1JXbENPWE5EUnp0SlFVTkZMSGxDUVVGQk8wZHFRbWQwUTB3N1EwRkRSanRCYlVJMU9FTkVPMFZCUTBVc1owSkJRVUU3UlVGRFFTeGxRVUZCTzBWQlEwRXNWVUZCUVR0RlFVTkJMR3REUVVGQk8xVkJRVUVzTUVKQlFVRTdSVUZEUVN4cFFrRkJRVHREYmtJNE9FTkVPMEZ0UWpVNFEwTTdSVXhFYzBRc2QwTkJRVUU3VlVGQlFTeG5RMEZCUVR0RlMwZHdSQ3h0UWtGQlFUdEZRVU5CTEZkQlFVRTdSVUZEUVN4aFFVRkJPMFZCUTBFc1dVRkJRVHRGUVVOQkxHRkJRVUU3UlVGRFFTd3dRa0ZCUVR0RlFVTkJMRzFDUVVGQk8wVkJRMEVzSzBKQlFVRTdWVUZCUVN4MVFrRkJRVHRGUVVOQkxIVkNRVUZCTzBWQlEwRXNaMEpCUVVFN1JVRkRRU3h0UWtGQlFUdEZRVU5CTEZsQlFVRTdSVUZEUVN3NFEwRkJRVHRGUVVGQkxITkRRVUZCTzBWQlEwRXNhVUpCUVVFN1EyNUNPRGhEU0R0QmJVSTFPRU5ITzBWQlEwVXNaVUZCUVR0RlFVTkJMSE5DUVVGQk8wVkJRMEVzSzBKQlFVRTdWVUZCUVN4MVFrRkJRVHREYmtJNE9FTk1PMEZ0UWpNNFEwYzdSVUZEUlN4alFVRkJPME51UWpZNFEwdzdRVzFDZURoRFJ6czdPMFZCUjBVc1dVRkJRVHRGUVVOQkxITkNRVUZCTzBOdVFqQTRRMHc3UVcxQ2RqaERSenRGUVVORkxHVkJRVUU3UTI1Q2VUaERURHRCYlVKeU9FTkRPMFZCUTBVc2JVSkJRVUU3UlVGRFFTeFhRVUZCTzBWQlEwRXNVMEZCUVR0RlFVTkJMRlZCUVVFN1JVRkRRU3haUVVGQk8wVkJRMEVzWVVGQlFUdEZRVU5CTEhsRFFVRkJPMVZCUVVFc2FVTkJRVUU3UlVGRFFTeHRRa0ZCUVR0RlFVTkJMR2xDUVVGQk8wTnVRblU0UTBnN1FXMUNiRGhEU3p0RlFVTkZMRmxCUVVFN1JVRkRRU3d3UWtGQlFUdEZRVU5CTEhOQ1FVRkJPME51UW04NFExQTdRVzFDYkRoRFR6dEZRVU5GTEZsQlFVRTdRMjVDYnpoRFZEdEJiVUk1TjBOTE96czdSVUZIUlN4WlFVRkJPME51UW1jNFExQTdRVzFDTVRkRFJ6dEZRVU5GTEc5Q1FVRkJPME51UWpRM1EwdzdRVzFDY2pkRFN6czdPenM3T3pzN1JVRkpSU3h2UWtGQlFUdEZRVU5CTEZsQlFVRTdSVUZEUVN4dFFrRkJRVHREYmtJeU4wTlFPMEZ0UW5vM1EwODdPenM3T3pzN08wVkJRMFVzV1VGQlFUdEZRVU5CTEcxQ1FVRkJPME51UW1zNFExUTdRVzFDT1RkRFN6czdSVUZEUlN3d1FrRkJRVHREYmtKcE9FTlFPMEZ0UWpVM1EwTTdPMFZCUlVVc1ZVRkJRVHRGUVVOQkxHOURRVUZCTzFWQlFVRXNORUpCUVVFN1EyNUNPRGREU0R0QmJVSnFPRU5ET3p0RlFVMUpMSE5DUVVGQk8wTnVRaXMzUTB3N1FXMUNNemREUXp0RlFVTkZMRlZCUVVFN1EyNUNOamREU0R0QmJVSXpOME5ITzBWQlEwVXNWMEZCUVR0RGJrSTJOME5NTzBGdFFubzNRME03UlVGRFJTeGhRVUZCTzBOdVFqSTNRMGc3UVcxQ2VqZERSenRGUVVORkxHTkJRVUU3UTI1Q01qZERURHRCYlVKMk4wTkRPenRGUVVWRkxHOURRVUZCTzFWQlFVRXNORUpCUVVFN1JVRkRRU3haUVVGQk8wTnVRbmszUTBnN1FXMUNkRGREUXp0RlFVTkZMRk5CUVVFN1JVRkRRU3haUVVGQk8wTnVRbmMzUTBnN1FXMUNkRGREUnp0RlFVTkZMR0ZCUVVFN1EyNUNkemREVER0QmJVSndOME5ETzBWQlEwVXNVMEZCUVR0RlFVTkJMRmRCUVVFN1EyNUNjemREU0R0QmJVSndOME5ITzBWQlEwVXNXVUZCUVR0RGJrSnpOME5NTzBGdFFqYzJRMHM3T3pzN1JVRkRSU3hqUVVGQk8wTnVRbXMzUTFBaUxDSm1hV3hsSWpvaVpHOWpjeTVqYzNNaUxDSnpiM1Z5WTJWelEyOXVkR1Z1ZENJNld5SXZLaUVnYm05eWJXRnNhWHBsTG1OemN5QjJPQzR3TGpFZ2ZDQk5TVlFnVEdsalpXNXpaU0I4SUdkcGRHaDFZaTVqYjIwdmJtVmpiMnhoY3k5dWIzSnRZV3hwZW1VdVkzTnpJQ292WEc0dktpQkViMk4xYldWdWRGeHVJQ0FnUFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwZ0tpOWNiaThxS2x4dUlDb2dNUzRnUTI5eWNtVmpkQ0IwYUdVZ2JHbHVaU0JvWldsbmFIUWdhVzRnWVd4c0lHSnliM2R6WlhKekxseHVJQ29nTWk0Z1VISmxkbVZ1ZENCaFpHcDFjM1J0Wlc1MGN5QnZaaUJtYjI1MElITnBlbVVnWVdaMFpYSWdiM0pwWlc1MFlYUnBiMjRnWTJoaGJtZGxjeUJwYmlCcFQxTXVYRzRnS2k5Y2JtaDBiV3dnZTF4dUlDQnNhVzVsTFdobGFXZG9kRG9nTVM0eE5UdGNiaUFnTHlvZ01TQXFMMXh1SUNBdGQyVmlhMmwwTFhSbGVIUXRjMmw2WlMxaFpHcDFjM1E2SURFd01DVTdYRzRnSUM4cUlESWdLaTljYm4xY2JpOHFJRk5sWTNScGIyNXpYRzRnSUNBOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBTQXFMMXh1THlvcVhHNGdLaUJTWlcxdmRtVWdkR2hsSUcxaGNtZHBiaUJwYmlCaGJHd2dZbkp2ZDNObGNuTXVYRzRnS2k5Y2JtSnZaSGtnZTF4dUlDQnRZWEpuYVc0NklEQTdYRzU5WEc0dktpcGNiaUFxSUZKbGJtUmxjaUIwYUdVZ1lHMWhhVzVnSUdWc1pXMWxiblFnWTI5dWMybHpkR1Z1ZEd4NUlHbHVJRWxGTGx4dUlDb3ZYRzV0WVdsdUlIdGNiaUFnWkdsemNHeGhlVG9nWW14dlkyczdYRzU5WEc0dktpcGNiaUFxSUVOdmNuSmxZM1FnZEdobElHWnZiblFnYzJsNlpTQmhibVFnYldGeVoybHVJRzl1SUdCb01XQWdaV3hsYldWdWRITWdkMmwwYUdsdUlHQnpaV04wYVc5dVlDQmhibVJjYmlBcUlHQmhjblJwWTJ4bFlDQmpiMjUwWlhoMGN5QnBiaUJEYUhKdmJXVXNJRVpwY21WbWIzZ3NJR0Z1WkNCVFlXWmhjbWt1WEc0Z0tpOWNibWd4SUh0Y2JpQWdabTl1ZEMxemFYcGxPaUF5WlcwN1hHNGdJRzFoY21kcGJqb2dNQzQyTjJWdElEQTdYRzU5WEc0dktpQkhjbTkxY0dsdVp5QmpiMjUwWlc1MFhHNGdJQ0E5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFNBcUwxeHVMeW9xWEc0Z0tpQXhMaUJCWkdRZ2RHaGxJR052Y25KbFkzUWdZbTk0SUhOcGVtbHVaeUJwYmlCR2FYSmxabTk0TGx4dUlDb2dNaTRnVTJodmR5QjBhR1VnYjNabGNtWnNiM2NnYVc0Z1JXUm5aU0JoYm1RZ1NVVXVYRzRnS2k5Y2JtaHlJSHRjYmlBZ1ltOTRMWE5wZW1sdVp6b2dZMjl1ZEdWdWRDMWliM2c3WEc0Z0lDOHFJREVnS2k5Y2JpQWdhR1ZwWjJoME9pQXdPMXh1SUNBdktpQXhJQ292WEc0Z0lHOTJaWEptYkc5M09pQjJhWE5wWW14bE8xeHVJQ0F2S2lBeUlDb3ZYRzU5WEc0dktpcGNiaUFxSURFdUlFTnZjbkpsWTNRZ2RHaGxJR2x1YUdWeWFYUmhibU5sSUdGdVpDQnpZMkZzYVc1bklHOW1JR1p2Ym5RZ2MybDZaU0JwYmlCaGJHd2dZbkp2ZDNObGNuTXVYRzRnS2lBeUxpQkRiM0p5WldOMElIUm9aU0J2WkdRZ1lHVnRZQ0JtYjI1MElITnBlbWx1WnlCcGJpQmhiR3dnWW5KdmQzTmxjbk11WEc0Z0tpOWNibkJ5WlNCN1hHNGdJR1p2Ym5RdFptRnRhV3g1T2lCdGIyNXZjM0JoWTJVc0lHMXZibTl6Y0dGalpUdGNiaUFnTHlvZ01TQXFMMXh1SUNCbWIyNTBMWE5wZW1VNklERmxiVHRjYmlBZ0x5b2dNaUFxTDF4dWZWeHVMeW9nVkdWNGRDMXNaWFpsYkNCelpXMWhiblJwWTNOY2JpQWdJRDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5SUNvdlhHNHZLaXBjYmlBcUlGSmxiVzkyWlNCMGFHVWdaM0poZVNCaVlXTnJaM0p2ZFc1a0lHOXVJR0ZqZEdsMlpTQnNhVzVyY3lCcGJpQkpSU0F4TUM1Y2JpQXFMMXh1WVNCN1hHNGdJR0poWTJ0bmNtOTFibVF0WTI5c2IzSTZJSFJ5WVc1emNHRnlaVzUwTzF4dWZWeHVMeW9xWEc0Z0tpQXhMaUJTWlcxdmRtVWdkR2hsSUdKdmRIUnZiU0JpYjNKa1pYSWdhVzRnUTJoeWIyMWxJRFUzTFZ4dUlDb2dNaTRnUVdSa0lIUm9aU0JqYjNKeVpXTjBJSFJsZUhRZ1pHVmpiM0poZEdsdmJpQnBiaUJEYUhKdmJXVXNJRVZrWjJVc0lFbEZMQ0JQY0dWeVlTd2dZVzVrSUZOaFptRnlhUzVjYmlBcUwxeHVZV0ppY2x0MGFYUnNaVjBnZTF4dUlDQmliM0prWlhJdFltOTBkRzl0T2lCdWIyNWxPMXh1SUNBdktpQXhJQ292WEc0Z0lIUmxlSFF0WkdWamIzSmhkR2x2YmpvZ2RXNWtaWEpzYVc1bE8xeHVJQ0F2S2lBeUlDb3ZYRzRnSUhSbGVIUXRaR1ZqYjNKaGRHbHZiam9nZFc1a1pYSnNhVzVsSUdSdmRIUmxaRHRjYmlBZ0x5b2dNaUFxTDF4dWZWeHVMeW9xWEc0Z0tpQkJaR1FnZEdobElHTnZjbkpsWTNRZ1ptOXVkQ0IzWldsbmFIUWdhVzRnUTJoeWIyMWxMQ0JGWkdkbExDQmhibVFnVTJGbVlYSnBMbHh1SUNvdlhHNWlMRnh1YzNSeWIyNW5JSHRjYmlBZ1ptOXVkQzEzWldsbmFIUTZJR0p2YkdSbGNqdGNibjFjYmk4cUtseHVJQ29nTVM0Z1EyOXljbVZqZENCMGFHVWdhVzVvWlhKcGRHRnVZMlVnWVc1a0lITmpZV3hwYm1jZ2IyWWdabTl1ZENCemFYcGxJR2x1SUdGc2JDQmljbTkzYzJWeWN5NWNiaUFxSURJdUlFTnZjbkpsWTNRZ2RHaGxJRzlrWkNCZ1pXMWdJR1p2Ym5RZ2MybDZhVzVuSUdsdUlHRnNiQ0JpY205M2MyVnljeTVjYmlBcUwxeHVZMjlrWlN4Y2JtdGlaQ3hjYm5OaGJYQWdlMXh1SUNCbWIyNTBMV1poYldsc2VUb2diVzl1YjNOd1lXTmxMQ0J0YjI1dmMzQmhZMlU3WEc0Z0lDOHFJREVnS2k5Y2JpQWdabTl1ZEMxemFYcGxPaUF4WlcwN1hHNGdJQzhxSURJZ0tpOWNibjFjYmk4cUtseHVJQ29nUVdSa0lIUm9aU0JqYjNKeVpXTjBJR1p2Ym5RZ2MybDZaU0JwYmlCaGJHd2dZbkp2ZDNObGNuTXVYRzRnS2k5Y2JuTnRZV3hzSUh0Y2JpQWdabTl1ZEMxemFYcGxPaUE0TUNVN1hHNTlYRzR2S2lwY2JpQXFJRkJ5WlhabGJuUWdZSE4xWW1BZ1lXNWtJR0J6ZFhCZ0lHVnNaVzFsYm5SeklHWnliMjBnWVdabVpXTjBhVzVuSUhSb1pTQnNhVzVsSUdobGFXZG9kQ0JwYmx4dUlDb2dZV3hzSUdKeWIzZHpaWEp6TGx4dUlDb3ZYRzV6ZFdJc1hHNXpkWEFnZTF4dUlDQm1iMjUwTFhOcGVtVTZJRGMxSlR0Y2JpQWdiR2x1WlMxb1pXbG5hSFE2SURBN1hHNGdJSEJ2YzJsMGFXOXVPaUJ5Wld4aGRHbDJaVHRjYmlBZ2RtVnlkR2xqWVd3dFlXeHBaMjQ2SUdKaGMyVnNhVzVsTzF4dWZWeHVjM1ZpSUh0Y2JpQWdZbTkwZEc5dE9pQXRNQzR5TldWdE8xeHVmVnh1YzNWd0lIdGNiaUFnZEc5d09pQXRNQzQxWlcwN1hHNTlYRzR2S2lCRmJXSmxaR1JsWkNCamIyNTBaVzUwWEc0Z0lDQTlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQU0FxTDF4dUx5b3FYRzRnS2lCU1pXMXZkbVVnZEdobElHSnZjbVJsY2lCdmJpQnBiV0ZuWlhNZ2FXNXphV1JsSUd4cGJtdHpJR2x1SUVsRklERXdMbHh1SUNvdlhHNXBiV2NnZTF4dUlDQmliM0prWlhJdGMzUjViR1U2SUc1dmJtVTdYRzU5WEc0dktpQkdiM0p0YzF4dUlDQWdQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDBnS2k5Y2JpOHFLbHh1SUNvZ01TNGdRMmhoYm1kbElIUm9aU0JtYjI1MElITjBlV3hsY3lCcGJpQmhiR3dnWW5KdmQzTmxjbk11WEc0Z0tpQXlMaUJTWlcxdmRtVWdkR2hsSUcxaGNtZHBiaUJwYmlCR2FYSmxabTk0SUdGdVpDQlRZV1poY21rdVhHNGdLaTljYm1KMWRIUnZiaXhjYm1sdWNIVjBMRnh1YjNCMFozSnZkWEFzWEc1elpXeGxZM1FzWEc1MFpYaDBZWEpsWVNCN1hHNGdJR1p2Ym5RdFptRnRhV3g1T2lCcGJtaGxjbWwwTzF4dUlDQXZLaUF4SUNvdlhHNGdJR1p2Ym5RdGMybDZaVG9nTVRBd0pUdGNiaUFnTHlvZ01TQXFMMXh1SUNCc2FXNWxMV2hsYVdkb2REb2dNUzR4TlR0Y2JpQWdMeW9nTVNBcUwxeHVJQ0J0WVhKbmFXNDZJREE3WEc0Z0lDOHFJRElnS2k5Y2JuMWNiaThxS2x4dUlDb2dVMmh2ZHlCMGFHVWdiM1psY21ac2IzY2dhVzRnU1VVdVhHNGdLaUF4TGlCVGFHOTNJSFJvWlNCdmRtVnlabXh2ZHlCcGJpQkZaR2RsTGx4dUlDb3ZYRzVpZFhSMGIyNHNYRzVwYm5CMWRDQjdYRzRnSUM4cUlERWdLaTljYmlBZ2IzWmxjbVpzYjNjNklIWnBjMmxpYkdVN1hHNTlYRzR2S2lwY2JpQXFJRkpsYlc5MlpTQjBhR1VnYVc1b1pYSnBkR0Z1WTJVZ2IyWWdkR1Y0ZENCMGNtRnVjMlp2Y20wZ2FXNGdSV1JuWlN3Z1JtbHlaV1p2ZUN3Z1lXNWtJRWxGTGx4dUlDb2dNUzRnVW1WdGIzWmxJSFJvWlNCcGJtaGxjbWwwWVc1alpTQnZaaUIwWlhoMElIUnlZVzV6Wm05eWJTQnBiaUJHYVhKbFptOTRMbHh1SUNvdlhHNWlkWFIwYjI0c1hHNXpaV3hsWTNRZ2UxeHVJQ0F2S2lBeElDb3ZYRzRnSUhSbGVIUXRkSEpoYm5ObWIzSnRPaUJ1YjI1bE8xeHVmVnh1THlvcVhHNGdLaUJEYjNKeVpXTjBJSFJvWlNCcGJtRmlhV3hwZEhrZ2RHOGdjM1I1YkdVZ1kyeHBZMnRoWW14bElIUjVjR1Z6SUdsdUlHbFBVeUJoYm1RZ1UyRm1ZWEpwTGx4dUlDb3ZYRzVpZFhSMGIyNHNYRzViZEhsd1pUMG5ZblYwZEc5dUoxMHNYRzViZEhsd1pUMG5jbVZ6WlhRblhTeGNibHQwZVhCbFBTZHpkV0p0YVhRblhTQjdYRzRnSUMxM1pXSnJhWFF0WVhCd1pXRnlZVzVqWlRvZ1luVjBkRzl1TzF4dWZWeHVMeW9xWEc0Z0tpQlNaVzF2ZG1VZ2RHaGxJR2x1Ym1WeUlHSnZjbVJsY2lCaGJtUWdjR0ZrWkdsdVp5QnBiaUJHYVhKbFptOTRMbHh1SUNvdlhHNWlkWFIwYjI0Nk9pMXRiM290Wm05amRYTXRhVzV1WlhJc1hHNWJkSGx3WlQwblluVjBkRzl1SjEwNk9pMXRiM290Wm05amRYTXRhVzV1WlhJc1hHNWJkSGx3WlQwbmNtVnpaWFFuWFRvNkxXMXZlaTFtYjJOMWN5MXBibTVsY2l4Y2JsdDBlWEJsUFNkemRXSnRhWFFuWFRvNkxXMXZlaTFtYjJOMWN5MXBibTVsY2lCN1hHNGdJR0p2Y21SbGNpMXpkSGxzWlRvZ2JtOXVaVHRjYmlBZ2NHRmtaR2x1WnpvZ01EdGNibjFjYmk4cUtseHVJQ29nVW1WemRHOXlaU0IwYUdVZ1ptOWpkWE1nYzNSNWJHVnpJSFZ1YzJWMElHSjVJSFJvWlNCd2NtVjJhVzkxY3lCeWRXeGxMbHh1SUNvdlhHNWlkWFIwYjI0NkxXMXZlaTFtYjJOMWMzSnBibWNzWEc1YmRIbHdaVDBuWW5WMGRHOXVKMTA2TFcxdmVpMW1iMk4xYzNKcGJtY3NYRzViZEhsd1pUMG5jbVZ6WlhRblhUb3RiVzk2TFdadlkzVnpjbWx1Wnl4Y2JsdDBlWEJsUFNkemRXSnRhWFFuWFRvdGJXOTZMV1p2WTNWemNtbHVaeUI3WEc0Z0lHOTFkR3hwYm1VNklERndlQ0JrYjNSMFpXUWdRblYwZEc5dVZHVjRkRHRjYm4xY2JpOHFLbHh1SUNvZ1EyOXljbVZqZENCMGFHVWdjR0ZrWkdsdVp5QnBiaUJHYVhKbFptOTRMbHh1SUNvdlhHNW1hV1ZzWkhObGRDQjdYRzRnSUhCaFpHUnBibWM2SURBdU16VmxiU0F3TGpjMVpXMGdNQzQyTWpWbGJUdGNibjFjYmk4cUtseHVJQ29nTVM0Z1EyOXljbVZqZENCMGFHVWdkR1Y0ZENCM2NtRndjR2x1WnlCcGJpQkZaR2RsSUdGdVpDQkpSUzVjYmlBcUlESXVJRU52Y25KbFkzUWdkR2hsSUdOdmJHOXlJR2x1YUdWeWFYUmhibU5sSUdaeWIyMGdZR1pwWld4a2MyVjBZQ0JsYkdWdFpXNTBjeUJwYmlCSlJTNWNiaUFxSURNdUlGSmxiVzkyWlNCMGFHVWdjR0ZrWkdsdVp5QnpieUJrWlhabGJHOXdaWEp6SUdGeVpTQnViM1FnWTJGMVoyaDBJRzkxZENCM2FHVnVJSFJvWlhrZ2VtVnlieUJ2ZFhSY2JpQXFJQ0FnSUdCbWFXVnNaSE5sZEdBZ1pXeGxiV1Z1ZEhNZ2FXNGdZV3hzSUdKeWIzZHpaWEp6TGx4dUlDb3ZYRzVzWldkbGJtUWdlMXh1SUNCaWIzZ3RjMmw2YVc1bk9pQmliM0prWlhJdFltOTRPMXh1SUNBdktpQXhJQ292WEc0Z0lHTnZiRzl5T2lCcGJtaGxjbWwwTzF4dUlDQXZLaUF5SUNvdlhHNGdJR1JwYzNCc1lYazZJSFJoWW14bE8xeHVJQ0F2S2lBeElDb3ZYRzRnSUcxaGVDMTNhV1IwYURvZ01UQXdKVHRjYmlBZ0x5b2dNU0FxTDF4dUlDQndZV1JrYVc1bk9pQXdPMXh1SUNBdktpQXpJQ292WEc0Z0lIZG9hWFJsTFhOd1lXTmxPaUJ1YjNKdFlXdzdYRzRnSUM4cUlERWdLaTljYm4xY2JpOHFLbHh1SUNvZ1FXUmtJSFJvWlNCamIzSnlaV04wSUhabGNuUnBZMkZzSUdGc2FXZHViV1Z1ZENCcGJpQkRhSEp2YldVc0lFWnBjbVZtYjNnc0lHRnVaQ0JQY0dWeVlTNWNiaUFxTDF4dWNISnZaM0psYzNNZ2UxeHVJQ0IyWlhKMGFXTmhiQzFoYkdsbmJqb2dZbUZ6Wld4cGJtVTdYRzU5WEc0dktpcGNiaUFxSUZKbGJXOTJaU0IwYUdVZ1pHVm1ZWFZzZENCMlpYSjBhV05oYkNCelkzSnZiR3hpWVhJZ2FXNGdTVVVnTVRBckxseHVJQ292WEc1MFpYaDBZWEpsWVNCN1hHNGdJRzkyWlhKbWJHOTNPaUJoZFhSdk8xeHVmVnh1THlvcVhHNGdLaUF4TGlCQlpHUWdkR2hsSUdOdmNuSmxZM1FnWW05NElITnBlbWx1WnlCcGJpQkpSU0F4TUM1Y2JpQXFJREl1SUZKbGJXOTJaU0IwYUdVZ2NHRmtaR2x1WnlCcGJpQkpSU0F4TUM1Y2JpQXFMMXh1VzNSNWNHVTlKMk5vWldOclltOTRKMTBzWEc1YmRIbHdaVDBuY21Ga2FXOG5YU0I3WEc0Z0lHSnZlQzF6YVhwcGJtYzZJR0p2Y21SbGNpMWliM2c3WEc0Z0lDOHFJREVnS2k5Y2JpQWdjR0ZrWkdsdVp6b2dNRHRjYmlBZ0x5b2dNaUFxTDF4dWZWeHVMeW9xWEc0Z0tpQkRiM0p5WldOMElIUm9aU0JqZFhKemIzSWdjM1I1YkdVZ2IyWWdhVzVqY21WdFpXNTBJR0Z1WkNCa1pXTnlaVzFsYm5RZ1luVjBkRzl1Y3lCcGJpQkRhSEp2YldVdVhHNGdLaTljYmx0MGVYQmxQU2R1ZFcxaVpYSW5YVG82TFhkbFltdHBkQzFwYm01bGNpMXpjR2x1TFdKMWRIUnZiaXhjYmx0MGVYQmxQU2R1ZFcxaVpYSW5YVG82TFhkbFltdHBkQzF2ZFhSbGNpMXpjR2x1TFdKMWRIUnZiaUI3WEc0Z0lHaGxhV2RvZERvZ1lYVjBienRjYm4xY2JpOHFLbHh1SUNvZ01TNGdRMjl5Y21WamRDQjBhR1VnYjJSa0lHRndjR1ZoY21GdVkyVWdhVzRnUTJoeWIyMWxJR0Z1WkNCVFlXWmhjbWt1WEc0Z0tpQXlMaUJEYjNKeVpXTjBJSFJvWlNCdmRYUnNhVzVsSUhOMGVXeGxJR2x1SUZOaFptRnlhUzVjYmlBcUwxeHVXM1I1Y0dVOUozTmxZWEpqYUNkZElIdGNiaUFnTFhkbFltdHBkQzFoY0hCbFlYSmhibU5sT2lCMFpYaDBabWxsYkdRN1hHNGdJQzhxSURFZ0tpOWNiaUFnYjNWMGJHbHVaUzF2Wm1aelpYUTZJQzB5Y0hnN1hHNGdJQzhxSURJZ0tpOWNibjFjYmk4cUtseHVJQ29nVW1WdGIzWmxJSFJvWlNCcGJtNWxjaUJ3WVdSa2FXNW5JR2x1SUVOb2NtOXRaU0JoYm1RZ1UyRm1ZWEpwSUc5dUlHMWhZMDlUTGx4dUlDb3ZYRzViZEhsd1pUMG5jMlZoY21Ob0oxMDZPaTEzWldKcmFYUXRjMlZoY21Ob0xXUmxZMjl5WVhScGIyNGdlMXh1SUNBdGQyVmlhMmwwTFdGd2NHVmhjbUZ1WTJVNklHNXZibVU3WEc1OVhHNHZLaXBjYmlBcUlERXVJRU52Y25KbFkzUWdkR2hsSUdsdVlXSnBiR2wwZVNCMGJ5QnpkSGxzWlNCamJHbGphMkZpYkdVZ2RIbHdaWE1nYVc0Z2FVOVRJR0Z1WkNCVFlXWmhjbWt1WEc0Z0tpQXlMaUJEYUdGdVoyVWdabTl1ZENCd2NtOXdaWEowYVdWeklIUnZJR0JwYm1obGNtbDBZQ0JwYmlCVFlXWmhjbWt1WEc0Z0tpOWNiam82TFhkbFltdHBkQzFtYVd4bExYVndiRzloWkMxaWRYUjBiMjRnZTF4dUlDQXRkMlZpYTJsMExXRndjR1ZoY21GdVkyVTZJR0oxZEhSdmJqdGNiaUFnTHlvZ01TQXFMMXh1SUNCbWIyNTBPaUJwYm1obGNtbDBPMXh1SUNBdktpQXlJQ292WEc1OVhHNHZLaUJKYm5SbGNtRmpkR2wyWlZ4dUlDQWdQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDBnS2k5Y2JpOHFYRzRnS2lCQlpHUWdkR2hsSUdOdmNuSmxZM1FnWkdsemNHeGhlU0JwYmlCRlpHZGxMQ0JKUlNBeE1Dc3NJR0Z1WkNCR2FYSmxabTk0TGx4dUlDb3ZYRzVrWlhSaGFXeHpJSHRjYmlBZ1pHbHpjR3hoZVRvZ1lteHZZMnM3WEc1OVhHNHZLbHh1SUNvZ1FXUmtJSFJvWlNCamIzSnlaV04wSUdScGMzQnNZWGtnYVc0Z1lXeHNJR0p5YjNkelpYSnpMbHh1SUNvdlhHNXpkVzF0WVhKNUlIdGNiaUFnWkdsemNHeGhlVG9nYkdsemRDMXBkR1Z0TzF4dWZWeHVMeW9nVFdselkxeHVJQ0FnUFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwZ0tpOWNiaThxS2x4dUlDb2dRV1JrSUhSb1pTQmpiM0p5WldOMElHUnBjM0JzWVhrZ2FXNGdTVVVnTVRBckxseHVJQ292WEc1MFpXMXdiR0YwWlNCN1hHNGdJR1JwYzNCc1lYazZJRzV2Ym1VN1hHNTlYRzR2S2lwY2JpQXFJRUZrWkNCMGFHVWdZMjl5Y21WamRDQmthWE53YkdGNUlHbHVJRWxGSURFd0xseHVJQ292WEc1YmFHbGtaR1Z1WFNCN1hHNGdJR1JwYzNCc1lYazZJRzV2Ym1VN1hHNTlYRzR2S2lBOVBUMDlQU0JDWVhObElEMDlQVDA5SUNvdlhHNW9kRzFzTEZ4dVltOWtlU0I3WEc0Z0lHaGxhV2RvZERvZ01UQXdKVHRjYmlBZ1ltRmphMmR5YjNWdVpEb2dJMlpoWm1GbVlUdGNiaUFnWTI5c2IzSTZJQ016TXpNN1hHNGdJR1p2Ym5RdGMybDZaVG9nTVRSd2VEdGNiaUFnYkdsdVpTMW9aV2xuYUhRNklERTFNQ1U3WEc0Z0lHWnZiblF0Wm1GdGFXeDVPaUFuVFdsamNtOXpiMlowSUZsaFNHVnBJRlZKSnl3Z1FYSnBZV3dzSUhOaGJuTXRjMlZ5YVdZN1hHNGdJRzkyWlhKbWJHOTNPaUJvYVdSa1pXNDdYRzU5WEc1aE9teHBibXNzWEc1aE9uWnBjMmwwWldRc1hHNWhPbWh2ZG1WeUlIdGNiaUFnWTI5c2IzSTZJQ013TlRnNU5ESTdYRzRnSUhSbGVIUXRaR1ZqYjNKaGRHbHZiam9nYm05dVpUdGNibjFjYm1FNmFHOTJaWElnZTF4dUlDQjBaWGgwTFdSbFkyOXlZWFJwYjI0NklIVnVaR1Z5YkdsdVpUdGNibjFjYm1OdlpHVWdlMXh1SUNCbWIyNTBMV1poYldsc2VUb2dKMU52ZFhKalpTQkRiMlJsSUZCeWJ5Y3NJRU52Ym5OdmJHRnpMQ0JIWlc5eVoybGhMQ0JOYjI1aFkyOHNJRzF2Ym05emNHRmpaU3dnUVhKcFlXd3NJSE5oYm5NdGMyVnlhV1k3WEc1OVhHNHZLaUE5UFQwOVBTQlRZM0p2Ykd4aVlYSWdQVDA5UFQwZ0tpOWNiam82TFhkbFltdHBkQzF6WTNKdmJHeGlZWElnZTF4dUlDQjNhV1IwYURvZ04zQjRPMXh1SUNCb1pXbG5hSFE2SURkd2VEdGNiaUFnTFhkbFltdHBkQzFpYjNKa1pYSXRjbUZrYVhWek9pQTFjSGc3WEc1OVhHNDZPaTEzWldKcmFYUXRjMk55YjJ4c1ltRnlMWFJ5WVdOckxYQnBaV05sSUh0Y2JpQWdMWGRsWW10cGRDMWliM0prWlhJdGNtRmthWFZ6T2lBMWNIZzdYRzU5WEc0Nk9pMTNaV0pyYVhRdGMyTnliMnhzWW1GeUxYUm9kVzFpT25abGNuUnBZMkZzSUh0Y2JpQWdZbUZqYTJkeWIzVnVaQzFqYjJ4dmNqb2djbWRpWVNnd0xDQXdMQ0F3TENBd0xqSTFLVHRjYmlBZ0xYZGxZbXRwZEMxaWIzSmtaWEl0Y21Ga2FYVnpPaUExY0hnN1hHNTlYRzQ2T2kxM1pXSnJhWFF0YzJOeWIyeHNZbUZ5TFhSb2RXMWlPbWh2Y21sNmIyNTBZV3dnZTF4dUlDQmlZV05yWjNKdmRXNWtMV052Ykc5eU9pQnlaMkpoS0RBc0lEQXNJREFzSURBdU1qVXBPMXh1SUNBdGQyVmlhMmwwTFdKdmNtUmxjaTF5WVdScGRYTTZJRFZ3ZUR0Y2JuMWNiam82TFhkbFltdHBkQzF6WTNKdmJHeGlZWEk2YUc5MlpYSWdlMXh1SUNCaVlXTnJaM0p2ZFc1a0xXTnZiRzl5T2lCeVoySmhLREFzSURBc0lEQXNJREF1TVRVcE8xeHVmVnh1T2pvdGQyVmlhMmwwTFhOamNtOXNiR0poY2kxMGFIVnRZanBvYjNabGNpQjdYRzRnSUdKaFkydG5jbTkxYm1RdFkyOXNiM0k2SUhKblltRW9NQ3dnTUN3Z01Dd2dNQzR6TlNrN1hHNTlYRzR2S2lCTVlYbHZkWFFnS2k5Y2JpNWtiMk56SUh0Y2JpQWdaR2x6Y0d4aGVUb2dabXhsZUR0Y2JpQWdabXhsZUMxa2FYSmxZM1JwYjI0NklISnZkenRjYmlBZ1pteGxlQzEzY21Gd09pQnViM2R5WVhBN1hHNGdJSEJ2YzJsMGFXOXVPaUJ5Wld4aGRHbDJaVHRjYmlBZ2VpMXBibVJsZURvZ01UdGNiaUFnYUdWcFoyaDBPaUF4TURBbE8xeHVJQ0IzYVdSMGFEb2dNVEF3SlR0Y2JpQWdiV0Z5WjJsdU9pQXdPMXh1SUNCdmRtVnlabXh2ZHpvZ2FHbGtaR1Z1TzF4dWZWeHVMeW9nUVhOcFpHVWdLaTljYmk1aGMybGtaU0I3WEc0Z0lHUnBjM0JzWVhrNklHWnNaWGc3WEc0Z0lHWnNaWGd0YzJoeWFXNXJPaUF3TzF4dUlDQm1iR1Y0TFdScGNtVmpkR2x2YmpvZ1kyOXNkVzF1TzF4dUlDQm1iR1Y0TFhkeVlYQTZJRzV2ZDNKaGNEdGNiaUFnZDJsa2RHZzZJREkyTUhCNE8xeHVJQ0J0WVhKbmFXNDZJREE3WEc0Z0lHaGxhV2RvZERvZ01UQXdKVHRjYmlBZ1ltRmphMmR5YjNWdVpDMWpiMnh2Y2pvZ0l6TXpNenRjYmlBZ1kyOXNiM0k2SUNOa1pHUTdYRzRnSUdKdmVDMXphR0ZrYjNjNklEQWdNQ0ExY0hnZ01uQjRJQ05rWkdRN1hHNGdJSFJ5WVc1emFYUnBiMjR0WkhWeVlYUnBiMjQ2SURBdU0zTTdYRzRnSUc5MlpYSm1iRzkzT2lCaGRYUnZPMXh1ZlZ4dUx5b2dUV0ZwYmlBcUwxeHVMbTFoYVc0Z2UxeHVJQ0JtYkdWNE9pQXhPMXh1SUNCd2IzTnBkR2x2YmpvZ2NtVnNZWFJwZG1VN1hHNGdJSG90YVc1a1pYZzZJREU3WEc0Z0lHaGxhV2RvZERvZ01UQXdKVHRjYmlBZ1ltRmphMmR5YjNWdVpDMWpiMnh2Y2pvZ0kyWm1aanRjYmlBZ2IzWmxjbVpzYjNjNklHRjFkRzg3WEc1OVhHNUFiV1ZrYVdFZ0tHMWhlQzEzYVdSMGFEb2dOVEF3Y0hncElIdGNiaUFnTG1SdlkzTWdlMXh1SUNBZ0lHWnNaWGd0WkdseVpXTjBhVzl1T2lCamIyeDFiVzQ3WEc0Z0lIMWNiaUFnTG1GemFXUmxMRnh1SUNBdWJXRnBiaUI3WEc0Z0lDQWdkMmxrZEdnNklERXdNQ1U3WEc0Z0lIMWNiaUFnTG1GemFXUmxJSHRjYmlBZ0lDQndiM05wZEdsdmJqb2dabWw0WldRN1hHNGdJQ0FnZWkxcGJtUmxlRG9nTXp0Y2JpQWdJQ0IwYjNBNklEQTdYRzRnSUgxY2JpQWdMbUZ6YVdSbExtOTFkR3hwYm1VdGJtRjJhV2RoZEc5eVgyWnZiR1JsWkNCN1hHNGdJQ0FnYkdWbWREb2dMVEV3TUNVN1hHNGdJSDFjYmlBZ0xtRnphV1JsTG05MWRHeHBibVV0Ym1GMmFXZGhkRzl5WDJWNGNHRnVaR1ZrSUh0Y2JpQWdJQ0JzWldaME9pQXdPMXh1SUNCOVhHNTlYRzR1WVhOcFpHVWdlMXh1SUNCbWIyNTBMV1poYldsc2VUb2dKMU52ZFhKalpTQkRiMlJsSUZCeWJ5Y3NJRU52Ym5OdmJHRnpMQ0JIWlc5eVoybGhMQ0JOYjI1aFkyOHNJRzF2Ym05emNHRmpaU3dnUVhKcFlXd3NJSE5oYm5NdGMyVnlhV1k3WEc1OVhHNHVZWE5wWkdWZlgyaGxZV1JsY2lCN1hHNGdJRzFoY21kcGJqb2dNQ0JoZFhSdk8xeHVJQ0JtYkdWNExYTm9jbWx1YXpvZ01EdGNiaUFnYjNabGNtWnNiM2M2SUdocFpHUmxianRjYm4xY2JpNWhjMmxrWlY5ZmJtRjJJSHRjYmlBZ1pteGxlRG9nTVR0Y2JpQWdiM1psY21ac2IzYzZJR0YxZEc4N1hHNTlYRzR1WVhOcFpHVmZYMmd5SUh0Y2JpQWdiV0Z5WjJsdU9pQXdJR0YxZEc4N1hHNGdJR2hsYVdkb2REb2dOVFJ3ZUR0Y2JpQWdiR2x1WlMxb1pXbG5hSFE2SURVMGNIZzdYRzRnSUdadmJuUXRjMmw2WlRvZ01qQndlRHRjYmlBZ1ptOXVkQzEzWldsbmFIUTZJRzV2Y20xaGJEdGNiaUFnWm05dWRDMW1ZVzFwYkhrNklFZGxiM0puYVdFc0lFTnZibk52YkdGekxDQkJjbWxoYkN3Z2MyRnVjeTF6WlhKcFpqdGNiaUFnZEdWNGRDMWhiR2xuYmpvZ1kyVnVkR1Z5TzF4dUlDQnZkbVZ5Wm14dmR6b2dhR2xrWkdWdU8xeHVmVnh1TG1GemFXUmxYMTlvTXlCN1hHNGdJRzFoY21kcGJqb2dNQ0JoZFhSdk8xeHVJQ0J3WVdSa2FXNW5PaUF3SURJd2NIZzdYRzRnSUdadmJuUXRjMmw2WlRvZ01UWndlRHRjYmlBZ2IzWmxjbVpzYjNjNklHaHBaR1JsYmp0Y2JuMWNiaTVoYzJsa1pWOWZiR2x6ZENCN1hHNGdJRzFoY21kcGJqb2dNRHRjYmlBZ2NHRmtaR2x1WnpvZ01UQndlQ0F3TzF4dUlDQnZkbVZ5Wm14dmR6b2dhR2xrWkdWdU8xeHVmVnh1TG1GemFXUmxYMTlwZEdWdElIdGNiaUFnYUdWcFoyaDBPaUF6TW5CNE8xeHVJQ0JzYVc1bExXaGxhV2RvZERvZ016SndlRHRjYmlBZ2NHRmtaR2x1WnpvZ01DQXpNSEI0TzF4dUlDQmpkWEp6YjNJNklIQnZhVzUwWlhJN1hHNGdJR1p2Ym5RdGMybDZaVG9nTVROd2VEdGNiaUFnYjNabGNtWnNiM2M2SUdocFpHUmxianRjYm4xY2JpNWhjMmxrWlMxdVlYWnBaMkYwYjNJZ2UxeHVJQ0JtYkdWNE9pQXhPMXh1ZlZ4dUxtRnphV1JsTFc1aGRtbG5ZWFJ2Y2lBdWIzVjBiR2x1WlMxdVlYWnBaMkYwYjNKZlgyMWhhVzQ2T2kxM1pXSnJhWFF0YzJOeWIyeHNZbUZ5TFhSb2RXMWlJSHRjYmlBZ1ltRmphMmR5YjNWdVpDMWpiMnh2Y2pvZ0l6WTJOanRjYm4xY2JpNWhjMmxrWlMxdVlYWnBaMkYwYjNJZ0xtOTFkR3hwYm1VdGJtRjJhV2RoZEc5eVgxOXRZV2x1T2pvdGQyVmlhMmwwTFhOamNtOXNiR0poY2kxMGFIVnRZanBvYjNabGNpQjdYRzRnSUdKaFkydG5jbTkxYm1RdFkyOXNiM0k2SUNNNU9UazdYRzU5WEc0dVlYTnBaR1V0Ym1GMmFXZGhkRzl5SUM1dmRYUnNhVzVsTFc1aGRtbG5ZWFJ2Y2w5ZmNHeGhZMlZvYjJ4a1pYSWdlMXh1SUNCaVlXTnJaM0p2ZFc1a0xXTnZiRzl5T2lBak5UVTFPMXh1SUNCaWIzSmtaWEl0YkdWbWREb2dNM0I0SUhOdmJHbGtJQ05tWm1ZN1hHNTlYRzR1WVhOcFpHVXRibUYyYVdkaGRHOXlJQzV2ZFhSc2FXNWxMVzVoZG1sbllYUnZjbDlmWVc1amFHOXlPbXhwYm1zZ2UxeHVJQ0JqYjJ4dmNqb2dJMlJrWkR0Y2JpQWdkR1Y0ZEMxa1pXTnZjbUYwYVc5dU9pQnViMjVsTzF4dWZWeHVMbUZ6YVdSbExXNWhkbWxuWVhSdmNpQXViM1YwYkdsdVpTMXVZWFpwWjJGMGIzSmZYMkZ1WTJodmNqcDJhWE5wZEdWa0lIdGNiaUFnWTI5c2IzSTZJQ05rWkdRN1hHNGdJSFJsZUhRdFpHVmpiM0poZEdsdmJqb2dibTl1WlR0Y2JuMWNiaTVoYzJsa1pTMXVZWFpwWjJGMGIzSWdMbTkxZEd4cGJtVXRibUYyYVdkaGRHOXlYMTloYm1Ob2IzSTZhRzkyWlhJZ2UxeHVJQ0JqYjJ4dmNqb2dJMlJrWkR0Y2JpQWdkR1Y0ZEMxa1pXTnZjbUYwYVc5dU9pQjFibVJsY214cGJtVTdYRzU5WEc0dVlYTnBaR1V0Ym1GMmFXZGhkRzl5SUM1dmRYUnNhVzVsTFc1aGRtbG5ZWFJ2Y2w5aFkzUnBkbVV1YjNWMGJHbHVaUzF1WVhacFoyRjBiM0pmWDJGdVkyaHZjanBzYVc1ckxGeHVMbUZ6YVdSbExXNWhkbWxuWVhSdmNpQXViM1YwYkdsdVpTMXVZWFpwWjJGMGIzSmZZV04wYVhabExtOTFkR3hwYm1VdGJtRjJhV2RoZEc5eVgxOWhibU5vYjNJNmRtbHphWFJsWkN4Y2JpNWhjMmxrWlMxdVlYWnBaMkYwYjNJZ0xtOTFkR3hwYm1VdGJtRjJhV2RoZEc5eVgyRmpkR2wyWlM1dmRYUnNhVzVsTFc1aGRtbG5ZWFJ2Y2w5ZllXNWphRzl5T21odmRtVnlJSHRjYmlBZ1kyOXNiM0k2SUNObVptWTdYRzU5WEc0dWJXRnBibDlmYUdWaFpHVnlMRnh1TG0xaGFXNWZYMlp2YjNSbGNpQjdYRzRnSUcxaGNtZHBiam9nTUNCaGRYUnZPMXh1SUNCd1lXUmthVzVuT2lBeFpXMDdYRzRnSUhSbGVIUXRZV3hwWjI0NklHTmxiblJsY2p0Y2JpQWdiM1psY21ac2IzYzZJR2hwWkdSbGJqdGNibjFjYmk1dFlXbHVYMTlvTVNCN1hHNGdJRzFoY21kcGJqb2dNQ0JoZFhSdk8xeHVJQ0J3WVdSa2FXNW5MWFJ2Y0RvZ01XVnRPMXh1SUNCbWIyNTBMWE5wZW1VNklEVmxiVHRjYmlBZ1ptOXVkQzEzWldsbmFIUTZJRzV2Y20xaGJEdGNiaUFnYkdsdVpTMW9aV2xuYUhRNklESmxiVHRjYmlBZ2IzWmxjbVpzYjNjNklHaHBaR1JsYmp0Y2JuMWNiaTV0WVdsdVgxOXVZVzFsSUh0Y2JpQWdZMjlzYjNJNklDTTFNRGRoWm1VN1hHNGdJR1p2Ym5RdGQyVnBaMmgwT2lCdWIzSnRZV3c3WEc1OVhHNHViV0ZwYmw5ZmRHRm5iR2x1WlNCN1hHNGdJRzFoY21kcGJqb2dNV1Z0SUdGMWRHODdYRzRnSUcxaGVDMTNhV1IwYURvZ09UWXdjSGc3WEc0Z0lHeHBibVV0YUdWcFoyaDBPaUF4TGpObGJUdGNiaUFnWm05dWRDMXphWHBsT2lBeVpXMDdYRzRnSUdOdmJHOXlPaUFqT1RrNU8xeHVJQ0JtYjI1MExYZGxhV2RvZERvZ01UQXdPMXh1SUNCdmRtVnlabXh2ZHpvZ2FHbGtaR1Z1TzF4dWZWeHVMbTFoYVc1ZlgyTmtiaUI3WEc0Z0lHMWhjbWRwYmpvZ01tVnRJREE3WEc0Z0lIQmhaR1JwYm1jNklESmxiVHRjYmlBZ1ptOXVkQzF6YVhwbE9pQXhObkI0TzF4dUlDQnNhVzVsTFdobGFXZG9kRG9nTVRVd0pUdGNiaUFnZEdWNGRDMWhiR2xuYmpvZ1kyVnVkR1Z5TzF4dUlDQmlZV05yWjNKdmRXNWtMV052Ykc5eU9pQWpabUZtWVdaaE8xeHVJQ0JpYjNKa1pYSXRkRzl3T2lBeGNIZ2djMjlzYVdRZ0kyUmtaRHRjYmlBZ1ltOXlaR1Z5TFdKdmRIUnZiVG9nTVhCNElITnZiR2xrSUNOa1pHUTdYRzRnSUdOdmJHOXlPaUFqTmpZMk8xeHVJQ0J2ZG1WeVpteHZkem9nYUdsa1pHVnVPMXh1ZlZ4dUxtMWhhVzVmWDJSdmQyNXNiMkZrSUh0Y2JpQWdiV0Z5WjJsdU9pQXhaVzBnWVhWMGJ6dGNiaUFnZDJsa2RHZzZJREl3TUhCNE8xeHVJQ0IwWlhoMExXRnNhV2R1T2lCalpXNTBaWEk3WEc0Z0lHOTJaWEptYkc5M09pQm9hV1JrWlc0N1hHNTlYRzR1YldGcGJsOWZZblYwZEc5dUlIdGNiaUFnWkdsemNHeGhlVG9nYVc1c2FXNWxMV0pzYjJOck8xeHVJQ0JpYjNKa1pYSXRjbUZrYVhWek9pQTBjSGc3WEc0Z0lIQmhaR1JwYm1jNklERTBjSGdnTWpsd2VEdGNiaUFnWm05dWRDMXphWHBsT2lBeE9IQjRPMXh1SUNCbWIyNTBMV1poYldsc2VUb2dKMU52ZFhKalpTQkRiMlJsSUZCeWJ5Y3NJRU52Ym5OdmJHRnpMQ0JIWlc5eVoybGhMQ0JOYjI1aFkyOHNJRzF2Ym05emNHRmpaU3dnUVhKcFlXd3NJSE5oYm5NdGMyVnlhV1k3WEc0Z0lHSmhZMnRuY205MWJtUXRZMjlzYjNJNklDTXdOVGc1TkRJN1hHNGdJRzkyWlhKbWJHOTNPaUJvYVdSa1pXNDdYRzU5WEc0dWJXRnBibDlmWW5WMGRHOXVPbXhwYm1zc1hHNHViV0ZwYmw5ZlluVjBkRzl1T25acGMybDBaV1FzWEc0dWJXRnBibDlmWW5WMGRHOXVPbWh2ZG1WeUlIdGNiaUFnWTI5c2IzSTZJQ05tWm1ZN1hHNGdJSFJsZUhRdFpHVmpiM0poZEdsdmJqb2dibTl1WlR0Y2JuMWNiaTV0WVdsdVgxOW1iMjkwWlhJZ2UxeHVJQ0J0WVhKbmFXNDZJREFnTTJWdE8xeHVJQ0JpYjNKa1pYSXRkRzl3T2lBeGNIZ2djMjlzYVdRZ0kyUmtaRHRjYm4xY2JpNXpaV04wYVc5dUlIdGNiaUFnYldGeVoybHVPaUF4WlcwZ01EdGNiaUFnYjNabGNtWnNiM2M2SUdocFpHUmxianRjYm4xY2JpNXpaV04wYVc5dVgxOW9aV0ZrWlhJc1hHNHVjMlZqZEdsdmJsOWZZMjl1ZEdWdWRDeGNiaTV6WldOMGFXOXVYMTltYjI5MFpYSWdlMXh1SUNCdFlYSm5hVzQ2SURBN1hHNGdJSEJoWkdScGJtYzZJREFnTTJWdE8xeHVJQ0J2ZG1WeVpteHZkem9nYUdsa1pHVnVPMXh1ZlZ4dUxuTmxZM1JwYjI1ZlgzUnBkR3hsSUh0Y2JpQWdZMjlzYjNJNklDTTJOalk3WEc1OVhHNHVjMlZqZEdsdmJsOWZhRE1nZTF4dUlDQmpiMnh2Y2pvZ0l6VXdOMkZtWlR0Y2JpQWdabTl1ZEMxemFYcGxPaUF4TGpNMVpXMDdYRzU5WEc0dWMyVmpkR2x2Ymw5ZmFEUWdlMXh1SUNCbWIyNTBMWE5wZW1VNklERXVNV1Z0TzF4dUlDQmpiMnh2Y2pvZ0l6WTJOanRjYm4xY2JpNXpaV04wYVc5dVgxOW9OU0I3WEc0Z0lHWnZiblF0YzJsNlpUb2dNV1Z0TzF4dUlDQmpiMnh2Y2pvZ0l6azVPVHRjYm4xY2JpNXpaV04wYVc5dVgxOWtiQ3hjYmk1elpXTjBhVzl1WDE5a2RDeGNiaTV6WldOMGFXOXVYMTlrWkNCN1hHNGdJRzFoY21kcGJqb2dNRHRjYmlBZ2NHRmtaR2x1WnpvZ01EdGNiaUFnYjNabGNtWnNiM2M2SUdocFpHUmxianRjYm4xY2JpNXpaV04wYVc5dVgxOWtiQ0I3WEc0Z0lIQnZjMmwwYVc5dU9pQnlaV3hoZEdsMlpUdGNiaUFnZWkxcGJtUmxlRG9nTVR0Y2JuMWNiaTV6WldOMGFXOXVYMTlrZENCN1hHNGdJR1JwYzNCc1lYazZJR2x1YkdsdVpTMWliRzlqYXp0Y2JuMWNiaTV6WldOMGFXOXVYMTlrWkNCN1hHNGdJR1JwYzNCc1lYazZJR2x1YkdsdVpTMWliRzlqYXp0Y2JpQWdZMjlzYjNJNklDTXdOVGc1TkRJN1hHNTlYRzR1YzJWamRHbHZibDlmY0hKbElIdGNiaUFnYldGeVoybHVPaUF5WlcwZ01EdGNiaUFnY0dGa1pHbHVaem9nTVdWdE8xeHVJQ0JtYjI1MExYTnBlbVU2SURFMGNIZzdYRzRnSUd4cGJtVXRhR1ZwWjJoME9pQXhOVEFsTzF4dUlDQjBaWGgwTFdGc2FXZHVPaUJzWldaME8xeHVJQ0JpWVdOclozSnZkVzVrTFdOdmJHOXlPaUFqWm1GbVlXWmhPMXh1SUNCaWIzSmtaWEk2SURGd2VDQnpiMnhwWkNBalpHUmtPMXh1SUNCaWIzSmtaWEl0Y21Ga2FYVnpPaUEwY0hnN1hHNGdJR052Ykc5eU9pQWpOalkyTzF4dUlDQnZkbVZ5Wm14dmR6b2dZWFYwYnp0Y2JuMWNiaTV6WldOMGFXOXVYMTlqYjJSbElIdGNiaUFnWkdsemNHeGhlVG9nWW14dlkyczdYRzRnSUcxaGNtZHBiam9nTUNCaGRYUnZPMXh1SUNCdmRtVnlabXh2ZHpvZ2FHbGtaR1Z1TzF4dWZWeHVMbk5sWTNScGIyNWZYMlp2YjNSbGNpQjdYRzRnSUdKdmNtUmxjaTEwYjNBNklERndlQ0J6YjJ4cFpDQWpaR1JrTzF4dUlDQnRZWEpuYVc0dGRHOXdPaUF6WlcwN1hHNGdJR0poWTJ0bmNtOTFibVF0WTI5c2IzSTZJQ05tWVdaaFptRTdYRzRnSUdOdmJHOXlPaUFqT1RrNU8xeHVmVnh1TG5ObFkzUnBiMjVmWDNSaFlteGxJSHRjYmlBZ2JXRnlaMmx1T2lBeFpXMGdZWFYwYnp0Y2JpQWdkMmxrZEdnNklERXdNQ1U3WEc0Z0lHSnZjbVJsY2kxMGIzQTZJREZ3ZUNCemIyeHBaQ0FqWkdSa08xeHVmVnh1TG5ObFkzUnBiMjVmWDNSb0xGeHVMbk5sWTNScGIyNWZYM1JrSUh0Y2JpQWdjR0ZrWkdsdVp6b2dOWEI0SURFMmNIZzdYRzRnSUd4cGJtVXRhR1ZwWjJoME9pQXlObkI0TzF4dUlDQmliM0prWlhJdFltOTBkRzl0T2lBeGNIZ2djMjlzYVdRZ0kyUmtaRHRjYm4xY2JpNXpaV04wYVc5dVgxOTBhQ0I3WEc0Z0lIUmxlSFF0WVd4cFoyNDZJR05sYm5SbGNqdGNiaUFnWW1GamEyZHliM1Z1WkMxamIyeHZjam9nSTJaaFptRm1ZVHRjYm4xY2JrQnRaV1JwWVNBb2JXRjRMWGRwWkhSb09pQTFNREJ3ZUNrZ2UxeHVJQ0F1YzJWamRHbHZibDlmYUdWaFpHVnlMRnh1SUNBdWMyVmpkR2x2Ymw5ZlkyOXVkR1Z1ZENCN1hHNGdJQ0FnY0dGa1pHbHVaem9nTUNBeFpXMDdYRzRnSUgxY2JuMWNiaTVqWVhObElIdGNiaUFnY0c5emFYUnBiMjQ2SUhKbGJHRjBhWFpsTzF4dUlDQjZMV2x1WkdWNE9pQXhPMXh1SUNCa2FYTndiR0Y1T2lCbmNtbGtPMXh1SUNCbmNtbGtMWFJsYlhCc1lYUmxMV052YkhWdGJuTTZJSEpsY0dWaGRDZ3lMQ0F4Wm5JcE8xeHVJQ0JuWVhBNklEUXdjSGc3WEc0Z0lIQmhaR1JwYm1jNklERmxiVHRjYmlBZ1ltOXlaR1Z5TFhSdmNEb2dNWEI0SUhOdmJHbGtJQ05rWkdRN1hHNGdJR0p2Y21SbGNpMWliM1IwYjIwNklERndlQ0J6YjJ4cFpDQWpaR1JrTzF4dUlDQnZkbVZ5Wm14dmR6b2dhR2xrWkdWdU8xeHVmVnh1TG1OaGMyVTZZV1owWlhJZ2UxeHVJQ0JqYjI1MFpXNTBPaUFuSnp0Y2JpQWdjRzl6YVhScGIyNDZJR0ZpYzI5c2RYUmxPMXh1SUNCNkxXbHVaR1Y0T2lBeU8xeHVJQ0IwYjNBNklEQTdYRzRnSUd4bFpuUTZJRFV3SlR0Y2JpQWdhR1ZwWjJoME9pQXhNREFsTzF4dUlDQjNhV1IwYURvZ01EdGNiaUFnWW05eVpHVnlMV3hsWm5RNklERndlQ0J6YjJ4cFpDQWpaR1JrTzF4dUlDQnZkbVZ5Wm14dmR6b2dhR2xrWkdWdU8xeHVmVnh1TG1OaGMyVmZYM0J5WlN4Y2JpNWpZWE5sWDE5MFpYaDBZWEpsWVNCN1hHNGdJR1p2Ym5RdGMybDZaVG9nTVROd2VEdGNiaUFnYkdsdVpTMW9aV2xuYUhRNklERTFNQ1U3WEc1OVhHNHVZMkZ6WlY5ZmNISmxMRnh1TG1OaGMyVmZYMk52WkdVc1hHNHVZMkZ6WlY5ZmRHVjRkR0Z5WldFZ2UxeHVJQ0JtYjI1MExXWmhiV2xzZVRvZ0owTnZkWEpwWlhJZ1RtVjNKeXdnUTI5dWMyOXNZWE1zSUVkbGIzSm5hV0VzSUVGeWFXRnNMQ0J6WVc1ekxYTmxjbWxtTzF4dWZWeHVMbU5oYzJWZlgzQnlaU0I3WEc0Z0lHMWhjbWRwYmpvZ01EdGNiaUFnY0dGa1pHbHVaem9nTVdWdE8xeHVJQ0JpWVdOclozSnZkVzVrTFdOdmJHOXlPaUFqWm1GbVlXWmhPMXh1SUNCb1pXbG5hSFE2SURFd01DVTdYRzRnSUdKdmNtUmxjaTF5WVdScGRYTTZJRFJ3ZUR0Y2JpQWdZbTk0TFhOcGVtbHVaem9nWW05eVpHVnlMV0p2ZUR0Y2JpQWdiM1psY21ac2IzYzZJR0YxZEc4N1hHNTlYRzR1WTJGelpWOWZkRzl2YkdKaGNpQjdYRzRnSUcxaGNtZHBiam9nTUNCaGRYUnZPMXh1SUNCb1pXbG5hSFE2SURNMmNIZzdYRzRnSUd4cGJtVXRhR1ZwWjJoME9pQXpObkI0TzF4dUlDQm1iMjUwTFhOcGVtVTZJREUwY0hnN1hHNGdJSEJoWkdScGJtYzZJREFnTVRad2VEdGNiaUFnZEdWNGRDMWhiR2xuYmpvZ2NtbG5hSFE3WEc0Z0lHOTJaWEptYkc5M09pQm9hV1JrWlc0N1hHNTlYRzR1WTJGelpWOWZZV04wYVc5dUxGeHVMbU5oYzJWZlgzSmxiVzkyWlNCN1hHNGdJR04xY25OdmNqb2djRzlwYm5SbGNqdGNiaUFnWTI5c2IzSTZJQ013TlRnNU5ESTdYRzRnSUhWelpYSXRjMlZzWldOME9pQnViMjVsTzF4dWZWeHVMbU5oYzJWZlgyRmpkR2x2YmlCN1hHNGdJR1p2Ym5RdGMybDZaVG9nTVROd2VEdGNiaUFnY0dGa1pHbHVaeTFzWldaME9pQXhNSEI0TzF4dWZWeHVMbU5oYzJWZlgyRmpkR2x2YmpwbWFYSnpkQzFqYUdsc1pDQjdYRzRnSUhCaFpHUnBibWN0YkdWbWREb2dNRHRjYm4xY2JpNWpZWE5sWDE5eVpXMXZkbVVnZTF4dUlDQm1iRzloZERvZ2NtbG5hSFE3WEc1OVhHNHVZMkZ6WlY5ZlkyOXVjMjlzWlNCN1hHNGdJRzFoY21kcGJqb2dNQ0JoZFhSdk8xeHVJQ0JvWldsbmFIUTZJREU0TUhCNE8xeHVJQ0JpYjNKa1pYSTZJREZ3ZUNCemIyeHBaQ0FqWkdSa08xeHVJQ0J2ZG1WeVpteHZkem9nYUdsa1pHVnVPMXh1ZlZ4dUxtTmhjMlZmWDNSbGVIUmhjbVZoSUh0Y2JpQWdiV0Z5WjJsdU9pQXdJR0YxZEc4N1hHNGdJSGRwWkhSb09pQXhNREFsTzF4dUlDQm9aV2xuYUhRNklERXdNQ1U3WEc0Z0lHSnZjbVJsY2pvZ2JtOXVaVHRjYmlBZ2IzVjBiR2x1WlRvZ2JtOXVaVHRjYmlBZ2NHRmtaR2x1WnpvZ01XVnRPMXh1SUNCaWIzZ3RjMmw2YVc1bk9pQmliM0prWlhJdFltOTRPMXh1SUNCdmRtVnlabXh2ZHpvZ1lYVjBienRjYm4xY2JpNWpZWE5sWDE5c2FYTjBMRnh1TG1OaGMyVmZYMmwwWlcwZ2UxeHVJQ0J0WVhKbmFXNDZJREE3WEc0Z0lIQmhaR1JwYm1jNklEQTdYRzRnSUd4cGMzUXRjM1I1YkdVdGRIbHdaVG9nYm05dVpUdGNiaUFnYjNabGNtWnNiM2M2SUdocFpHUmxianRjYm4xY2JpNWpZWE5sWDE5c2FYTjBJSHRjYmlBZ2FHVnBaMmgwT2lBek5qQndlRHRjYmlBZ1ltOXlaR1Z5TFhSdmNEb2dNWEI0SUhOdmJHbGtJQ05rWkdRN1hHNGdJR0p2Y21SbGNpMWliM1IwYjIwNklERndlQ0J6YjJ4cFpDQWpaR1JrTzF4dUlDQm1iMjUwTFhOcGVtVTZJREV6Y0hnN1hHNGdJRzkyWlhKbWJHOTNPaUJoZFhSdk8xeHVmVnh1TG1OaGMyVmZYMmwwWlcwZ2UxeHVJQ0JvWldsbmFIUTZJRE0yY0hnN1hHNGdJR3hwYm1VdGFHVnBaMmgwT2lBek5uQjRPMXh1SUNCamRYSnpiM0k2SUhCdmFXNTBaWEk3WEc0Z0lIQmhaR1JwYm1jNklEQWdNVFp3ZUR0Y2JuMWNiaTVqWVhObFgxOXBkR1Z0T21odmRtVnlJSHRjYmlBZ1ltRmphMmR5YjNWdVpDMWpiMnh2Y2pvZ0kyWTNaamhtT1R0Y2JuMWNianB5YjI5MElIdGNiaUFnTFMxdmRYUnNhVzVsTFhwSmJtUmxlRG9nTWpBd01EdGNiaUFnTFMxdmRYUnNhVzVsTFhOMGFXTnJlUzFvWldsbmFIUTZJREV3TUNVN1hHNGdJQzB0YjNWMGJHbHVaUzF1WVhacFoyRjBiM0l0ZDJsa2RHZzZJREV3TUNVN1hHNTlYRzR2S2lBOVBUMDlQVDA5UFQwOUlHTnZiRzl5Y3k1MGFHVnRaU0F0SU9XZnV1ZWhnT21pbk9pSnN1V1BtT21IaittYmh1V1FpQ0E5UFQwOVBUMDlQVDA5SUNvdlhHNHZLaXBjYmlBcUlHVnNiR2x3YzJsekxteGxjM01nTFNEbWxvZm1uS3pubklIbmxhVWdiV2w0YVc1NElPV0h2ZWFWc0Z4dUlDb2dQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBWeHVJQ29nUTNKbFlYUmxaQ0JDZVRvZ1dXRnZhR0ZwZUdsaGIxeHVJQ29nVlhCa1lYUmxPaUF5TURJeUxqTXVNVEZjYmlBcUwxeHVMeW9nUFQwOVBUMDlJT2FXaCthY3JPZWNnZWVWcGVXSHZlYVZzQ0E5UFQwOVBUMGdLaTljYmk4cUtseHVJQ29nYzJoaFpHOTNMbXhsYzNNZ0xTRHBtTFRsdmJIbW9MZmx2SS9vcnI3bnZhNGdiV2w0YVc1NElPV0h2ZWFWc0Z4dUlDb2dQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBWeHVJQ29nUTNKbFlYUmxaQ0JDZVRvZ1dXRnZhR0ZwZUdsaGIxeHVJQ29nVlhCa1lYUmxPaUF5TURJeUxqTXVNakJjYmlBcUwxeHVMeW9nUFQwOVBUMDlJT21ZdE9XOXNlYWd0K1c4aitpdXZ1ZTlydVdIdmVhVnNDQTlQVDA5UFQwZ0tpOWNiaThxSUQwOVBUMDlQVDA5UFQwZ2FXTnZiaTUwYUdWdFpTQXRJSE4yWnlEbG03N21vSWZubW9UbW9MZmx2SThnUFQwOVBUMDlQVDA5UFNBcUwxeHVMbTkxZEd4cGJtVXRhV052YmlCN1hHNGdJSEJ2YzJsMGFXOXVPaUJ5Wld4aGRHbDJaVHRjYmlBZ2VpMXBibVJsZURvZ01UdGNiaUFnWkdsemNHeGhlVG9nYVc1c2FXNWxMV0pzYjJOck8xeHVJQ0IyWlhKMGFXTmhiQzFoYkdsbmJqb2diV2xrWkd4bE8xeHVJQ0IzYVdSMGFEb2dNV1Z0TzF4dUlDQm9aV2xuYUhRNklERmxiVHRjYmlBZ2IzWmxjbVpzYjNjNklHaHBaR1JsYmp0Y2JuMWNiaTV2ZFhSc2FXNWxMV2xqYjI1ZlgzTjJaeUI3WEc0Z0lIQnZjMmwwYVc5dU9pQmhZbk52YkhWMFpUdGNiaUFnZWkxcGJtUmxlRG9nTWp0Y2JpQWdkRzl3T2lBMU1DVTdYRzRnSUd4bFpuUTZJRFV3SlR0Y2JpQWdkMmxrZEdnNklERmxiVHRjYmlBZ2FHVnBaMmgwT2lBeFpXMDdYRzRnSUdacGJHdzZJR04xY25KbGJuUmpiMnh2Y2p0Y2JpQWdkSEpoYm5ObWIzSnRPaUIwY21GdWMyeGhkR1VvTFRVd0pTd2dMVFV3SlNrN1hHNGdJRzkyWlhKbWJHOTNPaUJvYVdSa1pXNDdYRzU5WEc0dWIzVjBiR2x1WlMxcFkyOXVYMmhwWkdSbGJpQjdYRzRnSUdScGMzQnNZWGs2SUc1dmJtVTdYRzU5WEc0dktpQTlQVDA5UFNCVFkzSnZiR3hpWVhJZ1BUMDlQVDBnS2k5Y2JqbzZMWGRsWW10cGRDMXpZM0p2Ykd4aVlYSWdlMXh1SUNCM2FXUjBhRG9nTjNCNE8xeHVJQ0JvWldsbmFIUTZJRGR3ZUR0Y2JpQWdMWGRsWW10cGRDMWliM0prWlhJdGNtRmthWFZ6T2lBMWNIZzdYRzU5WEc0Nk9pMTNaV0pyYVhRdGMyTnliMnhzWW1GeUxYUnlZV05yTFhCcFpXTmxJSHRjYmlBZ0xYZGxZbXRwZEMxaWIzSmtaWEl0Y21Ga2FYVnpPaUExY0hnN1hHNTlYRzQ2T2kxM1pXSnJhWFF0YzJOeWIyeHNZbUZ5TFhSb2RXMWlPblpsY25ScFkyRnNJSHRjYmlBZ1ltRmphMmR5YjNWdVpDMWpiMnh2Y2pvZ2NtZGlZU2d3TENBd0xDQXdMQ0F3TGpJMUtUdGNiaUFnTFhkbFltdHBkQzFpYjNKa1pYSXRjbUZrYVhWek9pQTFjSGc3WEc1OVhHNDZPaTEzWldKcmFYUXRjMk55YjJ4c1ltRnlMWFJvZFcxaU9taHZjbWw2YjI1MFlXd2dlMXh1SUNCaVlXTnJaM0p2ZFc1a0xXTnZiRzl5T2lCeVoySmhLREFzSURBc0lEQXNJREF1TWpVcE8xeHVJQ0F0ZDJWaWEybDBMV0p2Y21SbGNpMXlZV1JwZFhNNklEVndlRHRjYm4xY2JqbzZMWGRsWW10cGRDMXpZM0p2Ykd4aVlYSXRkR2gxYldJNmFHOTJaWElnZTF4dUlDQmlZV05yWjNKdmRXNWtMV052Ykc5eU9pQnlaMkpoS0RBc0lEQXNJREFzSURBdU16VXBPMXh1ZlZ4dU9qb3RkMlZpYTJsMExYTmpjbTlzYkdKaGNqcG9iM1psY2lCN1hHNGdJR0poWTJ0bmNtOTFibVF0WTI5c2IzSTZJSEpuWW1Fb01Dd2dNQ3dnTUN3Z01DNHhOU2s3WEc1OVhHNHViM1YwYkdsdVpTMW9aV0ZrYVc1bklIdGNiaUFnY0c5emFYUnBiMjQ2SUhKbGJHRjBhWFpsTzF4dUlDQjZMV2x1WkdWNE9pQXhPMXh1SUNCdmRtVnlabXh2ZHpvZ2FHbGtaR1Z1TzF4dWZWeHVMbTkxZEd4cGJtVXRhR1ZoWkdsdVoxOWZZVzVqYUc5eUlIdGNiaUFnWkdsemNHeGhlVG9nYm05dVpUdGNibjFjYmk1dmRYUnNhVzVsTFdobFlXUnBibWRmWDJGdVkyaHZjanBzYVc1ckxGeHVMbTkxZEd4cGJtVXRhR1ZoWkdsdVoxOWZZVzVqYUc5eU9uWnBjMmwwWldRc1hHNHViM1YwYkdsdVpTMW9aV0ZrYVc1blgxOWhibU5vYjNJNmFHOTJaWElnZTF4dUlDQmpiMnh2Y2pvZ0l6azVPVHRjYmlBZ2RHVjRkQzFrWldOdmNtRjBhVzl1T2lCdWIyNWxPMXh1ZlZ4dUxtOTFkR3hwYm1VdGFHVmhaR2x1WjE5ZllXNWphRzl5T21odmRtVnlJSHRjYmlBZ1kyOXNiM0k2SUNNMU1EZGhabVU3WEc1OVhHNHViM1YwYkdsdVpTMW9aV0ZrYVc1bk9taHZkbVZ5SUM1dmRYUnNhVzVsTFdobFlXUnBibWRmWDJGdVkyaHZjaUI3WEc0Z0lHUnBjM0JzWVhrNklHbHViR2x1WlMxaWJHOWphenRjYm4xY2JpNXZkWFJzYVc1bExXaGxZV1JwYm1kZmMzUmhjblE2YUc5MlpYSWdlMXh1SUNCdmRtVnlabXh2ZHpvZ2RtbHphV0pzWlR0Y2JuMWNiaTV2ZFhSc2FXNWxMV2hsWVdScGJtZGZjM1JoY25RZ0xtOTFkR3hwYm1VdGFHVmhaR2x1WjE5ZllXNWphRzl5SUh0Y2JpQWdjRzl6YVhScGIyNDZJR0ZpYzI5c2RYUmxPMXh1SUNCNkxXbHVaR1Y0T2lBeU8xeHVJQ0IwYjNBNklEVXdKVHRjYmlBZ2RISmhibk5tYjNKdE9pQjBjbUZ1YzJ4aGRHVlpLQzAxTUNVcE8xeHVJQ0JzWldaME9pQXRNV1Z0TzF4dWZWeHVMbTkxZEd4cGJtVXRaSEpoZDJWeUlIdGNiaUFnY0c5emFYUnBiMjQ2SUhKbGJHRjBhWFpsTzF4dUlDQjZMV2x1WkdWNE9pQXRNVHRjYmlBZ2RHOXdPaUF3TzF4dUlDQnNaV1owT2lBd08xeHVJQ0J0WVhKbmFXNDZJREE3WEc0Z0lIZHBaSFJvT2lBeE1EQWxPMXh1SUNCb1pXbG5hSFE2SURFd01DVTdYRzRnSUdKdmVDMXphWHBwYm1jNklHSnZjbVJsY2kxaWIzZzdYRzRnSUhacGMybGlhV3hwZEhrNklHaHBaR1JsYmp0Y2JpQWdiM1psY21ac2IzYzZJR2hwWkdSbGJqdGNibjFjYmk1dmRYUnNhVzVsTFdSeVlYZGxjbDlmYlc5a1lXd2dlMXh1SUNCaWIzZ3RjMmhoWkc5M09pQXdJREFnTm5CNElERndlQ0FqWkdOa1ptVTJPMXh1SUNCa2FYTndiR0Y1T2lCbWJHVjRPMXh1SUNCbWJHVjRMV1JwY21WamRHbHZiam9nWTI5c2RXMXVPMXh1SUNCbWJHVjRMWGR5WVhBNklHNXZkM0poY0R0Y2JpQWdjRzl6YVhScGIyNDZJR0ZpYzI5c2RYUmxPMXh1SUNCNkxXbHVaR1Y0T2lBeU1UdGNiaUFnYUdWcFoyaDBPaUF4TURBbE8xeHVJQ0JpWVdOclozSnZkVzVrTFdOdmJHOXlPaUFqWm1abU8xeHVJQ0IwY21GdWMybDBhVzl1TFdSMWNtRjBhVzl1T2lBd0xqUnpPMXh1SUNCdmRtVnlabXh2ZHpvZ2FHbGtaR1Z1TzF4dWZWeHVMbTkxZEd4cGJtVXRaSEpoZDJWeVgxOW9aV0ZrWlhJc1hHNHViM1YwYkdsdVpTMWtjbUYzWlhKZlgyMWhhVzRzWEc0dWIzVjBiR2x1WlMxa2NtRjNaWEpmWDJadmIzUmxjaUI3WEc0Z0lIZHBaSFJvT2lBeE1EQWxPMXh1SUNCaWIzZ3RjMmw2YVc1bk9pQmliM0prWlhJdFltOTRPMXh1ZlZ4dUxtOTFkR3hwYm1VdFpISmhkMlZ5WDE5b1pXRmtaWElzWEc0dWIzVjBiR2x1WlMxa2NtRjNaWEpmWDJadmIzUmxjaUI3WEc0Z0lHWnNaWGd0YzJoeWFXNXJPaUF3TzF4dWZWeHVMbTkxZEd4cGJtVXRaSEpoZDJWeVgxOTBhWFJzWlN4Y2JpNXZkWFJzYVc1bExXUnlZWGRsY2w5ZmJXRnBiaXhjYmk1dmRYUnNhVzVsTFdSeVlYZGxjbDlmWm05dmRHVnlJSHRjYmlBZ2NHRmtaR2x1WnpvZ01DQXhObkI0TzF4dWZWeHVMbTkxZEd4cGJtVXRaSEpoZDJWeVgxOW9aV0ZrWlhJc1hHNHViM1YwYkdsdVpTMWtjbUYzWlhKZlgzUnBkR3hsSUh0Y2JpQWdjRzl6YVhScGIyNDZJSEpsYkdGMGFYWmxPMXh1SUNCNkxXbHVaR1Y0T2lBeE8xeHVJQ0J0WVhKbmFXNDZJREFnWVhWMGJ6dGNiaUFnYUdWcFoyaDBPaUExTW5CNE8xeHVJQ0JzYVc1bExXaGxhV2RvZERvZ05USndlRHRjYmlBZ2IzWmxjbVpzYjNjNklHaHBaR1JsYmp0Y2JuMWNiaTV2ZFhSc2FXNWxMV1J5WVhkbGNsOWZkR2wwYkdVZ2UxeHVJQ0JtYjI1MExYTnBlbVU2SURFMmNIZzdYRzRnSUdadmJuUXRkMlZwWjJoME9pQTBNREE3WEc0Z0lHMWhjbWRwYmpvZ01DQXhObkI0TzF4dUlDQmliM2d0YzJsNmFXNW5PaUJpYjNKa1pYSXRZbTk0TzF4dUlDQmliM0prWlhJdFltOTBkRzl0T2lBeGNIZ2djMjlzYVdRZ0kyUmpaR1psTmp0Y2JuMWNiaTV2ZFhSc2FXNWxMV1J5WVhkbGNsOWZZMnh2YzJVZ2UxeHVJQ0J3YjNOcGRHbHZiam9nWVdKemIyeDFkR1U3WEc0Z0lIb3RhVzVrWlhnNklESTdYRzRnSUhSdmNEb2dOVEFsTzF4dUlDQnlhV2RvZERvZ01USndlRHRjYmlBZ2QybGtkR2c2SURJd2NIZzdYRzRnSUdobGFXZG9kRG9nTWpCd2VEdGNiaUFnYkdsdVpTMW9aV2xuYUhRNklESXdjSGc3WEc0Z0lHTnZiRzl5T2lBak9UazVPMXh1SUNCbWIyNTBMWE5wZW1VNklESXdjSGc3WEc0Z0lIUmxlSFF0WVd4cFoyNDZJR05sYm5SbGNqdGNiaUFnWTNWeWMyOXlPaUJ3YjJsdWRHVnlPMXh1SUNCMGNtRnVjMlp2Y20wNklIUnlZVzV6YkdGMFpWa29MVFV3SlNrN1hHNGdJRzkyWlhKbWJHOTNPaUJvYVdSa1pXNDdYRzU5WEc0dWIzVjBiR2x1WlMxa2NtRjNaWEpmWDJOc2IzTmxJQzV2ZFhSc2FXNWxMV2xqYjI0Z2UxeHVJQ0J3YjNOcGRHbHZiam9nWVdKemIyeDFkR1U3WEc0Z0lIb3RhVzVrWlhnNklESTdYRzRnSUhSdmNEb2dNRHRjYmlBZ2JHVm1kRG9nTUR0Y2JuMWNiaTV2ZFhSc2FXNWxMV1J5WVhkbGNsOWZZMnh2YzJVNmFHOTJaWElnZTF4dUlDQmpiMnh2Y2pvZ0l6WTJOanRjYm4xY2JpNXZkWFJzYVc1bExXUnlZWGRsY2w5ZmJXRnBiaUI3WEc0Z0lHWnNaWGc2SURFN1hHNGdJRzkyWlhKbWJHOTNPaUJoZFhSdk8xeHVmVnh1TG05MWRHeHBibVV0WkhKaGQyVnlYMTl0WVdsdUxtOTJaWEptYkc5M0xXaHBaR1JsYmlCN1hHNGdJRzkyWlhKbWJHOTNPaUJvYVdSa1pXNDdYRzU5WEc0dWIzVjBiR2x1WlMxa2NtRjNaWEpmWDJadmIzUmxjaUI3WEc0Z0lHMWhjbWRwYmpvZ01DQmhkWFJ2TzF4dUlDQjBaWGgwTFdGc2FXZHVPaUJ5YVdkb2REdGNiaUFnYjNabGNtWnNiM2M2SUdocFpHUmxianRjYm4xY2JpNXZkWFJzYVc1bExXUnlZWGRsY2w5ZmIzWmxjbXhoZVNCN1hHNGdJR052Ym5SbGJuUTZJQ2NuTzF4dUlDQndiM05wZEdsdmJqb2djbVZzWVhScGRtVTdYRzRnSUhvdGFXNWtaWGc2SURFN1hHNGdJSFJ2Y0RvZ01EdGNiaUFnYkdWbWREb2dNRHRjYmlBZ2QybGtkR2c2SURFd01DVTdYRzRnSUdobGFXZG9kRG9nTVRBd0pUdGNiaUFnWW1GamEyZHliM1Z1WkMxamIyeHZjam9nSTJabVpqdGNiaUFnYjNCaFkybDBlVG9nTUM0eE8xeHVJQ0J2ZG1WeVpteHZkem9nYUdsa1pHVnVPMXh1ZlZ4dUxtOTFkR3hwYm1VdFpISmhkMlZ5WDNKMGJDNXZkWFJzYVc1bExXUnlZWGRsY2w5MGFXNTVMRnh1TG05MWRHeHBibVV0WkhKaGQyVnlYMngwY2k1dmRYUnNhVzVsTFdSeVlYZGxjbDkwYVc1NUlIdGNiaUFnZDJsa2RHZzZJREk0TUhCNE8xeHVmVnh1TG05MWRHeHBibVV0WkhKaGQyVnlYM0owYkM1dmRYUnNhVzVsTFdSeVlYZGxjbDl0YVc1cExGeHVMbTkxZEd4cGJtVXRaSEpoZDJWeVgyeDBjaTV2ZFhSc2FXNWxMV1J5WVhkbGNsOXRhVzVwSUh0Y2JpQWdkMmxrZEdnNklEUTRNSEI0TzF4dWZWeHVMbTkxZEd4cGJtVXRaSEpoZDJWeVgzSjBiQzV2ZFhSc2FXNWxMV1J5WVhkbGNsOXpiV0ZzYkN4Y2JpNXZkWFJzYVc1bExXUnlZWGRsY2w5c2RISXViM1YwYkdsdVpTMWtjbUYzWlhKZmMyMWhiR3dnZTF4dUlDQjNhV1IwYURvZ05UUXdjSGc3WEc1OVhHNHViM1YwYkdsdVpTMWtjbUYzWlhKZmNuUnNMbTkxZEd4cGJtVXRaSEpoZDJWeVgzSmxaM1ZzWVhJc1hHNHViM1YwYkdsdVpTMWtjbUYzWlhKZmJIUnlMbTkxZEd4cGJtVXRaSEpoZDJWeVgzSmxaM1ZzWVhJZ2UxeHVJQ0IzYVdSMGFEb2dOamd3Y0hnN1hHNTlYRzR1YjNWMGJHbHVaUzFrY21GM1pYSmZjblJzTG05MWRHeHBibVV0WkhKaGQyVnlYMjFsWkdsMWJTeGNiaTV2ZFhSc2FXNWxMV1J5WVhkbGNsOXNkSEl1YjNWMGJHbHVaUzFrY21GM1pYSmZiV1ZrYVhWdElIdGNiaUFnZDJsa2RHZzZJRGN5TUhCNE8xeHVmVnh1TG05MWRHeHBibVV0WkhKaGQyVnlYM0owYkM1dmRYUnNhVzVsTFdSeVlYZGxjbDlzWVhKblpTeGNiaTV2ZFhSc2FXNWxMV1J5WVhkbGNsOXNkSEl1YjNWMGJHbHVaUzFrY21GM1pYSmZiR0Z5WjJVZ2UxeHVJQ0IzYVdSMGFEb2dPVFl3Y0hnN1hHNTlYRzR1YjNWMGJHbHVaUzFrY21GM1pYSmZjblJzSUh0Y2JpQWdZbTl5WkdWeUxXeGxablE2SURGd2VDQnpiMnhwWkNBalpHTmtabVUyTzF4dWZWeHVMbTkxZEd4cGJtVXRaSEpoZDJWeVgzSjBiQzV2ZFhSc2FXNWxMV1J5WVhkbGNsOTBhVzU1TG05MWRHeHBibVV0WkhKaGQyVnlYMk5zYjNObFpDQjdYRzRnSUhKcFoyaDBPaUF0TWprd2NIZzdYRzU5WEc0dWIzVjBiR2x1WlMxa2NtRjNaWEpmY25Sc0xtOTFkR3hwYm1VdFpISmhkMlZ5WDIxcGJta3ViM1YwYkdsdVpTMWtjbUYzWlhKZlkyeHZjMlZrSUh0Y2JpQWdjbWxuYUhRNklDMDBPVEJ3ZUR0Y2JuMWNiaTV2ZFhSc2FXNWxMV1J5WVhkbGNsOXlkR3d1YjNWMGJHbHVaUzFrY21GM1pYSmZjMjFoYkd3dWIzVjBiR2x1WlMxa2NtRjNaWEpmWTJ4dmMyVmtJSHRjYmlBZ2NtbG5hSFE2SUMwMU5UQndlRHRjYm4xY2JpNXZkWFJzYVc1bExXUnlZWGRsY2w5eWRHd3ViM1YwYkdsdVpTMWtjbUYzWlhKZmNtVm5kV3hoY2k1dmRYUnNhVzVsTFdSeVlYZGxjbDlqYkc5elpXUWdlMXh1SUNCeWFXZG9kRG9nTFRZNU1IQjRPMXh1ZlZ4dUxtOTFkR3hwYm1VdFpISmhkMlZ5WDNKMGJDNXZkWFJzYVc1bExXUnlZWGRsY2w5dFpXUnBkVzB1YjNWMGJHbHVaUzFrY21GM1pYSmZZMnh2YzJWa0lIdGNiaUFnY21sbmFIUTZJQzAzTXpCd2VEdGNibjFjYmk1dmRYUnNhVzVsTFdSeVlYZGxjbDl5ZEd3dWIzVjBiR2x1WlMxa2NtRjNaWEpmYkdGeVoyVXViM1YwYkdsdVpTMWtjbUYzWlhKZlkyeHZjMlZrSUh0Y2JpQWdjbWxuYUhRNklDMDVOekJ3ZUR0Y2JuMWNiaTV2ZFhSc2FXNWxMV1J5WVhkbGNsOXNkSElnZTF4dUlDQmliM0prWlhJdGNtbG5hSFE2SURGd2VDQnpiMnhwWkNBalpHTmtabVUyTzF4dWZWeHVMbTkxZEd4cGJtVXRaSEpoZDJWeVgyeDBjaTV2ZFhSc2FXNWxMV1J5WVhkbGNsOTBhVzU1TG05MWRHeHBibVV0WkhKaGQyVnlYMk5zYjNObFpDQjdYRzRnSUd4bFpuUTZJQzB5T1RCd2VEdGNibjFjYmk1dmRYUnNhVzVsTFdSeVlYZGxjbDlzZEhJdWIzVjBiR2x1WlMxa2NtRjNaWEpmYldsdWFTNXZkWFJzYVc1bExXUnlZWGRsY2w5amJHOXpaV1FnZTF4dUlDQnNaV1owT2lBdE5Ea3djSGc3WEc1OVhHNHViM1YwYkdsdVpTMWtjbUYzWlhKZmJIUnlMbTkxZEd4cGJtVXRaSEpoZDJWeVgzTnRZV3hzTG05MWRHeHBibVV0WkhKaGQyVnlYMk5zYjNObFpDQjdYRzRnSUd4bFpuUTZJQzAxTlRCd2VEdGNibjFjYmk1dmRYUnNhVzVsTFdSeVlYZGxjbDlzZEhJdWIzVjBiR2x1WlMxa2NtRjNaWEpmY21WbmRXeGhjaTV2ZFhSc2FXNWxMV1J5WVhkbGNsOWpiRzl6WldRZ2UxeHVJQ0JzWldaME9pQXROamt3Y0hnN1hHNTlYRzR1YjNWMGJHbHVaUzFrY21GM1pYSmZiSFJ5TG05MWRHeHBibVV0WkhKaGQyVnlYMjFsWkdsMWJTNXZkWFJzYVc1bExXUnlZWGRsY2w5amJHOXpaV1FnZTF4dUlDQnNaV1owT2lBdE56TXdjSGc3WEc1OVhHNHViM1YwYkdsdVpTMWtjbUYzWlhKZmJIUnlMbTkxZEd4cGJtVXRaSEpoZDJWeVgyeGhjbWRsTG05MWRHeHBibVV0WkhKaGQyVnlYMk5zYjNObFpDQjdYRzRnSUd4bFpuUTZJQzA1TnpCd2VEdGNibjFjYmk1dmRYUnNhVzVsTFdSeVlYZGxjbDkwZEdJc1hHNHViM1YwYkdsdVpTMWtjbUYzWlhKZlluUjBJSHRjYmlBZ2JHVm1kRG9nTUR0Y2JpQWdkMmxrZEdnNklERXdNQ1U3WEc1OVhHNHViM1YwYkdsdVpTMWtjbUYzWlhKZmRIUmlMbTkxZEd4cGJtVXRaSEpoZDJWeVgzUnBibmtzWEc0dWIzVjBiR2x1WlMxa2NtRjNaWEpmWW5SMExtOTFkR3hwYm1VdFpISmhkMlZ5WDNScGJua2dlMXh1SUNCb1pXbG5hSFE2SURJME1IQjRPMXh1ZlZ4dUxtOTFkR3hwYm1VdFpISmhkMlZ5WDNSMFlpNXZkWFJzYVc1bExXUnlZWGRsY2w5dGFXNXBMRnh1TG05MWRHeHBibVV0WkhKaGQyVnlYMkowZEM1dmRYUnNhVzVsTFdSeVlYZGxjbDl0YVc1cElIdGNiaUFnYUdWcFoyaDBPaUF6TWpCd2VEdGNibjFjYmk1dmRYUnNhVzVsTFdSeVlYZGxjbDkwZEdJdWIzVjBiR2x1WlMxa2NtRjNaWEpmYzIxaGJHd3NYRzR1YjNWMGJHbHVaUzFrY21GM1pYSmZZblIwTG05MWRHeHBibVV0WkhKaGQyVnlYM050WVd4c0lIdGNiaUFnYUdWcFoyaDBPaUF6TmpCd2VEdGNibjFjYmk1dmRYUnNhVzVsTFdSeVlYZGxjbDkwZEdJdWIzVjBiR2x1WlMxa2NtRjNaWEpmY21WbmRXeGhjaXhjYmk1dmRYUnNhVzVsTFdSeVlYZGxjbDlpZEhRdWIzVjBiR2x1WlMxa2NtRjNaWEpmY21WbmRXeGhjaUI3WEc0Z0lHaGxhV2RvZERvZ05EQXdjSGc3WEc1OVhHNHViM1YwYkdsdVpTMWtjbUYzWlhKZmRIUmlMbTkxZEd4cGJtVXRaSEpoZDJWeVgyMWxaR2wxYlN4Y2JpNXZkWFJzYVc1bExXUnlZWGRsY2w5aWRIUXViM1YwYkdsdVpTMWtjbUYzWlhKZmJXVmthWFZ0SUh0Y2JpQWdhR1ZwWjJoME9pQTBOREJ3ZUR0Y2JuMWNiaTV2ZFhSc2FXNWxMV1J5WVhkbGNsOTBkR0l1YjNWMGJHbHVaUzFrY21GM1pYSmZiR0Z5WjJVc1hHNHViM1YwYkdsdVpTMWtjbUYzWlhKZlluUjBMbTkxZEd4cGJtVXRaSEpoZDJWeVgyeGhjbWRsSUh0Y2JpQWdhR1ZwWjJoME9pQTBPREJ3ZUR0Y2JuMWNiaTV2ZFhSc2FXNWxMV1J5WVhkbGNsOTBkR0lnZTF4dUlDQmliM0prWlhJdFltOTBkRzl0T2lBeGNIZ2djMjlzYVdRZ0kyUmpaR1psTmp0Y2JuMWNiaTV2ZFhSc2FXNWxMV1J5WVhkbGNsOTBkR0l1YjNWMGJHbHVaUzFrY21GM1pYSmZkR2x1ZVM1dmRYUnNhVzVsTFdSeVlYZGxjbDlqYkc5elpXUWdlMXh1SUNCMGIzQTZJQzB5TlRCd2VEdGNibjFjYmk1dmRYUnNhVzVsTFdSeVlYZGxjbDkwZEdJdWIzVjBiR2x1WlMxa2NtRjNaWEpmYldsdWFTNXZkWFJzYVc1bExXUnlZWGRsY2w5amJHOXpaV1FnZTF4dUlDQjBiM0E2SUMwek16QndlRHRjYm4xY2JpNXZkWFJzYVc1bExXUnlZWGRsY2w5MGRHSXViM1YwYkdsdVpTMWtjbUYzWlhKZmMyMWhiR3d1YjNWMGJHbHVaUzFrY21GM1pYSmZZMnh2YzJWa0lIdGNiaUFnZEc5d09pQXRNemN3Y0hnN1hHNTlYRzR1YjNWMGJHbHVaUzFrY21GM1pYSmZkSFJpTG05MWRHeHBibVV0WkhKaGQyVnlYM0psWjNWc1lYSXViM1YwYkdsdVpTMWtjbUYzWlhKZlkyeHZjMlZrSUh0Y2JpQWdkRzl3T2lBdE5ERXdjSGc3WEc1OVhHNHViM1YwYkdsdVpTMWtjbUYzWlhKZmRIUmlMbTkxZEd4cGJtVXRaSEpoZDJWeVgyMWxaR2wxYlM1dmRYUnNhVzVsTFdSeVlYZGxjbDlqYkc5elpXUWdlMXh1SUNCMGIzQTZJQzAwTlRCd2VEdGNibjFjYmk1dmRYUnNhVzVsTFdSeVlYZGxjbDkwZEdJdWIzVjBiR2x1WlMxa2NtRjNaWEpmYkdGeVoyVXViM1YwYkdsdVpTMWtjbUYzWlhKZlkyeHZjMlZrSUh0Y2JpQWdkRzl3T2lBdE5Ea3djSGc3WEc1OVhHNHViM1YwYkdsdVpTMWtjbUYzWlhKZlluUjBJSHRjYmlBZ2RHOXdPaUJwYm1sMGFXRnNPMXh1SUNCaWIzSmtaWEl0ZEc5d09pQXhjSGdnYzI5c2FXUWdJMlJqWkdabE5qdGNibjFjYmk1dmRYUnNhVzVsTFdSeVlYZGxjbDlpZEhRdWIzVjBiR2x1WlMxa2NtRjNaWEpmZEdsdWVTNXZkWFJzYVc1bExXUnlZWGRsY2w5amJHOXpaV1FnZTF4dUlDQmliM1IwYjIwNklDMHlOVEJ3ZUR0Y2JuMWNiaTV2ZFhSc2FXNWxMV1J5WVhkbGNsOWlkSFF1YjNWMGJHbHVaUzFrY21GM1pYSmZiV2x1YVM1dmRYUnNhVzVsTFdSeVlYZGxjbDlqYkc5elpXUWdlMXh1SUNCaWIzUjBiMjA2SUMwek16QndlRHRjYm4xY2JpNXZkWFJzYVc1bExXUnlZWGRsY2w5aWRIUXViM1YwYkdsdVpTMWtjbUYzWlhKZmMyMWhiR3d1YjNWMGJHbHVaUzFrY21GM1pYSmZZMnh2YzJWa0lIdGNiaUFnWW05MGRHOXRPaUF0TXpjd2NIZzdYRzU5WEc0dWIzVjBiR2x1WlMxa2NtRjNaWEpmWW5SMExtOTFkR3hwYm1VdFpISmhkMlZ5WDNKbFozVnNZWEl1YjNWMGJHbHVaUzFrY21GM1pYSmZZMnh2YzJWa0lIdGNiaUFnWW05MGRHOXRPaUF0TkRFd2NIZzdYRzU5WEc0dWIzVjBiR2x1WlMxa2NtRjNaWEpmWW5SMExtOTFkR3hwYm1VdFpISmhkMlZ5WDIxbFpHbDFiUzV2ZFhSc2FXNWxMV1J5WVhkbGNsOWpiRzl6WldRZ2UxeHVJQ0JpYjNSMGIyMDZJQzAwTlRCd2VEdGNibjFjYmk1dmRYUnNhVzVsTFdSeVlYZGxjbDlpZEhRdWIzVjBiR2x1WlMxa2NtRjNaWEpmYkdGeVoyVXViM1YwYkdsdVpTMWtjbUYzWlhKZlkyeHZjMlZrSUh0Y2JpQWdZbTkwZEc5dE9pQXRORGt3Y0hnN1hHNTlYRzR1YjNWMGJHbHVaUzFrY21GM1pYSmZiM0JsYm1Wa0lIdGNiaUFnZG1semFXSnBiR2wwZVRvZ2RtbHphV0pzWlR0Y2JpQWdlaTFwYm1SbGVEb2dkbUZ5S0MwdGIzVjBiR2x1WlMxNlNXNWtaWGdwTzF4dWZWeHVMbTkxZEd4cGJtVXRaSEpoZDJWeVgyOXdaVzVsWkM1dmRYUnNhVzVsTFdSeVlYZGxjaUI3WEc0Z0lIQnZjMmwwYVc5dU9pQm1hWGhsWkR0Y2JuMWNiaTV2ZFhSc2FXNWxMV1J5WVhkbGNsOXZjR1Z1WldRdWIzVjBiR2x1WlMxa2NtRjNaWEpmY25Sc0lIdGNiaUFnY21sbmFIUTZJREE3WEc1OVhHNHViM1YwYkdsdVpTMWtjbUYzWlhKZmIzQmxibVZrTG05MWRHeHBibVV0WkhKaGQyVnlYMngwY2lCN1hHNGdJR3hsWm5RNklEQTdYRzU5WEc0dWIzVjBiR2x1WlMxa2NtRjNaWEpmYjNCbGJtVmtMbTkxZEd4cGJtVXRaSEpoZDJWeVgzUjBZaUI3WEc0Z0lIUnZjRG9nTUR0Y2JuMWNiaTV2ZFhSc2FXNWxMV1J5WVhkbGNsOXZjR1Z1WldRdWIzVjBiR2x1WlMxa2NtRjNaWEpmWW5SMElIdGNiaUFnWW05MGRHOXRPaUF3TzF4dWZWeHVMbTkxZEd4cGJtVXRaSEpoZDJWeVgyOW1abk5sZEM1dmRYUnNhVzVsTFdSeVlYZGxjbDl5ZEd3c1hHNHViM1YwYkdsdVpTMWtjbUYzWlhKZmIyWm1jMlYwTG05MWRHeHBibVV0WkhKaGQyVnlYMngwY2lCN1hHNGdJR2hsYVdkb2REb2dZMkZzWXlneE1EQWxJQzBnTkdWdEtUdGNiaUFnZEc5d09pQTFNQ1U3WEc0Z0lIUnlZVzV6Wm05eWJUb2dkSEpoYm5Oc1lYUmxXU2d0TlRBbEtUdGNibjFjYmk1dmRYUnNhVzVsTFdSeVlYZGxjbDl2Wm1aelpYUXViM1YwYkdsdVpTMWtjbUYzWlhKZmRIUmlMRnh1TG05MWRHeHBibVV0WkhKaGQyVnlYMjltWm5ObGRDNXZkWFJzYVc1bExXUnlZWGRsY2w5aWRIUWdlMXh1SUNCM2FXUjBhRG9nWTJGc1l5Z3hNREFsSUMwZ05HVnRLVHRjYmlBZ2JHVm1kRG9nTlRBbE8xeHVJQ0IwY21GdWMyWnZjbTA2SUhSeVlXNXpiR0YwWlZnb0xUVXdKU2s3WEc1OVhHNHViM1YwYkdsdVpTMWtjbUYzWlhKZmIyWm1jMlYwTG05MWRHeHBibVV0WkhKaGQyVnlYMjl3Wlc1bFpDNXZkWFJzYVc1bExXUnlZWGRsY2w5eWRHd2dlMXh1SUNCeWFXZG9kRG9nTW1WdE8xeHVmVnh1TG05MWRHeHBibVV0WkhKaGQyVnlYMjltWm5ObGRDNXZkWFJzYVc1bExXUnlZWGRsY2w5dmNHVnVaV1F1YjNWMGJHbHVaUzFrY21GM1pYSmZiSFJ5SUh0Y2JpQWdiR1ZtZERvZ01tVnRPMXh1ZlZ4dUxtOTFkR3hwYm1VdFpISmhkMlZ5WDI5bVpuTmxkQzV2ZFhSc2FXNWxMV1J5WVhkbGNsOXZjR1Z1WldRdWIzVjBiR2x1WlMxa2NtRjNaWEpmZEhSaUlIdGNiaUFnZEc5d09pQXlaVzA3WEc1OVhHNHViM1YwYkdsdVpTMWtjbUYzWlhKZmIyWm1jMlYwTG05MWRHeHBibVV0WkhKaGQyVnlYMjl3Wlc1bFpDNXZkWFJzYVc1bExXUnlZWGRsY2w5aWRIUWdlMXh1SUNCaWIzUjBiMjA2SURKbGJUdGNibjFjYmk1dmRYUnNhVzVsTFdSeVlYZGxjbDloZFhSdkxtOTFkR3hwYm1VdFpISmhkMlZ5WDNKMGJDeGNiaTV2ZFhSc2FXNWxMV1J5WVhkbGNsOWhkWFJ2TG05MWRHeHBibVV0WkhKaGQyVnlYMngwY2lCN1hHNGdJR2hsYVdkb2REb2dZWFYwYnp0Y2JpQWdiV0Y0TFdobGFXZG9kRG9nWTJGc1l5Z3hNREFsSUMwZ05HVnRLVHRjYm4xY2JpNXZkWFJzYVc1bExXUnlZWGRsY2w5bWRXeHNJSHRjYmlBZ2NHRmtaR2x1WnpvZ01EdGNibjFjYmk1dmRYUnNhVzVsTFc1aGRtbG5ZWFJ2Y2lCN1hHNGdJSEJ2YzJsMGFXOXVPaUJ5Wld4aGRHbDJaVHRjYmlBZ2VpMXBibVJsZURvZ01UdGNiaUFnYldGeVoybHVPaUF3TzF4dUlDQjNhV1IwYURvZ2RtRnlLQzB0YjNWMGJHbHVaUzF1WVhacFoyRjBiM0l0ZDJsa2RHZ3BPMXh1SUNCdmRtVnlabXh2ZHpvZ1lYVjBienRjYm4xY2JpNXZkWFJzYVc1bExXNWhkbWxuWVhSdmNpMXdZWEpsYm5RZ2UxeHVJQ0IwY21GdWMybDBhVzl1T2lBd0xqTnpJR1ZoYzJVdGFXNHRiM1YwTzF4dWZWeHVMbTkxZEd4cGJtVXRibUYyYVdkaGRHOXlYMTkwYVhSc1pTQjdYRzRnSUcxaGNtZHBiam9nTUNBeE5uQjRPMXh1SUNCb1pXbG5hSFE2SURRd2NIZzdYRzRnSUd4cGJtVXRhR1ZwWjJoME9pQTBNSEI0TzF4dUlDQndZV1JrYVc1bk9pQXdJREUyY0hnN1hHNGdJR0p2Y21SbGNpMWliM1IwYjIwNklERndlQ0J6YjJ4cFpDQWpaR05rWm1VMk8xeHVJQ0JtYjI1MExYTnBlbVU2SURFMmNIZzdYRzRnSUdadmJuUXRkMlZwWjJoME9pQTBNREE3WEc0Z0lHOTJaWEptYkc5M09pQm9hV1JrWlc0N1hHNTlYRzR1YjNWMGJHbHVaUzF1WVhacFoyRjBiM0pmWDIxaGFXNGdlMXh1SUNCd2IzTnBkR2x2YmpvZ2NtVnNZWFJwZG1VN1hHNGdJSG90YVc1a1pYZzZJREU3WEc0Z0lHMWhjbWRwYmpvZ01EdGNiaUFnYjNabGNtWnNiM2M2SUdocFpHUmxianRjYm4xY2JpNXZkWFJzYVc1bExXNWhkbWxuWVhSdmNsOWZiR2x6ZEN4Y2JpNXZkWFJzYVc1bExXNWhkbWxuWVhSdmNsOWZjM1ZpYW1WamRDeGNiaTV2ZFhSc2FXNWxMVzVoZG1sbllYUnZjbDlmYVhSbGJTQjdYRzRnSUhCdmMybDBhVzl1T2lCeVpXeGhkR2wyWlR0Y2JpQWdlaTFwYm1SbGVEb2dNanRjYmlBZ2JXRnlaMmx1T2lBd08xeHVJQ0J3WVdSa2FXNW5PaUF3TzF4dUlDQnNhWE4wTFhOMGVXeGxMWFI1Y0dVNklHNXZibVU3WEc0Z0lHOTJaWEptYkc5M09pQm9hV1JrWlc0N1hHNTlYRzR1YjNWMGJHbHVaUzF1WVhacFoyRjBiM0pmWDJ4cGMzUWdlMXh1SUNCd1lXUmthVzVuT2lBd0xqVmxiU0F3TzF4dWZWeHVMbTkxZEd4cGJtVXRibUYyYVdkaGRHOXlYMTl6ZFdKcVpXTjBJSHRjYmlBZ2NHRmtaR2x1Wnkxc1pXWjBPaUF4WlcwN1hHNTlYRzR1YjNWMGJHbHVaUzF1WVhacFoyRjBiM0pmWDJsMFpXMGdlMXh1SUNCdFlYSm5hVzQ2SURBN1hHNGdJR3hwYm1VdGFHVnBaMmgwT2lBek1IQjRPMXh1SUNCbWIyNTBMWE5wZW1VNklERXpjSGc3WEc0Z0lHOTJaWEptYkc5M09pQm9hV1JrWlc0N1hHNTlYRzR1YjNWMGJHbHVaUzF1WVhacFoyRjBiM0pmWDNCc1lXTmxhRzlzWkdWeUlIdGNiaUFnY0c5emFYUnBiMjQ2SUdGaWMyOXNkWFJsTzF4dUlDQjZMV2x1WkdWNE9pQXhPMXh1SUNCMGIzQTZJREE3WEc0Z0lHeGxablE2SURBN1hHNGdJSGRwWkhSb09pQXhNREFsTzF4dUlDQm9aV2xuYUhRNklETXdjSGc3WEc0Z0lHSmhZMnRuY205MWJtUXRZMjlzYjNJNklDTm1OMlk0WmprN1hHNGdJR0p2Y21SbGNpMXNaV1owT2lBeWNIZ2djMjlzYVdRZ0l6QTFPRGswTWp0Y2JpQWdkSEpoYm5OcGRHbHZiaTFrZFhKaGRHbHZiam9nTUM0eWN6dGNiaUFnWW05NExYTnBlbWx1WnpvZ1ltOXlaR1Z5TFdKdmVEdGNiaUFnYjNabGNtWnNiM2M2SUdocFpHUmxianRjYm4xY2JpNXZkWFJzYVc1bExXNWhkbWxuWVhSdmNsOWZZVzVqYUc5eUlIdGNiaUFnZDJocGRHVXRjM0JoWTJVNklHNXZkM0poY0R0Y2JpQWdkR1Y0ZEMxdmRtVnlabXh2ZHpvZ1pXeHNhWEJ6YVhNN1hHNGdJRzkyWlhKbWJHOTNPaUJvYVdSa1pXNDdYRzRnSUdScGMzQnNZWGs2SUdKc2IyTnJPMXh1SUNCd1lXUmthVzVuT2lBd0lERXVOV1Z0TzF4dWZWeHVMbTkxZEd4cGJtVXRibUYyYVdkaGRHOXlYMTloYm1Ob2IzSTZiR2x1YXl4Y2JpNXZkWFJzYVc1bExXNWhkbWxuWVhSdmNsOWZZVzVqYUc5eU9uWnBjMmwwWldRc1hHNHViM1YwYkdsdVpTMXVZWFpwWjJGMGIzSmZYMkZ1WTJodmNqcG9iM1psY2lCN1hHNGdJSFJsZUhRdFpHVmpiM0poZEdsdmJqb2dibTl1WlR0Y2JpQWdZMjlzYjNJNklDTTFOVFU3WEc1OVhHNHViM1YwYkdsdVpTMXVZWFpwWjJGMGIzSmZYMkZ1WTJodmNqcG9iM1psY2lCN1hHNGdJR052Ykc5eU9pQWpNRFU0T1RReU8xeHVmVnh1TG05MWRHeHBibVV0Ym1GMmFXZGhkRzl5WDE5amIyUmxJSHRjYmlBZ2NHRmtaR2x1WnkxeWFXZG9kRG9nTUM0MVpXMDdYRzU5WEc0dWIzVjBiR2x1WlMxdVlYWnBaMkYwYjNKZmFHbG5hR3hwWjJoMExtOTFkR3hwYm1VdGJtRjJhV2RoZEc5eVgxOWhibU5vYjNJNmJHbHVheXhjYmk1dmRYUnNhVzVsTFc1aGRtbG5ZWFJ2Y2w5b2FXZG9iR2xuYUhRdWIzVjBiR2x1WlMxdVlYWnBaMkYwYjNKZlgyRnVZMmh2Y2pwMmFYTnBkR1ZrTEZ4dUxtOTFkR3hwYm1VdGJtRjJhV2RoZEc5eVgyaHBaMmhzYVdkb2RDNXZkWFJzYVc1bExXNWhkbWxuWVhSdmNsOWZZVzVqYUc5eU9taHZkbVZ5SUh0Y2JpQWdZMjlzYjNJNklDTXdOVGc1TkRJN1hHNGdJR1p2Ym5RdGQyVnBaMmgwT2lCaWIyeGtPMXh1ZlZ4dUxtOTFkR3hwYm1VdGJtRjJhV2RoZEc5eVgzTjBhV05yZVN4Y2JpNXZkWFJzYVc1bExXNWhkbWxuWVhSdmNsOW1hWGhsWkNCN1hHNGdJR1JwYzNCc1lYazZJR1pzWlhnN1hHNGdJR1pzWlhndGQzSmhjRG9nYm05M2NtRndPMXh1SUNCbWJHVjRMV1JwY21WamRHbHZiam9nWTI5c2RXMXVPMXh1SUNCNkxXbHVaR1Y0T2lCMllYSW9MUzF2ZFhSc2FXNWxMWHBKYm1SbGVDazdYRzRnSUhSdmNEb2dNRHRjYmlBZ2IzWmxjbVpzYjNjNklHaHBaR1JsYmp0Y2JuMWNiaTV2ZFhSc2FXNWxMVzVoZG1sbllYUnZjbDl6ZEdsamEza2dMbTkxZEd4cGJtVXRibUYyYVdkaGRHOXlYMTkwYVhSc1pTeGNiaTV2ZFhSc2FXNWxMVzVoZG1sbllYUnZjbDltYVhobFpDQXViM1YwYkdsdVpTMXVZWFpwWjJGMGIzSmZYM1JwZEd4bExGeHVMbTkxZEd4cGJtVXRibUYyYVdkaGRHOXlYM04wYVdOcmVTQXViM1YwYkdsdVpTMXVZWFpwWjJGMGIzSmZYMjFoYVc0c1hHNHViM1YwYkdsdVpTMXVZWFpwWjJGMGIzSmZabWw0WldRZ0xtOTFkR3hwYm1VdGJtRjJhV2RoZEc5eVgxOXRZV2x1SUh0Y2JpQWdZbTk0TFhOcGVtbHVaem9nWW05eVpHVnlMV0p2ZUR0Y2JuMWNiaTV2ZFhSc2FXNWxMVzVoZG1sbllYUnZjbDl6ZEdsamEza2dMbTkxZEd4cGJtVXRibUYyYVdkaGRHOXlYMTkwYVhSc1pTeGNiaTV2ZFhSc2FXNWxMVzVoZG1sbllYUnZjbDltYVhobFpDQXViM1YwYkdsdVpTMXVZWFpwWjJGMGIzSmZYM1JwZEd4bElIdGNiaUFnWm14bGVDMXphSEpwYm1zNklEQTdYRzU5WEc0dWIzVjBiR2x1WlMxdVlYWnBaMkYwYjNKZmMzUnBZMnQ1SUM1dmRYUnNhVzVsTFc1aGRtbG5ZWFJ2Y2w5ZmJXRnBiaXhjYmk1dmRYUnNhVzVsTFc1aGRtbG5ZWFJ2Y2w5bWFYaGxaQ0F1YjNWMGJHbHVaUzF1WVhacFoyRjBiM0pmWDIxaGFXNGdlMXh1SUNCbWJHVjRPaUF4TzF4dUlDQnZkbVZ5Wm14dmR6b2dZWFYwYnp0Y2JuMWNiaTV2ZFhSc2FXNWxMVzVoZG1sbllYUnZjbDl6ZEdsamEza2dlMXh1SUNCd2IzTnBkR2x2YmpvZ2MzUnBZMnQ1TzF4dUlDQnRZWGd0YUdWcFoyaDBPaUIyWVhJb0xTMXZkWFJzYVc1bExYTjBhV05yZVMxb1pXbG5hSFFwTzF4dWZWeHVMbTkxZEd4cGJtVXRibUYyYVdkaGRHOXlYMlpwZUdWa0lIdGNiaUFnY0c5emFYUnBiMjQ2SUdacGVHVmtPMXh1SUNCdFlYZ3RhR1ZwWjJoME9pQXhNREFsTzF4dWZWeHVMbTkxZEd4cGJtVXRibUYyYVdkaGRHOXlYMmhwWkdSbGJpQjdYRzRnSUdScGMzQnNZWGs2SUc1dmJtVTdYRzU5WEc0dWIzVjBiR2x1WlMxdVlYWnBaMkYwYjNKZlptOXNaR1ZrSUh0Y2JpQWdkMmxrZEdnNklEQTdYRzRnSUc5MlpYSm1iRzkzT2lCb2FXUmtaVzQ3WEc1OVhHNHZLaXBjYmlBcUlHWnZiblF1YkdWemN5QXRJT1d0bCtTOWsrZWJ1T1dGcythZ3QrVzhqMXh1SUNvZ1BUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFZ4dUlDb2dRM0psWVhSbFpDQkNlVG9nV1dGdmFHRnBlR2xoYjF4dUlDb2dWWEJrWVhSbE9pQXlNREl5TGpNdU1UWmNiaUFxTDF4dUx5b2dQVDA5UFQwOUlPV3RsK1M5a3lBOVBUMDlQVDBnS2k5Y2JpOHFJRDA5UFQwOVBTRGxyWmZwaDQwZ1BUMDlQVDA5SUNvdlhHNHZLaUE5UFQwOVBUMGc1YTJYNVkrM0lEMDlQVDA5UFNBcUwxeHVMeW9xWEc0Z0tpQnRhWGhwYm5NdWJHVnpjeUF0SU9XM3BlV0Z0K1dIdmVhVnNGeHVJQ29nUFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVnh1SUNvZ1EzSmxZWFJsWkNCQ2VUb2dXV0Z2YUdGcGVHbGhiMXh1SUNvZ1ZYQmtZWFJsT2lBeU1ESXlMak11TVRGY2JpQXFMMXh1THlvcVhHNGdLaUJ5WVdScGRYTXViR1Z6Y3lBdElPV2NodWlua3VpdXZ1ZTlyaUJ0YVhocGJuZ2c1WWU5NXBXd1hHNGdLaUE5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlYRzRnS2lCRGNtVmhkR1ZrSUVKNU9pQlpZVzlvWVdsNGFXRnZYRzRnS2lCVmNHUmhkR1U2SURJd01qUXVOQzR4Tmx4dUlDb3ZYRzR2S2lBOVBUMDlQVDBnNVp5RzZLZVM1cUMzNWJ5UDZLNis1NzJ1NVllOTVwV3dJRDA5UFQwOVBTQXFMMXh1TG05MWRHeHBibVV0Y21WaFpHVnlYMTl3Y205bmNtVnpjeUI3WEc0Z0lIQnZjMmwwYVc5dU9pQm1hWGhsWkR0Y2JpQWdkRzl3T2lBd08xeHVJQ0JzWldaME9pQXdPMXh1SUNCNkxXbHVaR1Y0T2lBek8xeHVJQ0JvWldsbmFIUTZJRFJ3ZUR0Y2JpQWdkMmxrZEdnNklERXdNQ1U3WEc0Z0lHSmhZMnRuY205MWJtUXRZMjlzYjNJNklDTTFNRGRoWm1VN1hHNGdJSE5qWVd4bE9pQXdJREU3WEc0Z0lIUnlZVzV6Wm05eWJTMXZjbWxuYVc0NklHeGxablE3WEc0Z0lHRnVhVzFoZEdsdmJqb2diM1YwYkdsdVpTMXlaV0ZrWlhJdGNISnZaM0psYzNNZ2JHbHVaV0Z5TzF4dUlDQmhibWx0WVhScGIyNHRkR2x0Wld4cGJtVTZJQzB0VUhKdlozSmxjM05VYVcxbGJHbHVaVHRjYm4xY2JpNXZkWFJzYVc1bExYSmxZV1JsY2w5ZmNHRndaWElnZTF4dUlDQmliM2d0YzJoaFpHOTNPaUF3SURBZ05uQjRJREZ3ZUNBalpHUmtPMXh1SUNCdFlYSm5hVzQ2SURKbGJTQmhkWFJ2TzF4dUlDQnRZWGd0ZDJsa2RHZzZJREV5TURCd2VEdGNiaUFnY0dGa1pHbHVaem9nTXk0eVpXMDdYRzRnSUdKdmVDMXphWHBwYm1jNklHSnZjbVJsY2kxaWIzZzdYRzRnSUdKaFkydG5jbTkxYm1RdFkyOXNiM0k2SUNObVptWTdYRzRnSUc5MlpYSm1iRzkzT2lCb2FXUmtaVzQ3WEc1OVhHNHViM1YwYkdsdVpTMXlaV0ZrWlhKZlgzUnBkR3hsSUh0Y2JpQWdiV0Z5WjJsdU9pQXdMalkzWlcwZ01EdGNiaUFnZEdWNGRDMWhiR2xuYmpvZ1kyVnVkR1Z5TzF4dUlDQm1iMjUwTFdaaGJXbHNlVG9nTFdGd2NHeGxMWE41YzNSbGJTd2dRbXhwYm10TllXTlRlWE4wWlcxR2IyNTBMQ0FuVTJWbmIyVWdWVWtuTENBblVHbHVaMFpoYm1jZ1UwTW5MQ0FuU0dseVlXZHBibThnVTJGdWN5QkhRaWNzSUNkTmFXTnliM052Wm5RZ1dXRklaV2tuTENBblNHVnNkbVYwYVdOaElFNWxkV1VuTENBblFYQndiR1VnUTI5c2IzSWdSVzF2YW1rbkxDQW5VMlZuYjJVZ1ZVa2dSVzF2YW1rbkxDQW5VMlZuYjJVZ1ZVa2dVM2x0WW05c0p5d2dTR1ZzZG1WMGFXTmhMQ0JCY21saGJDd2djMkZ1Y3kxelpYSnBaanRjYmlBZ1ptOXVkQzEzWldsbmFIUTZJRzV2Y20xaGJEdGNiaUFnYkdsdVpTMW9aV2xuYUhRNklERXVNMlZ0TzF4dUlDQm1iMjUwTFhOcGVtVTZJRFF1TW1WdE8xeHVJQ0J2ZG1WeVpteHZkem9nYUdsa1pHVnVPMXh1ZlZ4dUxtOTFkR3hwYm1VdGNtVmhaR1Z5WDE5aGNuUnBZMnhsSUM1dmRYUnNhVzVsTFhKbFlXUmxjbDlmY0hKdlozSmxjM01nZTF4dUlDQmthWE53YkdGNU9pQnViMjVsTzF4dWZWeHVMbTkxZEd4cGJtVXRjbVZoWkdWeVgyaHBaR1JsYmlCN1hHNGdJR1JwYzNCc1lYazZJRzV2Ym1VN1hHNTlYRzR1YjNWMGJHbHVaUzF5WldGa1pYSmZhR2xrWkdWdUxtOTFkR3hwYm1VdGNtVmhaR1Z5WDNOcFlteHBibWNnZTF4dUlDQmthWE53YkdGNU9pQnViMjVsSUNGcGJYQnZjblJoYm5RN1hHNTlYRzR1YjNWMGJHbHVaUzF5WldGa1pYSmZhR2xrWkdWdUxtOTFkR3hwYm1VdGNtVmhaR1Z5WDNOcFlteHBibWN1ZDNKaGNIQmxjaTV3YjNOMElIdGNiaUFnWkdsemNHeGhlVG9nYm05dVpUdGNibjFjYmk1dmRYUnNhVzVsTFhKbFlXUmxjaTB0Y21WaFpHbHVaeUI3WEc0Z0lHUnBjM0JzWVhrNklHSnNiMk5yTzF4dUlDQndiM05wZEdsdmJqb2dabWw0WldRN1hHNGdJSG90YVc1a1pYZzZJREk3WEc0Z0lIUnZjRG9nTUR0Y2JpQWdiR1ZtZERvZ01EdGNiaUFnZDJsa2RHZzZJREV3TUNVN1hHNGdJR2hsYVdkb2REb2dNVEF3SlR0Y2JpQWdiV0Z5WjJsdU9pQXdPMXh1SUNCaWIzZ3RjMmw2YVc1bk9pQmliM0prWlhJdFltOTRPMXh1SUNCd1lXUmthVzVuT2lBelpXMGdOR1Z0TzF4dUlDQmlZV05yWjNKdmRXNWtMV052Ykc5eU9pQWpabUZtWVdaaE8xeHVJQ0J6WTNKdmJHd3RkR2x0Wld4cGJtVXRibUZ0WlRvZ0xTMVFjbTluY21WemMxUnBiV1ZzYVc1bE8xeHVJQ0J2ZG1WeVpteHZkem9nYzJOeWIyeHNPMXh1ZlZ4dVFHdGxlV1p5WVcxbGN5QnZkWFJzYVc1bExYSmxZV1JsY2kxd2NtOW5jbVZ6Y3lCN1hHNGdJSFJ2SUh0Y2JpQWdJQ0J6WTJGc1pUb2dNU0F4TzF4dUlDQjlYRzU5WEc1QWJXVmthV0VnS0cxaGVDMTNhV1IwYURvZ05UQXdjSGdwSUh0Y2JpQWdMbTkxZEd4cGJtVXRjbVZoWkdWeUlIdGNiaUFnSUNCdmRtVnlabXh2ZHpvZ2FHbGtaR1Z1TzF4dUlDQjlYRzRnSUM1dmRYUnNhVzVsTFhKbFlXUmxjaUF1YjNWMGJHbHVaUzEwYjI5c1ltRnlJSHRjYmlBZ0lDQmthWE53YkdGNU9pQm1iR1Y0TzF4dUlDQWdJR1pzWlhndFpHbHlaV04wYVc5dU9pQnliM2M3WEc0Z0lDQWdabXhsZUMxM2NtRndPaUJ1YjNkeVlYQTdYRzRnSUNBZ1lXeHBaMjR0YVhSbGJYTTZJR05sYm5SbGNqdGNiaUFnSUNCaGJHbG5iaTF6Wld4bU9pQmhkWFJ2TzF4dUlDQWdJSFJ2Y0RvZ01UQXdKVHRjYmlBZ0lDQnlhV2RvZERvZ01EdGNiaUFnSUNCMGNtRnVjMlp2Y20wNklIUnlZVzV6YkdGMFpWa29MVFE0Y0hncE8xeHVJQ0FnSUhkcFpIUm9PaUF4TURBbE8xeHVJQ0FnSUdobGFXZG9kRG9nTkRod2VEdGNiaUFnSUNCaWIzZ3RjMmw2YVc1bk9pQmliM0prWlhJdFltOTRPMXh1SUNBZ0lHSnZjbVJsY2kxMGIzQTZJREZ3ZUNCemIyeHBaQ0FqWkdSa08xeHVJQ0FnSUdKaFkydG5jbTkxYm1RdFkyOXNiM0k2SUNObVptWTdYRzRnSUNBZ2NHRmtaR2x1WnpvZ01DQXhObkI0TzF4dUlDQjlYRzRnSUM1dmRYUnNhVzVsTFhKbFlXUmxjaUF1YjNWMGJHbHVaUzEwYjI5c1ltRnlYMTlpZFhSMGIyNGdlMXh1SUNBZ0lHSnZjbVJsY2kxeVlXUnBkWE02SURBN1hHNGdJQ0FnWm14bGVEb2dNVHRjYmlBZ0lDQmliM0prWlhJNklHNXZibVU3WEc0Z0lDQWdZbTk0TFhOb1lXUnZkem9nYm05dVpUdGNiaUFnZlZ4dUlDQXViM1YwYkdsdVpTMXlaV0ZrWlhJdExYSmxZV1JwYm1jZ2UxeHVJQ0FnSUhCaFpHUnBibWM2SURBN1hHNGdJQ0FnWW1GamEyZHliM1Z1WkMxamIyeHZjam9nSTJabVpqdGNiaUFnSUNCaWIzZ3RjMmw2YVc1bk9pQmliM0prWlhJdFltOTRPMXh1SUNCOVhHNGdJQzV2ZFhSc2FXNWxMWEpsWVdSbGNsOWZjR0Z3WlhJZ2UxeHVJQ0FnSUhCdmMybDBhVzl1T2lCeVpXeGhkR2wyWlR0Y2JpQWdJQ0I2TFdsdVpHVjRPaUF4TzF4dUlDQWdJRzFoY21kcGJqb2dNRHRjYmlBZ0lDQndZV1JrYVc1bk9pQXdPMXh1SUNBZ0lHaGxhV2RvZERvZ01UQXdKVHRjYmlBZ0lDQmliM2d0YzJoaFpHOTNPaUJ1YjI1bE8xeHVJQ0FnSUc5MlpYSm1iRzkzT2lCb2FXUmtaVzQ3WEc0Z0lIMWNiaUFnTG05MWRHeHBibVV0Y21WaFpHVnlYMTkwYVhSc1pTQjdYRzRnSUNBZ2QyaHBkR1V0YzNCaFkyVTZJRzV2ZDNKaGNEdGNiaUFnSUNCMFpYaDBMVzkyWlhKbWJHOTNPaUJsYkd4cGNITnBjenRjYmlBZ0lDQndiM05wZEdsdmJqb2dZV0p6YjJ4MWRHVTdYRzRnSUNBZ2VpMXBibVJsZURvZ016dGNiaUFnSUNCMGIzQTZJREE3WEc0Z0lDQWdiR1ZtZERvZ01EdGNiaUFnSUNCdFlYSm5hVzQ2SURBN1hHNGdJQ0FnZDJsa2RHZzZJREV3TUNVN1hHNGdJQ0FnYUdWcFoyaDBPaUEwT0hCNE8xeHVJQ0FnSUd4cGJtVXRhR1ZwWjJoME9pQTBPSEI0TzF4dUlDQWdJR0p2Y21SbGNpMWliM1IwYjIwNklERndlQ0J6YjJ4cFpDQWpaR1JrTzF4dUlDQWdJR1p2Ym5RdGMybDZaVG9nTVM0NFpXMDdYRzRnSUNBZ1ptOXVkQzEzWldsbmFIUTZJRFF3TUR0Y2JpQWdJQ0JpWVdOclozSnZkVzVrTFdOdmJHOXlPaUFqWm1abU8xeHVJQ0FnSUc5MlpYSm1iRzkzT2lCb2FXUmtaVzQ3WEc0Z0lIMWNiaUFnTG05MWRHeHBibVV0Y21WaFpHVnlYMTloY25ScFkyeGxJSHRjYmlBZ0lDQnRZWEpuYVc0NklEUTRjSGdnTUR0Y2JpQWdJQ0JvWldsbmFIUTZJR05oYkdNb01UQXdKU0F0SURrMmNIZ3BPMXh1SUNBZ0lIQmhaR1JwYm1jNklEQWdNUzR5TldWdE8xeHVJQ0FnSUhOamNtOXNiQzEwYVcxbGJHbHVaUzF1WVcxbE9pQXRMVTF2WW1sc1pWQnliMmR5WlhOelZHbHRaV3hwYm1VN1hHNGdJQ0FnYjNabGNtWnNiM2N0ZURvZ2FHbGtaR1Z1TzF4dUlDQWdJRzkyWlhKbWJHOTNMWGs2SUhOamNtOXNiRHRjYmlBZ2ZWeHVJQ0F1YjNWMGJHbHVaUzF5WldGa1pYSmZYMkZ5ZEdsamJHVWdMbTkxZEd4cGJtVXRjbVZoWkdWeVgxOXdjbTluY21WemN5QjdYRzRnSUNBZ2VpMXBibVJsZURvZ05EdGNiaUFnSUNCaGJtbHRZWFJwYjI0NklHOTFkR3hwYm1VdGNtVmhaR1Z5TFhCeWIyZHlaWE56SUd4cGJtVmhjanRjYmlBZ0lDQmhibWx0WVhScGIyNHRkR2x0Wld4cGJtVTZJQzB0VFc5aWFXeGxVSEp2WjNKbGMzTlVhVzFsYkdsdVpUdGNiaUFnSUNCa2FYTndiR0Y1T2lCaWJHOWphenRjYmlBZ2ZWeHVmVnh1UUcxbFpHbGhJSEJ5YVc1MElIdGNiaUFnYUhSdGJDeGNiaUFnWW05a2VTQjdYRzRnSUNBZ0x5b2c1b21UNVkydzU1cUU1Wis2NTZHQTVhMlg1TDJUNWFTbjViQ1BJQ292WEc0Z0lDQWdabTl1ZEMxemFYcGxPaUF4TW5CME8xeHVJQ0FnSUM4cUlPYVl2dWVrdXVpdXZ1ZTlydWFXaCtXdGwrbWluT2lKc3VXU2pPaURqT2FacittaW5PaUpzaUFxTDF4dUlDQWdJR0poWTJ0bmNtOTFibVF0WTI5c2IzSTZJQ05tWm1ZN1hHNGdJQ0FnWTI5c2IzSTZJQ016TXpNN1hHNGdJQ0FnYUdWcFoyaDBPaUJwYm1sMGFXRnNJQ0ZwYlhCdmNuUmhiblE3WEc0Z0lIMWNiaUFnTHlvZzZLNis1NzJ1NlpPKzVvNmw1cUMzNWJ5UElDb3ZYRzRnSUdFNmJHbHVheXhjYmlBZ1lUcDJhWE5wZEdWa0xGeHVJQ0JoT21odmRtVnlJSHRjYmlBZ0lDQjBaWGgwTFdSbFkyOXlZWFJwYjI0NklIVnVaR1Z5YkdsdVpTQWhhVzF3YjNKMFlXNTBPMXh1SUNBZ0lHTnZiRzl5T2lBak5UQTNZV1psTzF4dUlDQjlYRzRnSUM4cUlPbWFrT2lYaitXcWt1UzlrK2FnaCtldHZpQXFMMXh1SUNCMmFXUmxieXhjYmlBZ1lYVmthVzhnZTF4dUlDQWdJR1JwYzNCc1lYazZJRzV2Ym1VZ0lXbHRjRzl5ZEdGdWREdGNiaUFnZlZ4dUlDQXZLaURub2E3a3Y1M29vYWptb0x6bG5Lam1pWlBsamJEbWw3Ym5tb1RvdnJubW9ZYmxrb3pscjducHZaRG1scm5sdkkvbXVJWG1tYkFnS2k5Y2JpQWdkR0ZpYkdVZ2UxeHVJQ0FnSUhkcFpIUm9PaUF4TURBbE8xeHVJQ0FnSUdKdmNtUmxjaTFqYjJ4c1lYQnpaVG9nWTI5c2JHRndjMlU3WEc0Z0lIMWNiaUFnZEdnc1hHNGdJSFJrSUh0Y2JpQWdJQ0JpYjNKa1pYSTZJREZ3ZUNCemIyeHBaQ0FqWkdOa1ptVTJPMXh1SUNBZ0lIQmhaR1JwYm1jNklEaHdlQ0F5TUhCNE8xeHVJQ0I5WEc0Z0lDNXZkWFJzYVc1bExXMWxjM05oWjJVc1hHNGdJQzV2ZFhSc2FXNWxMWFJ2YjJ4aVlYSWdlMXh1SUNBZ0lDOHFJT21ha09pWGorUzZodVczcGVXRnQrYWdqK1dTak9TL29lYUJyK2FQa09la3V1YWhoaUFxTDF4dUlDQWdJR1JwYzNCc1lYazZJRzV2Ym1VZ0lXbHRjRzl5ZEdGdWREdGNiaUFnZlZ4dUlDQXViM1YwYkdsdVpTMXlaV0ZrWlhJZ2UxeHVJQ0FnSUdScGMzQnNZWGs2SUdKc2IyTnJJQ0ZwYlhCdmNuUmhiblE3WEc0Z0lDQWdiM1psY21ac2IzYzZJR2hwWkdSbGJqdGNiaUFnSUNBdktpRGxqNWJtdG9qa3VvYm51NTNscjdubHJwcmt2WTBnS2k5Y2JpQWdJQ0F2S2lEcG1wRG9sNC9wbUlYb3I3dm92NXZsdXFibW5hRWdLaTljYmlBZ0lDQXZLaURtaVpQbGpiRG1sN2JrdUkzbW1MN25wTHJtcmFQbWxvY2dSRTlOSU9lYWhPbVl0T1c5c2VhVmlPYWVuQ0FxTDF4dUlDQWdJQzhxSU9hSmdPYWNpZWFXaCtlcm9PV0doZVd1dVNCRVQwMGc1NXU0NVlXejU1cUU2WUs3NWJHRjZJcUM1NEs1NllPOTZacVE2SmVQNUxxR0lDb3ZYRzRnSUgxY2JpQWdMbTkxZEd4cGJtVXRjbVZoWkdWeVgxOTBhWFJzWlNCN1hHNGdJQ0FnYldGeVoybHVPaUF4TXk0MGNIUWdNQ0F5T0hCMElDRnBiWEJ2Y25SaGJuUTdYRzRnSUNBZ2RHVjRkQzFoYkdsbmJqb2dZMlZ1ZEdWeUlDRnBiWEJ2Y25SaGJuUTdYRzRnSUNBZ1ptOXVkQzF6YVhwbE9pQXpNbkIwSUNGcGJYQnZjblJoYm5RN1hHNGdJSDFjYmlBZ0xtOTFkR3hwYm1VdGNtVmhaR1Z5TFMxeVpXRmthVzVuSUh0Y2JpQWdJQ0J3YjNOcGRHbHZiam9nY21Wc1lYUnBkbVVnSVdsdGNHOXlkR0Z1ZER0Y2JpQWdJQ0JvWldsbmFIUTZJR0YxZEc4Z0lXbHRjRzl5ZEdGdWREdGNiaUFnSUNCd1lXUmthVzVuT2lBd0lDRnBiWEJ2Y25SaGJuUTdYRzRnSUNBZ1ltRmphMmR5YjNWdVpDMWpiMnh2Y2pvZ0kyWm1aanRjYmlBZ0lDQnZkbVZ5Wm14dmR6b2dhR2xrWkdWdUlDRnBiWEJ2Y25SaGJuUTdYRzRnSUgxY2JpQWdMbTkxZEd4cGJtVXRjbVZoWkdWeVgxOXdjbTluY21WemN5QjdYRzRnSUNBZ1pHbHpjR3hoZVRvZ2JtOXVaU0FoYVcxd2IzSjBZVzUwTzF4dUlDQjlYRzRnSUM1dmRYUnNhVzVsTFhKbFlXUmxjbDlmY0dGd1pYSWdlMXh1SUNBZ0lHSnZlQzF6YUdGa2IzYzZJRzV2Ym1VN1hHNGdJSDFjYmlBZ0xtOTFkR3hwYm1VdGNtVmhaR1Z5SUhCeVpTQjdYRzRnSUNBZ2NHRmtaR2x1WnpvZ01XVnRJQ0ZwYlhCdmNuUmhiblE3WEc0Z0lDQWdZbTl5WkdWeU9pQXhjSGdnYzI5c2FXUWdJMlJrWkNBaGFXMXdiM0owWVc1ME8xeHVJQ0FnSUdKdmNtUmxjaTF5WVdScGRYTTZJRFJ3ZUNBaGFXMXdiM0owWVc1ME8xeHVJQ0I5WEc0Z0lDNXZkWFJzYVc1bExYSmxZV1JsY2lCd2NtVXNYRzRnSUM1dmRYUnNhVzVsTFhKbFlXUmxjaUJqYjJSbElIdGNiaUFnSUNCaVlXTnJaM0p2ZFc1a0xXTnZiRzl5T2lBalptWm1JQ0ZwYlhCdmNuUmhiblE3WEc0Z0lIMWNiaUFnTG05MWRHeHBibVV0Y21WaFpHVnlJSFJoWW14bExGeHVJQ0F1YjNWMGJHbHVaUzF5WldGa1pYSWdhVzFuTEZ4dUlDQXViM1YwYkdsdVpTMXlaV0ZrWlhJZ2MzWm5JSHRjYmlBZ0lDQmljbVZoYXkxcGJuTnBaR1U2SUdGMmIybGtPMXh1SUNCOVhHNGdJQzV2ZFhSc2FXNWxMWEpsWVdSbGNsOXphV0pzYVc1bklIdGNiaUFnSUNCa2FYTndiR0Y1T2lCdWIyNWxJQ0ZwYlhCdmNuUmhiblE3WEc0Z0lIMWNibjFjYmk1dmRYUnNhVzVsTFhSdmIyeGlZWElnZTF4dUlDQndiM05wZEdsdmJqb2dabWw0WldRN1hHNGdJSG90YVc1a1pYZzZJRGs1T1RrNU8xeHVJQ0J0WVhKbmFXNDZJREE3WEc0Z0lIUnlZVzV6YVhScGIyNHRaSFZ5WVhScGIyNDZJREF1TTNNN1hHNGdJRzkyWlhKbWJHOTNPaUJvYVdSa1pXNDdYRzU5WEc0dWIzVjBiR2x1WlMxMGIyOXNZbUZ5WDE5aWRYUjBiMjRnZTF4dUlDQmliM2d0YzJoaFpHOTNPaUF3SURBZ05uQjRJREZ3ZUNBalpHTmtabVUyTzF4dUlDQndiM05wZEdsdmJqb2djbVZzWVhScGRtVTdYRzRnSUhvdGFXNWtaWGc2SURFN1hHNGdJRzFoY21kcGJqb2dNVEJ3ZUR0Y2JpQWdkMmxrZEdnNklETTJjSGc3WEc0Z0lHaGxhV2RvZERvZ016WndlRHRjYmlBZ1ltOXlaR1Z5T2lBeGNIZ2djMjlzYVdRZ0kyUmpaR1psTmp0Y2JpQWdZbTl5WkdWeUxYSmhaR2wxY3pvZ00zQjRPMXh1SUNCaWIzZ3RjMmw2YVc1bk9pQmliM0prWlhJdFltOTRPMXh1SUNCaVlXTnJaM0p2ZFc1a0xXTnZiRzl5T2lBalptWm1PMXh1SUNCamRYSnpiM0k2SUhCdmFXNTBaWEk3WEc0Z0lIUmxlSFF0WVd4cFoyNDZJR05sYm5SbGNqdGNiaUFnWTI5c2IzSTZJQ001T1RrN1hHNGdJSFJ5WVc1emFYUnBiMjQ2SUdGc2JDQXdMak56SURBdU1YTWdaV0Z6WlMxcGJpMXZkWFE3WEc0Z0lHOTJaWEptYkc5M09pQm9hV1JrWlc0N1hHNTlYRzR1YjNWMGJHbHVaUzEwYjI5c1ltRnlYMTlpZFhSMGIyNDZhRzkyWlhJZ2UxeHVJQ0JqYjJ4dmNqb2dJekExT0RrME1qdGNiaUFnWW05eVpHVnlMV052Ykc5eU9pQWpNRFU0T1RReU8xeHVJQ0IwY21GdWMyWnZjbTA2SUhOallXeGxLREV1TXpVcE8xeHVmVnh1TG05MWRHeHBibVV0ZEc5dmJHSmhjbDlmWW5WMGRHOXVMbWhwWkdVZ2UxeHVJQ0JrYVhOd2JHRjVPaUJ1YjI1bE8xeHVmVnh1TG05MWRHeHBibVV0ZEc5dmJHSmhjbDlmWVc1amFHOXlPbXhwYm1zc1hHNHViM1YwYkdsdVpTMTBiMjlzWW1GeVgxOWhibU5vYjNJNmRtbHphWFJsWkN4Y2JpNXZkWFJzYVc1bExYUnZiMnhpWVhKZlgyRnVZMmh2Y2pwb2IzWmxjaUI3WEc0Z0lHTnZiRzl5T2lBak9UazVPMXh1SUNCMFpYaDBMV1JsWTI5eVlYUnBiMjQ2SUc1dmJtVTdYRzU5WEc0dWIzVjBiR2x1WlMxMGIyOXNZbUZ5WDE5aGJtTm9iM0k2YUc5MlpYSWdlMXh1SUNCamIyeHZjam9nSXpBMU9EazBNanRjYm4xY2JpNXZkWFJzYVc1bExYUnZiMnhpWVhKZlgybGpiMjRnZTF4dUlDQndiM05wZEdsdmJqb2dZV0p6YjJ4MWRHVTdYRzRnSUhvdGFXNWtaWGc2SURJN1hHNGdJSFJ2Y0RvZ05UQWxPMXh1SUNCc1pXWjBPaUExTUNVN1hHNGdJSGRwWkhSb09pQXlNSEI0TzF4dUlDQm9aV2xuYUhRNklESXdjSGc3WEc0Z0lIUnlZVzV6Wm05eWJUb2dkSEpoYm5Oc1lYUmxLQzAxTUNVc0lDMDFNQ1VwTzF4dUlDQm1hV3hzT2lCamRYSnlaVzUwWTI5c2IzSTdYRzRnSUc5MlpYSm1iRzkzT2lCb2FXUmtaVzQ3WEc1OVhHNHViM1YwYkdsdVpTMTBiMjlzWW1GeVgyRmpkR2wyWlM1dmRYUnNhVzVsTFhSdmIyeGlZWEpmWDJKMWRIUnZiaUI3WEc0Z0lHTnZiRzl5T2lBalptWm1PMXh1SUNCaVlXTnJaM0p2ZFc1a0xXTnZiRzl5T2lBak1EVTRPVFF5TzF4dUlDQmliM0prWlhJdFkyOXNiM0k2SUNNd05UZzVOREk3WEc1OVhHNHViM1YwYkdsdVpTMTBiMjlzWW1GeVgyRmpkR2wyWlM1dmRYUnNhVzVsTFhSdmIyeGlZWEpmWDJKMWRIUnZianBvYjNabGNpQjdYRzRnSUdOdmJHOXlPaUFqWm1abU8xeHVmVnh1TG05MWRHeHBibVV0ZEc5dmJHSmhjbDloWTNScGRtVWdMbTkxZEd4cGJtVXRkRzl2YkdKaGNsOWZZVzVqYUc5eU9teHBibXNzWEc0dWIzVjBiR2x1WlMxMGIyOXNZbUZ5WDJGamRHbDJaU0F1YjNWMGJHbHVaUzEwYjI5c1ltRnlYMTloYm1Ob2IzSTZkbWx6YVhSbFpDeGNiaTV2ZFhSc2FXNWxMWFJ2YjJ4aVlYSmZZV04wYVhabElDNXZkWFJzYVc1bExYUnZiMnhpWVhKZlgyRnVZMmh2Y2pwb2IzWmxjaUI3WEc0Z0lHTnZiRzl5T2lBalptWm1PMXh1ZlZ4dUxtOTFkR3hwYm1VdGRHOXZiR0poY2w5eWIzVnVaR1ZrTG05MWRHeHBibVV0ZEc5dmJHSmhjbDlmWW5WMGRHOXVJSHRjYmlBZ1ltOXlaR1Z5TFhKaFpHbDFjem9nTVRod2VEdGNibjFjYmk1dmRYUnNhVzVsTFhSdmIyeGlZWEpmWkdsellXSnNaV1F1YjNWMGJHbHVaUzEwYjI5c1ltRnlYMTloYm1Ob2IzSTZiR2x1YXl4Y2JpNXZkWFJzYVc1bExYUnZiMnhpWVhKZlpHbHpZV0pzWldRZ0xtOTFkR3hwYm1VdGRHOXZiR0poY2w5ZllXNWphRzl5T214cGJtc3NYRzR1YjNWMGJHbHVaUzEwYjI5c1ltRnlYMlJwYzJGaWJHVmtMbTkxZEd4cGJtVXRkRzl2YkdKaGNsOWZZVzVqYUc5eU9uWnBjMmwwWldRc1hHNHViM1YwYkdsdVpTMTBiMjlzWW1GeVgyUnBjMkZpYkdWa0lDNXZkWFJzYVc1bExYUnZiMnhpWVhKZlgyRnVZMmh2Y2pwMmFYTnBkR1ZrTEZ4dUxtOTFkR3hwYm1VdGRHOXZiR0poY2w5a2FYTmhZbXhsWkM1dmRYUnNhVzVsTFhSdmIyeGlZWEpmWDJGdVkyaHZjanBvYjNabGNpeGNiaTV2ZFhSc2FXNWxMWFJ2YjJ4aVlYSmZaR2x6WVdKc1pXUWdMbTkxZEd4cGJtVXRkRzl2YkdKaGNsOWZZVzVqYUc5eU9taHZkbVZ5TEZ4dUxtOTFkR3hwYm1VdGRHOXZiR0poY2w5a2FYTmhZbXhsWkM1dmRYUnNhVzVsTFhSdmIyeGlZWEpmWDJKMWRIUnZiaXhjYmk1dmRYUnNhVzVsTFhSdmIyeGlZWEpmWkdsellXSnNaV1FnTG05MWRHeHBibVV0ZEc5dmJHSmhjbDlmWW5WMGRHOXVJSHRjYmlBZ1kzVnljMjl5T2lCdWIzUXRZV3hzYjNkbFpEdGNiaUFnWTI5c2IzSTZJQ001T1RrN1hHNGdJR0p2Y21SbGNpMWpiMnh2Y2pvZ0l6azVPVHRjYm4xY2JpNXZkWFJzYVc1bExYUnZiMnhpWVhKZlpHbHpZV0pzWldRdWIzVjBiR2x1WlMxMGIyOXNZbUZ5WDE5aGJtTm9iM0k2YkdsdWF6cG9iM1psY2l4Y2JpNXZkWFJzYVc1bExYUnZiMnhpWVhKZlpHbHpZV0pzWldRZ0xtOTFkR3hwYm1VdGRHOXZiR0poY2w5ZllXNWphRzl5T214cGJtczZhRzkyWlhJc1hHNHViM1YwYkdsdVpTMTBiMjlzWW1GeVgyUnBjMkZpYkdWa0xtOTFkR3hwYm1VdGRHOXZiR0poY2w5ZllXNWphRzl5T25acGMybDBaV1E2YUc5MlpYSXNYRzR1YjNWMGJHbHVaUzEwYjI5c1ltRnlYMlJwYzJGaWJHVmtJQzV2ZFhSc2FXNWxMWFJ2YjJ4aVlYSmZYMkZ1WTJodmNqcDJhWE5wZEdWa09taHZkbVZ5TEZ4dUxtOTFkR3hwYm1VdGRHOXZiR0poY2w5a2FYTmhZbXhsWkM1dmRYUnNhVzVsTFhSdmIyeGlZWEpmWDJGdVkyaHZjanBvYjNabGNqcG9iM1psY2l4Y2JpNXZkWFJzYVc1bExYUnZiMnhpWVhKZlpHbHpZV0pzWldRZ0xtOTFkR3hwYm1VdGRHOXZiR0poY2w5ZllXNWphRzl5T21odmRtVnlPbWh2ZG1WeUxGeHVMbTkxZEd4cGJtVXRkRzl2YkdKaGNsOWthWE5oWW14bFpDNXZkWFJzYVc1bExYUnZiMnhpWVhKZlgySjFkSFJ2Ympwb2IzWmxjaXhjYmk1dmRYUnNhVzVsTFhSdmIyeGlZWEpmWkdsellXSnNaV1FnTG05MWRHeHBibVV0ZEc5dmJHSmhjbDlmWW5WMGRHOXVPbWh2ZG1WeUlIdGNiaUFnWTI5c2IzSTZJQ001T1RrN1hHNGdJR0p2Y21SbGNpMWpiMnh2Y2pvZ0l6azVPVHRjYm4xY2JpNXZkWFJzYVc1bExYUnZiMnhpWVhKZlpHbHpZV0pzWldRdWIzVjBiR2x1WlMxMGIyOXNZbUZ5WDE5aWRYUjBiMjRzWEc0dWIzVjBiR2x1WlMxMGIyOXNZbUZ5WDJScGMyRmliR1ZrSUM1dmRYUnNhVzVsTFhSdmIyeGlZWEpmWDJKMWRIUnZiaUI3WEc0Z0lHSmhZMnRuY205MWJtUXRZMjlzYjNJNklDTm1OV1kxWmpVN1hHNTlYRzR1YjNWMGJHbHVaUzEwYjI5c1ltRnlYM1IwWWl4Y2JpNXZkWFJzYVc1bExYUnZiMnhpWVhKZlluUjBJSHRjYmlBZ2JHVm1kRG9nTlRBbE8xeHVJQ0IwY21GdWMyWnZjbTA2SUhSeVlXNXpiR0YwWlZnb0xUVXdKU2s3WEc1OVhHNHViM1YwYkdsdVpTMTBiMjlzWW1GeVgzUjBZaUF1YjNWMGJHbHVaUzEwYjI5c1ltRnlYMTlpZFhSMGIyNHNYRzR1YjNWMGJHbHVaUzEwYjI5c1ltRnlYMkowZENBdWIzVjBiR2x1WlMxMGIyOXNZbUZ5WDE5aWRYUjBiMjRnZTF4dUlDQmthWE53YkdGNU9pQnBibXhwYm1VdFlteHZZMnM3WEc1OVhHNHViM1YwYkdsdVpTMTBiMjlzWW1GeVgzUjBZaUI3WEc0Z0lIUnZjRG9nTVRKd2VEdGNibjFjYmk1dmRYUnNhVzVsTFhSdmIyeGlZWEpmZEhSaUxtOTFkR3hwYm1VdGRHOXZiR0poY2w5b2FXUmtaVzRnZTF4dUlDQjBiM0E2SUMwMU5uQjRPMXh1ZlZ4dUxtOTFkR3hwYm1VdGRHOXZiR0poY2w5aWRIUWdlMXh1SUNCaWIzUjBiMjA2SURFeWNIZzdYRzU5WEc0dWIzVjBiR2x1WlMxMGIyOXNZbUZ5WDJKMGRDNXZkWFJzYVc1bExYUnZiMnhpWVhKZmFHbGtaR1Z1SUh0Y2JpQWdZbTkwZEc5dE9pQXROVFp3ZUR0Y2JuMWNiaTV2ZFhSc2FXNWxMWFJ2YjJ4aVlYSmZjblJzTEZ4dUxtOTFkR3hwYm1VdGRHOXZiR0poY2w5c2RISWdlMXh1SUNCMGNtRnVjMlp2Y20wNklIUnlZVzV6YkdGMFpWa29MVFV3SlNrN1hHNGdJSGRwWkhSb09pQTFObkI0TzF4dWZWeHVMbTkxZEd4cGJtVXRkRzl2YkdKaGNsOXlkR3dnZTF4dUlDQjBiM0E2SURVd0pUdGNiaUFnY21sbmFIUTZJREV5Y0hnN1hHNTlYRzR1YjNWMGJHbHVaUzEwYjI5c1ltRnlYM0owYkM1dmRYUnNhVzVsTFhSdmIyeGlZWEpmYUdsa1pHVnVJSHRjYmlBZ2NtbG5hSFE2SUMwNE5uQjRPMXh1ZlZ4dUxtOTFkR3hwYm1VdGRHOXZiR0poY2w5c2RISWdlMXh1SUNCMGIzQTZJRFV3SlR0Y2JpQWdiR1ZtZERvZ01USndlRHRjYm4xY2JpNXZkWFJzYVc1bExYUnZiMnhpWVhKZmJIUnlMbTkxZEd4cGJtVXRkRzl2YkdKaGNsOW9hV1JrWlc0Z2UxeHVJQ0JzWldaME9pQXRPRFp3ZUR0Y2JuMWNiaTV2ZFhSc2FXNWxMWFJ2YjJ4aVlYSmZkSFJpSUM1dmRYUnNhVzVsTFhSdmIyeGlZWEpmWDJKMWRIUnZiaTV2ZFhSc2FXNWxMWFJ2YjJ4aVlYSmZhR2xrWkdWdUxGeHVMbTkxZEd4cGJtVXRkRzl2YkdKaGNsOXlkR3dnTG05MWRHeHBibVV0ZEc5dmJHSmhjbDlmWW5WMGRHOXVMbTkxZEd4cGJtVXRkRzl2YkdKaGNsOW9hV1JrWlc0c1hHNHViM1YwYkdsdVpTMTBiMjlzWW1GeVgySjBkQ0F1YjNWMGJHbHVaUzEwYjI5c1ltRnlYMTlpZFhSMGIyNHViM1YwYkdsdVpTMTBiMjlzWW1GeVgyaHBaR1JsYml4Y2JpNXZkWFJzYVc1bExYUnZiMnhpWVhKZmJIUnlJQzV2ZFhSc2FXNWxMWFJ2YjJ4aVlYSmZYMkoxZEhSdmJpNXZkWFJzYVc1bExYUnZiMnhpWVhKZmFHbGtaR1Z1SUh0Y2JpQWdaR2x6Y0d4aGVUb2dibTl1WlR0Y2JuMWNiaUlzSWk4cUlTQnViM0p0WVd4cGVtVXVZM056SUhZNExqQXVNU0I4SUUxSlZDQk1hV05sYm5ObElId2daMmwwYUhWaUxtTnZiUzl1WldOdmJHRnpMMjV2Y20xaGJHbDZaUzVqYzNNZ0tpOWNjbHh1WEhKY2JpOHFJRVJ2WTNWdFpXNTBYSEpjYmlBZ0lEMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlJQ292WEhKY2JseHlYRzR2S2lwY2NseHVJQ29nTVM0Z1EyOXljbVZqZENCMGFHVWdiR2x1WlNCb1pXbG5hSFFnYVc0Z1lXeHNJR0p5YjNkelpYSnpMbHh5WEc0Z0tpQXlMaUJRY21WMlpXNTBJR0ZrYW5WemRHMWxiblJ6SUc5bUlHWnZiblFnYzJsNlpTQmhablJsY2lCdmNtbGxiblJoZEdsdmJpQmphR0Z1WjJWeklHbHVJR2xQVXk1Y2NseHVJQ292WEhKY2JseHlYRzVvZEcxc0lIdGNjbHh1SUNCc2FXNWxMV2hsYVdkb2REb2dNUzR4TlRzZ0x5b2dNU0FxTDF4eVhHNGdJQzEzWldKcmFYUXRkR1Y0ZEMxemFYcGxMV0ZrYW5WemREb2dNVEF3SlRzZ0x5b2dNaUFxTDF4eVhHNTlYSEpjYmx4eVhHNHZLaUJUWldOMGFXOXVjMXh5WEc0Z0lDQTlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQU0FxTDF4eVhHNWNjbHh1THlvcVhISmNiaUFxSUZKbGJXOTJaU0IwYUdVZ2JXRnlaMmx1SUdsdUlHRnNiQ0JpY205M2MyVnljeTVjY2x4dUlDb3ZYSEpjYmx4eVhHNWliMlI1SUh0Y2NseHVJQ0J0WVhKbmFXNDZJREE3WEhKY2JuMWNjbHh1WEhKY2JpOHFLbHh5WEc0Z0tpQlNaVzVrWlhJZ2RHaGxJR0J0WVdsdVlDQmxiR1Z0Wlc1MElHTnZibk5wYzNSbGJuUnNlU0JwYmlCSlJTNWNjbHh1SUNvdlhISmNibHh5WEc1dFlXbHVJSHRjY2x4dUlDQmthWE53YkdGNU9pQmliRzlqYXp0Y2NseHVmVnh5WEc1Y2NseHVMeW9xWEhKY2JpQXFJRU52Y25KbFkzUWdkR2hsSUdadmJuUWdjMmw2WlNCaGJtUWdiV0Z5WjJsdUlHOXVJR0JvTVdBZ1pXeGxiV1Z1ZEhNZ2QybDBhR2x1SUdCelpXTjBhVzl1WUNCaGJtUmNjbHh1SUNvZ1lHRnlkR2xqYkdWZ0lHTnZiblJsZUhSeklHbHVJRU5vY205dFpTd2dSbWx5WldadmVDd2dZVzVrSUZOaFptRnlhUzVjY2x4dUlDb3ZYSEpjYmx4eVhHNW9NU0I3WEhKY2JpQWdabTl1ZEMxemFYcGxPaUF5WlcwN1hISmNiaUFnYldGeVoybHVPaUF3TGpZM1pXMGdNRHRjY2x4dWZWeHlYRzVjY2x4dUx5b2dSM0p2ZFhCcGJtY2dZMjl1ZEdWdWRGeHlYRzRnSUNBOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBTQXFMMXh5WEc1Y2NseHVMeW9xWEhKY2JpQXFJREV1SUVGa1pDQjBhR1VnWTI5eWNtVmpkQ0JpYjNnZ2MybDZhVzVuSUdsdUlFWnBjbVZtYjNndVhISmNiaUFxSURJdUlGTm9iM2NnZEdobElHOTJaWEptYkc5M0lHbHVJRVZrWjJVZ1lXNWtJRWxGTGx4eVhHNGdLaTljY2x4dVhISmNibWh5SUh0Y2NseHVJQ0JpYjNndGMybDZhVzVuT2lCamIyNTBaVzUwTFdKdmVEc2dMeW9nTVNBcUwxeHlYRzRnSUdobGFXZG9kRG9nTURzZ0x5b2dNU0FxTDF4eVhHNGdJRzkyWlhKbWJHOTNPaUIyYVhOcFlteGxPeUF2S2lBeUlDb3ZYSEpjYm4xY2NseHVYSEpjYmk4cUtseHlYRzRnS2lBeExpQkRiM0p5WldOMElIUm9aU0JwYm1obGNtbDBZVzVqWlNCaGJtUWdjMk5oYkdsdVp5QnZaaUJtYjI1MElITnBlbVVnYVc0Z1lXeHNJR0p5YjNkelpYSnpMbHh5WEc0Z0tpQXlMaUJEYjNKeVpXTjBJSFJvWlNCdlpHUWdZR1Z0WUNCbWIyNTBJSE5wZW1sdVp5QnBiaUJoYkd3Z1luSnZkM05sY25NdVhISmNiaUFxTDF4eVhHNWNjbHh1Y0hKbElIdGNjbHh1SUNCbWIyNTBMV1poYldsc2VUb2diVzl1YjNOd1lXTmxMQ0J0YjI1dmMzQmhZMlU3SUM4cUlERWdLaTljY2x4dUlDQm1iMjUwTFhOcGVtVTZJREZsYlRzZ0x5b2dNaUFxTDF4eVhHNTlYSEpjYmx4eVhHNHZLaUJVWlhoMExXeGxkbVZzSUhObGJXRnVkR2xqYzF4eVhHNGdJQ0E5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFNBcUwxeHlYRzVjY2x4dUx5b3FYSEpjYmlBcUlGSmxiVzkyWlNCMGFHVWdaM0poZVNCaVlXTnJaM0p2ZFc1a0lHOXVJR0ZqZEdsMlpTQnNhVzVyY3lCcGJpQkpSU0F4TUM1Y2NseHVJQ292WEhKY2JseHlYRzVoSUh0Y2NseHVJQ0JpWVdOclozSnZkVzVrTFdOdmJHOXlPaUIwY21GdWMzQmhjbVZ1ZER0Y2NseHVmVnh5WEc1Y2NseHVMeW9xWEhKY2JpQXFJREV1SUZKbGJXOTJaU0IwYUdVZ1ltOTBkRzl0SUdKdmNtUmxjaUJwYmlCRGFISnZiV1VnTlRjdFhISmNiaUFxSURJdUlFRmtaQ0IwYUdVZ1kyOXljbVZqZENCMFpYaDBJR1JsWTI5eVlYUnBiMjRnYVc0Z1EyaHliMjFsTENCRlpHZGxMQ0JKUlN3Z1QzQmxjbUVzSUdGdVpDQlRZV1poY21rdVhISmNiaUFxTDF4eVhHNWNjbHh1WVdKaWNsdDBhWFJzWlYwZ2UxeHlYRzRnSUdKdmNtUmxjaTFpYjNSMGIyMDZJRzV2Ym1VN0lDOHFJREVnS2k5Y2NseHVJQ0IwWlhoMExXUmxZMjl5WVhScGIyNDZJSFZ1WkdWeWJHbHVaVHNnTHlvZ01pQXFMMXh5WEc0Z0lIUmxlSFF0WkdWamIzSmhkR2x2YmpvZ2RXNWtaWEpzYVc1bElHUnZkSFJsWkRzZ0x5b2dNaUFxTDF4eVhHNTlYSEpjYmx4eVhHNHZLaXBjY2x4dUlDb2dRV1JrSUhSb1pTQmpiM0p5WldOMElHWnZiblFnZDJWcFoyaDBJR2x1SUVOb2NtOXRaU3dnUldSblpTd2dZVzVrSUZOaFptRnlhUzVjY2x4dUlDb3ZYSEpjYmx4eVhHNWlMRnh5WEc1emRISnZibWNnZTF4eVhHNGdJR1p2Ym5RdGQyVnBaMmgwT2lCaWIyeGtaWEk3WEhKY2JuMWNjbHh1WEhKY2JpOHFLbHh5WEc0Z0tpQXhMaUJEYjNKeVpXTjBJSFJvWlNCcGJtaGxjbWwwWVc1alpTQmhibVFnYzJOaGJHbHVaeUJ2WmlCbWIyNTBJSE5wZW1VZ2FXNGdZV3hzSUdKeWIzZHpaWEp6TGx4eVhHNGdLaUF5TGlCRGIzSnlaV04wSUhSb1pTQnZaR1FnWUdWdFlDQm1iMjUwSUhOcGVtbHVaeUJwYmlCaGJHd2dZbkp2ZDNObGNuTXVYSEpjYmlBcUwxeHlYRzVjY2x4dVkyOWtaU3hjY2x4dWEySmtMRnh5WEc1ellXMXdJSHRjY2x4dUlDQm1iMjUwTFdaaGJXbHNlVG9nYlc5dWIzTndZV05sTENCdGIyNXZjM0JoWTJVN0lDOHFJREVnS2k5Y2NseHVJQ0JtYjI1MExYTnBlbVU2SURGbGJUc2dMeW9nTWlBcUwxeHlYRzU5WEhKY2JseHlYRzR2S2lwY2NseHVJQ29nUVdSa0lIUm9aU0JqYjNKeVpXTjBJR1p2Ym5RZ2MybDZaU0JwYmlCaGJHd2dZbkp2ZDNObGNuTXVYSEpjYmlBcUwxeHlYRzVjY2x4dWMyMWhiR3dnZTF4eVhHNGdJR1p2Ym5RdGMybDZaVG9nT0RBbE8xeHlYRzU5WEhKY2JseHlYRzR2S2lwY2NseHVJQ29nVUhKbGRtVnVkQ0JnYzNWaVlDQmhibVFnWUhOMWNHQWdaV3hsYldWdWRITWdabkp2YlNCaFptWmxZM1JwYm1jZ2RHaGxJR3hwYm1VZ2FHVnBaMmgwSUdsdVhISmNiaUFxSUdGc2JDQmljbTkzYzJWeWN5NWNjbHh1SUNvdlhISmNibHh5WEc1emRXSXNYSEpjYm5OMWNDQjdYSEpjYmlBZ1ptOXVkQzF6YVhwbE9pQTNOU1U3WEhKY2JpQWdiR2x1WlMxb1pXbG5hSFE2SURBN1hISmNiaUFnY0c5emFYUnBiMjQ2SUhKbGJHRjBhWFpsTzF4eVhHNGdJSFpsY25ScFkyRnNMV0ZzYVdkdU9pQmlZWE5sYkdsdVpUdGNjbHh1ZlZ4eVhHNWNjbHh1YzNWaUlIdGNjbHh1SUNCaWIzUjBiMjA2SUMwd0xqSTFaVzA3WEhKY2JuMWNjbHh1WEhKY2JuTjFjQ0I3WEhKY2JpQWdkRzl3T2lBdE1DNDFaVzA3WEhKY2JuMWNjbHh1WEhKY2JpOHFJRVZ0WW1Wa1pHVmtJR052Ym5SbGJuUmNjbHh1SUNBZ1BUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMGdLaTljY2x4dVhISmNiaThxS2x4eVhHNGdLaUJTWlcxdmRtVWdkR2hsSUdKdmNtUmxjaUJ2YmlCcGJXRm5aWE1nYVc1emFXUmxJR3hwYm10eklHbHVJRWxGSURFd0xseHlYRzRnS2k5Y2NseHVYSEpjYm1sdFp5QjdYSEpjYmlBZ1ltOXlaR1Z5TFhOMGVXeGxPaUJ1YjI1bE8xeHlYRzU5WEhKY2JseHlYRzR2S2lCR2IzSnRjMXh5WEc0Z0lDQTlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQU0FxTDF4eVhHNWNjbHh1THlvcVhISmNiaUFxSURFdUlFTm9ZVzVuWlNCMGFHVWdabTl1ZENCemRIbHNaWE1nYVc0Z1lXeHNJR0p5YjNkelpYSnpMbHh5WEc0Z0tpQXlMaUJTWlcxdmRtVWdkR2hsSUcxaGNtZHBiaUJwYmlCR2FYSmxabTk0SUdGdVpDQlRZV1poY21rdVhISmNiaUFxTDF4eVhHNWNjbHh1WW5WMGRHOXVMRnh5WEc1cGJuQjFkQ3hjY2x4dWIzQjBaM0p2ZFhBc1hISmNibk5sYkdWamRDeGNjbHh1ZEdWNGRHRnlaV0VnZTF4eVhHNGdJR1p2Ym5RdFptRnRhV3g1T2lCcGJtaGxjbWwwT3lBdktpQXhJQ292WEhKY2JpQWdabTl1ZEMxemFYcGxPaUF4TURBbE95QXZLaUF4SUNvdlhISmNiaUFnYkdsdVpTMW9aV2xuYUhRNklERXVNVFU3SUM4cUlERWdLaTljY2x4dUlDQnRZWEpuYVc0NklEQTdJQzhxSURJZ0tpOWNjbHh1ZlZ4eVhHNWNjbHh1THlvcVhISmNiaUFxSUZOb2IzY2dkR2hsSUc5MlpYSm1iRzkzSUdsdUlFbEZMbHh5WEc0Z0tpQXhMaUJUYUc5M0lIUm9aU0J2ZG1WeVpteHZkeUJwYmlCRlpHZGxMbHh5WEc0Z0tpOWNjbHh1WEhKY2JtSjFkSFJ2Yml4Y2NseHVhVzV3ZFhRZ2UxeHlYRzRnSUM4cUlERWdLaTljY2x4dUlDQnZkbVZ5Wm14dmR6b2dkbWx6YVdKc1pUdGNjbHh1ZlZ4eVhHNWNjbHh1THlvcVhISmNiaUFxSUZKbGJXOTJaU0IwYUdVZ2FXNW9aWEpwZEdGdVkyVWdiMllnZEdWNGRDQjBjbUZ1YzJadmNtMGdhVzRnUldSblpTd2dSbWx5WldadmVDd2dZVzVrSUVsRkxseHlYRzRnS2lBeExpQlNaVzF2ZG1VZ2RHaGxJR2x1YUdWeWFYUmhibU5sSUc5bUlIUmxlSFFnZEhKaGJuTm1iM0p0SUdsdUlFWnBjbVZtYjNndVhISmNiaUFxTDF4eVhHNWNjbHh1WW5WMGRHOXVMRnh5WEc1elpXeGxZM1FnZTF4eVhHNGdJQzhxSURFZ0tpOWNjbHh1SUNCMFpYaDBMWFJ5WVc1elptOXliVG9nYm05dVpUdGNjbHh1ZlZ4eVhHNWNjbHh1THlvcVhISmNiaUFxSUVOdmNuSmxZM1FnZEdobElHbHVZV0pwYkdsMGVTQjBieUJ6ZEhsc1pTQmpiR2xqYTJGaWJHVWdkSGx3WlhNZ2FXNGdhVTlUSUdGdVpDQlRZV1poY21rdVhISmNiaUFxTDF4eVhHNWNjbHh1WW5WMGRHOXVMRnh5WEc1YmRIbHdaVDBuWW5WMGRHOXVKMTBzWEhKY2JsdDBlWEJsUFNkeVpYTmxkQ2RkTEZ4eVhHNWJkSGx3WlQwbmMzVmliV2wwSjEwZ2UxeHlYRzRnSUMxM1pXSnJhWFF0WVhCd1pXRnlZVzVqWlRvZ1luVjBkRzl1TzF4eVhHNTlYSEpjYmx4eVhHNHZLaXBjY2x4dUlDb2dVbVZ0YjNabElIUm9aU0JwYm01bGNpQmliM0prWlhJZ1lXNWtJSEJoWkdScGJtY2dhVzRnUm1seVpXWnZlQzVjY2x4dUlDb3ZYSEpjYmx4eVhHNWlkWFIwYjI0Nk9pMXRiM290Wm05amRYTXRhVzV1WlhJc1hISmNibHQwZVhCbFBTZGlkWFIwYjI0blhUbzZMVzF2ZWkxbWIyTjFjeTFwYm01bGNpeGNjbHh1VzNSNWNHVTlKM0psYzJWMEoxMDZPaTF0YjNvdFptOWpkWE10YVc1dVpYSXNYSEpjYmx0MGVYQmxQU2R6ZFdKdGFYUW5YVG82TFcxdmVpMW1iMk4xY3kxcGJtNWxjaUI3WEhKY2JpQWdZbTl5WkdWeUxYTjBlV3hsT2lCdWIyNWxPMXh5WEc0Z0lIQmhaR1JwYm1jNklEQTdYSEpjYm4xY2NseHVYSEpjYmk4cUtseHlYRzRnS2lCU1pYTjBiM0psSUhSb1pTQm1iMk4xY3lCemRIbHNaWE1nZFc1elpYUWdZbmtnZEdobElIQnlaWFpwYjNWeklISjFiR1V1WEhKY2JpQXFMMXh5WEc1Y2NseHVZblYwZEc5dU9pMXRiM290Wm05amRYTnlhVzVuTEZ4eVhHNWJkSGx3WlQwblluVjBkRzl1SjEwNkxXMXZlaTFtYjJOMWMzSnBibWNzWEhKY2JsdDBlWEJsUFNkeVpYTmxkQ2RkT2kxdGIzb3RabTlqZFhOeWFXNW5MRnh5WEc1YmRIbHdaVDBuYzNWaWJXbDBKMTA2TFcxdmVpMW1iMk4xYzNKcGJtY2dlMXh5WEc0Z0lHOTFkR3hwYm1VNklERndlQ0JrYjNSMFpXUWdRblYwZEc5dVZHVjRkRHRjY2x4dWZWeHlYRzVjY2x4dUx5b3FYSEpjYmlBcUlFTnZjbkpsWTNRZ2RHaGxJSEJoWkdScGJtY2dhVzRnUm1seVpXWnZlQzVjY2x4dUlDb3ZYSEpjYmx4eVhHNW1hV1ZzWkhObGRDQjdYSEpjYmlBZ2NHRmtaR2x1WnpvZ01DNHpOV1Z0SURBdU56VmxiU0F3TGpZeU5XVnRPMXh5WEc1OVhISmNibHh5WEc0dktpcGNjbHh1SUNvZ01TNGdRMjl5Y21WamRDQjBhR1VnZEdWNGRDQjNjbUZ3Y0dsdVp5QnBiaUJGWkdkbElHRnVaQ0JKUlM1Y2NseHVJQ29nTWk0Z1EyOXljbVZqZENCMGFHVWdZMjlzYjNJZ2FXNW9aWEpwZEdGdVkyVWdabkp2YlNCZ1ptbGxiR1J6WlhSZ0lHVnNaVzFsYm5SeklHbHVJRWxGTGx4eVhHNGdLaUF6TGlCU1pXMXZkbVVnZEdobElIQmhaR1JwYm1jZ2MyOGdaR1YyWld4dmNHVnljeUJoY21VZ2JtOTBJR05oZFdkb2RDQnZkWFFnZDJobGJpQjBhR1Y1SUhwbGNtOGdiM1YwWEhKY2JpQXFJQ0FnSUdCbWFXVnNaSE5sZEdBZ1pXeGxiV1Z1ZEhNZ2FXNGdZV3hzSUdKeWIzZHpaWEp6TGx4eVhHNGdLaTljY2x4dVhISmNibXhsWjJWdVpDQjdYSEpjYmlBZ1ltOTRMWE5wZW1sdVp6b2dZbTl5WkdWeUxXSnZlRHNnTHlvZ01TQXFMMXh5WEc0Z0lHTnZiRzl5T2lCcGJtaGxjbWwwT3lBdktpQXlJQ292WEhKY2JpQWdaR2x6Y0d4aGVUb2dkR0ZpYkdVN0lDOHFJREVnS2k5Y2NseHVJQ0J0WVhndGQybGtkR2c2SURFd01DVTdJQzhxSURFZ0tpOWNjbHh1SUNCd1lXUmthVzVuT2lBd095QXZLaUF6SUNvdlhISmNiaUFnZDJocGRHVXRjM0JoWTJVNklHNXZjbTFoYkRzZ0x5b2dNU0FxTDF4eVhHNTlYSEpjYmx4eVhHNHZLaXBjY2x4dUlDb2dRV1JrSUhSb1pTQmpiM0p5WldOMElIWmxjblJwWTJGc0lHRnNhV2R1YldWdWRDQnBiaUJEYUhKdmJXVXNJRVpwY21WbWIzZ3NJR0Z1WkNCUGNHVnlZUzVjY2x4dUlDb3ZYSEpjYmx4eVhHNXdjbTluY21WemN5QjdYSEpjYmlBZ2RtVnlkR2xqWVd3dFlXeHBaMjQ2SUdKaGMyVnNhVzVsTzF4eVhHNTlYSEpjYmx4eVhHNHZLaXBjY2x4dUlDb2dVbVZ0YjNabElIUm9aU0JrWldaaGRXeDBJSFpsY25ScFkyRnNJSE5qY205c2JHSmhjaUJwYmlCSlJTQXhNQ3N1WEhKY2JpQXFMMXh5WEc1Y2NseHVkR1Y0ZEdGeVpXRWdlMXh5WEc0Z0lHOTJaWEptYkc5M09pQmhkWFJ2TzF4eVhHNTlYSEpjYmx4eVhHNHZLaXBjY2x4dUlDb2dNUzRnUVdSa0lIUm9aU0JqYjNKeVpXTjBJR0p2ZUNCemFYcHBibWNnYVc0Z1NVVWdNVEF1WEhKY2JpQXFJREl1SUZKbGJXOTJaU0IwYUdVZ2NHRmtaR2x1WnlCcGJpQkpSU0F4TUM1Y2NseHVJQ292WEhKY2JseHlYRzViZEhsd1pUMG5ZMmhsWTJ0aWIzZ25YU3hjY2x4dVczUjVjR1U5SjNKaFpHbHZKMTBnZTF4eVhHNGdJR0p2ZUMxemFYcHBibWM2SUdKdmNtUmxjaTFpYjNnN0lDOHFJREVnS2k5Y2NseHVJQ0J3WVdSa2FXNW5PaUF3T3lBdktpQXlJQ292WEhKY2JuMWNjbHh1WEhKY2JpOHFLbHh5WEc0Z0tpQkRiM0p5WldOMElIUm9aU0JqZFhKemIzSWdjM1I1YkdVZ2IyWWdhVzVqY21WdFpXNTBJR0Z1WkNCa1pXTnlaVzFsYm5RZ1luVjBkRzl1Y3lCcGJpQkRhSEp2YldVdVhISmNiaUFxTDF4eVhHNWNjbHh1VzNSNWNHVTlKMjUxYldKbGNpZGRPam90ZDJWaWEybDBMV2x1Ym1WeUxYTndhVzR0WW5WMGRHOXVMRnh5WEc1YmRIbHdaVDBuYm5WdFltVnlKMTA2T2kxM1pXSnJhWFF0YjNWMFpYSXRjM0JwYmkxaWRYUjBiMjRnZTF4eVhHNGdJR2hsYVdkb2REb2dZWFYwYnp0Y2NseHVmVnh5WEc1Y2NseHVMeW9xWEhKY2JpQXFJREV1SUVOdmNuSmxZM1FnZEdobElHOWtaQ0JoY0hCbFlYSmhibU5sSUdsdUlFTm9jbTl0WlNCaGJtUWdVMkZtWVhKcExseHlYRzRnS2lBeUxpQkRiM0p5WldOMElIUm9aU0J2ZFhSc2FXNWxJSE4wZVd4bElHbHVJRk5oWm1GeWFTNWNjbHh1SUNvdlhISmNibHh5WEc1YmRIbHdaVDBuYzJWaGNtTm9KMTBnZTF4eVhHNGdJQzEzWldKcmFYUXRZWEJ3WldGeVlXNWpaVG9nZEdWNGRHWnBaV3hrT3lBdktpQXhJQ292WEhKY2JpQWdiM1YwYkdsdVpTMXZabVp6WlhRNklDMHljSGc3SUM4cUlESWdLaTljY2x4dWZWeHlYRzVjY2x4dUx5b3FYSEpjYmlBcUlGSmxiVzkyWlNCMGFHVWdhVzV1WlhJZ2NHRmtaR2x1WnlCcGJpQkRhSEp2YldVZ1lXNWtJRk5oWm1GeWFTQnZiaUJ0WVdOUFV5NWNjbHh1SUNvdlhISmNibHh5WEc1YmRIbHdaVDBuYzJWaGNtTm9KMTA2T2kxM1pXSnJhWFF0YzJWaGNtTm9MV1JsWTI5eVlYUnBiMjRnZTF4eVhHNGdJQzEzWldKcmFYUXRZWEJ3WldGeVlXNWpaVG9nYm05dVpUdGNjbHh1ZlZ4eVhHNWNjbHh1THlvcVhISmNiaUFxSURFdUlFTnZjbkpsWTNRZ2RHaGxJR2x1WVdKcGJHbDBlU0IwYnlCemRIbHNaU0JqYkdsamEyRmliR1VnZEhsd1pYTWdhVzRnYVU5VElHRnVaQ0JUWVdaaGNta3VYSEpjYmlBcUlESXVJRU5vWVc1blpTQm1iMjUwSUhCeWIzQmxjblJwWlhNZ2RHOGdZR2x1YUdWeWFYUmdJR2x1SUZOaFptRnlhUzVjY2x4dUlDb3ZYSEpjYmx4eVhHNDZPaTEzWldKcmFYUXRabWxzWlMxMWNHeHZZV1F0WW5WMGRHOXVJSHRjY2x4dUlDQXRkMlZpYTJsMExXRndjR1ZoY21GdVkyVTZJR0oxZEhSdmJqc2dMeW9nTVNBcUwxeHlYRzRnSUdadmJuUTZJR2x1YUdWeWFYUTdJQzhxSURJZ0tpOWNjbHh1ZlZ4eVhHNWNjbHh1THlvZ1NXNTBaWEpoWTNScGRtVmNjbHh1SUNBZ1BUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMGdLaTljY2x4dVhISmNiaThxWEhKY2JpQXFJRUZrWkNCMGFHVWdZMjl5Y21WamRDQmthWE53YkdGNUlHbHVJRVZrWjJVc0lFbEZJREV3S3l3Z1lXNWtJRVpwY21WbWIzZ3VYSEpjYmlBcUwxeHlYRzVjY2x4dVpHVjBZV2xzY3lCN1hISmNiaUFnWkdsemNHeGhlVG9nWW14dlkyczdYSEpjYm4xY2NseHVYSEpjYmk4cVhISmNiaUFxSUVGa1pDQjBhR1VnWTI5eWNtVmpkQ0JrYVhOd2JHRjVJR2x1SUdGc2JDQmljbTkzYzJWeWN5NWNjbHh1SUNvdlhISmNibHh5WEc1emRXMXRZWEo1SUh0Y2NseHVJQ0JrYVhOd2JHRjVPaUJzYVhOMExXbDBaVzA3WEhKY2JuMWNjbHh1WEhKY2JpOHFJRTFwYzJOY2NseHVJQ0FnUFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwZ0tpOWNjbHh1WEhKY2JpOHFLbHh5WEc0Z0tpQkJaR1FnZEdobElHTnZjbkpsWTNRZ1pHbHpjR3hoZVNCcGJpQkpSU0F4TUNzdVhISmNiaUFxTDF4eVhHNWNjbHh1ZEdWdGNHeGhkR1VnZTF4eVhHNGdJR1JwYzNCc1lYazZJRzV2Ym1VN1hISmNibjFjY2x4dVhISmNiaThxS2x4eVhHNGdLaUJCWkdRZ2RHaGxJR052Y25KbFkzUWdaR2x6Y0d4aGVTQnBiaUJKUlNBeE1DNWNjbHh1SUNvdlhISmNibHh5WEc1YmFHbGtaR1Z1WFNCN1hISmNiaUFnWkdsemNHeGhlVG9nYm05dVpUdGNjbHh1ZlZ4eVhHNGlMQ0pBYVcxd2IzSjBJQ2N1TDJOdmJHOXljeWM3WEhKY2JseHlYRzR2S2lBOVBUMDlQU0JDWVhObElEMDlQVDA5SUNvdlhISmNibWgwYld3c1hISmNibUp2WkhrZ2UxeHlYRzRnSUdobGFXZG9kRG9nTVRBd0pUdGNjbHh1SUNCaVlXTnJaM0p2ZFc1a09pQkFZbWRmWTI5c2IzSTdYSEpjYmlBZ1kyOXNiM0k2SUVCd2NtbHRZWEo1WDNSbGVIUmZZMjlzYjNJN1hISmNiaUFnWm05dWRDMXphWHBsT2lBeE5IQjRPMXh5WEc0Z0lHeHBibVV0YUdWcFoyaDBPaUF4TlRBbE8xeHlYRzRnSUdadmJuUXRabUZ0YVd4NU9pQW5UV2xqY205emIyWjBJRmxoU0dWcElGVkpKeXdnUVhKcFlXd3NJSE5oYm5NdGMyVnlhV1k3WEhKY2JpQWdiM1psY21ac2IzYzZJR2hwWkdSbGJqdGNjbHh1ZlZ4eVhHNWNjbHh1WVNCN1hISmNiaUFnSmpwc2FXNXJMRnh5WEc0Z0lDWTZkbWx6YVhSbFpDeGNjbHh1SUNBbU9taHZkbVZ5SUh0Y2NseHVJQ0FnSUdOdmJHOXlPaUJBYzNWalkyVnpjMTlqYjJ4dmNqdGNjbHh1SUNBZ0lIUmxlSFF0WkdWamIzSmhkR2x2YmpvZ2JtOXVaVHRjY2x4dUlDQjlYSEpjYmx4eVhHNGdJQ1k2YUc5MlpYSWdlMXh5WEc0Z0lDQWdkR1Y0ZEMxa1pXTnZjbUYwYVc5dU9pQjFibVJsY214cGJtVTdYSEpjYmlBZ2ZWeHlYRzU5WEhKY2JseHlYRzVqYjJSbElIdGNjbHh1SUNCbWIyNTBMV1poYldsc2VUb2dKMU52ZFhKalpTQkRiMlJsSUZCeWJ5Y3NJRU52Ym5OdmJHRnpMQ0JIWlc5eVoybGhMQ0JOYjI1aFkyOHNJRzF2Ym05emNHRmpaU3dnUVhKcFlXd3NYSEpjYmlBZ0lDQnpZVzV6TFhObGNtbG1PMXh5WEc1OVhISmNiaUlzSWk4cUlEMDlQVDA5SUZOamNtOXNiR0poY2lBOVBUMDlQU0FxTDF4eVhHNDZPaTEzWldKcmFYUXRjMk55YjJ4c1ltRnlJSHRjY2x4dUlDQjNhV1IwYURvZ04zQjRPMXh5WEc0Z0lHaGxhV2RvZERvZ04zQjRPMXh5WEc0Z0lDMTNaV0pyYVhRdFltOXlaR1Z5TFhKaFpHbDFjem9nTlhCNE8xeHlYRzU5WEhKY2JseHlYRzQ2T2kxM1pXSnJhWFF0YzJOeWIyeHNZbUZ5TFhSeVlXTnJMWEJwWldObElIdGNjbHh1SUNBdGQyVmlhMmwwTFdKdmNtUmxjaTF5WVdScGRYTTZJRFZ3ZUR0Y2NseHVmVnh5WEc1Y2NseHVPam90ZDJWaWEybDBMWE5qY205c2JHSmhjaTEwYUhWdFlqcDJaWEowYVdOaGJDQjdYSEpjYmlBZ1ltRmphMmR5YjNWdVpDMWpiMnh2Y2pvZ2NtZGlZU2d3TENBd0xDQXdMQ0F3TGpJMUtUdGNjbHh1SUNBdGQyVmlhMmwwTFdKdmNtUmxjaTF5WVdScGRYTTZJRFZ3ZUR0Y2NseHVmVnh5WEc1Y2NseHVPam90ZDJWaWEybDBMWE5qY205c2JHSmhjaTEwYUhWdFlqcG9iM0pwZW05dWRHRnNJSHRjY2x4dUlDQmlZV05yWjNKdmRXNWtMV052Ykc5eU9pQnlaMkpoS0RBc0lEQXNJREFzSURBdU1qVXBPMXh5WEc0Z0lDMTNaV0pyYVhRdFltOXlaR1Z5TFhKaFpHbDFjem9nTlhCNE8xeHlYRzU5WEhKY2JseHlYRzQ2T2kxM1pXSnJhWFF0YzJOeWIyeHNZbUZ5T21odmRtVnlJSHRjY2x4dUlDQmlZV05yWjNKdmRXNWtMV052Ykc5eU9pQnlaMkpoS0RBc0lEQXNJREFzSURBdU1UVXBPMXh5WEc1OVhISmNibHh5WEc0Nk9pMTNaV0pyYVhRdGMyTnliMnhzWW1GeUxYUm9kVzFpT21odmRtVnlJSHRjY2x4dUlDQmlZV05yWjNKdmRXNWtMV052Ykc5eU9pQnlaMkpoS0RBc0lEQXNJREFzSURBdU16VXBPMXh5WEc1OVhISmNiaUlzSWtCcGJYQnZjblFnSnk0dlkyOXNiM0p6Snp0Y2NseHVYSEpjYmk4cUlFeGhlVzkxZENBcUwxeHlYRzR1Wkc5amN5QjdYSEpjYmlBZ1pHbHpjR3hoZVRvZ1pteGxlRHRjY2x4dUlDQm1iR1Y0TFdScGNtVmpkR2x2YmpvZ2NtOTNPMXh5WEc0Z0lHWnNaWGd0ZDNKaGNEb2dibTkzY21Gd08xeHlYRzRnSUhCdmMybDBhVzl1T2lCeVpXeGhkR2wyWlR0Y2NseHVJQ0I2TFdsdVpHVjRPaUF4TzF4eVhHNGdJR2hsYVdkb2REb2dNVEF3SlR0Y2NseHVJQ0IzYVdSMGFEb2dNVEF3SlR0Y2NseHVJQ0J0WVhKbmFXNDZJREE3WEhKY2JpQWdiM1psY21ac2IzYzZJR2hwWkdSbGJqdGNjbHh1ZlZ4eVhHNWNjbHh1THlvZ1FYTnBaR1VnS2k5Y2NseHVMbUZ6YVdSbElIdGNjbHh1SUNCa2FYTndiR0Y1T2lCbWJHVjRPMXh5WEc0Z0lHWnNaWGd0YzJoeWFXNXJPaUF3TzF4eVhHNGdJR1pzWlhndFpHbHlaV04wYVc5dU9pQmpiMngxYlc0N1hISmNiaUFnWm14bGVDMTNjbUZ3T2lCdWIzZHlZWEE3WEhKY2JpQWdkMmxrZEdnNklESTJNSEI0TzF4eVhHNGdJRzFoY21kcGJqb2dNRHRjY2x4dUlDQm9aV2xuYUhRNklERXdNQ1U3WEhKY2JpQWdZbUZqYTJkeWIzVnVaQzFqYjJ4dmNqb2dRSEJ5YVcxaGNubGZkR1Y0ZEY5amIyeHZjanRjY2x4dUlDQmpiMnh2Y2pvZ1FHSnZjbVJsY2w5amIyeHZjanRjY2x4dUlDQmliM2d0YzJoaFpHOTNPaUF3SURBZ05YQjRJREp3ZUNCQVltOXlaR1Z5WDJOdmJHOXlPMXh5WEc0Z0lIUnlZVzV6YVhScGIyNHRaSFZ5WVhScGIyNDZJREF1TTNNN1hISmNiaUFnYjNabGNtWnNiM2M2SUdGMWRHODdYSEpjYm4xY2NseHVYSEpjYmk4cUlFMWhhVzRnS2k5Y2NseHVMbTFoYVc0Z2UxeHlYRzRnSUdac1pYZzZJREU3WEhKY2JpQWdjRzl6YVhScGIyNDZJSEpsYkdGMGFYWmxPMXh5WEc0Z0lIb3RhVzVrWlhnNklERTdYSEpjYmlBZ2FHVnBaMmgwT2lBeE1EQWxPMXh5WEc0Z0lHSmhZMnRuY205MWJtUXRZMjlzYjNJNklFQjNhR2wwWlR0Y2NseHVJQ0J2ZG1WeVpteHZkem9nWVhWMGJ6dGNjbHh1ZlZ4eVhHNWNjbHh1UUcxbFpHbGhJQ2h0WVhndGQybGtkR2c2SURVd01IQjRLU0I3WEhKY2JpQWdMbVJ2WTNNZ2UxeHlYRzRnSUNBZ1pteGxlQzFrYVhKbFkzUnBiMjQ2SUdOdmJIVnRianRjY2x4dUlDQjlYSEpjYmx4eVhHNGdJQzVoYzJsa1pTeGNjbHh1SUNBdWJXRnBiaUI3WEhKY2JpQWdJQ0IzYVdSMGFEb2dNVEF3SlR0Y2NseHVJQ0I5WEhKY2JseHlYRzRnSUM1aGMybGtaU0I3WEhKY2JpQWdJQ0J3YjNOcGRHbHZiam9nWm1sNFpXUTdYSEpjYmlBZ0lDQjZMV2x1WkdWNE9pQXpPMXh5WEc0Z0lDQWdkRzl3T2lBd08xeHlYRzVjY2x4dUlDQWdJQ1l1YjNWMGJHbHVaUzF1WVhacFoyRjBiM0lnZTF4eVhHNGdJQ0FnSUNBbVgyWnZiR1JsWkNCN1hISmNiaUFnSUNBZ0lDQWdiR1ZtZERvZ0xURXdNQ1U3WEhKY2JpQWdJQ0FnSUgxY2NseHVYSEpjYmlBZ0lDQWdJQ1pmWlhod1lXNWtaV1FnZTF4eVhHNGdJQ0FnSUNBZ0lHeGxablE2SURBN1hISmNiaUFnSUNBZ0lIMWNjbHh1SUNBZ0lIMWNjbHh1SUNCOVhISmNibjFjY2x4dUlpd2lRR2x0Y0c5eWRDQW5MaTlqYjJ4dmNuTW5PMXh5WEc1Y2NseHVMbUZ6YVdSbElIdGNjbHh1SUNCbWIyNTBMV1poYldsc2VUb2dKMU52ZFhKalpTQkRiMlJsSUZCeWJ5Y3NJRU52Ym5OdmJHRnpMQ0JIWlc5eVoybGhMQ0JOYjI1aFkyOHNJRzF2Ym05emNHRmpaU3dnUVhKcFlXd3NYSEpjYmlBZ0lDQnpZVzV6TFhObGNtbG1PMXh5WEc1Y2NseHVJQ0FtWDE5b1pXRmtaWElnZTF4eVhHNGdJQ0FnYldGeVoybHVPaUF3SUdGMWRHODdYSEpjYmlBZ0lDQm1iR1Y0TFhOb2NtbHVhem9nTUR0Y2NseHVJQ0FnSUc5MlpYSm1iRzkzT2lCb2FXUmtaVzQ3WEhKY2JpQWdmVnh5WEc1Y2NseHVJQ0FtWDE5dVlYWWdlMXh5WEc0Z0lDQWdabXhsZURvZ01UdGNjbHh1SUNBZ0lHOTJaWEptYkc5M09pQmhkWFJ2TzF4eVhHNGdJSDFjY2x4dVhISmNiaUFnSmw5ZmFESWdlMXh5WEc0Z0lDQWdiV0Z5WjJsdU9pQXdJR0YxZEc4N1hISmNiaUFnSUNCb1pXbG5hSFE2SURVMGNIZzdYSEpjYmlBZ0lDQnNhVzVsTFdobGFXZG9kRG9nTlRSd2VEdGNjbHh1SUNBZ0lHWnZiblF0YzJsNlpUb2dNakJ3ZUR0Y2NseHVJQ0FnSUdadmJuUXRkMlZwWjJoME9pQnViM0p0WVd3N1hISmNiaUFnSUNCbWIyNTBMV1poYldsc2VUb2dSMlZ2Y21kcFlTd2dRMjl1YzI5c1lYTXNJRUZ5YVdGc0xDQnpZVzV6TFhObGNtbG1PMXh5WEc0Z0lDQWdkR1Y0ZEMxaGJHbG5iam9nWTJWdWRHVnlPMXh5WEc0Z0lDQWdiM1psY21ac2IzYzZJR2hwWkdSbGJqdGNjbHh1SUNCOVhISmNibHh5WEc0Z0lDWmZYMmd6SUh0Y2NseHVJQ0FnSUcxaGNtZHBiam9nTUNCaGRYUnZPMXh5WEc0Z0lDQWdjR0ZrWkdsdVp6b2dNQ0F5TUhCNE8xeHlYRzRnSUNBZ1ptOXVkQzF6YVhwbE9pQXhObkI0TzF4eVhHNGdJQ0FnYjNabGNtWnNiM2M2SUdocFpHUmxianRjY2x4dUlDQjlYSEpjYmx4eVhHNGdJQ1pmWDJ4cGMzUWdlMXh5WEc0Z0lDQWdiV0Z5WjJsdU9pQXdPMXh5WEc0Z0lDQWdjR0ZrWkdsdVp6b2dNVEJ3ZUNBd08xeHlYRzRnSUNBZ2IzWmxjbVpzYjNjNklHaHBaR1JsYmp0Y2NseHVJQ0I5WEhKY2JseHlYRzRnSUNaZlgybDBaVzBnZTF4eVhHNGdJQ0FnYUdWcFoyaDBPaUF6TW5CNE8xeHlYRzRnSUNBZ2JHbHVaUzFvWldsbmFIUTZJRE15Y0hnN1hISmNiaUFnSUNCd1lXUmthVzVuT2lBd0lETXdjSGc3WEhKY2JpQWdJQ0JqZFhKemIzSTZJSEJ2YVc1MFpYSTdYSEpjYmlBZ0lDQm1iMjUwTFhOcGVtVTZJREV6Y0hnN1hISmNiaUFnSUNCdmRtVnlabXh2ZHpvZ2FHbGtaR1Z1TzF4eVhHNGdJSDFjY2x4dVhISmNiaUFnSmkxdVlYWnBaMkYwYjNJZ2UxeHlYRzRnSUNBZ1pteGxlRG9nTVR0Y2NseHVYSEpjYmlBZ0lDQXViM1YwYkdsdVpTMXVZWFpwWjJGMGIzSWdlMXh5WEc0Z0lDQWdJQ0FtWDE5dFlXbHVJSHRjY2x4dUlDQWdJQ0FnSUNBbU9qb3RkMlZpYTJsMExYTmpjbTlzYkdKaGNpMTBhSFZ0WWlCN1hISmNiaUFnSUNBZ0lDQWdJQ0JpWVdOclozSnZkVzVrTFdOdmJHOXlPaUJBZEdocGNtUmZkR1Y0ZEY5amIyeHZjanRjY2x4dVhISmNiaUFnSUNBZ0lDQWdJQ0FtT21odmRtVnlJSHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdZbUZqYTJkeWIzVnVaQzFqYjJ4dmNqb2dRR1p2ZFhKMGFGOTBaWGgwWDJOdmJHOXlPMXh5WEc0Z0lDQWdJQ0FnSUNBZ2ZWeHlYRzRnSUNBZ0lDQWdJSDFjY2x4dUlDQWdJQ0FnZlZ4eVhHNWNjbHh1SUNBZ0lDQWdKbDlmY0d4aFkyVm9iMnhrWlhJZ2UxeHlYRzRnSUNBZ0lDQWdJR0poWTJ0bmNtOTFibVF0WTI5c2IzSTZJRUJ6WldOdmJtUmhjbmxmZEdWNGRGOWpiMnh2Y2p0Y2NseHVJQ0FnSUNBZ0lDQmliM0prWlhJdGJHVm1kRG9nTTNCNElITnZiR2xrSUVCM2FHbDBaVHRjY2x4dUlDQWdJQ0FnZlZ4eVhHNWNjbHh1SUNBZ0lDQWdKbDlmWVc1amFHOXlJSHRjY2x4dUlDQWdJQ0FnSUNBbU9teHBibXNnZTF4eVhHNGdJQ0FnSUNBZ0lDQWdZMjlzYjNJNklFQmliM0prWlhKZlkyOXNiM0k3WEhKY2JpQWdJQ0FnSUNBZ0lDQjBaWGgwTFdSbFkyOXlZWFJwYjI0NklHNXZibVU3WEhKY2JpQWdJQ0FnSUNBZ2ZWeHlYRzVjY2x4dUlDQWdJQ0FnSUNBbU9uWnBjMmwwWldRZ2UxeHlYRzRnSUNBZ0lDQWdJQ0FnWTI5c2IzSTZJRUJpYjNKa1pYSmZZMjlzYjNJN1hISmNiaUFnSUNBZ0lDQWdJQ0IwWlhoMExXUmxZMjl5WVhScGIyNDZJRzV2Ym1VN1hISmNiaUFnSUNBZ0lDQWdmVnh5WEc1Y2NseHVJQ0FnSUNBZ0lDQW1PbWh2ZG1WeUlIdGNjbHh1SUNBZ0lDQWdJQ0FnSUdOdmJHOXlPaUJBWW05eVpHVnlYMk52Ykc5eU8xeHlYRzRnSUNBZ0lDQWdJQ0FnZEdWNGRDMWtaV052Y21GMGFXOXVPaUIxYm1SbGNteHBibVU3WEhKY2JpQWdJQ0FnSUNBZ2ZWeHlYRzRnSUNBZ0lDQjlYSEpjYmx4eVhHNGdJQ0FnSUNBbVgyRmpkR2wyWlNCN1hISmNiaUFnSUNBZ0lDQWdKaTV2ZFhSc2FXNWxMVzVoZG1sbllYUnZjbDlmWVc1amFHOXlJSHRjY2x4dUlDQWdJQ0FnSUNBZ0lDWTZiR2x1YXl4Y2NseHVJQ0FnSUNBZ0lDQWdJQ1k2ZG1semFYUmxaQ3hjY2x4dUlDQWdJQ0FnSUNBZ0lDWTZhRzkyWlhJZ2UxeHlYRzRnSUNBZ0lDQWdJQ0FnSUNCamIyeHZjam9nUUhkb2FYUmxPMXh5WEc0Z0lDQWdJQ0FnSUNBZ2ZWeHlYRzRnSUNBZ0lDQWdJSDFjY2x4dUlDQWdJQ0FnZlZ4eVhHNGdJQ0FnZlZ4eVhHNGdJSDFjY2x4dWZWeHlYRzRpTENKQWFXMXdiM0owSUNjdUwyTnZiRzl5Y3ljN1hISmNibHh5WEc0dWJXRnBiaUI3WEhKY2JpQWdKbDlmYUdWaFpHVnlMRnh5WEc0Z0lDWmZYMlp2YjNSbGNpQjdYSEpjYmlBZ0lDQnRZWEpuYVc0NklEQWdZWFYwYnp0Y2NseHVJQ0FnSUhCaFpHUnBibWM2SURGbGJUdGNjbHh1SUNBZ0lIUmxlSFF0WVd4cFoyNDZJR05sYm5SbGNqdGNjbHh1SUNBZ0lHOTJaWEptYkc5M09pQm9hV1JrWlc0N1hISmNiaUFnZlZ4eVhHNWNjbHh1SUNBbVgxOW9NU0I3WEhKY2JpQWdJQ0J0WVhKbmFXNDZJREFnWVhWMGJ6dGNjbHh1SUNBZ0lIQmhaR1JwYm1jdGRHOXdPaUF4WlcwN1hISmNiaUFnSUNCbWIyNTBMWE5wZW1VNklEVmxiVHRjY2x4dUlDQWdJR1p2Ym5RdGQyVnBaMmgwT2lCdWIzSnRZV3c3WEhKY2JpQWdJQ0JzYVc1bExXaGxhV2RvZERvZ01tVnRPMXh5WEc0Z0lDQWdiM1psY21ac2IzYzZJR2hwWkdSbGJqdGNjbHh1SUNCOVhISmNibHh5WEc0Z0lDWmZYMjVoYldVZ2UxeHlYRzRnSUNBZ1kyOXNiM0k2SUNNMU1EZGhabVU3WEhKY2JpQWdJQ0JtYjI1MExYZGxhV2RvZERvZ2JtOXliV0ZzTzF4eVhHNGdJSDFjY2x4dVhISmNiaUFnSmw5ZmRHRm5iR2x1WlNCN1hISmNiaUFnSUNCdFlYSm5hVzQ2SURGbGJTQmhkWFJ2TzF4eVhHNGdJQ0FnYldGNExYZHBaSFJvT2lBNU5qQndlRHRjY2x4dUlDQWdJR3hwYm1VdGFHVnBaMmgwT2lBeExqTmxiVHRjY2x4dUlDQWdJR1p2Ym5RdGMybDZaVG9nTW1WdE8xeHlYRzRnSUNBZ1kyOXNiM0k2SUVCbWIzVnlkR2hmZEdWNGRGOWpiMnh2Y2p0Y2NseHVJQ0FnSUdadmJuUXRkMlZwWjJoME9pQXhNREE3WEhKY2JpQWdJQ0J2ZG1WeVpteHZkem9nYUdsa1pHVnVPMXh5WEc0Z0lIMWNjbHh1WEhKY2JpQWdKbDlmWTJSdUlIdGNjbHh1SUNBZ0lHMWhjbWRwYmpvZ01tVnRJREE3WEhKY2JpQWdJQ0J3WVdSa2FXNW5PaUF5WlcwN1hISmNiaUFnSUNCbWIyNTBMWE5wZW1VNklERTJjSGc3WEhKY2JpQWdJQ0JzYVc1bExXaGxhV2RvZERvZ01UVXdKVHRjY2x4dUlDQWdJSFJsZUhRdFlXeHBaMjQ2SUdObGJuUmxjanRjY2x4dUlDQWdJR0poWTJ0bmNtOTFibVF0WTI5c2IzSTZJRUJpWjE5amIyeHZjanRjY2x4dUlDQWdJR0p2Y21SbGNpMTBiM0E2SURGd2VDQnpiMnhwWkNCQVltOXlaR1Z5WDJOdmJHOXlPMXh5WEc0Z0lDQWdZbTl5WkdWeUxXSnZkSFJ2YlRvZ01YQjRJSE52Ykdsa0lFQmliM0prWlhKZlkyOXNiM0k3WEhKY2JpQWdJQ0JqYjJ4dmNqb2dRSFJvYVhKa1gzUmxlSFJmWTI5c2IzSTdYSEpjYmlBZ0lDQnZkbVZ5Wm14dmR6b2dhR2xrWkdWdU8xeHlYRzRnSUgxY2NseHVYSEpjYmlBZ0psOWZaRzkzYm14dllXUWdlMXh5WEc0Z0lDQWdiV0Z5WjJsdU9pQXhaVzBnWVhWMGJ6dGNjbHh1SUNBZ0lIZHBaSFJvT2lBeU1EQndlRHRjY2x4dUlDQWdJSFJsZUhRdFlXeHBaMjQ2SUdObGJuUmxjanRjY2x4dUlDQWdJRzkyWlhKbWJHOTNPaUJvYVdSa1pXNDdYSEpjYmlBZ2ZWeHlYRzVjY2x4dUlDQW1YMTlpZFhSMGIyNGdlMXh5WEc0Z0lDQWdaR2x6Y0d4aGVUb2dhVzVzYVc1bExXSnNiMk5yTzF4eVhHNGdJQ0FnWW05eVpHVnlMWEpoWkdsMWN6b2dOSEI0TzF4eVhHNGdJQ0FnY0dGa1pHbHVaem9nTVRSd2VDQXlPWEI0TzF4eVhHNGdJQ0FnWm05dWRDMXphWHBsT2lBeE9IQjRPMXh5WEc0Z0lDQWdabTl1ZEMxbVlXMXBiSGs2SUNkVGIzVnlZMlVnUTI5a1pTQlFjbThuTENCRGIyNXpiMnhoY3l3Z1IyVnZjbWRwWVN3Z1RXOXVZV052TENCdGIyNXZjM0JoWTJVc0lFRnlhV0ZzTEZ4eVhHNGdJQ0FnSUNCellXNXpMWE5sY21sbU8xeHlYRzRnSUNBZ1ltRmphMmR5YjNWdVpDMWpiMnh2Y2pvZ1FITjFZMk5sYzNOZlkyOXNiM0k3WEhKY2JpQWdJQ0J2ZG1WeVpteHZkem9nYUdsa1pHVnVPMXh5WEc1Y2NseHVJQ0FnSUNZNmJHbHVheXhjY2x4dUlDQWdJQ1k2ZG1semFYUmxaQ3hjY2x4dUlDQWdJQ1k2YUc5MlpYSWdlMXh5WEc0Z0lDQWdJQ0JqYjJ4dmNqb2dRSGRvYVhSbE8xeHlYRzRnSUNBZ0lDQjBaWGgwTFdSbFkyOXlZWFJwYjI0NklHNXZibVU3WEhKY2JpQWdJQ0I5WEhKY2JpQWdmVnh5WEc1Y2NseHVJQ0FtWDE5bWIyOTBaWElnZTF4eVhHNGdJQ0FnYldGeVoybHVPaUF3SURObGJUdGNjbHh1SUNBZ0lHSnZjbVJsY2kxMGIzQTZJREZ3ZUNCemIyeHBaQ0JBWW05eVpHVnlYMk52Ykc5eU8xeHlYRzRnSUgxY2NseHVmVnh5WEc0aUxDSkFhVzF3YjNKMElDY3VMMk52Ykc5eWN5YzdYSEpjYmx4eVhHNHVjMlZqZEdsdmJpQjdYSEpjYmlBZ2JXRnlaMmx1T2lBeFpXMGdNRHRjY2x4dUlDQnZkbVZ5Wm14dmR6b2dhR2xrWkdWdU8xeHlYRzVjY2x4dUlDQW1YMTlvWldGa1pYSXNYSEpjYmlBZ0psOWZZMjl1ZEdWdWRDeGNjbHh1SUNBbVgxOW1iMjkwWlhJZ2UxeHlYRzRnSUNBZ2JXRnlaMmx1T2lBd08xeHlYRzRnSUNBZ2NHRmtaR2x1WnpvZ01DQXpaVzA3WEhKY2JpQWdJQ0J2ZG1WeVpteHZkem9nYUdsa1pHVnVPMXh5WEc0Z0lIMWNjbHh1WEhKY2JpQWdKbDlmZEdsMGJHVWdlMXh5WEc0Z0lDQWdZMjlzYjNJNklFQjBhR2x5WkY5MFpYaDBYMk52Ykc5eU8xeHlYRzRnSUgxY2NseHVYSEpjYmlBZ0psOWZhRE1nZTF4eVhHNGdJQ0FnWTI5c2IzSTZJRUJ3Y21sdFlYSjVYMk52Ykc5eU8xeHlYRzRnSUNBZ1ptOXVkQzF6YVhwbE9pQXhMak0xWlcwN1hISmNiaUFnZlZ4eVhHNWNjbHh1SUNBbVgxOW9OQ0I3WEhKY2JpQWdJQ0JtYjI1MExYTnBlbVU2SURFdU1XVnRPMXh5WEc0Z0lDQWdZMjlzYjNJNklFQjBhR2x5WkY5MFpYaDBYMk52Ykc5eU8xeHlYRzRnSUgxY2NseHVYSEpjYmlBZ0psOWZhRFVnZTF4eVhHNGdJQ0FnWm05dWRDMXphWHBsT2lBeFpXMDdYSEpjYmlBZ0lDQmpiMnh2Y2pvZ1FHWnZkWEowYUY5MFpYaDBYMk52Ykc5eU8xeHlYRzRnSUgxY2NseHVYSEpjYmlBZ0psOWZaR3dzWEhKY2JpQWdKbDlmWkhRc1hISmNiaUFnSmw5ZlpHUWdlMXh5WEc0Z0lDQWdiV0Z5WjJsdU9pQXdPMXh5WEc0Z0lDQWdjR0ZrWkdsdVp6b2dNRHRjY2x4dUlDQWdJRzkyWlhKbWJHOTNPaUJvYVdSa1pXNDdYSEpjYmlBZ2ZWeHlYRzVjY2x4dUlDQW1YMTlrYkNCN1hISmNiaUFnSUNCd2IzTnBkR2x2YmpvZ2NtVnNZWFJwZG1VN1hISmNiaUFnSUNCNkxXbHVaR1Y0T2lBeE8xeHlYRzRnSUgxY2NseHVYSEpjYmlBZ0psOWZaSFFnZTF4eVhHNGdJQ0FnWkdsemNHeGhlVG9nYVc1c2FXNWxMV0pzYjJOck8xeHlYRzRnSUgxY2NseHVYSEpjYmlBZ0psOWZaR1FnZTF4eVhHNGdJQ0FnWkdsemNHeGhlVG9nYVc1c2FXNWxMV0pzYjJOck8xeHlYRzRnSUNBZ1kyOXNiM0k2SUVCemRXTmpaWE56WDJOdmJHOXlPMXh5WEc0Z0lIMWNjbHh1WEhKY2JpQWdKbDlmY0hKbElIdGNjbHh1SUNBZ0lHMWhjbWRwYmpvZ01tVnRJREE3WEhKY2JpQWdJQ0J3WVdSa2FXNW5PaUF4WlcwN1hISmNiaUFnSUNCbWIyNTBMWE5wZW1VNklERTBjSGc3WEhKY2JpQWdJQ0JzYVc1bExXaGxhV2RvZERvZ01UVXdKVHRjY2x4dUlDQWdJSFJsZUhRdFlXeHBaMjQ2SUd4bFpuUTdYSEpjYmlBZ0lDQmlZV05yWjNKdmRXNWtMV052Ykc5eU9pQkFZbWRmWTI5c2IzSTdYSEpjYmlBZ0lDQmliM0prWlhJNklERndlQ0J6YjJ4cFpDQkFZbTl5WkdWeVgyTnZiRzl5TzF4eVhHNGdJQ0FnWW05eVpHVnlMWEpoWkdsMWN6b2dOSEI0TzF4eVhHNGdJQ0FnWTI5c2IzSTZJRUIwYUdseVpGOTBaWGgwWDJOdmJHOXlPMXh5WEc0Z0lDQWdiM1psY21ac2IzYzZJR0YxZEc4N1hISmNiaUFnZlZ4eVhHNWNjbHh1SUNBbVgxOWpiMlJsSUh0Y2NseHVJQ0FnSUdScGMzQnNZWGs2SUdKc2IyTnJPMXh5WEc0Z0lDQWdiV0Z5WjJsdU9pQXdJR0YxZEc4N1hISmNiaUFnSUNCdmRtVnlabXh2ZHpvZ2FHbGtaR1Z1TzF4eVhHNGdJSDFjY2x4dVhISmNiaUFnSmw5ZlptOXZkR1Z5SUh0Y2NseHVJQ0FnSUdKdmNtUmxjaTEwYjNBNklERndlQ0J6YjJ4cFpDQkFZbTl5WkdWeVgyTnZiRzl5TzF4eVhHNGdJQ0FnYldGeVoybHVMWFJ2Y0RvZ00yVnRPMXh5WEc0Z0lDQWdZbUZqYTJkeWIzVnVaQzFqYjJ4dmNqb2dRR0puWDJOdmJHOXlPMXh5WEc0Z0lDQWdZMjlzYjNJNklFQm1iM1Z5ZEdoZmRHVjRkRjlqYjJ4dmNqdGNjbHh1SUNCOVhISmNibHh5WEc0Z0lDWmZYM1JoWW14bElIdGNjbHh1SUNBZ0lHMWhjbWRwYmpvZ01XVnRJR0YxZEc4N1hISmNiaUFnSUNCM2FXUjBhRG9nTVRBd0pUdGNjbHh1SUNBZ0lHSnZjbVJsY2kxMGIzQTZJREZ3ZUNCemIyeHBaQ0JBWW05eVpHVnlYMk52Ykc5eU8xeHlYRzRnSUgxY2NseHVYSEpjYmlBZ0psOWZkR2dzWEhKY2JpQWdKbDlmZEdRZ2UxeHlYRzRnSUNBZ2NHRmtaR2x1WnpvZ05YQjRJREUyY0hnN1hISmNiaUFnSUNCc2FXNWxMV2hsYVdkb2REb2dNalp3ZUR0Y2NseHVJQ0FnSUdKdmNtUmxjaTFpYjNSMGIyMDZJREZ3ZUNCemIyeHBaQ0JBWW05eVpHVnlYMk52Ykc5eU8xeHlYRzRnSUgxY2NseHVYSEpjYmlBZ0psOWZkR2dnZTF4eVhHNGdJQ0FnZEdWNGRDMWhiR2xuYmpvZ1kyVnVkR1Z5TzF4eVhHNGdJQ0FnWW1GamEyZHliM1Z1WkMxamIyeHZjam9nUUdKblgyTnZiRzl5TzF4eVhHNGdJSDFjY2x4dWZWeHlYRzVjY2x4dVFHMWxaR2xoSUNodFlYZ3RkMmxrZEdnNklEVXdNSEI0S1NCN1hISmNiaUFnTG5ObFkzUnBiMjRnZTF4eVhHNGdJQ0FnSmw5ZmFHVmhaR1Z5TEZ4eVhHNGdJQ0FnSmw5ZlkyOXVkR1Z1ZENCN1hISmNiaUFnSUNBZ0lIQmhaR1JwYm1jNklEQWdNV1Z0TzF4eVhHNGdJQ0FnZlZ4eVhHNGdJSDFjY2x4dWZWeHlYRzRpTENKQWFXMXdiM0owSUNjdUwyTnZiRzl5Y3ljN1hISmNibHh5WEc0dVkyRnpaU0I3WEhKY2JpQWdjRzl6YVhScGIyNDZJSEpsYkdGMGFYWmxPMXh5WEc0Z0lIb3RhVzVrWlhnNklERTdYSEpjYmlBZ1pHbHpjR3hoZVRvZ1ozSnBaRHRjY2x4dUlDQm5jbWxrTFhSbGJYQnNZWFJsTFdOdmJIVnRibk02SUhKbGNHVmhkQ2d5TENBeFpuSXBPMXh5WEc0Z0lHZGhjRG9nTkRCd2VEdGNjbHh1SUNCd1lXUmthVzVuT2lBeFpXMDdYSEpjYmlBZ1ltOXlaR1Z5TFhSdmNEb2dNWEI0SUhOdmJHbGtJRUJpYjNKa1pYSmZZMjlzYjNJN1hISmNiaUFnWW05eVpHVnlMV0p2ZEhSdmJUb2dNWEI0SUhOdmJHbGtJRUJpYjNKa1pYSmZZMjlzYjNJN1hISmNiaUFnYjNabGNtWnNiM2M2SUdocFpHUmxianRjY2x4dVhISmNiaUFnSmpwaFpuUmxjaUI3WEhKY2JpQWdJQ0JqYjI1MFpXNTBPaUFuSnp0Y2NseHVJQ0FnSUhCdmMybDBhVzl1T2lCaFluTnZiSFYwWlR0Y2NseHVJQ0FnSUhvdGFXNWtaWGc2SURJN1hISmNiaUFnSUNCMGIzQTZJREE3WEhKY2JpQWdJQ0JzWldaME9pQTFNQ1U3WEhKY2JpQWdJQ0JvWldsbmFIUTZJREV3TUNVN1hISmNiaUFnSUNCM2FXUjBhRG9nTUR0Y2NseHVJQ0FnSUdKdmNtUmxjaTFzWldaME9pQXhjSGdnYzI5c2FXUWdRR0p2Y21SbGNsOWpiMnh2Y2p0Y2NseHVJQ0FnSUc5MlpYSm1iRzkzT2lCb2FXUmtaVzQ3WEhKY2JpQWdmVnh5WEc1Y2NseHVJQ0FtWDE5d2NtVXNYSEpjYmlBZ0psOWZkR1Y0ZEdGeVpXRWdlMXh5WEc0Z0lDQWdabTl1ZEMxemFYcGxPaUF4TTNCNE8xeHlYRzRnSUNBZ2JHbHVaUzFvWldsbmFIUTZJREUxTUNVN1hISmNiaUFnZlZ4eVhHNWNjbHh1SUNBbVgxOXdjbVVzWEhKY2JpQWdKbDlmWTI5a1pTeGNjbHh1SUNBbVgxOTBaWGgwWVhKbFlTQjdYSEpjYmlBZ0lDQm1iMjUwTFdaaGJXbHNlVG9nSjBOdmRYSnBaWElnVG1WM0p5d2dRMjl1YzI5c1lYTXNJRWRsYjNKbmFXRXNJRUZ5YVdGc0xDQnpZVzV6TFhObGNtbG1PMXh5WEc0Z0lIMWNjbHh1WEhKY2JpQWdKbDlmY0hKbElIdGNjbHh1SUNBZ0lHMWhjbWRwYmpvZ01EdGNjbHh1SUNBZ0lIQmhaR1JwYm1jNklERmxiVHRjY2x4dUlDQWdJR0poWTJ0bmNtOTFibVF0WTI5c2IzSTZJRUJpWjE5amIyeHZjanRjY2x4dUlDQWdJR2hsYVdkb2REb2dNVEF3SlR0Y2NseHVJQ0FnSUdKdmNtUmxjaTF5WVdScGRYTTZJRFJ3ZUR0Y2NseHVJQ0FnSUdKdmVDMXphWHBwYm1jNklHSnZjbVJsY2kxaWIzZzdYSEpjYmlBZ0lDQnZkbVZ5Wm14dmR6b2dZWFYwYnp0Y2NseHVJQ0I5WEhKY2JseHlYRzRnSUNaZlgzUnZiMnhpWVhJZ2UxeHlYRzRnSUNBZ2JXRnlaMmx1T2lBd0lHRjFkRzg3WEhKY2JpQWdJQ0JvWldsbmFIUTZJRE0yY0hnN1hISmNiaUFnSUNCc2FXNWxMV2hsYVdkb2REb2dNelp3ZUR0Y2NseHVJQ0FnSUdadmJuUXRjMmw2WlRvZ01UUndlRHRjY2x4dUlDQWdJSEJoWkdScGJtYzZJREFnTVRad2VEdGNjbHh1SUNBZ0lIUmxlSFF0WVd4cFoyNDZJSEpwWjJoME8xeHlYRzRnSUNBZ2IzWmxjbVpzYjNjNklHaHBaR1JsYmp0Y2NseHVJQ0I5WEhKY2JseHlYRzRnSUNaZlgyRmpkR2x2Yml4Y2NseHVJQ0FtWDE5eVpXMXZkbVVnZTF4eVhHNGdJQ0FnWTNWeWMyOXlPaUJ3YjJsdWRHVnlPMXh5WEc0Z0lDQWdZMjlzYjNJNklFQnpkV05qWlhOelgyTnZiRzl5TzF4eVhHNGdJQ0FnZFhObGNpMXpaV3hsWTNRNklHNXZibVU3WEhKY2JpQWdmVnh5WEc1Y2NseHVJQ0FtWDE5aFkzUnBiMjRnZTF4eVhHNGdJQ0FnWm05dWRDMXphWHBsT2lBeE0zQjRPMXh5WEc0Z0lDQWdjR0ZrWkdsdVp5MXNaV1owT2lBeE1IQjRPMXh5WEc1Y2NseHVJQ0FnSUNZNlptbHljM1F0WTJocGJHUWdlMXh5WEc0Z0lDQWdJQ0J3WVdSa2FXNW5MV3hsWm5RNklEQTdYSEpjYmlBZ0lDQjlYSEpjYmlBZ2ZWeHlYRzVjY2x4dUlDQW1YMTl5WlcxdmRtVWdlMXh5WEc0Z0lDQWdabXh2WVhRNklISnBaMmgwTzF4eVhHNGdJSDFjY2x4dVhISmNiaUFnSmw5ZlkyOXVjMjlzWlNCN1hISmNiaUFnSUNCdFlYSm5hVzQ2SURBZ1lYVjBienRjY2x4dUlDQWdJR2hsYVdkb2REb2dNVGd3Y0hnN1hISmNiaUFnSUNCaWIzSmtaWEk2SURGd2VDQnpiMnhwWkNCQVltOXlaR1Z5WDJOdmJHOXlPMXh5WEc0Z0lDQWdiM1psY21ac2IzYzZJR2hwWkdSbGJqdGNjbHh1SUNCOVhISmNibHh5WEc0Z0lDWmZYM1JsZUhSaGNtVmhJSHRjY2x4dUlDQWdJRzFoY21kcGJqb2dNQ0JoZFhSdk8xeHlYRzRnSUNBZ2QybGtkR2c2SURFd01DVTdYSEpjYmlBZ0lDQm9aV2xuYUhRNklERXdNQ1U3WEhKY2JpQWdJQ0JpYjNKa1pYSTZJRzV2Ym1VN1hISmNiaUFnSUNCdmRYUnNhVzVsT2lCdWIyNWxPMXh5WEc0Z0lDQWdjR0ZrWkdsdVp6b2dNV1Z0TzF4eVhHNGdJQ0FnWW05NExYTnBlbWx1WnpvZ1ltOXlaR1Z5TFdKdmVEdGNjbHh1SUNBZ0lHOTJaWEptYkc5M09pQmhkWFJ2TzF4eVhHNGdJSDFjY2x4dVhISmNiaUFnSmw5ZmJHbHpkQ3hjY2x4dUlDQW1YMTlwZEdWdElIdGNjbHh1SUNBZ0lHMWhjbWRwYmpvZ01EdGNjbHh1SUNBZ0lIQmhaR1JwYm1jNklEQTdYSEpjYmlBZ0lDQnNhWE4wTFhOMGVXeGxMWFI1Y0dVNklHNXZibVU3WEhKY2JpQWdJQ0J2ZG1WeVpteHZkem9nYUdsa1pHVnVPMXh5WEc0Z0lIMWNjbHh1WEhKY2JpQWdKbDlmYkdsemRDQjdYSEpjYmlBZ0lDQm9aV2xuYUhRNklETTJNSEI0TzF4eVhHNGdJQ0FnWW05eVpHVnlMWFJ2Y0RvZ01YQjRJSE52Ykdsa0lFQmliM0prWlhKZlkyOXNiM0k3WEhKY2JpQWdJQ0JpYjNKa1pYSXRZbTkwZEc5dE9pQXhjSGdnYzI5c2FXUWdRR0p2Y21SbGNsOWpiMnh2Y2p0Y2NseHVJQ0FnSUdadmJuUXRjMmw2WlRvZ01UTndlRHRjY2x4dUlDQWdJRzkyWlhKbWJHOTNPaUJoZFhSdk8xeHlYRzRnSUgxY2NseHVYSEpjYmlBZ0psOWZhWFJsYlNCN1hISmNiaUFnSUNCb1pXbG5hSFE2SURNMmNIZzdYSEpjYmlBZ0lDQnNhVzVsTFdobGFXZG9kRG9nTXpad2VEdGNjbHh1SUNBZ0lHTjFjbk52Y2pvZ2NHOXBiblJsY2p0Y2NseHVJQ0FnSUhCaFpHUnBibWM2SURBZ01UWndlRHRjY2x4dVhISmNiaUFnSUNBbU9taHZkbVZ5SUh0Y2NseHVJQ0FnSUNBZ1ltRmphMmR5YjNWdVpDMWpiMnh2Y2pvZ1FHaHZkbVZ5WDJKblgyTnZiRzl5TzF4eVhHNGdJQ0FnZlZ4eVhHNGdJSDFjY2x4dWZWeHlYRzRpTENJNmNtOXZkQ0I3WEhKY2JpQWdMUzF2ZFhSc2FXNWxMWHBKYm1SbGVEb2dNakF3TUR0Y2NseHVJQ0F0TFc5MWRHeHBibVV0YzNScFkydDVMV2hsYVdkb2REb2dNVEF3SlR0Y2NseHVJQ0F0TFc5MWRHeHBibVV0Ym1GMmFXZGhkRzl5TFhkcFpIUm9PaUF4TURBbE8xeHlYRzU5WEhKY2JpSXNJaThxSUQwOVBUMDlQVDA5UFQwZ2FXTnZiaTUwYUdWdFpTQXRJSE4yWnlEbG03N21vSWZubW9UbW9MZmx2SThnUFQwOVBUMDlQVDA5UFNBcUwxeHlYRzR1YjNWMGJHbHVaUzFwWTI5dUlIdGNjbHh1SUNCd2IzTnBkR2x2YmpvZ2NtVnNZWFJwZG1VN1hISmNiaUFnZWkxcGJtUmxlRG9nTVR0Y2NseHVJQ0JrYVhOd2JHRjVPaUJwYm14cGJtVXRZbXh2WTJzN1hISmNiaUFnZG1WeWRHbGpZV3d0WVd4cFoyNDZJRzFwWkdSc1pUdGNjbHh1SUNCM2FXUjBhRG9nTVdWdE8xeHlYRzRnSUdobGFXZG9kRG9nTVdWdE8xeHlYRzRnSUc5MlpYSm1iRzkzT2lCb2FXUmtaVzQ3WEhKY2JseHlYRzRnSUNaZlgzTjJaeUI3WEhKY2JpQWdJQ0J3YjNOcGRHbHZiam9nWVdKemIyeDFkR1U3WEhKY2JpQWdJQ0I2TFdsdVpHVjRPaUF5TzF4eVhHNGdJQ0FnZEc5d09pQTFNQ1U3WEhKY2JpQWdJQ0JzWldaME9pQTFNQ1U3WEhKY2JpQWdJQ0IzYVdSMGFEb2dNV1Z0TzF4eVhHNGdJQ0FnYUdWcFoyaDBPaUF4WlcwN1hISmNiaUFnSUNCbWFXeHNPaUJqZFhKeVpXNTBZMjlzYjNJN1hISmNiaUFnSUNCMGNtRnVjMlp2Y20wNklIUnlZVzV6YkdGMFpTZ3ROVEFsTENBdE5UQWxLVHRjY2x4dUlDQWdJRzkyWlhKbWJHOTNPaUJvYVdSa1pXNDdYSEpjYmlBZ2ZWeHlYRzVjY2x4dUlDQW1YMmhwWkdSbGJpQjdYSEpjYmlBZ0lDQmthWE53YkdGNU9pQnViMjVsTzF4eVhHNGdJSDFjY2x4dWZWeHlYRzRpTENJdktpQTlQVDA5UFNCVFkzSnZiR3hpWVhJZ1BUMDlQVDBnS2k5Y2NseHVPam90ZDJWaWEybDBMWE5qY205c2JHSmhjaUI3WEhKY2JpQWdkMmxrZEdnNklEZHdlRHRjY2x4dUlDQm9aV2xuYUhRNklEZHdlRHRjY2x4dUlDQXRkMlZpYTJsMExXSnZjbVJsY2kxeVlXUnBkWE02SURWd2VEdGNjbHh1WEhKY2JpQWdKaTEwY21GamF5MXdhV1ZqWlNCN1hISmNiaUFnSUNBdGQyVmlhMmwwTFdKdmNtUmxjaTF5WVdScGRYTTZJRFZ3ZUR0Y2NseHVJQ0I5WEhKY2JseHlYRzRnSUNZdGRHaDFiV0lnZTF4eVhHNGdJQ0FnSmpwMlpYSjBhV05oYkNCN1hISmNiaUFnSUNBZ0lHSmhZMnRuY205MWJtUXRZMjlzYjNJNklISm5ZbUVvTUN3Z01Dd2dNQ3dnTUM0eU5TazdYSEpjYmlBZ0lDQWdJQzEzWldKcmFYUXRZbTl5WkdWeUxYSmhaR2wxY3pvZ05YQjRPMXh5WEc0Z0lDQWdmVnh5WEc1Y2NseHVJQ0FnSUNZNmFHOXlhWHB2Ym5SaGJDQjdYSEpjYmlBZ0lDQWdJR0poWTJ0bmNtOTFibVF0WTI5c2IzSTZJSEpuWW1Fb01Dd2dNQ3dnTUN3Z01DNHlOU2s3WEhKY2JpQWdJQ0FnSUMxM1pXSnJhWFF0WW05eVpHVnlMWEpoWkdsMWN6b2dOWEI0TzF4eVhHNGdJQ0FnZlZ4eVhHNWNjbHh1SUNBZ0lDWTZhRzkyWlhJZ2UxeHlYRzRnSUNBZ0lDQmlZV05yWjNKdmRXNWtMV052Ykc5eU9pQnlaMkpoS0RBc0lEQXNJREFzSURBdU16VXBPMXh5WEc0Z0lDQWdmVnh5WEc0Z0lIMWNjbHh1WEhKY2JpQWdKanBvYjNabGNpQjdYSEpjYmlBZ0lDQmlZV05yWjNKdmRXNWtMV052Ykc5eU9pQnlaMkpoS0RBc0lEQXNJREFzSURBdU1UVXBPMXh5WEc0Z0lIMWNjbHh1ZlZ4eVhHNGlMQ0pBYVcxd2IzSjBJQ2N1TGk5MGFHVnRaUzlqYjJ4dmNuTW5PMXh5WEc1Y2NseHVMbTkxZEd4cGJtVXRhR1ZoWkdsdVp5QjdYSEpjYmlBZ2NHOXphWFJwYjI0NklISmxiR0YwYVhabE8xeHlYRzRnSUhvdGFXNWtaWGc2SURFN1hISmNiaUFnYjNabGNtWnNiM2M2SUdocFpHUmxianRjY2x4dVhISmNiaUFnSmw5ZllXNWphRzl5SUh0Y2NseHVJQ0FnSUdScGMzQnNZWGs2SUc1dmJtVTdYSEpjYmx4eVhHNGdJQ0FnSmpwc2FXNXJMRnh5WEc0Z0lDQWdKanAyYVhOcGRHVmtMRnh5WEc0Z0lDQWdKanBvYjNabGNpQjdYSEpjYmlBZ0lDQWdJR052Ykc5eU9pQkFabTkxY25Sb1gzUmxlSFJmWTI5c2IzSTdYSEpjYmlBZ0lDQWdJSFJsZUhRdFpHVmpiM0poZEdsdmJqb2dibTl1WlR0Y2NseHVJQ0FnSUgxY2NseHVYSEpjYmlBZ0lDQW1PbWh2ZG1WeUlIdGNjbHh1SUNBZ0lDQWdZMjlzYjNJNklFQndjbWx0WVhKNVgyTnZiRzl5TzF4eVhHNGdJQ0FnZlZ4eVhHNGdJSDFjY2x4dVhISmNiaUFnSmpwb2IzWmxjaUI3WEhKY2JpQWdJQ0F1YjNWMGJHbHVaUzFvWldGa2FXNW5YMTloYm1Ob2IzSWdlMXh5WEc0Z0lDQWdJQ0JrYVhOd2JHRjVPaUJwYm14cGJtVXRZbXh2WTJzN1hISmNiaUFnSUNCOVhISmNiaUFnZlZ4eVhHNWNjbHh1SUNBbVgzTjBZWEowSUh0Y2NseHVJQ0FnSUNZNmFHOTJaWElnZTF4eVhHNGdJQ0FnSUNCdmRtVnlabXh2ZHpvZ2RtbHphV0pzWlR0Y2NseHVJQ0FnSUgxY2NseHVYSEpjYmlBZ0lDQXViM1YwYkdsdVpTMW9aV0ZrYVc1blgxOWhibU5vYjNJZ2UxeHlYRzRnSUNBZ0lDQndiM05wZEdsdmJqb2dZV0p6YjJ4MWRHVTdYSEpjYmlBZ0lDQWdJSG90YVc1a1pYZzZJREk3WEhKY2JpQWdJQ0FnSUhSdmNEb2dOVEFsTzF4eVhHNGdJQ0FnSUNCMGNtRnVjMlp2Y20wNklIUnlZVzV6YkdGMFpWa29MVFV3SlNrN1hISmNiaUFnSUNBZ0lHeGxablE2SUMweFpXMDdYSEpjYmlBZ0lDQjlYSEpjYmlBZ2ZWeHlYRzU5WEhKY2JpSXNJa0JwYlhCdmNuUWdKeTR1TDNSb1pXMWxMM1poY21saFlteGxjeWM3WEhKY2JrQnBiWEJ2Y25RZ0p5NHVMM1JvWlcxbEwyTnZiRzl5Y3ljN1hISmNia0JwYlhCdmNuUWdKeTR1TDNSb1pXMWxMM05vWVdSdmR5YzdYSEpjYmx4eVhHNHViM1YwYkdsdVpTMWtjbUYzWlhJZ2UxeHlYRzRnSUhCdmMybDBhVzl1T2lCeVpXeGhkR2wyWlR0Y2NseHVJQ0I2TFdsdVpHVjRPaUF0TVR0Y2NseHVJQ0IwYjNBNklEQTdYSEpjYmlBZ2JHVm1kRG9nTUR0Y2NseHVJQ0J0WVhKbmFXNDZJREE3WEhKY2JpQWdkMmxrZEdnNklERXdNQ1U3WEhKY2JpQWdhR1ZwWjJoME9pQXhNREFsTzF4eVhHNGdJR0p2ZUMxemFYcHBibWM2SUdKdmNtUmxjaTFpYjNnN1hISmNiaUFnZG1semFXSnBiR2wwZVRvZ2FHbGtaR1Z1TzF4eVhHNGdJRzkyWlhKbWJHOTNPaUJvYVdSa1pXNDdYSEpjYmx4eVhHNGdJQ1pmWDIxdlpHRnNJSHRjY2x4dUlDQWdJQzV6YUdGa2IzZGZiR2xuYUhSZmNtVm5kV3hoY2lncE8xeHlYRzRnSUNBZ1pHbHpjR3hoZVRvZ1pteGxlRHRjY2x4dUlDQWdJR1pzWlhndFpHbHlaV04wYVc5dU9pQmpiMngxYlc0N1hISmNiaUFnSUNCbWJHVjRMWGR5WVhBNklHNXZkM0poY0R0Y2NseHVJQ0FnSUhCdmMybDBhVzl1T2lCaFluTnZiSFYwWlR0Y2NseHVJQ0FnSUhvdGFXNWtaWGc2SURJeE8xeHlYRzRnSUNBZ2FHVnBaMmgwT2lBeE1EQWxPMXh5WEc0Z0lDQWdZbUZqYTJkeWIzVnVaQzFqYjJ4dmNqb2dRSGRvYVhSbE8xeHlYRzRnSUNBZ2RISmhibk5wZEdsdmJpMWtkWEpoZEdsdmJqb2dNQzQwY3p0Y2NseHVJQ0FnSUc5MlpYSm1iRzkzT2lCb2FXUmtaVzQ3WEhKY2JpQWdmVnh5WEc1Y2NseHVJQ0FtWDE5b1pXRmtaWElzWEhKY2JpQWdKbDlmYldGcGJpeGNjbHh1SUNBbVgxOW1iMjkwWlhJZ2UxeHlYRzRnSUNBZ2QybGtkR2c2SURFd01DVTdYSEpjYmlBZ0lDQmliM2d0YzJsNmFXNW5PaUJpYjNKa1pYSXRZbTk0TzF4eVhHNGdJSDFjY2x4dVhISmNiaUFnSmw5ZmFHVmhaR1Z5TEZ4eVhHNGdJQ1pmWDJadmIzUmxjaUI3WEhKY2JpQWdJQ0JtYkdWNExYTm9jbWx1YXpvZ01EdGNjbHh1SUNCOVhISmNibHh5WEc0Z0lDWmZYM1JwZEd4bExGeHlYRzRnSUNaZlgyMWhhVzRzWEhKY2JpQWdKbDlmWm05dmRHVnlJSHRjY2x4dUlDQWdJSEJoWkdScGJtYzZJREFnTVRad2VEdGNjbHh1SUNCOVhISmNibHh5WEc0Z0lDWmZYMmhsWVdSbGNpeGNjbHh1SUNBbVgxOTBhWFJzWlNCN1hISmNiaUFnSUNCd2IzTnBkR2x2YmpvZ2NtVnNZWFJwZG1VN1hISmNiaUFnSUNCNkxXbHVaR1Y0T2lBeE8xeHlYRzRnSUNBZ2JXRnlaMmx1T2lBd0lHRjFkRzg3WEhKY2JpQWdJQ0JvWldsbmFIUTZJRFV5Y0hnN1hISmNiaUFnSUNCc2FXNWxMV2hsYVdkb2REb2dOVEp3ZUR0Y2NseHVJQ0FnSUc5MlpYSm1iRzkzT2lCb2FXUmtaVzQ3WEhKY2JpQWdmVnh5WEc1Y2NseHVJQ0FtWDE5MGFYUnNaU0I3WEhKY2JpQWdJQ0JtYjI1MExYTnBlbVU2SURFMmNIZzdYSEpjYmlBZ0lDQm1iMjUwTFhkbGFXZG9kRG9nTkRBd08xeHlYRzRnSUNBZ2JXRnlaMmx1T2lBd0lERTJjSGc3WEhKY2JpQWdJQ0JpYjNndGMybDZhVzVuT2lCaWIzSmtaWEl0WW05NE8xeHlYRzRnSUNBZ1ltOXlaR1Z5TFdKdmRIUnZiVG9nTVhCNElITnZiR2xrSUVCd2NtbHRZWEo1WDJKdmNtUmxjbDlqYjJ4dmNqdGNjbHh1SUNCOVhISmNibHh5WEc0Z0lDWmZYMk5zYjNObElIdGNjbHh1SUNBZ0lIQnZjMmwwYVc5dU9pQmhZbk52YkhWMFpUdGNjbHh1SUNBZ0lIb3RhVzVrWlhnNklESTdYSEpjYmlBZ0lDQjBiM0E2SURVd0pUdGNjbHh1SUNBZ0lISnBaMmgwT2lBeE1uQjRPMXh5WEc0Z0lDQWdkMmxrZEdnNklESXdjSGc3WEhKY2JpQWdJQ0JvWldsbmFIUTZJREl3Y0hnN1hISmNiaUFnSUNCc2FXNWxMV2hsYVdkb2REb2dNakJ3ZUR0Y2NseHVJQ0FnSUdOdmJHOXlPaUJBWm05MWNuUm9YM1JsZUhSZlkyOXNiM0k3WEhKY2JpQWdJQ0JtYjI1MExYTnBlbVU2SURJd2NIZzdYSEpjYmlBZ0lDQjBaWGgwTFdGc2FXZHVPaUJqWlc1MFpYSTdYSEpjYmlBZ0lDQmpkWEp6YjNJNklIQnZhVzUwWlhJN1hISmNiaUFnSUNCMGNtRnVjMlp2Y20wNklIUnlZVzV6YkdGMFpWa29MVFV3SlNrN1hISmNiaUFnSUNCdmRtVnlabXh2ZHpvZ2FHbGtaR1Z1TzF4eVhHNWNjbHh1SUNBZ0lDNXZkWFJzYVc1bExXbGpiMjRnZTF4eVhHNGdJQ0FnSUNCd2IzTnBkR2x2YmpvZ1lXSnpiMngxZEdVN1hISmNiaUFnSUNBZ0lIb3RhVzVrWlhnNklESTdYSEpjYmlBZ0lDQWdJSFJ2Y0RvZ01EdGNjbHh1SUNBZ0lDQWdiR1ZtZERvZ01EdGNjbHh1SUNBZ0lIMWNjbHh1WEhKY2JpQWdJQ0FtT21odmRtVnlJSHRjY2x4dUlDQWdJQ0FnWTI5c2IzSTZJRUIwYUdseVpGOTBaWGgwWDJOdmJHOXlPMXh5WEc0Z0lDQWdmVnh5WEc0Z0lIMWNjbHh1WEhKY2JpQWdKbDlmYldGcGJpQjdYSEpjYmlBZ0lDQm1iR1Y0T2lBeE8xeHlYRzRnSUNBZ2IzWmxjbVpzYjNjNklHRjFkRzg3WEhKY2JseHlYRzRnSUNBZ0ppNXZkbVZ5Wm14dmR5MW9hV1JrWlc0Z2UxeHlYRzRnSUNBZ0lDQnZkbVZ5Wm14dmR6b2dhR2xrWkdWdU8xeHlYRzRnSUNBZ2ZWeHlYRzRnSUgxY2NseHVYSEpjYmlBZ0psOWZabTl2ZEdWeUlIdGNjbHh1SUNBZ0lHMWhjbWRwYmpvZ01DQmhkWFJ2TzF4eVhHNGdJQ0FnZEdWNGRDMWhiR2xuYmpvZ2NtbG5hSFE3WEhKY2JpQWdJQ0J2ZG1WeVpteHZkem9nYUdsa1pHVnVPMXh5WEc0Z0lIMWNjbHh1WEhKY2JpQWdKbDlmYjNabGNteGhlU0I3WEhKY2JpQWdJQ0JqYjI1MFpXNTBPaUFuSnp0Y2NseHVJQ0FnSUhCdmMybDBhVzl1T2lCeVpXeGhkR2wyWlR0Y2NseHVJQ0FnSUhvdGFXNWtaWGc2SURFN1hISmNiaUFnSUNCMGIzQTZJREE3WEhKY2JpQWdJQ0JzWldaME9pQXdPMXh5WEc0Z0lDQWdkMmxrZEdnNklERXdNQ1U3WEhKY2JpQWdJQ0JvWldsbmFIUTZJREV3TUNVN1hISmNiaUFnSUNCaVlXTnJaM0p2ZFc1a0xXTnZiRzl5T2lCQWQyaHBkR1U3WEhKY2JpQWdJQ0J2Y0dGamFYUjVPaUF3TGpFN1hISmNiaUFnSUNCdmRtVnlabXh2ZHpvZ2FHbGtaR1Z1TzF4eVhHNGdJSDFjY2x4dVhISmNiaUFnSmw5eWRHd3NYSEpjYmlBZ0psOXNkSElnZTF4eVhHNGdJQ0FnSmk1dmRYUnNhVzVsTFdSeVlYZGxjaUI3WEhKY2JpQWdJQ0FnSUNaZmRHbHVlU0I3WEhKY2JpQWdJQ0FnSUNBZ2QybGtkR2c2SURJNE1IQjRPMXh5WEc0Z0lDQWdJQ0I5WEhKY2JseHlYRzRnSUNBZ0lDQW1YMjFwYm1rZ2UxeHlYRzRnSUNBZ0lDQWdJSGRwWkhSb09pQTBPREJ3ZUR0Y2NseHVJQ0FnSUNBZ2ZWeHlYRzVjY2x4dUlDQWdJQ0FnSmw5emJXRnNiQ0I3WEhKY2JpQWdJQ0FnSUNBZ2QybGtkR2c2SURVME1IQjRPMXh5WEc0Z0lDQWdJQ0I5WEhKY2JseHlYRzRnSUNBZ0lDQW1YM0psWjNWc1lYSWdlMXh5WEc0Z0lDQWdJQ0FnSUhkcFpIUm9PaUEyT0RCd2VEdGNjbHh1SUNBZ0lDQWdmVnh5WEc1Y2NseHVJQ0FnSUNBZ0psOXRaV1JwZFcwZ2UxeHlYRzRnSUNBZ0lDQWdJSGRwWkhSb09pQTNNakJ3ZUR0Y2NseHVJQ0FnSUNBZ2ZWeHlYRzVjY2x4dUlDQWdJQ0FnSmw5c1lYSm5aU0I3WEhKY2JpQWdJQ0FnSUNBZ2QybGtkR2c2SURrMk1IQjRPMXh5WEc0Z0lDQWdJQ0I5WEhKY2JpQWdJQ0I5WEhKY2JpQWdmVnh5WEc1Y2NseHVJQ0FtWDNKMGJDQjdYSEpjYmlBZ0lDQmliM0prWlhJdGJHVm1kRG9nTVhCNElITnZiR2xrSUVCd2NtbHRZWEo1WDJKdmNtUmxjbDlqYjJ4dmNqdGNjbHh1WEhKY2JpQWdJQ0FtTG05MWRHeHBibVV0WkhKaGQyVnlJSHRjY2x4dUlDQWdJQ0FnSmw5MGFXNTVJSHRjY2x4dUlDQWdJQ0FnSUNBbUxtOTFkR3hwYm1VdFpISmhkMlZ5WDJOc2IzTmxaQ0I3WEhKY2JpQWdJQ0FnSUNBZ0lDQnlhV2RvZERvZ0xUSTVNSEI0TzF4eVhHNGdJQ0FnSUNBZ0lIMWNjbHh1SUNBZ0lDQWdmVnh5WEc1Y2NseHVJQ0FnSUNBZ0psOXRhVzVwSUh0Y2NseHVJQ0FnSUNBZ0lDQW1MbTkxZEd4cGJtVXRaSEpoZDJWeVgyTnNiM05sWkNCN1hISmNiaUFnSUNBZ0lDQWdJQ0J5YVdkb2REb2dMVFE1TUhCNE8xeHlYRzRnSUNBZ0lDQWdJSDFjY2x4dUlDQWdJQ0FnZlZ4eVhHNWNjbHh1SUNBZ0lDQWdKbDl6YldGc2JDQjdYSEpjYmlBZ0lDQWdJQ0FnSmk1dmRYUnNhVzVsTFdSeVlYZGxjbDlqYkc5elpXUWdlMXh5WEc0Z0lDQWdJQ0FnSUNBZ2NtbG5hSFE2SUMwMU5UQndlRHRjY2x4dUlDQWdJQ0FnSUNCOVhISmNiaUFnSUNBZ0lIMWNjbHh1WEhKY2JpQWdJQ0FnSUNaZmNtVm5kV3hoY2lCN1hISmNiaUFnSUNBZ0lDQWdKaTV2ZFhSc2FXNWxMV1J5WVhkbGNsOWpiRzl6WldRZ2UxeHlYRzRnSUNBZ0lDQWdJQ0FnY21sbmFIUTZJQzAyT1RCd2VEdGNjbHh1SUNBZ0lDQWdJQ0I5WEhKY2JpQWdJQ0FnSUgxY2NseHVYSEpjYmlBZ0lDQWdJQ1pmYldWa2FYVnRJSHRjY2x4dUlDQWdJQ0FnSUNBbUxtOTFkR3hwYm1VdFpISmhkMlZ5WDJOc2IzTmxaQ0I3WEhKY2JpQWdJQ0FnSUNBZ0lDQnlhV2RvZERvZ0xUY3pNSEI0TzF4eVhHNGdJQ0FnSUNBZ0lIMWNjbHh1SUNBZ0lDQWdmVnh5WEc1Y2NseHVJQ0FnSUNBZ0psOXNZWEpuWlNCN1hISmNiaUFnSUNBZ0lDQWdKaTV2ZFhSc2FXNWxMV1J5WVhkbGNsOWpiRzl6WldRZ2UxeHlYRzRnSUNBZ0lDQWdJQ0FnY21sbmFIUTZJQzA1TnpCd2VEdGNjbHh1SUNBZ0lDQWdJQ0I5WEhKY2JpQWdJQ0FnSUgxY2NseHVJQ0FnSUgxY2NseHVJQ0I5WEhKY2JseHlYRzRnSUNaZmJIUnlJSHRjY2x4dUlDQWdJR0p2Y21SbGNpMXlhV2RvZERvZ01YQjRJSE52Ykdsa0lFQndjbWx0WVhKNVgySnZjbVJsY2w5amIyeHZjanRjY2x4dVhISmNiaUFnSUNBbUxtOTFkR3hwYm1VdFpISmhkMlZ5SUh0Y2NseHVJQ0FnSUNBZ0psOTBhVzU1SUh0Y2NseHVJQ0FnSUNBZ0lDQW1MbTkxZEd4cGJtVXRaSEpoZDJWeVgyTnNiM05sWkNCN1hISmNiaUFnSUNBZ0lDQWdJQ0JzWldaME9pQXRNamt3Y0hnN1hISmNiaUFnSUNBZ0lDQWdmVnh5WEc0Z0lDQWdJQ0I5WEhKY2JseHlYRzRnSUNBZ0lDQW1YMjFwYm1rZ2UxeHlYRzRnSUNBZ0lDQWdJQ1l1YjNWMGJHbHVaUzFrY21GM1pYSmZZMnh2YzJWa0lIdGNjbHh1SUNBZ0lDQWdJQ0FnSUd4bFpuUTZJQzAwT1RCd2VEdGNjbHh1SUNBZ0lDQWdJQ0I5WEhKY2JpQWdJQ0FnSUgxY2NseHVYSEpjYmlBZ0lDQWdJQ1pmYzIxaGJHd2dlMXh5WEc0Z0lDQWdJQ0FnSUNZdWIzVjBiR2x1WlMxa2NtRjNaWEpmWTJ4dmMyVmtJSHRjY2x4dUlDQWdJQ0FnSUNBZ0lHeGxablE2SUMwMU5UQndlRHRjY2x4dUlDQWdJQ0FnSUNCOVhISmNiaUFnSUNBZ0lIMWNjbHh1WEhKY2JpQWdJQ0FnSUNaZmNtVm5kV3hoY2lCN1hISmNiaUFnSUNBZ0lDQWdKaTV2ZFhSc2FXNWxMV1J5WVhkbGNsOWpiRzl6WldRZ2UxeHlYRzRnSUNBZ0lDQWdJQ0FnYkdWbWREb2dMVFk1TUhCNE8xeHlYRzRnSUNBZ0lDQWdJSDFjY2x4dUlDQWdJQ0FnZlZ4eVhHNWNjbHh1SUNBZ0lDQWdKbDl0WldScGRXMGdlMXh5WEc0Z0lDQWdJQ0FnSUNZdWIzVjBiR2x1WlMxa2NtRjNaWEpmWTJ4dmMyVmtJSHRjY2x4dUlDQWdJQ0FnSUNBZ0lHeGxablE2SUMwM016QndlRHRjY2x4dUlDQWdJQ0FnSUNCOVhISmNiaUFnSUNBZ0lIMWNjbHh1WEhKY2JpQWdJQ0FnSUNaZmJHRnlaMlVnZTF4eVhHNGdJQ0FnSUNBZ0lDWXViM1YwYkdsdVpTMWtjbUYzWlhKZlkyeHZjMlZrSUh0Y2NseHVJQ0FnSUNBZ0lDQWdJR3hsWm5RNklDMDVOekJ3ZUR0Y2NseHVJQ0FnSUNBZ0lDQjlYSEpjYmlBZ0lDQWdJSDFjY2x4dUlDQWdJSDFjY2x4dUlDQjlYSEpjYmx4eVhHNGdJQ1pmZEhSaUxGeHlYRzRnSUNaZlluUjBJSHRjY2x4dUlDQWdJR3hsWm5RNklEQTdYSEpjYmlBZ0lDQjNhV1IwYURvZ01UQXdKVHRjY2x4dVhISmNiaUFnSUNBbUxtOTFkR3hwYm1VdFpISmhkMlZ5SUh0Y2NseHVJQ0FnSUNBZ0psOTBhVzU1SUh0Y2NseHVJQ0FnSUNBZ0lDQm9aV2xuYUhRNklESTBNSEI0TzF4eVhHNGdJQ0FnSUNCOVhISmNibHh5WEc0Z0lDQWdJQ0FtWDIxcGJta2dlMXh5WEc0Z0lDQWdJQ0FnSUdobGFXZG9kRG9nTXpJd2NIZzdYSEpjYmlBZ0lDQWdJSDFjY2x4dVhISmNiaUFnSUNBZ0lDWmZjMjFoYkd3Z2UxeHlYRzRnSUNBZ0lDQWdJR2hsYVdkb2REb2dNell3Y0hnN1hISmNiaUFnSUNBZ0lIMWNjbHh1WEhKY2JpQWdJQ0FnSUNaZmNtVm5kV3hoY2lCN1hISmNiaUFnSUNBZ0lDQWdhR1ZwWjJoME9pQTBNREJ3ZUR0Y2NseHVJQ0FnSUNBZ2ZWeHlYRzVjY2x4dUlDQWdJQ0FnSmw5dFpXUnBkVzBnZTF4eVhHNGdJQ0FnSUNBZ0lHaGxhV2RvZERvZ05EUXdjSGc3WEhKY2JpQWdJQ0FnSUgxY2NseHVYSEpjYmlBZ0lDQWdJQ1pmYkdGeVoyVWdlMXh5WEc0Z0lDQWdJQ0FnSUdobGFXZG9kRG9nTkRnd2NIZzdYSEpjYmlBZ0lDQWdJSDFjY2x4dUlDQWdJSDFjY2x4dUlDQjlYSEpjYmx4eVhHNGdJQ1pmZEhSaUlIdGNjbHh1SUNBZ0lHSnZjbVJsY2kxaWIzUjBiMjA2SURGd2VDQnpiMnhwWkNCQWNISnBiV0Z5ZVY5aWIzSmtaWEpmWTI5c2IzSTdYSEpjYmx4eVhHNGdJQ0FnSmk1dmRYUnNhVzVsTFdSeVlYZGxjaUI3WEhKY2JpQWdJQ0FnSUNaZmRHbHVlU0I3WEhKY2JpQWdJQ0FnSUNBZ0ppNXZkWFJzYVc1bExXUnlZWGRsY2w5amJHOXpaV1FnZTF4eVhHNGdJQ0FnSUNBZ0lDQWdkRzl3T2lBdE1qVXdjSGc3WEhKY2JpQWdJQ0FnSUNBZ2ZWeHlYRzRnSUNBZ0lDQjlYSEpjYmx4eVhHNGdJQ0FnSUNBbVgyMXBibWtnZTF4eVhHNGdJQ0FnSUNBZ0lDWXViM1YwYkdsdVpTMWtjbUYzWlhKZlkyeHZjMlZrSUh0Y2NseHVJQ0FnSUNBZ0lDQWdJSFJ2Y0RvZ0xUTXpNSEI0TzF4eVhHNGdJQ0FnSUNBZ0lIMWNjbHh1SUNBZ0lDQWdmVnh5WEc1Y2NseHVJQ0FnSUNBZ0psOXpiV0ZzYkNCN1hISmNiaUFnSUNBZ0lDQWdKaTV2ZFhSc2FXNWxMV1J5WVhkbGNsOWpiRzl6WldRZ2UxeHlYRzRnSUNBZ0lDQWdJQ0FnZEc5d09pQXRNemN3Y0hnN1hISmNiaUFnSUNBZ0lDQWdmVnh5WEc0Z0lDQWdJQ0I5WEhKY2JseHlYRzRnSUNBZ0lDQW1YM0psWjNWc1lYSWdlMXh5WEc0Z0lDQWdJQ0FnSUNZdWIzVjBiR2x1WlMxa2NtRjNaWEpmWTJ4dmMyVmtJSHRjY2x4dUlDQWdJQ0FnSUNBZ0lIUnZjRG9nTFRReE1IQjRPMXh5WEc0Z0lDQWdJQ0FnSUgxY2NseHVJQ0FnSUNBZ2ZWeHlYRzVjY2x4dUlDQWdJQ0FnSmw5dFpXUnBkVzBnZTF4eVhHNGdJQ0FnSUNBZ0lDWXViM1YwYkdsdVpTMWtjbUYzWlhKZlkyeHZjMlZrSUh0Y2NseHVJQ0FnSUNBZ0lDQWdJSFJ2Y0RvZ0xUUTFNSEI0TzF4eVhHNGdJQ0FnSUNBZ0lIMWNjbHh1SUNBZ0lDQWdmVnh5WEc1Y2NseHVJQ0FnSUNBZ0psOXNZWEpuWlNCN1hISmNiaUFnSUNBZ0lDQWdKaTV2ZFhSc2FXNWxMV1J5WVhkbGNsOWpiRzl6WldRZ2UxeHlYRzRnSUNBZ0lDQWdJQ0FnZEc5d09pQXRORGt3Y0hnN1hISmNiaUFnSUNBZ0lDQWdmVnh5WEc0Z0lDQWdJQ0I5WEhKY2JpQWdJQ0I5WEhKY2JpQWdmVnh5WEc1Y2NseHVJQ0FtWDJKMGRDQjdYSEpjYmlBZ0lDQjBiM0E2SUdsdWFYUnBZV3c3WEhKY2JpQWdJQ0JpYjNKa1pYSXRkRzl3T2lBeGNIZ2djMjlzYVdRZ1FIQnlhVzFoY25sZlltOXlaR1Z5WDJOdmJHOXlPMXh5WEc1Y2NseHVJQ0FnSUNZdWIzVjBiR2x1WlMxa2NtRjNaWElnZTF4eVhHNGdJQ0FnSUNBbVgzUnBibmtnZTF4eVhHNGdJQ0FnSUNBZ0lDWXViM1YwYkdsdVpTMWtjbUYzWlhKZlkyeHZjMlZrSUh0Y2NseHVJQ0FnSUNBZ0lDQWdJR0p2ZEhSdmJUb2dMVEkxTUhCNE8xeHlYRzRnSUNBZ0lDQWdJSDFjY2x4dUlDQWdJQ0FnZlZ4eVhHNWNjbHh1SUNBZ0lDQWdKbDl0YVc1cElIdGNjbHh1SUNBZ0lDQWdJQ0FtTG05MWRHeHBibVV0WkhKaGQyVnlYMk5zYjNObFpDQjdYSEpjYmlBZ0lDQWdJQ0FnSUNCaWIzUjBiMjA2SUMwek16QndlRHRjY2x4dUlDQWdJQ0FnSUNCOVhISmNiaUFnSUNBZ0lIMWNjbHh1WEhKY2JpQWdJQ0FnSUNaZmMyMWhiR3dnZTF4eVhHNGdJQ0FnSUNBZ0lDWXViM1YwYkdsdVpTMWtjbUYzWlhKZlkyeHZjMlZrSUh0Y2NseHVJQ0FnSUNBZ0lDQWdJR0p2ZEhSdmJUb2dMVE0zTUhCNE8xeHlYRzRnSUNBZ0lDQWdJSDFjY2x4dUlDQWdJQ0FnZlZ4eVhHNWNjbHh1SUNBZ0lDQWdKbDl5WldkMWJHRnlJSHRjY2x4dUlDQWdJQ0FnSUNBbUxtOTFkR3hwYm1VdFpISmhkMlZ5WDJOc2IzTmxaQ0I3WEhKY2JpQWdJQ0FnSUNBZ0lDQmliM1IwYjIwNklDMDBNVEJ3ZUR0Y2NseHVJQ0FnSUNBZ0lDQjlYSEpjYmlBZ0lDQWdJSDFjY2x4dVhISmNiaUFnSUNBZ0lDWmZiV1ZrYVhWdElIdGNjbHh1SUNBZ0lDQWdJQ0FtTG05MWRHeHBibVV0WkhKaGQyVnlYMk5zYjNObFpDQjdYSEpjYmlBZ0lDQWdJQ0FnSUNCaWIzUjBiMjA2SUMwME5UQndlRHRjY2x4dUlDQWdJQ0FnSUNCOVhISmNiaUFnSUNBZ0lIMWNjbHh1WEhKY2JpQWdJQ0FnSUNaZmJHRnlaMlVnZTF4eVhHNGdJQ0FnSUNBZ0lDWXViM1YwYkdsdVpTMWtjbUYzWlhKZlkyeHZjMlZrSUh0Y2NseHVJQ0FnSUNBZ0lDQWdJR0p2ZEhSdmJUb2dMVFE1TUhCNE8xeHlYRzRnSUNBZ0lDQWdJSDFjY2x4dUlDQWdJQ0FnZlZ4eVhHNGdJQ0FnZlZ4eVhHNGdJSDFjY2x4dVhISmNiaUFnSmw5dmNHVnVaV1FnZTF4eVhHNGdJQ0FnZG1semFXSnBiR2wwZVRvZ2RtbHphV0pzWlR0Y2NseHVJQ0FnSUhvdGFXNWtaWGc2SUhaaGNpZ3RMVzkxZEd4cGJtVXRla2x1WkdWNEtUdGNjbHh1WEhKY2JpQWdJQ0FtTG05MWRHeHBibVV0WkhKaGQyVnlJSHRjY2x4dUlDQWdJQ0FnY0c5emFYUnBiMjQ2SUdacGVHVmtPMXh5WEc1Y2NseHVJQ0FnSUNBZ0psOXlkR3dnZTF4eVhHNGdJQ0FnSUNBZ0lISnBaMmgwT2lBd08xeHlYRzRnSUNBZ0lDQjlYSEpjYmx4eVhHNGdJQ0FnSUNBbVgyeDBjaUI3WEhKY2JpQWdJQ0FnSUNBZ2JHVm1kRG9nTUR0Y2NseHVJQ0FnSUNBZ2ZWeHlYRzVjY2x4dUlDQWdJQ0FnSmw5MGRHSWdlMXh5WEc0Z0lDQWdJQ0FnSUhSdmNEb2dNRHRjY2x4dUlDQWdJQ0FnZlZ4eVhHNWNjbHh1SUNBZ0lDQWdKbDlpZEhRZ2UxeHlYRzRnSUNBZ0lDQWdJR0p2ZEhSdmJUb2dNRHRjY2x4dUlDQWdJQ0FnZlZ4eVhHNGdJQ0FnZlZ4eVhHNGdJSDFjY2x4dVhISmNiaUFnSmw5dlptWnpaWFFnZTF4eVhHNGdJQ0FnSmk1dmRYUnNhVzVsTFdSeVlYZGxjaUI3WEhKY2JpQWdJQ0FnSUNaZmNuUnNMRnh5WEc0Z0lDQWdJQ0FtWDJ4MGNpQjdYSEpjYmlBZ0lDQWdJQ0FnYUdWcFoyaDBPaUJqWVd4aktERXdNQ1VnTFNBMFpXMHBPMXh5WEc0Z0lDQWdJQ0FnSUhSdmNEb2dOVEFsTzF4eVhHNGdJQ0FnSUNBZ0lIUnlZVzV6Wm05eWJUb2dkSEpoYm5Oc1lYUmxXU2d0TlRBbEtUdGNjbHh1SUNBZ0lDQWdmVnh5WEc1Y2NseHVJQ0FnSUNBZ0psOTBkR0lzWEhKY2JpQWdJQ0FnSUNaZlluUjBJSHRjY2x4dUlDQWdJQ0FnSUNCM2FXUjBhRG9nWTJGc1l5Z3hNREFsSUMwZ05HVnRLVHRjY2x4dUlDQWdJQ0FnSUNCc1pXWjBPaUExTUNVN1hISmNiaUFnSUNBZ0lDQWdkSEpoYm5ObWIzSnRPaUIwY21GdWMyeGhkR1ZZS0MwMU1DVXBPMXh5WEc0Z0lDQWdJQ0I5WEhKY2JseHlYRzRnSUNBZ0lDQW1YMjl3Wlc1bFpDQjdYSEpjYmlBZ0lDQWdJQ0FnSmk1dmRYUnNhVzVsTFdSeVlYZGxjaUI3WEhKY2JpQWdJQ0FnSUNBZ0lDQW1YM0owYkNCN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUhKcFoyaDBPaUF5WlcwN1hISmNiaUFnSUNBZ0lDQWdJQ0I5WEhKY2JseHlYRzRnSUNBZ0lDQWdJQ0FnSmw5c2RISWdlMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQnNaV1owT2lBeVpXMDdYSEpjYmlBZ0lDQWdJQ0FnSUNCOVhISmNibHh5WEc0Z0lDQWdJQ0FnSUNBZ0psOTBkR0lnZTF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0IwYjNBNklESmxiVHRjY2x4dUlDQWdJQ0FnSUNBZ0lIMWNjbHh1WEhKY2JpQWdJQ0FnSUNBZ0lDQW1YMkowZENCN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUdKdmRIUnZiVG9nTW1WdE8xeHlYRzRnSUNBZ0lDQWdJQ0FnZlZ4eVhHNGdJQ0FnSUNBZ0lIMWNjbHh1SUNBZ0lDQWdmVnh5WEc0Z0lDQWdmVnh5WEc0Z0lIMWNjbHh1WEhKY2JpQWdKbDloZFhSdklIdGNjbHh1SUNBZ0lDWXViM1YwYkdsdVpTMWtjbUYzWlhJZ2UxeHlYRzRnSUNBZ0lDQW1YM0owYkN4Y2NseHVJQ0FnSUNBZ0psOXNkSElnZTF4eVhHNGdJQ0FnSUNBZ0lHaGxhV2RvZERvZ1lYVjBienRjY2x4dUlDQWdJQ0FnSUNCdFlYZ3RhR1ZwWjJoME9pQmpZV3hqS0RFd01DVWdMU0EwWlcwcE8xeHlYRzRnSUNBZ0lDQjlYSEpjYmlBZ0lDQjlYSEpjYmlBZ2ZWeHlYRzVjY2x4dUlDQW1YMloxYkd3Z2UxeHlYRzRnSUNBZ2NHRmtaR2x1WnpvZ01EdGNjbHh1SUNCOVhISmNibjFjY2x4dUlpd2lMeW9xWEhKY2JpQXFJSE5vWVdSdmR5NXNaWE56SUMwZzZaaTA1YjJ4NXFDMzVieVA2SzYrNTcydUlHMXBlR2x1ZUNEbGg3M21sYkJjY2x4dUlDb2dQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBWeHlYRzRnS2lCRGNtVmhkR1ZrSUVKNU9pQlpZVzlvWVdsNGFXRnZYSEpjYmlBcUlGVndaR0YwWlRvZ01qQXlNaTR6TGpJd1hISmNiaUFxTDF4eVhHNUFhVzF3YjNKMElDY3VMMk52Ykc5eWN5YzdYSEpjYmx4eVhHNHZLaUE5UFQwOVBUMGc2WmkwNWIyeDVxQzM1YnlQNks2KzU3MnU1WWU5NXBXd0lEMDlQVDA5UFNBcUwxeHlYRzR1YzJoaFpHOTNLRUJ2Wm1aelpYUTZJREFnTUNBMmNIZ2dNWEI0TENCQVkyOXNiM0k2SUVCd2NtbHRZWEo1WDJKdmNtUmxjbDlqYjJ4dmNpa2dlMXh5WEc0Z0lHSnZlQzF6YUdGa2IzYzZJRUJ2Wm1aelpYUWdRR052Ykc5eU8xeHlYRzU5WEhKY2JseHlYRzR1YzJoaFpHOTNYM0psWjNWc1lYSW9RR052Ykc5eU9pQkFjSEpwYldGeWVWOWliM0prWlhKZlkyOXNiM0lwSUh0Y2NseHVJQ0F1YzJoaFpHOTNLREFnTUNBMmNIZ2dNWEI0TENCQVkyOXNiM0lwTzF4eVhHNTlYSEpjYmx4eVhHNHVjMmhoWkc5M1gyeGhjbWRsS0VCamIyeHZjam9nUUhCeWFXMWhjbmxmWW05eVpHVnlYMk52Ykc5eUtTQjdYSEpjYmlBZ0xuTm9ZV1J2ZHlnd0lEQWdNVEp3ZUNBeGNIZ3NJRUJqYjJ4dmNpazdYSEpjYm4xY2NseHVYSEpjYmk1emFHRmtiM2RmYkdsbmFIUmZjbVZuZFd4aGNpZ3BJSHRjY2x4dUlDQXVjMmhoWkc5M1gzSmxaM1ZzWVhJb0tUdGNjbHh1ZlZ4eVhHNWNjbHh1TG5Ob1lXUnZkMTlzYVdkb2RGOXNZWEpuWlNncElIdGNjbHh1SUNBdWMyaGhaRzkzWDJ4aGNtZGxLQ2s3WEhKY2JuMWNjbHh1WEhKY2JpNXphR0ZrYjNkZlpHRnlhMTl5WldkMWJHRnlLQ2tnZTF4eVhHNGdJQzV6YUdGa2IzZGZjbVZuZFd4aGNpaEFjMlZqYjI1a1lYSjVYMkp2Y21SbGNsOWpiMnh2Y2lrN1hISmNibjFjY2x4dVhISmNiaTV6YUdGa2IzZGZaR0Z5YTE5c1lYSm5aU2dwSUh0Y2NseHVJQ0F1YzJoaFpHOTNYMnhoY21kbEtFQnpaV052Ym1SaGNubGZZbTl5WkdWeVgyTnZiRzl5S1R0Y2NseHVmVnh5WEc0aUxDSkFhVzF3YjNKMElDY3VMaTkwYUdWdFpTOTJZWEpwWVdKc1pYTW5PMXh5WEc1QWFXMXdiM0owSUNjdUxpOTBhR1Z0WlM5amIyeHZjbk1uTzF4eVhHNUFhVzF3YjNKMElDY3VMaTkwYUdWdFpTOWxiR3hwY0hOcGN5YzdYSEpjYmx4eVhHNHViM1YwYkdsdVpTMXVZWFpwWjJGMGIzSWdlMXh5WEc0Z0lIQnZjMmwwYVc5dU9pQnlaV3hoZEdsMlpUdGNjbHh1SUNCNkxXbHVaR1Y0T2lBeE8xeHlYRzRnSUcxaGNtZHBiam9nTUR0Y2NseHVJQ0IzYVdSMGFEb2dkbUZ5S0MwdGIzVjBiR2x1WlMxdVlYWnBaMkYwYjNJdGQybGtkR2dwTzF4eVhHNGdJRzkyWlhKbWJHOTNPaUJoZFhSdk8xeHlYRzVjY2x4dUlDQW1MWEJoY21WdWRDQjdYSEpjYmlBZ0lDQjBjbUZ1YzJsMGFXOXVPaUF3TGpOeklHVmhjMlV0YVc0dGIzVjBPMXh5WEc0Z0lIMWNjbHh1WEhKY2JpQWdKbDlmZEdsMGJHVWdlMXh5WEc0Z0lDQWdiV0Z5WjJsdU9pQXdJREUyY0hnN1hISmNiaUFnSUNCb1pXbG5hSFE2SURRd2NIZzdYSEpjYmlBZ0lDQnNhVzVsTFdobGFXZG9kRG9nTkRCd2VEdGNjbHh1SUNBZ0lIQmhaR1JwYm1jNklEQWdNVFp3ZUR0Y2NseHVJQ0FnSUdKdmNtUmxjaTFpYjNSMGIyMDZJREZ3ZUNCemIyeHBaQ0JBY0hKcGJXRnllVjlpYjNKa1pYSmZZMjlzYjNJN1hISmNiaUFnSUNCbWIyNTBMWE5wZW1VNklERTJjSGc3WEhKY2JpQWdJQ0JtYjI1MExYZGxhV2RvZERvZ05EQXdPMXh5WEc0Z0lDQWdiM1psY21ac2IzYzZJR2hwWkdSbGJqdGNjbHh1SUNCOVhISmNibHh5WEc0Z0lDWmZYMjFoYVc0Z2UxeHlYRzRnSUNBZ2NHOXphWFJwYjI0NklISmxiR0YwYVhabE8xeHlYRzRnSUNBZ2VpMXBibVJsZURvZ01UdGNjbHh1SUNBZ0lHMWhjbWRwYmpvZ01EdGNjbHh1SUNBZ0lHOTJaWEptYkc5M09pQm9hV1JrWlc0N1hISmNiaUFnZlZ4eVhHNWNjbHh1SUNBbVgxOXNhWE4wTEZ4eVhHNGdJQ1pmWDNOMVltcGxZM1FzWEhKY2JpQWdKbDlmYVhSbGJTQjdYSEpjYmlBZ0lDQndiM05wZEdsdmJqb2djbVZzWVhScGRtVTdYSEpjYmlBZ0lDQjZMV2x1WkdWNE9pQXlPMXh5WEc0Z0lDQWdiV0Z5WjJsdU9pQXdPMXh5WEc0Z0lDQWdjR0ZrWkdsdVp6b2dNRHRjY2x4dUlDQWdJR3hwYzNRdGMzUjViR1V0ZEhsd1pUb2dibTl1WlR0Y2NseHVJQ0FnSUc5MlpYSm1iRzkzT2lCb2FXUmtaVzQ3WEhKY2JpQWdmVnh5WEc1Y2NseHVJQ0FtWDE5c2FYTjBJSHRjY2x4dUlDQWdJSEJoWkdScGJtYzZJREF1TldWdElEQTdYSEpjYmlBZ2ZWeHlYRzVjY2x4dUlDQW1YMTl6ZFdKcVpXTjBJSHRjY2x4dUlDQWdJSEJoWkdScGJtY3RiR1ZtZERvZ01XVnRPMXh5WEc0Z0lIMWNjbHh1WEhKY2JpQWdKbDlmYVhSbGJTQjdYSEpjYmlBZ0lDQnRZWEpuYVc0NklEQTdYSEpjYmlBZ0lDQnNhVzVsTFdobGFXZG9kRG9nTXpCd2VEdGNjbHh1SUNBZ0lHWnZiblF0YzJsNlpUb2dNVE53ZUR0Y2NseHVJQ0FnSUc5MlpYSm1iRzkzT2lCb2FXUmtaVzQ3WEhKY2JpQWdmVnh5WEc1Y2NseHVJQ0FtWDE5d2JHRmpaV2h2YkdSbGNpQjdYSEpjYmlBZ0lDQndiM05wZEdsdmJqb2dZV0p6YjJ4MWRHVTdYSEpjYmlBZ0lDQjZMV2x1WkdWNE9pQXhPMXh5WEc0Z0lDQWdkRzl3T2lBd08xeHlYRzRnSUNBZ2JHVm1kRG9nTUR0Y2NseHVJQ0FnSUhkcFpIUm9PaUF4TURBbE8xeHlYRzRnSUNBZ2FHVnBaMmgwT2lBek1IQjRPMXh5WEc0Z0lDQWdZbUZqYTJkeWIzVnVaQzFqYjJ4dmNqb2dRR2h2ZG1WeVgySm5YMk52Ykc5eU8xeHlYRzRnSUNBZ1ltOXlaR1Z5TFd4bFpuUTZJREp3ZUNCemIyeHBaQ0JBYzNWalkyVnpjMTlqYjJ4dmNqdGNjbHh1SUNBZ0lIUnlZVzV6YVhScGIyNHRaSFZ5WVhScGIyNDZJREF1TW5NN1hISmNiaUFnSUNCaWIzZ3RjMmw2YVc1bk9pQmliM0prWlhJdFltOTRPMXh5WEc0Z0lDQWdiM1psY21ac2IzYzZJR2hwWkdSbGJqdGNjbHh1SUNCOVhISmNibHh5WEc0Z0lDWmZYMkZ1WTJodmNpQjdYSEpjYmlBZ0lDQXVaV3hzYVhCemFYTW9NU2s3WEhKY2JpQWdJQ0JrYVhOd2JHRjVPaUJpYkc5amF6dGNjbHh1SUNBZ0lIQmhaR1JwYm1jNklEQWdNUzQxWlcwN1hISmNibHh5WEc0Z0lDQWdKanBzYVc1ckxGeHlYRzRnSUNBZ0pqcDJhWE5wZEdWa0xGeHlYRzRnSUNBZ0pqcG9iM1psY2lCN1hISmNiaUFnSUNBZ0lIUmxlSFF0WkdWamIzSmhkR2x2YmpvZ2JtOXVaVHRjY2x4dUlDQWdJQ0FnWTI5c2IzSTZJRUJ6WldOdmJtUmhjbmxmZEdWNGRGOWpiMnh2Y2p0Y2NseHVJQ0FnSUgxY2NseHVYSEpjYmlBZ0lDQW1PbWh2ZG1WeUlIdGNjbHh1SUNBZ0lDQWdZMjlzYjNJNklFQnpkV05qWlhOelgyTnZiRzl5TzF4eVhHNGdJQ0FnZlZ4eVhHNGdJSDFjY2x4dVhISmNiaUFnSmw5ZlkyOWtaU0I3WEhKY2JpQWdJQ0J3WVdSa2FXNW5MWEpwWjJoME9pQXdMalZsYlR0Y2NseHVJQ0I5WEhKY2JseHlYRzRnSUNaZmFHbG5hR3hwWjJoMElIdGNjbHh1SUNBZ0lDWXViM1YwYkdsdVpTMXVZWFpwWjJGMGIzSmZYMkZ1WTJodmNpQjdYSEpjYmlBZ0lDQWdJQ1k2YkdsdWF5eGNjbHh1SUNBZ0lDQWdKanAyYVhOcGRHVmtMRnh5WEc0Z0lDQWdJQ0FtT21odmRtVnlJSHRjY2x4dUlDQWdJQ0FnSUNCamIyeHZjam9nUUhOMVkyTmxjM05mWTI5c2IzSTdYSEpjYmlBZ0lDQWdJQ0FnWm05dWRDMTNaV2xuYUhRNklHSnZiR1E3WEhKY2JpQWdJQ0FnSUgxY2NseHVJQ0FnSUgxY2NseHVJQ0I5WEhKY2JseHlYRzRnSUNaZmMzUnBZMnQ1TEZ4eVhHNGdJQ1pmWm1sNFpXUWdlMXh5WEc0Z0lDQWdaR2x6Y0d4aGVUb2dabXhsZUR0Y2NseHVJQ0FnSUdac1pYZ3RkM0poY0RvZ2JtOTNjbUZ3TzF4eVhHNGdJQ0FnWm14bGVDMWthWEpsWTNScGIyNDZJR052YkhWdGJqdGNjbHh1SUNBZ0lIb3RhVzVrWlhnNklIWmhjaWd0TFc5MWRHeHBibVV0ZWtsdVpHVjRLVHRjY2x4dUlDQWdJSFJ2Y0RvZ01EdGNjbHh1SUNBZ0lHOTJaWEptYkc5M09pQm9hV1JrWlc0N1hISmNibHh5WEc0Z0lDQWdMbTkxZEd4cGJtVXRibUYyYVdkaGRHOXlJSHRjY2x4dUlDQWdJQ0FnSmw5ZmRHbDBiR1VzWEhKY2JpQWdJQ0FnSUNaZlgyMWhhVzRnZTF4eVhHNGdJQ0FnSUNBZ0lHSnZlQzF6YVhwcGJtYzZJR0p2Y21SbGNpMWliM2c3WEhKY2JpQWdJQ0FnSUgxY2NseHVYSEpjYmlBZ0lDQWdJQ1pmWDNScGRHeGxJSHRjY2x4dUlDQWdJQ0FnSUNCbWJHVjRMWE5vY21sdWF6b2dNRHRjY2x4dUlDQWdJQ0FnZlZ4eVhHNWNjbHh1SUNBZ0lDQWdKbDlmYldGcGJpQjdYSEpjYmlBZ0lDQWdJQ0FnWm14bGVEb2dNVHRjY2x4dUlDQWdJQ0FnSUNCdmRtVnlabXh2ZHpvZ1lYVjBienRjY2x4dUlDQWdJQ0FnZlZ4eVhHNGdJQ0FnZlZ4eVhHNGdJSDFjY2x4dVhISmNiaUFnSmw5emRHbGphM2tnZTF4eVhHNGdJQ0FnY0c5emFYUnBiMjQ2SUhOMGFXTnJlVHRjY2x4dUlDQWdJRzFoZUMxb1pXbG5hSFE2SUhaaGNpZ3RMVzkxZEd4cGJtVXRjM1JwWTJ0NUxXaGxhV2RvZENrN1hISmNiaUFnZlZ4eVhHNWNjbHh1SUNBbVgyWnBlR1ZrSUh0Y2NseHVJQ0FnSUhCdmMybDBhVzl1T2lCbWFYaGxaRHRjY2x4dUlDQWdJRzFoZUMxb1pXbG5hSFE2SURFd01DVTdYSEpjYmlBZ2ZWeHlYRzVjY2x4dUlDQW1YMmhwWkdSbGJpQjdYSEpjYmlBZ0lDQmthWE53YkdGNU9pQnViMjVsTzF4eVhHNGdJSDFjY2x4dVhISmNiaUFnSmw5bWIyeGtaV1FnZTF4eVhHNGdJQ0FnZDJsa2RHZzZJREE3WEhKY2JpQWdJQ0J2ZG1WeVpteHZkem9nYUdsa1pHVnVPMXh5WEc0Z0lIMWNjbHh1ZlZ4eVhHNGlMQ0l2S2lwY2NseHVJQ29nWld4c2FYQnphWE11YkdWemN5QXRJT2FXaCthY3JPZWNnZWVWcFNCdGFYaHBibmdnNVllOTVwV3dYSEpjYmlBcUlEMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQxY2NseHVJQ29nUTNKbFlYUmxaQ0JDZVRvZ1dXRnZhR0ZwZUdsaGIxeHlYRzRnS2lCVmNHUmhkR1U2SURJd01qSXVNeTR4TVZ4eVhHNGdLaTljY2x4dVhISmNiaThxSUQwOVBUMDlQU0RtbG9mbW5Lem5uSUhubGFYbGg3M21sYkFnUFQwOVBUMDlJQ292WEhKY2JpNWxiR3hwY0hOcGN5QW9RR3hwYm1WektTQjNhR1Z1SUNoQWJHbHVaWE05TVNrZ2UxeHlYRzRnSUhkb2FYUmxMWE53WVdObE9pQnViM2R5WVhBN1hISmNiaUFnZEdWNGRDMXZkbVZ5Wm14dmR6b2daV3hzYVhCemFYTTdYSEpjYmlBZ2IzWmxjbVpzYjNjNklHaHBaR1JsYmp0Y2NseHVmVnh5WEc1Y2NseHVMbVZzYkdsd2MybHpJQ2hBYkdsdVpYTXBJSGRvWlc0Z0tFQnNhVzVsY3o0OU1pa2dlMXh5WEc0Z0lDMTNaV0pyYVhRdGJHbHVaUzFqYkdGdGNEb2dRR3hwYm1Wek8xeHlYRzRnSUdScGMzQnNZWGs2SUdKdmVEdGNjbHh1SUNBdGQyVmlhMmwwTFdKdmVDMXZjbWxsYm5RNklIWmxjblJwWTJGc08xeHlYRzRnSUhSbGVIUXRiM1psY21ac2IzYzZJR1ZzYkdsd2MybHpPMXh5WEc0Z0lHOTJaWEptYkc5M09pQm9hV1JrWlc0N1hISmNibjFjY2x4dUlpd2lRR2x0Y0c5eWRDQW5MaTR2ZEdobGJXVXZZMjlzYjNKekp6dGNjbHh1UUdsdGNHOXlkQ0FuTGk0dmRHaGxiV1V2Wm05dWRDYzdYSEpjYmtCcGJYQnZjblFnSnk0dUwzUm9aVzFsTDIxcGVHbHVjeWM3WEhKY2JseHlYRzR1YjNWMGJHbHVaUzF5WldGa1pYSWdlMXh5WEc0Z0lDWmZYM0J5YjJkeVpYTnpJSHRjY2x4dUlDQWdJSEJ2YzJsMGFXOXVPaUJtYVhobFpEdGNjbHh1SUNBZ0lIUnZjRG9nTUR0Y2NseHVJQ0FnSUd4bFpuUTZJREE3WEhKY2JpQWdJQ0I2TFdsdVpHVjRPaUF6TzF4eVhHNGdJQ0FnYUdWcFoyaDBPaUEwY0hnN1hISmNiaUFnSUNCM2FXUjBhRG9nTVRBd0pUdGNjbHh1SUNBZ0lHSmhZMnRuY205MWJtUXRZMjlzYjNJNklFQndjbWx0WVhKNVgyTnZiRzl5TzF4eVhHNGdJQ0FnYzJOaGJHVTZJREFnTVR0Y2NseHVJQ0FnSUhSeVlXNXpabTl5YlMxdmNtbG5hVzQ2SUd4bFpuUTdYSEpjYmlBZ0lDQmhibWx0WVhScGIyNDZJRzkxZEd4cGJtVXRjbVZoWkdWeUxYQnliMmR5WlhOeklHeHBibVZoY2p0Y2NseHVJQ0FnSUdGdWFXMWhkR2x2YmkxMGFXMWxiR2x1WlRvZ0xTMVFjbTluY21WemMxUnBiV1ZzYVc1bE8xeHlYRzRnSUgxY2NseHVYSEpjYmlBZ0psOWZjR0Z3WlhJZ2UxeHlYRzRnSUNBZ0xuTm9ZV1J2ZDE5a1lYSnJYM0psWjNWc1lYSW9LVHRjY2x4dUlDQWdJRzFoY21kcGJqb2dNbVZ0SUdGMWRHODdYSEpjYmlBZ0lDQnRZWGd0ZDJsa2RHZzZJREV5TURCd2VEdGNjbHh1SUNBZ0lIQmhaR1JwYm1jNklETXVNbVZ0TzF4eVhHNGdJQ0FnWW05NExYTnBlbWx1WnpvZ1ltOXlaR1Z5TFdKdmVEdGNjbHh1SUNBZ0lHSmhZMnRuY205MWJtUXRZMjlzYjNJNklFQjNhR2wwWlR0Y2NseHVJQ0FnSUc5MlpYSm1iRzkzT2lCb2FXUmtaVzQ3WEhKY2JpQWdmVnh5WEc1Y2NseHVJQ0FtWDE5MGFYUnNaU0I3WEhKY2JpQWdJQ0J0WVhKbmFXNDZJREF1TmpkbGJTQXdPMXh5WEc0Z0lDQWdkR1Y0ZEMxaGJHbG5iam9nWTJWdWRHVnlPMXh5WEc0Z0lDQWdabTl1ZEMxbVlXMXBiSGs2SUVCbWIyNTBYM1JsZUhSZlptRnRhV3g1TzF4eVhHNGdJQ0FnWm05dWRDMTNaV2xuYUhRNklHNXZjbTFoYkR0Y2NseHVJQ0FnSUd4cGJtVXRhR1ZwWjJoME9pQXhMak5sYlR0Y2NseHVJQ0FnSUdadmJuUXRjMmw2WlRvZ05DNHlaVzA3WEhKY2JpQWdJQ0J2ZG1WeVpteHZkem9nYUdsa1pHVnVPMXh5WEc0Z0lIMWNjbHh1WEhKY2JpQWdKbDlmWVhKMGFXTnNaU0I3WEhKY2JpQWdJQ0F1YjNWMGJHbHVaUzF5WldGa1pYSmZYM0J5YjJkeVpYTnpJSHRjY2x4dUlDQWdJQ0FnWkdsemNHeGhlVG9nYm05dVpUdGNjbHh1SUNBZ0lIMWNjbHh1SUNCOVhISmNibHh5WEc0Z0lDWmZhR2xrWkdWdUlIdGNjbHh1SUNBZ0lHUnBjM0JzWVhrNklHNXZibVU3WEhKY2JseHlYRzRnSUNBZ0ppNXZkWFJzYVc1bExYSmxZV1JsY2w5emFXSnNhVzVuSUh0Y2NseHVJQ0FnSUNBZ1pHbHpjR3hoZVRvZ2JtOXVaU0FoYVcxd2IzSjBZVzUwTzF4eVhHNWNjbHh1SUNBZ0lDQWdKaTUzY21Gd2NHVnlJSHRjY2x4dUlDQWdJQ0FnSUNBbUxuQnZjM1FnZTF4eVhHNGdJQ0FnSUNBZ0lDQWdaR2x6Y0d4aGVUb2dibTl1WlR0Y2NseHVJQ0FnSUNBZ0lDQjlYSEpjYmlBZ0lDQWdJSDFjY2x4dUlDQWdJSDFjY2x4dUlDQjlYSEpjYmx4eVhHNGdJQ1l0TFhKbFlXUnBibWNnZTF4eVhHNGdJQ0FnWkdsemNHeGhlVG9nWW14dlkyczdYSEpjYmlBZ0lDQndiM05wZEdsdmJqb2dabWw0WldRN1hISmNiaUFnSUNCNkxXbHVaR1Y0T2lBeU8xeHlYRzRnSUNBZ2RHOXdPaUF3TzF4eVhHNGdJQ0FnYkdWbWREb2dNRHRjY2x4dUlDQWdJSGRwWkhSb09pQXhNREFsTzF4eVhHNGdJQ0FnYUdWcFoyaDBPaUF4TURBbE8xeHlYRzRnSUNBZ2JXRnlaMmx1T2lBd08xeHlYRzRnSUNBZ1ltOTRMWE5wZW1sdVp6b2dZbTl5WkdWeUxXSnZlRHRjY2x4dUlDQWdJSEJoWkdScGJtYzZJRE5sYlNBMFpXMDdYSEpjYmlBZ0lDQmlZV05yWjNKdmRXNWtMV052Ykc5eU9pQkFZbWRmWTI5c2IzSTdYSEpjYmlBZ0lDQnpZM0p2Ykd3dGRHbHRaV3hwYm1VdGJtRnRaVG9nTFMxUWNtOW5jbVZ6YzFScGJXVnNhVzVsTzF4eVhHNGdJQ0FnYjNabGNtWnNiM2M2SUhOamNtOXNiRHRjY2x4dUlDQjlYSEpjYm4xY2NseHVYSEpjYmtCclpYbG1jbUZ0WlhNZ2IzVjBiR2x1WlMxeVpXRmtaWEl0Y0hKdlozSmxjM01nZTF4eVhHNGdJSFJ2SUh0Y2NseHVJQ0FnSUhOallXeGxPaUF4SURFN1hISmNiaUFnZlZ4eVhHNTlYSEpjYmx4eVhHNUFiV1ZrYVdFZ0tHMWhlQzEzYVdSMGFEb2dOVEF3Y0hncElIdGNjbHh1SUNBdWIzVjBiR2x1WlNCN1hISmNiaUFnSUNBbUxYSmxZV1JsY2lCN1hISmNiaUFnSUNBZ0lHOTJaWEptYkc5M09pQm9hV1JrWlc0N1hISmNibHh5WEc0Z0lDQWdJQ0F1YjNWMGJHbHVaUzEwYjI5c1ltRnlJSHRjY2x4dUlDQWdJQ0FnSUNCa2FYTndiR0Y1T2lCbWJHVjRPMXh5WEc0Z0lDQWdJQ0FnSUdac1pYZ3RaR2x5WldOMGFXOXVPaUJ5YjNjN1hISmNiaUFnSUNBZ0lDQWdabXhsZUMxM2NtRndPaUJ1YjNkeVlYQTdYSEpjYmlBZ0lDQWdJQ0FnWVd4cFoyNHRhWFJsYlhNNklHTmxiblJsY2p0Y2NseHVJQ0FnSUNBZ0lDQmhiR2xuYmkxelpXeG1PaUJoZFhSdk8xeHlYRzRnSUNBZ0lDQWdJSFJ2Y0RvZ01UQXdKVHRjY2x4dUlDQWdJQ0FnSUNCeWFXZG9kRG9nTUR0Y2NseHVJQ0FnSUNBZ0lDQjBjbUZ1YzJadmNtMDZJSFJ5WVc1emJHRjBaVmtvTFRRNGNIZ3BPMXh5WEc0Z0lDQWdJQ0FnSUhkcFpIUm9PaUF4TURBbE8xeHlYRzRnSUNBZ0lDQWdJR2hsYVdkb2REb2dORGh3ZUR0Y2NseHVJQ0FnSUNBZ0lDQmliM2d0YzJsNmFXNW5PaUJpYjNKa1pYSXRZbTk0TzF4eVhHNGdJQ0FnSUNBZ0lHSnZjbVJsY2kxMGIzQTZJREZ3ZUNCemIyeHBaQ0JBWW05eVpHVnlYMk52Ykc5eU8xeHlYRzRnSUNBZ0lDQWdJR0poWTJ0bmNtOTFibVF0WTI5c2IzSTZJRUIzYUdsMFpUdGNjbHh1SUNBZ0lDQWdJQ0J3WVdSa2FXNW5PaUF3SURFMmNIZzdYSEpjYmx4eVhHNGdJQ0FnSUNBZ0lDWmZYMkoxZEhSdmJpQjdYSEpjYmlBZ0lDQWdJQ0FnSUNBdWNtRmthWFZ6WDI1dmJtVW9LVHRjY2x4dUlDQWdJQ0FnSUNBZ0lHWnNaWGc2SURFN1hISmNiaUFnSUNBZ0lDQWdJQ0JpYjNKa1pYSTZJRzV2Ym1VN1hISmNiaUFnSUNBZ0lDQWdJQ0JpYjNndGMyaGhaRzkzT2lCdWIyNWxPMXh5WEc0Z0lDQWdJQ0FnSUgxY2NseHVJQ0FnSUNBZ2ZWeHlYRzVjY2x4dUlDQWdJQ0FnSmkwdGNtVmhaR2x1WnlCN1hISmNiaUFnSUNBZ0lDQWdjR0ZrWkdsdVp6b2dNRHRjY2x4dUlDQWdJQ0FnSUNCaVlXTnJaM0p2ZFc1a0xXTnZiRzl5T2lCQWQyaHBkR1U3WEhKY2JpQWdJQ0FnSUNBZ1ltOTRMWE5wZW1sdVp6b2dZbTl5WkdWeUxXSnZlRHRjY2x4dUlDQWdJQ0FnZlZ4eVhHNWNjbHh1SUNBZ0lDQWdKbDlmY0dGd1pYSWdlMXh5WEc0Z0lDQWdJQ0FnSUhCdmMybDBhVzl1T2lCeVpXeGhkR2wyWlR0Y2NseHVJQ0FnSUNBZ0lDQjZMV2x1WkdWNE9pQXhPMXh5WEc0Z0lDQWdJQ0FnSUcxaGNtZHBiam9nTUR0Y2NseHVJQ0FnSUNBZ0lDQndZV1JrYVc1bk9pQXdPMXh5WEc0Z0lDQWdJQ0FnSUdobGFXZG9kRG9nTVRBd0pUdGNjbHh1SUNBZ0lDQWdJQ0JpYjNndGMyaGhaRzkzT2lCdWIyNWxPMXh5WEc0Z0lDQWdJQ0FnSUc5MlpYSm1iRzkzT2lCb2FXUmtaVzQ3WEhKY2JpQWdJQ0FnSUgxY2NseHVYSEpjYmlBZ0lDQWdJQ1pmWDNScGRHeGxJSHRjY2x4dUlDQWdJQ0FnSUNBdVpXeHNhWEJ6YVhNb01TazdYSEpjYmlBZ0lDQWdJQ0FnY0c5emFYUnBiMjQ2SUdGaWMyOXNkWFJsTzF4eVhHNGdJQ0FnSUNBZ0lIb3RhVzVrWlhnNklETTdYSEpjYmlBZ0lDQWdJQ0FnZEc5d09pQXdPMXh5WEc0Z0lDQWdJQ0FnSUd4bFpuUTZJREE3WEhKY2JpQWdJQ0FnSUNBZ2JXRnlaMmx1T2lBd08xeHlYRzRnSUNBZ0lDQWdJSGRwWkhSb09pQXhNREFsTzF4eVhHNGdJQ0FnSUNBZ0lHaGxhV2RvZERvZ05EaHdlRHRjY2x4dUlDQWdJQ0FnSUNCc2FXNWxMV2hsYVdkb2REb2dORGh3ZUR0Y2NseHVJQ0FnSUNBZ0lDQmliM0prWlhJdFltOTBkRzl0T2lBeGNIZ2djMjlzYVdRZ1FHSnZjbVJsY2w5amIyeHZjanRjY2x4dUlDQWdJQ0FnSUNCbWIyNTBMWE5wZW1VNklERXVPR1Z0TzF4eVhHNGdJQ0FnSUNBZ0lHWnZiblF0ZDJWcFoyaDBPaUEwTURBN1hISmNiaUFnSUNBZ0lDQWdZbUZqYTJkeWIzVnVaQzFqYjJ4dmNqb2dRSGRvYVhSbE8xeHlYRzRnSUNBZ0lDQWdJRzkyWlhKbWJHOTNPaUJvYVdSa1pXNDdYSEpjYmlBZ0lDQWdJSDFjY2x4dVhISmNiaUFnSUNBZ0lDWmZYMkZ5ZEdsamJHVWdlMXh5WEc0Z0lDQWdJQ0FnSUcxaGNtZHBiam9nTkRod2VDQXdPMXh5WEc0Z0lDQWdJQ0FnSUdobGFXZG9kRG9nWTJGc1l5Z3hNREFsSUMwZ09UWndlQ2s3WEhKY2JpQWdJQ0FnSUNBZ2NHRmtaR2x1WnpvZ01DQXhMakkxWlcwN1hISmNiaUFnSUNBZ0lDQWdjMk55YjJ4c0xYUnBiV1ZzYVc1bExXNWhiV1U2SUMwdFRXOWlhV3hsVUhKdlozSmxjM05VYVcxbGJHbHVaVHRjY2x4dUlDQWdJQ0FnSUNCdmRtVnlabXh2ZHkxNE9pQm9hV1JrWlc0N1hISmNiaUFnSUNBZ0lDQWdiM1psY21ac2IzY3RlVG9nYzJOeWIyeHNPMXh5WEc1Y2NseHVJQ0FnSUNBZ0lDQXViM1YwYkdsdVpTMXlaV0ZrWlhKZlgzQnliMmR5WlhOeklIdGNjbHh1SUNBZ0lDQWdJQ0FnSUhvdGFXNWtaWGc2SURRN1hISmNiaUFnSUNBZ0lDQWdJQ0JoYm1sdFlYUnBiMjQ2SUc5MWRHeHBibVV0Y21WaFpHVnlMWEJ5YjJkeVpYTnpJR3hwYm1WaGNqdGNjbHh1SUNBZ0lDQWdJQ0FnSUdGdWFXMWhkR2x2YmkxMGFXMWxiR2x1WlRvZ0xTMU5iMkpwYkdWUWNtOW5jbVZ6YzFScGJXVnNhVzVsTzF4eVhHNGdJQ0FnSUNBZ0lDQWdaR2x6Y0d4aGVUb2dZbXh2WTJzN1hISmNiaUFnSUNBZ0lDQWdmVnh5WEc0Z0lDQWdJQ0I5WEhKY2JpQWdJQ0I5WEhKY2JpQWdmVnh5WEc1OVhISmNibHh5WEc1QWJXVmthV0VnY0hKcGJuUWdlMXh5WEc0Z0lHaDBiV3dzWEhKY2JpQWdZbTlrZVNCN1hISmNiaUFnSUNBdktpRG1pWlBsamJEbm1vVGxuN3Jub1lEbHJaZmt2WlBscEtmbHNJOGdLaTljY2x4dUlDQWdJR1p2Ym5RdGMybDZaVG9nTVRKd2REdGNjbHh1SUNBZ0lDOHFJT2FZdnVla3V1aXV2dWU5cnVhV2grV3RsK21pbk9pSnN1V1NqT2lEak9hWnIrbWluT2lKc2lBcUwxeHlYRzRnSUNBZ1ltRmphMmR5YjNWdVpDMWpiMnh2Y2pvZ1FIZG9hWFJsTzF4eVhHNGdJQ0FnWTI5c2IzSTZJRUJ3Y21sdFlYSjVYM1JsZUhSZlkyOXNiM0k3WEhKY2JpQWdJQ0JvWldsbmFIUTZJR2x1YVhScFlXd2dJV2x0Y0c5eWRHRnVkRHRjY2x4dUlDQjlYSEpjYmx4eVhHNGdJQzhxSU9pdXZ1ZTlydW1UdnVhT3BlYWd0K1c4anlBcUwxeHlYRzRnSUdFNmJHbHVheXhjY2x4dUlDQmhPblpwYzJsMFpXUXNYSEpjYmlBZ1lUcG9iM1psY2lCN1hISmNiaUFnSUNCMFpYaDBMV1JsWTI5eVlYUnBiMjQ2SUhWdVpHVnliR2x1WlNBaGFXMXdiM0owWVc1ME8xeHlYRzRnSUNBZ1kyOXNiM0k2SUVCd2NtbHRZWEo1WDJOdmJHOXlPMXh5WEc0Z0lIMWNjbHh1WEhKY2JpQWdMeW9nNlpxUTZKZVA1YXFTNUwyVDVxQ0g1NjIrSUNvdlhISmNiaUFnZG1sa1pXOHNYSEpjYmlBZ1lYVmthVzhnZTF4eVhHNGdJQ0FnWkdsemNHeGhlVG9nYm05dVpTQWhhVzF3YjNKMFlXNTBPMXh5WEc0Z0lIMWNjbHh1WEhKY2JpQWdMeW9nNTZHdTVMK2Q2S0dvNXFDODVaeW81b21UNVkydzVwZTI1NXFFNkw2NTVxR0c1WktNNWErNTZiMlE1cGE1NWJ5UDVyaUY1cG13SUNvdlhISmNiaUFnZEdGaWJHVWdlMXh5WEc0Z0lDQWdkMmxrZEdnNklERXdNQ1U3WEhKY2JpQWdJQ0JpYjNKa1pYSXRZMjlzYkdGd2MyVTZJR052Ykd4aGNITmxPMXh5WEc0Z0lIMWNjbHh1SUNCMGFDeGNjbHh1SUNCMFpDQjdYSEpjYmlBZ0lDQmliM0prWlhJNklERndlQ0J6YjJ4cFpDQkFjSEpwYldGeWVWOWliM0prWlhKZlkyOXNiM0k3WEhKY2JpQWdJQ0J3WVdSa2FXNW5PaUE0Y0hnZ01qQndlRHRjY2x4dUlDQjlYSEpjYmx4eVhHNGdJQzV2ZFhSc2FXNWxJSHRjY2x4dUlDQWdJQ1l0YldWemMyRm5aU3hjY2x4dUlDQWdJQ1l0ZEc5dmJHSmhjaUI3WEhKY2JpQWdJQ0FnSUM4cUlPbWFrT2lYaitTNmh1VzNwZVdGdCthZ2orV1NqT1Mvb2VhQnIrYVBrT2VrdXVhaGhpQXFMMXh5WEc0Z0lDQWdJQ0JrYVhOd2JHRjVPaUJ1YjI1bElDRnBiWEJ2Y25SaGJuUTdYSEpjYmlBZ0lDQjlYSEpjYmx4eVhHNGdJQ0FnSmkxeVpXRmtaWElnZTF4eVhHNGdJQ0FnSUNCa2FYTndiR0Y1T2lCaWJHOWpheUFoYVcxd2IzSjBZVzUwTzF4eVhHNGdJQ0FnSUNCdmRtVnlabXh2ZHpvZ2FHbGtaR1Z1TzF4eVhHNWNjbHh1SUNBZ0lDQWdKbDlmZEdsMGJHVWdlMXh5WEc0Z0lDQWdJQ0FnSUcxaGNtZHBiam9nTVRNdU5IQjBJREFnTWpod2RDQWhhVzF3YjNKMFlXNTBPMXh5WEc0Z0lDQWdJQ0FnSUhSbGVIUXRZV3hwWjI0NklHTmxiblJsY2lBaGFXMXdiM0owWVc1ME8xeHlYRzRnSUNBZ0lDQWdJR1p2Ym5RdGMybDZaVG9nTXpKd2RDQWhhVzF3YjNKMFlXNTBPMXh5WEc0Z0lDQWdJQ0I5WEhKY2JseHlYRzRnSUNBZ0lDQXZLaURsajVibXRvamt1b2JudTUzbHI3bmxycHJrdlkwZ0tpOWNjbHh1SUNBZ0lDQWdKaTB0Y21WaFpHbHVaeUI3WEhKY2JpQWdJQ0FnSUNBZ2NHOXphWFJwYjI0NklISmxiR0YwYVhabElDRnBiWEJ2Y25SaGJuUTdYSEpjYmlBZ0lDQWdJQ0FnYUdWcFoyaDBPaUJoZFhSdklDRnBiWEJ2Y25SaGJuUTdYSEpjYmlBZ0lDQWdJQ0FnY0dGa1pHbHVaem9nTUNBaGFXMXdiM0owWVc1ME8xeHlYRzRnSUNBZ0lDQWdJR0poWTJ0bmNtOTFibVF0WTI5c2IzSTZJRUIzYUdsMFpUdGNjbHh1SUNBZ0lDQWdJQ0J2ZG1WeVpteHZkem9nYUdsa1pHVnVJQ0ZwYlhCdmNuUmhiblE3WEhKY2JpQWdJQ0FnSUgxY2NseHVYSEpjYmlBZ0lDQWdJQzhxSU9tYWtPaVhqK21ZaGVpdnUraS9tK1c2cHVhZG9TQXFMMXh5WEc0Z0lDQWdJQ0FtWDE5d2NtOW5jbVZ6Y3lCN1hISmNiaUFnSUNBZ0lDQWdaR2x6Y0d4aGVUb2dibTl1WlNBaGFXMXdiM0owWVc1ME8xeHlYRzRnSUNBZ0lDQjlYSEpjYmx4eVhHNGdJQ0FnSUNBdktpRG1pWlBsamJEbWw3Ymt1STNtbUw3bnBMcm1yYVBtbG9jZ1JFOU5JT2VhaE9tWXRPVzlzZWFWaU9hZW5DQXFMMXh5WEc0Z0lDQWdJQ0FtWDE5d1lYQmxjaUI3WEhKY2JpQWdJQ0FnSUNBZ1ltOTRMWE5vWVdSdmR6b2dibTl1WlR0Y2NseHVJQ0FnSUNBZ2ZWeHlYRzVjY2x4dUlDQWdJQ0FnY0hKbElIdGNjbHh1SUNBZ0lDQWdJQ0J3WVdSa2FXNW5PaUF4WlcwZ0lXbHRjRzl5ZEdGdWREdGNjbHh1SUNBZ0lDQWdJQ0JpYjNKa1pYSTZJREZ3ZUNCemIyeHBaQ0JBWW05eVpHVnlYMk52Ykc5eUlDRnBiWEJ2Y25SaGJuUTdYSEpjYmlBZ0lDQWdJQ0FnWW05eVpHVnlMWEpoWkdsMWN6b2dOSEI0SUNGcGJYQnZjblJoYm5RN1hISmNiaUFnSUNBZ0lIMWNjbHh1WEhKY2JpQWdJQ0FnSUhCeVpTeGNjbHh1SUNBZ0lDQWdZMjlrWlNCN1hISmNiaUFnSUNBZ0lDQWdZbUZqYTJkeWIzVnVaQzFqYjJ4dmNqb2dRSGRvYVhSbElDRnBiWEJ2Y25SaGJuUTdYSEpjYmlBZ0lDQWdJSDFjY2x4dVhISmNiaUFnSUNBZ0lIUmhZbXhsTEZ4eVhHNGdJQ0FnSUNCcGJXY3NYSEpjYmlBZ0lDQWdJSE4yWnlCN1hISmNiaUFnSUNBZ0lDQWdZbkpsWVdzdGFXNXphV1JsT2lCaGRtOXBaRHRjY2x4dUlDQWdJQ0FnZlZ4eVhHNWNjbHh1SUNBZ0lDQWdMeW9nNW9tQTVweUo1cGFINTZ1ZzVZYUY1YTY1SUVSUFRTRG5tN2psaGJQbm1vVHBncnZsc1lYb2lvTG5ncm5wZzczcG1wRG9sNC9rdW9ZZ0tpOWNjbHh1SUNBZ0lDQWdKbDl6YVdKc2FXNW5JSHRjY2x4dUlDQWdJQ0FnSUNCa2FYTndiR0Y1T2lCdWIyNWxJQ0ZwYlhCdmNuUmhiblE3WEhKY2JpQWdJQ0FnSUgxY2NseHVJQ0FnSUgxY2NseHVJQ0I5WEhKY2JuMWNjbHh1SWl3aUx5b3FYSEpjYmlBcUlISmhaR2wxY3k1c1pYTnpJQzBnNVp5RzZLZVM2SzYrNTcydUlHMXBlR2x1ZUNEbGg3M21sYkJjY2x4dUlDb2dQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBWeHlYRzRnS2lCRGNtVmhkR1ZrSUVKNU9pQlpZVzlvWVdsNGFXRnZYSEpjYmlBcUlGVndaR0YwWlRvZ01qQXlOQzQwTGpFMlhISmNiaUFxTDF4eVhHNWNjbHh1THlvZ1BUMDlQVDA5SU9XY2h1aW5rdWFndCtXOGoraXV2dWU5cnVXSHZlYVZzQ0E5UFQwOVBUMGdLaTljY2x4dUxuSmhaR2wxY3loQWJuVnRPaUF5Y0hncElIdGNjbHh1SUNCaWIzSmtaWEl0Y21Ga2FYVnpPaUJBYm5WdE8xeHlYRzU5WEhKY2JseHlYRzR1Y21Ga2FYVnpYMjV2Ym1Vb0tTQjdYSEpjYmlBZ0xuSmhaR2wxY3lnd0tUdGNjbHh1ZlZ4eVhHNWNjbHh1TG5KaFpHbDFjMTl0YVc1cEtDa2dlMXh5WEc0Z0lDNXlZV1JwZFhNb01uQjRLVHRjY2x4dWZWeHlYRzVjY2x4dUxuSmhaR2wxYzE5emJXRnNiQ2dwSUh0Y2NseHVJQ0F1Y21Ga2FYVnpLRE53ZUNrN1hISmNibjFjY2x4dVhISmNiaTV5WVdScGRYTmZjbVZuZFd4aGNpZ3BJSHRjY2x4dUlDQXVjbUZrYVhWektEUndlQ2s3WEhKY2JuMWNjbHh1WEhKY2JpNXlZV1JwZFhOZmJXVmthWFZ0S0NrZ2UxeHlYRzRnSUM1eVlXUnBkWE1vTlhCNEtUdGNjbHh1ZlZ4eVhHNWNjbHh1TG5KaFpHbDFjMTlzWVhKblpTZ3BJSHRjY2x4dUlDQXVjbUZrYVhWektERXdjSGdwTzF4eVhHNTlYSEpjYmx4eVhHNHVjbUZrYVhWelgyaDFaMlVvS1NCN1hISmNiaUFnTG5KaFpHbDFjeWd4Tm5CNEtUdGNjbHh1ZlZ4eVhHNWNjbHh1TG5KaFpHbDFjMTl5YjNWdVpDZ3BJSHRjY2x4dUlDQXVjbUZrYVhWektETXdjSGdwTzF4eVhHNTlYSEpjYmlJc0lrQnBiWEJ2Y25RZ0p5NHVMM1JvWlcxbEwyTnZiRzl5Y3ljN1hISmNia0JwYlhCdmNuUWdKeTR1TDNSb1pXMWxMM05vWVdSdmR5YzdYSEpjYmx4eVhHNHViM1YwYkdsdVpTMTBiMjlzWW1GeUlIdGNjbHh1SUNCd2IzTnBkR2x2YmpvZ1ptbDRaV1E3WEhKY2JpQWdlaTFwYm1SbGVEb2dPVGs1T1RrN1hISmNiaUFnYldGeVoybHVPaUF3TzF4eVhHNGdJSFJ5WVc1emFYUnBiMjR0WkhWeVlYUnBiMjQ2SURBdU0zTTdYSEpjYmlBZ2IzWmxjbVpzYjNjNklHaHBaR1JsYmp0Y2NseHVYSEpjYmlBZ0psOWZZblYwZEc5dUlIdGNjbHh1SUNBZ0lDNXphR0ZrYjNkZmJHbG5hSFJmY21WbmRXeGhjaWdwTzF4eVhHNGdJQ0FnY0c5emFYUnBiMjQ2SUhKbGJHRjBhWFpsTzF4eVhHNGdJQ0FnZWkxcGJtUmxlRG9nTVR0Y2NseHVJQ0FnSUcxaGNtZHBiam9nTVRCd2VEdGNjbHh1SUNBZ0lIZHBaSFJvT2lBek5uQjRPMXh5WEc0Z0lDQWdhR1ZwWjJoME9pQXpObkI0TzF4eVhHNGdJQ0FnWW05eVpHVnlPaUF4Y0hnZ2MyOXNhV1FnUUhCeWFXMWhjbmxmWW05eVpHVnlYMk52Ykc5eU8xeHlYRzRnSUNBZ1ltOXlaR1Z5TFhKaFpHbDFjem9nTTNCNE8xeHlYRzRnSUNBZ1ltOTRMWE5wZW1sdVp6b2dZbTl5WkdWeUxXSnZlRHRjY2x4dUlDQWdJR0poWTJ0bmNtOTFibVF0WTI5c2IzSTZJRUIzYUdsMFpUdGNjbHh1SUNBZ0lHTjFjbk52Y2pvZ2NHOXBiblJsY2p0Y2NseHVJQ0FnSUhSbGVIUXRZV3hwWjI0NklHTmxiblJsY2p0Y2NseHVJQ0FnSUdOdmJHOXlPaUJBWm05MWNuUm9YM1JsZUhSZlkyOXNiM0k3WEhKY2JpQWdJQ0IwY21GdWMybDBhVzl1T2lCaGJHd2dNQzR6Y3lBd0xqRnpJR1ZoYzJVdGFXNHRiM1YwTzF4eVhHNGdJQ0FnYjNabGNtWnNiM2M2SUdocFpHUmxianRjY2x4dVhISmNiaUFnSUNBbU9taHZkbVZ5SUh0Y2NseHVJQ0FnSUNBZ1kyOXNiM0k2SUVCemRXTmpaWE56WDJOdmJHOXlPMXh5WEc0Z0lDQWdJQ0JpYjNKa1pYSXRZMjlzYjNJNklFQnpkV05qWlhOelgyTnZiRzl5TzF4eVhHNGdJQ0FnSUNCMGNtRnVjMlp2Y20wNklITmpZV3hsS0RFdU16VXBPMXh5WEc0Z0lDQWdmVnh5WEc1Y2NseHVJQ0FnSUNZdWFHbGtaU0I3WEhKY2JpQWdJQ0FnSUdScGMzQnNZWGs2SUc1dmJtVTdYSEpjYmlBZ0lDQjlYSEpjYmlBZ2ZWeHlYRzVjY2x4dUlDQW1YMTloYm1Ob2IzSWdlMXh5WEc0Z0lDQWdKanBzYVc1ckxGeHlYRzRnSUNBZ0pqcDJhWE5wZEdWa0xGeHlYRzRnSUNBZ0pqcG9iM1psY2lCN1hISmNiaUFnSUNBZ0lHTnZiRzl5T2lCQVptOTFjblJvWDNSbGVIUmZZMjlzYjNJN1hISmNiaUFnSUNBZ0lIUmxlSFF0WkdWamIzSmhkR2x2YmpvZ2JtOXVaVHRjY2x4dUlDQWdJSDFjY2x4dVhISmNiaUFnSUNBbU9taHZkbVZ5SUh0Y2NseHVJQ0FnSUNBZ1kyOXNiM0k2SUVCemRXTmpaWE56WDJOdmJHOXlPMXh5WEc0Z0lDQWdmVnh5WEc0Z0lIMWNjbHh1WEhKY2JpQWdKbDlmYVdOdmJpQjdYSEpjYmlBZ0lDQndiM05wZEdsdmJqb2dZV0p6YjJ4MWRHVTdYSEpjYmlBZ0lDQjZMV2x1WkdWNE9pQXlPMXh5WEc0Z0lDQWdkRzl3T2lBMU1DVTdYSEpjYmlBZ0lDQnNaV1owT2lBMU1DVTdYSEpjYmlBZ0lDQjNhV1IwYURvZ01qQndlRHRjY2x4dUlDQWdJR2hsYVdkb2REb2dNakJ3ZUR0Y2NseHVJQ0FnSUhSeVlXNXpabTl5YlRvZ2RISmhibk5zWVhSbEtDMDFNQ1VzSUMwMU1DVXBPMXh5WEc0Z0lDQWdabWxzYkRvZ1kzVnljbVZ1ZEdOdmJHOXlPMXh5WEc0Z0lDQWdiM1psY21ac2IzYzZJR2hwWkdSbGJqdGNjbHh1SUNCOVhISmNibHh5WEc0Z0lDWmZZV04wYVhabElIdGNjbHh1SUNBZ0lDWXViM1YwYkdsdVpTMTBiMjlzWW1GeUlIdGNjbHh1SUNBZ0lDQWdKbDlmWW5WMGRHOXVJSHRjY2x4dUlDQWdJQ0FnSUNCamIyeHZjam9nUUhkb2FYUmxPMXh5WEc0Z0lDQWdJQ0FnSUdKaFkydG5jbTkxYm1RdFkyOXNiM0k2SUVCemRXTmpaWE56WDJOdmJHOXlPMXh5WEc0Z0lDQWdJQ0FnSUdKdmNtUmxjaTFqYjJ4dmNqb2dRSE4xWTJObGMzTmZZMjlzYjNJN1hISmNibHh5WEc0Z0lDQWdJQ0FnSUNZNmFHOTJaWElnZTF4eVhHNGdJQ0FnSUNBZ0lDQWdZMjlzYjNJNklFQjNhR2wwWlR0Y2NseHVJQ0FnSUNBZ0lDQjlYSEpjYmlBZ0lDQWdJSDFjY2x4dUlDQWdJSDFjY2x4dVhISmNiaUFnSUNBdWIzVjBiR2x1WlMxMGIyOXNZbUZ5WDE5aGJtTm9iM0lnZTF4eVhHNGdJQ0FnSUNBbU9teHBibXNzWEhKY2JpQWdJQ0FnSUNZNmRtbHphWFJsWkN4Y2NseHVJQ0FnSUNBZ0pqcG9iM1psY2lCN1hISmNiaUFnSUNBZ0lDQWdZMjlzYjNJNklFQjNhR2wwWlR0Y2NseHVJQ0FnSUNBZ2ZWeHlYRzRnSUNBZ2ZWeHlYRzRnSUgxY2NseHVYSEpjYmlBZ0psOXliM1Z1WkdWa0lIdGNjbHh1SUNBZ0lDWXViM1YwYkdsdVpTMTBiMjlzWW1GeVgxOWlkWFIwYjI0Z2UxeHlYRzRnSUNBZ0lDQmliM0prWlhJdGNtRmthWFZ6T2lBeE9IQjRPMXh5WEc0Z0lDQWdmVnh5WEc0Z0lIMWNjbHh1WEhKY2JpQWdKbDlrYVhOaFlteGxaQ0I3WEhKY2JpQWdJQ0FtTG05MWRHeHBibVV0ZEc5dmJHSmhjaXhjY2x4dUlDQWdJQzV2ZFhSc2FXNWxMWFJ2YjJ4aVlYSWdlMXh5WEc0Z0lDQWdJQ0FtWDE5aGJtTm9iM0k2YkdsdWF5eGNjbHh1SUNBZ0lDQWdKbDlmWVc1amFHOXlPblpwYzJsMFpXUXNYSEpjYmlBZ0lDQWdJQ1pmWDJGdVkyaHZjanBvYjNabGNpeGNjbHh1SUNBZ0lDQWdKbDlmWW5WMGRHOXVJSHRjY2x4dUlDQWdJQ0FnSUNCamRYSnpiM0k2SUc1dmRDMWhiR3h2ZDJWa08xeHlYRzRnSUNBZ0lDQWdJR052Ykc5eU9pQkFabTkxY25Sb1gzUmxlSFJmWTI5c2IzSTdYSEpjYmlBZ0lDQWdJQ0FnWW05eVpHVnlMV052Ykc5eU9pQkFabTkxY25Sb1gzUmxlSFJmWTI5c2IzSTdYSEpjYmx4eVhHNGdJQ0FnSUNBZ0lDWTZhRzkyWlhJZ2UxeHlYRzRnSUNBZ0lDQWdJQ0FnWTI5c2IzSTZJRUJtYjNWeWRHaGZkR1Y0ZEY5amIyeHZjanRjY2x4dUlDQWdJQ0FnSUNBZ0lHSnZjbVJsY2kxamIyeHZjam9nUUdadmRYSjBhRjkwWlhoMFgyTnZiRzl5TzF4eVhHNGdJQ0FnSUNBZ0lIMWNjbHh1SUNBZ0lDQWdmVnh5WEc1Y2NseHVJQ0FnSUNBZ0psOWZZblYwZEc5dUlIdGNjbHh1SUNBZ0lDQWdJQ0JpWVdOclozSnZkVzVrTFdOdmJHOXlPaUJBWkdsellXSnNaV1JmWW1kZlkyOXNiM0k3WEhKY2JpQWdJQ0FnSUgxY2NseHVJQ0FnSUgxY2NseHVJQ0I5WEhKY2JseHlYRzRnSUNaZmRIUmlMRnh5WEc0Z0lDWmZZblIwSUh0Y2NseHVJQ0FnSUd4bFpuUTZJRFV3SlR0Y2NseHVJQ0FnSUhSeVlXNXpabTl5YlRvZ2RISmhibk5zWVhSbFdDZ3ROVEFsS1R0Y2NseHVYSEpjYmlBZ0lDQXViM1YwYkdsdVpTMTBiMjlzWW1GeVgxOWlkWFIwYjI0Z2UxeHlYRzRnSUNBZ0lDQmthWE53YkdGNU9pQnBibXhwYm1VdFlteHZZMnM3WEhKY2JpQWdJQ0I5WEhKY2JpQWdmVnh5WEc1Y2NseHVJQ0FtWDNSMFlpQjdYSEpjYmlBZ0lDQjBiM0E2SURFeWNIZzdYSEpjYmx4eVhHNGdJQ0FnSmk1dmRYUnNhVzVsTFhSdmIyeGlZWEpmYUdsa1pHVnVJSHRjY2x4dUlDQWdJQ0FnZEc5d09pQXROVFp3ZUR0Y2NseHVJQ0FnSUgxY2NseHVJQ0I5WEhKY2JseHlYRzRnSUNaZlluUjBJSHRjY2x4dUlDQWdJR0p2ZEhSdmJUb2dNVEp3ZUR0Y2NseHVYSEpjYmlBZ0lDQW1MbTkxZEd4cGJtVXRkRzl2YkdKaGNsOW9hV1JrWlc0Z2UxeHlYRzRnSUNBZ0lDQmliM1IwYjIwNklDMDFObkI0TzF4eVhHNGdJQ0FnZlZ4eVhHNGdJSDFjY2x4dVhISmNiaUFnSmw5eWRHd3NYSEpjYmlBZ0psOXNkSElnZTF4eVhHNGdJQ0FnZEhKaGJuTm1iM0p0T2lCMGNtRnVjMnhoZEdWWktDMDFNQ1VwTzF4eVhHNGdJQ0FnZDJsa2RHZzZJRFUyY0hnN1hISmNiaUFnZlZ4eVhHNWNjbHh1SUNBbVgzSjBiQ0I3WEhKY2JpQWdJQ0IwYjNBNklEVXdKVHRjY2x4dUlDQWdJSEpwWjJoME9pQXhNbkI0TzF4eVhHNWNjbHh1SUNBZ0lDWXViM1YwYkdsdVpTMTBiMjlzWW1GeVgyaHBaR1JsYmlCN1hISmNiaUFnSUNBZ0lISnBaMmgwT2lBdE9EWndlRHRjY2x4dUlDQWdJSDFjY2x4dUlDQjlYSEpjYmx4eVhHNGdJQ1pmYkhSeUlIdGNjbHh1SUNBZ0lIUnZjRG9nTlRBbE8xeHlYRzRnSUNBZ2JHVm1kRG9nTVRKd2VEdGNjbHh1WEhKY2JpQWdJQ0FtTG05MWRHeHBibVV0ZEc5dmJHSmhjbDlvYVdSa1pXNGdlMXh5WEc0Z0lDQWdJQ0JzWldaME9pQXRPRFp3ZUR0Y2NseHVJQ0FnSUgxY2NseHVJQ0I5WEhKY2JseHlYRzRnSUNaZmRIUmlMRnh5WEc0Z0lDWmZjblJzTEZ4eVhHNGdJQ1pmWW5SMExGeHlYRzRnSUNaZmJIUnlJSHRjY2x4dUlDQWdJQzV2ZFhSc2FXNWxMWFJ2YjJ4aVlYSmZYMkoxZEhSdmJpQjdYSEpjYmlBZ0lDQWdJQ1l1YjNWMGJHbHVaUzEwYjI5c1ltRnlYMmhwWkdSbGJpQjdYSEpjYmlBZ0lDQWdJQ0FnWkdsemNHeGhlVG9nYm05dVpUdGNjbHh1SUNBZ0lDQWdmVnh5WEc0Z0lDQWdmVnh5WEc0Z0lIMWNjbHh1ZlZ4eVhHNGlYWDA9ICovXG4iXSwiZmlsZSI6ImNzcy9kb2NzLm1pbi5jc3MifQ== */ diff --git a/docs/css/example.css b/docs/css/example.css index f0fc74ed..d24dd941 100644 --- a/docs/css/example.css +++ b/docs/css/example.css @@ -428,6 +428,29 @@ code, .outline-icon_hidden { display: none; } +/* ===== Scrollbar ===== */ +::-webkit-scrollbar { + width: 7px; + height: 7px; + -webkit-border-radius: 5px; +} +::-webkit-scrollbar-track-piece { + -webkit-border-radius: 5px; +} +::-webkit-scrollbar-thumb:vertical { + background-color: rgba(0, 0, 0, 0.25); + -webkit-border-radius: 5px; +} +::-webkit-scrollbar-thumb:horizontal { + background-color: rgba(0, 0, 0, 0.25); + -webkit-border-radius: 5px; +} +::-webkit-scrollbar-thumb:hover { + background-color: rgba(0, 0, 0, 0.35); +} +::-webkit-scrollbar:hover { + background-color: rgba(0, 0, 0, 0.15); +} .outline-heading { position: relative; z-index: 1; @@ -1161,7 +1184,6 @@ code, display: none !important; } } -/* ========== buttons.theme - 按钮导航样式 ========== */ .outline-toolbar { position: fixed; z-index: 99999; @@ -1311,203 +1333,5 @@ code, .outline-toolbar_ltr .outline-toolbar__button.outline-toolbar_hidden { display: none; } -.outline-message { - border-radius: 3px; - -webkit-box-shadow: 0 0 6px 1px #dcdfe6; - box-shadow: 0 0 6px 1px #dcdfe6; - position: fixed; - z-index: 9999; - opacity: 0.1; - top: -50px; - left: 50%; - height: 40px; - margin: 0; - padding: 0 50px; - line-height: 40px; - font-size: 13px; - background-color: #fff; - color: #666; - -webkit-transition: all 0.5s ease-in-out; - transition: all 0.5s ease-in-out; - -webkit-transform: translateX(-50%); - transform: translateX(-50%); - overflow: hidden; -} -.outline-message__content { - white-space: nowrap; - text-overflow: ellipsis; - margin: 0; - max-width: 700px; - height: 40px; - line-height: 40px; - font-size: 13px; - color: #666; - overflow: hidden; -} -.outline-message__close, -.outline-message__icon { - position: absolute; - z-index: 2; - top: 0; - width: 40px; - height: 40px; - line-height: 40px; - text-align: center; - overflow: hidden; -} -.outline-message__icon { - left: 0; - color: #fff; -} -.outline-message__icon .outline-icon { - position: absolute; - z-index: 2; - top: 50%; - left: 50%; - -webkit-transform: translate(-50%, -50%); - transform: translate(-50%, -50%); -} -.outline-message__close { - right: 0; - cursor: pointer; - color: #999; -} -.outline-message__close .outline-icon { - position: absolute; - z-index: 2; - top: 50%; - left: 50%; - -webkit-transform: translate(-50%, -50%); - transform: translate(-50%, -50%); -} -.outline-message__close:hover { - color: #666; -} -.outline-message_info .outline-message__icon { - background-color: #507afe; -} -.outline-message_warning .outline-message__icon { - background-color: #ff9901; -} -.outline-message_success .outline-message__icon { - background-color: #058942; -} -.outline-message_error .outline-message__icon { - background-color: #ff5d5d; -} -.outline-message_plain { - min-width: 190px; - padding: 0 50px 0 15px; -} -.outline-message_plain.outline-message_info { - border-left: 5px solid #507afe; - background-color: #ecf8ff; -} -.outline-message_plain.outline-message_warning { - border-left: 5px solid #ff9901; - background-color: #fffbe6; -} -.outline-message_plain.outline-message_success { - border-left: 5px solid #058942; - background-color: #e1f6eb; -} -.outline-message_plain.outline-message_error { - border-left: 5px solid #ff5d5d; - background-color: #fff1f0; -} -.outline-message_plain .outline-message__icon { - width: 0; - display: none; -} -.outline-message_plain .outline-message__icon .outline-icon { - display: none; -} -.outline-message_light { - min-width: 180px; - padding: 0 40px; -} -.outline-message_light.outline-message_info .outline-message__icon { - color: #507afe; -} -.outline-message_light.outline-message_warning .outline-message__icon { - color: #ff9901; -} -.outline-message_light.outline-message_success .outline-message__icon { - color: #058942; -} -.outline-message_light.outline-message_error .outline-message__icon { - color: #ff5d5d; -} -.outline-message_light .outline-message__icon { - background-color: #fff; -} -.outline-message_round { - border-radius: 20px; -} -.outline-message_round.outline-message_default { - min-width: 180px; - padding: 0 40px; -} -.outline-message_round.outline-message_default .outline-message__icon { - border-radius: 10px; - top: 10px; - left: 10px; - width: 20px; - height: 20px; - line-height: 20px; -} -.outline-message_round.outline-message_default.outline-message_full-width { - min-width: 200px; - padding: 0 20px 0 40px; -} -.outline-message_round.outline-message_plain { - min-width: 195px; - padding: 0 40px 0 20px; -} -.outline-message_round.outline-message_plain.outline-message_full-width { - min-width: 215px; - padding: 0 20px; -} -.outline-message_full-width { - min-width: 200px; - padding: 0 10px 0 50px; -} -.outline-message_full-width.outline-message_plain { - min-width: 230px; - padding: 0 10px 0 15px; -} -.outline-message_full-width.outline-message_light { - min-width: 210px; - padding: 0 10px 0 40px; -} -.outline-message_visible { - opacity: 1; -} -.outline-message_hidden { - display: none; -} -/* ===== Scrollbar ===== */ -::-webkit-scrollbar { - width: 7px; - height: 7px; - -webkit-border-radius: 5px; -} -::-webkit-scrollbar-track-piece { - -webkit-border-radius: 5px; -} -::-webkit-scrollbar-thumb:vertical { - background-color: rgba(0, 0, 0, 0.25); - -webkit-border-radius: 5px; -} -::-webkit-scrollbar-thumb:horizontal { - background-color: rgba(0, 0, 0, 0.25); - -webkit-border-radius: 5px; -} -::-webkit-scrollbar-thumb:hover { - background-color: rgba(0, 0, 0, 0.35); -} -::-webkit-scrollbar:hover { - background-color: rgba(0, 0, 0, 0.15); -} -/*# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLzxpbnB1dCBjc3MgMj4iLCJzY3JvbGxiYXIubGVzcyIsInNlY3Rpb24ubGVzcyIsImNhc2UubGVzcyIsInBhZ2VyLmxlc3MiLCIuLi8uLi90aGVtZS9zaGFkb3cubGVzcyIsIi4uLy4uL3RoZW1lL3ZhcmlhYmxlcy5sZXNzIiwiLi4vLi4vdGhlbWUvaWNvbnMubGVzcyIsIi4uLy4uL3RoZW1lL2FuY2hvcnMubGVzcyIsIi4uLy4uL3RoZW1lL2RyYXdlci5sZXNzIiwiLi4vLi4vdGhlbWUvbmF2aWdhdG9yLmxlc3MiLCIuLi8uLi90aGVtZS9lbGxpcHNpcy5sZXNzIiwiLi4vLi4vdGhlbWUvcmVhZGVyLmxlc3MiLCIuLi8uLi90aGVtZS9yYWRpdXMubGVzcyIsIi4uLy4uL3RoZW1lL3Rvb2xiYXIubGVzcyIsIi4uLy4uL3RoZW1lL21lc3NhZ2UubGVzcyIsIi4uLy4uL3RoZW1lL3Njcm9sbGJhci5sZXNzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLDJCQUEyQjtBQ0MzQjtFQUNFLFdBQUE7RUFDQSxZQUFBO0VBQ0EsMkJBQUE7Q0RDRDtBQ0VEO0VBQ0UsMkJBQUE7Q0RBRDtBQ0dEO0VBQ0Usc0NBQUE7RUFDQSwyQkFBQTtDREREO0FDSUQ7RUFDRSxzQ0FBQTtFQUNBLDJCQUFBO0NERkQ7QUNLRDtFQUNFLHNDQUFBO0NESEQ7QUNNRDtFQUNFLHNDQUFBO0NESkQ7QUVwQkQ7RUFDRSxjQUFBO0VBQ0EsaUJBQUE7Q0ZzQkQ7QUVwQkM7OztFQUdFLFVBQUE7RUFDQSxlQUFBO0VBQ0EsaUJBQUE7Q0ZzQkg7QUVuQkM7RUFDRSxZQUFBO0NGcUJIO0FFbEJDO0VBQ0UsZUFBQTtFQUNBLGtCQUFBO0NGb0JIO0FFakJDO0VBQ0UsaUJBQUE7RUFDQSxZQUFBO0NGbUJIO0FFaEJDO0VBQ0UsZUFBQTtFQUNBLFlBQUE7Q0ZrQkg7QUVmQzs7O0VBR0UsVUFBQTtFQUNBLFdBQUE7RUFDQSxpQkFBQTtDRmlCSDtBRWRDO0VBQ0UsbUJBQUE7RUFDQSxXQUFB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OEtRLFVBQUE7RUFDQSxXQUFBO0VBQ0EsWUFBQTtFQUNBLGFBQUE7RUFDQSxrQkFBQTtDZitvQ1Q7QWU1b0NPO0VBQ0UsaUJBQUE7RUFDQSx1QkFBQTtDZjhvQ1Q7QWUxb0NLO0VBQ0UsaUJBQUE7RUFDQSx1QkFBQTtDZjRvQ1A7QWUxb0NPO0VBQ0UsaUJBQUE7RUFDQSxnQkFBQTtDZjRvQ1Q7QWV0b0NDO0VBQ0UsaUJBQUE7RUFDQSx1QkFBQTtDZndvQ0g7QWVyb0NLO0VBQ0UsaUJBQUE7RUFDQSx1QkFBQTtDZnVvQ1A7QWVwb0NLO0VBQ0UsaUJBQUE7RUFDQSx1QkFBQTtDZnNvQ1A7QWVqb0NDO0VBQ0UsV0FBQTtDZm1vQ0g7QWVob0NDO0VBQ0UsY0FBQTtDZmtvQ0g7QUFDRCwyQkFBMkI7QWdCeDJDM0I7RUFDRSxXQUFBO0VBQ0EsWUFBQTtFQUNBLDJCQUFBO0NoQjAyQ0Q7QWdCeDJDQztFQUNFLDJCQUFBO0NoQjAyQ0g7QWdCdDJDRztFQUNFLHNDQUFBO0VBQ0EsMkJBQUE7Q2hCdzJDTDtBZ0JyMkNHO0VBQ0Usc0NBQUE7RUFDQSwyQkFBQTtDaEJ1MkNMO0FnQnAyQ0c7RUFDRSxzQ0FBQTtDaEJzMkNMO0FnQmwyQ0M7RUFDRSxzQ0FBQTtDaEJvMkNIIiwiZmlsZSI6ImV4YW1wbGUuY3NzIiwic291cmNlc0NvbnRlbnQiOlsiLyogPT09PT0gU2Nyb2xsYmFyID09PT09ICovXG46Oi13ZWJraXQtc2Nyb2xsYmFyIHtcbiAgd2lkdGg6IDdweDtcbiAgaGVpZ2h0OiA3cHg7XG4gIC13ZWJraXQtYm9yZGVyLXJhZGl1czogNXB4O1xufVxuOjotd2Via2l0LXNjcm9sbGJhci10cmFjay1waWVjZSB7XG4gIC13ZWJraXQtYm9yZGVyLXJhZGl1czogNXB4O1xufVxuOjotd2Via2l0LXNjcm9sbGJhci10aHVtYjp2ZXJ0aWNhbCB7XG4gIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMCwgMCwgMCwgMC4yNSk7XG4gIC13ZWJraXQtYm9yZGVyLXJhZGl1czogNXB4O1xufVxuOjotd2Via2l0LXNjcm9sbGJhci10aHVtYjpob3Jpem9udGFsIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjI1KTtcbiAgLXdlYmtpdC1ib3JkZXItcmFkaXVzOiA1cHg7XG59XG46Oi13ZWJraXQtc2Nyb2xsYmFyOmhvdmVyIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjE1KTtcbn1cbjo6LXdlYmtpdC1zY3JvbGxiYXItdGh1bWI6aG92ZXIge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuMzUpO1xufVxuLnNlY3Rpb24ge1xuICBtYXJnaW46IDFlbSAwO1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLnNlY3Rpb25fX2hlYWRlcixcbi5zZWN0aW9uX19jb250ZW50LFxuLnNlY3Rpb25fX2Zvb3RlciB7XG4gIG1hcmdpbjogMDtcbiAgcGFkZGluZzogMCAzZW07XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4uc2VjdGlvbl9fdGl0bGUge1xuICBjb2xvcjogIzY2Njtcbn1cbi5zZWN0aW9uX19oMyB7XG4gIGNvbG9yOiAjNTA3YWZlO1xuICBmb250LXNpemU6IDEuMzVlbTtcbn1cbi5zZWN0aW9uX19oNCB7XG4gIGZvbnQtc2l6ZTogMS4xZW07XG4gIGNvbG9yOiAjNjY2O1xufVxuLnNlY3Rpb25fX2g1IHtcbiAgZm9udC1zaXplOiAxZW07XG4gIGNvbG9yOiAjOTk5O1xufVxuLnNlY3Rpb25fX2RsLFxuLnNlY3Rpb25fX2R0LFxuLnNlY3Rpb25fX2RkIHtcbiAgbWFyZ2luOiAwO1xuICBwYWRkaW5nOiAwO1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLnNlY3Rpb25fX2RsIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICB6LWluZGV4OiAxO1xufVxuLnNlY3Rpb25fX2R0IHtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xufVxuLnNlY3Rpb25fX2RkIHtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICBjb2xvcjogIzA1ODk0Mjtcbn1cbi5zZWN0aW9uX19wcmUge1xuICBtYXJnaW46IDJlbSAwO1xuICBwYWRkaW5nOiAxZW07XG4gIGZvbnQtc2l6ZTogMTRweDtcbiAgbGluZS1oZWlnaHQ6IDE1MCU7XG4gIHRleHQtYWxpZ246IGxlZnQ7XG4gIGJhY2tncm91bmQtY29sb3I6ICNmYWZhZmE7XG4gIGJvcmRlcjogMXB4IHNvbGlkICNkZGQ7XG4gIGJvcmRlci1yYWRpdXM6IDRweDtcbiAgY29sb3I6ICM2NjY7XG4gIG92ZXJmbG93OiBhdXRvO1xufVxuLnNlY3Rpb25fX2NvZGUge1xuICBkaXNwbGF5OiBibG9jaztcbiAgbWFyZ2luOiAwIGF1dG87XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4uc2VjdGlvbl9fZm9vdGVyIHtcbiAgYm9yZGVyLXRvcDogMXB4IHNvbGlkICNkZGQ7XG4gIG1hcmdpbi10b3A6IDNlbTtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ZhZmFmYTtcbiAgY29sb3I6ICM5OTk7XG59XG4uc2VjdGlvbl9fdGFibGUge1xuICBtYXJnaW46IDFlbSBhdXRvO1xuICB3aWR0aDogMTAwJTtcbiAgYm9yZGVyLXRvcDogMXB4IHNvbGlkICNkZGQ7XG59XG4uc2VjdGlvbl9fdGgsXG4uc2VjdGlvbl9fdGQge1xuICBwYWRkaW5nOiA1cHggMTZweDtcbiAgbGluZS1oZWlnaHQ6IDI2cHg7XG4gIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjZGRkO1xufVxuLnNlY3Rpb25fX3RoIHtcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmFmYWZhO1xufVxuQG1lZGlhIChtYXgtd2lkdGg6IDUwMHB4KSB7XG4gIC5zZWN0aW9uX19oZWFkZXIsXG4gIC5zZWN0aW9uX19jb250ZW50IHtcbiAgICBwYWRkaW5nOiAwIDFlbTtcbiAgfVxufVxuLmNhc2Uge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIHotaW5kZXg6IDE7XG4gIGRpc3BsYXk6IGdyaWQ7XG4gIGdyaWQtdGVtcGxhdGUtY29sdW1uczogcmVwZWF0KDIsIDFmcik7XG4gIGdhcDogNDBweDtcbiAgcGFkZGluZzogMWVtO1xuICBib3JkZXItdG9wOiAxcHggc29saWQgI2RkZDtcbiAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNkZGQ7XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4uY2FzZTphZnRlciB7XG4gIGNvbnRlbnQ6ICcnO1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHotaW5kZXg6IDI7XG4gIHRvcDogMDtcbiAgbGVmdDogNTAlO1xuICBoZWlnaHQ6IDEwMCU7XG4gIHdpZHRoOiAwO1xuICBib3JkZXItbGVmdDogMXB4IHNvbGlkICNkZGQ7XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4uY2FzZV9fcHJlLFxuLmNhc2VfX3RleHRhcmVhIHtcbiAgZm9udC1zaXplOiAxM3B4O1xuICBsaW5lLWhlaWdodDogMTUwJTtcbn1cbi5jYXNlX19wcmUsXG4uY2FzZV9fY29kZSxcbi5jYXNlX190ZXh0YXJlYSB7XG4gIGZvbnQtZmFtaWx5OiAnQ291cmllciBOZXcnLCBDb25zb2xhcywgR2VvcmdpYSwgQXJpYWwsIHNhbnMtc2VyaWY7XG59XG4uY2FzZV9fcHJlIHtcbiAgbWFyZ2luOiAwO1xuICBwYWRkaW5nOiAxZW07XG4gIGJhY2tncm91bmQtY29sb3I6ICNmYWZhZmE7XG4gIGhlaWdodDogMTAwJTtcbiAgYm9yZGVyLXJhZGl1czogNHB4O1xuICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICBvdmVyZmxvdzogYXV0bztcbn1cbi5jYXNlX190b29sYmFyIHtcbiAgbWFyZ2luOiAwIGF1dG87XG4gIGhlaWdodDogMzZweDtcbiAgbGluZS1oZWlnaHQ6IDM2cHg7XG4gIGZvbnQtc2l6ZTogMTRweDtcbiAgcGFkZGluZzogMCAxNnB4O1xuICB0ZXh0LWFsaWduOiByaWdodDtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi5jYXNlX19hY3Rpb24sXG4uY2FzZV9fcmVtb3ZlIHtcbiAgY3Vyc29yOiBwb2ludGVyO1xuICBjb2xvcjogIzA1ODk0MjtcbiAgdXNlci1zZWxlY3Q6IG5vbmU7XG59XG4uY2FzZV9fYWN0aW9uIHtcbiAgZm9udC1zaXplOiAxM3B4O1xuICBwYWRkaW5nLWxlZnQ6IDEwcHg7XG59XG4uY2FzZV9fYWN0aW9uOmZpcnN0LWNoaWxkIHtcbiAgcGFkZGluZy1sZWZ0OiAwO1xufVxuLmNhc2VfX3JlbW92ZSB7XG4gIGZsb2F0OiByaWdodDtcbn1cbi5jYXNlX19jb25zb2xlIHtcbiAgbWFyZ2luOiAwIGF1dG87XG4gIGhlaWdodDogMTgwcHg7XG4gIGJvcmRlcjogMXB4IHNvbGlkICNkZGQ7XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4uY2FzZV9fdGV4dGFyZWEge1xuICBtYXJnaW46IDAgYXV0bztcbiAgd2lkdGg6IDEwMCU7XG4gIGhlaWdodDogMTAwJTtcbiAgYm9yZGVyOiBub25lO1xuICBvdXRsaW5lOiBub25lO1xuICBwYWRkaW5nOiAxZW07XG4gIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gIG92ZXJmbG93OiBhdXRvO1xufVxuLmNhc2VfX2xpc3QsXG4uY2FzZV9faXRlbSB7XG4gIG1hcmdpbjogMDtcbiAgcGFkZGluZzogMDtcbiAgbGlzdC1zdHlsZS10eXBlOiBub25lO1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLmNhc2VfX2xpc3Qge1xuICBoZWlnaHQ6IDM2MHB4O1xuICBib3JkZXItdG9wOiAxcHggc29saWQgI2RkZDtcbiAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNkZGQ7XG4gIGZvbnQtc2l6ZTogMTNweDtcbiAgb3ZlcmZsb3c6IGF1dG87XG59XG4uY2FzZV9faXRlbSB7XG4gIGhlaWdodDogMzZweDtcbiAgbGluZS1oZWlnaHQ6IDM2cHg7XG4gIGN1cnNvcjogcG9pbnRlcjtcbiAgcGFkZGluZzogMCAxNnB4O1xufVxuLmNhc2VfX2l0ZW06aG92ZXIge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjdmOGY5O1xufVxuLyoqXG4gKiBtaXhpbnMubGVzcyAtIOW3peWFt+WHveaVsFxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogQ3JlYXRlZCBCeTogWWFvaGFpeGlhb1xuICogVXBkYXRlOiAyMDIyLjMuMTFcbiAqL1xuLyoqXG4gKiByYWRpdXMubGVzcyAtIOWchuinkuiuvue9riBtaXhpbngg5Ye95pWwXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBDcmVhdGVkIEJ5OiBZYW9oYWl4aWFvXG4gKiBVcGRhdGU6IDIwMjQuNC4xNlxuICovXG4vKiA9PT09PT0g5ZyG6KeS5qC35byP6K6+572u5Ye95pWwID09PT09PSAqL1xuLnBhcGVyIHtcbiAgYm94LXNoYWRvdzogMCAwIDZweCAxcHggI2RjZGZlNjtcbiAgbWFyZ2luOiAzZW0gYXV0bztcbiAgbWF4LXdpZHRoOiAxMjAwcHg7XG4gIHBhZGRpbmc6IDJlbTtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjtcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbn1cbi5wYXBlci5mbGV4IHtcbiAgZGlzcGxheTogZmxleDtcbiAgZmxleC1kaXJlY3Rpb246IHJvdztcbiAgZmxleC13cmFwOiBub3dyYXA7XG4gIG1hcmdpbjogMDtcbiAgd2lkdGg6IDEwMCU7XG4gIG1heC13aWR0aDogMTAwJTtcbiAgaGVpZ2h0OiAxMDAlO1xuICBwYWRkaW5nOiAwO1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLnBhcGVyLmZsZXggLmFydGljbGUge1xuICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICB3aWR0aDogMTAwJTtcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbn1cbi5wYXBlci5mbGV4IC5hcnRpY2xlX19tYWluIHtcbiAgaGVpZ2h0OiAxMDAlO1xuICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICBvdmVyZmxvdzogYXV0bztcbn1cbi5wYXBlci5mbGV4IC5hcnRpY2xlX19hc2lkZSB7XG4gIGJvcmRlci1yaWdodDogMXB4IHNvbGlkICNkY2RmZTY7XG59XG4uaGVhZGVyIHtcbiAgcG9zaXRpb246IHN0aWNreTtcbiAgei1pbmRleDogMztcbiAgdG9wOiAwO1xuICBtYXJnaW46IDAgYXV0bztcbiAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNkZGQ7XG4gIGJhY2tncm91bmQtY29sb3I6ICNmZmY7XG4gIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgdHJhbnNpdGlvbi1kdXJhdGlvbjogMC4zcztcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi5oZWFkZXJfc3RpY2t5IHtcbiAgcGFkZGluZy1sZWZ0OiAyNjBweDtcbn1cbi5hcnRpY2xlIHtcbiAgZGlzcGxheTogZmxleDtcbiAgZmxleC1kaXJlY3Rpb246IHJvdztcbiAgZmxleC13cmFwOiBub3dyYXA7XG4gIHBhZGRpbmc6IDJlbSAwO1xuICBmb250LXNpemU6IDE2cHg7XG4gIGxpbmUtaGVpZ2h0OiAxNTAlO1xufVxuLmFydGljbGVfX21haW4ge1xuICBmbGV4OiAxO1xuICBwYWRkaW5nOiAwIDJlbTtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi5hcnRpY2xlX19tYWluIC5zZWN0aW9uIHtcbiAgb3ZlcmZsb3c6IHZpc2libGU7XG59XG4uYXJ0aWNsZV9fbWFpbiAuc2VjdGlvbl9fY29udGVudCxcbi5hcnRpY2xlX19tYWluIC5zZWN0aW9uX19mb290ZXIsXG4uYXJ0aWNsZV9fbWFpbiAuc2VjdGlvbl9faGVhZGVyIHtcbiAgb3ZlcmZsb3c6IHZpc2libGU7XG59XG4uYXJ0aWNsZV9fbWFpbiAuc2VjdGlvbl9faGVhZGVyLFxuLmFydGljbGVfX21haW4gLnNlY3Rpb25fX2NvbnRlbnQge1xuICBtYXJnaW46IDA7XG59XG4uYXJ0aWNsZV9fYXNpZGUge1xuICBmbGV4LXNocmluazogMDtcbiAgd2lkdGg6IDI0MHB4O1xuICBib3JkZXItbGVmdDogMXB4IHNvbGlkICNkZGQ7XG59XG4uYXJ0aWNsZV9fYXNpZGUubHRyIHtcbiAgYm9yZGVyLXJpZ2h0OiAxcHggc29saWQgI2RkZDtcbiAgYm9yZGVyLWxlZnQ6IG5vbmU7XG59XG4uYXJ0aWNsZV9fYXNpZGUgLm91dGxpbmUtbmF2aWdhdG9yIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjtcbn1cbnByZSxcbi5zZWN0aW9uX19wcmUge1xuICBwYWRkaW5nOiAyZW07XG4gIGZvbnQtZmFtaWx5OiAnQ291cmllciBOZXcnLCBBcmlhbCwgc2Fucy1zZXJpZjtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ZhZmFmYTtcbiAgb3ZlcmZsb3c6IGF1dG87XG59XG5jb2RlLFxuLnNlY3Rpb25fX2NvZGUge1xuICBmb250LWZhbWlseTogJ0NvdXJpZXIgTmV3JywgQXJpYWwsIHNhbnMtc2VyaWY7XG4gIGZvbnQtc2l6ZTogMTZweDtcbn1cbi5mb290ZXIge1xuICBib3JkZXItdG9wOiAxcHggc29saWQgI2RjZGZlNjtcbiAgcGFkZGluZzogM2VtIDA7XG4gIHRleHQtYWxpZ246IGNlbnRlcjtcbn1cbi5mb290ZXIgYTpsaW5rLFxuLmZvb3RlciBhOnZpc2l0ZWQsXG4uZm9vdGVyIGE6aG92ZXIge1xuICB0ZXh0LWRlY29yYXRpb246IG5vbmU7XG4gIGNvbG9yOiAjMDU4OTQyO1xufVxuLmZvb3RlciBhOmhvdmVyIHtcbiAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7XG59XG4udXRpbHMtYm9yZGVyLXJpZ2h0IHtcbiAgYm9yZGVyLXJpZ2h0OiAxcHggc29saWQgI2RjZGZlNjtcbn1cbi5oaWRkZW4ge1xuICBkaXNwbGF5OiBub25lO1xufVxuQG1lZGlhIChtYXgtd2lkdGg6IDUwMHB4KSB7XG4gIGh0bWwsXG4gIGJvZHkge1xuICAgIG1hcmdpbjogMDtcbiAgfVxuICAucGFwZXIge1xuICAgIG1hcmdpbjogMDtcbiAgICBwYWRkaW5nOiAwO1xuICB9XG4gIC5hcnRpY2xlX19tYWluIHtcbiAgICBwYWRkaW5nOiAwIDJlbTtcbiAgfVxufVxuOnJvb3Qge1xuICAtLW91dGxpbmUtekluZGV4OiAyMDAwO1xuICAtLW91dGxpbmUtc3RpY2t5LWhlaWdodDogMTAwJTtcbiAgLS1vdXRsaW5lLW5hdmlnYXRvci13aWR0aDogMTAwJTtcbn1cbi8qID09PT09PT09PT0gY29sb3JzLnRoZW1lIC0g5Z+656GA6aKc6Imy5Y+Y6YeP6ZuG5ZCIID09PT09PT09PT0gKi9cbi8qKlxuICogZWxsaXBzaXMubGVzcyAtIOaWh+acrOecgeeVpSBtaXhpbngg5Ye95pWwXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBDcmVhdGVkIEJ5OiBZYW9oYWl4aWFvXG4gKiBVcGRhdGU6IDIwMjIuMy4xMVxuICovXG4vKiA9PT09PT0g5paH5pys55yB55Wl5Ye95pWwID09PT09PSAqL1xuLyoqXG4gKiBzaGFkb3cubGVzcyAtIOmYtOW9seagt+W8j+iuvue9riBtaXhpbngg5Ye95pWwXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBDcmVhdGVkIEJ5OiBZYW9oYWl4aWFvXG4gKiBVcGRhdGU6IDIwMjIuMy4yMFxuICovXG4vKiA9PT09PT0g6Zi05b2x5qC35byP6K6+572u5Ye95pWwID09PT09PSAqL1xuLyogPT09PT09PT09PSBpY29uLnRoZW1lIC0gc3ZnIOWbvuagh+eahOagt+W8jyA9PT09PT09PT09ICovXG4ub3V0bGluZS1pY29uIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICB6LWluZGV4OiAxO1xuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XG4gIHdpZHRoOiAxZW07XG4gIGhlaWdodDogMWVtO1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLm91dGxpbmUtaWNvbl9fc3ZnIHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB6LWluZGV4OiAyO1xuICB0b3A6IDUwJTtcbiAgbGVmdDogNTAlO1xuICB3aWR0aDogMWVtO1xuICBoZWlnaHQ6IDFlbTtcbiAgZmlsbDogY3VycmVudGNvbG9yO1xuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCAtNTAlKTtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi5vdXRsaW5lLWljb25faGlkZGVuIHtcbiAgZGlzcGxheTogbm9uZTtcbn1cbi5vdXRsaW5lLWhlYWRpbmcge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIHotaW5kZXg6IDE7XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4ub3V0bGluZS1oZWFkaW5nX19hbmNob3Ige1xuICBkaXNwbGF5OiBub25lO1xufVxuLm91dGxpbmUtaGVhZGluZ19fYW5jaG9yOmxpbmssXG4ub3V0bGluZS1oZWFkaW5nX19hbmNob3I6dmlzaXRlZCxcbi5vdXRsaW5lLWhlYWRpbmdfX2FuY2hvcjpob3ZlciB7XG4gIGNvbG9yOiAjOTk5O1xuICB0ZXh0LWRlY29yYXRpb246IG5vbmU7XG59XG4ub3V0bGluZS1oZWFkaW5nX19hbmNob3I6aG92ZXIge1xuICBjb2xvcjogIzUwN2FmZTtcbn1cbi5vdXRsaW5lLWhlYWRpbmc6aG92ZXIgLm91dGxpbmUtaGVhZGluZ19fYW5jaG9yIHtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xufVxuLm91dGxpbmUtaGVhZGluZ19zdGFydDpob3ZlciB7XG4gIG92ZXJmbG93OiB2aXNpYmxlO1xufVxuLm91dGxpbmUtaGVhZGluZ19zdGFydCAub3V0bGluZS1oZWFkaW5nX19hbmNob3Ige1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHotaW5kZXg6IDI7XG4gIHRvcDogNTAlO1xuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTUwJSk7XG4gIGxlZnQ6IC0xZW07XG59XG4ub3V0bGluZS1kcmF3ZXIge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIHotaW5kZXg6IC0xO1xuICB0b3A6IDA7XG4gIGxlZnQ6IDA7XG4gIG1hcmdpbjogMDtcbiAgd2lkdGg6IDEwMCU7XG4gIGhlaWdodDogMTAwJTtcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgdmlzaWJpbGl0eTogaGlkZGVuO1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLm91dGxpbmUtZHJhd2VyX19tb2RhbCB7XG4gIGJveC1zaGFkb3c6IDAgMCA2cHggMXB4ICNkY2RmZTY7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gIGZsZXgtd3JhcDogbm93cmFwO1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHotaW5kZXg6IDIxO1xuICBoZWlnaHQ6IDEwMCU7XG4gIGJhY2tncm91bmQtY29sb3I6ICNmZmY7XG4gIHRyYW5zaXRpb24tZHVyYXRpb246IDAuNHM7XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4ub3V0bGluZS1kcmF3ZXJfX2hlYWRlcixcbi5vdXRsaW5lLWRyYXdlcl9fbWFpbixcbi5vdXRsaW5lLWRyYXdlcl9fZm9vdGVyIHtcbiAgd2lkdGg6IDEwMCU7XG4gIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG59XG4ub3V0bGluZS1kcmF3ZXJfX2hlYWRlcixcbi5vdXRsaW5lLWRyYXdlcl9fZm9vdGVyIHtcbiAgZmxleC1zaHJpbms6IDA7XG59XG4ub3V0bGluZS1kcmF3ZXJfX3RpdGxlLFxuLm91dGxpbmUtZHJhd2VyX19tYWluLFxuLm91dGxpbmUtZHJhd2VyX19mb290ZXIge1xuICBwYWRkaW5nOiAwIDE2cHg7XG59XG4ub3V0bGluZS1kcmF3ZXJfX2hlYWRlcixcbi5vdXRsaW5lLWRyYXdlcl9fdGl0bGUge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIHotaW5kZXg6IDE7XG4gIG1hcmdpbjogMCBhdXRvO1xuICBoZWlnaHQ6IDUycHg7XG4gIGxpbmUtaGVpZ2h0OiA1MnB4O1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLm91dGxpbmUtZHJhd2VyX190aXRsZSB7XG4gIGZvbnQtc2l6ZTogMTZweDtcbiAgZm9udC13ZWlnaHQ6IDQwMDtcbiAgbWFyZ2luOiAwIDE2cHg7XG4gIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjZGNkZmU2O1xufVxuLm91dGxpbmUtZHJhd2VyX19jbG9zZSB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgei1pbmRleDogMjtcbiAgdG9wOiA1MCU7XG4gIHJpZ2h0OiAxMnB4O1xuICB3aWR0aDogMjBweDtcbiAgaGVpZ2h0OiAyMHB4O1xuICBsaW5lLWhlaWdodDogMjBweDtcbiAgY29sb3I6ICM5OTk7XG4gIGZvbnQtc2l6ZTogMjBweDtcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xuICBjdXJzb3I6IHBvaW50ZXI7XG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtNTAlKTtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi5vdXRsaW5lLWRyYXdlcl9fY2xvc2UgLm91dGxpbmUtaWNvbiB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgei1pbmRleDogMjtcbiAgdG9wOiAwO1xuICBsZWZ0OiAwO1xufVxuLm91dGxpbmUtZHJhd2VyX19jbG9zZTpob3ZlciB7XG4gIGNvbG9yOiAjNjY2O1xufVxuLm91dGxpbmUtZHJhd2VyX19tYWluIHtcbiAgZmxleDogMTtcbiAgb3ZlcmZsb3c6IGF1dG87XG59XG4ub3V0bGluZS1kcmF3ZXJfX21haW4ub3ZlcmZsb3ctaGlkZGVuIHtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi5vdXRsaW5lLWRyYXdlcl9fZm9vdGVyIHtcbiAgbWFyZ2luOiAwIGF1dG87XG4gIHRleHQtYWxpZ246IHJpZ2h0O1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLm91dGxpbmUtZHJhd2VyX19vdmVybGF5IHtcbiAgY29udGVudDogJyc7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgei1pbmRleDogMTtcbiAgdG9wOiAwO1xuICBsZWZ0OiAwO1xuICB3aWR0aDogMTAwJTtcbiAgaGVpZ2h0OiAxMDAlO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmO1xuICBvcGFjaXR5OiAwLjE7XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4ub3V0bGluZS1kcmF3ZXJfcnRsLm91dGxpbmUtZHJhd2VyX3RpbnksXG4ub3V0bGluZS1kcmF3ZXJfbHRyLm91dGxpbmUtZHJhd2VyX3Rpbnkge1xuICB3aWR0aDogMjgwcHg7XG59XG4ub3V0bGluZS1kcmF3ZXJfcnRsLm91dGxpbmUtZHJhd2VyX21pbmksXG4ub3V0bGluZS1kcmF3ZXJfbHRyLm91dGxpbmUtZHJhd2VyX21pbmkge1xuICB3aWR0aDogNDgwcHg7XG59XG4ub3V0bGluZS1kcmF3ZXJfcnRsLm91dGxpbmUtZHJhd2VyX3NtYWxsLFxuLm91dGxpbmUtZHJhd2VyX2x0ci5vdXRsaW5lLWRyYXdlcl9zbWFsbCB7XG4gIHdpZHRoOiA1NDBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl9ydGwub3V0bGluZS1kcmF3ZXJfcmVndWxhcixcbi5vdXRsaW5lLWRyYXdlcl9sdHIub3V0bGluZS1kcmF3ZXJfcmVndWxhciB7XG4gIHdpZHRoOiA2ODBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl9ydGwub3V0bGluZS1kcmF3ZXJfbWVkaXVtLFxuLm91dGxpbmUtZHJhd2VyX2x0ci5vdXRsaW5lLWRyYXdlcl9tZWRpdW0ge1xuICB3aWR0aDogNzIwcHg7XG59XG4ub3V0bGluZS1kcmF3ZXJfcnRsLm91dGxpbmUtZHJhd2VyX2xhcmdlLFxuLm91dGxpbmUtZHJhd2VyX2x0ci5vdXRsaW5lLWRyYXdlcl9sYXJnZSB7XG4gIHdpZHRoOiA5NjBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl9ydGwge1xuICBib3JkZXItbGVmdDogMXB4IHNvbGlkICNkY2RmZTY7XG59XG4ub3V0bGluZS1kcmF3ZXJfcnRsLm91dGxpbmUtZHJhd2VyX3Rpbnkub3V0bGluZS1kcmF3ZXJfY2xvc2VkIHtcbiAgcmlnaHQ6IC0yOTBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl9ydGwub3V0bGluZS1kcmF3ZXJfbWluaS5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xuICByaWdodDogLTQ5MHB4O1xufVxuLm91dGxpbmUtZHJhd2VyX3J0bC5vdXRsaW5lLWRyYXdlcl9zbWFsbC5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xuICByaWdodDogLTU1MHB4O1xufVxuLm91dGxpbmUtZHJhd2VyX3J0bC5vdXRsaW5lLWRyYXdlcl9yZWd1bGFyLm91dGxpbmUtZHJhd2VyX2Nsb3NlZCB7XG4gIHJpZ2h0OiAtNjkwcHg7XG59XG4ub3V0bGluZS1kcmF3ZXJfcnRsLm91dGxpbmUtZHJhd2VyX21lZGl1bS5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xuICByaWdodDogLTczMHB4O1xufVxuLm91dGxpbmUtZHJhd2VyX3J0bC5vdXRsaW5lLWRyYXdlcl9sYXJnZS5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xuICByaWdodDogLTk3MHB4O1xufVxuLm91dGxpbmUtZHJhd2VyX2x0ciB7XG4gIGJvcmRlci1yaWdodDogMXB4IHNvbGlkICNkY2RmZTY7XG59XG4ub3V0bGluZS1kcmF3ZXJfbHRyLm91dGxpbmUtZHJhd2VyX3Rpbnkub3V0bGluZS1kcmF3ZXJfY2xvc2VkIHtcbiAgbGVmdDogLTI5MHB4O1xufVxuLm91dGxpbmUtZHJhd2VyX2x0ci5vdXRsaW5lLWRyYXdlcl9taW5pLm91dGxpbmUtZHJhd2VyX2Nsb3NlZCB7XG4gIGxlZnQ6IC00OTBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl9sdHIub3V0bGluZS1kcmF3ZXJfc21hbGwub3V0bGluZS1kcmF3ZXJfY2xvc2VkIHtcbiAgbGVmdDogLTU1MHB4O1xufVxuLm91dGxpbmUtZHJhd2VyX2x0ci5vdXRsaW5lLWRyYXdlcl9yZWd1bGFyLm91dGxpbmUtZHJhd2VyX2Nsb3NlZCB7XG4gIGxlZnQ6IC02OTBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl9sdHIub3V0bGluZS1kcmF3ZXJfbWVkaXVtLm91dGxpbmUtZHJhd2VyX2Nsb3NlZCB7XG4gIGxlZnQ6IC03MzBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl9sdHIub3V0bGluZS1kcmF3ZXJfbGFyZ2Uub3V0bGluZS1kcmF3ZXJfY2xvc2VkIHtcbiAgbGVmdDogLTk3MHB4O1xufVxuLm91dGxpbmUtZHJhd2VyX3R0Yixcbi5vdXRsaW5lLWRyYXdlcl9idHQge1xuICBsZWZ0OiAwO1xuICB3aWR0aDogMTAwJTtcbn1cbi5vdXRsaW5lLWRyYXdlcl90dGIub3V0bGluZS1kcmF3ZXJfdGlueSxcbi5vdXRsaW5lLWRyYXdlcl9idHQub3V0bGluZS1kcmF3ZXJfdGlueSB7XG4gIGhlaWdodDogMjQwcHg7XG59XG4ub3V0bGluZS1kcmF3ZXJfdHRiLm91dGxpbmUtZHJhd2VyX21pbmksXG4ub3V0bGluZS1kcmF3ZXJfYnR0Lm91dGxpbmUtZHJhd2VyX21pbmkge1xuICBoZWlnaHQ6IDMyMHB4O1xufVxuLm91dGxpbmUtZHJhd2VyX3R0Yi5vdXRsaW5lLWRyYXdlcl9zbWFsbCxcbi5vdXRsaW5lLWRyYXdlcl9idHQub3V0bGluZS1kcmF3ZXJfc21hbGwge1xuICBoZWlnaHQ6IDM2MHB4O1xufVxuLm91dGxpbmUtZHJhd2VyX3R0Yi5vdXRsaW5lLWRyYXdlcl9yZWd1bGFyLFxuLm91dGxpbmUtZHJhd2VyX2J0dC5vdXRsaW5lLWRyYXdlcl9yZWd1bGFyIHtcbiAgaGVpZ2h0OiA0MDBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl90dGIub3V0bGluZS1kcmF3ZXJfbWVkaXVtLFxuLm91dGxpbmUtZHJhd2VyX2J0dC5vdXRsaW5lLWRyYXdlcl9tZWRpdW0ge1xuICBoZWlnaHQ6IDQ0MHB4O1xufVxuLm91dGxpbmUtZHJhd2VyX3R0Yi5vdXRsaW5lLWRyYXdlcl9sYXJnZSxcbi5vdXRsaW5lLWRyYXdlcl9idHQub3V0bGluZS1kcmF3ZXJfbGFyZ2Uge1xuICBoZWlnaHQ6IDQ4MHB4O1xufVxuLm91dGxpbmUtZHJhd2VyX3R0YiB7XG4gIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjZGNkZmU2O1xufVxuLm91dGxpbmUtZHJhd2VyX3R0Yi5vdXRsaW5lLWRyYXdlcl90aW55Lm91dGxpbmUtZHJhd2VyX2Nsb3NlZCB7XG4gIHRvcDogLTI1MHB4O1xufVxuLm91dGxpbmUtZHJhd2VyX3R0Yi5vdXRsaW5lLWRyYXdlcl9taW5pLm91dGxpbmUtZHJhd2VyX2Nsb3NlZCB7XG4gIHRvcDogLTMzMHB4O1xufVxuLm91dGxpbmUtZHJhd2VyX3R0Yi5vdXRsaW5lLWRyYXdlcl9zbWFsbC5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xuICB0b3A6IC0zNzBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl90dGIub3V0bGluZS1kcmF3ZXJfcmVndWxhci5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xuICB0b3A6IC00MTBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl90dGIub3V0bGluZS1kcmF3ZXJfbWVkaXVtLm91dGxpbmUtZHJhd2VyX2Nsb3NlZCB7XG4gIHRvcDogLTQ1MHB4O1xufVxuLm91dGxpbmUtZHJhd2VyX3R0Yi5vdXRsaW5lLWRyYXdlcl9sYXJnZS5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xuICB0b3A6IC00OTBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl9idHQge1xuICB0b3A6IGluaXRpYWw7XG4gIGJvcmRlci10b3A6IDFweCBzb2xpZCAjZGNkZmU2O1xufVxuLm91dGxpbmUtZHJhd2VyX2J0dC5vdXRsaW5lLWRyYXdlcl90aW55Lm91dGxpbmUtZHJhd2VyX2Nsb3NlZCB7XG4gIGJvdHRvbTogLTI1MHB4O1xufVxuLm91dGxpbmUtZHJhd2VyX2J0dC5vdXRsaW5lLWRyYXdlcl9taW5pLm91dGxpbmUtZHJhd2VyX2Nsb3NlZCB7XG4gIGJvdHRvbTogLTMzMHB4O1xufVxuLm91dGxpbmUtZHJhd2VyX2J0dC5vdXRsaW5lLWRyYXdlcl9zbWFsbC5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xuICBib3R0b206IC0zNzBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl9idHQub3V0bGluZS1kcmF3ZXJfcmVndWxhci5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xuICBib3R0b206IC00MTBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl9idHQub3V0bGluZS1kcmF3ZXJfbWVkaXVtLm91dGxpbmUtZHJhd2VyX2Nsb3NlZCB7XG4gIGJvdHRvbTogLTQ1MHB4O1xufVxuLm91dGxpbmUtZHJhd2VyX2J0dC5vdXRsaW5lLWRyYXdlcl9sYXJnZS5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xuICBib3R0b206IC00OTBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl9vcGVuZWQge1xuICB2aXNpYmlsaXR5OiB2aXNpYmxlO1xuICB6LWluZGV4OiB2YXIoLS1vdXRsaW5lLXpJbmRleCk7XG59XG4ub3V0bGluZS1kcmF3ZXJfb3BlbmVkLm91dGxpbmUtZHJhd2VyIHtcbiAgcG9zaXRpb246IGZpeGVkO1xufVxuLm91dGxpbmUtZHJhd2VyX29wZW5lZC5vdXRsaW5lLWRyYXdlcl9ydGwge1xuICByaWdodDogMDtcbn1cbi5vdXRsaW5lLWRyYXdlcl9vcGVuZWQub3V0bGluZS1kcmF3ZXJfbHRyIHtcbiAgbGVmdDogMDtcbn1cbi5vdXRsaW5lLWRyYXdlcl9vcGVuZWQub3V0bGluZS1kcmF3ZXJfdHRiIHtcbiAgdG9wOiAwO1xufVxuLm91dGxpbmUtZHJhd2VyX29wZW5lZC5vdXRsaW5lLWRyYXdlcl9idHQge1xuICBib3R0b206IDA7XG59XG4ub3V0bGluZS1kcmF3ZXJfb2Zmc2V0Lm91dGxpbmUtZHJhd2VyX3J0bCxcbi5vdXRsaW5lLWRyYXdlcl9vZmZzZXQub3V0bGluZS1kcmF3ZXJfbHRyIHtcbiAgaGVpZ2h0OiBjYWxjKDEwMCUgLSA0ZW0pO1xuICB0b3A6IDUwJTtcbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC01MCUpO1xufVxuLm91dGxpbmUtZHJhd2VyX29mZnNldC5vdXRsaW5lLWRyYXdlcl90dGIsXG4ub3V0bGluZS1kcmF3ZXJfb2Zmc2V0Lm91dGxpbmUtZHJhd2VyX2J0dCB7XG4gIHdpZHRoOiBjYWxjKDEwMCUgLSA0ZW0pO1xuICBsZWZ0OiA1MCU7XG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgtNTAlKTtcbn1cbi5vdXRsaW5lLWRyYXdlcl9vZmZzZXQub3V0bGluZS1kcmF3ZXJfb3BlbmVkLm91dGxpbmUtZHJhd2VyX3J0bCB7XG4gIHJpZ2h0OiAyZW07XG59XG4ub3V0bGluZS1kcmF3ZXJfb2Zmc2V0Lm91dGxpbmUtZHJhd2VyX29wZW5lZC5vdXRsaW5lLWRyYXdlcl9sdHIge1xuICBsZWZ0OiAyZW07XG59XG4ub3V0bGluZS1kcmF3ZXJfb2Zmc2V0Lm91dGxpbmUtZHJhd2VyX29wZW5lZC5vdXRsaW5lLWRyYXdlcl90dGIge1xuICB0b3A6IDJlbTtcbn1cbi5vdXRsaW5lLWRyYXdlcl9vZmZzZXQub3V0bGluZS1kcmF3ZXJfb3BlbmVkLm91dGxpbmUtZHJhd2VyX2J0dCB7XG4gIGJvdHRvbTogMmVtO1xufVxuLm91dGxpbmUtZHJhd2VyX2F1dG8ub3V0bGluZS1kcmF3ZXJfcnRsLFxuLm91dGxpbmUtZHJhd2VyX2F1dG8ub3V0bGluZS1kcmF3ZXJfbHRyIHtcbiAgaGVpZ2h0OiBhdXRvO1xuICBtYXgtaGVpZ2h0OiBjYWxjKDEwMCUgLSA0ZW0pO1xufVxuLm91dGxpbmUtZHJhd2VyX2Z1bGwge1xuICBwYWRkaW5nOiAwO1xufVxuLm91dGxpbmUtbmF2aWdhdG9yIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICB6LWluZGV4OiAxO1xuICBtYXJnaW46IDA7XG4gIHdpZHRoOiB2YXIoLS1vdXRsaW5lLW5hdmlnYXRvci13aWR0aCk7XG4gIG92ZXJmbG93OiBhdXRvO1xufVxuLm91dGxpbmUtbmF2aWdhdG9yLXBhcmVudCB7XG4gIHRyYW5zaXRpb246IDAuM3MgZWFzZS1pbi1vdXQ7XG59XG4ub3V0bGluZS1uYXZpZ2F0b3JfX3RpdGxlIHtcbiAgbWFyZ2luOiAwIDE2cHg7XG4gIGhlaWdodDogNDBweDtcbiAgbGluZS1oZWlnaHQ6IDQwcHg7XG4gIHBhZGRpbmc6IDAgMTZweDtcbiAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNkY2RmZTY7XG4gIGZvbnQtc2l6ZTogMTZweDtcbiAgZm9udC13ZWlnaHQ6IDQwMDtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi5vdXRsaW5lLW5hdmlnYXRvcl9fbWFpbiB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgei1pbmRleDogMTtcbiAgbWFyZ2luOiAwO1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLm91dGxpbmUtbmF2aWdhdG9yX19saXN0LFxuLm91dGxpbmUtbmF2aWdhdG9yX19zdWJqZWN0LFxuLm91dGxpbmUtbmF2aWdhdG9yX19pdGVtIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICB6LWluZGV4OiAyO1xuICBtYXJnaW46IDA7XG4gIHBhZGRpbmc6IDA7XG4gIGxpc3Qtc3R5bGUtdHlwZTogbm9uZTtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi5vdXRsaW5lLW5hdmlnYXRvcl9fbGlzdCB7XG4gIHBhZGRpbmc6IDAuNWVtIDA7XG59XG4ub3V0bGluZS1uYXZpZ2F0b3JfX3N1YmplY3Qge1xuICBwYWRkaW5nLWxlZnQ6IDFlbTtcbn1cbi5vdXRsaW5lLW5hdmlnYXRvcl9faXRlbSB7XG4gIG1hcmdpbjogMDtcbiAgbGluZS1oZWlnaHQ6IDMwcHg7XG4gIGZvbnQtc2l6ZTogMTNweDtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi5vdXRsaW5lLW5hdmlnYXRvcl9fcGxhY2Vob2xkZXIge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHotaW5kZXg6IDE7XG4gIHRvcDogMDtcbiAgbGVmdDogMDtcbiAgd2lkdGg6IDEwMCU7XG4gIGhlaWdodDogMzBweDtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2Y3ZjhmOTtcbiAgYm9yZGVyLWxlZnQ6IDJweCBzb2xpZCAjMDU4OTQyO1xuICB0cmFuc2l0aW9uLWR1cmF0aW9uOiAwLjJzO1xuICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLm91dGxpbmUtbmF2aWdhdG9yX19hbmNob3Ige1xuICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpcztcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgZGlzcGxheTogYmxvY2s7XG4gIHBhZGRpbmc6IDAgMS41ZW07XG59XG4ub3V0bGluZS1uYXZpZ2F0b3JfX2FuY2hvcjpsaW5rLFxuLm91dGxpbmUtbmF2aWdhdG9yX19hbmNob3I6dmlzaXRlZCxcbi5vdXRsaW5lLW5hdmlnYXRvcl9fYW5jaG9yOmhvdmVyIHtcbiAgdGV4dC1kZWNvcmF0aW9uOiBub25lO1xuICBjb2xvcjogIzU1NTtcbn1cbi5vdXRsaW5lLW5hdmlnYXRvcl9fYW5jaG9yOmhvdmVyIHtcbiAgY29sb3I6ICMwNTg5NDI7XG59XG4ub3V0bGluZS1uYXZpZ2F0b3JfX2NvZGUge1xuICBwYWRkaW5nLXJpZ2h0OiAwLjVlbTtcbn1cbi5vdXRsaW5lLW5hdmlnYXRvcl9oaWdobGlnaHQub3V0bGluZS1uYXZpZ2F0b3JfX2FuY2hvcjpsaW5rLFxuLm91dGxpbmUtbmF2aWdhdG9yX2hpZ2hsaWdodC5vdXRsaW5lLW5hdmlnYXRvcl9fYW5jaG9yOnZpc2l0ZWQsXG4ub3V0bGluZS1uYXZpZ2F0b3JfaGlnaGxpZ2h0Lm91dGxpbmUtbmF2aWdhdG9yX19hbmNob3I6aG92ZXIge1xuICBjb2xvcjogIzA1ODk0MjtcbiAgZm9udC13ZWlnaHQ6IGJvbGQ7XG59XG4ub3V0bGluZS1uYXZpZ2F0b3Jfc3RpY2t5LFxuLm91dGxpbmUtbmF2aWdhdG9yX2ZpeGVkIHtcbiAgZGlzcGxheTogZmxleDtcbiAgZmxleC13cmFwOiBub3dyYXA7XG4gIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gIHotaW5kZXg6IHZhcigtLW91dGxpbmUtekluZGV4KTtcbiAgdG9wOiAwO1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLm91dGxpbmUtbmF2aWdhdG9yX3N0aWNreSAub3V0bGluZS1uYXZpZ2F0b3JfX3RpdGxlLFxuLm91dGxpbmUtbmF2aWdhdG9yX2ZpeGVkIC5vdXRsaW5lLW5hdmlnYXRvcl9fdGl0bGUsXG4ub3V0bGluZS1uYXZpZ2F0b3Jfc3RpY2t5IC5vdXRsaW5lLW5hdmlnYXRvcl9fbWFpbixcbi5vdXRsaW5lLW5hdmlnYXRvcl9maXhlZCAub3V0bGluZS1uYXZpZ2F0b3JfX21haW4ge1xuICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xufVxuLm91dGxpbmUtbmF2aWdhdG9yX3N0aWNreSAub3V0bGluZS1uYXZpZ2F0b3JfX3RpdGxlLFxuLm91dGxpbmUtbmF2aWdhdG9yX2ZpeGVkIC5vdXRsaW5lLW5hdmlnYXRvcl9fdGl0bGUge1xuICBmbGV4LXNocmluazogMDtcbn1cbi5vdXRsaW5lLW5hdmlnYXRvcl9zdGlja3kgLm91dGxpbmUtbmF2aWdhdG9yX19tYWluLFxuLm91dGxpbmUtbmF2aWdhdG9yX2ZpeGVkIC5vdXRsaW5lLW5hdmlnYXRvcl9fbWFpbiB7XG4gIGZsZXg6IDE7XG4gIG92ZXJmbG93OiBhdXRvO1xufVxuLm91dGxpbmUtbmF2aWdhdG9yX3N0aWNreSB7XG4gIHBvc2l0aW9uOiBzdGlja3k7XG4gIG1heC1oZWlnaHQ6IHZhcigtLW91dGxpbmUtc3RpY2t5LWhlaWdodCk7XG59XG4ub3V0bGluZS1uYXZpZ2F0b3JfZml4ZWQge1xuICBwb3NpdGlvbjogZml4ZWQ7XG4gIG1heC1oZWlnaHQ6IDEwMCU7XG59XG4ub3V0bGluZS1uYXZpZ2F0b3JfaGlkZGVuIHtcbiAgZGlzcGxheTogbm9uZTtcbn1cbi5vdXRsaW5lLW5hdmlnYXRvcl9mb2xkZWQge1xuICB3aWR0aDogMDtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi8qKlxuICogZm9udC5sZXNzIC0g5a2X5L2T55u45YWz5qC35byPXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBDcmVhdGVkIEJ5OiBZYW9oYWl4aWFvXG4gKiBVcGRhdGU6IDIwMjIuMy4xNlxuICovXG4vKiA9PT09PT0g5a2X5L2TID09PT09PSAqL1xuLyogPT09PT09IOWtl+mHjSA9PT09PT0gKi9cbi8qID09PT09PSDlrZflj7cgPT09PT09ICovXG4ub3V0bGluZS1yZWFkZXJfX3Byb2dyZXNzIHtcbiAgcG9zaXRpb246IGZpeGVkO1xuICB0b3A6IDA7XG4gIGxlZnQ6IDA7XG4gIHotaW5kZXg6IDM7XG4gIGhlaWdodDogNHB4O1xuICB3aWR0aDogMTAwJTtcbiAgYmFja2dyb3VuZC1jb2xvcjogIzUwN2FmZTtcbiAgc2NhbGU6IDAgMTtcbiAgdHJhbnNmb3JtLW9yaWdpbjogbGVmdDtcbiAgYW5pbWF0aW9uOiBvdXRsaW5lLXJlYWRlci1wcm9ncmVzcyBsaW5lYXI7XG4gIGFuaW1hdGlvbi10aW1lbGluZTogLS1Qcm9ncmVzc1RpbWVsaW5lO1xufVxuLm91dGxpbmUtcmVhZGVyX19wYXBlciB7XG4gIGJveC1zaGFkb3c6IDAgMCA2cHggMXB4ICNkZGQ7XG4gIG1hcmdpbjogMmVtIGF1dG87XG4gIG1heC13aWR0aDogMTIwMHB4O1xuICBwYWRkaW5nOiAzLjJlbTtcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi5vdXRsaW5lLXJlYWRlcl9fdGl0bGUge1xuICBtYXJnaW46IDAuNjdlbSAwO1xuICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gIGZvbnQtZmFtaWx5OiAtYXBwbGUtc3lzdGVtLCBCbGlua01hY1N5c3RlbUZvbnQsICdTZWdvZSBVSScsICdQaW5nRmFuZyBTQycsICdIaXJhZ2lubyBTYW5zIEdCJywgJ01pY3Jvc29mdCBZYUhlaScsICdIZWx2ZXRpY2EgTmV1ZScsICdBcHBsZSBDb2xvciBFbW9qaScsICdTZWdvZSBVSSBFbW9qaScsICdTZWdvZSBVSSBTeW1ib2wnLCBIZWx2ZXRpY2EsIEFyaWFsLCBzYW5zLXNlcmlmO1xuICBmb250LXdlaWdodDogbm9ybWFsO1xuICBsaW5lLWhlaWdodDogMS4zZW07XG4gIGZvbnQtc2l6ZTogNC4yZW07XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4ub3V0bGluZS1yZWFkZXJfX2FydGljbGUgLm91dGxpbmUtcmVhZGVyX19wcm9ncmVzcyB7XG4gIGRpc3BsYXk6IG5vbmU7XG59XG4ub3V0bGluZS1yZWFkZXJfaGlkZGVuIHtcbiAgZGlzcGxheTogbm9uZTtcbn1cbi5vdXRsaW5lLXJlYWRlcl9oaWRkZW4ub3V0bGluZS1yZWFkZXJfc2libGluZyB7XG4gIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDtcbn1cbi5vdXRsaW5lLXJlYWRlcl9oaWRkZW4ub3V0bGluZS1yZWFkZXJfc2libGluZy53cmFwcGVyLnBvc3Qge1xuICBkaXNwbGF5OiBub25lO1xufVxuLm91dGxpbmUtcmVhZGVyLS1yZWFkaW5nIHtcbiAgZGlzcGxheTogYmxvY2s7XG4gIHBvc2l0aW9uOiBmaXhlZDtcbiAgei1pbmRleDogMjtcbiAgdG9wOiAwO1xuICBsZWZ0OiAwO1xuICB3aWR0aDogMTAwJTtcbiAgaGVpZ2h0OiAxMDAlO1xuICBtYXJnaW46IDA7XG4gIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gIHBhZGRpbmc6IDNlbSA0ZW07XG4gIGJhY2tncm91bmQtY29sb3I6ICNmYWZhZmE7XG4gIHNjcm9sbC10aW1lbGluZS1uYW1lOiAtLVByb2dyZXNzVGltZWxpbmU7XG4gIG92ZXJmbG93OiBzY3JvbGw7XG59XG5Aa2V5ZnJhbWVzIG91dGxpbmUtcmVhZGVyLXByb2dyZXNzIHtcbiAgdG8ge1xuICAgIHNjYWxlOiAxIDE7XG4gIH1cbn1cbkBtZWRpYSAobWF4LXdpZHRoOiA1MDBweCkge1xuICAub3V0bGluZS1yZWFkZXIge1xuICAgIG92ZXJmbG93OiBoaWRkZW47XG4gIH1cbiAgLm91dGxpbmUtcmVhZGVyIC5vdXRsaW5lLXRvb2xiYXIge1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgZmxleC1kaXJlY3Rpb246IHJvdztcbiAgICBmbGV4LXdyYXA6IG5vd3JhcDtcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgIGFsaWduLXNlbGY6IGF1dG87XG4gICAgdG9wOiAxMDAlO1xuICAgIHJpZ2h0OiAwO1xuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtNDhweCk7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgaGVpZ2h0OiA0OHB4O1xuICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgYm9yZGVyLXRvcDogMXB4IHNvbGlkICNkZGQ7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjtcbiAgICBwYWRkaW5nOiAwIDE2cHg7XG4gIH1cbiAgLm91dGxpbmUtcmVhZGVyIC5vdXRsaW5lLXRvb2xiYXJfX2J1dHRvbiB7XG4gICAgYm9yZGVyLXJhZGl1czogMDtcbiAgICBmbGV4OiAxO1xuICAgIGJvcmRlcjogbm9uZTtcbiAgICBib3gtc2hhZG93OiBub25lO1xuICB9XG4gIC5vdXRsaW5lLXJlYWRlci0tcmVhZGluZyB7XG4gICAgcGFkZGluZzogMDtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmO1xuICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gIH1cbiAgLm91dGxpbmUtcmVhZGVyX19wYXBlciB7XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgIHotaW5kZXg6IDE7XG4gICAgbWFyZ2luOiAwO1xuICAgIHBhZGRpbmc6IDA7XG4gICAgaGVpZ2h0OiAxMDAlO1xuICAgIGJveC1zaGFkb3c6IG5vbmU7XG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgfVxuICAub3V0bGluZS1yZWFkZXJfX3RpdGxlIHtcbiAgICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzO1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICB6LWluZGV4OiAzO1xuICAgIHRvcDogMDtcbiAgICBsZWZ0OiAwO1xuICAgIG1hcmdpbjogMDtcbiAgICB3aWR0aDogMTAwJTtcbiAgICBoZWlnaHQ6IDQ4cHg7XG4gICAgbGluZS1oZWlnaHQ6IDQ4cHg7XG4gICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNkZGQ7XG4gICAgZm9udC1zaXplOiAxLjhlbTtcbiAgICBmb250LXdlaWdodDogNDAwO1xuICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmY7XG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgfVxuICAub3V0bGluZS1yZWFkZXJfX2FydGljbGUge1xuICAgIG1hcmdpbjogNDhweCAwO1xuICAgIGhlaWdodDogY2FsYygxMDAlIC0gOTZweCk7XG4gICAgcGFkZGluZzogMCAxLjI1ZW07XG4gICAgc2Nyb2xsLXRpbWVsaW5lLW5hbWU6IC0tTW9iaWxlUHJvZ3Jlc3NUaW1lbGluZTtcbiAgICBvdmVyZmxvdy14OiBoaWRkZW47XG4gICAgb3ZlcmZsb3cteTogc2Nyb2xsO1xuICB9XG4gIC5vdXRsaW5lLXJlYWRlcl9fYXJ0aWNsZSAub3V0bGluZS1yZWFkZXJfX3Byb2dyZXNzIHtcbiAgICB6LWluZGV4OiA0O1xuICAgIGFuaW1hdGlvbjogb3V0bGluZS1yZWFkZXItcHJvZ3Jlc3MgbGluZWFyO1xuICAgIGFuaW1hdGlvbi10aW1lbGluZTogLS1Nb2JpbGVQcm9ncmVzc1RpbWVsaW5lO1xuICAgIGRpc3BsYXk6IGJsb2NrO1xuICB9XG59XG5AbWVkaWEgcHJpbnQge1xuICBodG1sLFxuICBib2R5IHtcbiAgICAvKiDmiZPljbDnmoTln7rnoYDlrZfkvZPlpKflsI8gKi9cbiAgICBmb250LXNpemU6IDEycHQ7XG4gICAgLyog5pi+56S66K6+572u5paH5a2X6aKc6Imy5ZKM6IOM5pmv6aKc6ImyICovXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjtcbiAgICBjb2xvcjogIzMzMztcbiAgICBoZWlnaHQ6IGluaXRpYWwgIWltcG9ydGFudDtcbiAgfVxuICAvKiDorr7nva7pk77mjqXmoLflvI8gKi9cbiAgYTpsaW5rLFxuICBhOnZpc2l0ZWQsXG4gIGE6aG92ZXIge1xuICAgIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lICFpbXBvcnRhbnQ7XG4gICAgY29sb3I6ICM1MDdhZmU7XG4gIH1cbiAgLyog6ZqQ6JeP5aqS5L2T5qCH562+ICovXG4gIHZpZGVvLFxuICBhdWRpbyB7XG4gICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50O1xuICB9XG4gIC8qIOehruS/neihqOagvOWcqOaJk+WNsOaXtueahOi+ueahhuWSjOWvuem9kOaWueW8j+a4heaZsCAqL1xuICB0YWJsZSB7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTtcbiAgfVxuICB0aCxcbiAgdGQge1xuICAgIGJvcmRlcjogMXB4IHNvbGlkICNkY2RmZTY7XG4gICAgcGFkZGluZzogOHB4IDIwcHg7XG4gIH1cbiAgLm91dGxpbmUtbWVzc2FnZSxcbiAgLm91dGxpbmUtdG9vbGJhciB7XG4gICAgLyog6ZqQ6JeP5LqG5bel5YW35qCP5ZKM5L+h5oGv5o+Q56S65qGGICovXG4gICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50O1xuICB9XG4gIC5vdXRsaW5lLXJlYWRlciB7XG4gICAgZGlzcGxheTogYmxvY2sgIWltcG9ydGFudDtcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgIC8qIOWPlua2iOS6hue7neWvueWumuS9jSAqL1xuICAgIC8qIOmakOiXj+mYheivu+i/m+W6puadoSAqL1xuICAgIC8qIOaJk+WNsOaXtuS4jeaYvuekuuato+aWhyBET00g55qE6Zi05b2x5pWI5p6cICovXG4gICAgLyog5omA5pyJ5paH56ug5YaF5a65IERPTSDnm7jlhbPnmoTpgrvlsYXoioLngrnpg73pmpDol4/kuoYgKi9cbiAgfVxuICAub3V0bGluZS1yZWFkZXJfX3RpdGxlIHtcbiAgICBtYXJnaW46IDEzLjRwdCAwIDI4cHQgIWltcG9ydGFudDtcbiAgICB0ZXh0LWFsaWduOiBjZW50ZXIgIWltcG9ydGFudDtcbiAgICBmb250LXNpemU6IDMycHQgIWltcG9ydGFudDtcbiAgfVxuICAub3V0bGluZS1yZWFkZXItLXJlYWRpbmcge1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZSAhaW1wb3J0YW50O1xuICAgIGhlaWdodDogYXV0byAhaW1wb3J0YW50O1xuICAgIHBhZGRpbmc6IDAgIWltcG9ydGFudDtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmO1xuICAgIG92ZXJmbG93OiBoaWRkZW4gIWltcG9ydGFudDtcbiAgfVxuICAub3V0bGluZS1yZWFkZXJfX3Byb2dyZXNzIHtcbiAgICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7XG4gIH1cbiAgLm91dGxpbmUtcmVhZGVyX19wYXBlciB7XG4gICAgYm94LXNoYWRvdzogbm9uZTtcbiAgfVxuICAub3V0bGluZS1yZWFkZXIgcHJlIHtcbiAgICBwYWRkaW5nOiAxZW0gIWltcG9ydGFudDtcbiAgICBib3JkZXI6IDFweCBzb2xpZCAjZGRkICFpbXBvcnRhbnQ7XG4gICAgYm9yZGVyLXJhZGl1czogNHB4ICFpbXBvcnRhbnQ7XG4gIH1cbiAgLm91dGxpbmUtcmVhZGVyIHByZSxcbiAgLm91dGxpbmUtcmVhZGVyIGNvZGUge1xuICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmYgIWltcG9ydGFudDtcbiAgfVxuICAub3V0bGluZS1yZWFkZXIgdGFibGUsXG4gIC5vdXRsaW5lLXJlYWRlciBpbWcsXG4gIC5vdXRsaW5lLXJlYWRlciBzdmcge1xuICAgIGJyZWFrLWluc2lkZTogYXZvaWQ7XG4gIH1cbiAgLm91dGxpbmUtcmVhZGVyX3NpYmxpbmcge1xuICAgIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDtcbiAgfVxufVxuLyogPT09PT09PT09PSBidXR0b25zLnRoZW1lIC0g5oyJ6ZKu5a+86Iiq5qC35byPID09PT09PT09PT0gKi9cbi5vdXRsaW5lLXRvb2xiYXIge1xuICBwb3NpdGlvbjogZml4ZWQ7XG4gIHotaW5kZXg6IDk5OTk5O1xuICBtYXJnaW46IDA7XG4gIHRyYW5zaXRpb24tZHVyYXRpb246IDAuM3M7XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4ub3V0bGluZS10b29sYmFyX19idXR0b24ge1xuICBib3gtc2hhZG93OiAwIDAgNnB4IDFweCAjZGNkZmU2O1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIHotaW5kZXg6IDE7XG4gIG1hcmdpbjogMTBweDtcbiAgd2lkdGg6IDM2cHg7XG4gIGhlaWdodDogMzZweDtcbiAgYm9yZGVyOiAxcHggc29saWQgI2RjZGZlNjtcbiAgYm9yZGVyLXJhZGl1czogM3B4O1xuICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmO1xuICBjdXJzb3I6IHBvaW50ZXI7XG4gIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgY29sb3I6ICM5OTk7XG4gIHRyYW5zaXRpb246IGFsbCAwLjNzIDAuMXMgZWFzZS1pbi1vdXQ7XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4ub3V0bGluZS10b29sYmFyX19idXR0b246aG92ZXIge1xuICBjb2xvcjogIzA1ODk0MjtcbiAgYm9yZGVyLWNvbG9yOiAjMDU4OTQyO1xuICB0cmFuc2Zvcm06IHNjYWxlKDEuMzUpO1xufVxuLm91dGxpbmUtdG9vbGJhcl9fYnV0dG9uLmhpZGUge1xuICBkaXNwbGF5OiBub25lO1xufVxuLm91dGxpbmUtdG9vbGJhcl9fYW5jaG9yOmxpbmssXG4ub3V0bGluZS10b29sYmFyX19hbmNob3I6dmlzaXRlZCxcbi5vdXRsaW5lLXRvb2xiYXJfX2FuY2hvcjpob3ZlciB7XG4gIGNvbG9yOiAjOTk5O1xuICB0ZXh0LWRlY29yYXRpb246IG5vbmU7XG59XG4ub3V0bGluZS10b29sYmFyX19hbmNob3I6aG92ZXIge1xuICBjb2xvcjogIzA1ODk0Mjtcbn1cbi5vdXRsaW5lLXRvb2xiYXJfX2ljb24ge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHotaW5kZXg6IDI7XG4gIHRvcDogNTAlO1xuICBsZWZ0OiA1MCU7XG4gIHdpZHRoOiAyMHB4O1xuICBoZWlnaHQ6IDIwcHg7XG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIC01MCUpO1xuICBmaWxsOiBjdXJyZW50Y29sb3I7XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4ub3V0bGluZS10b29sYmFyX2FjdGl2ZS5vdXRsaW5lLXRvb2xiYXJfX2J1dHRvbiB7XG4gIGNvbG9yOiAjZmZmO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjMDU4OTQyO1xuICBib3JkZXItY29sb3I6ICMwNTg5NDI7XG59XG4ub3V0bGluZS10b29sYmFyX2FjdGl2ZS5vdXRsaW5lLXRvb2xiYXJfX2J1dHRvbjpob3ZlciB7XG4gIGNvbG9yOiAjZmZmO1xufVxuLm91dGxpbmUtdG9vbGJhcl9hY3RpdmUgLm91dGxpbmUtdG9vbGJhcl9fYW5jaG9yOmxpbmssXG4ub3V0bGluZS10b29sYmFyX2FjdGl2ZSAub3V0bGluZS10b29sYmFyX19hbmNob3I6dmlzaXRlZCxcbi5vdXRsaW5lLXRvb2xiYXJfYWN0aXZlIC5vdXRsaW5lLXRvb2xiYXJfX2FuY2hvcjpob3ZlciB7XG4gIGNvbG9yOiAjZmZmO1xufVxuLm91dGxpbmUtdG9vbGJhcl9yb3VuZGVkLm91dGxpbmUtdG9vbGJhcl9fYnV0dG9uIHtcbiAgYm9yZGVyLXJhZGl1czogMThweDtcbn1cbi5vdXRsaW5lLXRvb2xiYXJfZGlzYWJsZWQub3V0bGluZS10b29sYmFyX19hbmNob3I6bGluayxcbi5vdXRsaW5lLXRvb2xiYXJfZGlzYWJsZWQgLm91dGxpbmUtdG9vbGJhcl9fYW5jaG9yOmxpbmssXG4ub3V0bGluZS10b29sYmFyX2Rpc2FibGVkLm91dGxpbmUtdG9vbGJhcl9fYW5jaG9yOnZpc2l0ZWQsXG4ub3V0bGluZS10b29sYmFyX2Rpc2FibGVkIC5vdXRsaW5lLXRvb2xiYXJfX2FuY2hvcjp2aXNpdGVkLFxuLm91dGxpbmUtdG9vbGJhcl9kaXNhYmxlZC5vdXRsaW5lLXRvb2xiYXJfX2FuY2hvcjpob3Zlcixcbi5vdXRsaW5lLXRvb2xiYXJfZGlzYWJsZWQgLm91dGxpbmUtdG9vbGJhcl9fYW5jaG9yOmhvdmVyLFxuLm91dGxpbmUtdG9vbGJhcl9kaXNhYmxlZC5vdXRsaW5lLXRvb2xiYXJfX2J1dHRvbixcbi5vdXRsaW5lLXRvb2xiYXJfZGlzYWJsZWQgLm91dGxpbmUtdG9vbGJhcl9fYnV0dG9uIHtcbiAgY3Vyc29yOiBub3QtYWxsb3dlZDtcbiAgY29sb3I6ICM5OTk7XG4gIGJvcmRlci1jb2xvcjogIzk5OTtcbn1cbi5vdXRsaW5lLXRvb2xiYXJfZGlzYWJsZWQub3V0bGluZS10b29sYmFyX19hbmNob3I6bGluazpob3Zlcixcbi5vdXRsaW5lLXRvb2xiYXJfZGlzYWJsZWQgLm91dGxpbmUtdG9vbGJhcl9fYW5jaG9yOmxpbms6aG92ZXIsXG4ub3V0bGluZS10b29sYmFyX2Rpc2FibGVkLm91dGxpbmUtdG9vbGJhcl9fYW5jaG9yOnZpc2l0ZWQ6aG92ZXIsXG4ub3V0bGluZS10b29sYmFyX2Rpc2FibGVkIC5vdXRsaW5lLXRvb2xiYXJfX2FuY2hvcjp2aXNpdGVkOmhvdmVyLFxuLm91dGxpbmUtdG9vbGJhcl9kaXNhYmxlZC5vdXRsaW5lLXRvb2xiYXJfX2FuY2hvcjpob3Zlcjpob3Zlcixcbi5vdXRsaW5lLXRvb2xiYXJfZGlzYWJsZWQgLm91dGxpbmUtdG9vbGJhcl9fYW5jaG9yOmhvdmVyOmhvdmVyLFxuLm91dGxpbmUtdG9vbGJhcl9kaXNhYmxlZC5vdXRsaW5lLXRvb2xiYXJfX2J1dHRvbjpob3Zlcixcbi5vdXRsaW5lLXRvb2xiYXJfZGlzYWJsZWQgLm91dGxpbmUtdG9vbGJhcl9fYnV0dG9uOmhvdmVyIHtcbiAgY29sb3I6ICM5OTk7XG4gIGJvcmRlci1jb2xvcjogIzk5OTtcbn1cbi5vdXRsaW5lLXRvb2xiYXJfZGlzYWJsZWQub3V0bGluZS10b29sYmFyX19idXR0b24sXG4ub3V0bGluZS10b29sYmFyX2Rpc2FibGVkIC5vdXRsaW5lLXRvb2xiYXJfX2J1dHRvbiB7XG4gIGJhY2tncm91bmQtY29sb3I6ICNmNWY1ZjU7XG59XG4ub3V0bGluZS10b29sYmFyX3R0Yixcbi5vdXRsaW5lLXRvb2xiYXJfYnR0IHtcbiAgbGVmdDogNTAlO1xuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTUwJSk7XG59XG4ub3V0bGluZS10b29sYmFyX3R0YiAub3V0bGluZS10b29sYmFyX19idXR0b24sXG4ub3V0bGluZS10b29sYmFyX2J0dCAub3V0bGluZS10b29sYmFyX19idXR0b24ge1xuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG59XG4ub3V0bGluZS10b29sYmFyX3R0YiB7XG4gIHRvcDogMTJweDtcbn1cbi5vdXRsaW5lLXRvb2xiYXJfdHRiLm91dGxpbmUtdG9vbGJhcl9oaWRkZW4ge1xuICB0b3A6IC01NnB4O1xufVxuLm91dGxpbmUtdG9vbGJhcl9idHQge1xuICBib3R0b206IDEycHg7XG59XG4ub3V0bGluZS10b29sYmFyX2J0dC5vdXRsaW5lLXRvb2xiYXJfaGlkZGVuIHtcbiAgYm90dG9tOiAtNTZweDtcbn1cbi5vdXRsaW5lLXRvb2xiYXJfcnRsLFxuLm91dGxpbmUtdG9vbGJhcl9sdHIge1xuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTUwJSk7XG4gIHdpZHRoOiA1NnB4O1xufVxuLm91dGxpbmUtdG9vbGJhcl9ydGwge1xuICB0b3A6IDUwJTtcbiAgcmlnaHQ6IDEycHg7XG59XG4ub3V0bGluZS10b29sYmFyX3J0bC5vdXRsaW5lLXRvb2xiYXJfaGlkZGVuIHtcbiAgcmlnaHQ6IC04NnB4O1xufVxuLm91dGxpbmUtdG9vbGJhcl9sdHIge1xuICB0b3A6IDUwJTtcbiAgbGVmdDogMTJweDtcbn1cbi5vdXRsaW5lLXRvb2xiYXJfbHRyLm91dGxpbmUtdG9vbGJhcl9oaWRkZW4ge1xuICBsZWZ0OiAtODZweDtcbn1cbi5vdXRsaW5lLXRvb2xiYXJfdHRiIC5vdXRsaW5lLXRvb2xiYXJfX2J1dHRvbi5vdXRsaW5lLXRvb2xiYXJfaGlkZGVuLFxuLm91dGxpbmUtdG9vbGJhcl9ydGwgLm91dGxpbmUtdG9vbGJhcl9fYnV0dG9uLm91dGxpbmUtdG9vbGJhcl9oaWRkZW4sXG4ub3V0bGluZS10b29sYmFyX2J0dCAub3V0bGluZS10b29sYmFyX19idXR0b24ub3V0bGluZS10b29sYmFyX2hpZGRlbixcbi5vdXRsaW5lLXRvb2xiYXJfbHRyIC5vdXRsaW5lLXRvb2xiYXJfX2J1dHRvbi5vdXRsaW5lLXRvb2xiYXJfaGlkZGVuIHtcbiAgZGlzcGxheTogbm9uZTtcbn1cbi5vdXRsaW5lLW1lc3NhZ2Uge1xuICBib3JkZXItcmFkaXVzOiAzcHg7XG4gIGJveC1zaGFkb3c6IDAgMCA2cHggMXB4ICNkY2RmZTY7XG4gIHBvc2l0aW9uOiBmaXhlZDtcbiAgei1pbmRleDogOTk5OTtcbiAgb3BhY2l0eTogMC4xO1xuICB0b3A6IC01MHB4O1xuICBsZWZ0OiA1MCU7XG4gIGhlaWdodDogNDBweDtcbiAgbWFyZ2luOiAwO1xuICBwYWRkaW5nOiAwIDUwcHg7XG4gIGxpbmUtaGVpZ2h0OiA0MHB4O1xuICBmb250LXNpemU6IDEzcHg7XG4gIGJhY2tncm91bmQtY29sb3I6ICNmZmY7XG4gIGNvbG9yOiAjNjY2O1xuICB0cmFuc2l0aW9uOiBhbGwgMC41cyBlYXNlLWluLW91dDtcbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC01MCUpO1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLm91dGxpbmUtbWVzc2FnZV9fY29udGVudCB7XG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzO1xuICBtYXJnaW46IDA7XG4gIG1heC13aWR0aDogNzAwcHg7XG4gIGhlaWdodDogNDBweDtcbiAgbGluZS1oZWlnaHQ6IDQwcHg7XG4gIGZvbnQtc2l6ZTogMTNweDtcbiAgY29sb3I6ICM2NjY7XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4ub3V0bGluZS1tZXNzYWdlX19jbG9zZSxcbi5vdXRsaW5lLW1lc3NhZ2VfX2ljb24ge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHotaW5kZXg6IDI7XG4gIHRvcDogMDtcbiAgd2lkdGg6IDQwcHg7XG4gIGhlaWdodDogNDBweDtcbiAgbGluZS1oZWlnaHQ6IDQwcHg7XG4gIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi5vdXRsaW5lLW1lc3NhZ2VfX2ljb24ge1xuICBsZWZ0OiAwO1xuICBjb2xvcjogI2ZmZjtcbn1cbi5vdXRsaW5lLW1lc3NhZ2VfX2ljb24gLm91dGxpbmUtaWNvbiB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgei1pbmRleDogMjtcbiAgdG9wOiA1MCU7XG4gIGxlZnQ6IDUwJTtcbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgLTUwJSk7XG59XG4ub3V0bGluZS1tZXNzYWdlX19jbG9zZSB7XG4gIHJpZ2h0OiAwO1xuICBjdXJzb3I6IHBvaW50ZXI7XG4gIGNvbG9yOiAjOTk5O1xufVxuLm91dGxpbmUtbWVzc2FnZV9fY2xvc2UgLm91dGxpbmUtaWNvbiB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgei1pbmRleDogMjtcbiAgdG9wOiA1MCU7XG4gIGxlZnQ6IDUwJTtcbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgLTUwJSk7XG59XG4ub3V0bGluZS1tZXNzYWdlX19jbG9zZTpob3ZlciB7XG4gIGNvbG9yOiAjNjY2O1xufVxuLm91dGxpbmUtbWVzc2FnZV9pbmZvIC5vdXRsaW5lLW1lc3NhZ2VfX2ljb24ge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjNTA3YWZlO1xufVxuLm91dGxpbmUtbWVzc2FnZV93YXJuaW5nIC5vdXRsaW5lLW1lc3NhZ2VfX2ljb24ge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmY5OTAxO1xufVxuLm91dGxpbmUtbWVzc2FnZV9zdWNjZXNzIC5vdXRsaW5lLW1lc3NhZ2VfX2ljb24ge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjMDU4OTQyO1xufVxuLm91dGxpbmUtbWVzc2FnZV9lcnJvciAub3V0bGluZS1tZXNzYWdlX19pY29uIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ZmNWQ1ZDtcbn1cbi5vdXRsaW5lLW1lc3NhZ2VfcGxhaW4ge1xuICBtaW4td2lkdGg6IDE5MHB4O1xuICBwYWRkaW5nOiAwIDUwcHggMCAxNXB4O1xufVxuLm91dGxpbmUtbWVzc2FnZV9wbGFpbi5vdXRsaW5lLW1lc3NhZ2VfaW5mbyB7XG4gIGJvcmRlci1sZWZ0OiA1cHggc29saWQgIzUwN2FmZTtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2VjZjhmZjtcbn1cbi5vdXRsaW5lLW1lc3NhZ2VfcGxhaW4ub3V0bGluZS1tZXNzYWdlX3dhcm5pbmcge1xuICBib3JkZXItbGVmdDogNXB4IHNvbGlkICNmZjk5MDE7XG4gIGJhY2tncm91bmQtY29sb3I6ICNmZmZiZTY7XG59XG4ub3V0bGluZS1tZXNzYWdlX3BsYWluLm91dGxpbmUtbWVzc2FnZV9zdWNjZXNzIHtcbiAgYm9yZGVyLWxlZnQ6IDVweCBzb2xpZCAjMDU4OTQyO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZTFmNmViO1xufVxuLm91dGxpbmUtbWVzc2FnZV9wbGFpbi5vdXRsaW5lLW1lc3NhZ2VfZXJyb3Ige1xuICBib3JkZXItbGVmdDogNXB4IHNvbGlkICNmZjVkNWQ7XG4gIGJhY2tncm91bmQtY29sb3I6ICNmZmYxZjA7XG59XG4ub3V0bGluZS1tZXNzYWdlX3BsYWluIC5vdXRsaW5lLW1lc3NhZ2VfX2ljb24ge1xuICB3aWR0aDogMDtcbiAgZGlzcGxheTogbm9uZTtcbn1cbi5vdXRsaW5lLW1lc3NhZ2VfcGxhaW4gLm91dGxpbmUtbWVzc2FnZV9faWNvbiAub3V0bGluZS1pY29uIHtcbiAgZGlzcGxheTogbm9uZTtcbn1cbi5vdXRsaW5lLW1lc3NhZ2VfbGlnaHQge1xuICBtaW4td2lkdGg6IDE4MHB4O1xuICBwYWRkaW5nOiAwIDQwcHg7XG59XG4ub3V0bGluZS1tZXNzYWdlX2xpZ2h0Lm91dGxpbmUtbWVzc2FnZV9pbmZvIC5vdXRsaW5lLW1lc3NhZ2VfX2ljb24ge1xuICBjb2xvcjogIzUwN2FmZTtcbn1cbi5vdXRsaW5lLW1lc3NhZ2VfbGlnaHQub3V0bGluZS1tZXNzYWdlX3dhcm5pbmcgLm91dGxpbmUtbWVzc2FnZV9faWNvbiB7XG4gIGNvbG9yOiAjZmY5OTAxO1xufVxuLm91dGxpbmUtbWVzc2FnZV9saWdodC5vdXRsaW5lLW1lc3NhZ2Vfc3VjY2VzcyAub3V0bGluZS1tZXNzYWdlX19pY29uIHtcbiAgY29sb3I6ICMwNTg5NDI7XG59XG4ub3V0bGluZS1tZXNzYWdlX2xpZ2h0Lm91dGxpbmUtbWVzc2FnZV9lcnJvciAub3V0bGluZS1tZXNzYWdlX19pY29uIHtcbiAgY29sb3I6ICNmZjVkNWQ7XG59XG4ub3V0bGluZS1tZXNzYWdlX2xpZ2h0IC5vdXRsaW5lLW1lc3NhZ2VfX2ljb24ge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmO1xufVxuLm91dGxpbmUtbWVzc2FnZV9yb3VuZCB7XG4gIGJvcmRlci1yYWRpdXM6IDIwcHg7XG59XG4ub3V0bGluZS1tZXNzYWdlX3JvdW5kLm91dGxpbmUtbWVzc2FnZV9kZWZhdWx0IHtcbiAgbWluLXdpZHRoOiAxODBweDtcbiAgcGFkZGluZzogMCA0MHB4O1xufVxuLm91dGxpbmUtbWVzc2FnZV9yb3VuZC5vdXRsaW5lLW1lc3NhZ2VfZGVmYXVsdCAub3V0bGluZS1tZXNzYWdlX19pY29uIHtcbiAgYm9yZGVyLXJhZGl1czogMTBweDtcbiAgdG9wOiAxMHB4O1xuICBsZWZ0OiAxMHB4O1xuICB3aWR0aDogMjBweDtcbiAgaGVpZ2h0OiAyMHB4O1xuICBsaW5lLWhlaWdodDogMjBweDtcbn1cbi5vdXRsaW5lLW1lc3NhZ2Vfcm91bmQub3V0bGluZS1tZXNzYWdlX2RlZmF1bHQub3V0bGluZS1tZXNzYWdlX2Z1bGwtd2lkdGgge1xuICBtaW4td2lkdGg6IDIwMHB4O1xuICBwYWRkaW5nOiAwIDIwcHggMCA0MHB4O1xufVxuLm91dGxpbmUtbWVzc2FnZV9yb3VuZC5vdXRsaW5lLW1lc3NhZ2VfcGxhaW4ge1xuICBtaW4td2lkdGg6IDE5NXB4O1xuICBwYWRkaW5nOiAwIDQwcHggMCAyMHB4O1xufVxuLm91dGxpbmUtbWVzc2FnZV9yb3VuZC5vdXRsaW5lLW1lc3NhZ2VfcGxhaW4ub3V0bGluZS1tZXNzYWdlX2Z1bGwtd2lkdGgge1xuICBtaW4td2lkdGg6IDIxNXB4O1xuICBwYWRkaW5nOiAwIDIwcHg7XG59XG4ub3V0bGluZS1tZXNzYWdlX2Z1bGwtd2lkdGgge1xuICBtaW4td2lkdGg6IDIwMHB4O1xuICBwYWRkaW5nOiAwIDEwcHggMCA1MHB4O1xufVxuLm91dGxpbmUtbWVzc2FnZV9mdWxsLXdpZHRoLm91dGxpbmUtbWVzc2FnZV9wbGFpbiB7XG4gIG1pbi13aWR0aDogMjMwcHg7XG4gIHBhZGRpbmc6IDAgMTBweCAwIDE1cHg7XG59XG4ub3V0bGluZS1tZXNzYWdlX2Z1bGwtd2lkdGgub3V0bGluZS1tZXNzYWdlX2xpZ2h0IHtcbiAgbWluLXdpZHRoOiAyMTBweDtcbiAgcGFkZGluZzogMCAxMHB4IDAgNDBweDtcbn1cbi5vdXRsaW5lLW1lc3NhZ2VfdmlzaWJsZSB7XG4gIG9wYWNpdHk6IDE7XG59XG4ub3V0bGluZS1tZXNzYWdlX2hpZGRlbiB7XG4gIGRpc3BsYXk6IG5vbmU7XG59XG4vKiA9PT09PSBTY3JvbGxiYXIgPT09PT0gKi9cbjo6LXdlYmtpdC1zY3JvbGxiYXIge1xuICB3aWR0aDogN3B4O1xuICBoZWlnaHQ6IDdweDtcbiAgLXdlYmtpdC1ib3JkZXItcmFkaXVzOiA1cHg7XG59XG46Oi13ZWJraXQtc2Nyb2xsYmFyLXRyYWNrLXBpZWNlIHtcbiAgLXdlYmtpdC1ib3JkZXItcmFkaXVzOiA1cHg7XG59XG46Oi13ZWJraXQtc2Nyb2xsYmFyLXRodW1iOnZlcnRpY2FsIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjI1KTtcbiAgLXdlYmtpdC1ib3JkZXItcmFkaXVzOiA1cHg7XG59XG46Oi13ZWJraXQtc2Nyb2xsYmFyLXRodW1iOmhvcml6b250YWwge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuMjUpO1xuICAtd2Via2l0LWJvcmRlci1yYWRpdXM6IDVweDtcbn1cbjo6LXdlYmtpdC1zY3JvbGxiYXItdGh1bWI6aG92ZXIge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuMzUpO1xufVxuOjotd2Via2l0LXNjcm9sbGJhcjpob3ZlciB7XG4gIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMCwgMCwgMCwgMC4xNSk7XG59XG4iLCIvKiA9PT09PSBTY3JvbGxiYXIgPT09PT0gKi9cclxuOjotd2Via2l0LXNjcm9sbGJhciB7XHJcbiAgd2lkdGg6IDdweDtcclxuICBoZWlnaHQ6IDdweDtcclxuICAtd2Via2l0LWJvcmRlci1yYWRpdXM6IDVweDtcclxufVxyXG5cclxuOjotd2Via2l0LXNjcm9sbGJhci10cmFjay1waWVjZSB7XHJcbiAgLXdlYmtpdC1ib3JkZXItcmFkaXVzOiA1cHg7XHJcbn1cclxuXHJcbjo6LXdlYmtpdC1zY3JvbGxiYXItdGh1bWI6dmVydGljYWwge1xyXG4gIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMCwgMCwgMCwgMC4yNSk7XHJcbiAgLXdlYmtpdC1ib3JkZXItcmFkaXVzOiA1cHg7XHJcbn1cclxuXHJcbjo6LXdlYmtpdC1zY3JvbGxiYXItdGh1bWI6aG9yaXpvbnRhbCB7XHJcbiAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjI1KTtcclxuICAtd2Via2l0LWJvcmRlci1yYWRpdXM6IDVweDtcclxufVxyXG5cclxuOjotd2Via2l0LXNjcm9sbGJhcjpob3ZlciB7XHJcbiAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjE1KTtcclxufVxyXG5cclxuOjotd2Via2l0LXNjcm9sbGJhci10aHVtYjpob3ZlciB7XHJcbiAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjM1KTtcclxufVxyXG4iLCJAaW1wb3J0ICcuL2NvbG9ycyc7XHJcblxyXG4uc2VjdGlvbiB7XHJcbiAgbWFyZ2luOiAxZW0gMDtcclxuICBvdmVyZmxvdzogaGlkZGVuO1xyXG5cclxuICAmX19oZWFkZXIsXHJcbiAgJl9fY29udGVudCxcclxuICAmX19mb290ZXIge1xyXG4gICAgbWFyZ2luOiAwO1xyXG4gICAgcGFkZGluZzogMCAzZW07XHJcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xyXG4gIH1cclxuXHJcbiAgJl9fdGl0bGUge1xyXG4gICAgY29sb3I6IEB0aGlyZF90ZXh0X2NvbG9yO1xyXG4gIH1cclxuXHJcbiAgJl9faDMge1xyXG4gICAgY29sb3I6IEBwcmltYXJ5X2NvbG9yO1xyXG4gICAgZm9udC1zaXplOiAxLjM1ZW07XHJcbiAgfVxyXG5cclxuICAmX19oNCB7XHJcbiAgICBmb250LXNpemU6IDEuMWVtO1xyXG4gICAgY29sb3I6IEB0aGlyZF90ZXh0X2NvbG9yO1xyXG4gIH1cclxuXHJcbiAgJl9faDUge1xyXG4gICAgZm9udC1zaXplOiAxZW07XHJcbiAgICBjb2xvcjogQGZvdXJ0aF90ZXh0X2NvbG9yO1xyXG4gIH1cclxuXHJcbiAgJl9fZGwsXHJcbiAgJl9fZHQsXHJcbiAgJl9fZGQge1xyXG4gICAgbWFyZ2luOiAwO1xyXG4gICAgcGFkZGluZzogMDtcclxuICAgIG92ZXJmbG93OiBoaWRkZW47XHJcbiAgfVxyXG5cclxuICAmX19kbCB7XHJcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XHJcbiAgICB6LWluZGV4OiAxO1xyXG4gIH1cclxuXHJcbiAgJl9fZHQge1xyXG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xyXG4gIH1cclxuXHJcbiAgJl9fZGQge1xyXG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xyXG4gICAgY29sb3I6IEBzdWNjZXNzX2NvbG9yO1xyXG4gIH1cclxuXHJcbiAgJl9fcHJlIHtcclxuICAgIG1hcmdpbjogMmVtIDA7XHJcbiAgICBwYWRkaW5nOiAxZW07XHJcbiAgICBmb250LXNpemU6IDE0cHg7XHJcbiAgICBsaW5lLWhlaWdodDogMTUwJTtcclxuICAgIHRleHQtYWxpZ246IGxlZnQ7XHJcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAYmdfY29sb3I7XHJcbiAgICBib3JkZXI6IDFweCBzb2xpZCBAYm9yZGVyX2NvbG9yO1xyXG4gICAgYm9yZGVyLXJhZGl1czogNHB4O1xyXG4gICAgY29sb3I6IEB0aGlyZF90ZXh0X2NvbG9yO1xyXG4gICAgb3ZlcmZsb3c6IGF1dG87XHJcbiAgfVxyXG5cclxuICAmX19jb2RlIHtcclxuICAgIGRpc3BsYXk6IGJsb2NrO1xyXG4gICAgbWFyZ2luOiAwIGF1dG87XHJcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xyXG4gIH1cclxuXHJcbiAgJl9fZm9vdGVyIHtcclxuICAgIGJvcmRlci10b3A6IDFweCBzb2xpZCBAYm9yZGVyX2NvbG9yO1xyXG4gICAgbWFyZ2luLXRvcDogM2VtO1xyXG4gICAgYmFja2dyb3VuZC1jb2xvcjogQGJnX2NvbG9yO1xyXG4gICAgY29sb3I6IEBmb3VydGhfdGV4dF9jb2xvcjtcclxuICB9XHJcblxyXG4gICZfX3RhYmxlIHtcclxuICAgIG1hcmdpbjogMWVtIGF1dG87XHJcbiAgICB3aWR0aDogMTAwJTtcclxuICAgIGJvcmRlci10b3A6IDFweCBzb2xpZCBAYm9yZGVyX2NvbG9yO1xyXG4gIH1cclxuXHJcbiAgJl9fdGgsXHJcbiAgJl9fdGQge1xyXG4gICAgcGFkZGluZzogNXB4IDE2cHg7XHJcbiAgICBsaW5lLWhlaWdodDogMjZweDtcclxuICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCBAYm9yZGVyX2NvbG9yO1xyXG4gIH1cclxuXHJcbiAgJl9fdGgge1xyXG4gICAgdGV4dC1hbGlnbjogY2VudGVyO1xyXG4gICAgYmFja2dyb3VuZC1jb2xvcjogQGJnX2NvbG9yO1xyXG4gIH1cclxufVxyXG5cclxuQG1lZGlhIChtYXgtd2lkdGg6IDUwMHB4KSB7XHJcbiAgLnNlY3Rpb24ge1xyXG4gICAgJl9faGVhZGVyLFxyXG4gICAgJl9fY29udGVudCB7XHJcbiAgICAgIHBhZGRpbmc6IDAgMWVtO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG4iLCJAaW1wb3J0ICcuL2NvbG9ycyc7XHJcblxyXG4uY2FzZSB7XHJcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xyXG4gIHotaW5kZXg6IDE7XHJcbiAgZGlzcGxheTogZ3JpZDtcclxuICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IHJlcGVhdCgyLCAxZnIpO1xyXG4gIGdhcDogNDBweDtcclxuICBwYWRkaW5nOiAxZW07XHJcbiAgYm9yZGVyLXRvcDogMXB4IHNvbGlkIEBib3JkZXJfY29sb3I7XHJcbiAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIEBib3JkZXJfY29sb3I7XHJcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcclxuXHJcbiAgJjphZnRlciB7XHJcbiAgICBjb250ZW50OiAnJztcclxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcclxuICAgIHotaW5kZXg6IDI7XHJcbiAgICB0b3A6IDA7XHJcbiAgICBsZWZ0OiA1MCU7XHJcbiAgICBoZWlnaHQ6IDEwMCU7XHJcbiAgICB3aWR0aDogMDtcclxuICAgIGJvcmRlci1sZWZ0OiAxcHggc29saWQgQGJvcmRlcl9jb2xvcjtcclxuICAgIG92ZXJmbG93OiBoaWRkZW47XHJcbiAgfVxyXG5cclxuICAmX19wcmUsXHJcbiAgJl9fdGV4dGFyZWEge1xyXG4gICAgZm9udC1zaXplOiAxM3B4O1xyXG4gICAgbGluZS1oZWlnaHQ6IDE1MCU7XHJcbiAgfVxyXG5cclxuICAmX19wcmUsXHJcbiAgJl9fY29kZSxcclxuICAmX190ZXh0YXJlYSB7XHJcbiAgICBmb250LWZhbWlseTogJ0NvdXJpZXIgTmV3JywgQ29uc29sYXMsIEdlb3JnaWEsIEFyaWFsLCBzYW5zLXNlcmlmO1xyXG4gIH1cclxuXHJcbiAgJl9fcHJlIHtcclxuICAgIG1hcmdpbjogMDtcclxuICAgIHBhZGRpbmc6IDFlbTtcclxuICAgIGJhY2tncm91bmQtY29sb3I6IEBiZ19jb2xvcjtcclxuICAgIGhlaWdodDogMTAwJTtcclxuICAgIGJvcmRlci1yYWRpdXM6IDRweDtcclxuICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XHJcbiAgICBvdmVyZmxvdzogYXV0bztcclxuICB9XHJcblxyXG4gICZfX3Rvb2xiYXIge1xyXG4gICAgbWFyZ2luOiAwIGF1dG87XHJcbiAgICBoZWlnaHQ6IDM2cHg7XHJcbiAgICBsaW5lLWhlaWdodDogMzZweDtcclxuICAgIGZvbnQtc2l6ZTogMTRweDtcclxuICAgIHBhZGRpbmc6IDAgMTZweDtcclxuICAgIHRleHQtYWxpZ246IHJpZ2h0O1xyXG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcclxuICB9XHJcblxyXG4gICZfX2FjdGlvbixcclxuICAmX19yZW1vdmUge1xyXG4gICAgY3Vyc29yOiBwb2ludGVyO1xyXG4gICAgY29sb3I6IEBzdWNjZXNzX2NvbG9yO1xyXG4gICAgdXNlci1zZWxlY3Q6IG5vbmU7XHJcbiAgfVxyXG5cclxuICAmX19hY3Rpb24ge1xyXG4gICAgZm9udC1zaXplOiAxM3B4O1xyXG4gICAgcGFkZGluZy1sZWZ0OiAxMHB4O1xyXG5cclxuICAgICY6Zmlyc3QtY2hpbGQge1xyXG4gICAgICBwYWRkaW5nLWxlZnQ6IDA7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAmX19yZW1vdmUge1xyXG4gICAgZmxvYXQ6IHJpZ2h0O1xyXG4gIH1cclxuXHJcbiAgJl9fY29uc29sZSB7XHJcbiAgICBtYXJnaW46IDAgYXV0bztcclxuICAgIGhlaWdodDogMTgwcHg7XHJcbiAgICBib3JkZXI6IDFweCBzb2xpZCBAYm9yZGVyX2NvbG9yO1xyXG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcclxuICB9XHJcblxyXG4gICZfX3RleHRhcmVhIHtcclxuICAgIG1hcmdpbjogMCBhdXRvO1xyXG4gICAgd2lkdGg6IDEwMCU7XHJcbiAgICBoZWlnaHQ6IDEwMCU7XHJcbiAgICBib3JkZXI6IG5vbmU7XHJcbiAgICBvdXRsaW5lOiBub25lO1xyXG4gICAgcGFkZGluZzogMWVtO1xyXG4gICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcclxuICAgIG92ZXJmbG93OiBhdXRvO1xyXG4gIH1cclxuXHJcbiAgJl9fbGlzdCxcclxuICAmX19pdGVtIHtcclxuICAgIG1hcmdpbjogMDtcclxuICAgIHBhZGRpbmc6IDA7XHJcbiAgICBsaXN0LXN0eWxlLXR5cGU6IG5vbmU7XHJcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xyXG4gIH1cclxuXHJcbiAgJl9fbGlzdCB7XHJcbiAgICBoZWlnaHQ6IDM2MHB4O1xyXG4gICAgYm9yZGVyLXRvcDogMXB4IHNvbGlkIEBib3JkZXJfY29sb3I7XHJcbiAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgQGJvcmRlcl9jb2xvcjtcclxuICAgIGZvbnQtc2l6ZTogMTNweDtcclxuICAgIG92ZXJmbG93OiBhdXRvO1xyXG4gIH1cclxuXHJcbiAgJl9faXRlbSB7XHJcbiAgICBoZWlnaHQ6IDM2cHg7XHJcbiAgICBsaW5lLWhlaWdodDogMzZweDtcclxuICAgIGN1cnNvcjogcG9pbnRlcjtcclxuICAgIHBhZGRpbmc6IDAgMTZweDtcclxuXHJcbiAgICAmOmhvdmVyIHtcclxuICAgICAgYmFja2dyb3VuZC1jb2xvcjogQGhvdmVyX2JnX2NvbG9yO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG4iLCJAaW1wb3J0ICcuLi8uLi90aGVtZS9taXhpbnMnO1xyXG5cclxuLnBhcGVyIHtcclxuICAuc2hhZG93X2xpZ2h0X3JlZ3VsYXIoKTtcclxuICBtYXJnaW46IDNlbSBhdXRvO1xyXG4gIG1heC13aWR0aDogMTIwMHB4O1xyXG4gIHBhZGRpbmc6IDJlbTtcclxuICBiYWNrZ3JvdW5kLWNvbG9yOiBAd2hpdGU7XHJcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDtcclxuXHJcbiAgJi5mbGV4IHtcclxuICAgIGRpc3BsYXk6IGZsZXg7XHJcbiAgICBmbGV4LWRpcmVjdGlvbjogcm93O1xyXG4gICAgZmxleC13cmFwOiBub3dyYXA7XHJcbiAgICBtYXJnaW46IDA7XHJcbiAgICB3aWR0aDogMTAwJTtcclxuICAgIG1heC13aWR0aDogMTAwJTtcclxuICAgIGhlaWdodDogMTAwJTtcclxuICAgIHBhZGRpbmc6IDA7XHJcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xyXG5cclxuICAgIC5hcnRpY2xlIHtcclxuICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcclxuICAgICAgd2lkdGg6IDEwMCU7XHJcbiAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XHJcblxyXG4gICAgICAmX19tYWluIHtcclxuICAgICAgICBoZWlnaHQ6IDEwMCU7XHJcbiAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcclxuICAgICAgICBvdmVyZmxvdzogYXV0bztcclxuICAgICAgfVxyXG5cclxuICAgICAgJl9fYXNpZGUge1xyXG4gICAgICAgIGJvcmRlci1yaWdodDogMXB4IHNvbGlkIEBwcmltYXJ5X2JvcmRlcl9jb2xvcjtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxufVxyXG5cclxuLmhlYWRlciB7XHJcbiAgcG9zaXRpb246IHN0aWNreTtcclxuICB6LWluZGV4OiAzO1xyXG4gIHRvcDogMDtcclxuICBtYXJnaW46IDAgYXV0bztcclxuICBib3JkZXItYm90dG9tOiAxcHggc29saWQgQGJvcmRlcl9jb2xvcjtcclxuICBiYWNrZ3JvdW5kLWNvbG9yOiBAd2hpdGU7XHJcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xyXG4gIHRyYW5zaXRpb24tZHVyYXRpb246IDAuM3M7XHJcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcclxuXHJcbiAgJl9zdGlja3kge1xyXG4gICAgcGFkZGluZy1sZWZ0OiAyNjBweDtcclxuICB9XHJcbn1cclxuXHJcbi5hcnRpY2xlIHtcclxuICBkaXNwbGF5OiBmbGV4O1xyXG4gIGZsZXgtZGlyZWN0aW9uOiByb3c7XHJcbiAgZmxleC13cmFwOiBub3dyYXA7XHJcbiAgcGFkZGluZzogMmVtIDA7XHJcbiAgZm9udC1zaXplOiAxNnB4O1xyXG4gIGxpbmUtaGVpZ2h0OiAxNTAlO1xyXG5cclxuICAmX19tYWluIHtcclxuICAgIGZsZXg6IDE7XHJcbiAgICBwYWRkaW5nOiAwIDJlbTtcclxuICAgIG92ZXJmbG93OiBoaWRkZW47XHJcblxyXG4gICAgLnNlY3Rpb24ge1xyXG4gICAgICBvdmVyZmxvdzogdmlzaWJsZTtcclxuXHJcbiAgICAgICZfX2NvbnRlbnQsXHJcbiAgICAgICZfX2Zvb3RlcixcclxuICAgICAgJl9faGVhZGVyIHtcclxuICAgICAgICBvdmVyZmxvdzogdmlzaWJsZTtcclxuICAgICAgfVxyXG5cclxuICAgICAgJl9faGVhZGVyLFxyXG4gICAgICAmX19jb250ZW50IHtcclxuICAgICAgICBtYXJnaW46IDA7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gICZfX2FzaWRlIHtcclxuICAgIGZsZXgtc2hyaW5rOiAwO1xyXG4gICAgd2lkdGg6IDI0MHB4O1xyXG4gICAgYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCBAYm9yZGVyX2NvbG9yO1xyXG5cclxuICAgICYubHRyIHtcclxuICAgICAgYm9yZGVyLXJpZ2h0OiAxcHggc29saWQgQGJvcmRlcl9jb2xvcjtcclxuICAgICAgYm9yZGVyLWxlZnQ6IG5vbmU7XHJcbiAgICB9XHJcblxyXG4gICAgLm91dGxpbmUtbmF2aWdhdG9yIHtcclxuICAgICAgYmFja2dyb3VuZC1jb2xvcjogQHdoaXRlO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG5cclxucHJlLFxyXG4uc2VjdGlvbl9fcHJlIHtcclxuICBwYWRkaW5nOiAyZW07XHJcbiAgZm9udC1mYW1pbHk6ICdDb3VyaWVyIE5ldycsIEFyaWFsLCBzYW5zLXNlcmlmO1xyXG4gIGJhY2tncm91bmQtY29sb3I6IEBiZ19jb2xvcjtcclxuICBvdmVyZmxvdzogYXV0bztcclxufVxyXG5cclxuY29kZSxcclxuLnNlY3Rpb25fX2NvZGUge1xyXG4gIGZvbnQtZmFtaWx5OiAnQ291cmllciBOZXcnLCBBcmlhbCwgc2Fucy1zZXJpZjtcclxuICBmb250LXNpemU6IDE2cHg7XHJcbn1cclxuXHJcbi5mb290ZXIge1xyXG4gIGJvcmRlci10b3A6IDFweCBzb2xpZCBAcHJpbWFyeV9ib3JkZXJfY29sb3I7XHJcbiAgcGFkZGluZzogM2VtIDA7XHJcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xyXG5cclxuICBhIHtcclxuICAgICY6bGluayxcclxuICAgICY6dmlzaXRlZCxcclxuICAgICY6aG92ZXIge1xyXG4gICAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7XHJcbiAgICAgIGNvbG9yOiBAc3VjY2Vzc19jb2xvcjtcclxuICAgIH1cclxuXHJcbiAgICAmOmhvdmVyIHtcclxuICAgICAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcblxyXG4udXRpbHMtYm9yZGVyLXJpZ2h0IHtcclxuICBib3JkZXItcmlnaHQ6IDFweCBzb2xpZCBAcHJpbWFyeV9ib3JkZXJfY29sb3I7XHJcbn1cclxuXHJcbi5oaWRkZW4ge1xyXG4gIGRpc3BsYXk6IG5vbmU7XHJcbn1cclxuXHJcbkBtZWRpYSAobWF4LXdpZHRoOiA1MDBweCkge1xyXG4gIGh0bWwsXHJcbiAgYm9keSB7XHJcbiAgICBtYXJnaW46IDA7XHJcbiAgfVxyXG5cclxuICAucGFwZXIge1xyXG4gICAgbWFyZ2luOiAwO1xyXG4gICAgcGFkZGluZzogMDtcclxuICB9XHJcblxyXG4gIC5hcnRpY2xlX19tYWluIHtcclxuICAgIHBhZGRpbmc6IDAgMmVtO1xyXG4gIH1cclxufVxyXG4iLCIvKipcclxuICogc2hhZG93Lmxlc3MgLSDpmLTlvbHmoLflvI/orr7nva4gbWl4aW54IOWHveaVsFxyXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XHJcbiAqIENyZWF0ZWQgQnk6IFlhb2hhaXhpYW9cclxuICogVXBkYXRlOiAyMDIyLjMuMjBcclxuICovXHJcbkBpbXBvcnQgJy4vY29sb3JzJztcclxuXHJcbi8qID09PT09PSDpmLTlvbHmoLflvI/orr7nva7lh73mlbAgPT09PT09ICovXHJcbi5zaGFkb3coQG9mZnNldDogMCAwIDZweCAxcHgsIEBjb2xvcjogQHByaW1hcnlfYm9yZGVyX2NvbG9yKSB7XHJcbiAgYm94LXNoYWRvdzogQG9mZnNldCBAY29sb3I7XHJcbn1cclxuXHJcbi5zaGFkb3dfcmVndWxhcihAY29sb3I6IEBwcmltYXJ5X2JvcmRlcl9jb2xvcikge1xyXG4gIC5zaGFkb3coMCAwIDZweCAxcHgsIEBjb2xvcik7XHJcbn1cclxuXHJcbi5zaGFkb3dfbGFyZ2UoQGNvbG9yOiBAcHJpbWFyeV9ib3JkZXJfY29sb3IpIHtcclxuICAuc2hhZG93KDAgMCAxMnB4IDFweCwgQGNvbG9yKTtcclxufVxyXG5cclxuLnNoYWRvd19saWdodF9yZWd1bGFyKCkge1xyXG4gIC5zaGFkb3dfcmVndWxhcigpO1xyXG59XHJcblxyXG4uc2hhZG93X2xpZ2h0X2xhcmdlKCkge1xyXG4gIC5zaGFkb3dfbGFyZ2UoKTtcclxufVxyXG5cclxuLnNoYWRvd19kYXJrX3JlZ3VsYXIoKSB7XHJcbiAgLnNoYWRvd19yZWd1bGFyKEBzZWNvbmRhcnlfYm9yZGVyX2NvbG9yKTtcclxufVxyXG5cclxuLnNoYWRvd19kYXJrX2xhcmdlKCkge1xyXG4gIC5zaGFkb3dfbGFyZ2UoQHNlY29uZGFyeV9ib3JkZXJfY29sb3IpO1xyXG59XHJcbiIsIjpyb290IHtcclxuICAtLW91dGxpbmUtekluZGV4OiAyMDAwO1xyXG4gIC0tb3V0bGluZS1zdGlja3ktaGVpZ2h0OiAxMDAlO1xyXG4gIC0tb3V0bGluZS1uYXZpZ2F0b3Itd2lkdGg6IDEwMCU7XHJcbn1cclxuIiwiLyogPT09PT09PT09PSBpY29uLnRoZW1lIC0gc3ZnIOWbvuagh+eahOagt+W8jyA9PT09PT09PT09ICovXHJcbi5vdXRsaW5lLWljb24ge1xyXG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcclxuICB6LWluZGV4OiAxO1xyXG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcclxuICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO1xyXG4gIHdpZHRoOiAxZW07XHJcbiAgaGVpZ2h0OiAxZW07XHJcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcclxuXHJcbiAgJl9fc3ZnIHtcclxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcclxuICAgIHotaW5kZXg6IDI7XHJcbiAgICB0b3A6IDUwJTtcclxuICAgIGxlZnQ6IDUwJTtcclxuICAgIHdpZHRoOiAxZW07XHJcbiAgICBoZWlnaHQ6IDFlbTtcclxuICAgIGZpbGw6IGN1cnJlbnRjb2xvcjtcclxuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIC01MCUpO1xyXG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcclxuICB9XHJcblxyXG4gICZfaGlkZGVuIHtcclxuICAgIGRpc3BsYXk6IG5vbmU7XHJcbiAgfVxyXG59XHJcbiIsIkBpbXBvcnQgJ2NvbG9ycyc7XHJcblxyXG4ub3V0bGluZS1oZWFkaW5nIHtcclxuICBwb3NpdGlvbjogcmVsYXRpdmU7XHJcbiAgei1pbmRleDogMTtcclxuICBvdmVyZmxvdzogaGlkZGVuO1xyXG5cclxuICAmX19hbmNob3Ige1xyXG4gICAgZGlzcGxheTogbm9uZTtcclxuXHJcbiAgICAmOmxpbmssXHJcbiAgICAmOnZpc2l0ZWQsXHJcbiAgICAmOmhvdmVyIHtcclxuICAgICAgY29sb3I6IEBmb3VydGhfdGV4dF9jb2xvcjtcclxuICAgICAgdGV4dC1kZWNvcmF0aW9uOiBub25lO1xyXG4gICAgfVxyXG5cclxuICAgICY6aG92ZXIge1xyXG4gICAgICBjb2xvcjogQHByaW1hcnlfY29sb3I7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAmOmhvdmVyIHtcclxuICAgIC5vdXRsaW5lLWhlYWRpbmdfX2FuY2hvciB7XHJcbiAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcclxuICAgIH1cclxuICB9XHJcblxyXG4gICZfc3RhcnQge1xyXG4gICAgJjpob3ZlciB7XHJcbiAgICAgIG92ZXJmbG93OiB2aXNpYmxlO1xyXG4gICAgfVxyXG5cclxuICAgIC5vdXRsaW5lLWhlYWRpbmdfX2FuY2hvciB7XHJcbiAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcclxuICAgICAgei1pbmRleDogMjtcclxuICAgICAgdG9wOiA1MCU7XHJcbiAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtNTAlKTtcclxuICAgICAgbGVmdDogLTFlbTtcclxuICAgIH1cclxuICB9XHJcbn1cclxuIiwiQGltcG9ydCAnLi92YXJpYWJsZXMnO1xyXG5AaW1wb3J0ICcuL2NvbG9ycyc7XHJcbkBpbXBvcnQgJy4vc2hhZG93JztcclxuXHJcbi5vdXRsaW5lLWRyYXdlciB7XHJcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xyXG4gIHotaW5kZXg6IC0xO1xyXG4gIHRvcDogMDtcclxuICBsZWZ0OiAwO1xyXG4gIG1hcmdpbjogMDtcclxuICB3aWR0aDogMTAwJTtcclxuICBoZWlnaHQ6IDEwMCU7XHJcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDtcclxuICB2aXNpYmlsaXR5OiBoaWRkZW47XHJcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcclxuXHJcbiAgJl9fbW9kYWwge1xyXG4gICAgLnNoYWRvd19saWdodF9yZWd1bGFyKCk7XHJcbiAgICBkaXNwbGF5OiBmbGV4O1xyXG4gICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcclxuICAgIGZsZXgtd3JhcDogbm93cmFwO1xyXG4gICAgcG9zaXRpb246IGFic29sdXRlO1xyXG4gICAgei1pbmRleDogMjE7XHJcbiAgICBoZWlnaHQ6IDEwMCU7XHJcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAd2hpdGU7XHJcbiAgICB0cmFuc2l0aW9uLWR1cmF0aW9uOiAwLjRzO1xyXG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcclxuICB9XHJcblxyXG4gICZfX2hlYWRlcixcclxuICAmX19tYWluLFxyXG4gICZfX2Zvb3RlciB7XHJcbiAgICB3aWR0aDogMTAwJTtcclxuICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XHJcbiAgfVxyXG5cclxuICAmX19oZWFkZXIsXHJcbiAgJl9fZm9vdGVyIHtcclxuICAgIGZsZXgtc2hyaW5rOiAwO1xyXG4gIH1cclxuXHJcbiAgJl9fdGl0bGUsXHJcbiAgJl9fbWFpbixcclxuICAmX19mb290ZXIge1xyXG4gICAgcGFkZGluZzogMCAxNnB4O1xyXG4gIH1cclxuXHJcbiAgJl9faGVhZGVyLFxyXG4gICZfX3RpdGxlIHtcclxuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcclxuICAgIHotaW5kZXg6IDE7XHJcbiAgICBtYXJnaW46IDAgYXV0bztcclxuICAgIGhlaWdodDogNTJweDtcclxuICAgIGxpbmUtaGVpZ2h0OiA1MnB4O1xyXG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcclxuICB9XHJcblxyXG4gICZfX3RpdGxlIHtcclxuICAgIGZvbnQtc2l6ZTogMTZweDtcclxuICAgIGZvbnQtd2VpZ2h0OiA0MDA7XHJcbiAgICBtYXJnaW46IDAgMTZweDtcclxuICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XHJcbiAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgQHByaW1hcnlfYm9yZGVyX2NvbG9yO1xyXG4gIH1cclxuXHJcbiAgJl9fY2xvc2Uge1xyXG4gICAgcG9zaXRpb246IGFic29sdXRlO1xyXG4gICAgei1pbmRleDogMjtcclxuICAgIHRvcDogNTAlO1xyXG4gICAgcmlnaHQ6IDEycHg7XHJcbiAgICB3aWR0aDogMjBweDtcclxuICAgIGhlaWdodDogMjBweDtcclxuICAgIGxpbmUtaGVpZ2h0OiAyMHB4O1xyXG4gICAgY29sb3I6IEBmb3VydGhfdGV4dF9jb2xvcjtcclxuICAgIGZvbnQtc2l6ZTogMjBweDtcclxuICAgIHRleHQtYWxpZ246IGNlbnRlcjtcclxuICAgIGN1cnNvcjogcG9pbnRlcjtcclxuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtNTAlKTtcclxuICAgIG92ZXJmbG93OiBoaWRkZW47XHJcblxyXG4gICAgLm91dGxpbmUtaWNvbiB7XHJcbiAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcclxuICAgICAgei1pbmRleDogMjtcclxuICAgICAgdG9wOiAwO1xyXG4gICAgICBsZWZ0OiAwO1xyXG4gICAgfVxyXG5cclxuICAgICY6aG92ZXIge1xyXG4gICAgICBjb2xvcjogQHRoaXJkX3RleHRfY29sb3I7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAmX19tYWluIHtcclxuICAgIGZsZXg6IDE7XHJcbiAgICBvdmVyZmxvdzogYXV0bztcclxuXHJcbiAgICAmLm92ZXJmbG93LWhpZGRlbiB7XHJcbiAgICAgIG92ZXJmbG93OiBoaWRkZW47XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAmX19mb290ZXIge1xyXG4gICAgbWFyZ2luOiAwIGF1dG87XHJcbiAgICB0ZXh0LWFsaWduOiByaWdodDtcclxuICAgIG92ZXJmbG93OiBoaWRkZW47XHJcbiAgfVxyXG5cclxuICAmX19vdmVybGF5IHtcclxuICAgIGNvbnRlbnQ6ICcnO1xyXG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xyXG4gICAgei1pbmRleDogMTtcclxuICAgIHRvcDogMDtcclxuICAgIGxlZnQ6IDA7XHJcbiAgICB3aWR0aDogMTAwJTtcclxuICAgIGhlaWdodDogMTAwJTtcclxuICAgIGJhY2tncm91bmQtY29sb3I6IEB3aGl0ZTtcclxuICAgIG9wYWNpdHk6IDAuMTtcclxuICAgIG92ZXJmbG93OiBoaWRkZW47XHJcbiAgfVxyXG5cclxuICAmX3J0bCxcclxuICAmX2x0ciB7XHJcbiAgICAmLm91dGxpbmUtZHJhd2VyIHtcclxuICAgICAgJl90aW55IHtcclxuICAgICAgICB3aWR0aDogMjgwcHg7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgICZfbWluaSB7XHJcbiAgICAgICAgd2lkdGg6IDQ4MHB4O1xyXG4gICAgICB9XHJcblxyXG4gICAgICAmX3NtYWxsIHtcclxuICAgICAgICB3aWR0aDogNTQwcHg7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgICZfcmVndWxhciB7XHJcbiAgICAgICAgd2lkdGg6IDY4MHB4O1xyXG4gICAgICB9XHJcblxyXG4gICAgICAmX21lZGl1bSB7XHJcbiAgICAgICAgd2lkdGg6IDcyMHB4O1xyXG4gICAgICB9XHJcblxyXG4gICAgICAmX2xhcmdlIHtcclxuICAgICAgICB3aWR0aDogOTYwcHg7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gICZfcnRsIHtcclxuICAgIGJvcmRlci1sZWZ0OiAxcHggc29saWQgQHByaW1hcnlfYm9yZGVyX2NvbG9yO1xyXG5cclxuICAgICYub3V0bGluZS1kcmF3ZXIge1xyXG4gICAgICAmX3Rpbnkge1xyXG4gICAgICAgICYub3V0bGluZS1kcmF3ZXJfY2xvc2VkIHtcclxuICAgICAgICAgIHJpZ2h0OiAtMjkwcHg7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICAmX21pbmkge1xyXG4gICAgICAgICYub3V0bGluZS1kcmF3ZXJfY2xvc2VkIHtcclxuICAgICAgICAgIHJpZ2h0OiAtNDkwcHg7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICAmX3NtYWxsIHtcclxuICAgICAgICAmLm91dGxpbmUtZHJhd2VyX2Nsb3NlZCB7XHJcbiAgICAgICAgICByaWdodDogLTU1MHB4O1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgJl9yZWd1bGFyIHtcclxuICAgICAgICAmLm91dGxpbmUtZHJhd2VyX2Nsb3NlZCB7XHJcbiAgICAgICAgICByaWdodDogLTY5MHB4O1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgJl9tZWRpdW0ge1xyXG4gICAgICAgICYub3V0bGluZS1kcmF3ZXJfY2xvc2VkIHtcclxuICAgICAgICAgIHJpZ2h0OiAtNzMwcHg7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICAmX2xhcmdlIHtcclxuICAgICAgICAmLm91dGxpbmUtZHJhd2VyX2Nsb3NlZCB7XHJcbiAgICAgICAgICByaWdodDogLTk3MHB4O1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgJl9sdHIge1xyXG4gICAgYm9yZGVyLXJpZ2h0OiAxcHggc29saWQgQHByaW1hcnlfYm9yZGVyX2NvbG9yO1xyXG5cclxuICAgICYub3V0bGluZS1kcmF3ZXIge1xyXG4gICAgICAmX3Rpbnkge1xyXG4gICAgICAgICYub3V0bGluZS1kcmF3ZXJfY2xvc2VkIHtcclxuICAgICAgICAgIGxlZnQ6IC0yOTBweDtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgICZfbWluaSB7XHJcbiAgICAgICAgJi5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xyXG4gICAgICAgICAgbGVmdDogLTQ5MHB4O1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgJl9zbWFsbCB7XHJcbiAgICAgICAgJi5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xyXG4gICAgICAgICAgbGVmdDogLTU1MHB4O1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgJl9yZWd1bGFyIHtcclxuICAgICAgICAmLm91dGxpbmUtZHJhd2VyX2Nsb3NlZCB7XHJcbiAgICAgICAgICBsZWZ0OiAtNjkwcHg7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICAmX21lZGl1bSB7XHJcbiAgICAgICAgJi5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xyXG4gICAgICAgICAgbGVmdDogLTczMHB4O1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgJl9sYXJnZSB7XHJcbiAgICAgICAgJi5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xyXG4gICAgICAgICAgbGVmdDogLTk3MHB4O1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgJl90dGIsXHJcbiAgJl9idHQge1xyXG4gICAgbGVmdDogMDtcclxuICAgIHdpZHRoOiAxMDAlO1xyXG5cclxuICAgICYub3V0bGluZS1kcmF3ZXIge1xyXG4gICAgICAmX3Rpbnkge1xyXG4gICAgICAgIGhlaWdodDogMjQwcHg7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgICZfbWluaSB7XHJcbiAgICAgICAgaGVpZ2h0OiAzMjBweDtcclxuICAgICAgfVxyXG5cclxuICAgICAgJl9zbWFsbCB7XHJcbiAgICAgICAgaGVpZ2h0OiAzNjBweDtcclxuICAgICAgfVxyXG5cclxuICAgICAgJl9yZWd1bGFyIHtcclxuICAgICAgICBoZWlnaHQ6IDQwMHB4O1xyXG4gICAgICB9XHJcblxyXG4gICAgICAmX21lZGl1bSB7XHJcbiAgICAgICAgaGVpZ2h0OiA0NDBweDtcclxuICAgICAgfVxyXG5cclxuICAgICAgJl9sYXJnZSB7XHJcbiAgICAgICAgaGVpZ2h0OiA0ODBweDtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgJl90dGIge1xyXG4gICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIEBwcmltYXJ5X2JvcmRlcl9jb2xvcjtcclxuXHJcbiAgICAmLm91dGxpbmUtZHJhd2VyIHtcclxuICAgICAgJl90aW55IHtcclxuICAgICAgICAmLm91dGxpbmUtZHJhd2VyX2Nsb3NlZCB7XHJcbiAgICAgICAgICB0b3A6IC0yNTBweDtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgICZfbWluaSB7XHJcbiAgICAgICAgJi5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xyXG4gICAgICAgICAgdG9wOiAtMzMwcHg7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICAmX3NtYWxsIHtcclxuICAgICAgICAmLm91dGxpbmUtZHJhd2VyX2Nsb3NlZCB7XHJcbiAgICAgICAgICB0b3A6IC0zNzBweDtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgICZfcmVndWxhciB7XHJcbiAgICAgICAgJi5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xyXG4gICAgICAgICAgdG9wOiAtNDEwcHg7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICAmX21lZGl1bSB7XHJcbiAgICAgICAgJi5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xyXG4gICAgICAgICAgdG9wOiAtNDUwcHg7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICAmX2xhcmdlIHtcclxuICAgICAgICAmLm91dGxpbmUtZHJhd2VyX2Nsb3NlZCB7XHJcbiAgICAgICAgICB0b3A6IC00OTBweDtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gICZfYnR0IHtcclxuICAgIHRvcDogaW5pdGlhbDtcclxuICAgIGJvcmRlci10b3A6IDFweCBzb2xpZCBAcHJpbWFyeV9ib3JkZXJfY29sb3I7XHJcblxyXG4gICAgJi5vdXRsaW5lLWRyYXdlciB7XHJcbiAgICAgICZfdGlueSB7XHJcbiAgICAgICAgJi5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xyXG4gICAgICAgICAgYm90dG9tOiAtMjUwcHg7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICAmX21pbmkge1xyXG4gICAgICAgICYub3V0bGluZS1kcmF3ZXJfY2xvc2VkIHtcclxuICAgICAgICAgIGJvdHRvbTogLTMzMHB4O1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgJl9zbWFsbCB7XHJcbiAgICAgICAgJi5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xyXG4gICAgICAgICAgYm90dG9tOiAtMzcwcHg7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICAmX3JlZ3VsYXIge1xyXG4gICAgICAgICYub3V0bGluZS1kcmF3ZXJfY2xvc2VkIHtcclxuICAgICAgICAgIGJvdHRvbTogLTQxMHB4O1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgJl9tZWRpdW0ge1xyXG4gICAgICAgICYub3V0bGluZS1kcmF3ZXJfY2xvc2VkIHtcclxuICAgICAgICAgIGJvdHRvbTogLTQ1MHB4O1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgJl9sYXJnZSB7XHJcbiAgICAgICAgJi5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xyXG4gICAgICAgICAgYm90dG9tOiAtNDkwcHg7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAmX29wZW5lZCB7XHJcbiAgICB2aXNpYmlsaXR5OiB2aXNpYmxlO1xyXG4gICAgei1pbmRleDogdmFyKC0tb3V0bGluZS16SW5kZXgpO1xyXG5cclxuICAgICYub3V0bGluZS1kcmF3ZXIge1xyXG4gICAgICBwb3NpdGlvbjogZml4ZWQ7XHJcblxyXG4gICAgICAmX3J0bCB7XHJcbiAgICAgICAgcmlnaHQ6IDA7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgICZfbHRyIHtcclxuICAgICAgICBsZWZ0OiAwO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAmX3R0YiB7XHJcbiAgICAgICAgdG9wOiAwO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAmX2J0dCB7XHJcbiAgICAgICAgYm90dG9tOiAwO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAmX29mZnNldCB7XHJcbiAgICAmLm91dGxpbmUtZHJhd2VyIHtcclxuICAgICAgJl9ydGwsXHJcbiAgICAgICZfbHRyIHtcclxuICAgICAgICBoZWlnaHQ6IGNhbGMoMTAwJSAtIDRlbSk7XHJcbiAgICAgICAgdG9wOiA1MCU7XHJcbiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC01MCUpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAmX3R0YixcclxuICAgICAgJl9idHQge1xyXG4gICAgICAgIHdpZHRoOiBjYWxjKDEwMCUgLSA0ZW0pO1xyXG4gICAgICAgIGxlZnQ6IDUwJTtcclxuICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTUwJSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgICZfb3BlbmVkIHtcclxuICAgICAgICAmLm91dGxpbmUtZHJhd2VyIHtcclxuICAgICAgICAgICZfcnRsIHtcclxuICAgICAgICAgICAgcmlnaHQ6IDJlbTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAmX2x0ciB7XHJcbiAgICAgICAgICAgIGxlZnQ6IDJlbTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAmX3R0YiB7XHJcbiAgICAgICAgICAgIHRvcDogMmVtO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICZfYnR0IHtcclxuICAgICAgICAgICAgYm90dG9tOiAyZW07XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAmX2F1dG8ge1xyXG4gICAgJi5vdXRsaW5lLWRyYXdlciB7XHJcbiAgICAgICZfcnRsLFxyXG4gICAgICAmX2x0ciB7XHJcbiAgICAgICAgaGVpZ2h0OiBhdXRvO1xyXG4gICAgICAgIG1heC1oZWlnaHQ6IGNhbGMoMTAwJSAtIDRlbSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gICZfZnVsbCB7XHJcbiAgICBwYWRkaW5nOiAwO1xyXG4gIH1cclxufVxyXG4iLCJAaW1wb3J0ICcuL3ZhcmlhYmxlcyc7XHJcbkBpbXBvcnQgJy4vY29sb3JzJztcclxuQGltcG9ydCAnLi9lbGxpcHNpcyc7XHJcblxyXG4ub3V0bGluZS1uYXZpZ2F0b3Ige1xyXG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcclxuICB6LWluZGV4OiAxO1xyXG4gIG1hcmdpbjogMDtcclxuICB3aWR0aDogdmFyKC0tb3V0bGluZS1uYXZpZ2F0b3Itd2lkdGgpO1xyXG4gIG92ZXJmbG93OiBhdXRvO1xyXG5cclxuICAmLXBhcmVudCB7XHJcbiAgICB0cmFuc2l0aW9uOiAwLjNzIGVhc2UtaW4tb3V0O1xyXG4gIH1cclxuXHJcbiAgJl9fdGl0bGUge1xyXG4gICAgbWFyZ2luOiAwIDE2cHg7XHJcbiAgICBoZWlnaHQ6IDQwcHg7XHJcbiAgICBsaW5lLWhlaWdodDogNDBweDtcclxuICAgIHBhZGRpbmc6IDAgMTZweDtcclxuICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCBAcHJpbWFyeV9ib3JkZXJfY29sb3I7XHJcbiAgICBmb250LXNpemU6IDE2cHg7XHJcbiAgICBmb250LXdlaWdodDogNDAwO1xyXG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcclxuICB9XHJcblxyXG4gICZfX21haW4ge1xyXG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xyXG4gICAgei1pbmRleDogMTtcclxuICAgIG1hcmdpbjogMDtcclxuICAgIG92ZXJmbG93OiBoaWRkZW47XHJcbiAgfVxyXG5cclxuICAmX19saXN0LFxyXG4gICZfX3N1YmplY3QsXHJcbiAgJl9faXRlbSB7XHJcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XHJcbiAgICB6LWluZGV4OiAyO1xyXG4gICAgbWFyZ2luOiAwO1xyXG4gICAgcGFkZGluZzogMDtcclxuICAgIGxpc3Qtc3R5bGUtdHlwZTogbm9uZTtcclxuICAgIG92ZXJmbG93OiBoaWRkZW47XHJcbiAgfVxyXG5cclxuICAmX19saXN0IHtcclxuICAgIHBhZGRpbmc6IDAuNWVtIDA7XHJcbiAgfVxyXG5cclxuICAmX19zdWJqZWN0IHtcclxuICAgIHBhZGRpbmctbGVmdDogMWVtO1xyXG4gIH1cclxuXHJcbiAgJl9faXRlbSB7XHJcbiAgICBtYXJnaW46IDA7XHJcbiAgICBsaW5lLWhlaWdodDogMzBweDtcclxuICAgIGZvbnQtc2l6ZTogMTNweDtcclxuICAgIG92ZXJmbG93OiBoaWRkZW47XHJcbiAgfVxyXG5cclxuICAmX19wbGFjZWhvbGRlciB7XHJcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XHJcbiAgICB6LWluZGV4OiAxO1xyXG4gICAgdG9wOiAwO1xyXG4gICAgbGVmdDogMDtcclxuICAgIHdpZHRoOiAxMDAlO1xyXG4gICAgaGVpZ2h0OiAzMHB4O1xyXG4gICAgYmFja2dyb3VuZC1jb2xvcjogQGhvdmVyX2JnX2NvbG9yO1xyXG4gICAgYm9yZGVyLWxlZnQ6IDJweCBzb2xpZCBAc3VjY2Vzc19jb2xvcjtcclxuICAgIHRyYW5zaXRpb24tZHVyYXRpb246IDAuMnM7XHJcbiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xyXG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcclxuICB9XHJcblxyXG4gICZfX2FuY2hvciB7XHJcbiAgICAuZWxsaXBzaXMoMSk7XHJcbiAgICBkaXNwbGF5OiBibG9jaztcclxuICAgIHBhZGRpbmc6IDAgMS41ZW07XHJcblxyXG4gICAgJjpsaW5rLFxyXG4gICAgJjp2aXNpdGVkLFxyXG4gICAgJjpob3ZlciB7XHJcbiAgICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTtcclxuICAgICAgY29sb3I6IEBzZWNvbmRhcnlfdGV4dF9jb2xvcjtcclxuICAgIH1cclxuXHJcbiAgICAmOmhvdmVyIHtcclxuICAgICAgY29sb3I6IEBzdWNjZXNzX2NvbG9yO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgJl9fY29kZSB7XHJcbiAgICBwYWRkaW5nLXJpZ2h0OiAwLjVlbTtcclxuICB9XHJcblxyXG4gICZfaGlnaGxpZ2h0IHtcclxuICAgICYub3V0bGluZS1uYXZpZ2F0b3JfX2FuY2hvciB7XHJcbiAgICAgICY6bGluayxcclxuICAgICAgJjp2aXNpdGVkLFxyXG4gICAgICAmOmhvdmVyIHtcclxuICAgICAgICBjb2xvcjogQHN1Y2Nlc3NfY29sb3I7XHJcbiAgICAgICAgZm9udC13ZWlnaHQ6IGJvbGQ7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gICZfc3RpY2t5LFxyXG4gICZfZml4ZWQge1xyXG4gICAgZGlzcGxheTogZmxleDtcclxuICAgIGZsZXgtd3JhcDogbm93cmFwO1xyXG4gICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcclxuICAgIHotaW5kZXg6IHZhcigtLW91dGxpbmUtekluZGV4KTtcclxuICAgIHRvcDogMDtcclxuICAgIG92ZXJmbG93OiBoaWRkZW47XHJcblxyXG4gICAgLm91dGxpbmUtbmF2aWdhdG9yIHtcclxuICAgICAgJl9fdGl0bGUsXHJcbiAgICAgICZfX21haW4ge1xyXG4gICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgICZfX3RpdGxlIHtcclxuICAgICAgICBmbGV4LXNocmluazogMDtcclxuICAgICAgfVxyXG5cclxuICAgICAgJl9fbWFpbiB7XHJcbiAgICAgICAgZmxleDogMTtcclxuICAgICAgICBvdmVyZmxvdzogYXV0bztcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgJl9zdGlja3kge1xyXG4gICAgcG9zaXRpb246IHN0aWNreTtcclxuICAgIG1heC1oZWlnaHQ6IHZhcigtLW91dGxpbmUtc3RpY2t5LWhlaWdodCk7XHJcbiAgfVxyXG5cclxuICAmX2ZpeGVkIHtcclxuICAgIHBvc2l0aW9uOiBmaXhlZDtcclxuICAgIG1heC1oZWlnaHQ6IDEwMCU7XHJcbiAgfVxyXG5cclxuICAmX2hpZGRlbiB7XHJcbiAgICBkaXNwbGF5OiBub25lO1xyXG4gIH1cclxuXHJcbiAgJl9mb2xkZWQge1xyXG4gICAgd2lkdGg6IDA7XHJcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xyXG4gIH1cclxufVxyXG4iLCIvKipcclxuICogZWxsaXBzaXMubGVzcyAtIOaWh+acrOecgeeVpSBtaXhpbngg5Ye95pWwXHJcbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cclxuICogQ3JlYXRlZCBCeTogWWFvaGFpeGlhb1xyXG4gKiBVcGRhdGU6IDIwMjIuMy4xMVxyXG4gKi9cclxuXHJcbi8qID09PT09PSDmlofmnKznnIHnlaXlh73mlbAgPT09PT09ICovXHJcbi5lbGxpcHNpcyAoQGxpbmVzKSB3aGVuIChAbGluZXM9MSkge1xyXG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7XHJcbiAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7XHJcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcclxufVxyXG5cclxuLmVsbGlwc2lzIChAbGluZXMpIHdoZW4gKEBsaW5lcz49Mikge1xyXG4gIC13ZWJraXQtbGluZS1jbGFtcDogQGxpbmVzO1xyXG4gIGRpc3BsYXk6IGJveDtcclxuICAtd2Via2l0LWJveC1vcmllbnQ6IHZlcnRpY2FsO1xyXG4gIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzO1xyXG4gIG92ZXJmbG93OiBoaWRkZW47XHJcbn1cclxuIiwiQGltcG9ydCAnLi9jb2xvcnMnO1xyXG5AaW1wb3J0ICcuL2ZvbnQnO1xyXG5AaW1wb3J0ICcuL21peGlucyc7XHJcblxyXG4ub3V0bGluZS1yZWFkZXIge1xyXG4gICZfX3Byb2dyZXNzIHtcclxuICAgIHBvc2l0aW9uOiBmaXhlZDtcclxuICAgIHRvcDogMDtcclxuICAgIGxlZnQ6IDA7XHJcbiAgICB6LWluZGV4OiAzO1xyXG4gICAgaGVpZ2h0OiA0cHg7XHJcbiAgICB3aWR0aDogMTAwJTtcclxuICAgIGJhY2tncm91bmQtY29sb3I6IEBwcmltYXJ5X2NvbG9yO1xyXG4gICAgc2NhbGU6IDAgMTtcclxuICAgIHRyYW5zZm9ybS1vcmlnaW46IGxlZnQ7XHJcbiAgICBhbmltYXRpb246IG91dGxpbmUtcmVhZGVyLXByb2dyZXNzIGxpbmVhcjtcclxuICAgIGFuaW1hdGlvbi10aW1lbGluZTogLS1Qcm9ncmVzc1RpbWVsaW5lO1xyXG4gIH1cclxuXHJcbiAgJl9fcGFwZXIge1xyXG4gICAgLnNoYWRvd19kYXJrX3JlZ3VsYXIoKTtcclxuICAgIG1hcmdpbjogMmVtIGF1dG87XHJcbiAgICBtYXgtd2lkdGg6IDEyMDBweDtcclxuICAgIHBhZGRpbmc6IDMuMmVtO1xyXG4gICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcclxuICAgIGJhY2tncm91bmQtY29sb3I6IEB3aGl0ZTtcclxuICAgIG92ZXJmbG93OiBoaWRkZW47XHJcbiAgfVxyXG5cclxuICAmX190aXRsZSB7XHJcbiAgICBtYXJnaW46IDAuNjdlbSAwO1xyXG4gICAgdGV4dC1hbGlnbjogY2VudGVyO1xyXG4gICAgZm9udC1mYW1pbHk6IEBmb250X3RleHRfZmFtaWx5O1xyXG4gICAgZm9udC13ZWlnaHQ6IG5vcm1hbDtcclxuICAgIGxpbmUtaGVpZ2h0OiAxLjNlbTtcclxuICAgIGZvbnQtc2l6ZTogNC4yZW07XHJcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xyXG4gIH1cclxuXHJcbiAgJl9fYXJ0aWNsZSB7XHJcbiAgICAub3V0bGluZS1yZWFkZXJfX3Byb2dyZXNzIHtcclxuICAgICAgZGlzcGxheTogbm9uZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gICZfaGlkZGVuIHtcclxuICAgIGRpc3BsYXk6IG5vbmU7XHJcblxyXG4gICAgJi5vdXRsaW5lLXJlYWRlcl9zaWJsaW5nIHtcclxuICAgICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50O1xyXG5cclxuICAgICAgJi53cmFwcGVyIHtcclxuICAgICAgICAmLnBvc3Qge1xyXG4gICAgICAgICAgZGlzcGxheTogbm9uZTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gICYtLXJlYWRpbmcge1xyXG4gICAgZGlzcGxheTogYmxvY2s7XHJcbiAgICBwb3NpdGlvbjogZml4ZWQ7XHJcbiAgICB6LWluZGV4OiAyO1xyXG4gICAgdG9wOiAwO1xyXG4gICAgbGVmdDogMDtcclxuICAgIHdpZHRoOiAxMDAlO1xyXG4gICAgaGVpZ2h0OiAxMDAlO1xyXG4gICAgbWFyZ2luOiAwO1xyXG4gICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcclxuICAgIHBhZGRpbmc6IDNlbSA0ZW07XHJcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAYmdfY29sb3I7XHJcbiAgICBzY3JvbGwtdGltZWxpbmUtbmFtZTogLS1Qcm9ncmVzc1RpbWVsaW5lO1xyXG4gICAgb3ZlcmZsb3c6IHNjcm9sbDtcclxuICB9XHJcbn1cclxuXHJcbkBrZXlmcmFtZXMgb3V0bGluZS1yZWFkZXItcHJvZ3Jlc3Mge1xyXG4gIHRvIHtcclxuICAgIHNjYWxlOiAxIDE7XHJcbiAgfVxyXG59XHJcblxyXG5AbWVkaWEgKG1heC13aWR0aDogNTAwcHgpIHtcclxuICAub3V0bGluZSB7XHJcbiAgICAmLXJlYWRlciB7XHJcbiAgICAgIG92ZXJmbG93OiBoaWRkZW47XHJcblxyXG4gICAgICAub3V0bGluZS10b29sYmFyIHtcclxuICAgICAgICBkaXNwbGF5OiBmbGV4O1xyXG4gICAgICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7XHJcbiAgICAgICAgZmxleC13cmFwOiBub3dyYXA7XHJcbiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcclxuICAgICAgICBhbGlnbi1zZWxmOiBhdXRvO1xyXG4gICAgICAgIHRvcDogMTAwJTtcclxuICAgICAgICByaWdodDogMDtcclxuICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTQ4cHgpO1xyXG4gICAgICAgIHdpZHRoOiAxMDAlO1xyXG4gICAgICAgIGhlaWdodDogNDhweDtcclxuICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xyXG4gICAgICAgIGJvcmRlci10b3A6IDFweCBzb2xpZCBAYm9yZGVyX2NvbG9yO1xyXG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6IEB3aGl0ZTtcclxuICAgICAgICBwYWRkaW5nOiAwIDE2cHg7XHJcblxyXG4gICAgICAgICZfX2J1dHRvbiB7XHJcbiAgICAgICAgICAucmFkaXVzX25vbmUoKTtcclxuICAgICAgICAgIGZsZXg6IDE7XHJcbiAgICAgICAgICBib3JkZXI6IG5vbmU7XHJcbiAgICAgICAgICBib3gtc2hhZG93OiBub25lO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgJi0tcmVhZGluZyB7XHJcbiAgICAgICAgcGFkZGluZzogMDtcclxuICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAd2hpdGU7XHJcbiAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcclxuICAgICAgfVxyXG5cclxuICAgICAgJl9fcGFwZXIge1xyXG4gICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcclxuICAgICAgICB6LWluZGV4OiAxO1xyXG4gICAgICAgIG1hcmdpbjogMDtcclxuICAgICAgICBwYWRkaW5nOiAwO1xyXG4gICAgICAgIGhlaWdodDogMTAwJTtcclxuICAgICAgICBib3gtc2hhZG93OiBub25lO1xyXG4gICAgICAgIG92ZXJmbG93OiBoaWRkZW47XHJcbiAgICAgIH1cclxuXHJcbiAgICAgICZfX3RpdGxlIHtcclxuICAgICAgICAuZWxsaXBzaXMoMSk7XHJcbiAgICAgICAgcG9zaXRpb246IGFic29sdXRlO1xyXG4gICAgICAgIHotaW5kZXg6IDM7XHJcbiAgICAgICAgdG9wOiAwO1xyXG4gICAgICAgIGxlZnQ6IDA7XHJcbiAgICAgICAgbWFyZ2luOiAwO1xyXG4gICAgICAgIHdpZHRoOiAxMDAlO1xyXG4gICAgICAgIGhlaWdodDogNDhweDtcclxuICAgICAgICBsaW5lLWhlaWdodDogNDhweDtcclxuICAgICAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgQGJvcmRlcl9jb2xvcjtcclxuICAgICAgICBmb250LXNpemU6IDEuOGVtO1xyXG4gICAgICAgIGZvbnQtd2VpZ2h0OiA0MDA7XHJcbiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogQHdoaXRlO1xyXG4gICAgICAgIG92ZXJmbG93OiBoaWRkZW47XHJcbiAgICAgIH1cclxuXHJcbiAgICAgICZfX2FydGljbGUge1xyXG4gICAgICAgIG1hcmdpbjogNDhweCAwO1xyXG4gICAgICAgIGhlaWdodDogY2FsYygxMDAlIC0gOTZweCk7XHJcbiAgICAgICAgcGFkZGluZzogMCAxLjI1ZW07XHJcbiAgICAgICAgc2Nyb2xsLXRpbWVsaW5lLW5hbWU6IC0tTW9iaWxlUHJvZ3Jlc3NUaW1lbGluZTtcclxuICAgICAgICBvdmVyZmxvdy14OiBoaWRkZW47XHJcbiAgICAgICAgb3ZlcmZsb3cteTogc2Nyb2xsO1xyXG5cclxuICAgICAgICAub3V0bGluZS1yZWFkZXJfX3Byb2dyZXNzIHtcclxuICAgICAgICAgIHotaW5kZXg6IDQ7XHJcbiAgICAgICAgICBhbmltYXRpb246IG91dGxpbmUtcmVhZGVyLXByb2dyZXNzIGxpbmVhcjtcclxuICAgICAgICAgIGFuaW1hdGlvbi10aW1lbGluZTogLS1Nb2JpbGVQcm9ncmVzc1RpbWVsaW5lO1xyXG4gICAgICAgICAgZGlzcGxheTogYmxvY2s7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcblxyXG5AbWVkaWEgcHJpbnQge1xyXG4gIGh0bWwsXHJcbiAgYm9keSB7XHJcbiAgICAvKiDmiZPljbDnmoTln7rnoYDlrZfkvZPlpKflsI8gKi9cclxuICAgIGZvbnQtc2l6ZTogMTJwdDtcclxuICAgIC8qIOaYvuekuuiuvue9ruaWh+Wtl+minOiJsuWSjOiDjOaZr+minOiJsiAqL1xyXG4gICAgYmFja2dyb3VuZC1jb2xvcjogQHdoaXRlO1xyXG4gICAgY29sb3I6IEBwcmltYXJ5X3RleHRfY29sb3I7XHJcbiAgICBoZWlnaHQ6IGluaXRpYWwgIWltcG9ydGFudDtcclxuICB9XHJcblxyXG4gIC8qIOiuvue9rumTvuaOpeagt+W8jyAqL1xyXG4gIGE6bGluayxcclxuICBhOnZpc2l0ZWQsXHJcbiAgYTpob3ZlciB7XHJcbiAgICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZSAhaW1wb3J0YW50O1xyXG4gICAgY29sb3I6IEBwcmltYXJ5X2NvbG9yO1xyXG4gIH1cclxuXHJcbiAgLyog6ZqQ6JeP5aqS5L2T5qCH562+ICovXHJcbiAgdmlkZW8sXHJcbiAgYXVkaW8ge1xyXG4gICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50O1xyXG4gIH1cclxuXHJcbiAgLyog56Gu5L+d6KGo5qC85Zyo5omT5Y2w5pe255qE6L655qGG5ZKM5a+56b2Q5pa55byP5riF5pmwICovXHJcbiAgdGFibGUge1xyXG4gICAgd2lkdGg6IDEwMCU7XHJcbiAgICBib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlO1xyXG4gIH1cclxuICB0aCxcclxuICB0ZCB7XHJcbiAgICBib3JkZXI6IDFweCBzb2xpZCBAcHJpbWFyeV9ib3JkZXJfY29sb3I7XHJcbiAgICBwYWRkaW5nOiA4cHggMjBweDtcclxuICB9XHJcblxyXG4gIC5vdXRsaW5lIHtcclxuICAgICYtbWVzc2FnZSxcclxuICAgICYtdG9vbGJhciB7XHJcbiAgICAgIC8qIOmakOiXj+S6huW3peWFt+agj+WSjOS/oeaBr+aPkOekuuahhiAqL1xyXG4gICAgICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7XHJcbiAgICB9XHJcblxyXG4gICAgJi1yZWFkZXIge1xyXG4gICAgICBkaXNwbGF5OiBibG9jayAhaW1wb3J0YW50O1xyXG4gICAgICBvdmVyZmxvdzogaGlkZGVuO1xyXG5cclxuICAgICAgJl9fdGl0bGUge1xyXG4gICAgICAgIG1hcmdpbjogMTMuNHB0IDAgMjhwdCAhaW1wb3J0YW50O1xyXG4gICAgICAgIHRleHQtYWxpZ246IGNlbnRlciAhaW1wb3J0YW50O1xyXG4gICAgICAgIGZvbnQtc2l6ZTogMzJwdCAhaW1wb3J0YW50O1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvKiDlj5bmtojkuobnu53lr7nlrprkvY0gKi9cclxuICAgICAgJi0tcmVhZGluZyB7XHJcbiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlICFpbXBvcnRhbnQ7XHJcbiAgICAgICAgaGVpZ2h0OiBhdXRvICFpbXBvcnRhbnQ7XHJcbiAgICAgICAgcGFkZGluZzogMCAhaW1wb3J0YW50O1xyXG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6IEB3aGl0ZTtcclxuICAgICAgICBvdmVyZmxvdzogaGlkZGVuICFpbXBvcnRhbnQ7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8qIOmakOiXj+mYheivu+i/m+W6puadoSAqL1xyXG4gICAgICAmX19wcm9ncmVzcyB7XHJcbiAgICAgICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50O1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvKiDmiZPljbDml7bkuI3mmL7npLrmraPmlocgRE9NIOeahOmYtOW9seaViOaenCAqL1xyXG4gICAgICAmX19wYXBlciB7XHJcbiAgICAgICAgYm94LXNoYWRvdzogbm9uZTtcclxuICAgICAgfVxyXG5cclxuICAgICAgcHJlIHtcclxuICAgICAgICBwYWRkaW5nOiAxZW0gIWltcG9ydGFudDtcclxuICAgICAgICBib3JkZXI6IDFweCBzb2xpZCBAYm9yZGVyX2NvbG9yICFpbXBvcnRhbnQ7XHJcbiAgICAgICAgYm9yZGVyLXJhZGl1czogNHB4ICFpbXBvcnRhbnQ7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHByZSxcclxuICAgICAgY29kZSB7XHJcbiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogQHdoaXRlICFpbXBvcnRhbnQ7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRhYmxlLFxyXG4gICAgICBpbWcsXHJcbiAgICAgIHN2ZyB7XHJcbiAgICAgICAgYnJlYWstaW5zaWRlOiBhdm9pZDtcclxuICAgICAgfVxyXG5cclxuICAgICAgLyog5omA5pyJ5paH56ug5YaF5a65IERPTSDnm7jlhbPnmoTpgrvlsYXoioLngrnpg73pmpDol4/kuoYgKi9cclxuICAgICAgJl9zaWJsaW5nIHtcclxuICAgICAgICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcbn1cclxuIiwiLyoqXHJcbiAqIHJhZGl1cy5sZXNzIC0g5ZyG6KeS6K6+572uIG1peGlueCDlh73mlbBcclxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxyXG4gKiBDcmVhdGVkIEJ5OiBZYW9oYWl4aWFvXHJcbiAqIFVwZGF0ZTogMjAyNC40LjE2XHJcbiAqL1xyXG5cclxuLyogPT09PT09IOWchuinkuagt+W8j+iuvue9ruWHveaVsCA9PT09PT0gKi9cclxuLnJhZGl1cyhAbnVtOiAycHgpIHtcclxuICBib3JkZXItcmFkaXVzOiBAbnVtO1xyXG59XHJcblxyXG4ucmFkaXVzX25vbmUoKSB7XHJcbiAgLnJhZGl1cygwKTtcclxufVxyXG5cclxuLnJhZGl1c19taW5pKCkge1xyXG4gIC5yYWRpdXMoMnB4KTtcclxufVxyXG5cclxuLnJhZGl1c19zbWFsbCgpIHtcclxuICAucmFkaXVzKDNweCk7XHJcbn1cclxuXHJcbi5yYWRpdXNfcmVndWxhcigpIHtcclxuICAucmFkaXVzKDRweCk7XHJcbn1cclxuXHJcbi5yYWRpdXNfbWVkaXVtKCkge1xyXG4gIC5yYWRpdXMoNXB4KTtcclxufVxyXG5cclxuLnJhZGl1c19sYXJnZSgpIHtcclxuICAucmFkaXVzKDEwcHgpO1xyXG59XHJcblxyXG4ucmFkaXVzX2h1Z2UoKSB7XHJcbiAgLnJhZGl1cygxNnB4KTtcclxufVxyXG5cclxuLnJhZGl1c19yb3VuZCgpIHtcclxuICAucmFkaXVzKDMwcHgpO1xyXG59XHJcbiIsIi8qID09PT09PT09PT0gYnV0dG9ucy50aGVtZSAtIOaMiemSruWvvOiIquagt+W8jyA9PT09PT09PT09ICovXHJcbkBpbXBvcnQgJy4vY29sb3JzJztcclxuQGltcG9ydCAnLi9zaGFkb3cnO1xyXG5cclxuLm91dGxpbmUtdG9vbGJhciB7XHJcbiAgcG9zaXRpb246IGZpeGVkO1xyXG4gIHotaW5kZXg6IDk5OTk5O1xyXG4gIG1hcmdpbjogMDtcclxuICB0cmFuc2l0aW9uLWR1cmF0aW9uOiAwLjNzO1xyXG4gIG92ZXJmbG93OiBoaWRkZW47XHJcblxyXG4gICZfX2J1dHRvbiB7XHJcbiAgICAuc2hhZG93X2xpZ2h0X3JlZ3VsYXIoKTtcclxuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcclxuICAgIHotaW5kZXg6IDE7XHJcbiAgICBtYXJnaW46IDEwcHg7XHJcbiAgICB3aWR0aDogMzZweDtcclxuICAgIGhlaWdodDogMzZweDtcclxuICAgIGJvcmRlcjogMXB4IHNvbGlkIEBwcmltYXJ5X2JvcmRlcl9jb2xvcjtcclxuICAgIGJvcmRlci1yYWRpdXM6IDNweDtcclxuICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XHJcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAd2hpdGU7XHJcbiAgICBjdXJzb3I6IHBvaW50ZXI7XHJcbiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XHJcbiAgICBjb2xvcjogQGZvdXJ0aF90ZXh0X2NvbG9yO1xyXG4gICAgdHJhbnNpdGlvbjogYWxsIDAuM3MgMC4xcyBlYXNlLWluLW91dDtcclxuICAgIG92ZXJmbG93OiBoaWRkZW47XHJcblxyXG4gICAgJjpob3ZlciB7XHJcbiAgICAgIGNvbG9yOiBAc3VjY2Vzc19jb2xvcjtcclxuICAgICAgYm9yZGVyLWNvbG9yOiBAc3VjY2Vzc19jb2xvcjtcclxuICAgICAgdHJhbnNmb3JtOiBzY2FsZSgxLjM1KTtcclxuICAgIH1cclxuXHJcbiAgICAmLmhpZGUge1xyXG4gICAgICBkaXNwbGF5OiBub25lO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgJl9fYW5jaG9yIHtcclxuICAgICY6bGluayxcclxuICAgICY6dmlzaXRlZCxcclxuICAgICY6aG92ZXIge1xyXG4gICAgICBjb2xvcjogQGZvdXJ0aF90ZXh0X2NvbG9yO1xyXG4gICAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7XHJcbiAgICB9XHJcblxyXG4gICAgJjpob3ZlciB7XHJcbiAgICAgIGNvbG9yOiBAc3VjY2Vzc19jb2xvcjtcclxuICAgIH1cclxuICB9XHJcblxyXG4gICZfX2ljb24ge1xyXG4gICAgcG9zaXRpb246IGFic29sdXRlO1xyXG4gICAgei1pbmRleDogMjtcclxuICAgIHRvcDogNTAlO1xyXG4gICAgbGVmdDogNTAlO1xyXG4gICAgd2lkdGg6IDIwcHg7XHJcbiAgICBoZWlnaHQ6IDIwcHg7XHJcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCAtNTAlKTtcclxuICAgIGZpbGw6IGN1cnJlbnRjb2xvcjtcclxuICAgIG92ZXJmbG93OiBoaWRkZW47XHJcbiAgfVxyXG5cclxuICAmX2FjdGl2ZSB7XHJcbiAgICAmLm91dGxpbmUtdG9vbGJhciB7XHJcbiAgICAgICZfX2J1dHRvbiB7XHJcbiAgICAgICAgY29sb3I6IEB3aGl0ZTtcclxuICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAc3VjY2Vzc19jb2xvcjtcclxuICAgICAgICBib3JkZXItY29sb3I6IEBzdWNjZXNzX2NvbG9yO1xyXG5cclxuICAgICAgICAmOmhvdmVyIHtcclxuICAgICAgICAgIGNvbG9yOiBAd2hpdGU7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLm91dGxpbmUtdG9vbGJhcl9fYW5jaG9yIHtcclxuICAgICAgJjpsaW5rLFxyXG4gICAgICAmOnZpc2l0ZWQsXHJcbiAgICAgICY6aG92ZXIge1xyXG4gICAgICAgIGNvbG9yOiBAd2hpdGU7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gICZfcm91bmRlZCB7XHJcbiAgICAmLm91dGxpbmUtdG9vbGJhcl9fYnV0dG9uIHtcclxuICAgICAgYm9yZGVyLXJhZGl1czogMThweDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gICZfZGlzYWJsZWQge1xyXG4gICAgJi5vdXRsaW5lLXRvb2xiYXIsXHJcbiAgICAub3V0bGluZS10b29sYmFyIHtcclxuICAgICAgJl9fYW5jaG9yOmxpbmssXHJcbiAgICAgICZfX2FuY2hvcjp2aXNpdGVkLFxyXG4gICAgICAmX19hbmNob3I6aG92ZXIsXHJcbiAgICAgICZfX2J1dHRvbiB7XHJcbiAgICAgICAgY3Vyc29yOiBub3QtYWxsb3dlZDtcclxuICAgICAgICBjb2xvcjogQGZvdXJ0aF90ZXh0X2NvbG9yO1xyXG4gICAgICAgIGJvcmRlci1jb2xvcjogQGZvdXJ0aF90ZXh0X2NvbG9yO1xyXG5cclxuICAgICAgICAmOmhvdmVyIHtcclxuICAgICAgICAgIGNvbG9yOiBAZm91cnRoX3RleHRfY29sb3I7XHJcbiAgICAgICAgICBib3JkZXItY29sb3I6IEBmb3VydGhfdGV4dF9jb2xvcjtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgICZfX2J1dHRvbiB7XHJcbiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogQGRpc2FibGVkX2JnX2NvbG9yO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAmX3R0YixcclxuICAmX2J0dCB7XHJcbiAgICBsZWZ0OiA1MCU7XHJcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTUwJSk7XHJcblxyXG4gICAgLm91dGxpbmUtdG9vbGJhcl9fYnV0dG9uIHtcclxuICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgJl90dGIge1xyXG4gICAgdG9wOiAxMnB4O1xyXG5cclxuICAgICYub3V0bGluZS10b29sYmFyX2hpZGRlbiB7XHJcbiAgICAgIHRvcDogLTU2cHg7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAmX2J0dCB7XHJcbiAgICBib3R0b206IDEycHg7XHJcblxyXG4gICAgJi5vdXRsaW5lLXRvb2xiYXJfaGlkZGVuIHtcclxuICAgICAgYm90dG9tOiAtNTZweDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gICZfcnRsLFxyXG4gICZfbHRyIHtcclxuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtNTAlKTtcclxuICAgIHdpZHRoOiA1NnB4O1xyXG4gIH1cclxuXHJcbiAgJl9ydGwge1xyXG4gICAgdG9wOiA1MCU7XHJcbiAgICByaWdodDogMTJweDtcclxuXHJcbiAgICAmLm91dGxpbmUtdG9vbGJhcl9oaWRkZW4ge1xyXG4gICAgICByaWdodDogLTg2cHg7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAmX2x0ciB7XHJcbiAgICB0b3A6IDUwJTtcclxuICAgIGxlZnQ6IDEycHg7XHJcblxyXG4gICAgJi5vdXRsaW5lLXRvb2xiYXJfaGlkZGVuIHtcclxuICAgICAgbGVmdDogLTg2cHg7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAmX3R0YixcclxuICAmX3J0bCxcclxuICAmX2J0dCxcclxuICAmX2x0ciB7XHJcbiAgICAub3V0bGluZS10b29sYmFyX19idXR0b24ge1xyXG4gICAgICAmLm91dGxpbmUtdG9vbGJhcl9oaWRkZW4ge1xyXG4gICAgICAgIGRpc3BsYXk6IG5vbmU7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcbn1cclxuIiwiQGltcG9ydCAnLi9jb2xvcnMnO1xyXG5AaW1wb3J0ICcuL2ZvbnQnO1xyXG5AaW1wb3J0ICcuL2ljb25zJztcclxuQGltcG9ydCAnLi9taXhpbnMnO1xyXG5cclxuLm91dGxpbmUtbWVzc2FnZSB7XHJcbiAgLnJhZGl1c19zbWFsbCgpO1xyXG4gIC5zaGFkb3dfbGlnaHRfcmVndWxhcigpO1xyXG4gIHBvc2l0aW9uOiBmaXhlZDtcclxuICB6LWluZGV4OiA5OTk5O1xyXG4gIG9wYWNpdHk6IDAuMTtcclxuICB0b3A6IC01MHB4O1xyXG4gIGxlZnQ6IDUwJTtcclxuICBoZWlnaHQ6IDQwcHg7XHJcbiAgbWFyZ2luOiAwO1xyXG4gIHBhZGRpbmc6IDAgNTBweDtcclxuICBsaW5lLWhlaWdodDogNDBweDtcclxuICBmb250LXNpemU6IEBmb250X3NpemVfc21hbGw7XHJcbiAgYmFja2dyb3VuZC1jb2xvcjogQHdoaXRlO1xyXG4gIGNvbG9yOiBAdGhpcmRfdGV4dF9jb2xvcjtcclxuICB0cmFuc2l0aW9uOiBhbGwgMC41cyBlYXNlLWluLW91dDtcclxuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTUwJSk7XHJcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcclxuXHJcbiAgJl9fY29udGVudCB7XHJcbiAgICAuZWxsaXBzaXMoMSk7XHJcbiAgICBtYXJnaW46IDA7XHJcbiAgICBtYXgtd2lkdGg6IDcwMHB4O1xyXG4gICAgaGVpZ2h0OiA0MHB4O1xyXG4gICAgbGluZS1oZWlnaHQ6IDQwcHg7XHJcbiAgICBmb250LXNpemU6IDEzcHg7XHJcbiAgICBjb2xvcjogQHRoaXJkX3RleHRfY29sb3I7XHJcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xyXG4gIH1cclxuXHJcbiAgJl9fY2xvc2UsXHJcbiAgJl9faWNvbiB7XHJcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XHJcbiAgICB6LWluZGV4OiAyO1xyXG4gICAgdG9wOiAwO1xyXG4gICAgd2lkdGg6IDQwcHg7XHJcbiAgICBoZWlnaHQ6IDQwcHg7XHJcbiAgICBsaW5lLWhlaWdodDogNDBweDtcclxuICAgIHRleHQtYWxpZ246IGNlbnRlcjtcclxuICAgIG92ZXJmbG93OiBoaWRkZW47XHJcbiAgfVxyXG5cclxuICAmX19pY29uIHtcclxuICAgIGxlZnQ6IDA7XHJcbiAgICBjb2xvcjogQHdoaXRlO1xyXG5cclxuICAgIC5vdXRsaW5lLWljb24ge1xyXG4gICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XHJcbiAgICAgIHotaW5kZXg6IDI7XHJcbiAgICAgIHRvcDogNTAlO1xyXG4gICAgICBsZWZ0OiA1MCU7XHJcbiAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIC01MCUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgJl9fY2xvc2Uge1xyXG4gICAgcmlnaHQ6IDA7XHJcbiAgICBjdXJzb3I6IHBvaW50ZXI7XHJcbiAgICBjb2xvcjogQGZvdXJ0aF90ZXh0X2NvbG9yO1xyXG5cclxuICAgIC5vdXRsaW5lLWljb24ge1xyXG4gICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XHJcbiAgICAgIHotaW5kZXg6IDI7XHJcbiAgICAgIHRvcDogNTAlO1xyXG4gICAgICBsZWZ0OiA1MCU7XHJcbiAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIC01MCUpO1xyXG4gICAgfVxyXG5cclxuICAgICY6aG92ZXIge1xyXG4gICAgICBjb2xvcjogQHRoaXJkX3RleHRfY29sb3I7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAmX2luZm8ge1xyXG4gICAgLm91dGxpbmUtbWVzc2FnZV9faWNvbiB7XHJcbiAgICAgIGJhY2tncm91bmQtY29sb3I6IEBwcmltYXJ5X2NvbG9yO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgJl93YXJuaW5nIHtcclxuICAgIC5vdXRsaW5lLW1lc3NhZ2VfX2ljb24ge1xyXG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAd2FybmluZ19jb2xvcjtcclxuICAgIH1cclxuICB9XHJcblxyXG4gICZfc3VjY2VzcyB7XHJcbiAgICAub3V0bGluZS1tZXNzYWdlX19pY29uIHtcclxuICAgICAgYmFja2dyb3VuZC1jb2xvcjogQHN1Y2Nlc3NfY29sb3I7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAmX2Vycm9yIHtcclxuICAgIC5vdXRsaW5lLW1lc3NhZ2VfX2ljb24ge1xyXG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAZGFuZ2VyX2NvbG9yO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgJl9wbGFpbiB7XHJcbiAgICBtaW4td2lkdGg6IDE5MHB4O1xyXG4gICAgcGFkZGluZzogMCA1MHB4IDAgMTVweDtcclxuXHJcbiAgICAmLm91dGxpbmUtbWVzc2FnZSB7XHJcbiAgICAgICZfaW5mbyB7XHJcbiAgICAgICAgYm9yZGVyLWxlZnQ6IDVweCBzb2xpZCBAcHJpbWFyeV9jb2xvcjtcclxuICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAaW5mb190aXBfYmdfY29sb3I7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgICZfd2FybmluZyB7XHJcbiAgICAgICAgYm9yZGVyLWxlZnQ6IDVweCBzb2xpZCBAd2FybmluZ19jb2xvcjtcclxuICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAd2FybmluZ190aXBfYmdfY29sb3I7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgICZfc3VjY2VzcyB7XHJcbiAgICAgICAgYm9yZGVyLWxlZnQ6IDVweCBzb2xpZCBAc3VjY2Vzc19jb2xvcjtcclxuICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAc3VjY2Vzc190aXBfYmdfY29sb3I7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgICZfZXJyb3Ige1xyXG4gICAgICAgIGJvcmRlci1sZWZ0OiA1cHggc29saWQgQGRhbmdlcl9jb2xvcjtcclxuICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAZGFuZ2VyX3RpcF9iZ19jb2xvcjtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC5vdXRsaW5lLW1lc3NhZ2VfX2ljb24ge1xyXG4gICAgICB3aWR0aDogMDtcclxuICAgICAgZGlzcGxheTogbm9uZTtcclxuXHJcbiAgICAgIC5vdXRsaW5lLWljb24ge1xyXG4gICAgICAgIGRpc3BsYXk6IG5vbmU7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gICZfbGlnaHQge1xyXG4gICAgbWluLXdpZHRoOiAxODBweDtcclxuICAgIHBhZGRpbmc6IDAgNDBweDtcclxuXHJcbiAgICAmLm91dGxpbmUtbWVzc2FnZSB7XHJcbiAgICAgICZfaW5mbyB7XHJcbiAgICAgICAgLm91dGxpbmUtbWVzc2FnZV9faWNvbiB7XHJcbiAgICAgICAgICBjb2xvcjogQHByaW1hcnlfY29sb3I7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICAmX3dhcm5pbmcge1xyXG4gICAgICAgIC5vdXRsaW5lLW1lc3NhZ2VfX2ljb24ge1xyXG4gICAgICAgICAgY29sb3I6IEB3YXJuaW5nX2NvbG9yO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgJl9zdWNjZXNzIHtcclxuICAgICAgICAub3V0bGluZS1tZXNzYWdlX19pY29uIHtcclxuICAgICAgICAgIGNvbG9yOiBAc3VjY2Vzc19jb2xvcjtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgICZfZXJyb3Ige1xyXG4gICAgICAgIC5vdXRsaW5lLW1lc3NhZ2VfX2ljb24ge1xyXG4gICAgICAgICAgY29sb3I6IEBkYW5nZXJfY29sb3I7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLm91dGxpbmUtbWVzc2FnZV9faWNvbiB7XHJcbiAgICAgIGJhY2tncm91bmQtY29sb3I6IEB3aGl0ZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gICZfcm91bmQge1xyXG4gICAgLnJhZGl1cygyMHB4KTtcclxuXHJcbiAgICAmLm91dGxpbmUtbWVzc2FnZSB7XHJcbiAgICAgICZfZGVmYXVsdCB7XHJcbiAgICAgICAgbWluLXdpZHRoOiAxODBweDtcclxuICAgICAgICBwYWRkaW5nOiAwIDQwcHg7XHJcblxyXG4gICAgICAgIC5vdXRsaW5lLW1lc3NhZ2VfX2ljb24ge1xyXG4gICAgICAgICAgLnJhZGl1cygxMHB4KTtcclxuICAgICAgICAgIHRvcDogMTBweDtcclxuICAgICAgICAgIGxlZnQ6IDEwcHg7XHJcbiAgICAgICAgICB3aWR0aDogMjBweDtcclxuICAgICAgICAgIGhlaWdodDogMjBweDtcclxuICAgICAgICAgIGxpbmUtaGVpZ2h0OiAyMHB4O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgJi5vdXRsaW5lLW1lc3NhZ2VfZnVsbC13aWR0aCB7XHJcbiAgICAgICAgICBtaW4td2lkdGg6IDIwMHB4O1xyXG4gICAgICAgICAgcGFkZGluZzogMCAyMHB4IDAgNDBweDtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgICZfcGxhaW4ge1xyXG4gICAgICAgIG1pbi13aWR0aDogMTk1cHg7XHJcbiAgICAgICAgcGFkZGluZzogMCA0MHB4IDAgMjBweDtcclxuXHJcbiAgICAgICAgJi5vdXRsaW5lLW1lc3NhZ2VfZnVsbC13aWR0aCB7XHJcbiAgICAgICAgICBtaW4td2lkdGg6IDIxNXB4O1xyXG4gICAgICAgICAgcGFkZGluZzogMCAyMHB4O1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgJl9mdWxsLXdpZHRoIHtcclxuICAgIG1pbi13aWR0aDogMjAwcHg7XHJcbiAgICBwYWRkaW5nOiAwIDEwcHggMCA1MHB4O1xyXG5cclxuICAgICYub3V0bGluZS1tZXNzYWdlIHtcclxuICAgICAgJl9wbGFpbiB7XHJcbiAgICAgICAgbWluLXdpZHRoOiAyMzBweDtcclxuICAgICAgICBwYWRkaW5nOiAwIDEwcHggMCAxNXB4O1xyXG4gICAgICB9XHJcblxyXG4gICAgICAmX2xpZ2h0IHtcclxuICAgICAgICBtaW4td2lkdGg6IDIxMHB4O1xyXG4gICAgICAgIHBhZGRpbmc6IDAgMTBweCAwIDQwcHg7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gICZfdmlzaWJsZSB7XHJcbiAgICBvcGFjaXR5OiAxO1xyXG4gIH1cclxuXHJcbiAgJl9oaWRkZW4ge1xyXG4gICAgZGlzcGxheTogbm9uZTtcclxuICB9XHJcbn1cclxuIiwiLyogPT09PT0gU2Nyb2xsYmFyID09PT09ICovXHJcbjo6LXdlYmtpdC1zY3JvbGxiYXIge1xyXG4gIHdpZHRoOiA3cHg7XHJcbiAgaGVpZ2h0OiA3cHg7XHJcbiAgLXdlYmtpdC1ib3JkZXItcmFkaXVzOiA1cHg7XHJcblxyXG4gICYtdHJhY2stcGllY2Uge1xyXG4gICAgLXdlYmtpdC1ib3JkZXItcmFkaXVzOiA1cHg7XHJcbiAgfVxyXG5cclxuICAmLXRodW1iIHtcclxuICAgICY6dmVydGljYWwge1xyXG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuMjUpO1xyXG4gICAgICAtd2Via2l0LWJvcmRlci1yYWRpdXM6IDVweDtcclxuICAgIH1cclxuXHJcbiAgICAmOmhvcml6b250YWwge1xyXG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuMjUpO1xyXG4gICAgICAtd2Via2l0LWJvcmRlci1yYWRpdXM6IDVweDtcclxuICAgIH1cclxuXHJcbiAgICAmOmhvdmVyIHtcclxuICAgICAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjM1KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gICY6aG92ZXIge1xyXG4gICAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjE1KTtcclxuICB9XHJcbn1cclxuIl19 */ +/*# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLzxpbnB1dCBjc3MgMj4iLCJzY3JvbGxiYXIubGVzcyIsInNlY3Rpb24ubGVzcyIsImNhc2UubGVzcyIsInBhZ2VyLmxlc3MiLCIuLi8uLi90aGVtZS9zaGFkb3cubGVzcyIsIi4uLy4uL3RoZW1lL3ZhcmlhYmxlcy5sZXNzIiwiLi4vLi4vdGhlbWUvaWNvbnMubGVzcyIsIi4uLy4uL3RoZW1lL3Njcm9sbGJhci5sZXNzIiwiLi4vLi4vYW5jaG9ycy9hbmNob3JzLmxlc3MiLCIuLi8uLi9kcmF3ZXIvZHJhd2VyLmxlc3MiLCIuLi8uLi9uYXZpZ2F0b3IvbmF2aWdhdG9yLmxlc3MiLCIuLi8uLi90aGVtZS9lbGxpcHNpcy5sZXNzIiwiLi4vLi4vcmVhZGVyL3JlYWRlci5sZXNzIiwiLi4vLi4vdGhlbWUvcmFkaXVzLmxlc3MiLCIuLi8uLi90b29sYmFyL3Rvb2xiYXIubGVzcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwyQkFBMkI7QUNDM0I7RUFDRSxXQUFBO0VBQ0EsWUFBQTtFQUNBLDJCQUFBO0NEQ0Q7QUNFRDtFQUNFLDJCQUFBO0NEQUQ7QUNHRDtFQUNFLHNDQUFBO0VBQ0EsMkJBQUE7Q0RERDtBQ0lEO0VBQ0Usc0NBQUE7RUFDQSwyQkFBQTtDREZEO0FDS0Q7RUFDRSxzQ0FBQTtDREhEO0FDTUQ7RUFDRSxzQ0FBQTtDREpEO0FFcEJEO0VBQ0UsY0FBQTtFQUNBLGlCQUFBO0NGc0JEO0FFcEJDOzs7RUFHRSxVQUFBO0VBQ0EsZUFBQTtFQUNBLGlCQUFBO0NGc0JIO0FFbkJDO0VBQ0UsWUFBQTtDRnFCSDtBRWxCQztFQUNFLGVBQUE7RUFDQSxrQkFBQTtDRm9CSDtBRWpCQztFQUNFLGlCQUFBO0VBQ0EsWUFBQTtDRm1CSDtBRWhCQztFQUNFLGVBQUE7RUFDQSxZQUFBO0NGa0JIO0FFZkM7OztFQUdFLFVBQUE7RUFDQSxXQUFBO0VBQ0EsaUJBQUE7Q0ZpQkg7QUVkQztFQUNFLG1CQUFBO0VBQ0EsV0FBQTtDRmdCSDtBRWJDO0VBQ0Us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RUFDQSxVQUFBO0VBQ0EsWUFBQTtFQUNBLGFBQUE7RUFDQSx5Q0FBQTtVQUFBLGlDQUFBO0VBQ0EsbUJBQUE7RUFDQSxpQkFBQTtDZitqQ0g7QWUxakNLO0VBQ0UsWUFBQTtFQUNBLDBCQUFBO0VBQ0Esc0JBQUE7Q2Y0akNQO0FlMWpDTztFQUNFLFlBQUE7Q2Y0akNUO0FldGpDSzs7O0VBR0UsWUFBQTtDZndqQ1A7QWVsakNHO0VBQ0Usb0JBQUE7Q2ZvakNMO0FlN2lDSzs7Ozs7Ozs7RUFJRSxvQkFBQTtFQUNBLFlBQUE7RUFDQSxtQkFBQTtDZm1qQ1A7QWVqakNPOzs7Ozs7OztFQUNFLFlBQUE7RUFDQSxtQkFBQTtDZjBqQ1Q7QWV0akNLOztFQUNFLDBCQUFBO0NmeWpDUDtBZXBqQ0M7O0VBRUUsVUFBQTtFQUNBLG9DQUFBO1VBQUEsNEJBQUE7Q2ZzakNIO0FlempDQzs7RUFNSSxzQkFBQTtDZnVqQ0w7QWVuakNDO0VBQ0UsVUFBQTtDZnFqQ0g7QWVuakNHO0VBQ0UsV0FBQTtDZnFqQ0w7QWVqakNDO0VBQ0UsYUFBQTtDZm1qQ0g7QWVqakNHO0VBQ0UsY0FBQTtDZm1qQ0w7QWUvaUNDOztFQUVFLG9DQUFBO1VBQUEsNEJBQUE7RUFDQSxZQUFBO0NmaWpDSDtBZTlpQ0M7RUFDRSxTQUFBO0VBQ0EsWUFBQTtDZmdqQ0g7QWU5aUNHO0VBQ0UsYUFBQTtDZmdqQ0w7QWU1aUNDO0VBQ0UsU0FBQTtFQUNBLFdBQUE7Q2Y4aUNIO0FlNWlDRztFQUNFLFlBQUE7Q2Y4aUNMO0FlcmlDSzs7OztFQUNFLGNBQUE7Q2YwaUNQIiwiZmlsZSI6ImV4YW1wbGUuY3NzIiwic291cmNlc0NvbnRlbnQiOlsiLyogPT09PT0gU2Nyb2xsYmFyID09PT09ICovXG46Oi13ZWJraXQtc2Nyb2xsYmFyIHtcbiAgd2lkdGg6IDdweDtcbiAgaGVpZ2h0OiA3cHg7XG4gIC13ZWJraXQtYm9yZGVyLXJhZGl1czogNXB4O1xufVxuOjotd2Via2l0LXNjcm9sbGJhci10cmFjay1waWVjZSB7XG4gIC13ZWJraXQtYm9yZGVyLXJhZGl1czogNXB4O1xufVxuOjotd2Via2l0LXNjcm9sbGJhci10aHVtYjp2ZXJ0aWNhbCB7XG4gIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMCwgMCwgMCwgMC4yNSk7XG4gIC13ZWJraXQtYm9yZGVyLXJhZGl1czogNXB4O1xufVxuOjotd2Via2l0LXNjcm9sbGJhci10aHVtYjpob3Jpem9udGFsIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjI1KTtcbiAgLXdlYmtpdC1ib3JkZXItcmFkaXVzOiA1cHg7XG59XG46Oi13ZWJraXQtc2Nyb2xsYmFyOmhvdmVyIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjE1KTtcbn1cbjo6LXdlYmtpdC1zY3JvbGxiYXItdGh1bWI6aG92ZXIge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuMzUpO1xufVxuLnNlY3Rpb24ge1xuICBtYXJnaW46IDFlbSAwO1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLnNlY3Rpb25fX2hlYWRlcixcbi5zZWN0aW9uX19jb250ZW50LFxuLnNlY3Rpb25fX2Zvb3RlciB7XG4gIG1hcmdpbjogMDtcbiAgcGFkZGluZzogMCAzZW07XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4uc2VjdGlvbl9fdGl0bGUge1xuICBjb2xvcjogIzY2Njtcbn1cbi5zZWN0aW9uX19oMyB7XG4gIGNvbG9yOiAjNTA3YWZlO1xuICBmb250LXNpemU6IDEuMzVlbTtcbn1cbi5zZWN0aW9uX19oNCB7XG4gIGZvbnQtc2l6ZTogMS4xZW07XG4gIGNvbG9yOiAjNjY2O1xufVxuLnNlY3Rpb25fX2g1IHtcbiAgZm9udC1zaXplOiAxZW07XG4gIGNvbG9yOiAjOTk5O1xufVxuLnNlY3Rpb25fX2RsLFxuLnNlY3Rpb25fX2R0LFxuLnNlY3Rpb25fX2RkIHtcbiAgbWFyZ2luOiAwO1xuICBwYWRkaW5nOiAwO1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLnNlY3Rpb25fX2RsIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICB6LWluZGV4OiAxO1xufVxuLnNlY3Rpb25fX2R0IHtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xufVxuLnNlY3Rpb25fX2RkIHtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICBjb2xvcjogIzA1ODk0Mjtcbn1cbi5zZWN0aW9uX19wcmUge1xuICBtYXJnaW46IDJlbSAwO1xuICBwYWRkaW5nOiAxZW07XG4gIGZvbnQtc2l6ZTogMTRweDtcbiAgbGluZS1oZWlnaHQ6IDE1MCU7XG4gIHRleHQtYWxpZ246IGxlZnQ7XG4gIGJhY2tncm91bmQtY29sb3I6ICNmYWZhZmE7XG4gIGJvcmRlcjogMXB4IHNvbGlkICNkZGQ7XG4gIGJvcmRlci1yYWRpdXM6IDRweDtcbiAgY29sb3I6ICM2NjY7XG4gIG92ZXJmbG93OiBhdXRvO1xufVxuLnNlY3Rpb25fX2NvZGUge1xuICBkaXNwbGF5OiBibG9jaztcbiAgbWFyZ2luOiAwIGF1dG87XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4uc2VjdGlvbl9fZm9vdGVyIHtcbiAgYm9yZGVyLXRvcDogMXB4IHNvbGlkICNkZGQ7XG4gIG1hcmdpbi10b3A6IDNlbTtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ZhZmFmYTtcbiAgY29sb3I6ICM5OTk7XG59XG4uc2VjdGlvbl9fdGFibGUge1xuICBtYXJnaW46IDFlbSBhdXRvO1xuICB3aWR0aDogMTAwJTtcbiAgYm9yZGVyLXRvcDogMXB4IHNvbGlkICNkZGQ7XG59XG4uc2VjdGlvbl9fdGgsXG4uc2VjdGlvbl9fdGQge1xuICBwYWRkaW5nOiA1cHggMTZweDtcbiAgbGluZS1oZWlnaHQ6IDI2cHg7XG4gIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjZGRkO1xufVxuLnNlY3Rpb25fX3RoIHtcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmFmYWZhO1xufVxuQG1lZGlhIChtYXgtd2lkdGg6IDUwMHB4KSB7XG4gIC5zZWN0aW9uX19oZWFkZXIsXG4gIC5zZWN0aW9uX19jb250ZW50IHtcbiAgICBwYWRkaW5nOiAwIDFlbTtcbiAgfVxufVxuLmNhc2Uge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIHotaW5kZXg6IDE7XG4gIGRpc3BsYXk6IGdyaWQ7XG4gIGdyaWQtdGVtcGxhdGUtY29sdW1uczogcmVwZWF0KDIsIDFmcik7XG4gIGdhcDogNDBweDtcbiAgcGFkZGluZzogMWVtO1xuICBib3JkZXItdG9wOiAxcHggc29saWQgI2RkZDtcbiAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNkZGQ7XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4uY2FzZTphZnRlciB7XG4gIGNvbnRlbnQ6ICcnO1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHotaW5kZXg6IDI7XG4gIHRvcDogMDtcbiAgbGVmdDogNTAlO1xuICBoZWlnaHQ6IDEwMCU7XG4gIHdpZHRoOiAwO1xuICBib3JkZXItbGVmdDogMXB4IHNvbGlkICNkZGQ7XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4uY2FzZV9fcHJlLFxuLmNhc2VfX3RleHRhcmVhIHtcbiAgZm9udC1zaXplOiAxM3B4O1xuICBsaW5lLWhlaWdodDogMTUwJTtcbn1cbi5jYXNlX19wcmUsXG4uY2FzZV9fY29kZSxcbi5jYXNlX190ZXh0YXJlYSB7XG4gIGZvbnQtZmFtaWx5OiAnQ291cmllciBOZXcnLCBDb25zb2xhcywgR2VvcmdpYSwgQXJpYWwsIHNhbnMtc2VyaWY7XG59XG4uY2FzZV9fcHJlIHtcbiAgbWFyZ2luOiAwO1xuICBwYWRkaW5nOiAxZW07XG4gIGJhY2tncm91bmQtY29sb3I6ICNmYWZhZmE7XG4gIGhlaWdodDogMTAwJTtcbiAgYm9yZGVyLXJhZGl1czogNHB4O1xuICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICBvdmVyZmxvdzogYXV0bztcbn1cbi5jYXNlX190b29sYmFyIHtcbiAgbWFyZ2luOiAwIGF1dG87XG4gIGhlaWdodDogMzZweDtcbiAgbGluZS1oZWlnaHQ6IDM2cHg7XG4gIGZvbnQtc2l6ZTogMTRweDtcbiAgcGFkZGluZzogMCAxNnB4O1xuICB0ZXh0LWFsaWduOiByaWdodDtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi5jYXNlX19hY3Rpb24sXG4uY2FzZV9fcmVtb3ZlIHtcbiAgY3Vyc29yOiBwb2ludGVyO1xuICBjb2xvcjogIzA1ODk0MjtcbiAgdXNlci1zZWxlY3Q6IG5vbmU7XG59XG4uY2FzZV9fYWN0aW9uIHtcbiAgZm9udC1zaXplOiAxM3B4O1xuICBwYWRkaW5nLWxlZnQ6IDEwcHg7XG59XG4uY2FzZV9fYWN0aW9uOmZpcnN0LWNoaWxkIHtcbiAgcGFkZGluZy1sZWZ0OiAwO1xufVxuLmNhc2VfX3JlbW92ZSB7XG4gIGZsb2F0OiByaWdodDtcbn1cbi5jYXNlX19jb25zb2xlIHtcbiAgbWFyZ2luOiAwIGF1dG87XG4gIGhlaWdodDogMTgwcHg7XG4gIGJvcmRlcjogMXB4IHNvbGlkICNkZGQ7XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4uY2FzZV9fdGV4dGFyZWEge1xuICBtYXJnaW46IDAgYXV0bztcbiAgd2lkdGg6IDEwMCU7XG4gIGhlaWdodDogMTAwJTtcbiAgYm9yZGVyOiBub25lO1xuICBvdXRsaW5lOiBub25lO1xuICBwYWRkaW5nOiAxZW07XG4gIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gIG92ZXJmbG93OiBhdXRvO1xufVxuLmNhc2VfX2xpc3QsXG4uY2FzZV9faXRlbSB7XG4gIG1hcmdpbjogMDtcbiAgcGFkZGluZzogMDtcbiAgbGlzdC1zdHlsZS10eXBlOiBub25lO1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLmNhc2VfX2xpc3Qge1xuICBoZWlnaHQ6IDM2MHB4O1xuICBib3JkZXItdG9wOiAxcHggc29saWQgI2RkZDtcbiAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNkZGQ7XG4gIGZvbnQtc2l6ZTogMTNweDtcbiAgb3ZlcmZsb3c6IGF1dG87XG59XG4uY2FzZV9faXRlbSB7XG4gIGhlaWdodDogMzZweDtcbiAgbGluZS1oZWlnaHQ6IDM2cHg7XG4gIGN1cnNvcjogcG9pbnRlcjtcbiAgcGFkZGluZzogMCAxNnB4O1xufVxuLmNhc2VfX2l0ZW06aG92ZXIge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjdmOGY5O1xufVxuLyoqXG4gKiBtaXhpbnMubGVzcyAtIOW3peWFt+WHveaVsFxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogQ3JlYXRlZCBCeTogWWFvaGFpeGlhb1xuICogVXBkYXRlOiAyMDIyLjMuMTFcbiAqL1xuLyoqXG4gKiByYWRpdXMubGVzcyAtIOWchuinkuiuvue9riBtaXhpbngg5Ye95pWwXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBDcmVhdGVkIEJ5OiBZYW9oYWl4aWFvXG4gKiBVcGRhdGU6IDIwMjQuNC4xNlxuICovXG4vKiA9PT09PT0g5ZyG6KeS5qC35byP6K6+572u5Ye95pWwID09PT09PSAqL1xuLnBhcGVyIHtcbiAgYm94LXNoYWRvdzogMCAwIDZweCAxcHggI2RjZGZlNjtcbiAgbWFyZ2luOiAzZW0gYXV0bztcbiAgbWF4LXdpZHRoOiAxMjAwcHg7XG4gIHBhZGRpbmc6IDJlbTtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjtcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbn1cbi5wYXBlci5mbGV4IHtcbiAgZGlzcGxheTogZmxleDtcbiAgZmxleC1kaXJlY3Rpb246IHJvdztcbiAgZmxleC13cmFwOiBub3dyYXA7XG4gIG1hcmdpbjogMDtcbiAgd2lkdGg6IDEwMCU7XG4gIG1heC13aWR0aDogMTAwJTtcbiAgaGVpZ2h0OiAxMDAlO1xuICBwYWRkaW5nOiAwO1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLnBhcGVyLmZsZXggLmFydGljbGUge1xuICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICB3aWR0aDogMTAwJTtcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbn1cbi5wYXBlci5mbGV4IC5hcnRpY2xlX19tYWluIHtcbiAgaGVpZ2h0OiAxMDAlO1xuICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICBvdmVyZmxvdzogYXV0bztcbn1cbi5wYXBlci5mbGV4IC5hcnRpY2xlX19hc2lkZSB7XG4gIGJvcmRlci1yaWdodDogMXB4IHNvbGlkICNkY2RmZTY7XG59XG4uaGVhZGVyIHtcbiAgcG9zaXRpb246IHN0aWNreTtcbiAgei1pbmRleDogMztcbiAgdG9wOiAwO1xuICBtYXJnaW46IDAgYXV0bztcbiAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNkZGQ7XG4gIGJhY2tncm91bmQtY29sb3I6ICNmZmY7XG4gIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgdHJhbnNpdGlvbi1kdXJhdGlvbjogMC4zcztcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi5oZWFkZXJfc3RpY2t5IHtcbiAgcGFkZGluZy1sZWZ0OiAyNjBweDtcbn1cbi5hcnRpY2xlIHtcbiAgZGlzcGxheTogZmxleDtcbiAgZmxleC1kaXJlY3Rpb246IHJvdztcbiAgZmxleC13cmFwOiBub3dyYXA7XG4gIHBhZGRpbmc6IDJlbSAwO1xuICBmb250LXNpemU6IDE2cHg7XG4gIGxpbmUtaGVpZ2h0OiAxNTAlO1xufVxuLmFydGljbGVfX21haW4ge1xuICBmbGV4OiAxO1xuICBwYWRkaW5nOiAwIDJlbTtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi5hcnRpY2xlX19tYWluIC5zZWN0aW9uIHtcbiAgb3ZlcmZsb3c6IHZpc2libGU7XG59XG4uYXJ0aWNsZV9fbWFpbiAuc2VjdGlvbl9fY29udGVudCxcbi5hcnRpY2xlX19tYWluIC5zZWN0aW9uX19mb290ZXIsXG4uYXJ0aWNsZV9fbWFpbiAuc2VjdGlvbl9faGVhZGVyIHtcbiAgb3ZlcmZsb3c6IHZpc2libGU7XG59XG4uYXJ0aWNsZV9fbWFpbiAuc2VjdGlvbl9faGVhZGVyLFxuLmFydGljbGVfX21haW4gLnNlY3Rpb25fX2NvbnRlbnQge1xuICBtYXJnaW46IDA7XG59XG4uYXJ0aWNsZV9fYXNpZGUge1xuICBmbGV4LXNocmluazogMDtcbiAgd2lkdGg6IDI0MHB4O1xuICBib3JkZXItbGVmdDogMXB4IHNvbGlkICNkZGQ7XG59XG4uYXJ0aWNsZV9fYXNpZGUubHRyIHtcbiAgYm9yZGVyLXJpZ2h0OiAxcHggc29saWQgI2RkZDtcbiAgYm9yZGVyLWxlZnQ6IG5vbmU7XG59XG4uYXJ0aWNsZV9fYXNpZGUgLm91dGxpbmUtbmF2aWdhdG9yIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjtcbn1cbnByZSxcbi5zZWN0aW9uX19wcmUge1xuICBwYWRkaW5nOiAyZW07XG4gIGZvbnQtZmFtaWx5OiAnQ291cmllciBOZXcnLCBBcmlhbCwgc2Fucy1zZXJpZjtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ZhZmFmYTtcbiAgb3ZlcmZsb3c6IGF1dG87XG59XG5jb2RlLFxuLnNlY3Rpb25fX2NvZGUge1xuICBmb250LWZhbWlseTogJ0NvdXJpZXIgTmV3JywgQXJpYWwsIHNhbnMtc2VyaWY7XG4gIGZvbnQtc2l6ZTogMTZweDtcbn1cbi5mb290ZXIge1xuICBib3JkZXItdG9wOiAxcHggc29saWQgI2RjZGZlNjtcbiAgcGFkZGluZzogM2VtIDA7XG4gIHRleHQtYWxpZ246IGNlbnRlcjtcbn1cbi5mb290ZXIgYTpsaW5rLFxuLmZvb3RlciBhOnZpc2l0ZWQsXG4uZm9vdGVyIGE6aG92ZXIge1xuICB0ZXh0LWRlY29yYXRpb246IG5vbmU7XG4gIGNvbG9yOiAjMDU4OTQyO1xufVxuLmZvb3RlciBhOmhvdmVyIHtcbiAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7XG59XG4udXRpbHMtYm9yZGVyLXJpZ2h0IHtcbiAgYm9yZGVyLXJpZ2h0OiAxcHggc29saWQgI2RjZGZlNjtcbn1cbi5oaWRkZW4ge1xuICBkaXNwbGF5OiBub25lO1xufVxuQG1lZGlhIChtYXgtd2lkdGg6IDUwMHB4KSB7XG4gIGh0bWwsXG4gIGJvZHkge1xuICAgIG1hcmdpbjogMDtcbiAgfVxuICAucGFwZXIge1xuICAgIG1hcmdpbjogMDtcbiAgICBwYWRkaW5nOiAwO1xuICB9XG4gIC5hcnRpY2xlX19tYWluIHtcbiAgICBwYWRkaW5nOiAwIDJlbTtcbiAgfVxufVxuOnJvb3Qge1xuICAtLW91dGxpbmUtekluZGV4OiAyMDAwO1xuICAtLW91dGxpbmUtc3RpY2t5LWhlaWdodDogMTAwJTtcbiAgLS1vdXRsaW5lLW5hdmlnYXRvci13aWR0aDogMTAwJTtcbn1cbi8qID09PT09PT09PT0gY29sb3JzLnRoZW1lIC0g5Z+656GA6aKc6Imy5Y+Y6YeP6ZuG5ZCIID09PT09PT09PT0gKi9cbi8qKlxuICogZWxsaXBzaXMubGVzcyAtIOaWh+acrOecgeeVpSBtaXhpbngg5Ye95pWwXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBDcmVhdGVkIEJ5OiBZYW9oYWl4aWFvXG4gKiBVcGRhdGU6IDIwMjIuMy4xMVxuICovXG4vKiA9PT09PT0g5paH5pys55yB55Wl5Ye95pWwID09PT09PSAqL1xuLyoqXG4gKiBzaGFkb3cubGVzcyAtIOmYtOW9seagt+W8j+iuvue9riBtaXhpbngg5Ye95pWwXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBDcmVhdGVkIEJ5OiBZYW9oYWl4aWFvXG4gKiBVcGRhdGU6IDIwMjIuMy4yMFxuICovXG4vKiA9PT09PT0g6Zi05b2x5qC35byP6K6+572u5Ye95pWwID09PT09PSAqL1xuLyogPT09PT09PT09PSBpY29uLnRoZW1lIC0gc3ZnIOWbvuagh+eahOagt+W8jyA9PT09PT09PT09ICovXG4ub3V0bGluZS1pY29uIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICB6LWluZGV4OiAxO1xuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XG4gIHdpZHRoOiAxZW07XG4gIGhlaWdodDogMWVtO1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLm91dGxpbmUtaWNvbl9fc3ZnIHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB6LWluZGV4OiAyO1xuICB0b3A6IDUwJTtcbiAgbGVmdDogNTAlO1xuICB3aWR0aDogMWVtO1xuICBoZWlnaHQ6IDFlbTtcbiAgZmlsbDogY3VycmVudGNvbG9yO1xuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCAtNTAlKTtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi5vdXRsaW5lLWljb25faGlkZGVuIHtcbiAgZGlzcGxheTogbm9uZTtcbn1cbi8qID09PT09IFNjcm9sbGJhciA9PT09PSAqL1xuOjotd2Via2l0LXNjcm9sbGJhciB7XG4gIHdpZHRoOiA3cHg7XG4gIGhlaWdodDogN3B4O1xuICAtd2Via2l0LWJvcmRlci1yYWRpdXM6IDVweDtcbn1cbjo6LXdlYmtpdC1zY3JvbGxiYXItdHJhY2stcGllY2Uge1xuICAtd2Via2l0LWJvcmRlci1yYWRpdXM6IDVweDtcbn1cbjo6LXdlYmtpdC1zY3JvbGxiYXItdGh1bWI6dmVydGljYWwge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuMjUpO1xuICAtd2Via2l0LWJvcmRlci1yYWRpdXM6IDVweDtcbn1cbjo6LXdlYmtpdC1zY3JvbGxiYXItdGh1bWI6aG9yaXpvbnRhbCB7XG4gIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMCwgMCwgMCwgMC4yNSk7XG4gIC13ZWJraXQtYm9yZGVyLXJhZGl1czogNXB4O1xufVxuOjotd2Via2l0LXNjcm9sbGJhci10aHVtYjpob3ZlciB7XG4gIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMCwgMCwgMCwgMC4zNSk7XG59XG46Oi13ZWJraXQtc2Nyb2xsYmFyOmhvdmVyIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjE1KTtcbn1cbi5vdXRsaW5lLWhlYWRpbmcge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIHotaW5kZXg6IDE7XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4ub3V0bGluZS1oZWFkaW5nX19hbmNob3Ige1xuICBkaXNwbGF5OiBub25lO1xufVxuLm91dGxpbmUtaGVhZGluZ19fYW5jaG9yOmxpbmssXG4ub3V0bGluZS1oZWFkaW5nX19hbmNob3I6dmlzaXRlZCxcbi5vdXRsaW5lLWhlYWRpbmdfX2FuY2hvcjpob3ZlciB7XG4gIGNvbG9yOiAjOTk5O1xuICB0ZXh0LWRlY29yYXRpb246IG5vbmU7XG59XG4ub3V0bGluZS1oZWFkaW5nX19hbmNob3I6aG92ZXIge1xuICBjb2xvcjogIzUwN2FmZTtcbn1cbi5vdXRsaW5lLWhlYWRpbmc6aG92ZXIgLm91dGxpbmUtaGVhZGluZ19fYW5jaG9yIHtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xufVxuLm91dGxpbmUtaGVhZGluZ19zdGFydDpob3ZlciB7XG4gIG92ZXJmbG93OiB2aXNpYmxlO1xufVxuLm91dGxpbmUtaGVhZGluZ19zdGFydCAub3V0bGluZS1oZWFkaW5nX19hbmNob3Ige1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHotaW5kZXg6IDI7XG4gIHRvcDogNTAlO1xuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTUwJSk7XG4gIGxlZnQ6IC0xZW07XG59XG4ub3V0bGluZS1kcmF3ZXIge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIHotaW5kZXg6IC0xO1xuICB0b3A6IDA7XG4gIGxlZnQ6IDA7XG4gIG1hcmdpbjogMDtcbiAgd2lkdGg6IDEwMCU7XG4gIGhlaWdodDogMTAwJTtcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgdmlzaWJpbGl0eTogaGlkZGVuO1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLm91dGxpbmUtZHJhd2VyX19tb2RhbCB7XG4gIGJveC1zaGFkb3c6IDAgMCA2cHggMXB4ICNkY2RmZTY7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gIGZsZXgtd3JhcDogbm93cmFwO1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHotaW5kZXg6IDIxO1xuICBoZWlnaHQ6IDEwMCU7XG4gIGJhY2tncm91bmQtY29sb3I6ICNmZmY7XG4gIHRyYW5zaXRpb24tZHVyYXRpb246IDAuNHM7XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4ub3V0bGluZS1kcmF3ZXJfX2hlYWRlcixcbi5vdXRsaW5lLWRyYXdlcl9fbWFpbixcbi5vdXRsaW5lLWRyYXdlcl9fZm9vdGVyIHtcbiAgd2lkdGg6IDEwMCU7XG4gIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG59XG4ub3V0bGluZS1kcmF3ZXJfX2hlYWRlcixcbi5vdXRsaW5lLWRyYXdlcl9fZm9vdGVyIHtcbiAgZmxleC1zaHJpbms6IDA7XG59XG4ub3V0bGluZS1kcmF3ZXJfX3RpdGxlLFxuLm91dGxpbmUtZHJhd2VyX19tYWluLFxuLm91dGxpbmUtZHJhd2VyX19mb290ZXIge1xuICBwYWRkaW5nOiAwIDE2cHg7XG59XG4ub3V0bGluZS1kcmF3ZXJfX2hlYWRlcixcbi5vdXRsaW5lLWRyYXdlcl9fdGl0bGUge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIHotaW5kZXg6IDE7XG4gIG1hcmdpbjogMCBhdXRvO1xuICBoZWlnaHQ6IDUycHg7XG4gIGxpbmUtaGVpZ2h0OiA1MnB4O1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLm91dGxpbmUtZHJhd2VyX190aXRsZSB7XG4gIGZvbnQtc2l6ZTogMTZweDtcbiAgZm9udC13ZWlnaHQ6IDQwMDtcbiAgbWFyZ2luOiAwIDE2cHg7XG4gIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjZGNkZmU2O1xufVxuLm91dGxpbmUtZHJhd2VyX19jbG9zZSB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgei1pbmRleDogMjtcbiAgdG9wOiA1MCU7XG4gIHJpZ2h0OiAxMnB4O1xuICB3aWR0aDogMjBweDtcbiAgaGVpZ2h0OiAyMHB4O1xuICBsaW5lLWhlaWdodDogMjBweDtcbiAgY29sb3I6ICM5OTk7XG4gIGZvbnQtc2l6ZTogMjBweDtcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xuICBjdXJzb3I6IHBvaW50ZXI7XG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtNTAlKTtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi5vdXRsaW5lLWRyYXdlcl9fY2xvc2UgLm91dGxpbmUtaWNvbiB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgei1pbmRleDogMjtcbiAgdG9wOiAwO1xuICBsZWZ0OiAwO1xufVxuLm91dGxpbmUtZHJhd2VyX19jbG9zZTpob3ZlciB7XG4gIGNvbG9yOiAjNjY2O1xufVxuLm91dGxpbmUtZHJhd2VyX19tYWluIHtcbiAgZmxleDogMTtcbiAgb3ZlcmZsb3c6IGF1dG87XG59XG4ub3V0bGluZS1kcmF3ZXJfX21haW4ub3ZlcmZsb3ctaGlkZGVuIHtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi5vdXRsaW5lLWRyYXdlcl9fZm9vdGVyIHtcbiAgbWFyZ2luOiAwIGF1dG87XG4gIHRleHQtYWxpZ246IHJpZ2h0O1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLm91dGxpbmUtZHJhd2VyX19vdmVybGF5IHtcbiAgY29udGVudDogJyc7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgei1pbmRleDogMTtcbiAgdG9wOiAwO1xuICBsZWZ0OiAwO1xuICB3aWR0aDogMTAwJTtcbiAgaGVpZ2h0OiAxMDAlO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmO1xuICBvcGFjaXR5OiAwLjE7XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4ub3V0bGluZS1kcmF3ZXJfcnRsLm91dGxpbmUtZHJhd2VyX3RpbnksXG4ub3V0bGluZS1kcmF3ZXJfbHRyLm91dGxpbmUtZHJhd2VyX3Rpbnkge1xuICB3aWR0aDogMjgwcHg7XG59XG4ub3V0bGluZS1kcmF3ZXJfcnRsLm91dGxpbmUtZHJhd2VyX21pbmksXG4ub3V0bGluZS1kcmF3ZXJfbHRyLm91dGxpbmUtZHJhd2VyX21pbmkge1xuICB3aWR0aDogNDgwcHg7XG59XG4ub3V0bGluZS1kcmF3ZXJfcnRsLm91dGxpbmUtZHJhd2VyX3NtYWxsLFxuLm91dGxpbmUtZHJhd2VyX2x0ci5vdXRsaW5lLWRyYXdlcl9zbWFsbCB7XG4gIHdpZHRoOiA1NDBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl9ydGwub3V0bGluZS1kcmF3ZXJfcmVndWxhcixcbi5vdXRsaW5lLWRyYXdlcl9sdHIub3V0bGluZS1kcmF3ZXJfcmVndWxhciB7XG4gIHdpZHRoOiA2ODBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl9ydGwub3V0bGluZS1kcmF3ZXJfbWVkaXVtLFxuLm91dGxpbmUtZHJhd2VyX2x0ci5vdXRsaW5lLWRyYXdlcl9tZWRpdW0ge1xuICB3aWR0aDogNzIwcHg7XG59XG4ub3V0bGluZS1kcmF3ZXJfcnRsLm91dGxpbmUtZHJhd2VyX2xhcmdlLFxuLm91dGxpbmUtZHJhd2VyX2x0ci5vdXRsaW5lLWRyYXdlcl9sYXJnZSB7XG4gIHdpZHRoOiA5NjBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl9ydGwge1xuICBib3JkZXItbGVmdDogMXB4IHNvbGlkICNkY2RmZTY7XG59XG4ub3V0bGluZS1kcmF3ZXJfcnRsLm91dGxpbmUtZHJhd2VyX3Rpbnkub3V0bGluZS1kcmF3ZXJfY2xvc2VkIHtcbiAgcmlnaHQ6IC0yOTBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl9ydGwub3V0bGluZS1kcmF3ZXJfbWluaS5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xuICByaWdodDogLTQ5MHB4O1xufVxuLm91dGxpbmUtZHJhd2VyX3J0bC5vdXRsaW5lLWRyYXdlcl9zbWFsbC5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xuICByaWdodDogLTU1MHB4O1xufVxuLm91dGxpbmUtZHJhd2VyX3J0bC5vdXRsaW5lLWRyYXdlcl9yZWd1bGFyLm91dGxpbmUtZHJhd2VyX2Nsb3NlZCB7XG4gIHJpZ2h0OiAtNjkwcHg7XG59XG4ub3V0bGluZS1kcmF3ZXJfcnRsLm91dGxpbmUtZHJhd2VyX21lZGl1bS5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xuICByaWdodDogLTczMHB4O1xufVxuLm91dGxpbmUtZHJhd2VyX3J0bC5vdXRsaW5lLWRyYXdlcl9sYXJnZS5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xuICByaWdodDogLTk3MHB4O1xufVxuLm91dGxpbmUtZHJhd2VyX2x0ciB7XG4gIGJvcmRlci1yaWdodDogMXB4IHNvbGlkICNkY2RmZTY7XG59XG4ub3V0bGluZS1kcmF3ZXJfbHRyLm91dGxpbmUtZHJhd2VyX3Rpbnkub3V0bGluZS1kcmF3ZXJfY2xvc2VkIHtcbiAgbGVmdDogLTI5MHB4O1xufVxuLm91dGxpbmUtZHJhd2VyX2x0ci5vdXRsaW5lLWRyYXdlcl9taW5pLm91dGxpbmUtZHJhd2VyX2Nsb3NlZCB7XG4gIGxlZnQ6IC00OTBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl9sdHIub3V0bGluZS1kcmF3ZXJfc21hbGwub3V0bGluZS1kcmF3ZXJfY2xvc2VkIHtcbiAgbGVmdDogLTU1MHB4O1xufVxuLm91dGxpbmUtZHJhd2VyX2x0ci5vdXRsaW5lLWRyYXdlcl9yZWd1bGFyLm91dGxpbmUtZHJhd2VyX2Nsb3NlZCB7XG4gIGxlZnQ6IC02OTBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl9sdHIub3V0bGluZS1kcmF3ZXJfbWVkaXVtLm91dGxpbmUtZHJhd2VyX2Nsb3NlZCB7XG4gIGxlZnQ6IC03MzBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl9sdHIub3V0bGluZS1kcmF3ZXJfbGFyZ2Uub3V0bGluZS1kcmF3ZXJfY2xvc2VkIHtcbiAgbGVmdDogLTk3MHB4O1xufVxuLm91dGxpbmUtZHJhd2VyX3R0Yixcbi5vdXRsaW5lLWRyYXdlcl9idHQge1xuICBsZWZ0OiAwO1xuICB3aWR0aDogMTAwJTtcbn1cbi5vdXRsaW5lLWRyYXdlcl90dGIub3V0bGluZS1kcmF3ZXJfdGlueSxcbi5vdXRsaW5lLWRyYXdlcl9idHQub3V0bGluZS1kcmF3ZXJfdGlueSB7XG4gIGhlaWdodDogMjQwcHg7XG59XG4ub3V0bGluZS1kcmF3ZXJfdHRiLm91dGxpbmUtZHJhd2VyX21pbmksXG4ub3V0bGluZS1kcmF3ZXJfYnR0Lm91dGxpbmUtZHJhd2VyX21pbmkge1xuICBoZWlnaHQ6IDMyMHB4O1xufVxuLm91dGxpbmUtZHJhd2VyX3R0Yi5vdXRsaW5lLWRyYXdlcl9zbWFsbCxcbi5vdXRsaW5lLWRyYXdlcl9idHQub3V0bGluZS1kcmF3ZXJfc21hbGwge1xuICBoZWlnaHQ6IDM2MHB4O1xufVxuLm91dGxpbmUtZHJhd2VyX3R0Yi5vdXRsaW5lLWRyYXdlcl9yZWd1bGFyLFxuLm91dGxpbmUtZHJhd2VyX2J0dC5vdXRsaW5lLWRyYXdlcl9yZWd1bGFyIHtcbiAgaGVpZ2h0OiA0MDBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl90dGIub3V0bGluZS1kcmF3ZXJfbWVkaXVtLFxuLm91dGxpbmUtZHJhd2VyX2J0dC5vdXRsaW5lLWRyYXdlcl9tZWRpdW0ge1xuICBoZWlnaHQ6IDQ0MHB4O1xufVxuLm91dGxpbmUtZHJhd2VyX3R0Yi5vdXRsaW5lLWRyYXdlcl9sYXJnZSxcbi5vdXRsaW5lLWRyYXdlcl9idHQub3V0bGluZS1kcmF3ZXJfbGFyZ2Uge1xuICBoZWlnaHQ6IDQ4MHB4O1xufVxuLm91dGxpbmUtZHJhd2VyX3R0YiB7XG4gIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjZGNkZmU2O1xufVxuLm91dGxpbmUtZHJhd2VyX3R0Yi5vdXRsaW5lLWRyYXdlcl90aW55Lm91dGxpbmUtZHJhd2VyX2Nsb3NlZCB7XG4gIHRvcDogLTI1MHB4O1xufVxuLm91dGxpbmUtZHJhd2VyX3R0Yi5vdXRsaW5lLWRyYXdlcl9taW5pLm91dGxpbmUtZHJhd2VyX2Nsb3NlZCB7XG4gIHRvcDogLTMzMHB4O1xufVxuLm91dGxpbmUtZHJhd2VyX3R0Yi5vdXRsaW5lLWRyYXdlcl9zbWFsbC5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xuICB0b3A6IC0zNzBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl90dGIub3V0bGluZS1kcmF3ZXJfcmVndWxhci5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xuICB0b3A6IC00MTBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl90dGIub3V0bGluZS1kcmF3ZXJfbWVkaXVtLm91dGxpbmUtZHJhd2VyX2Nsb3NlZCB7XG4gIHRvcDogLTQ1MHB4O1xufVxuLm91dGxpbmUtZHJhd2VyX3R0Yi5vdXRsaW5lLWRyYXdlcl9sYXJnZS5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xuICB0b3A6IC00OTBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl9idHQge1xuICB0b3A6IGluaXRpYWw7XG4gIGJvcmRlci10b3A6IDFweCBzb2xpZCAjZGNkZmU2O1xufVxuLm91dGxpbmUtZHJhd2VyX2J0dC5vdXRsaW5lLWRyYXdlcl90aW55Lm91dGxpbmUtZHJhd2VyX2Nsb3NlZCB7XG4gIGJvdHRvbTogLTI1MHB4O1xufVxuLm91dGxpbmUtZHJhd2VyX2J0dC5vdXRsaW5lLWRyYXdlcl9taW5pLm91dGxpbmUtZHJhd2VyX2Nsb3NlZCB7XG4gIGJvdHRvbTogLTMzMHB4O1xufVxuLm91dGxpbmUtZHJhd2VyX2J0dC5vdXRsaW5lLWRyYXdlcl9zbWFsbC5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xuICBib3R0b206IC0zNzBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl9idHQub3V0bGluZS1kcmF3ZXJfcmVndWxhci5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xuICBib3R0b206IC00MTBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl9idHQub3V0bGluZS1kcmF3ZXJfbWVkaXVtLm91dGxpbmUtZHJhd2VyX2Nsb3NlZCB7XG4gIGJvdHRvbTogLTQ1MHB4O1xufVxuLm91dGxpbmUtZHJhd2VyX2J0dC5vdXRsaW5lLWRyYXdlcl9sYXJnZS5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xuICBib3R0b206IC00OTBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl9vcGVuZWQge1xuICB2aXNpYmlsaXR5OiB2aXNpYmxlO1xuICB6LWluZGV4OiB2YXIoLS1vdXRsaW5lLXpJbmRleCk7XG59XG4ub3V0bGluZS1kcmF3ZXJfb3BlbmVkLm91dGxpbmUtZHJhd2VyIHtcbiAgcG9zaXRpb246IGZpeGVkO1xufVxuLm91dGxpbmUtZHJhd2VyX29wZW5lZC5vdXRsaW5lLWRyYXdlcl9ydGwge1xuICByaWdodDogMDtcbn1cbi5vdXRsaW5lLWRyYXdlcl9vcGVuZWQub3V0bGluZS1kcmF3ZXJfbHRyIHtcbiAgbGVmdDogMDtcbn1cbi5vdXRsaW5lLWRyYXdlcl9vcGVuZWQub3V0bGluZS1kcmF3ZXJfdHRiIHtcbiAgdG9wOiAwO1xufVxuLm91dGxpbmUtZHJhd2VyX29wZW5lZC5vdXRsaW5lLWRyYXdlcl9idHQge1xuICBib3R0b206IDA7XG59XG4ub3V0bGluZS1kcmF3ZXJfb2Zmc2V0Lm91dGxpbmUtZHJhd2VyX3J0bCxcbi5vdXRsaW5lLWRyYXdlcl9vZmZzZXQub3V0bGluZS1kcmF3ZXJfbHRyIHtcbiAgaGVpZ2h0OiBjYWxjKDEwMCUgLSA0ZW0pO1xuICB0b3A6IDUwJTtcbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC01MCUpO1xufVxuLm91dGxpbmUtZHJhd2VyX29mZnNldC5vdXRsaW5lLWRyYXdlcl90dGIsXG4ub3V0bGluZS1kcmF3ZXJfb2Zmc2V0Lm91dGxpbmUtZHJhd2VyX2J0dCB7XG4gIHdpZHRoOiBjYWxjKDEwMCUgLSA0ZW0pO1xuICBsZWZ0OiA1MCU7XG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgtNTAlKTtcbn1cbi5vdXRsaW5lLWRyYXdlcl9vZmZzZXQub3V0bGluZS1kcmF3ZXJfb3BlbmVkLm91dGxpbmUtZHJhd2VyX3J0bCB7XG4gIHJpZ2h0OiAyZW07XG59XG4ub3V0bGluZS1kcmF3ZXJfb2Zmc2V0Lm91dGxpbmUtZHJhd2VyX29wZW5lZC5vdXRsaW5lLWRyYXdlcl9sdHIge1xuICBsZWZ0OiAyZW07XG59XG4ub3V0bGluZS1kcmF3ZXJfb2Zmc2V0Lm91dGxpbmUtZHJhd2VyX29wZW5lZC5vdXRsaW5lLWRyYXdlcl90dGIge1xuICB0b3A6IDJlbTtcbn1cbi5vdXRsaW5lLWRyYXdlcl9vZmZzZXQub3V0bGluZS1kcmF3ZXJfb3BlbmVkLm91dGxpbmUtZHJhd2VyX2J0dCB7XG4gIGJvdHRvbTogMmVtO1xufVxuLm91dGxpbmUtZHJhd2VyX2F1dG8ub3V0bGluZS1kcmF3ZXJfcnRsLFxuLm91dGxpbmUtZHJhd2VyX2F1dG8ub3V0bGluZS1kcmF3ZXJfbHRyIHtcbiAgaGVpZ2h0OiBhdXRvO1xuICBtYXgtaGVpZ2h0OiBjYWxjKDEwMCUgLSA0ZW0pO1xufVxuLm91dGxpbmUtZHJhd2VyX2Z1bGwge1xuICBwYWRkaW5nOiAwO1xufVxuLm91dGxpbmUtbmF2aWdhdG9yIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICB6LWluZGV4OiAxO1xuICBtYXJnaW46IDA7XG4gIHdpZHRoOiB2YXIoLS1vdXRsaW5lLW5hdmlnYXRvci13aWR0aCk7XG4gIG92ZXJmbG93OiBhdXRvO1xufVxuLm91dGxpbmUtbmF2aWdhdG9yLXBhcmVudCB7XG4gIHRyYW5zaXRpb246IDAuM3MgZWFzZS1pbi1vdXQ7XG59XG4ub3V0bGluZS1uYXZpZ2F0b3JfX3RpdGxlIHtcbiAgbWFyZ2luOiAwIDE2cHg7XG4gIGhlaWdodDogNDBweDtcbiAgbGluZS1oZWlnaHQ6IDQwcHg7XG4gIHBhZGRpbmc6IDAgMTZweDtcbiAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNkY2RmZTY7XG4gIGZvbnQtc2l6ZTogMTZweDtcbiAgZm9udC13ZWlnaHQ6IDQwMDtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi5vdXRsaW5lLW5hdmlnYXRvcl9fbWFpbiB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgei1pbmRleDogMTtcbiAgbWFyZ2luOiAwO1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLm91dGxpbmUtbmF2aWdhdG9yX19saXN0LFxuLm91dGxpbmUtbmF2aWdhdG9yX19zdWJqZWN0LFxuLm91dGxpbmUtbmF2aWdhdG9yX19pdGVtIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICB6LWluZGV4OiAyO1xuICBtYXJnaW46IDA7XG4gIHBhZGRpbmc6IDA7XG4gIGxpc3Qtc3R5bGUtdHlwZTogbm9uZTtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi5vdXRsaW5lLW5hdmlnYXRvcl9fbGlzdCB7XG4gIHBhZGRpbmc6IDAuNWVtIDA7XG59XG4ub3V0bGluZS1uYXZpZ2F0b3JfX3N1YmplY3Qge1xuICBwYWRkaW5nLWxlZnQ6IDFlbTtcbn1cbi5vdXRsaW5lLW5hdmlnYXRvcl9faXRlbSB7XG4gIG1hcmdpbjogMDtcbiAgbGluZS1oZWlnaHQ6IDMwcHg7XG4gIGZvbnQtc2l6ZTogMTNweDtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi5vdXRsaW5lLW5hdmlnYXRvcl9fcGxhY2Vob2xkZXIge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHotaW5kZXg6IDE7XG4gIHRvcDogMDtcbiAgbGVmdDogMDtcbiAgd2lkdGg6IDEwMCU7XG4gIGhlaWdodDogMzBweDtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2Y3ZjhmOTtcbiAgYm9yZGVyLWxlZnQ6IDJweCBzb2xpZCAjMDU4OTQyO1xuICB0cmFuc2l0aW9uLWR1cmF0aW9uOiAwLjJzO1xuICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLm91dGxpbmUtbmF2aWdhdG9yX19hbmNob3Ige1xuICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpcztcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgZGlzcGxheTogYmxvY2s7XG4gIHBhZGRpbmc6IDAgMS41ZW07XG59XG4ub3V0bGluZS1uYXZpZ2F0b3JfX2FuY2hvcjpsaW5rLFxuLm91dGxpbmUtbmF2aWdhdG9yX19hbmNob3I6dmlzaXRlZCxcbi5vdXRsaW5lLW5hdmlnYXRvcl9fYW5jaG9yOmhvdmVyIHtcbiAgdGV4dC1kZWNvcmF0aW9uOiBub25lO1xuICBjb2xvcjogIzU1NTtcbn1cbi5vdXRsaW5lLW5hdmlnYXRvcl9fYW5jaG9yOmhvdmVyIHtcbiAgY29sb3I6ICMwNTg5NDI7XG59XG4ub3V0bGluZS1uYXZpZ2F0b3JfX2NvZGUge1xuICBwYWRkaW5nLXJpZ2h0OiAwLjVlbTtcbn1cbi5vdXRsaW5lLW5hdmlnYXRvcl9oaWdobGlnaHQub3V0bGluZS1uYXZpZ2F0b3JfX2FuY2hvcjpsaW5rLFxuLm91dGxpbmUtbmF2aWdhdG9yX2hpZ2hsaWdodC5vdXRsaW5lLW5hdmlnYXRvcl9fYW5jaG9yOnZpc2l0ZWQsXG4ub3V0bGluZS1uYXZpZ2F0b3JfaGlnaGxpZ2h0Lm91dGxpbmUtbmF2aWdhdG9yX19hbmNob3I6aG92ZXIge1xuICBjb2xvcjogIzA1ODk0MjtcbiAgZm9udC13ZWlnaHQ6IGJvbGQ7XG59XG4ub3V0bGluZS1uYXZpZ2F0b3Jfc3RpY2t5LFxuLm91dGxpbmUtbmF2aWdhdG9yX2ZpeGVkIHtcbiAgZGlzcGxheTogZmxleDtcbiAgZmxleC13cmFwOiBub3dyYXA7XG4gIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gIHotaW5kZXg6IHZhcigtLW91dGxpbmUtekluZGV4KTtcbiAgdG9wOiAwO1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLm91dGxpbmUtbmF2aWdhdG9yX3N0aWNreSAub3V0bGluZS1uYXZpZ2F0b3JfX3RpdGxlLFxuLm91dGxpbmUtbmF2aWdhdG9yX2ZpeGVkIC5vdXRsaW5lLW5hdmlnYXRvcl9fdGl0bGUsXG4ub3V0bGluZS1uYXZpZ2F0b3Jfc3RpY2t5IC5vdXRsaW5lLW5hdmlnYXRvcl9fbWFpbixcbi5vdXRsaW5lLW5hdmlnYXRvcl9maXhlZCAub3V0bGluZS1uYXZpZ2F0b3JfX21haW4ge1xuICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xufVxuLm91dGxpbmUtbmF2aWdhdG9yX3N0aWNreSAub3V0bGluZS1uYXZpZ2F0b3JfX3RpdGxlLFxuLm91dGxpbmUtbmF2aWdhdG9yX2ZpeGVkIC5vdXRsaW5lLW5hdmlnYXRvcl9fdGl0bGUge1xuICBmbGV4LXNocmluazogMDtcbn1cbi5vdXRsaW5lLW5hdmlnYXRvcl9zdGlja3kgLm91dGxpbmUtbmF2aWdhdG9yX19tYWluLFxuLm91dGxpbmUtbmF2aWdhdG9yX2ZpeGVkIC5vdXRsaW5lLW5hdmlnYXRvcl9fbWFpbiB7XG4gIGZsZXg6IDE7XG4gIG92ZXJmbG93OiBhdXRvO1xufVxuLm91dGxpbmUtbmF2aWdhdG9yX3N0aWNreSB7XG4gIHBvc2l0aW9uOiBzdGlja3k7XG4gIG1heC1oZWlnaHQ6IHZhcigtLW91dGxpbmUtc3RpY2t5LWhlaWdodCk7XG59XG4ub3V0bGluZS1uYXZpZ2F0b3JfZml4ZWQge1xuICBwb3NpdGlvbjogZml4ZWQ7XG4gIG1heC1oZWlnaHQ6IDEwMCU7XG59XG4ub3V0bGluZS1uYXZpZ2F0b3JfaGlkZGVuIHtcbiAgZGlzcGxheTogbm9uZTtcbn1cbi5vdXRsaW5lLW5hdmlnYXRvcl9mb2xkZWQge1xuICB3aWR0aDogMDtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi8qKlxuICogZm9udC5sZXNzIC0g5a2X5L2T55u45YWz5qC35byPXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBDcmVhdGVkIEJ5OiBZYW9oYWl4aWFvXG4gKiBVcGRhdGU6IDIwMjIuMy4xNlxuICovXG4vKiA9PT09PT0g5a2X5L2TID09PT09PSAqL1xuLyogPT09PT09IOWtl+mHjSA9PT09PT0gKi9cbi8qID09PT09PSDlrZflj7cgPT09PT09ICovXG4ub3V0bGluZS1yZWFkZXJfX3Byb2dyZXNzIHtcbiAgcG9zaXRpb246IGZpeGVkO1xuICB0b3A6IDA7XG4gIGxlZnQ6IDA7XG4gIHotaW5kZXg6IDM7XG4gIGhlaWdodDogNHB4O1xuICB3aWR0aDogMTAwJTtcbiAgYmFja2dyb3VuZC1jb2xvcjogIzUwN2FmZTtcbiAgc2NhbGU6IDAgMTtcbiAgdHJhbnNmb3JtLW9yaWdpbjogbGVmdDtcbiAgYW5pbWF0aW9uOiBvdXRsaW5lLXJlYWRlci1wcm9ncmVzcyBsaW5lYXI7XG4gIGFuaW1hdGlvbi10aW1lbGluZTogLS1Qcm9ncmVzc1RpbWVsaW5lO1xufVxuLm91dGxpbmUtcmVhZGVyX19wYXBlciB7XG4gIGJveC1zaGFkb3c6IDAgMCA2cHggMXB4ICNkZGQ7XG4gIG1hcmdpbjogMmVtIGF1dG87XG4gIG1heC13aWR0aDogMTIwMHB4O1xuICBwYWRkaW5nOiAzLjJlbTtcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi5vdXRsaW5lLXJlYWRlcl9fdGl0bGUge1xuICBtYXJnaW46IDAuNjdlbSAwO1xuICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gIGZvbnQtZmFtaWx5OiAtYXBwbGUtc3lzdGVtLCBCbGlua01hY1N5c3RlbUZvbnQsICdTZWdvZSBVSScsICdQaW5nRmFuZyBTQycsICdIaXJhZ2lubyBTYW5zIEdCJywgJ01pY3Jvc29mdCBZYUhlaScsICdIZWx2ZXRpY2EgTmV1ZScsICdBcHBsZSBDb2xvciBFbW9qaScsICdTZWdvZSBVSSBFbW9qaScsICdTZWdvZSBVSSBTeW1ib2wnLCBIZWx2ZXRpY2EsIEFyaWFsLCBzYW5zLXNlcmlmO1xuICBmb250LXdlaWdodDogbm9ybWFsO1xuICBsaW5lLWhlaWdodDogMS4zZW07XG4gIGZvbnQtc2l6ZTogNC4yZW07XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4ub3V0bGluZS1yZWFkZXJfX2FydGljbGUgLm91dGxpbmUtcmVhZGVyX19wcm9ncmVzcyB7XG4gIGRpc3BsYXk6IG5vbmU7XG59XG4ub3V0bGluZS1yZWFkZXJfaGlkZGVuIHtcbiAgZGlzcGxheTogbm9uZTtcbn1cbi5vdXRsaW5lLXJlYWRlcl9oaWRkZW4ub3V0bGluZS1yZWFkZXJfc2libGluZyB7XG4gIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDtcbn1cbi5vdXRsaW5lLXJlYWRlcl9oaWRkZW4ub3V0bGluZS1yZWFkZXJfc2libGluZy53cmFwcGVyLnBvc3Qge1xuICBkaXNwbGF5OiBub25lO1xufVxuLm91dGxpbmUtcmVhZGVyLS1yZWFkaW5nIHtcbiAgZGlzcGxheTogYmxvY2s7XG4gIHBvc2l0aW9uOiBmaXhlZDtcbiAgei1pbmRleDogMjtcbiAgdG9wOiAwO1xuICBsZWZ0OiAwO1xuICB3aWR0aDogMTAwJTtcbiAgaGVpZ2h0OiAxMDAlO1xuICBtYXJnaW46IDA7XG4gIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gIHBhZGRpbmc6IDNlbSA0ZW07XG4gIGJhY2tncm91bmQtY29sb3I6ICNmYWZhZmE7XG4gIHNjcm9sbC10aW1lbGluZS1uYW1lOiAtLVByb2dyZXNzVGltZWxpbmU7XG4gIG92ZXJmbG93OiBzY3JvbGw7XG59XG5Aa2V5ZnJhbWVzIG91dGxpbmUtcmVhZGVyLXByb2dyZXNzIHtcbiAgdG8ge1xuICAgIHNjYWxlOiAxIDE7XG4gIH1cbn1cbkBtZWRpYSAobWF4LXdpZHRoOiA1MDBweCkge1xuICAub3V0bGluZS1yZWFkZXIge1xuICAgIG92ZXJmbG93OiBoaWRkZW47XG4gIH1cbiAgLm91dGxpbmUtcmVhZGVyIC5vdXRsaW5lLXRvb2xiYXIge1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgZmxleC1kaXJlY3Rpb246IHJvdztcbiAgICBmbGV4LXdyYXA6IG5vd3JhcDtcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgIGFsaWduLXNlbGY6IGF1dG87XG4gICAgdG9wOiAxMDAlO1xuICAgIHJpZ2h0OiAwO1xuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtNDhweCk7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgaGVpZ2h0OiA0OHB4O1xuICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgYm9yZGVyLXRvcDogMXB4IHNvbGlkICNkZGQ7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjtcbiAgICBwYWRkaW5nOiAwIDE2cHg7XG4gIH1cbiAgLm91dGxpbmUtcmVhZGVyIC5vdXRsaW5lLXRvb2xiYXJfX2J1dHRvbiB7XG4gICAgYm9yZGVyLXJhZGl1czogMDtcbiAgICBmbGV4OiAxO1xuICAgIGJvcmRlcjogbm9uZTtcbiAgICBib3gtc2hhZG93OiBub25lO1xuICB9XG4gIC5vdXRsaW5lLXJlYWRlci0tcmVhZGluZyB7XG4gICAgcGFkZGluZzogMDtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmO1xuICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gIH1cbiAgLm91dGxpbmUtcmVhZGVyX19wYXBlciB7XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgIHotaW5kZXg6IDE7XG4gICAgbWFyZ2luOiAwO1xuICAgIHBhZGRpbmc6IDA7XG4gICAgaGVpZ2h0OiAxMDAlO1xuICAgIGJveC1zaGFkb3c6IG5vbmU7XG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgfVxuICAub3V0bGluZS1yZWFkZXJfX3RpdGxlIHtcbiAgICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzO1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICB6LWluZGV4OiAzO1xuICAgIHRvcDogMDtcbiAgICBsZWZ0OiAwO1xuICAgIG1hcmdpbjogMDtcbiAgICB3aWR0aDogMTAwJTtcbiAgICBoZWlnaHQ6IDQ4cHg7XG4gICAgbGluZS1oZWlnaHQ6IDQ4cHg7XG4gICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNkZGQ7XG4gICAgZm9udC1zaXplOiAxLjhlbTtcbiAgICBmb250LXdlaWdodDogNDAwO1xuICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmY7XG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgfVxuICAub3V0bGluZS1yZWFkZXJfX2FydGljbGUge1xuICAgIG1hcmdpbjogNDhweCAwO1xuICAgIGhlaWdodDogY2FsYygxMDAlIC0gOTZweCk7XG4gICAgcGFkZGluZzogMCAxLjI1ZW07XG4gICAgc2Nyb2xsLXRpbWVsaW5lLW5hbWU6IC0tTW9iaWxlUHJvZ3Jlc3NUaW1lbGluZTtcbiAgICBvdmVyZmxvdy14OiBoaWRkZW47XG4gICAgb3ZlcmZsb3cteTogc2Nyb2xsO1xuICB9XG4gIC5vdXRsaW5lLXJlYWRlcl9fYXJ0aWNsZSAub3V0bGluZS1yZWFkZXJfX3Byb2dyZXNzIHtcbiAgICB6LWluZGV4OiA0O1xuICAgIGFuaW1hdGlvbjogb3V0bGluZS1yZWFkZXItcHJvZ3Jlc3MgbGluZWFyO1xuICAgIGFuaW1hdGlvbi10aW1lbGluZTogLS1Nb2JpbGVQcm9ncmVzc1RpbWVsaW5lO1xuICAgIGRpc3BsYXk6IGJsb2NrO1xuICB9XG59XG5AbWVkaWEgcHJpbnQge1xuICBodG1sLFxuICBib2R5IHtcbiAgICAvKiDmiZPljbDnmoTln7rnoYDlrZfkvZPlpKflsI8gKi9cbiAgICBmb250LXNpemU6IDEycHQ7XG4gICAgLyog5pi+56S66K6+572u5paH5a2X6aKc6Imy5ZKM6IOM5pmv6aKc6ImyICovXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjtcbiAgICBjb2xvcjogIzMzMztcbiAgICBoZWlnaHQ6IGluaXRpYWwgIWltcG9ydGFudDtcbiAgfVxuICAvKiDorr7nva7pk77mjqXmoLflvI8gKi9cbiAgYTpsaW5rLFxuICBhOnZpc2l0ZWQsXG4gIGE6aG92ZXIge1xuICAgIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lICFpbXBvcnRhbnQ7XG4gICAgY29sb3I6ICM1MDdhZmU7XG4gIH1cbiAgLyog6ZqQ6JeP5aqS5L2T5qCH562+ICovXG4gIHZpZGVvLFxuICBhdWRpbyB7XG4gICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50O1xuICB9XG4gIC8qIOehruS/neihqOagvOWcqOaJk+WNsOaXtueahOi+ueahhuWSjOWvuem9kOaWueW8j+a4heaZsCAqL1xuICB0YWJsZSB7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTtcbiAgfVxuICB0aCxcbiAgdGQge1xuICAgIGJvcmRlcjogMXB4IHNvbGlkICNkY2RmZTY7XG4gICAgcGFkZGluZzogOHB4IDIwcHg7XG4gIH1cbiAgLm91dGxpbmUtbWVzc2FnZSxcbiAgLm91dGxpbmUtdG9vbGJhciB7XG4gICAgLyog6ZqQ6JeP5LqG5bel5YW35qCP5ZKM5L+h5oGv5o+Q56S65qGGICovXG4gICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50O1xuICB9XG4gIC5vdXRsaW5lLXJlYWRlciB7XG4gICAgZGlzcGxheTogYmxvY2sgIWltcG9ydGFudDtcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgIC8qIOWPlua2iOS6hue7neWvueWumuS9jSAqL1xuICAgIC8qIOmakOiXj+mYheivu+i/m+W6puadoSAqL1xuICAgIC8qIOaJk+WNsOaXtuS4jeaYvuekuuato+aWhyBET00g55qE6Zi05b2x5pWI5p6cICovXG4gICAgLyog5omA5pyJ5paH56ug5YaF5a65IERPTSDnm7jlhbPnmoTpgrvlsYXoioLngrnpg73pmpDol4/kuoYgKi9cbiAgfVxuICAub3V0bGluZS1yZWFkZXJfX3RpdGxlIHtcbiAgICBtYXJnaW46IDEzLjRwdCAwIDI4cHQgIWltcG9ydGFudDtcbiAgICB0ZXh0LWFsaWduOiBjZW50ZXIgIWltcG9ydGFudDtcbiAgICBmb250LXNpemU6IDMycHQgIWltcG9ydGFudDtcbiAgfVxuICAub3V0bGluZS1yZWFkZXItLXJlYWRpbmcge1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZSAhaW1wb3J0YW50O1xuICAgIGhlaWdodDogYXV0byAhaW1wb3J0YW50O1xuICAgIHBhZGRpbmc6IDAgIWltcG9ydGFudDtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmO1xuICAgIG92ZXJmbG93OiBoaWRkZW4gIWltcG9ydGFudDtcbiAgfVxuICAub3V0bGluZS1yZWFkZXJfX3Byb2dyZXNzIHtcbiAgICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7XG4gIH1cbiAgLm91dGxpbmUtcmVhZGVyX19wYXBlciB7XG4gICAgYm94LXNoYWRvdzogbm9uZTtcbiAgfVxuICAub3V0bGluZS1yZWFkZXIgcHJlIHtcbiAgICBwYWRkaW5nOiAxZW0gIWltcG9ydGFudDtcbiAgICBib3JkZXI6IDFweCBzb2xpZCAjZGRkICFpbXBvcnRhbnQ7XG4gICAgYm9yZGVyLXJhZGl1czogNHB4ICFpbXBvcnRhbnQ7XG4gIH1cbiAgLm91dGxpbmUtcmVhZGVyIHByZSxcbiAgLm91dGxpbmUtcmVhZGVyIGNvZGUge1xuICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmYgIWltcG9ydGFudDtcbiAgfVxuICAub3V0bGluZS1yZWFkZXIgdGFibGUsXG4gIC5vdXRsaW5lLXJlYWRlciBpbWcsXG4gIC5vdXRsaW5lLXJlYWRlciBzdmcge1xuICAgIGJyZWFrLWluc2lkZTogYXZvaWQ7XG4gIH1cbiAgLm91dGxpbmUtcmVhZGVyX3NpYmxpbmcge1xuICAgIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDtcbiAgfVxufVxuLm91dGxpbmUtdG9vbGJhciB7XG4gIHBvc2l0aW9uOiBmaXhlZDtcbiAgei1pbmRleDogOTk5OTk7XG4gIG1hcmdpbjogMDtcbiAgdHJhbnNpdGlvbi1kdXJhdGlvbjogMC4zcztcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi5vdXRsaW5lLXRvb2xiYXJfX2J1dHRvbiB7XG4gIGJveC1zaGFkb3c6IDAgMCA2cHggMXB4ICNkY2RmZTY7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgei1pbmRleDogMTtcbiAgbWFyZ2luOiAxMHB4O1xuICB3aWR0aDogMzZweDtcbiAgaGVpZ2h0OiAzNnB4O1xuICBib3JkZXI6IDFweCBzb2xpZCAjZGNkZmU2O1xuICBib3JkZXItcmFkaXVzOiAzcHg7XG4gIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gIGJhY2tncm91bmQtY29sb3I6ICNmZmY7XG4gIGN1cnNvcjogcG9pbnRlcjtcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xuICBjb2xvcjogIzk5OTtcbiAgdHJhbnNpdGlvbjogYWxsIDAuM3MgMC4xcyBlYXNlLWluLW91dDtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi5vdXRsaW5lLXRvb2xiYXJfX2J1dHRvbjpob3ZlciB7XG4gIGNvbG9yOiAjMDU4OTQyO1xuICBib3JkZXItY29sb3I6ICMwNTg5NDI7XG4gIHRyYW5zZm9ybTogc2NhbGUoMS4zNSk7XG59XG4ub3V0bGluZS10b29sYmFyX19idXR0b24uaGlkZSB7XG4gIGRpc3BsYXk6IG5vbmU7XG59XG4ub3V0bGluZS10b29sYmFyX19hbmNob3I6bGluayxcbi5vdXRsaW5lLXRvb2xiYXJfX2FuY2hvcjp2aXNpdGVkLFxuLm91dGxpbmUtdG9vbGJhcl9fYW5jaG9yOmhvdmVyIHtcbiAgY29sb3I6ICM5OTk7XG4gIHRleHQtZGVjb3JhdGlvbjogbm9uZTtcbn1cbi5vdXRsaW5lLXRvb2xiYXJfX2FuY2hvcjpob3ZlciB7XG4gIGNvbG9yOiAjMDU4OTQyO1xufVxuLm91dGxpbmUtdG9vbGJhcl9faWNvbiB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgei1pbmRleDogMjtcbiAgdG9wOiA1MCU7XG4gIGxlZnQ6IDUwJTtcbiAgd2lkdGg6IDIwcHg7XG4gIGhlaWdodDogMjBweDtcbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgLTUwJSk7XG4gIGZpbGw6IGN1cnJlbnRjb2xvcjtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi5vdXRsaW5lLXRvb2xiYXJfYWN0aXZlLm91dGxpbmUtdG9vbGJhcl9fYnV0dG9uIHtcbiAgY29sb3I6ICNmZmY7XG4gIGJhY2tncm91bmQtY29sb3I6ICMwNTg5NDI7XG4gIGJvcmRlci1jb2xvcjogIzA1ODk0Mjtcbn1cbi5vdXRsaW5lLXRvb2xiYXJfYWN0aXZlLm91dGxpbmUtdG9vbGJhcl9fYnV0dG9uOmhvdmVyIHtcbiAgY29sb3I6ICNmZmY7XG59XG4ub3V0bGluZS10b29sYmFyX2FjdGl2ZSAub3V0bGluZS10b29sYmFyX19hbmNob3I6bGluayxcbi5vdXRsaW5lLXRvb2xiYXJfYWN0aXZlIC5vdXRsaW5lLXRvb2xiYXJfX2FuY2hvcjp2aXNpdGVkLFxuLm91dGxpbmUtdG9vbGJhcl9hY3RpdmUgLm91dGxpbmUtdG9vbGJhcl9fYW5jaG9yOmhvdmVyIHtcbiAgY29sb3I6ICNmZmY7XG59XG4ub3V0bGluZS10b29sYmFyX3JvdW5kZWQub3V0bGluZS10b29sYmFyX19idXR0b24ge1xuICBib3JkZXItcmFkaXVzOiAxOHB4O1xufVxuLm91dGxpbmUtdG9vbGJhcl9kaXNhYmxlZC5vdXRsaW5lLXRvb2xiYXJfX2FuY2hvcjpsaW5rLFxuLm91dGxpbmUtdG9vbGJhcl9kaXNhYmxlZCAub3V0bGluZS10b29sYmFyX19hbmNob3I6bGluayxcbi5vdXRsaW5lLXRvb2xiYXJfZGlzYWJsZWQub3V0bGluZS10b29sYmFyX19hbmNob3I6dmlzaXRlZCxcbi5vdXRsaW5lLXRvb2xiYXJfZGlzYWJsZWQgLm91dGxpbmUtdG9vbGJhcl9fYW5jaG9yOnZpc2l0ZWQsXG4ub3V0bGluZS10b29sYmFyX2Rpc2FibGVkLm91dGxpbmUtdG9vbGJhcl9fYW5jaG9yOmhvdmVyLFxuLm91dGxpbmUtdG9vbGJhcl9kaXNhYmxlZCAub3V0bGluZS10b29sYmFyX19hbmNob3I6aG92ZXIsXG4ub3V0bGluZS10b29sYmFyX2Rpc2FibGVkLm91dGxpbmUtdG9vbGJhcl9fYnV0dG9uLFxuLm91dGxpbmUtdG9vbGJhcl9kaXNhYmxlZCAub3V0bGluZS10b29sYmFyX19idXR0b24ge1xuICBjdXJzb3I6IG5vdC1hbGxvd2VkO1xuICBjb2xvcjogIzk5OTtcbiAgYm9yZGVyLWNvbG9yOiAjOTk5O1xufVxuLm91dGxpbmUtdG9vbGJhcl9kaXNhYmxlZC5vdXRsaW5lLXRvb2xiYXJfX2FuY2hvcjpsaW5rOmhvdmVyLFxuLm91dGxpbmUtdG9vbGJhcl9kaXNhYmxlZCAub3V0bGluZS10b29sYmFyX19hbmNob3I6bGluazpob3Zlcixcbi5vdXRsaW5lLXRvb2xiYXJfZGlzYWJsZWQub3V0bGluZS10b29sYmFyX19hbmNob3I6dmlzaXRlZDpob3Zlcixcbi5vdXRsaW5lLXRvb2xiYXJfZGlzYWJsZWQgLm91dGxpbmUtdG9vbGJhcl9fYW5jaG9yOnZpc2l0ZWQ6aG92ZXIsXG4ub3V0bGluZS10b29sYmFyX2Rpc2FibGVkLm91dGxpbmUtdG9vbGJhcl9fYW5jaG9yOmhvdmVyOmhvdmVyLFxuLm91dGxpbmUtdG9vbGJhcl9kaXNhYmxlZCAub3V0bGluZS10b29sYmFyX19hbmNob3I6aG92ZXI6aG92ZXIsXG4ub3V0bGluZS10b29sYmFyX2Rpc2FibGVkLm91dGxpbmUtdG9vbGJhcl9fYnV0dG9uOmhvdmVyLFxuLm91dGxpbmUtdG9vbGJhcl9kaXNhYmxlZCAub3V0bGluZS10b29sYmFyX19idXR0b246aG92ZXIge1xuICBjb2xvcjogIzk5OTtcbiAgYm9yZGVyLWNvbG9yOiAjOTk5O1xufVxuLm91dGxpbmUtdG9vbGJhcl9kaXNhYmxlZC5vdXRsaW5lLXRvb2xiYXJfX2J1dHRvbixcbi5vdXRsaW5lLXRvb2xiYXJfZGlzYWJsZWQgLm91dGxpbmUtdG9vbGJhcl9fYnV0dG9uIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2Y1ZjVmNTtcbn1cbi5vdXRsaW5lLXRvb2xiYXJfdHRiLFxuLm91dGxpbmUtdG9vbGJhcl9idHQge1xuICBsZWZ0OiA1MCU7XG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgtNTAlKTtcbn1cbi5vdXRsaW5lLXRvb2xiYXJfdHRiIC5vdXRsaW5lLXRvb2xiYXJfX2J1dHRvbixcbi5vdXRsaW5lLXRvb2xiYXJfYnR0IC5vdXRsaW5lLXRvb2xiYXJfX2J1dHRvbiB7XG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbn1cbi5vdXRsaW5lLXRvb2xiYXJfdHRiIHtcbiAgdG9wOiAxMnB4O1xufVxuLm91dGxpbmUtdG9vbGJhcl90dGIub3V0bGluZS10b29sYmFyX2hpZGRlbiB7XG4gIHRvcDogLTU2cHg7XG59XG4ub3V0bGluZS10b29sYmFyX2J0dCB7XG4gIGJvdHRvbTogMTJweDtcbn1cbi5vdXRsaW5lLXRvb2xiYXJfYnR0Lm91dGxpbmUtdG9vbGJhcl9oaWRkZW4ge1xuICBib3R0b206IC01NnB4O1xufVxuLm91dGxpbmUtdG9vbGJhcl9ydGwsXG4ub3V0bGluZS10b29sYmFyX2x0ciB7XG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtNTAlKTtcbiAgd2lkdGg6IDU2cHg7XG59XG4ub3V0bGluZS10b29sYmFyX3J0bCB7XG4gIHRvcDogNTAlO1xuICByaWdodDogMTJweDtcbn1cbi5vdXRsaW5lLXRvb2xiYXJfcnRsLm91dGxpbmUtdG9vbGJhcl9oaWRkZW4ge1xuICByaWdodDogLTg2cHg7XG59XG4ub3V0bGluZS10b29sYmFyX2x0ciB7XG4gIHRvcDogNTAlO1xuICBsZWZ0OiAxMnB4O1xufVxuLm91dGxpbmUtdG9vbGJhcl9sdHIub3V0bGluZS10b29sYmFyX2hpZGRlbiB7XG4gIGxlZnQ6IC04NnB4O1xufVxuLm91dGxpbmUtdG9vbGJhcl90dGIgLm91dGxpbmUtdG9vbGJhcl9fYnV0dG9uLm91dGxpbmUtdG9vbGJhcl9oaWRkZW4sXG4ub3V0bGluZS10b29sYmFyX3J0bCAub3V0bGluZS10b29sYmFyX19idXR0b24ub3V0bGluZS10b29sYmFyX2hpZGRlbixcbi5vdXRsaW5lLXRvb2xiYXJfYnR0IC5vdXRsaW5lLXRvb2xiYXJfX2J1dHRvbi5vdXRsaW5lLXRvb2xiYXJfaGlkZGVuLFxuLm91dGxpbmUtdG9vbGJhcl9sdHIgLm91dGxpbmUtdG9vbGJhcl9fYnV0dG9uLm91dGxpbmUtdG9vbGJhcl9oaWRkZW4ge1xuICBkaXNwbGF5OiBub25lO1xufVxuIiwiLyogPT09PT0gU2Nyb2xsYmFyID09PT09ICovXHJcbjo6LXdlYmtpdC1zY3JvbGxiYXIge1xyXG4gIHdpZHRoOiA3cHg7XHJcbiAgaGVpZ2h0OiA3cHg7XHJcbiAgLXdlYmtpdC1ib3JkZXItcmFkaXVzOiA1cHg7XHJcbn1cclxuXHJcbjo6LXdlYmtpdC1zY3JvbGxiYXItdHJhY2stcGllY2Uge1xyXG4gIC13ZWJraXQtYm9yZGVyLXJhZGl1czogNXB4O1xyXG59XHJcblxyXG46Oi13ZWJraXQtc2Nyb2xsYmFyLXRodW1iOnZlcnRpY2FsIHtcclxuICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuMjUpO1xyXG4gIC13ZWJraXQtYm9yZGVyLXJhZGl1czogNXB4O1xyXG59XHJcblxyXG46Oi13ZWJraXQtc2Nyb2xsYmFyLXRodW1iOmhvcml6b250YWwge1xyXG4gIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMCwgMCwgMCwgMC4yNSk7XHJcbiAgLXdlYmtpdC1ib3JkZXItcmFkaXVzOiA1cHg7XHJcbn1cclxuXHJcbjo6LXdlYmtpdC1zY3JvbGxiYXI6aG92ZXIge1xyXG4gIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMCwgMCwgMCwgMC4xNSk7XHJcbn1cclxuXHJcbjo6LXdlYmtpdC1zY3JvbGxiYXItdGh1bWI6aG92ZXIge1xyXG4gIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMCwgMCwgMCwgMC4zNSk7XHJcbn1cclxuIiwiQGltcG9ydCAnLi9jb2xvcnMnO1xyXG5cclxuLnNlY3Rpb24ge1xyXG4gIG1hcmdpbjogMWVtIDA7XHJcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcclxuXHJcbiAgJl9faGVhZGVyLFxyXG4gICZfX2NvbnRlbnQsXHJcbiAgJl9fZm9vdGVyIHtcclxuICAgIG1hcmdpbjogMDtcclxuICAgIHBhZGRpbmc6IDAgM2VtO1xyXG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcclxuICB9XHJcblxyXG4gICZfX3RpdGxlIHtcclxuICAgIGNvbG9yOiBAdGhpcmRfdGV4dF9jb2xvcjtcclxuICB9XHJcblxyXG4gICZfX2gzIHtcclxuICAgIGNvbG9yOiBAcHJpbWFyeV9jb2xvcjtcclxuICAgIGZvbnQtc2l6ZTogMS4zNWVtO1xyXG4gIH1cclxuXHJcbiAgJl9faDQge1xyXG4gICAgZm9udC1zaXplOiAxLjFlbTtcclxuICAgIGNvbG9yOiBAdGhpcmRfdGV4dF9jb2xvcjtcclxuICB9XHJcblxyXG4gICZfX2g1IHtcclxuICAgIGZvbnQtc2l6ZTogMWVtO1xyXG4gICAgY29sb3I6IEBmb3VydGhfdGV4dF9jb2xvcjtcclxuICB9XHJcblxyXG4gICZfX2RsLFxyXG4gICZfX2R0LFxyXG4gICZfX2RkIHtcclxuICAgIG1hcmdpbjogMDtcclxuICAgIHBhZGRpbmc6IDA7XHJcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xyXG4gIH1cclxuXHJcbiAgJl9fZGwge1xyXG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xyXG4gICAgei1pbmRleDogMTtcclxuICB9XHJcblxyXG4gICZfX2R0IHtcclxuICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcclxuICB9XHJcblxyXG4gICZfX2RkIHtcclxuICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcclxuICAgIGNvbG9yOiBAc3VjY2Vzc19jb2xvcjtcclxuICB9XHJcblxyXG4gICZfX3ByZSB7XHJcbiAgICBtYXJnaW46IDJlbSAwO1xyXG4gICAgcGFkZGluZzogMWVtO1xyXG4gICAgZm9udC1zaXplOiAxNHB4O1xyXG4gICAgbGluZS1oZWlnaHQ6IDE1MCU7XHJcbiAgICB0ZXh0LWFsaWduOiBsZWZ0O1xyXG4gICAgYmFja2dyb3VuZC1jb2xvcjogQGJnX2NvbG9yO1xyXG4gICAgYm9yZGVyOiAxcHggc29saWQgQGJvcmRlcl9jb2xvcjtcclxuICAgIGJvcmRlci1yYWRpdXM6IDRweDtcclxuICAgIGNvbG9yOiBAdGhpcmRfdGV4dF9jb2xvcjtcclxuICAgIG92ZXJmbG93OiBhdXRvO1xyXG4gIH1cclxuXHJcbiAgJl9fY29kZSB7XHJcbiAgICBkaXNwbGF5OiBibG9jaztcclxuICAgIG1hcmdpbjogMCBhdXRvO1xyXG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcclxuICB9XHJcblxyXG4gICZfX2Zvb3RlciB7XHJcbiAgICBib3JkZXItdG9wOiAxcHggc29saWQgQGJvcmRlcl9jb2xvcjtcclxuICAgIG1hcmdpbi10b3A6IDNlbTtcclxuICAgIGJhY2tncm91bmQtY29sb3I6IEBiZ19jb2xvcjtcclxuICAgIGNvbG9yOiBAZm91cnRoX3RleHRfY29sb3I7XHJcbiAgfVxyXG5cclxuICAmX190YWJsZSB7XHJcbiAgICBtYXJnaW46IDFlbSBhdXRvO1xyXG4gICAgd2lkdGg6IDEwMCU7XHJcbiAgICBib3JkZXItdG9wOiAxcHggc29saWQgQGJvcmRlcl9jb2xvcjtcclxuICB9XHJcblxyXG4gICZfX3RoLFxyXG4gICZfX3RkIHtcclxuICAgIHBhZGRpbmc6IDVweCAxNnB4O1xyXG4gICAgbGluZS1oZWlnaHQ6IDI2cHg7XHJcbiAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgQGJvcmRlcl9jb2xvcjtcclxuICB9XHJcblxyXG4gICZfX3RoIHtcclxuICAgIHRleHQtYWxpZ246IGNlbnRlcjtcclxuICAgIGJhY2tncm91bmQtY29sb3I6IEBiZ19jb2xvcjtcclxuICB9XHJcbn1cclxuXHJcbkBtZWRpYSAobWF4LXdpZHRoOiA1MDBweCkge1xyXG4gIC5zZWN0aW9uIHtcclxuICAgICZfX2hlYWRlcixcclxuICAgICZfX2NvbnRlbnQge1xyXG4gICAgICBwYWRkaW5nOiAwIDFlbTtcclxuICAgIH1cclxuICB9XHJcbn1cclxuIiwiQGltcG9ydCAnLi9jb2xvcnMnO1xyXG5cclxuLmNhc2Uge1xyXG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcclxuICB6LWluZGV4OiAxO1xyXG4gIGRpc3BsYXk6IGdyaWQ7XHJcbiAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiByZXBlYXQoMiwgMWZyKTtcclxuICBnYXA6IDQwcHg7XHJcbiAgcGFkZGluZzogMWVtO1xyXG4gIGJvcmRlci10b3A6IDFweCBzb2xpZCBAYm9yZGVyX2NvbG9yO1xyXG4gIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCBAYm9yZGVyX2NvbG9yO1xyXG4gIG92ZXJmbG93OiBoaWRkZW47XHJcblxyXG4gICY6YWZ0ZXIge1xyXG4gICAgY29udGVudDogJyc7XHJcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XHJcbiAgICB6LWluZGV4OiAyO1xyXG4gICAgdG9wOiAwO1xyXG4gICAgbGVmdDogNTAlO1xyXG4gICAgaGVpZ2h0OiAxMDAlO1xyXG4gICAgd2lkdGg6IDA7XHJcbiAgICBib3JkZXItbGVmdDogMXB4IHNvbGlkIEBib3JkZXJfY29sb3I7XHJcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xyXG4gIH1cclxuXHJcbiAgJl9fcHJlLFxyXG4gICZfX3RleHRhcmVhIHtcclxuICAgIGZvbnQtc2l6ZTogMTNweDtcclxuICAgIGxpbmUtaGVpZ2h0OiAxNTAlO1xyXG4gIH1cclxuXHJcbiAgJl9fcHJlLFxyXG4gICZfX2NvZGUsXHJcbiAgJl9fdGV4dGFyZWEge1xyXG4gICAgZm9udC1mYW1pbHk6ICdDb3VyaWVyIE5ldycsIENvbnNvbGFzLCBHZW9yZ2lhLCBBcmlhbCwgc2Fucy1zZXJpZjtcclxuICB9XHJcblxyXG4gICZfX3ByZSB7XHJcbiAgICBtYXJnaW46IDA7XHJcbiAgICBwYWRkaW5nOiAxZW07XHJcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAYmdfY29sb3I7XHJcbiAgICBoZWlnaHQ6IDEwMCU7XHJcbiAgICBib3JkZXItcmFkaXVzOiA0cHg7XHJcbiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xyXG4gICAgb3ZlcmZsb3c6IGF1dG87XHJcbiAgfVxyXG5cclxuICAmX190b29sYmFyIHtcclxuICAgIG1hcmdpbjogMCBhdXRvO1xyXG4gICAgaGVpZ2h0OiAzNnB4O1xyXG4gICAgbGluZS1oZWlnaHQ6IDM2cHg7XHJcbiAgICBmb250LXNpemU6IDE0cHg7XHJcbiAgICBwYWRkaW5nOiAwIDE2cHg7XHJcbiAgICB0ZXh0LWFsaWduOiByaWdodDtcclxuICAgIG92ZXJmbG93OiBoaWRkZW47XHJcbiAgfVxyXG5cclxuICAmX19hY3Rpb24sXHJcbiAgJl9fcmVtb3ZlIHtcclxuICAgIGN1cnNvcjogcG9pbnRlcjtcclxuICAgIGNvbG9yOiBAc3VjY2Vzc19jb2xvcjtcclxuICAgIHVzZXItc2VsZWN0OiBub25lO1xyXG4gIH1cclxuXHJcbiAgJl9fYWN0aW9uIHtcclxuICAgIGZvbnQtc2l6ZTogMTNweDtcclxuICAgIHBhZGRpbmctbGVmdDogMTBweDtcclxuXHJcbiAgICAmOmZpcnN0LWNoaWxkIHtcclxuICAgICAgcGFkZGluZy1sZWZ0OiAwO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgJl9fcmVtb3ZlIHtcclxuICAgIGZsb2F0OiByaWdodDtcclxuICB9XHJcblxyXG4gICZfX2NvbnNvbGUge1xyXG4gICAgbWFyZ2luOiAwIGF1dG87XHJcbiAgICBoZWlnaHQ6IDE4MHB4O1xyXG4gICAgYm9yZGVyOiAxcHggc29saWQgQGJvcmRlcl9jb2xvcjtcclxuICAgIG92ZXJmbG93OiBoaWRkZW47XHJcbiAgfVxyXG5cclxuICAmX190ZXh0YXJlYSB7XHJcbiAgICBtYXJnaW46IDAgYXV0bztcclxuICAgIHdpZHRoOiAxMDAlO1xyXG4gICAgaGVpZ2h0OiAxMDAlO1xyXG4gICAgYm9yZGVyOiBub25lO1xyXG4gICAgb3V0bGluZTogbm9uZTtcclxuICAgIHBhZGRpbmc6IDFlbTtcclxuICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XHJcbiAgICBvdmVyZmxvdzogYXV0bztcclxuICB9XHJcblxyXG4gICZfX2xpc3QsXHJcbiAgJl9faXRlbSB7XHJcbiAgICBtYXJnaW46IDA7XHJcbiAgICBwYWRkaW5nOiAwO1xyXG4gICAgbGlzdC1zdHlsZS10eXBlOiBub25lO1xyXG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcclxuICB9XHJcblxyXG4gICZfX2xpc3Qge1xyXG4gICAgaGVpZ2h0OiAzNjBweDtcclxuICAgIGJvcmRlci10b3A6IDFweCBzb2xpZCBAYm9yZGVyX2NvbG9yO1xyXG4gICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIEBib3JkZXJfY29sb3I7XHJcbiAgICBmb250LXNpemU6IDEzcHg7XHJcbiAgICBvdmVyZmxvdzogYXV0bztcclxuICB9XHJcblxyXG4gICZfX2l0ZW0ge1xyXG4gICAgaGVpZ2h0OiAzNnB4O1xyXG4gICAgbGluZS1oZWlnaHQ6IDM2cHg7XHJcbiAgICBjdXJzb3I6IHBvaW50ZXI7XHJcbiAgICBwYWRkaW5nOiAwIDE2cHg7XHJcblxyXG4gICAgJjpob3ZlciB7XHJcbiAgICAgIGJhY2tncm91bmQtY29sb3I6IEBob3Zlcl9iZ19jb2xvcjtcclxuICAgIH1cclxuICB9XHJcbn1cclxuIiwiQGltcG9ydCAnLi4vLi4vdGhlbWUvbWl4aW5zJztcclxuXHJcbi5wYXBlciB7XHJcbiAgLnNoYWRvd19saWdodF9yZWd1bGFyKCk7XHJcbiAgbWFyZ2luOiAzZW0gYXV0bztcclxuICBtYXgtd2lkdGg6IDEyMDBweDtcclxuICBwYWRkaW5nOiAyZW07XHJcbiAgYmFja2dyb3VuZC1jb2xvcjogQHdoaXRlO1xyXG4gIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XHJcblxyXG4gICYuZmxleCB7XHJcbiAgICBkaXNwbGF5OiBmbGV4O1xyXG4gICAgZmxleC1kaXJlY3Rpb246IHJvdztcclxuICAgIGZsZXgtd3JhcDogbm93cmFwO1xyXG4gICAgbWFyZ2luOiAwO1xyXG4gICAgd2lkdGg6IDEwMCU7XHJcbiAgICBtYXgtd2lkdGg6IDEwMCU7XHJcbiAgICBoZWlnaHQ6IDEwMCU7XHJcbiAgICBwYWRkaW5nOiAwO1xyXG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcclxuXHJcbiAgICAuYXJ0aWNsZSB7XHJcbiAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XHJcbiAgICAgIHdpZHRoOiAxMDAlO1xyXG4gICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xyXG5cclxuICAgICAgJl9fbWFpbiB7XHJcbiAgICAgICAgaGVpZ2h0OiAxMDAlO1xyXG4gICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XHJcbiAgICAgICAgb3ZlcmZsb3c6IGF1dG87XHJcbiAgICAgIH1cclxuXHJcbiAgICAgICZfX2FzaWRlIHtcclxuICAgICAgICBib3JkZXItcmlnaHQ6IDFweCBzb2xpZCBAcHJpbWFyeV9ib3JkZXJfY29sb3I7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcbn1cclxuXHJcbi5oZWFkZXIge1xyXG4gIHBvc2l0aW9uOiBzdGlja3k7XHJcbiAgei1pbmRleDogMztcclxuICB0b3A6IDA7XHJcbiAgbWFyZ2luOiAwIGF1dG87XHJcbiAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIEBib3JkZXJfY29sb3I7XHJcbiAgYmFja2dyb3VuZC1jb2xvcjogQHdoaXRlO1xyXG4gIHRleHQtYWxpZ246IGNlbnRlcjtcclxuICB0cmFuc2l0aW9uLWR1cmF0aW9uOiAwLjNzO1xyXG4gIG92ZXJmbG93OiBoaWRkZW47XHJcblxyXG4gICZfc3RpY2t5IHtcclxuICAgIHBhZGRpbmctbGVmdDogMjYwcHg7XHJcbiAgfVxyXG59XHJcblxyXG4uYXJ0aWNsZSB7XHJcbiAgZGlzcGxheTogZmxleDtcclxuICBmbGV4LWRpcmVjdGlvbjogcm93O1xyXG4gIGZsZXgtd3JhcDogbm93cmFwO1xyXG4gIHBhZGRpbmc6IDJlbSAwO1xyXG4gIGZvbnQtc2l6ZTogMTZweDtcclxuICBsaW5lLWhlaWdodDogMTUwJTtcclxuXHJcbiAgJl9fbWFpbiB7XHJcbiAgICBmbGV4OiAxO1xyXG4gICAgcGFkZGluZzogMCAyZW07XHJcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xyXG5cclxuICAgIC5zZWN0aW9uIHtcclxuICAgICAgb3ZlcmZsb3c6IHZpc2libGU7XHJcblxyXG4gICAgICAmX19jb250ZW50LFxyXG4gICAgICAmX19mb290ZXIsXHJcbiAgICAgICZfX2hlYWRlciB7XHJcbiAgICAgICAgb3ZlcmZsb3c6IHZpc2libGU7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgICZfX2hlYWRlcixcclxuICAgICAgJl9fY29udGVudCB7XHJcbiAgICAgICAgbWFyZ2luOiAwO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAmX19hc2lkZSB7XHJcbiAgICBmbGV4LXNocmluazogMDtcclxuICAgIHdpZHRoOiAyNDBweDtcclxuICAgIGJvcmRlci1sZWZ0OiAxcHggc29saWQgQGJvcmRlcl9jb2xvcjtcclxuXHJcbiAgICAmLmx0ciB7XHJcbiAgICAgIGJvcmRlci1yaWdodDogMXB4IHNvbGlkIEBib3JkZXJfY29sb3I7XHJcbiAgICAgIGJvcmRlci1sZWZ0OiBub25lO1xyXG4gICAgfVxyXG5cclxuICAgIC5vdXRsaW5lLW5hdmlnYXRvciB7XHJcbiAgICAgIGJhY2tncm91bmQtY29sb3I6IEB3aGl0ZTtcclxuICAgIH1cclxuICB9XHJcbn1cclxuXHJcbnByZSxcclxuLnNlY3Rpb25fX3ByZSB7XHJcbiAgcGFkZGluZzogMmVtO1xyXG4gIGZvbnQtZmFtaWx5OiAnQ291cmllciBOZXcnLCBBcmlhbCwgc2Fucy1zZXJpZjtcclxuICBiYWNrZ3JvdW5kLWNvbG9yOiBAYmdfY29sb3I7XHJcbiAgb3ZlcmZsb3c6IGF1dG87XHJcbn1cclxuXHJcbmNvZGUsXHJcbi5zZWN0aW9uX19jb2RlIHtcclxuICBmb250LWZhbWlseTogJ0NvdXJpZXIgTmV3JywgQXJpYWwsIHNhbnMtc2VyaWY7XHJcbiAgZm9udC1zaXplOiAxNnB4O1xyXG59XHJcblxyXG4uZm9vdGVyIHtcclxuICBib3JkZXItdG9wOiAxcHggc29saWQgQHByaW1hcnlfYm9yZGVyX2NvbG9yO1xyXG4gIHBhZGRpbmc6IDNlbSAwO1xyXG4gIHRleHQtYWxpZ246IGNlbnRlcjtcclxuXHJcbiAgYSB7XHJcbiAgICAmOmxpbmssXHJcbiAgICAmOnZpc2l0ZWQsXHJcbiAgICAmOmhvdmVyIHtcclxuICAgICAgdGV4dC1kZWNvcmF0aW9uOiBub25lO1xyXG4gICAgICBjb2xvcjogQHN1Y2Nlc3NfY29sb3I7XHJcbiAgICB9XHJcblxyXG4gICAgJjpob3ZlciB7XHJcbiAgICAgIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG5cclxuLnV0aWxzLWJvcmRlci1yaWdodCB7XHJcbiAgYm9yZGVyLXJpZ2h0OiAxcHggc29saWQgQHByaW1hcnlfYm9yZGVyX2NvbG9yO1xyXG59XHJcblxyXG4uaGlkZGVuIHtcclxuICBkaXNwbGF5OiBub25lO1xyXG59XHJcblxyXG5AbWVkaWEgKG1heC13aWR0aDogNTAwcHgpIHtcclxuICBodG1sLFxyXG4gIGJvZHkge1xyXG4gICAgbWFyZ2luOiAwO1xyXG4gIH1cclxuXHJcbiAgLnBhcGVyIHtcclxuICAgIG1hcmdpbjogMDtcclxuICAgIHBhZGRpbmc6IDA7XHJcbiAgfVxyXG5cclxuICAuYXJ0aWNsZV9fbWFpbiB7XHJcbiAgICBwYWRkaW5nOiAwIDJlbTtcclxuICB9XHJcbn1cclxuIiwiLyoqXHJcbiAqIHNoYWRvdy5sZXNzIC0g6Zi05b2x5qC35byP6K6+572uIG1peGlueCDlh73mlbBcclxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxyXG4gKiBDcmVhdGVkIEJ5OiBZYW9oYWl4aWFvXHJcbiAqIFVwZGF0ZTogMjAyMi4zLjIwXHJcbiAqL1xyXG5AaW1wb3J0ICcuL2NvbG9ycyc7XHJcblxyXG4vKiA9PT09PT0g6Zi05b2x5qC35byP6K6+572u5Ye95pWwID09PT09PSAqL1xyXG4uc2hhZG93KEBvZmZzZXQ6IDAgMCA2cHggMXB4LCBAY29sb3I6IEBwcmltYXJ5X2JvcmRlcl9jb2xvcikge1xyXG4gIGJveC1zaGFkb3c6IEBvZmZzZXQgQGNvbG9yO1xyXG59XHJcblxyXG4uc2hhZG93X3JlZ3VsYXIoQGNvbG9yOiBAcHJpbWFyeV9ib3JkZXJfY29sb3IpIHtcclxuICAuc2hhZG93KDAgMCA2cHggMXB4LCBAY29sb3IpO1xyXG59XHJcblxyXG4uc2hhZG93X2xhcmdlKEBjb2xvcjogQHByaW1hcnlfYm9yZGVyX2NvbG9yKSB7XHJcbiAgLnNoYWRvdygwIDAgMTJweCAxcHgsIEBjb2xvcik7XHJcbn1cclxuXHJcbi5zaGFkb3dfbGlnaHRfcmVndWxhcigpIHtcclxuICAuc2hhZG93X3JlZ3VsYXIoKTtcclxufVxyXG5cclxuLnNoYWRvd19saWdodF9sYXJnZSgpIHtcclxuICAuc2hhZG93X2xhcmdlKCk7XHJcbn1cclxuXHJcbi5zaGFkb3dfZGFya19yZWd1bGFyKCkge1xyXG4gIC5zaGFkb3dfcmVndWxhcihAc2Vjb25kYXJ5X2JvcmRlcl9jb2xvcik7XHJcbn1cclxuXHJcbi5zaGFkb3dfZGFya19sYXJnZSgpIHtcclxuICAuc2hhZG93X2xhcmdlKEBzZWNvbmRhcnlfYm9yZGVyX2NvbG9yKTtcclxufVxyXG4iLCI6cm9vdCB7XHJcbiAgLS1vdXRsaW5lLXpJbmRleDogMjAwMDtcclxuICAtLW91dGxpbmUtc3RpY2t5LWhlaWdodDogMTAwJTtcclxuICAtLW91dGxpbmUtbmF2aWdhdG9yLXdpZHRoOiAxMDAlO1xyXG59XHJcbiIsIi8qID09PT09PT09PT0gaWNvbi50aGVtZSAtIHN2ZyDlm77moIfnmoTmoLflvI8gPT09PT09PT09PSAqL1xyXG4ub3V0bGluZS1pY29uIHtcclxuICBwb3NpdGlvbjogcmVsYXRpdmU7XHJcbiAgei1pbmRleDogMTtcclxuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XHJcbiAgdmVydGljYWwtYWxpZ246IG1pZGRsZTtcclxuICB3aWR0aDogMWVtO1xyXG4gIGhlaWdodDogMWVtO1xyXG4gIG92ZXJmbG93OiBoaWRkZW47XHJcblxyXG4gICZfX3N2ZyB7XHJcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XHJcbiAgICB6LWluZGV4OiAyO1xyXG4gICAgdG9wOiA1MCU7XHJcbiAgICBsZWZ0OiA1MCU7XHJcbiAgICB3aWR0aDogMWVtO1xyXG4gICAgaGVpZ2h0OiAxZW07XHJcbiAgICBmaWxsOiBjdXJyZW50Y29sb3I7XHJcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCAtNTAlKTtcclxuICAgIG92ZXJmbG93OiBoaWRkZW47XHJcbiAgfVxyXG5cclxuICAmX2hpZGRlbiB7XHJcbiAgICBkaXNwbGF5OiBub25lO1xyXG4gIH1cclxufVxyXG4iLCIvKiA9PT09PSBTY3JvbGxiYXIgPT09PT0gKi9cclxuOjotd2Via2l0LXNjcm9sbGJhciB7XHJcbiAgd2lkdGg6IDdweDtcclxuICBoZWlnaHQ6IDdweDtcclxuICAtd2Via2l0LWJvcmRlci1yYWRpdXM6IDVweDtcclxuXHJcbiAgJi10cmFjay1waWVjZSB7XHJcbiAgICAtd2Via2l0LWJvcmRlci1yYWRpdXM6IDVweDtcclxuICB9XHJcblxyXG4gICYtdGh1bWIge1xyXG4gICAgJjp2ZXJ0aWNhbCB7XHJcbiAgICAgIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMCwgMCwgMCwgMC4yNSk7XHJcbiAgICAgIC13ZWJraXQtYm9yZGVyLXJhZGl1czogNXB4O1xyXG4gICAgfVxyXG5cclxuICAgICY6aG9yaXpvbnRhbCB7XHJcbiAgICAgIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMCwgMCwgMCwgMC4yNSk7XHJcbiAgICAgIC13ZWJraXQtYm9yZGVyLXJhZGl1czogNXB4O1xyXG4gICAgfVxyXG5cclxuICAgICY6aG92ZXIge1xyXG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuMzUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgJjpob3ZlciB7XHJcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuMTUpO1xyXG4gIH1cclxufVxyXG4iLCJAaW1wb3J0ICcuLi90aGVtZS9jb2xvcnMnO1xyXG5cclxuLm91dGxpbmUtaGVhZGluZyB7XHJcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xyXG4gIHotaW5kZXg6IDE7XHJcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcclxuXHJcbiAgJl9fYW5jaG9yIHtcclxuICAgIGRpc3BsYXk6IG5vbmU7XHJcblxyXG4gICAgJjpsaW5rLFxyXG4gICAgJjp2aXNpdGVkLFxyXG4gICAgJjpob3ZlciB7XHJcbiAgICAgIGNvbG9yOiBAZm91cnRoX3RleHRfY29sb3I7XHJcbiAgICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTtcclxuICAgIH1cclxuXHJcbiAgICAmOmhvdmVyIHtcclxuICAgICAgY29sb3I6IEBwcmltYXJ5X2NvbG9yO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgJjpob3ZlciB7XHJcbiAgICAub3V0bGluZS1oZWFkaW5nX19hbmNob3Ige1xyXG4gICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAmX3N0YXJ0IHtcclxuICAgICY6aG92ZXIge1xyXG4gICAgICBvdmVyZmxvdzogdmlzaWJsZTtcclxuICAgIH1cclxuXHJcbiAgICAub3V0bGluZS1oZWFkaW5nX19hbmNob3Ige1xyXG4gICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XHJcbiAgICAgIHotaW5kZXg6IDI7XHJcbiAgICAgIHRvcDogNTAlO1xyXG4gICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTUwJSk7XHJcbiAgICAgIGxlZnQ6IC0xZW07XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbiIsIkBpbXBvcnQgJy4uL3RoZW1lL3ZhcmlhYmxlcyc7XHJcbkBpbXBvcnQgJy4uL3RoZW1lL2NvbG9ycyc7XHJcbkBpbXBvcnQgJy4uL3RoZW1lL3NoYWRvdyc7XHJcblxyXG4ub3V0bGluZS1kcmF3ZXIge1xyXG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcclxuICB6LWluZGV4OiAtMTtcclxuICB0b3A6IDA7XHJcbiAgbGVmdDogMDtcclxuICBtYXJnaW46IDA7XHJcbiAgd2lkdGg6IDEwMCU7XHJcbiAgaGVpZ2h0OiAxMDAlO1xyXG4gIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XHJcbiAgdmlzaWJpbGl0eTogaGlkZGVuO1xyXG4gIG92ZXJmbG93OiBoaWRkZW47XHJcblxyXG4gICZfX21vZGFsIHtcclxuICAgIC5zaGFkb3dfbGlnaHRfcmVndWxhcigpO1xyXG4gICAgZGlzcGxheTogZmxleDtcclxuICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XHJcbiAgICBmbGV4LXdyYXA6IG5vd3JhcDtcclxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcclxuICAgIHotaW5kZXg6IDIxO1xyXG4gICAgaGVpZ2h0OiAxMDAlO1xyXG4gICAgYmFja2dyb3VuZC1jb2xvcjogQHdoaXRlO1xyXG4gICAgdHJhbnNpdGlvbi1kdXJhdGlvbjogMC40cztcclxuICAgIG92ZXJmbG93OiBoaWRkZW47XHJcbiAgfVxyXG5cclxuICAmX19oZWFkZXIsXHJcbiAgJl9fbWFpbixcclxuICAmX19mb290ZXIge1xyXG4gICAgd2lkdGg6IDEwMCU7XHJcbiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xyXG4gIH1cclxuXHJcbiAgJl9faGVhZGVyLFxyXG4gICZfX2Zvb3RlciB7XHJcbiAgICBmbGV4LXNocmluazogMDtcclxuICB9XHJcblxyXG4gICZfX3RpdGxlLFxyXG4gICZfX21haW4sXHJcbiAgJl9fZm9vdGVyIHtcclxuICAgIHBhZGRpbmc6IDAgMTZweDtcclxuICB9XHJcblxyXG4gICZfX2hlYWRlcixcclxuICAmX190aXRsZSB7XHJcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XHJcbiAgICB6LWluZGV4OiAxO1xyXG4gICAgbWFyZ2luOiAwIGF1dG87XHJcbiAgICBoZWlnaHQ6IDUycHg7XHJcbiAgICBsaW5lLWhlaWdodDogNTJweDtcclxuICAgIG92ZXJmbG93OiBoaWRkZW47XHJcbiAgfVxyXG5cclxuICAmX190aXRsZSB7XHJcbiAgICBmb250LXNpemU6IDE2cHg7XHJcbiAgICBmb250LXdlaWdodDogNDAwO1xyXG4gICAgbWFyZ2luOiAwIDE2cHg7XHJcbiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xyXG4gICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIEBwcmltYXJ5X2JvcmRlcl9jb2xvcjtcclxuICB9XHJcblxyXG4gICZfX2Nsb3NlIHtcclxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcclxuICAgIHotaW5kZXg6IDI7XHJcbiAgICB0b3A6IDUwJTtcclxuICAgIHJpZ2h0OiAxMnB4O1xyXG4gICAgd2lkdGg6IDIwcHg7XHJcbiAgICBoZWlnaHQ6IDIwcHg7XHJcbiAgICBsaW5lLWhlaWdodDogMjBweDtcclxuICAgIGNvbG9yOiBAZm91cnRoX3RleHRfY29sb3I7XHJcbiAgICBmb250LXNpemU6IDIwcHg7XHJcbiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XHJcbiAgICBjdXJzb3I6IHBvaW50ZXI7XHJcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTUwJSk7XHJcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xyXG5cclxuICAgIC5vdXRsaW5lLWljb24ge1xyXG4gICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XHJcbiAgICAgIHotaW5kZXg6IDI7XHJcbiAgICAgIHRvcDogMDtcclxuICAgICAgbGVmdDogMDtcclxuICAgIH1cclxuXHJcbiAgICAmOmhvdmVyIHtcclxuICAgICAgY29sb3I6IEB0aGlyZF90ZXh0X2NvbG9yO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgJl9fbWFpbiB7XHJcbiAgICBmbGV4OiAxO1xyXG4gICAgb3ZlcmZsb3c6IGF1dG87XHJcblxyXG4gICAgJi5vdmVyZmxvdy1oaWRkZW4ge1xyXG4gICAgICBvdmVyZmxvdzogaGlkZGVuO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgJl9fZm9vdGVyIHtcclxuICAgIG1hcmdpbjogMCBhdXRvO1xyXG4gICAgdGV4dC1hbGlnbjogcmlnaHQ7XHJcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xyXG4gIH1cclxuXHJcbiAgJl9fb3ZlcmxheSB7XHJcbiAgICBjb250ZW50OiAnJztcclxuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcclxuICAgIHotaW5kZXg6IDE7XHJcbiAgICB0b3A6IDA7XHJcbiAgICBsZWZ0OiAwO1xyXG4gICAgd2lkdGg6IDEwMCU7XHJcbiAgICBoZWlnaHQ6IDEwMCU7XHJcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAd2hpdGU7XHJcbiAgICBvcGFjaXR5OiAwLjE7XHJcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xyXG4gIH1cclxuXHJcbiAgJl9ydGwsXHJcbiAgJl9sdHIge1xyXG4gICAgJi5vdXRsaW5lLWRyYXdlciB7XHJcbiAgICAgICZfdGlueSB7XHJcbiAgICAgICAgd2lkdGg6IDI4MHB4O1xyXG4gICAgICB9XHJcblxyXG4gICAgICAmX21pbmkge1xyXG4gICAgICAgIHdpZHRoOiA0ODBweDtcclxuICAgICAgfVxyXG5cclxuICAgICAgJl9zbWFsbCB7XHJcbiAgICAgICAgd2lkdGg6IDU0MHB4O1xyXG4gICAgICB9XHJcblxyXG4gICAgICAmX3JlZ3VsYXIge1xyXG4gICAgICAgIHdpZHRoOiA2ODBweDtcclxuICAgICAgfVxyXG5cclxuICAgICAgJl9tZWRpdW0ge1xyXG4gICAgICAgIHdpZHRoOiA3MjBweDtcclxuICAgICAgfVxyXG5cclxuICAgICAgJl9sYXJnZSB7XHJcbiAgICAgICAgd2lkdGg6IDk2MHB4O1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAmX3J0bCB7XHJcbiAgICBib3JkZXItbGVmdDogMXB4IHNvbGlkIEBwcmltYXJ5X2JvcmRlcl9jb2xvcjtcclxuXHJcbiAgICAmLm91dGxpbmUtZHJhd2VyIHtcclxuICAgICAgJl90aW55IHtcclxuICAgICAgICAmLm91dGxpbmUtZHJhd2VyX2Nsb3NlZCB7XHJcbiAgICAgICAgICByaWdodDogLTI5MHB4O1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgJl9taW5pIHtcclxuICAgICAgICAmLm91dGxpbmUtZHJhd2VyX2Nsb3NlZCB7XHJcbiAgICAgICAgICByaWdodDogLTQ5MHB4O1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgJl9zbWFsbCB7XHJcbiAgICAgICAgJi5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xyXG4gICAgICAgICAgcmlnaHQ6IC01NTBweDtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgICZfcmVndWxhciB7XHJcbiAgICAgICAgJi5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xyXG4gICAgICAgICAgcmlnaHQ6IC02OTBweDtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgICZfbWVkaXVtIHtcclxuICAgICAgICAmLm91dGxpbmUtZHJhd2VyX2Nsb3NlZCB7XHJcbiAgICAgICAgICByaWdodDogLTczMHB4O1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgJl9sYXJnZSB7XHJcbiAgICAgICAgJi5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xyXG4gICAgICAgICAgcmlnaHQ6IC05NzBweDtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gICZfbHRyIHtcclxuICAgIGJvcmRlci1yaWdodDogMXB4IHNvbGlkIEBwcmltYXJ5X2JvcmRlcl9jb2xvcjtcclxuXHJcbiAgICAmLm91dGxpbmUtZHJhd2VyIHtcclxuICAgICAgJl90aW55IHtcclxuICAgICAgICAmLm91dGxpbmUtZHJhd2VyX2Nsb3NlZCB7XHJcbiAgICAgICAgICBsZWZ0OiAtMjkwcHg7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICAmX21pbmkge1xyXG4gICAgICAgICYub3V0bGluZS1kcmF3ZXJfY2xvc2VkIHtcclxuICAgICAgICAgIGxlZnQ6IC00OTBweDtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgICZfc21hbGwge1xyXG4gICAgICAgICYub3V0bGluZS1kcmF3ZXJfY2xvc2VkIHtcclxuICAgICAgICAgIGxlZnQ6IC01NTBweDtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgICZfcmVndWxhciB7XHJcbiAgICAgICAgJi5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xyXG4gICAgICAgICAgbGVmdDogLTY5MHB4O1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgJl9tZWRpdW0ge1xyXG4gICAgICAgICYub3V0bGluZS1kcmF3ZXJfY2xvc2VkIHtcclxuICAgICAgICAgIGxlZnQ6IC03MzBweDtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgICZfbGFyZ2Uge1xyXG4gICAgICAgICYub3V0bGluZS1kcmF3ZXJfY2xvc2VkIHtcclxuICAgICAgICAgIGxlZnQ6IC05NzBweDtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gICZfdHRiLFxyXG4gICZfYnR0IHtcclxuICAgIGxlZnQ6IDA7XHJcbiAgICB3aWR0aDogMTAwJTtcclxuXHJcbiAgICAmLm91dGxpbmUtZHJhd2VyIHtcclxuICAgICAgJl90aW55IHtcclxuICAgICAgICBoZWlnaHQ6IDI0MHB4O1xyXG4gICAgICB9XHJcblxyXG4gICAgICAmX21pbmkge1xyXG4gICAgICAgIGhlaWdodDogMzIwcHg7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgICZfc21hbGwge1xyXG4gICAgICAgIGhlaWdodDogMzYwcHg7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgICZfcmVndWxhciB7XHJcbiAgICAgICAgaGVpZ2h0OiA0MDBweDtcclxuICAgICAgfVxyXG5cclxuICAgICAgJl9tZWRpdW0ge1xyXG4gICAgICAgIGhlaWdodDogNDQwcHg7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgICZfbGFyZ2Uge1xyXG4gICAgICAgIGhlaWdodDogNDgwcHg7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gICZfdHRiIHtcclxuICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCBAcHJpbWFyeV9ib3JkZXJfY29sb3I7XHJcblxyXG4gICAgJi5vdXRsaW5lLWRyYXdlciB7XHJcbiAgICAgICZfdGlueSB7XHJcbiAgICAgICAgJi5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xyXG4gICAgICAgICAgdG9wOiAtMjUwcHg7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICAmX21pbmkge1xyXG4gICAgICAgICYub3V0bGluZS1kcmF3ZXJfY2xvc2VkIHtcclxuICAgICAgICAgIHRvcDogLTMzMHB4O1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgJl9zbWFsbCB7XHJcbiAgICAgICAgJi5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xyXG4gICAgICAgICAgdG9wOiAtMzcwcHg7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICAmX3JlZ3VsYXIge1xyXG4gICAgICAgICYub3V0bGluZS1kcmF3ZXJfY2xvc2VkIHtcclxuICAgICAgICAgIHRvcDogLTQxMHB4O1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgJl9tZWRpdW0ge1xyXG4gICAgICAgICYub3V0bGluZS1kcmF3ZXJfY2xvc2VkIHtcclxuICAgICAgICAgIHRvcDogLTQ1MHB4O1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgJl9sYXJnZSB7XHJcbiAgICAgICAgJi5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xyXG4gICAgICAgICAgdG9wOiAtNDkwcHg7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAmX2J0dCB7XHJcbiAgICB0b3A6IGluaXRpYWw7XHJcbiAgICBib3JkZXItdG9wOiAxcHggc29saWQgQHByaW1hcnlfYm9yZGVyX2NvbG9yO1xyXG5cclxuICAgICYub3V0bGluZS1kcmF3ZXIge1xyXG4gICAgICAmX3Rpbnkge1xyXG4gICAgICAgICYub3V0bGluZS1kcmF3ZXJfY2xvc2VkIHtcclxuICAgICAgICAgIGJvdHRvbTogLTI1MHB4O1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgJl9taW5pIHtcclxuICAgICAgICAmLm91dGxpbmUtZHJhd2VyX2Nsb3NlZCB7XHJcbiAgICAgICAgICBib3R0b206IC0zMzBweDtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgICZfc21hbGwge1xyXG4gICAgICAgICYub3V0bGluZS1kcmF3ZXJfY2xvc2VkIHtcclxuICAgICAgICAgIGJvdHRvbTogLTM3MHB4O1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgJl9yZWd1bGFyIHtcclxuICAgICAgICAmLm91dGxpbmUtZHJhd2VyX2Nsb3NlZCB7XHJcbiAgICAgICAgICBib3R0b206IC00MTBweDtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgICZfbWVkaXVtIHtcclxuICAgICAgICAmLm91dGxpbmUtZHJhd2VyX2Nsb3NlZCB7XHJcbiAgICAgICAgICBib3R0b206IC00NTBweDtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgICZfbGFyZ2Uge1xyXG4gICAgICAgICYub3V0bGluZS1kcmF3ZXJfY2xvc2VkIHtcclxuICAgICAgICAgIGJvdHRvbTogLTQ5MHB4O1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgJl9vcGVuZWQge1xyXG4gICAgdmlzaWJpbGl0eTogdmlzaWJsZTtcclxuICAgIHotaW5kZXg6IHZhcigtLW91dGxpbmUtekluZGV4KTtcclxuXHJcbiAgICAmLm91dGxpbmUtZHJhd2VyIHtcclxuICAgICAgcG9zaXRpb246IGZpeGVkO1xyXG5cclxuICAgICAgJl9ydGwge1xyXG4gICAgICAgIHJpZ2h0OiAwO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAmX2x0ciB7XHJcbiAgICAgICAgbGVmdDogMDtcclxuICAgICAgfVxyXG5cclxuICAgICAgJl90dGIge1xyXG4gICAgICAgIHRvcDogMDtcclxuICAgICAgfVxyXG5cclxuICAgICAgJl9idHQge1xyXG4gICAgICAgIGJvdHRvbTogMDtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgJl9vZmZzZXQge1xyXG4gICAgJi5vdXRsaW5lLWRyYXdlciB7XHJcbiAgICAgICZfcnRsLFxyXG4gICAgICAmX2x0ciB7XHJcbiAgICAgICAgaGVpZ2h0OiBjYWxjKDEwMCUgLSA0ZW0pO1xyXG4gICAgICAgIHRvcDogNTAlO1xyXG4gICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtNTAlKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgJl90dGIsXHJcbiAgICAgICZfYnR0IHtcclxuICAgICAgICB3aWR0aDogY2FsYygxMDAlIC0gNGVtKTtcclxuICAgICAgICBsZWZ0OiA1MCU7XHJcbiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC01MCUpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAmX29wZW5lZCB7XHJcbiAgICAgICAgJi5vdXRsaW5lLWRyYXdlciB7XHJcbiAgICAgICAgICAmX3J0bCB7XHJcbiAgICAgICAgICAgIHJpZ2h0OiAyZW07XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgJl9sdHIge1xyXG4gICAgICAgICAgICBsZWZ0OiAyZW07XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgJl90dGIge1xyXG4gICAgICAgICAgICB0b3A6IDJlbTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAmX2J0dCB7XHJcbiAgICAgICAgICAgIGJvdHRvbTogMmVtO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgJl9hdXRvIHtcclxuICAgICYub3V0bGluZS1kcmF3ZXIge1xyXG4gICAgICAmX3J0bCxcclxuICAgICAgJl9sdHIge1xyXG4gICAgICAgIGhlaWdodDogYXV0bztcclxuICAgICAgICBtYXgtaGVpZ2h0OiBjYWxjKDEwMCUgLSA0ZW0pO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAmX2Z1bGwge1xyXG4gICAgcGFkZGluZzogMDtcclxuICB9XHJcbn1cclxuIiwiQGltcG9ydCAnLi4vdGhlbWUvdmFyaWFibGVzJztcclxuQGltcG9ydCAnLi4vdGhlbWUvY29sb3JzJztcclxuQGltcG9ydCAnLi4vdGhlbWUvZWxsaXBzaXMnO1xyXG5cclxuLm91dGxpbmUtbmF2aWdhdG9yIHtcclxuICBwb3NpdGlvbjogcmVsYXRpdmU7XHJcbiAgei1pbmRleDogMTtcclxuICBtYXJnaW46IDA7XHJcbiAgd2lkdGg6IHZhcigtLW91dGxpbmUtbmF2aWdhdG9yLXdpZHRoKTtcclxuICBvdmVyZmxvdzogYXV0bztcclxuXHJcbiAgJi1wYXJlbnQge1xyXG4gICAgdHJhbnNpdGlvbjogMC4zcyBlYXNlLWluLW91dDtcclxuICB9XHJcblxyXG4gICZfX3RpdGxlIHtcclxuICAgIG1hcmdpbjogMCAxNnB4O1xyXG4gICAgaGVpZ2h0OiA0MHB4O1xyXG4gICAgbGluZS1oZWlnaHQ6IDQwcHg7XHJcbiAgICBwYWRkaW5nOiAwIDE2cHg7XHJcbiAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgQHByaW1hcnlfYm9yZGVyX2NvbG9yO1xyXG4gICAgZm9udC1zaXplOiAxNnB4O1xyXG4gICAgZm9udC13ZWlnaHQ6IDQwMDtcclxuICAgIG92ZXJmbG93OiBoaWRkZW47XHJcbiAgfVxyXG5cclxuICAmX19tYWluIHtcclxuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcclxuICAgIHotaW5kZXg6IDE7XHJcbiAgICBtYXJnaW46IDA7XHJcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xyXG4gIH1cclxuXHJcbiAgJl9fbGlzdCxcclxuICAmX19zdWJqZWN0LFxyXG4gICZfX2l0ZW0ge1xyXG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xyXG4gICAgei1pbmRleDogMjtcclxuICAgIG1hcmdpbjogMDtcclxuICAgIHBhZGRpbmc6IDA7XHJcbiAgICBsaXN0LXN0eWxlLXR5cGU6IG5vbmU7XHJcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xyXG4gIH1cclxuXHJcbiAgJl9fbGlzdCB7XHJcbiAgICBwYWRkaW5nOiAwLjVlbSAwO1xyXG4gIH1cclxuXHJcbiAgJl9fc3ViamVjdCB7XHJcbiAgICBwYWRkaW5nLWxlZnQ6IDFlbTtcclxuICB9XHJcblxyXG4gICZfX2l0ZW0ge1xyXG4gICAgbWFyZ2luOiAwO1xyXG4gICAgbGluZS1oZWlnaHQ6IDMwcHg7XHJcbiAgICBmb250LXNpemU6IDEzcHg7XHJcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xyXG4gIH1cclxuXHJcbiAgJl9fcGxhY2Vob2xkZXIge1xyXG4gICAgcG9zaXRpb246IGFic29sdXRlO1xyXG4gICAgei1pbmRleDogMTtcclxuICAgIHRvcDogMDtcclxuICAgIGxlZnQ6IDA7XHJcbiAgICB3aWR0aDogMTAwJTtcclxuICAgIGhlaWdodDogMzBweDtcclxuICAgIGJhY2tncm91bmQtY29sb3I6IEBob3Zlcl9iZ19jb2xvcjtcclxuICAgIGJvcmRlci1sZWZ0OiAycHggc29saWQgQHN1Y2Nlc3NfY29sb3I7XHJcbiAgICB0cmFuc2l0aW9uLWR1cmF0aW9uOiAwLjJzO1xyXG4gICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcclxuICAgIG92ZXJmbG93OiBoaWRkZW47XHJcbiAgfVxyXG5cclxuICAmX19hbmNob3Ige1xyXG4gICAgLmVsbGlwc2lzKDEpO1xyXG4gICAgZGlzcGxheTogYmxvY2s7XHJcbiAgICBwYWRkaW5nOiAwIDEuNWVtO1xyXG5cclxuICAgICY6bGluayxcclxuICAgICY6dmlzaXRlZCxcclxuICAgICY6aG92ZXIge1xyXG4gICAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7XHJcbiAgICAgIGNvbG9yOiBAc2Vjb25kYXJ5X3RleHRfY29sb3I7XHJcbiAgICB9XHJcblxyXG4gICAgJjpob3ZlciB7XHJcbiAgICAgIGNvbG9yOiBAc3VjY2Vzc19jb2xvcjtcclxuICAgIH1cclxuICB9XHJcblxyXG4gICZfX2NvZGUge1xyXG4gICAgcGFkZGluZy1yaWdodDogMC41ZW07XHJcbiAgfVxyXG5cclxuICAmX2hpZ2hsaWdodCB7XHJcbiAgICAmLm91dGxpbmUtbmF2aWdhdG9yX19hbmNob3Ige1xyXG4gICAgICAmOmxpbmssXHJcbiAgICAgICY6dmlzaXRlZCxcclxuICAgICAgJjpob3ZlciB7XHJcbiAgICAgICAgY29sb3I6IEBzdWNjZXNzX2NvbG9yO1xyXG4gICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAmX3N0aWNreSxcclxuICAmX2ZpeGVkIHtcclxuICAgIGRpc3BsYXk6IGZsZXg7XHJcbiAgICBmbGV4LXdyYXA6IG5vd3JhcDtcclxuICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XHJcbiAgICB6LWluZGV4OiB2YXIoLS1vdXRsaW5lLXpJbmRleCk7XHJcbiAgICB0b3A6IDA7XHJcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xyXG5cclxuICAgIC5vdXRsaW5lLW5hdmlnYXRvciB7XHJcbiAgICAgICZfX3RpdGxlLFxyXG4gICAgICAmX19tYWluIHtcclxuICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xyXG4gICAgICB9XHJcblxyXG4gICAgICAmX190aXRsZSB7XHJcbiAgICAgICAgZmxleC1zaHJpbms6IDA7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgICZfX21haW4ge1xyXG4gICAgICAgIGZsZXg6IDE7XHJcbiAgICAgICAgb3ZlcmZsb3c6IGF1dG87XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gICZfc3RpY2t5IHtcclxuICAgIHBvc2l0aW9uOiBzdGlja3k7XHJcbiAgICBtYXgtaGVpZ2h0OiB2YXIoLS1vdXRsaW5lLXN0aWNreS1oZWlnaHQpO1xyXG4gIH1cclxuXHJcbiAgJl9maXhlZCB7XHJcbiAgICBwb3NpdGlvbjogZml4ZWQ7XHJcbiAgICBtYXgtaGVpZ2h0OiAxMDAlO1xyXG4gIH1cclxuXHJcbiAgJl9oaWRkZW4ge1xyXG4gICAgZGlzcGxheTogbm9uZTtcclxuICB9XHJcblxyXG4gICZfZm9sZGVkIHtcclxuICAgIHdpZHRoOiAwO1xyXG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcclxuICB9XHJcbn1cclxuIiwiLyoqXHJcbiAqIGVsbGlwc2lzLmxlc3MgLSDmlofmnKznnIHnlaUgbWl4aW54IOWHveaVsFxyXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XHJcbiAqIENyZWF0ZWQgQnk6IFlhb2hhaXhpYW9cclxuICogVXBkYXRlOiAyMDIyLjMuMTFcclxuICovXHJcblxyXG4vKiA9PT09PT0g5paH5pys55yB55Wl5Ye95pWwID09PT09PSAqL1xyXG4uZWxsaXBzaXMgKEBsaW5lcykgd2hlbiAoQGxpbmVzPTEpIHtcclxuICB3aGl0ZS1zcGFjZTogbm93cmFwO1xyXG4gIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzO1xyXG4gIG92ZXJmbG93OiBoaWRkZW47XHJcbn1cclxuXHJcbi5lbGxpcHNpcyAoQGxpbmVzKSB3aGVuIChAbGluZXM+PTIpIHtcclxuICAtd2Via2l0LWxpbmUtY2xhbXA6IEBsaW5lcztcclxuICBkaXNwbGF5OiBib3g7XHJcbiAgLXdlYmtpdC1ib3gtb3JpZW50OiB2ZXJ0aWNhbDtcclxuICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpcztcclxuICBvdmVyZmxvdzogaGlkZGVuO1xyXG59XHJcbiIsIkBpbXBvcnQgJy4uL3RoZW1lL2NvbG9ycyc7XHJcbkBpbXBvcnQgJy4uL3RoZW1lL2ZvbnQnO1xyXG5AaW1wb3J0ICcuLi90aGVtZS9taXhpbnMnO1xyXG5cclxuLm91dGxpbmUtcmVhZGVyIHtcclxuICAmX19wcm9ncmVzcyB7XHJcbiAgICBwb3NpdGlvbjogZml4ZWQ7XHJcbiAgICB0b3A6IDA7XHJcbiAgICBsZWZ0OiAwO1xyXG4gICAgei1pbmRleDogMztcclxuICAgIGhlaWdodDogNHB4O1xyXG4gICAgd2lkdGg6IDEwMCU7XHJcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAcHJpbWFyeV9jb2xvcjtcclxuICAgIHNjYWxlOiAwIDE7XHJcbiAgICB0cmFuc2Zvcm0tb3JpZ2luOiBsZWZ0O1xyXG4gICAgYW5pbWF0aW9uOiBvdXRsaW5lLXJlYWRlci1wcm9ncmVzcyBsaW5lYXI7XHJcbiAgICBhbmltYXRpb24tdGltZWxpbmU6IC0tUHJvZ3Jlc3NUaW1lbGluZTtcclxuICB9XHJcblxyXG4gICZfX3BhcGVyIHtcclxuICAgIC5zaGFkb3dfZGFya19yZWd1bGFyKCk7XHJcbiAgICBtYXJnaW46IDJlbSBhdXRvO1xyXG4gICAgbWF4LXdpZHRoOiAxMjAwcHg7XHJcbiAgICBwYWRkaW5nOiAzLjJlbTtcclxuICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XHJcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAd2hpdGU7XHJcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xyXG4gIH1cclxuXHJcbiAgJl9fdGl0bGUge1xyXG4gICAgbWFyZ2luOiAwLjY3ZW0gMDtcclxuICAgIHRleHQtYWxpZ246IGNlbnRlcjtcclxuICAgIGZvbnQtZmFtaWx5OiBAZm9udF90ZXh0X2ZhbWlseTtcclxuICAgIGZvbnQtd2VpZ2h0OiBub3JtYWw7XHJcbiAgICBsaW5lLWhlaWdodDogMS4zZW07XHJcbiAgICBmb250LXNpemU6IDQuMmVtO1xyXG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcclxuICB9XHJcblxyXG4gICZfX2FydGljbGUge1xyXG4gICAgLm91dGxpbmUtcmVhZGVyX19wcm9ncmVzcyB7XHJcbiAgICAgIGRpc3BsYXk6IG5vbmU7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAmX2hpZGRlbiB7XHJcbiAgICBkaXNwbGF5OiBub25lO1xyXG5cclxuICAgICYub3V0bGluZS1yZWFkZXJfc2libGluZyB7XHJcbiAgICAgIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDtcclxuXHJcbiAgICAgICYud3JhcHBlciB7XHJcbiAgICAgICAgJi5wb3N0IHtcclxuICAgICAgICAgIGRpc3BsYXk6IG5vbmU7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAmLS1yZWFkaW5nIHtcclxuICAgIGRpc3BsYXk6IGJsb2NrO1xyXG4gICAgcG9zaXRpb246IGZpeGVkO1xyXG4gICAgei1pbmRleDogMjtcclxuICAgIHRvcDogMDtcclxuICAgIGxlZnQ6IDA7XHJcbiAgICB3aWR0aDogMTAwJTtcclxuICAgIGhlaWdodDogMTAwJTtcclxuICAgIG1hcmdpbjogMDtcclxuICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XHJcbiAgICBwYWRkaW5nOiAzZW0gNGVtO1xyXG4gICAgYmFja2dyb3VuZC1jb2xvcjogQGJnX2NvbG9yO1xyXG4gICAgc2Nyb2xsLXRpbWVsaW5lLW5hbWU6IC0tUHJvZ3Jlc3NUaW1lbGluZTtcclxuICAgIG92ZXJmbG93OiBzY3JvbGw7XHJcbiAgfVxyXG59XHJcblxyXG5Aa2V5ZnJhbWVzIG91dGxpbmUtcmVhZGVyLXByb2dyZXNzIHtcclxuICB0byB7XHJcbiAgICBzY2FsZTogMSAxO1xyXG4gIH1cclxufVxyXG5cclxuQG1lZGlhIChtYXgtd2lkdGg6IDUwMHB4KSB7XHJcbiAgLm91dGxpbmUge1xyXG4gICAgJi1yZWFkZXIge1xyXG4gICAgICBvdmVyZmxvdzogaGlkZGVuO1xyXG5cclxuICAgICAgLm91dGxpbmUtdG9vbGJhciB7XHJcbiAgICAgICAgZGlzcGxheTogZmxleDtcclxuICAgICAgICBmbGV4LWRpcmVjdGlvbjogcm93O1xyXG4gICAgICAgIGZsZXgtd3JhcDogbm93cmFwO1xyXG4gICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XHJcbiAgICAgICAgYWxpZ24tc2VsZjogYXV0bztcclxuICAgICAgICB0b3A6IDEwMCU7XHJcbiAgICAgICAgcmlnaHQ6IDA7XHJcbiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC00OHB4KTtcclxuICAgICAgICB3aWR0aDogMTAwJTtcclxuICAgICAgICBoZWlnaHQ6IDQ4cHg7XHJcbiAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcclxuICAgICAgICBib3JkZXItdG9wOiAxcHggc29saWQgQGJvcmRlcl9jb2xvcjtcclxuICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAd2hpdGU7XHJcbiAgICAgICAgcGFkZGluZzogMCAxNnB4O1xyXG5cclxuICAgICAgICAmX19idXR0b24ge1xyXG4gICAgICAgICAgLnJhZGl1c19ub25lKCk7XHJcbiAgICAgICAgICBmbGV4OiAxO1xyXG4gICAgICAgICAgYm9yZGVyOiBub25lO1xyXG4gICAgICAgICAgYm94LXNoYWRvdzogbm9uZTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgICYtLXJlYWRpbmcge1xyXG4gICAgICAgIHBhZGRpbmc6IDA7XHJcbiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogQHdoaXRlO1xyXG4gICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgICZfX3BhcGVyIHtcclxuICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7XHJcbiAgICAgICAgei1pbmRleDogMTtcclxuICAgICAgICBtYXJnaW46IDA7XHJcbiAgICAgICAgcGFkZGluZzogMDtcclxuICAgICAgICBoZWlnaHQ6IDEwMCU7XHJcbiAgICAgICAgYm94LXNoYWRvdzogbm9uZTtcclxuICAgICAgICBvdmVyZmxvdzogaGlkZGVuO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAmX190aXRsZSB7XHJcbiAgICAgICAgLmVsbGlwc2lzKDEpO1xyXG4gICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcclxuICAgICAgICB6LWluZGV4OiAzO1xyXG4gICAgICAgIHRvcDogMDtcclxuICAgICAgICBsZWZ0OiAwO1xyXG4gICAgICAgIG1hcmdpbjogMDtcclxuICAgICAgICB3aWR0aDogMTAwJTtcclxuICAgICAgICBoZWlnaHQ6IDQ4cHg7XHJcbiAgICAgICAgbGluZS1oZWlnaHQ6IDQ4cHg7XHJcbiAgICAgICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIEBib3JkZXJfY29sb3I7XHJcbiAgICAgICAgZm9udC1zaXplOiAxLjhlbTtcclxuICAgICAgICBmb250LXdlaWdodDogNDAwO1xyXG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6IEB3aGl0ZTtcclxuICAgICAgICBvdmVyZmxvdzogaGlkZGVuO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAmX19hcnRpY2xlIHtcclxuICAgICAgICBtYXJnaW46IDQ4cHggMDtcclxuICAgICAgICBoZWlnaHQ6IGNhbGMoMTAwJSAtIDk2cHgpO1xyXG4gICAgICAgIHBhZGRpbmc6IDAgMS4yNWVtO1xyXG4gICAgICAgIHNjcm9sbC10aW1lbGluZS1uYW1lOiAtLU1vYmlsZVByb2dyZXNzVGltZWxpbmU7XHJcbiAgICAgICAgb3ZlcmZsb3cteDogaGlkZGVuO1xyXG4gICAgICAgIG92ZXJmbG93LXk6IHNjcm9sbDtcclxuXHJcbiAgICAgICAgLm91dGxpbmUtcmVhZGVyX19wcm9ncmVzcyB7XHJcbiAgICAgICAgICB6LWluZGV4OiA0O1xyXG4gICAgICAgICAgYW5pbWF0aW9uOiBvdXRsaW5lLXJlYWRlci1wcm9ncmVzcyBsaW5lYXI7XHJcbiAgICAgICAgICBhbmltYXRpb24tdGltZWxpbmU6IC0tTW9iaWxlUHJvZ3Jlc3NUaW1lbGluZTtcclxuICAgICAgICAgIGRpc3BsYXk6IGJsb2NrO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxufVxyXG5cclxuQG1lZGlhIHByaW50IHtcclxuICBodG1sLFxyXG4gIGJvZHkge1xyXG4gICAgLyog5omT5Y2w55qE5Z+656GA5a2X5L2T5aSn5bCPICovXHJcbiAgICBmb250LXNpemU6IDEycHQ7XHJcbiAgICAvKiDmmL7npLrorr7nva7mloflrZfpopzoibLlkozog4zmma/popzoibIgKi9cclxuICAgIGJhY2tncm91bmQtY29sb3I6IEB3aGl0ZTtcclxuICAgIGNvbG9yOiBAcHJpbWFyeV90ZXh0X2NvbG9yO1xyXG4gICAgaGVpZ2h0OiBpbml0aWFsICFpbXBvcnRhbnQ7XHJcbiAgfVxyXG5cclxuICAvKiDorr7nva7pk77mjqXmoLflvI8gKi9cclxuICBhOmxpbmssXHJcbiAgYTp2aXNpdGVkLFxyXG4gIGE6aG92ZXIge1xyXG4gICAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmUgIWltcG9ydGFudDtcclxuICAgIGNvbG9yOiBAcHJpbWFyeV9jb2xvcjtcclxuICB9XHJcblxyXG4gIC8qIOmakOiXj+WqkuS9k+agh+etviAqL1xyXG4gIHZpZGVvLFxyXG4gIGF1ZGlvIHtcclxuICAgIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDtcclxuICB9XHJcblxyXG4gIC8qIOehruS/neihqOagvOWcqOaJk+WNsOaXtueahOi+ueahhuWSjOWvuem9kOaWueW8j+a4heaZsCAqL1xyXG4gIHRhYmxlIHtcclxuICAgIHdpZHRoOiAxMDAlO1xyXG4gICAgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTtcclxuICB9XHJcbiAgdGgsXHJcbiAgdGQge1xyXG4gICAgYm9yZGVyOiAxcHggc29saWQgQHByaW1hcnlfYm9yZGVyX2NvbG9yO1xyXG4gICAgcGFkZGluZzogOHB4IDIwcHg7XHJcbiAgfVxyXG5cclxuICAub3V0bGluZSB7XHJcbiAgICAmLW1lc3NhZ2UsXHJcbiAgICAmLXRvb2xiYXIge1xyXG4gICAgICAvKiDpmpDol4/kuoblt6XlhbfmoI/lkozkv6Hmga/mj5DnpLrmoYYgKi9cclxuICAgICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50O1xyXG4gICAgfVxyXG5cclxuICAgICYtcmVhZGVyIHtcclxuICAgICAgZGlzcGxheTogYmxvY2sgIWltcG9ydGFudDtcclxuICAgICAgb3ZlcmZsb3c6IGhpZGRlbjtcclxuXHJcbiAgICAgICZfX3RpdGxlIHtcclxuICAgICAgICBtYXJnaW46IDEzLjRwdCAwIDI4cHQgIWltcG9ydGFudDtcclxuICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXIgIWltcG9ydGFudDtcclxuICAgICAgICBmb250LXNpemU6IDMycHQgIWltcG9ydGFudDtcclxuICAgICAgfVxyXG5cclxuICAgICAgLyog5Y+W5raI5LqG57ud5a+55a6a5L2NICovXHJcbiAgICAgICYtLXJlYWRpbmcge1xyXG4gICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZSAhaW1wb3J0YW50O1xyXG4gICAgICAgIGhlaWdodDogYXV0byAhaW1wb3J0YW50O1xyXG4gICAgICAgIHBhZGRpbmc6IDAgIWltcG9ydGFudDtcclxuICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAd2hpdGU7XHJcbiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbiAhaW1wb3J0YW50O1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvKiDpmpDol4/pmIXor7vov5vluqbmnaEgKi9cclxuICAgICAgJl9fcHJvZ3Jlc3Mge1xyXG4gICAgICAgIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDtcclxuICAgICAgfVxyXG5cclxuICAgICAgLyog5omT5Y2w5pe25LiN5pi+56S65q2j5paHIERPTSDnmoTpmLTlvbHmlYjmnpwgKi9cclxuICAgICAgJl9fcGFwZXIge1xyXG4gICAgICAgIGJveC1zaGFkb3c6IG5vbmU7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHByZSB7XHJcbiAgICAgICAgcGFkZGluZzogMWVtICFpbXBvcnRhbnQ7XHJcbiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgQGJvcmRlcl9jb2xvciAhaW1wb3J0YW50O1xyXG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDRweCAhaW1wb3J0YW50O1xyXG4gICAgICB9XHJcblxyXG4gICAgICBwcmUsXHJcbiAgICAgIGNvZGUge1xyXG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6IEB3aGl0ZSAhaW1wb3J0YW50O1xyXG4gICAgICB9XHJcblxyXG4gICAgICB0YWJsZSxcclxuICAgICAgaW1nLFxyXG4gICAgICBzdmcge1xyXG4gICAgICAgIGJyZWFrLWluc2lkZTogYXZvaWQ7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8qIOaJgOacieaWh+eroOWGheWuuSBET00g55u45YWz55qE6YK75bGF6IqC54K56YO96ZqQ6JeP5LqGICovXHJcbiAgICAgICZfc2libGluZyB7XHJcbiAgICAgICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50O1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbiIsIi8qKlxyXG4gKiByYWRpdXMubGVzcyAtIOWchuinkuiuvue9riBtaXhpbngg5Ye95pWwXHJcbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cclxuICogQ3JlYXRlZCBCeTogWWFvaGFpeGlhb1xyXG4gKiBVcGRhdGU6IDIwMjQuNC4xNlxyXG4gKi9cclxuXHJcbi8qID09PT09PSDlnIbop5LmoLflvI/orr7nva7lh73mlbAgPT09PT09ICovXHJcbi5yYWRpdXMoQG51bTogMnB4KSB7XHJcbiAgYm9yZGVyLXJhZGl1czogQG51bTtcclxufVxyXG5cclxuLnJhZGl1c19ub25lKCkge1xyXG4gIC5yYWRpdXMoMCk7XHJcbn1cclxuXHJcbi5yYWRpdXNfbWluaSgpIHtcclxuICAucmFkaXVzKDJweCk7XHJcbn1cclxuXHJcbi5yYWRpdXNfc21hbGwoKSB7XHJcbiAgLnJhZGl1cygzcHgpO1xyXG59XHJcblxyXG4ucmFkaXVzX3JlZ3VsYXIoKSB7XHJcbiAgLnJhZGl1cyg0cHgpO1xyXG59XHJcblxyXG4ucmFkaXVzX21lZGl1bSgpIHtcclxuICAucmFkaXVzKDVweCk7XHJcbn1cclxuXHJcbi5yYWRpdXNfbGFyZ2UoKSB7XHJcbiAgLnJhZGl1cygxMHB4KTtcclxufVxyXG5cclxuLnJhZGl1c19odWdlKCkge1xyXG4gIC5yYWRpdXMoMTZweCk7XHJcbn1cclxuXHJcbi5yYWRpdXNfcm91bmQoKSB7XHJcbiAgLnJhZGl1cygzMHB4KTtcclxufVxyXG4iLCJAaW1wb3J0ICcuLi90aGVtZS9jb2xvcnMnO1xyXG5AaW1wb3J0ICcuLi90aGVtZS9zaGFkb3cnO1xyXG5cclxuLm91dGxpbmUtdG9vbGJhciB7XHJcbiAgcG9zaXRpb246IGZpeGVkO1xyXG4gIHotaW5kZXg6IDk5OTk5O1xyXG4gIG1hcmdpbjogMDtcclxuICB0cmFuc2l0aW9uLWR1cmF0aW9uOiAwLjNzO1xyXG4gIG92ZXJmbG93OiBoaWRkZW47XHJcblxyXG4gICZfX2J1dHRvbiB7XHJcbiAgICAuc2hhZG93X2xpZ2h0X3JlZ3VsYXIoKTtcclxuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcclxuICAgIHotaW5kZXg6IDE7XHJcbiAgICBtYXJnaW46IDEwcHg7XHJcbiAgICB3aWR0aDogMzZweDtcclxuICAgIGhlaWdodDogMzZweDtcclxuICAgIGJvcmRlcjogMXB4IHNvbGlkIEBwcmltYXJ5X2JvcmRlcl9jb2xvcjtcclxuICAgIGJvcmRlci1yYWRpdXM6IDNweDtcclxuICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XHJcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAd2hpdGU7XHJcbiAgICBjdXJzb3I6IHBvaW50ZXI7XHJcbiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XHJcbiAgICBjb2xvcjogQGZvdXJ0aF90ZXh0X2NvbG9yO1xyXG4gICAgdHJhbnNpdGlvbjogYWxsIDAuM3MgMC4xcyBlYXNlLWluLW91dDtcclxuICAgIG92ZXJmbG93OiBoaWRkZW47XHJcblxyXG4gICAgJjpob3ZlciB7XHJcbiAgICAgIGNvbG9yOiBAc3VjY2Vzc19jb2xvcjtcclxuICAgICAgYm9yZGVyLWNvbG9yOiBAc3VjY2Vzc19jb2xvcjtcclxuICAgICAgdHJhbnNmb3JtOiBzY2FsZSgxLjM1KTtcclxuICAgIH1cclxuXHJcbiAgICAmLmhpZGUge1xyXG4gICAgICBkaXNwbGF5OiBub25lO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgJl9fYW5jaG9yIHtcclxuICAgICY6bGluayxcclxuICAgICY6dmlzaXRlZCxcclxuICAgICY6aG92ZXIge1xyXG4gICAgICBjb2xvcjogQGZvdXJ0aF90ZXh0X2NvbG9yO1xyXG4gICAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7XHJcbiAgICB9XHJcblxyXG4gICAgJjpob3ZlciB7XHJcbiAgICAgIGNvbG9yOiBAc3VjY2Vzc19jb2xvcjtcclxuICAgIH1cclxuICB9XHJcblxyXG4gICZfX2ljb24ge1xyXG4gICAgcG9zaXRpb246IGFic29sdXRlO1xyXG4gICAgei1pbmRleDogMjtcclxuICAgIHRvcDogNTAlO1xyXG4gICAgbGVmdDogNTAlO1xyXG4gICAgd2lkdGg6IDIwcHg7XHJcbiAgICBoZWlnaHQ6IDIwcHg7XHJcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCAtNTAlKTtcclxuICAgIGZpbGw6IGN1cnJlbnRjb2xvcjtcclxuICAgIG92ZXJmbG93OiBoaWRkZW47XHJcbiAgfVxyXG5cclxuICAmX2FjdGl2ZSB7XHJcbiAgICAmLm91dGxpbmUtdG9vbGJhciB7XHJcbiAgICAgICZfX2J1dHRvbiB7XHJcbiAgICAgICAgY29sb3I6IEB3aGl0ZTtcclxuICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAc3VjY2Vzc19jb2xvcjtcclxuICAgICAgICBib3JkZXItY29sb3I6IEBzdWNjZXNzX2NvbG9yO1xyXG5cclxuICAgICAgICAmOmhvdmVyIHtcclxuICAgICAgICAgIGNvbG9yOiBAd2hpdGU7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLm91dGxpbmUtdG9vbGJhcl9fYW5jaG9yIHtcclxuICAgICAgJjpsaW5rLFxyXG4gICAgICAmOnZpc2l0ZWQsXHJcbiAgICAgICY6aG92ZXIge1xyXG4gICAgICAgIGNvbG9yOiBAd2hpdGU7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gICZfcm91bmRlZCB7XHJcbiAgICAmLm91dGxpbmUtdG9vbGJhcl9fYnV0dG9uIHtcclxuICAgICAgYm9yZGVyLXJhZGl1czogMThweDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gICZfZGlzYWJsZWQge1xyXG4gICAgJi5vdXRsaW5lLXRvb2xiYXIsXHJcbiAgICAub3V0bGluZS10b29sYmFyIHtcclxuICAgICAgJl9fYW5jaG9yOmxpbmssXHJcbiAgICAgICZfX2FuY2hvcjp2aXNpdGVkLFxyXG4gICAgICAmX19hbmNob3I6aG92ZXIsXHJcbiAgICAgICZfX2J1dHRvbiB7XHJcbiAgICAgICAgY3Vyc29yOiBub3QtYWxsb3dlZDtcclxuICAgICAgICBjb2xvcjogQGZvdXJ0aF90ZXh0X2NvbG9yO1xyXG4gICAgICAgIGJvcmRlci1jb2xvcjogQGZvdXJ0aF90ZXh0X2NvbG9yO1xyXG5cclxuICAgICAgICAmOmhvdmVyIHtcclxuICAgICAgICAgIGNvbG9yOiBAZm91cnRoX3RleHRfY29sb3I7XHJcbiAgICAgICAgICBib3JkZXItY29sb3I6IEBmb3VydGhfdGV4dF9jb2xvcjtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgICZfX2J1dHRvbiB7XHJcbiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogQGRpc2FibGVkX2JnX2NvbG9yO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAmX3R0YixcclxuICAmX2J0dCB7XHJcbiAgICBsZWZ0OiA1MCU7XHJcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTUwJSk7XHJcblxyXG4gICAgLm91dGxpbmUtdG9vbGJhcl9fYnV0dG9uIHtcclxuICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgJl90dGIge1xyXG4gICAgdG9wOiAxMnB4O1xyXG5cclxuICAgICYub3V0bGluZS10b29sYmFyX2hpZGRlbiB7XHJcbiAgICAgIHRvcDogLTU2cHg7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAmX2J0dCB7XHJcbiAgICBib3R0b206IDEycHg7XHJcblxyXG4gICAgJi5vdXRsaW5lLXRvb2xiYXJfaGlkZGVuIHtcclxuICAgICAgYm90dG9tOiAtNTZweDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gICZfcnRsLFxyXG4gICZfbHRyIHtcclxuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtNTAlKTtcclxuICAgIHdpZHRoOiA1NnB4O1xyXG4gIH1cclxuXHJcbiAgJl9ydGwge1xyXG4gICAgdG9wOiA1MCU7XHJcbiAgICByaWdodDogMTJweDtcclxuXHJcbiAgICAmLm91dGxpbmUtdG9vbGJhcl9oaWRkZW4ge1xyXG4gICAgICByaWdodDogLTg2cHg7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAmX2x0ciB7XHJcbiAgICB0b3A6IDUwJTtcclxuICAgIGxlZnQ6IDEycHg7XHJcblxyXG4gICAgJi5vdXRsaW5lLXRvb2xiYXJfaGlkZGVuIHtcclxuICAgICAgbGVmdDogLTg2cHg7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAmX3R0YixcclxuICAmX3J0bCxcclxuICAmX2J0dCxcclxuICAmX2x0ciB7XHJcbiAgICAub3V0bGluZS10b29sYmFyX19idXR0b24ge1xyXG4gICAgICAmLm91dGxpbmUtdG9vbGJhcl9oaWRkZW4ge1xyXG4gICAgICAgIGRpc3BsYXk6IG5vbmU7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcbn1cclxuIl19 */ diff --git a/docs/css/example.min.css b/docs/css/example.min.css index 94b89682..5a8c335e 100644 --- a/docs/css/example.min.css +++ b/docs/css/example.min.css @@ -1,2 +1,2 @@ -.section__dd,.section__dt{display:inline-block}.case,.section__footer,.section__table{border-top:1px solid #ddd}.case:after,.outline-drawer__overlay{content:''}.case__pre,.section__footer,.section__th{background-color:#fafafa}.case,.section__dl{position:relative;z-index:1}.section{margin:1em 0;overflow:hidden}.section__content,.section__footer,.section__header{margin:0;padding:0 3em;overflow:hidden}.section__title{color:#666}.section__h3{color:#507afe;font-size:1.35em}.section__h4{font-size:1.1em;color:#666}.section__h5{font-size:1em;color:#999}.section__dd,.section__dl,.section__dt{margin:0;padding:0;overflow:hidden}.section__dd{color:#058942}.section__pre{margin:2em 0;font-size:14px;line-height:150%;text-align:left;border:1px solid #ddd;border-radius:4px;color:#666}.footer,.header,.outline-drawer__close,.section__th{text-align:center}.section__code{display:block;margin:0 auto;overflow:hidden}.section__footer{margin-top:3em;color:#999}.section__table{margin:1em auto;width:100%}.section__td,.section__th{padding:5px 16px;line-height:26px;border-bottom:1px solid #ddd}@media (max-width:500px){.section__content,.section__header{padding:0 1em}}.case{display:grid;grid-template-columns:repeat(2,1fr);gap:40px;padding:1em;border-bottom:1px solid #ddd;overflow:hidden}.case:after{position:absolute;z-index:2;top:0;left:50%;height:100%;width:0;border-left:1px solid #ddd;overflow:hidden}.case__pre,.case__textarea{-webkit-box-sizing:border-box;overflow:auto;font-size:13px;line-height:150%}.case__code,.case__pre,.case__textarea{font-family:'Courier New',Consolas,Georgia,Arial,sans-serif}.case__pre{margin:0;padding:1em;height:100%;border-radius:4px;box-sizing:border-box}.case__toolbar{margin:0 auto;height:36px;line-height:36px;font-size:14px;padding:0 16px;text-align:right;overflow:hidden}.case__action,.case__remove{cursor:pointer;color:#058942;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.case__action{font-size:13px;padding-left:10px}.case__action:first-child{padding-left:0}.case__remove{float:right}.case__console{margin:0 auto;height:180px;border:1px solid #ddd;overflow:hidden}.case__textarea{margin:0 auto;width:100%;height:100%;border:none;outline:0;padding:1em;box-sizing:border-box}.case__list,.header{border-bottom:1px solid #ddd}.paper,.paper.flex .article{-webkit-box-sizing:border-box}.case__item,.case__list{margin:0;padding:0;list-style-type:none;overflow:hidden}.case__list{height:360px;border-top:1px solid #ddd;font-size:13px;overflow:auto}.footer,.outline-drawer_btt{border-top:1px solid #dcdfe6}.case__item{height:36px;line-height:36px;cursor:pointer;padding:0 16px}.case__item:hover{background-color:#f7f8f9}.article__aside .outline-navigator,.header,.outline-drawer__modal,.outline-drawer__overlay,.paper{background-color:#fff}.paper{-webkit-box-shadow:0 0 6px 1px #dcdfe6;box-shadow:0 0 6px 1px #dcdfe6;margin:3em auto;max-width:1200px;padding:2em;box-sizing:border-box}.paper.flex{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;-ms-flex-wrap:nowrap;flex-wrap:nowrap;margin:0;width:100%;max-width:100%;height:100%;padding:0;overflow:hidden}.paper.flex .article{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;width:100%;box-sizing:border-box}.paper.flex .article__main{height:100%;-webkit-box-sizing:border-box;box-sizing:border-box;overflow:auto}.paper.flex .article__aside{border-right:1px solid #dcdfe6}.header{position:sticky;z-index:3;top:0;margin:0 auto;-webkit-transition-duration:.3s;transition-duration:.3s;overflow:hidden}.header_sticky{padding-left:260px}.article{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;-ms-flex-wrap:nowrap;flex-wrap:nowrap;padding:2em 0;font-size:16px;line-height:150%}.article__main{-webkit-box-flex:1;-ms-flex:1;flex:1;padding:0 2em;overflow:hidden}.article__main .section,.article__main .section__content,.article__main .section__footer,.article__main .section__header{overflow:visible}.article__main .section__content,.article__main .section__header{margin:0}.article__aside{-ms-flex-negative:0;flex-shrink:0;width:240px;border-left:1px solid #ddd}.article__aside.ltr{border-right:1px solid #ddd;border-left:none}.outline-drawer_ltr,.utils-border-right{border-right:1px solid #dcdfe6}.section__pre,pre{padding:2em;font-family:'Courier New',Arial,sans-serif;background-color:#fafafa;overflow:auto}.section__code,code{font-family:'Courier New',Arial,sans-serif;font-size:16px}.footer{padding:3em 0}.footer a:hover,.footer a:link,.footer a:visited{text-decoration:none;color:#058942}.footer a:hover{text-decoration:underline}.hidden{display:none}@media (max-width:500px){.paper,body,html{margin:0}.paper{padding:0}.article__main{padding:0 2em}}:root{--outline-zIndex:2000;--outline-sticky-height:100%;--outline-navigator-width:100%}.outline-icon{position:relative;z-index:1;display:inline-block;vertical-align:middle;width:1em;height:1em;overflow:hidden}.outline-heading__anchor,.outline-icon_hidden{display:none}.outline-icon__svg{position:absolute;z-index:2;top:50%;left:50%;width:1em;height:1em;fill:currentcolor;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%);overflow:hidden}.outline-heading{position:relative;z-index:1;overflow:hidden}.outline-heading__anchor:hover,.outline-heading__anchor:link,.outline-heading__anchor:visited{color:#999;text-decoration:none}.outline-heading__anchor:hover{color:#507afe}.outline-heading:hover .outline-heading__anchor{display:inline-block}.outline-heading_start:hover{overflow:visible}.outline-heading_start .outline-heading__anchor{position:absolute;z-index:2;top:50%;-webkit-transform:translateY(-50%);transform:translateY(-50%);left:-1em}.outline-drawer{position:relative;z-index:-1;top:0;left:0;margin:0;width:100%;height:100%;-webkit-box-sizing:border-box;box-sizing:border-box;visibility:hidden;overflow:hidden}.outline-drawer__modal{-webkit-box-shadow:0 0 6px 1px #dcdfe6;box-shadow:0 0 6px 1px #dcdfe6;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-ms-flex-wrap:nowrap;flex-wrap:nowrap;position:absolute;z-index:21;height:100%;-webkit-transition-duration:.4s;transition-duration:.4s;overflow:hidden}.outline-drawer__footer,.outline-drawer__header,.outline-drawer__main{width:100%;-webkit-box-sizing:border-box;box-sizing:border-box}.outline-drawer__footer,.outline-drawer__header{-ms-flex-negative:0;flex-shrink:0}.outline-drawer__footer,.outline-drawer__main,.outline-drawer__title{padding:0 16px}.outline-drawer__header,.outline-drawer__title{position:relative;z-index:1;margin:0 auto;height:52px;line-height:52px;overflow:hidden}.outline-drawer__title{font-size:16px;font-weight:400;margin:0 16px;-webkit-box-sizing:border-box;box-sizing:border-box;border-bottom:1px solid #dcdfe6}.outline-drawer__close{position:absolute;z-index:2;top:50%;right:12px;width:20px;height:20px;line-height:20px;color:#999;font-size:20px;cursor:pointer;-webkit-transform:translateY(-50%);transform:translateY(-50%);overflow:hidden}.outline-drawer__close .outline-icon{position:absolute;z-index:2;top:0;left:0}.outline-drawer__close:hover{color:#666}.outline-drawer__main{-webkit-box-flex:1;-ms-flex:1;flex:1;overflow:auto}.outline-drawer__main.overflow-hidden{overflow:hidden}.outline-drawer__footer{margin:0 auto;text-align:right;overflow:hidden}.outline-drawer__overlay{position:relative;z-index:1;top:0;left:0;width:100%;height:100%;opacity:.1;overflow:hidden}.outline-drawer_ltr.outline-drawer_tiny,.outline-drawer_rtl.outline-drawer_tiny{width:280px}.outline-drawer_ltr.outline-drawer_mini,.outline-drawer_rtl.outline-drawer_mini{width:480px}.outline-drawer_ltr.outline-drawer_small,.outline-drawer_rtl.outline-drawer_small{width:540px}.outline-drawer_ltr.outline-drawer_regular,.outline-drawer_rtl.outline-drawer_regular{width:680px}.outline-drawer_ltr.outline-drawer_medium,.outline-drawer_rtl.outline-drawer_medium{width:720px}.outline-drawer_ltr.outline-drawer_large,.outline-drawer_rtl.outline-drawer_large{width:960px}.outline-drawer_rtl{border-left:1px solid #dcdfe6}.outline-drawer_rtl.outline-drawer_tiny.outline-drawer_closed{right:-290px}.outline-drawer_rtl.outline-drawer_mini.outline-drawer_closed{right:-490px}.outline-drawer_rtl.outline-drawer_small.outline-drawer_closed{right:-550px}.outline-drawer_rtl.outline-drawer_regular.outline-drawer_closed{right:-690px}.outline-drawer_rtl.outline-drawer_medium.outline-drawer_closed{right:-730px}.outline-drawer_rtl.outline-drawer_large.outline-drawer_closed{right:-970px}.outline-drawer_ltr.outline-drawer_tiny.outline-drawer_closed{left:-290px}.outline-drawer_ltr.outline-drawer_mini.outline-drawer_closed{left:-490px}.outline-drawer_ltr.outline-drawer_small.outline-drawer_closed{left:-550px}.outline-drawer_ltr.outline-drawer_regular.outline-drawer_closed{left:-690px}.outline-drawer_ltr.outline-drawer_medium.outline-drawer_closed{left:-730px}.outline-drawer_ltr.outline-drawer_large.outline-drawer_closed{left:-970px}.outline-drawer_btt,.outline-drawer_ttb{left:0;width:100%}.outline-drawer_btt.outline-drawer_tiny,.outline-drawer_ttb.outline-drawer_tiny{height:240px}.outline-drawer_btt.outline-drawer_mini,.outline-drawer_ttb.outline-drawer_mini{height:320px}.outline-drawer_btt.outline-drawer_small,.outline-drawer_ttb.outline-drawer_small{height:360px}.outline-drawer_btt.outline-drawer_regular,.outline-drawer_ttb.outline-drawer_regular{height:400px}.outline-drawer_btt.outline-drawer_medium,.outline-drawer_ttb.outline-drawer_medium{height:440px}.outline-drawer_btt.outline-drawer_large,.outline-drawer_ttb.outline-drawer_large{height:480px}.outline-drawer_ttb{border-bottom:1px solid #dcdfe6}.outline-drawer_ttb.outline-drawer_tiny.outline-drawer_closed{top:-250px}.outline-drawer_ttb.outline-drawer_mini.outline-drawer_closed{top:-330px}.outline-drawer_ttb.outline-drawer_small.outline-drawer_closed{top:-370px}.outline-drawer_ttb.outline-drawer_regular.outline-drawer_closed{top:-410px}.outline-drawer_ttb.outline-drawer_medium.outline-drawer_closed{top:-450px}.outline-drawer_ttb.outline-drawer_large.outline-drawer_closed{top:-490px}.outline-drawer_btt{top:initial}.outline-drawer_btt.outline-drawer_tiny.outline-drawer_closed{bottom:-250px}.outline-drawer_btt.outline-drawer_mini.outline-drawer_closed{bottom:-330px}.outline-drawer_btt.outline-drawer_small.outline-drawer_closed{bottom:-370px}.outline-drawer_btt.outline-drawer_regular.outline-drawer_closed{bottom:-410px}.outline-drawer_btt.outline-drawer_medium.outline-drawer_closed{bottom:-450px}.outline-drawer_btt.outline-drawer_large.outline-drawer_closed{bottom:-490px}.outline-drawer_opened{visibility:visible;z-index:var(--outline-zIndex)}.outline-drawer_opened.outline-drawer{position:fixed}.outline-drawer_opened.outline-drawer_rtl{right:0}.outline-drawer_opened.outline-drawer_ltr{left:0}.outline-drawer_opened.outline-drawer_ttb{top:0}.outline-drawer_opened.outline-drawer_btt{bottom:0}.outline-drawer_offset.outline-drawer_ltr,.outline-drawer_offset.outline-drawer_rtl{height:calc(100% - 4em);top:50%;-webkit-transform:translateY(-50%);transform:translateY(-50%)}.outline-drawer_offset.outline-drawer_btt,.outline-drawer_offset.outline-drawer_ttb{width:calc(100% - 4em);left:50%;-webkit-transform:translateX(-50%);transform:translateX(-50%)}.outline-drawer_offset.outline-drawer_opened.outline-drawer_rtl{right:2em}.outline-drawer_offset.outline-drawer_opened.outline-drawer_ltr{left:2em}.outline-drawer_offset.outline-drawer_opened.outline-drawer_ttb{top:2em}.outline-drawer_offset.outline-drawer_opened.outline-drawer_btt{bottom:2em}.outline-drawer_auto.outline-drawer_ltr,.outline-drawer_auto.outline-drawer_rtl{height:auto;max-height:calc(100% - 4em)}.outline-drawer_full{padding:0}.outline-navigator{position:relative;z-index:1;margin:0;width:var(--outline-navigator-width);overflow:auto}.outline-navigator-parent{-webkit-transition:.3s ease-in-out;transition:.3s ease-in-out}.outline-navigator__title{margin:0 16px;height:40px;line-height:40px;padding:0 16px;border-bottom:1px solid #dcdfe6;font-size:16px;font-weight:400;overflow:hidden}.outline-navigator__main{position:relative;z-index:1;margin:0;overflow:hidden}.outline-navigator__item,.outline-navigator__list,.outline-navigator__subject{position:relative;z-index:2;margin:0;padding:0;list-style-type:none;overflow:hidden}.outline-navigator__list{padding:.5em 0}.outline-navigator__subject{padding-left:1em}.outline-navigator__item{margin:0;line-height:30px;font-size:13px;overflow:hidden}.outline-navigator__placeholder{position:absolute;z-index:1;top:0;left:0;width:100%;height:30px;background-color:#f7f8f9;border-left:2px solid #058942;-webkit-transition-duration:.2s;transition-duration:.2s;-webkit-box-sizing:border-box;box-sizing:border-box;overflow:hidden}.outline-navigator__anchor{white-space:nowrap;text-overflow:ellipsis;overflow:hidden;display:block;padding:0 1.5em}.outline-navigator__anchor:hover,.outline-navigator__anchor:link,.outline-navigator__anchor:visited{text-decoration:none;color:#555}.outline-navigator__anchor:hover{color:#058942}.outline-navigator__code{padding-right:.5em}.outline-navigator_highlight.outline-navigator__anchor:hover,.outline-navigator_highlight.outline-navigator__anchor:link,.outline-navigator_highlight.outline-navigator__anchor:visited{color:#058942;font-weight:700}.outline-navigator_fixed,.outline-navigator_sticky{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;z-index:var(--outline-zIndex);top:0;overflow:hidden}.outline-navigator_hidden,.outline-reader__article .outline-reader__progress,.outline-reader_hidden{display:none}.outline-navigator_fixed .outline-navigator__main,.outline-navigator_fixed .outline-navigator__title,.outline-navigator_sticky .outline-navigator__main,.outline-navigator_sticky .outline-navigator__title{-webkit-box-sizing:border-box;box-sizing:border-box}.outline-navigator_fixed .outline-navigator__title,.outline-navigator_sticky .outline-navigator__title{-ms-flex-negative:0;flex-shrink:0}.outline-navigator_fixed .outline-navigator__main,.outline-navigator_sticky .outline-navigator__main{-webkit-box-flex:1;-ms-flex:1;flex:1;overflow:auto}.outline-navigator_sticky{position:sticky;max-height:var(--outline-sticky-height)}.outline-navigator_fixed{position:fixed;max-height:100%}.outline-navigator_folded{width:0;overflow:hidden}.outline-reader__progress{position:fixed;top:0;left:0;z-index:3;height:4px;width:100%;background-color:#507afe;scale:0 1;-webkit-transform-origin:left;transform-origin:left;-webkit-animation:outline-reader-progress linear;animation:outline-reader-progress linear;animation-timeline:--ProgressTimeline}.outline-message,.outline-toolbar__button{background-color:#fff;-webkit-box-shadow:0 0 6px 1px #dcdfe6}.outline-reader__paper{-webkit-box-shadow:0 0 6px 1px #ddd;box-shadow:0 0 6px 1px #ddd;margin:2em auto;max-width:1200px;padding:3.2em;-webkit-box-sizing:border-box;box-sizing:border-box;background-color:#fff;overflow:hidden}.outline-reader__title{margin:.67em 0;text-align:center;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI','PingFang SC','Hiragino Sans GB','Microsoft YaHei','Helvetica Neue','Apple Color Emoji','Segoe UI Emoji','Segoe UI Symbol',Helvetica,Arial,sans-serif;font-weight:400;line-height:1.3em;font-size:4.2em;overflow:hidden}.outline-reader_hidden.outline-reader_sibling{display:none!important}.outline-reader_hidden.outline-reader_sibling.wrapper.post{display:none}.outline-reader--reading{display:block;position:fixed;z-index:2;top:0;left:0;width:100%;height:100%;margin:0;-webkit-box-sizing:border-box;box-sizing:border-box;padding:3em 4em;background-color:#fafafa;scroll-timeline-name:--ProgressTimeline;overflow:scroll}@-webkit-keyframes outline-reader-progress{to{scale:1 1}}@keyframes outline-reader-progress{to{scale:1 1}}@media (max-width:500px){.outline-reader{overflow:hidden}.outline-reader .outline-toolbar{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-ms-flex-item-align:auto;align-self:auto;top:100%;right:0;-webkit-transform:translateY(-48px);transform:translateY(-48px);width:100%;height:48px;-webkit-box-sizing:border-box;box-sizing:border-box;border-top:1px solid #ddd;background-color:#fff;padding:0 16px}.outline-reader .outline-toolbar__button{border-radius:0;-webkit-box-flex:1;-ms-flex:1;flex:1;border:none;-webkit-box-shadow:none;box-shadow:none}.outline-reader--reading{padding:0;background-color:#fff;-webkit-box-sizing:border-box;box-sizing:border-box}.outline-reader__paper{position:relative;z-index:1;margin:0;padding:0;height:100%;-webkit-box-shadow:none;box-shadow:none;overflow:hidden}.outline-reader__title{white-space:nowrap;text-overflow:ellipsis;position:absolute;z-index:3;top:0;left:0;margin:0;width:100%;height:48px;line-height:48px;border-bottom:1px solid #ddd;font-size:1.8em;font-weight:400;background-color:#fff;overflow:hidden}.outline-reader__article{margin:48px 0;height:calc(100% - 96px);padding:0 1.25em;scroll-timeline-name:--MobileProgressTimeline;overflow-x:hidden;overflow-y:scroll}.outline-reader__article .outline-reader__progress{z-index:4;-webkit-animation:outline-reader-progress linear;animation:outline-reader-progress linear;animation-timeline:--MobileProgressTimeline;display:block}}@media print{body,html{font-size:12pt;background-color:#fff;color:#333;height:initial!important}a:hover,a:link,a:visited{text-decoration:underline!important;color:#507afe}.outline-message,.outline-toolbar,audio,video{display:none!important}table{width:100%;border-collapse:collapse}td,th{border:1px solid #dcdfe6;padding:8px 20px}.outline-reader{display:block!important;overflow:hidden}.outline-reader__progress,.outline-reader_sibling{display:none!important}.outline-reader__title{margin:13.4pt 0 28pt!important;text-align:center!important;font-size:32pt!important}.outline-reader--reading{position:relative!important;height:auto!important;padding:0!important;background-color:#fff;overflow:hidden!important}.outline-reader__paper{-webkit-box-shadow:none;box-shadow:none}.outline-reader pre{padding:1em!important;border:1px solid #ddd!important;border-radius:4px!important}.outline-reader code,.outline-reader pre{background-color:#fff!important}.outline-reader img,.outline-reader svg,.outline-reader table{-webkit-column-break-inside:avoid;-moz-column-break-inside:avoid;break-inside:avoid}}.outline-toolbar{position:fixed;z-index:99999;margin:0;-webkit-transition-duration:.3s;transition-duration:.3s;overflow:hidden}.outline-toolbar__button{box-shadow:0 0 6px 1px #dcdfe6;position:relative;z-index:1;margin:10px;width:36px;height:36px;border:1px solid #dcdfe6;border-radius:3px;-webkit-box-sizing:border-box;box-sizing:border-box;cursor:pointer;text-align:center;color:#999;-webkit-transition:all .3s .1s ease-in-out;transition:all .3s .1s ease-in-out;overflow:hidden}.outline-toolbar__button:hover{color:#058942;border-color:#058942;-webkit-transform:scale(1.35);transform:scale(1.35)}.outline-toolbar__button.hide{display:none}.outline-toolbar__anchor:hover,.outline-toolbar__anchor:link,.outline-toolbar__anchor:visited{color:#999;text-decoration:none}.outline-toolbar__anchor:hover{color:#058942}.outline-toolbar__icon{position:absolute;z-index:2;top:50%;left:50%;width:20px;height:20px;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%);fill:currentcolor;overflow:hidden}.outline-toolbar_active.outline-toolbar__button{color:#fff;background-color:#058942;border-color:#058942}.outline-toolbar_active .outline-toolbar__anchor:hover,.outline-toolbar_active .outline-toolbar__anchor:link,.outline-toolbar_active .outline-toolbar__anchor:visited,.outline-toolbar_active.outline-toolbar__button:hover{color:#fff}.outline-toolbar_rounded.outline-toolbar__button{border-radius:18px}.outline-toolbar_disabled .outline-toolbar__anchor:hover,.outline-toolbar_disabled .outline-toolbar__anchor:link,.outline-toolbar_disabled .outline-toolbar__anchor:visited,.outline-toolbar_disabled .outline-toolbar__button,.outline-toolbar_disabled.outline-toolbar__anchor:hover,.outline-toolbar_disabled.outline-toolbar__anchor:link,.outline-toolbar_disabled.outline-toolbar__anchor:visited,.outline-toolbar_disabled.outline-toolbar__button{cursor:not-allowed;color:#999;border-color:#999}.outline-toolbar_disabled .outline-toolbar__anchor:hover:hover,.outline-toolbar_disabled .outline-toolbar__anchor:link:hover,.outline-toolbar_disabled .outline-toolbar__anchor:visited:hover,.outline-toolbar_disabled .outline-toolbar__button:hover,.outline-toolbar_disabled.outline-toolbar__anchor:hover:hover,.outline-toolbar_disabled.outline-toolbar__anchor:link:hover,.outline-toolbar_disabled.outline-toolbar__anchor:visited:hover,.outline-toolbar_disabled.outline-toolbar__button:hover{color:#999;border-color:#999}.outline-message,.outline-message__content{margin:0;font-size:13px;color:#666;height:40px;line-height:40px;overflow:hidden}.outline-toolbar_disabled .outline-toolbar__button,.outline-toolbar_disabled.outline-toolbar__button{background-color:#f5f5f5}.outline-toolbar_btt,.outline-toolbar_ttb{left:50%;-webkit-transform:translateX(-50%);transform:translateX(-50%)}.outline-toolbar_btt .outline-toolbar__button,.outline-toolbar_ttb .outline-toolbar__button{display:inline-block}.outline-toolbar_ttb{top:12px}.outline-toolbar_ttb.outline-toolbar_hidden{top:-56px}.outline-toolbar_btt{bottom:12px}.outline-toolbar_btt.outline-toolbar_hidden{bottom:-56px}.outline-toolbar_ltr,.outline-toolbar_rtl{-webkit-transform:translateY(-50%);transform:translateY(-50%);width:56px}.outline-toolbar_rtl{top:50%;right:12px}.outline-toolbar_rtl.outline-toolbar_hidden{right:-86px}.outline-toolbar_ltr{top:50%;left:12px}.outline-toolbar_ltr.outline-toolbar_hidden{left:-86px}.outline-toolbar_btt .outline-toolbar__button.outline-toolbar_hidden,.outline-toolbar_ltr .outline-toolbar__button.outline-toolbar_hidden,.outline-toolbar_rtl .outline-toolbar__button.outline-toolbar_hidden,.outline-toolbar_ttb .outline-toolbar__button.outline-toolbar_hidden{display:none}.outline-message{border-radius:3px;box-shadow:0 0 6px 1px #dcdfe6;position:fixed;z-index:9999;opacity:.1;top:-50px;left:50%;padding:0 50px;-webkit-transition:all .5s ease-in-out;transition:all .5s ease-in-out;-webkit-transform:translateX(-50%);transform:translateX(-50%)}.outline-message__content{white-space:nowrap;text-overflow:ellipsis;max-width:700px}.outline-message__close,.outline-message__icon{position:absolute;z-index:2;top:0;width:40px;height:40px;line-height:40px;text-align:center;overflow:hidden}.outline-message__icon{left:0;color:#fff}.outline-message__icon .outline-icon{position:absolute;z-index:2;top:50%;left:50%;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%)}.outline-message__close{right:0;cursor:pointer;color:#999}.outline-message__close .outline-icon{position:absolute;z-index:2;top:50%;left:50%;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%)}.outline-message__close:hover{color:#666}.outline-message_info .outline-message__icon{background-color:#507afe}.outline-message_warning .outline-message__icon{background-color:#ff9901}.outline-message_success .outline-message__icon{background-color:#058942}.outline-message_error .outline-message__icon{background-color:#ff5d5d}.outline-message_plain{min-width:190px;padding:0 50px 0 15px}.outline-message_light,.outline-message_round.outline-message_default{min-width:180px;padding:0 40px}.outline-message_plain.outline-message_info{border-left:5px solid #507afe;background-color:#ecf8ff}.outline-message_plain.outline-message_warning{border-left:5px solid #ff9901;background-color:#fffbe6}.outline-message_plain.outline-message_success{border-left:5px solid #058942;background-color:#e1f6eb}.outline-message_plain.outline-message_error{border-left:5px solid #ff5d5d;background-color:#fff1f0}.outline-message_plain .outline-message__icon{width:0;display:none}.outline-message_plain .outline-message__icon .outline-icon{display:none}.outline-message_light.outline-message_info .outline-message__icon{color:#507afe}.outline-message_light.outline-message_warning .outline-message__icon{color:#ff9901}.outline-message_light.outline-message_success .outline-message__icon{color:#058942}.outline-message_light.outline-message_error .outline-message__icon{color:#ff5d5d}.outline-message_light .outline-message__icon{background-color:#fff}.outline-message_round{border-radius:20px}.outline-message_round.outline-message_default .outline-message__icon{border-radius:10px;top:10px;left:10px;width:20px;height:20px;line-height:20px}.outline-message_round.outline-message_default.outline-message_full-width{min-width:200px;padding:0 20px 0 40px}.outline-message_round.outline-message_plain{min-width:195px;padding:0 40px 0 20px}.outline-message_round.outline-message_plain.outline-message_full-width{min-width:215px;padding:0 20px}.outline-message_full-width{min-width:200px;padding:0 10px 0 50px}.outline-message_full-width.outline-message_plain{min-width:230px;padding:0 10px 0 15px}.outline-message_full-width.outline-message_light{min-width:210px;padding:0 10px 0 40px}.outline-message_visible{opacity:1}.outline-message_hidden{display:none}::-webkit-scrollbar{width:7px;height:7px;-webkit-border-radius:5px}::-webkit-scrollbar-track-piece{-webkit-border-radius:5px}::-webkit-scrollbar-thumb:vertical{background-color:rgba(0,0,0,.25);-webkit-border-radius:5px}::-webkit-scrollbar-thumb:horizontal{background-color:rgba(0,0,0,.25);-webkit-border-radius:5px}::-webkit-scrollbar-thumb:hover{background-color:rgba(0,0,0,.35)}::-webkit-scrollbar:hover{background-color:rgba(0,0,0,.15)} -/*# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlcyI6WyJjc3MvZXhhbXBsZS5jc3MiXSwic291cmNlc0NvbnRlbnQiOlsiLyogPT09PT0gU2Nyb2xsYmFyID09PT09ICovXG46Oi13ZWJraXQtc2Nyb2xsYmFyIHtcbiAgd2lkdGg6IDdweDtcbiAgaGVpZ2h0OiA3cHg7XG4gIC13ZWJraXQtYm9yZGVyLXJhZGl1czogNXB4O1xufVxuOjotd2Via2l0LXNjcm9sbGJhci10cmFjay1waWVjZSB7XG4gIC13ZWJraXQtYm9yZGVyLXJhZGl1czogNXB4O1xufVxuOjotd2Via2l0LXNjcm9sbGJhci10aHVtYjp2ZXJ0aWNhbCB7XG4gIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMCwgMCwgMCwgMC4yNSk7XG4gIC13ZWJraXQtYm9yZGVyLXJhZGl1czogNXB4O1xufVxuOjotd2Via2l0LXNjcm9sbGJhci10aHVtYjpob3Jpem9udGFsIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjI1KTtcbiAgLXdlYmtpdC1ib3JkZXItcmFkaXVzOiA1cHg7XG59XG46Oi13ZWJraXQtc2Nyb2xsYmFyOmhvdmVyIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjE1KTtcbn1cbjo6LXdlYmtpdC1zY3JvbGxiYXItdGh1bWI6aG92ZXIge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuMzUpO1xufVxuLnNlY3Rpb24ge1xuICBtYXJnaW46IDFlbSAwO1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLnNlY3Rpb25fX2hlYWRlcixcbi5zZWN0aW9uX19jb250ZW50LFxuLnNlY3Rpb25fX2Zvb3RlciB7XG4gIG1hcmdpbjogMDtcbiAgcGFkZGluZzogMCAzZW07XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4uc2VjdGlvbl9fdGl0bGUge1xuICBjb2xvcjogIzY2Njtcbn1cbi5zZWN0aW9uX19oMyB7XG4gIGNvbG9yOiAjNTA3YWZlO1xuICBmb250LXNpemU6IDEuMzVlbTtcbn1cbi5zZWN0aW9uX19oNCB7XG4gIGZvbnQtc2l6ZTogMS4xZW07XG4gIGNvbG9yOiAjNjY2O1xufVxuLnNlY3Rpb25fX2g1IHtcbiAgZm9udC1zaXplOiAxZW07XG4gIGNvbG9yOiAjOTk5O1xufVxuLnNlY3Rpb25fX2RsLFxuLnNlY3Rpb25fX2R0LFxuLnNlY3Rpb25fX2RkIHtcbiAgbWFyZ2luOiAwO1xuICBwYWRkaW5nOiAwO1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLnNlY3Rpb25fX2RsIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICB6LWluZGV4OiAxO1xufVxuLnNlY3Rpb25fX2R0IHtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xufVxuLnNlY3Rpb25fX2RkIHtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICBjb2xvcjogIzA1ODk0Mjtcbn1cbi5zZWN0aW9uX19wcmUge1xuICBtYXJnaW46IDJlbSAwO1xuICBwYWRkaW5nOiAxZW07XG4gIGZvbnQtc2l6ZTogMTRweDtcbiAgbGluZS1oZWlnaHQ6IDE1MCU7XG4gIHRleHQtYWxpZ246IGxlZnQ7XG4gIGJhY2tncm91bmQtY29sb3I6ICNmYWZhZmE7XG4gIGJvcmRlcjogMXB4IHNvbGlkICNkZGQ7XG4gIGJvcmRlci1yYWRpdXM6IDRweDtcbiAgY29sb3I6ICM2NjY7XG4gIG92ZXJmbG93OiBhdXRvO1xufVxuLnNlY3Rpb25fX2NvZGUge1xuICBkaXNwbGF5OiBibG9jaztcbiAgbWFyZ2luOiAwIGF1dG87XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4uc2VjdGlvbl9fZm9vdGVyIHtcbiAgYm9yZGVyLXRvcDogMXB4IHNvbGlkICNkZGQ7XG4gIG1hcmdpbi10b3A6IDNlbTtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ZhZmFmYTtcbiAgY29sb3I6ICM5OTk7XG59XG4uc2VjdGlvbl9fdGFibGUge1xuICBtYXJnaW46IDFlbSBhdXRvO1xuICB3aWR0aDogMTAwJTtcbiAgYm9yZGVyLXRvcDogMXB4IHNvbGlkICNkZGQ7XG59XG4uc2VjdGlvbl9fdGgsXG4uc2VjdGlvbl9fdGQge1xuICBwYWRkaW5nOiA1cHggMTZweDtcbiAgbGluZS1oZWlnaHQ6IDI2cHg7XG4gIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjZGRkO1xufVxuLnNlY3Rpb25fX3RoIHtcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmFmYWZhO1xufVxuQG1lZGlhIChtYXgtd2lkdGg6IDUwMHB4KSB7XG4gIC5zZWN0aW9uX19oZWFkZXIsXG4gIC5zZWN0aW9uX19jb250ZW50IHtcbiAgICBwYWRkaW5nOiAwIDFlbTtcbiAgfVxufVxuLmNhc2Uge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIHotaW5kZXg6IDE7XG4gIGRpc3BsYXk6IGdyaWQ7XG4gIGdyaWQtdGVtcGxhdGUtY29sdW1uczogcmVwZWF0KDIsIDFmcik7XG4gIGdhcDogNDBweDtcbiAgcGFkZGluZzogMWVtO1xuICBib3JkZXItdG9wOiAxcHggc29saWQgI2RkZDtcbiAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNkZGQ7XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4uY2FzZTphZnRlciB7XG4gIGNvbnRlbnQ6ICcnO1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHotaW5kZXg6IDI7XG4gIHRvcDogMDtcbiAgbGVmdDogNTAlO1xuICBoZWlnaHQ6IDEwMCU7XG4gIHdpZHRoOiAwO1xuICBib3JkZXItbGVmdDogMXB4IHNvbGlkICNkZGQ7XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4uY2FzZV9fcHJlLFxuLmNhc2VfX3RleHRhcmVhIHtcbiAgZm9udC1zaXplOiAxM3B4O1xuICBsaW5lLWhlaWdodDogMTUwJTtcbn1cbi5jYXNlX19wcmUsXG4uY2FzZV9fY29kZSxcbi5jYXNlX190ZXh0YXJlYSB7XG4gIGZvbnQtZmFtaWx5OiAnQ291cmllciBOZXcnLCBDb25zb2xhcywgR2VvcmdpYSwgQXJpYWwsIHNhbnMtc2VyaWY7XG59XG4uY2FzZV9fcHJlIHtcbiAgbWFyZ2luOiAwO1xuICBwYWRkaW5nOiAxZW07XG4gIGJhY2tncm91bmQtY29sb3I6ICNmYWZhZmE7XG4gIGhlaWdodDogMTAwJTtcbiAgYm9yZGVyLXJhZGl1czogNHB4O1xuICAtd2Via2l0LWJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgb3ZlcmZsb3c6IGF1dG87XG59XG4uY2FzZV9fdG9vbGJhciB7XG4gIG1hcmdpbjogMCBhdXRvO1xuICBoZWlnaHQ6IDM2cHg7XG4gIGxpbmUtaGVpZ2h0OiAzNnB4O1xuICBmb250LXNpemU6IDE0cHg7XG4gIHBhZGRpbmc6IDAgMTZweDtcbiAgdGV4dC1hbGlnbjogcmlnaHQ7XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4uY2FzZV9fYWN0aW9uLFxuLmNhc2VfX3JlbW92ZSB7XG4gIGN1cnNvcjogcG9pbnRlcjtcbiAgY29sb3I6ICMwNTg5NDI7XG4gIC13ZWJraXQtdXNlci1zZWxlY3Q6IG5vbmU7XG4gICAgIC1tb3otdXNlci1zZWxlY3Q6IG5vbmU7XG4gICAgICAtbXMtdXNlci1zZWxlY3Q6IG5vbmU7XG4gICAgICAgICAgdXNlci1zZWxlY3Q6IG5vbmU7XG59XG4uY2FzZV9fYWN0aW9uIHtcbiAgZm9udC1zaXplOiAxM3B4O1xuICBwYWRkaW5nLWxlZnQ6IDEwcHg7XG59XG4uY2FzZV9fYWN0aW9uOmZpcnN0LWNoaWxkIHtcbiAgcGFkZGluZy1sZWZ0OiAwO1xufVxuLmNhc2VfX3JlbW92ZSB7XG4gIGZsb2F0OiByaWdodDtcbn1cbi5jYXNlX19jb25zb2xlIHtcbiAgbWFyZ2luOiAwIGF1dG87XG4gIGhlaWdodDogMTgwcHg7XG4gIGJvcmRlcjogMXB4IHNvbGlkICNkZGQ7XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4uY2FzZV9fdGV4dGFyZWEge1xuICBtYXJnaW46IDAgYXV0bztcbiAgd2lkdGg6IDEwMCU7XG4gIGhlaWdodDogMTAwJTtcbiAgYm9yZGVyOiBub25lO1xuICBvdXRsaW5lOiBub25lO1xuICBwYWRkaW5nOiAxZW07XG4gIC13ZWJraXQtYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICBvdmVyZmxvdzogYXV0bztcbn1cbi5jYXNlX19saXN0LFxuLmNhc2VfX2l0ZW0ge1xuICBtYXJnaW46IDA7XG4gIHBhZGRpbmc6IDA7XG4gIGxpc3Qtc3R5bGUtdHlwZTogbm9uZTtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi5jYXNlX19saXN0IHtcbiAgaGVpZ2h0OiAzNjBweDtcbiAgYm9yZGVyLXRvcDogMXB4IHNvbGlkICNkZGQ7XG4gIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjZGRkO1xuICBmb250LXNpemU6IDEzcHg7XG4gIG92ZXJmbG93OiBhdXRvO1xufVxuLmNhc2VfX2l0ZW0ge1xuICBoZWlnaHQ6IDM2cHg7XG4gIGxpbmUtaGVpZ2h0OiAzNnB4O1xuICBjdXJzb3I6IHBvaW50ZXI7XG4gIHBhZGRpbmc6IDAgMTZweDtcbn1cbi5jYXNlX19pdGVtOmhvdmVyIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2Y3ZjhmOTtcbn1cbi8qKlxuICogbWl4aW5zLmxlc3MgLSDlt6Xlhbflh73mlbBcbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIENyZWF0ZWQgQnk6IFlhb2hhaXhpYW9cbiAqIFVwZGF0ZTogMjAyMi4zLjExXG4gKi9cbi8qKlxuICogcmFkaXVzLmxlc3MgLSDlnIbop5Lorr7nva4gbWl4aW54IOWHveaVsFxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogQ3JlYXRlZCBCeTogWWFvaGFpeGlhb1xuICogVXBkYXRlOiAyMDI0LjQuMTZcbiAqL1xuLyogPT09PT09IOWchuinkuagt+W8j+iuvue9ruWHveaVsCA9PT09PT0gKi9cbi5wYXBlciB7XG4gIC13ZWJraXQtYm94LXNoYWRvdzogMCAwIDZweCAxcHggI2RjZGZlNjtcbiAgICAgICAgICBib3gtc2hhZG93OiAwIDAgNnB4IDFweCAjZGNkZmU2O1xuICBtYXJnaW46IDNlbSBhdXRvO1xuICBtYXgtd2lkdGg6IDEyMDBweDtcbiAgcGFkZGluZzogMmVtO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmO1xuICAtd2Via2l0LWJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbn1cbi5wYXBlci5mbGV4IHtcbiAgZGlzcGxheTogLXdlYmtpdC1ib3g7XG4gIGRpc3BsYXk6IC1tcy1mbGV4Ym94O1xuICBkaXNwbGF5OiBmbGV4O1xuICAtd2Via2l0LWJveC1vcmllbnQ6IGhvcml6b250YWw7XG4gIC13ZWJraXQtYm94LWRpcmVjdGlvbjogbm9ybWFsO1xuICAgICAgLW1zLWZsZXgtZGlyZWN0aW9uOiByb3c7XG4gICAgICAgICAgZmxleC1kaXJlY3Rpb246IHJvdztcbiAgLW1zLWZsZXgtd3JhcDogbm93cmFwO1xuICAgICAgZmxleC13cmFwOiBub3dyYXA7XG4gIG1hcmdpbjogMDtcbiAgd2lkdGg6IDEwMCU7XG4gIG1heC13aWR0aDogMTAwJTtcbiAgaGVpZ2h0OiAxMDAlO1xuICBwYWRkaW5nOiAwO1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLnBhcGVyLmZsZXggLmFydGljbGUge1xuICAtd2Via2l0LWJveC1vcmllbnQ6IHZlcnRpY2FsO1xuICAtd2Via2l0LWJveC1kaXJlY3Rpb246IG5vcm1hbDtcbiAgICAgIC1tcy1mbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gIHdpZHRoOiAxMDAlO1xuICAtd2Via2l0LWJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbn1cbi5wYXBlci5mbGV4IC5hcnRpY2xlX19tYWluIHtcbiAgaGVpZ2h0OiAxMDAlO1xuICAtd2Via2l0LWJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgb3ZlcmZsb3c6IGF1dG87XG59XG4ucGFwZXIuZmxleCAuYXJ0aWNsZV9fYXNpZGUge1xuICBib3JkZXItcmlnaHQ6IDFweCBzb2xpZCAjZGNkZmU2O1xufVxuLmhlYWRlciB7XG4gIHBvc2l0aW9uOiBzdGlja3k7XG4gIHotaW5kZXg6IDM7XG4gIHRvcDogMDtcbiAgbWFyZ2luOiAwIGF1dG87XG4gIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjZGRkO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmO1xuICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gIC13ZWJraXQtdHJhbnNpdGlvbi1kdXJhdGlvbjogMC4zcztcbiAgICAgICAgICB0cmFuc2l0aW9uLWR1cmF0aW9uOiAwLjNzO1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLmhlYWRlcl9zdGlja3kge1xuICBwYWRkaW5nLWxlZnQ6IDI2MHB4O1xufVxuLmFydGljbGUge1xuICBkaXNwbGF5OiAtd2Via2l0LWJveDtcbiAgZGlzcGxheTogLW1zLWZsZXhib3g7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIC13ZWJraXQtYm94LW9yaWVudDogaG9yaXpvbnRhbDtcbiAgLXdlYmtpdC1ib3gtZGlyZWN0aW9uOiBub3JtYWw7XG4gICAgICAtbXMtZmxleC1kaXJlY3Rpb246IHJvdztcbiAgICAgICAgICBmbGV4LWRpcmVjdGlvbjogcm93O1xuICAtbXMtZmxleC13cmFwOiBub3dyYXA7XG4gICAgICBmbGV4LXdyYXA6IG5vd3JhcDtcbiAgcGFkZGluZzogMmVtIDA7XG4gIGZvbnQtc2l6ZTogMTZweDtcbiAgbGluZS1oZWlnaHQ6IDE1MCU7XG59XG4uYXJ0aWNsZV9fbWFpbiB7XG4gIC13ZWJraXQtYm94LWZsZXg6IDE7XG4gICAgICAtbXMtZmxleDogMTtcbiAgICAgICAgICBmbGV4OiAxO1xuICBwYWRkaW5nOiAwIDJlbTtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi5hcnRpY2xlX19tYWluIC5zZWN0aW9uIHtcbiAgb3ZlcmZsb3c6IHZpc2libGU7XG59XG4uYXJ0aWNsZV9fbWFpbiAuc2VjdGlvbl9fY29udGVudCxcbi5hcnRpY2xlX19tYWluIC5zZWN0aW9uX19mb290ZXIsXG4uYXJ0aWNsZV9fbWFpbiAuc2VjdGlvbl9faGVhZGVyIHtcbiAgb3ZlcmZsb3c6IHZpc2libGU7XG59XG4uYXJ0aWNsZV9fbWFpbiAuc2VjdGlvbl9faGVhZGVyLFxuLmFydGljbGVfX21haW4gLnNlY3Rpb25fX2NvbnRlbnQge1xuICBtYXJnaW46IDA7XG59XG4uYXJ0aWNsZV9fYXNpZGUge1xuICAtbXMtZmxleC1uZWdhdGl2ZTogMDtcbiAgICAgIGZsZXgtc2hyaW5rOiAwO1xuICB3aWR0aDogMjQwcHg7XG4gIGJvcmRlci1sZWZ0OiAxcHggc29saWQgI2RkZDtcbn1cbi5hcnRpY2xlX19hc2lkZS5sdHIge1xuICBib3JkZXItcmlnaHQ6IDFweCBzb2xpZCAjZGRkO1xuICBib3JkZXItbGVmdDogbm9uZTtcbn1cbi5hcnRpY2xlX19hc2lkZSAub3V0bGluZS1uYXZpZ2F0b3Ige1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmO1xufVxucHJlLFxuLnNlY3Rpb25fX3ByZSB7XG4gIHBhZGRpbmc6IDJlbTtcbiAgZm9udC1mYW1pbHk6ICdDb3VyaWVyIE5ldycsIEFyaWFsLCBzYW5zLXNlcmlmO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmFmYWZhO1xuICBvdmVyZmxvdzogYXV0bztcbn1cbmNvZGUsXG4uc2VjdGlvbl9fY29kZSB7XG4gIGZvbnQtZmFtaWx5OiAnQ291cmllciBOZXcnLCBBcmlhbCwgc2Fucy1zZXJpZjtcbiAgZm9udC1zaXplOiAxNnB4O1xufVxuLmZvb3RlciB7XG4gIGJvcmRlci10b3A6IDFweCBzb2xpZCAjZGNkZmU2O1xuICBwYWRkaW5nOiAzZW0gMDtcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xufVxuLmZvb3RlciBhOmxpbmssXG4uZm9vdGVyIGE6dmlzaXRlZCxcbi5mb290ZXIgYTpob3ZlciB7XG4gIHRleHQtZGVjb3JhdGlvbjogbm9uZTtcbiAgY29sb3I6ICMwNTg5NDI7XG59XG4uZm9vdGVyIGE6aG92ZXIge1xuICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTtcbn1cbi51dGlscy1ib3JkZXItcmlnaHQge1xuICBib3JkZXItcmlnaHQ6IDFweCBzb2xpZCAjZGNkZmU2O1xufVxuLmhpZGRlbiB7XG4gIGRpc3BsYXk6IG5vbmU7XG59XG5AbWVkaWEgKG1heC13aWR0aDogNTAwcHgpIHtcbiAgaHRtbCxcbiAgYm9keSB7XG4gICAgbWFyZ2luOiAwO1xuICB9XG4gIC5wYXBlciB7XG4gICAgbWFyZ2luOiAwO1xuICAgIHBhZGRpbmc6IDA7XG4gIH1cbiAgLmFydGljbGVfX21haW4ge1xuICAgIHBhZGRpbmc6IDAgMmVtO1xuICB9XG59XG46cm9vdCB7XG4gIC0tb3V0bGluZS16SW5kZXg6IDIwMDA7XG4gIC0tb3V0bGluZS1zdGlja3ktaGVpZ2h0OiAxMDAlO1xuICAtLW91dGxpbmUtbmF2aWdhdG9yLXdpZHRoOiAxMDAlO1xufVxuLyogPT09PT09PT09PSBjb2xvcnMudGhlbWUgLSDln7rnoYDpopzoibLlj5jph4/pm4blkIggPT09PT09PT09PSAqL1xuLyoqXG4gKiBlbGxpcHNpcy5sZXNzIC0g5paH5pys55yB55WlIG1peGlueCDlh73mlbBcbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIENyZWF0ZWQgQnk6IFlhb2hhaXhpYW9cbiAqIFVwZGF0ZTogMjAyMi4zLjExXG4gKi9cbi8qID09PT09PSDmlofmnKznnIHnlaXlh73mlbAgPT09PT09ICovXG4vKipcbiAqIHNoYWRvdy5sZXNzIC0g6Zi05b2x5qC35byP6K6+572uIG1peGlueCDlh73mlbBcbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIENyZWF0ZWQgQnk6IFlhb2hhaXhpYW9cbiAqIFVwZGF0ZTogMjAyMi4zLjIwXG4gKi9cbi8qID09PT09PSDpmLTlvbHmoLflvI/orr7nva7lh73mlbAgPT09PT09ICovXG4vKiA9PT09PT09PT09IGljb24udGhlbWUgLSBzdmcg5Zu+5qCH55qE5qC35byPID09PT09PT09PT0gKi9cbi5vdXRsaW5lLWljb24ge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIHotaW5kZXg6IDE7XG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgdmVydGljYWwtYWxpZ246IG1pZGRsZTtcbiAgd2lkdGg6IDFlbTtcbiAgaGVpZ2h0OiAxZW07XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4ub3V0bGluZS1pY29uX19zdmcge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHotaW5kZXg6IDI7XG4gIHRvcDogNTAlO1xuICBsZWZ0OiA1MCU7XG4gIHdpZHRoOiAxZW07XG4gIGhlaWdodDogMWVtO1xuICBmaWxsOiBjdXJyZW50Y29sb3I7XG4gIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgLTUwJSk7XG4gICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgLTUwJSk7XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4ub3V0bGluZS1pY29uX2hpZGRlbiB7XG4gIGRpc3BsYXk6IG5vbmU7XG59XG4ub3V0bGluZS1oZWFkaW5nIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICB6LWluZGV4OiAxO1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLm91dGxpbmUtaGVhZGluZ19fYW5jaG9yIHtcbiAgZGlzcGxheTogbm9uZTtcbn1cbi5vdXRsaW5lLWhlYWRpbmdfX2FuY2hvcjpsaW5rLFxuLm91dGxpbmUtaGVhZGluZ19fYW5jaG9yOnZpc2l0ZWQsXG4ub3V0bGluZS1oZWFkaW5nX19hbmNob3I6aG92ZXIge1xuICBjb2xvcjogIzk5OTtcbiAgdGV4dC1kZWNvcmF0aW9uOiBub25lO1xufVxuLm91dGxpbmUtaGVhZGluZ19fYW5jaG9yOmhvdmVyIHtcbiAgY29sb3I6ICM1MDdhZmU7XG59XG4ub3V0bGluZS1oZWFkaW5nOmhvdmVyIC5vdXRsaW5lLWhlYWRpbmdfX2FuY2hvciB7XG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbn1cbi5vdXRsaW5lLWhlYWRpbmdfc3RhcnQ6aG92ZXIge1xuICBvdmVyZmxvdzogdmlzaWJsZTtcbn1cbi5vdXRsaW5lLWhlYWRpbmdfc3RhcnQgLm91dGxpbmUtaGVhZGluZ19fYW5jaG9yIHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB6LWluZGV4OiAyO1xuICB0b3A6IDUwJTtcbiAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTUwJSk7XG4gICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC01MCUpO1xuICBsZWZ0OiAtMWVtO1xufVxuLm91dGxpbmUtZHJhd2VyIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICB6LWluZGV4OiAtMTtcbiAgdG9wOiAwO1xuICBsZWZ0OiAwO1xuICBtYXJnaW46IDA7XG4gIHdpZHRoOiAxMDAlO1xuICBoZWlnaHQ6IDEwMCU7XG4gIC13ZWJraXQtYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICB2aXNpYmlsaXR5OiBoaWRkZW47XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4ub3V0bGluZS1kcmF3ZXJfX21vZGFsIHtcbiAgLXdlYmtpdC1ib3gtc2hhZG93OiAwIDAgNnB4IDFweCAjZGNkZmU2O1xuICAgICAgICAgIGJveC1zaGFkb3c6IDAgMCA2cHggMXB4ICNkY2RmZTY7XG4gIGRpc3BsYXk6IC13ZWJraXQtYm94O1xuICBkaXNwbGF5OiAtbXMtZmxleGJveDtcbiAgZGlzcGxheTogZmxleDtcbiAgLXdlYmtpdC1ib3gtb3JpZW50OiB2ZXJ0aWNhbDtcbiAgLXdlYmtpdC1ib3gtZGlyZWN0aW9uOiBub3JtYWw7XG4gICAgICAtbXMtZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAtbXMtZmxleC13cmFwOiBub3dyYXA7XG4gICAgICBmbGV4LXdyYXA6IG5vd3JhcDtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB6LWluZGV4OiAyMTtcbiAgaGVpZ2h0OiAxMDAlO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmO1xuICAtd2Via2l0LXRyYW5zaXRpb24tZHVyYXRpb246IDAuNHM7XG4gICAgICAgICAgdHJhbnNpdGlvbi1kdXJhdGlvbjogMC40cztcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi5vdXRsaW5lLWRyYXdlcl9faGVhZGVyLFxuLm91dGxpbmUtZHJhd2VyX19tYWluLFxuLm91dGxpbmUtZHJhd2VyX19mb290ZXIge1xuICB3aWR0aDogMTAwJTtcbiAgLXdlYmtpdC1ib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG59XG4ub3V0bGluZS1kcmF3ZXJfX2hlYWRlcixcbi5vdXRsaW5lLWRyYXdlcl9fZm9vdGVyIHtcbiAgLW1zLWZsZXgtbmVnYXRpdmU6IDA7XG4gICAgICBmbGV4LXNocmluazogMDtcbn1cbi5vdXRsaW5lLWRyYXdlcl9fdGl0bGUsXG4ub3V0bGluZS1kcmF3ZXJfX21haW4sXG4ub3V0bGluZS1kcmF3ZXJfX2Zvb3RlciB7XG4gIHBhZGRpbmc6IDAgMTZweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl9faGVhZGVyLFxuLm91dGxpbmUtZHJhd2VyX190aXRsZSB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgei1pbmRleDogMTtcbiAgbWFyZ2luOiAwIGF1dG87XG4gIGhlaWdodDogNTJweDtcbiAgbGluZS1oZWlnaHQ6IDUycHg7XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4ub3V0bGluZS1kcmF3ZXJfX3RpdGxlIHtcbiAgZm9udC1zaXplOiAxNnB4O1xuICBmb250LXdlaWdodDogNDAwO1xuICBtYXJnaW46IDAgMTZweDtcbiAgLXdlYmtpdC1ib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjZGNkZmU2O1xufVxuLm91dGxpbmUtZHJhd2VyX19jbG9zZSB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgei1pbmRleDogMjtcbiAgdG9wOiA1MCU7XG4gIHJpZ2h0OiAxMnB4O1xuICB3aWR0aDogMjBweDtcbiAgaGVpZ2h0OiAyMHB4O1xuICBsaW5lLWhlaWdodDogMjBweDtcbiAgY29sb3I6ICM5OTk7XG4gIGZvbnQtc2l6ZTogMjBweDtcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xuICBjdXJzb3I6IHBvaW50ZXI7XG4gIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC01MCUpO1xuICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtNTAlKTtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi5vdXRsaW5lLWRyYXdlcl9fY2xvc2UgLm91dGxpbmUtaWNvbiB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgei1pbmRleDogMjtcbiAgdG9wOiAwO1xuICBsZWZ0OiAwO1xufVxuLm91dGxpbmUtZHJhd2VyX19jbG9zZTpob3ZlciB7XG4gIGNvbG9yOiAjNjY2O1xufVxuLm91dGxpbmUtZHJhd2VyX19tYWluIHtcbiAgLXdlYmtpdC1ib3gtZmxleDogMTtcbiAgICAgIC1tcy1mbGV4OiAxO1xuICAgICAgICAgIGZsZXg6IDE7XG4gIG92ZXJmbG93OiBhdXRvO1xufVxuLm91dGxpbmUtZHJhd2VyX19tYWluLm92ZXJmbG93LWhpZGRlbiB7XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4ub3V0bGluZS1kcmF3ZXJfX2Zvb3RlciB7XG4gIG1hcmdpbjogMCBhdXRvO1xuICB0ZXh0LWFsaWduOiByaWdodDtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi5vdXRsaW5lLWRyYXdlcl9fb3ZlcmxheSB7XG4gIGNvbnRlbnQ6ICcnO1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIHotaW5kZXg6IDE7XG4gIHRvcDogMDtcbiAgbGVmdDogMDtcbiAgd2lkdGg6IDEwMCU7XG4gIGhlaWdodDogMTAwJTtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjtcbiAgb3BhY2l0eTogMC4xO1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLm91dGxpbmUtZHJhd2VyX3J0bC5vdXRsaW5lLWRyYXdlcl90aW55LFxuLm91dGxpbmUtZHJhd2VyX2x0ci5vdXRsaW5lLWRyYXdlcl90aW55IHtcbiAgd2lkdGg6IDI4MHB4O1xufVxuLm91dGxpbmUtZHJhd2VyX3J0bC5vdXRsaW5lLWRyYXdlcl9taW5pLFxuLm91dGxpbmUtZHJhd2VyX2x0ci5vdXRsaW5lLWRyYXdlcl9taW5pIHtcbiAgd2lkdGg6IDQ4MHB4O1xufVxuLm91dGxpbmUtZHJhd2VyX3J0bC5vdXRsaW5lLWRyYXdlcl9zbWFsbCxcbi5vdXRsaW5lLWRyYXdlcl9sdHIub3V0bGluZS1kcmF3ZXJfc21hbGwge1xuICB3aWR0aDogNTQwcHg7XG59XG4ub3V0bGluZS1kcmF3ZXJfcnRsLm91dGxpbmUtZHJhd2VyX3JlZ3VsYXIsXG4ub3V0bGluZS1kcmF3ZXJfbHRyLm91dGxpbmUtZHJhd2VyX3JlZ3VsYXIge1xuICB3aWR0aDogNjgwcHg7XG59XG4ub3V0bGluZS1kcmF3ZXJfcnRsLm91dGxpbmUtZHJhd2VyX21lZGl1bSxcbi5vdXRsaW5lLWRyYXdlcl9sdHIub3V0bGluZS1kcmF3ZXJfbWVkaXVtIHtcbiAgd2lkdGg6IDcyMHB4O1xufVxuLm91dGxpbmUtZHJhd2VyX3J0bC5vdXRsaW5lLWRyYXdlcl9sYXJnZSxcbi5vdXRsaW5lLWRyYXdlcl9sdHIub3V0bGluZS1kcmF3ZXJfbGFyZ2Uge1xuICB3aWR0aDogOTYwcHg7XG59XG4ub3V0bGluZS1kcmF3ZXJfcnRsIHtcbiAgYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjZGNkZmU2O1xufVxuLm91dGxpbmUtZHJhd2VyX3J0bC5vdXRsaW5lLWRyYXdlcl90aW55Lm91dGxpbmUtZHJhd2VyX2Nsb3NlZCB7XG4gIHJpZ2h0OiAtMjkwcHg7XG59XG4ub3V0bGluZS1kcmF3ZXJfcnRsLm91dGxpbmUtZHJhd2VyX21pbmkub3V0bGluZS1kcmF3ZXJfY2xvc2VkIHtcbiAgcmlnaHQ6IC00OTBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl9ydGwub3V0bGluZS1kcmF3ZXJfc21hbGwub3V0bGluZS1kcmF3ZXJfY2xvc2VkIHtcbiAgcmlnaHQ6IC01NTBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl9ydGwub3V0bGluZS1kcmF3ZXJfcmVndWxhci5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xuICByaWdodDogLTY5MHB4O1xufVxuLm91dGxpbmUtZHJhd2VyX3J0bC5vdXRsaW5lLWRyYXdlcl9tZWRpdW0ub3V0bGluZS1kcmF3ZXJfY2xvc2VkIHtcbiAgcmlnaHQ6IC03MzBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl9ydGwub3V0bGluZS1kcmF3ZXJfbGFyZ2Uub3V0bGluZS1kcmF3ZXJfY2xvc2VkIHtcbiAgcmlnaHQ6IC05NzBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl9sdHIge1xuICBib3JkZXItcmlnaHQ6IDFweCBzb2xpZCAjZGNkZmU2O1xufVxuLm91dGxpbmUtZHJhd2VyX2x0ci5vdXRsaW5lLWRyYXdlcl90aW55Lm91dGxpbmUtZHJhd2VyX2Nsb3NlZCB7XG4gIGxlZnQ6IC0yOTBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl9sdHIub3V0bGluZS1kcmF3ZXJfbWluaS5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xuICBsZWZ0OiAtNDkwcHg7XG59XG4ub3V0bGluZS1kcmF3ZXJfbHRyLm91dGxpbmUtZHJhd2VyX3NtYWxsLm91dGxpbmUtZHJhd2VyX2Nsb3NlZCB7XG4gIGxlZnQ6IC01NTBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl9sdHIub3V0bGluZS1kcmF3ZXJfcmVndWxhci5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xuICBsZWZ0OiAtNjkwcHg7XG59XG4ub3V0bGluZS1kcmF3ZXJfbHRyLm91dGxpbmUtZHJhd2VyX21lZGl1bS5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xuICBsZWZ0OiAtNzMwcHg7XG59XG4ub3V0bGluZS1kcmF3ZXJfbHRyLm91dGxpbmUtZHJhd2VyX2xhcmdlLm91dGxpbmUtZHJhd2VyX2Nsb3NlZCB7XG4gIGxlZnQ6IC05NzBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl90dGIsXG4ub3V0bGluZS1kcmF3ZXJfYnR0IHtcbiAgbGVmdDogMDtcbiAgd2lkdGg6IDEwMCU7XG59XG4ub3V0bGluZS1kcmF3ZXJfdHRiLm91dGxpbmUtZHJhd2VyX3RpbnksXG4ub3V0bGluZS1kcmF3ZXJfYnR0Lm91dGxpbmUtZHJhd2VyX3Rpbnkge1xuICBoZWlnaHQ6IDI0MHB4O1xufVxuLm91dGxpbmUtZHJhd2VyX3R0Yi5vdXRsaW5lLWRyYXdlcl9taW5pLFxuLm91dGxpbmUtZHJhd2VyX2J0dC5vdXRsaW5lLWRyYXdlcl9taW5pIHtcbiAgaGVpZ2h0OiAzMjBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl90dGIub3V0bGluZS1kcmF3ZXJfc21hbGwsXG4ub3V0bGluZS1kcmF3ZXJfYnR0Lm91dGxpbmUtZHJhd2VyX3NtYWxsIHtcbiAgaGVpZ2h0OiAzNjBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl90dGIub3V0bGluZS1kcmF3ZXJfcmVndWxhcixcbi5vdXRsaW5lLWRyYXdlcl9idHQub3V0bGluZS1kcmF3ZXJfcmVndWxhciB7XG4gIGhlaWdodDogNDAwcHg7XG59XG4ub3V0bGluZS1kcmF3ZXJfdHRiLm91dGxpbmUtZHJhd2VyX21lZGl1bSxcbi5vdXRsaW5lLWRyYXdlcl9idHQub3V0bGluZS1kcmF3ZXJfbWVkaXVtIHtcbiAgaGVpZ2h0OiA0NDBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl90dGIub3V0bGluZS1kcmF3ZXJfbGFyZ2UsXG4ub3V0bGluZS1kcmF3ZXJfYnR0Lm91dGxpbmUtZHJhd2VyX2xhcmdlIHtcbiAgaGVpZ2h0OiA0ODBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl90dGIge1xuICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI2RjZGZlNjtcbn1cbi5vdXRsaW5lLWRyYXdlcl90dGIub3V0bGluZS1kcmF3ZXJfdGlueS5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xuICB0b3A6IC0yNTBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl90dGIub3V0bGluZS1kcmF3ZXJfbWluaS5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xuICB0b3A6IC0zMzBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl90dGIub3V0bGluZS1kcmF3ZXJfc21hbGwub3V0bGluZS1kcmF3ZXJfY2xvc2VkIHtcbiAgdG9wOiAtMzcwcHg7XG59XG4ub3V0bGluZS1kcmF3ZXJfdHRiLm91dGxpbmUtZHJhd2VyX3JlZ3VsYXIub3V0bGluZS1kcmF3ZXJfY2xvc2VkIHtcbiAgdG9wOiAtNDEwcHg7XG59XG4ub3V0bGluZS1kcmF3ZXJfdHRiLm91dGxpbmUtZHJhd2VyX21lZGl1bS5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xuICB0b3A6IC00NTBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl90dGIub3V0bGluZS1kcmF3ZXJfbGFyZ2Uub3V0bGluZS1kcmF3ZXJfY2xvc2VkIHtcbiAgdG9wOiAtNDkwcHg7XG59XG4ub3V0bGluZS1kcmF3ZXJfYnR0IHtcbiAgdG9wOiBpbml0aWFsO1xuICBib3JkZXItdG9wOiAxcHggc29saWQgI2RjZGZlNjtcbn1cbi5vdXRsaW5lLWRyYXdlcl9idHQub3V0bGluZS1kcmF3ZXJfdGlueS5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xuICBib3R0b206IC0yNTBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl9idHQub3V0bGluZS1kcmF3ZXJfbWluaS5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xuICBib3R0b206IC0zMzBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl9idHQub3V0bGluZS1kcmF3ZXJfc21hbGwub3V0bGluZS1kcmF3ZXJfY2xvc2VkIHtcbiAgYm90dG9tOiAtMzcwcHg7XG59XG4ub3V0bGluZS1kcmF3ZXJfYnR0Lm91dGxpbmUtZHJhd2VyX3JlZ3VsYXIub3V0bGluZS1kcmF3ZXJfY2xvc2VkIHtcbiAgYm90dG9tOiAtNDEwcHg7XG59XG4ub3V0bGluZS1kcmF3ZXJfYnR0Lm91dGxpbmUtZHJhd2VyX21lZGl1bS5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xuICBib3R0b206IC00NTBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl9idHQub3V0bGluZS1kcmF3ZXJfbGFyZ2Uub3V0bGluZS1kcmF3ZXJfY2xvc2VkIHtcbiAgYm90dG9tOiAtNDkwcHg7XG59XG4ub3V0bGluZS1kcmF3ZXJfb3BlbmVkIHtcbiAgdmlzaWJpbGl0eTogdmlzaWJsZTtcbiAgei1pbmRleDogdmFyKC0tb3V0bGluZS16SW5kZXgpO1xufVxuLm91dGxpbmUtZHJhd2VyX29wZW5lZC5vdXRsaW5lLWRyYXdlciB7XG4gIHBvc2l0aW9uOiBmaXhlZDtcbn1cbi5vdXRsaW5lLWRyYXdlcl9vcGVuZWQub3V0bGluZS1kcmF3ZXJfcnRsIHtcbiAgcmlnaHQ6IDA7XG59XG4ub3V0bGluZS1kcmF3ZXJfb3BlbmVkLm91dGxpbmUtZHJhd2VyX2x0ciB7XG4gIGxlZnQ6IDA7XG59XG4ub3V0bGluZS1kcmF3ZXJfb3BlbmVkLm91dGxpbmUtZHJhd2VyX3R0YiB7XG4gIHRvcDogMDtcbn1cbi5vdXRsaW5lLWRyYXdlcl9vcGVuZWQub3V0bGluZS1kcmF3ZXJfYnR0IHtcbiAgYm90dG9tOiAwO1xufVxuLm91dGxpbmUtZHJhd2VyX29mZnNldC5vdXRsaW5lLWRyYXdlcl9ydGwsXG4ub3V0bGluZS1kcmF3ZXJfb2Zmc2V0Lm91dGxpbmUtZHJhd2VyX2x0ciB7XG4gIGhlaWdodDogY2FsYygxMDAlIC0gNGVtKTtcbiAgdG9wOiA1MCU7XG4gIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC01MCUpO1xuICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtNTAlKTtcbn1cbi5vdXRsaW5lLWRyYXdlcl9vZmZzZXQub3V0bGluZS1kcmF3ZXJfdHRiLFxuLm91dGxpbmUtZHJhd2VyX29mZnNldC5vdXRsaW5lLWRyYXdlcl9idHQge1xuICB3aWR0aDogY2FsYygxMDAlIC0gNGVtKTtcbiAgbGVmdDogNTAlO1xuICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlWCgtNTAlKTtcbiAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTUwJSk7XG59XG4ub3V0bGluZS1kcmF3ZXJfb2Zmc2V0Lm91dGxpbmUtZHJhd2VyX29wZW5lZC5vdXRsaW5lLWRyYXdlcl9ydGwge1xuICByaWdodDogMmVtO1xufVxuLm91dGxpbmUtZHJhd2VyX29mZnNldC5vdXRsaW5lLWRyYXdlcl9vcGVuZWQub3V0bGluZS1kcmF3ZXJfbHRyIHtcbiAgbGVmdDogMmVtO1xufVxuLm91dGxpbmUtZHJhd2VyX29mZnNldC5vdXRsaW5lLWRyYXdlcl9vcGVuZWQub3V0bGluZS1kcmF3ZXJfdHRiIHtcbiAgdG9wOiAyZW07XG59XG4ub3V0bGluZS1kcmF3ZXJfb2Zmc2V0Lm91dGxpbmUtZHJhd2VyX29wZW5lZC5vdXRsaW5lLWRyYXdlcl9idHQge1xuICBib3R0b206IDJlbTtcbn1cbi5vdXRsaW5lLWRyYXdlcl9hdXRvLm91dGxpbmUtZHJhd2VyX3J0bCxcbi5vdXRsaW5lLWRyYXdlcl9hdXRvLm91dGxpbmUtZHJhd2VyX2x0ciB7XG4gIGhlaWdodDogYXV0bztcbiAgbWF4LWhlaWdodDogY2FsYygxMDAlIC0gNGVtKTtcbn1cbi5vdXRsaW5lLWRyYXdlcl9mdWxsIHtcbiAgcGFkZGluZzogMDtcbn1cbi5vdXRsaW5lLW5hdmlnYXRvciB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgei1pbmRleDogMTtcbiAgbWFyZ2luOiAwO1xuICB3aWR0aDogdmFyKC0tb3V0bGluZS1uYXZpZ2F0b3Itd2lkdGgpO1xuICBvdmVyZmxvdzogYXV0bztcbn1cbi5vdXRsaW5lLW5hdmlnYXRvci1wYXJlbnQge1xuICAtd2Via2l0LXRyYW5zaXRpb246IDAuM3MgZWFzZS1pbi1vdXQ7XG4gIHRyYW5zaXRpb246IDAuM3MgZWFzZS1pbi1vdXQ7XG59XG4ub3V0bGluZS1uYXZpZ2F0b3JfX3RpdGxlIHtcbiAgbWFyZ2luOiAwIDE2cHg7XG4gIGhlaWdodDogNDBweDtcbiAgbGluZS1oZWlnaHQ6IDQwcHg7XG4gIHBhZGRpbmc6IDAgMTZweDtcbiAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNkY2RmZTY7XG4gIGZvbnQtc2l6ZTogMTZweDtcbiAgZm9udC13ZWlnaHQ6IDQwMDtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi5vdXRsaW5lLW5hdmlnYXRvcl9fbWFpbiB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgei1pbmRleDogMTtcbiAgbWFyZ2luOiAwO1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLm91dGxpbmUtbmF2aWdhdG9yX19saXN0LFxuLm91dGxpbmUtbmF2aWdhdG9yX19zdWJqZWN0LFxuLm91dGxpbmUtbmF2aWdhdG9yX19pdGVtIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICB6LWluZGV4OiAyO1xuICBtYXJnaW46IDA7XG4gIHBhZGRpbmc6IDA7XG4gIGxpc3Qtc3R5bGUtdHlwZTogbm9uZTtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi5vdXRsaW5lLW5hdmlnYXRvcl9fbGlzdCB7XG4gIHBhZGRpbmc6IDAuNWVtIDA7XG59XG4ub3V0bGluZS1uYXZpZ2F0b3JfX3N1YmplY3Qge1xuICBwYWRkaW5nLWxlZnQ6IDFlbTtcbn1cbi5vdXRsaW5lLW5hdmlnYXRvcl9faXRlbSB7XG4gIG1hcmdpbjogMDtcbiAgbGluZS1oZWlnaHQ6IDMwcHg7XG4gIGZvbnQtc2l6ZTogMTNweDtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi5vdXRsaW5lLW5hdmlnYXRvcl9fcGxhY2Vob2xkZXIge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHotaW5kZXg6IDE7XG4gIHRvcDogMDtcbiAgbGVmdDogMDtcbiAgd2lkdGg6IDEwMCU7XG4gIGhlaWdodDogMzBweDtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2Y3ZjhmOTtcbiAgYm9yZGVyLWxlZnQ6IDJweCBzb2xpZCAjMDU4OTQyO1xuICAtd2Via2l0LXRyYW5zaXRpb24tZHVyYXRpb246IDAuMnM7XG4gICAgICAgICAgdHJhbnNpdGlvbi1kdXJhdGlvbjogMC4ycztcbiAgLXdlYmtpdC1ib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4ub3V0bGluZS1uYXZpZ2F0b3JfX2FuY2hvciB7XG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzO1xuICBvdmVyZmxvdzogaGlkZGVuO1xuICBkaXNwbGF5OiBibG9jaztcbiAgcGFkZGluZzogMCAxLjVlbTtcbn1cbi5vdXRsaW5lLW5hdmlnYXRvcl9fYW5jaG9yOmxpbmssXG4ub3V0bGluZS1uYXZpZ2F0b3JfX2FuY2hvcjp2aXNpdGVkLFxuLm91dGxpbmUtbmF2aWdhdG9yX19hbmNob3I6aG92ZXIge1xuICB0ZXh0LWRlY29yYXRpb246IG5vbmU7XG4gIGNvbG9yOiAjNTU1O1xufVxuLm91dGxpbmUtbmF2aWdhdG9yX19hbmNob3I6aG92ZXIge1xuICBjb2xvcjogIzA1ODk0Mjtcbn1cbi5vdXRsaW5lLW5hdmlnYXRvcl9fY29kZSB7XG4gIHBhZGRpbmctcmlnaHQ6IDAuNWVtO1xufVxuLm91dGxpbmUtbmF2aWdhdG9yX2hpZ2hsaWdodC5vdXRsaW5lLW5hdmlnYXRvcl9fYW5jaG9yOmxpbmssXG4ub3V0bGluZS1uYXZpZ2F0b3JfaGlnaGxpZ2h0Lm91dGxpbmUtbmF2aWdhdG9yX19hbmNob3I6dmlzaXRlZCxcbi5vdXRsaW5lLW5hdmlnYXRvcl9oaWdobGlnaHQub3V0bGluZS1uYXZpZ2F0b3JfX2FuY2hvcjpob3ZlciB7XG4gIGNvbG9yOiAjMDU4OTQyO1xuICBmb250LXdlaWdodDogYm9sZDtcbn1cbi5vdXRsaW5lLW5hdmlnYXRvcl9zdGlja3ksXG4ub3V0bGluZS1uYXZpZ2F0b3JfZml4ZWQge1xuICBkaXNwbGF5OiAtd2Via2l0LWJveDtcbiAgZGlzcGxheTogLW1zLWZsZXhib3g7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIC1tcy1mbGV4LXdyYXA6IG5vd3JhcDtcbiAgICAgIGZsZXgtd3JhcDogbm93cmFwO1xuICAtd2Via2l0LWJveC1vcmllbnQ6IHZlcnRpY2FsO1xuICAtd2Via2l0LWJveC1kaXJlY3Rpb246IG5vcm1hbDtcbiAgICAgIC1tcy1mbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gIHotaW5kZXg6IHZhcigtLW91dGxpbmUtekluZGV4KTtcbiAgdG9wOiAwO1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLm91dGxpbmUtbmF2aWdhdG9yX3N0aWNreSAub3V0bGluZS1uYXZpZ2F0b3JfX3RpdGxlLFxuLm91dGxpbmUtbmF2aWdhdG9yX2ZpeGVkIC5vdXRsaW5lLW5hdmlnYXRvcl9fdGl0bGUsXG4ub3V0bGluZS1uYXZpZ2F0b3Jfc3RpY2t5IC5vdXRsaW5lLW5hdmlnYXRvcl9fbWFpbixcbi5vdXRsaW5lLW5hdmlnYXRvcl9maXhlZCAub3V0bGluZS1uYXZpZ2F0b3JfX21haW4ge1xuICAtd2Via2l0LWJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbn1cbi5vdXRsaW5lLW5hdmlnYXRvcl9zdGlja3kgLm91dGxpbmUtbmF2aWdhdG9yX190aXRsZSxcbi5vdXRsaW5lLW5hdmlnYXRvcl9maXhlZCAub3V0bGluZS1uYXZpZ2F0b3JfX3RpdGxlIHtcbiAgLW1zLWZsZXgtbmVnYXRpdmU6IDA7XG4gICAgICBmbGV4LXNocmluazogMDtcbn1cbi5vdXRsaW5lLW5hdmlnYXRvcl9zdGlja3kgLm91dGxpbmUtbmF2aWdhdG9yX19tYWluLFxuLm91dGxpbmUtbmF2aWdhdG9yX2ZpeGVkIC5vdXRsaW5lLW5hdmlnYXRvcl9fbWFpbiB7XG4gIC13ZWJraXQtYm94LWZsZXg6IDE7XG4gICAgICAtbXMtZmxleDogMTtcbiAgICAgICAgICBmbGV4OiAxO1xuICBvdmVyZmxvdzogYXV0bztcbn1cbi5vdXRsaW5lLW5hdmlnYXRvcl9zdGlja3kge1xuICBwb3NpdGlvbjogc3RpY2t5O1xuICBtYXgtaGVpZ2h0OiB2YXIoLS1vdXRsaW5lLXN0aWNreS1oZWlnaHQpO1xufVxuLm91dGxpbmUtbmF2aWdhdG9yX2ZpeGVkIHtcbiAgcG9zaXRpb246IGZpeGVkO1xuICBtYXgtaGVpZ2h0OiAxMDAlO1xufVxuLm91dGxpbmUtbmF2aWdhdG9yX2hpZGRlbiB7XG4gIGRpc3BsYXk6IG5vbmU7XG59XG4ub3V0bGluZS1uYXZpZ2F0b3JfZm9sZGVkIHtcbiAgd2lkdGg6IDA7XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4vKipcbiAqIGZvbnQubGVzcyAtIOWtl+S9k+ebuOWFs+agt+W8j1xuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogQ3JlYXRlZCBCeTogWWFvaGFpeGlhb1xuICogVXBkYXRlOiAyMDIyLjMuMTZcbiAqL1xuLyogPT09PT09IOWtl+S9kyA9PT09PT0gKi9cbi8qID09PT09PSDlrZfph40gPT09PT09ICovXG4vKiA9PT09PT0g5a2X5Y+3ID09PT09PSAqL1xuLm91dGxpbmUtcmVhZGVyX19wcm9ncmVzcyB7XG4gIHBvc2l0aW9uOiBmaXhlZDtcbiAgdG9wOiAwO1xuICBsZWZ0OiAwO1xuICB6LWluZGV4OiAzO1xuICBoZWlnaHQ6IDRweDtcbiAgd2lkdGg6IDEwMCU7XG4gIGJhY2tncm91bmQtY29sb3I6ICM1MDdhZmU7XG4gIHNjYWxlOiAwIDE7XG4gIC13ZWJraXQtdHJhbnNmb3JtLW9yaWdpbjogbGVmdDtcbiAgICAgICAgICB0cmFuc2Zvcm0tb3JpZ2luOiBsZWZ0O1xuICAtd2Via2l0LWFuaW1hdGlvbjogb3V0bGluZS1yZWFkZXItcHJvZ3Jlc3MgbGluZWFyO1xuICAgICAgICAgIGFuaW1hdGlvbjogb3V0bGluZS1yZWFkZXItcHJvZ3Jlc3MgbGluZWFyO1xuICBhbmltYXRpb24tdGltZWxpbmU6IC0tUHJvZ3Jlc3NUaW1lbGluZTtcbn1cbi5vdXRsaW5lLXJlYWRlcl9fcGFwZXIge1xuICAtd2Via2l0LWJveC1zaGFkb3c6IDAgMCA2cHggMXB4ICNkZGQ7XG4gICAgICAgICAgYm94LXNoYWRvdzogMCAwIDZweCAxcHggI2RkZDtcbiAgbWFyZ2luOiAyZW0gYXV0bztcbiAgbWF4LXdpZHRoOiAxMjAwcHg7XG4gIHBhZGRpbmc6IDMuMmVtO1xuICAtd2Via2l0LWJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi5vdXRsaW5lLXJlYWRlcl9fdGl0bGUge1xuICBtYXJnaW46IDAuNjdlbSAwO1xuICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gIGZvbnQtZmFtaWx5OiAtYXBwbGUtc3lzdGVtLCBCbGlua01hY1N5c3RlbUZvbnQsICdTZWdvZSBVSScsICdQaW5nRmFuZyBTQycsICdIaXJhZ2lubyBTYW5zIEdCJywgJ01pY3Jvc29mdCBZYUhlaScsICdIZWx2ZXRpY2EgTmV1ZScsICdBcHBsZSBDb2xvciBFbW9qaScsICdTZWdvZSBVSSBFbW9qaScsICdTZWdvZSBVSSBTeW1ib2wnLCBIZWx2ZXRpY2EsIEFyaWFsLCBzYW5zLXNlcmlmO1xuICBmb250LXdlaWdodDogbm9ybWFsO1xuICBsaW5lLWhlaWdodDogMS4zZW07XG4gIGZvbnQtc2l6ZTogNC4yZW07XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4ub3V0bGluZS1yZWFkZXJfX2FydGljbGUgLm91dGxpbmUtcmVhZGVyX19wcm9ncmVzcyB7XG4gIGRpc3BsYXk6IG5vbmU7XG59XG4ub3V0bGluZS1yZWFkZXJfaGlkZGVuIHtcbiAgZGlzcGxheTogbm9uZTtcbn1cbi5vdXRsaW5lLXJlYWRlcl9oaWRkZW4ub3V0bGluZS1yZWFkZXJfc2libGluZyB7XG4gIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDtcbn1cbi5vdXRsaW5lLXJlYWRlcl9oaWRkZW4ub3V0bGluZS1yZWFkZXJfc2libGluZy53cmFwcGVyLnBvc3Qge1xuICBkaXNwbGF5OiBub25lO1xufVxuLm91dGxpbmUtcmVhZGVyLS1yZWFkaW5nIHtcbiAgZGlzcGxheTogYmxvY2s7XG4gIHBvc2l0aW9uOiBmaXhlZDtcbiAgei1pbmRleDogMjtcbiAgdG9wOiAwO1xuICBsZWZ0OiAwO1xuICB3aWR0aDogMTAwJTtcbiAgaGVpZ2h0OiAxMDAlO1xuICBtYXJnaW46IDA7XG4gIC13ZWJraXQtYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICBwYWRkaW5nOiAzZW0gNGVtO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmFmYWZhO1xuICBzY3JvbGwtdGltZWxpbmUtbmFtZTogLS1Qcm9ncmVzc1RpbWVsaW5lO1xuICBvdmVyZmxvdzogc2Nyb2xsO1xufVxuQC13ZWJraXQta2V5ZnJhbWVzIG91dGxpbmUtcmVhZGVyLXByb2dyZXNzIHtcbiAgdG8ge1xuICAgIHNjYWxlOiAxIDE7XG4gIH1cbn1cbkBrZXlmcmFtZXMgb3V0bGluZS1yZWFkZXItcHJvZ3Jlc3Mge1xuICB0byB7XG4gICAgc2NhbGU6IDEgMTtcbiAgfVxufVxuQG1lZGlhIChtYXgtd2lkdGg6IDUwMHB4KSB7XG4gIC5vdXRsaW5lLXJlYWRlciB7XG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgfVxuICAub3V0bGluZS1yZWFkZXIgLm91dGxpbmUtdG9vbGJhciB7XG4gICAgZGlzcGxheTogLXdlYmtpdC1ib3g7XG4gICAgZGlzcGxheTogLW1zLWZsZXhib3g7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICAtd2Via2l0LWJveC1vcmllbnQ6IGhvcml6b250YWw7XG4gICAgLXdlYmtpdC1ib3gtZGlyZWN0aW9uOiBub3JtYWw7XG4gICAgICAgIC1tcy1mbGV4LWRpcmVjdGlvbjogcm93O1xuICAgICAgICAgICAgZmxleC1kaXJlY3Rpb246IHJvdztcbiAgICAtbXMtZmxleC13cmFwOiBub3dyYXA7XG4gICAgICAgIGZsZXgtd3JhcDogbm93cmFwO1xuICAgIC13ZWJraXQtYm94LWFsaWduOiBjZW50ZXI7XG4gICAgICAgIC1tcy1mbGV4LWFsaWduOiBjZW50ZXI7XG4gICAgICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgIC1tcy1mbGV4LWl0ZW0tYWxpZ246IGF1dG87XG4gICAgICAgIGFsaWduLXNlbGY6IGF1dG87XG4gICAgdG9wOiAxMDAlO1xuICAgIHJpZ2h0OiAwO1xuICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC00OHB4KTtcbiAgICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtNDhweCk7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgaGVpZ2h0OiA0OHB4O1xuICAgIC13ZWJraXQtYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICAgICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgYm9yZGVyLXRvcDogMXB4IHNvbGlkICNkZGQ7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjtcbiAgICBwYWRkaW5nOiAwIDE2cHg7XG4gIH1cbiAgLm91dGxpbmUtcmVhZGVyIC5vdXRsaW5lLXRvb2xiYXJfX2J1dHRvbiB7XG4gICAgYm9yZGVyLXJhZGl1czogMDtcbiAgICAtd2Via2l0LWJveC1mbGV4OiAxO1xuICAgICAgICAtbXMtZmxleDogMTtcbiAgICAgICAgICAgIGZsZXg6IDE7XG4gICAgYm9yZGVyOiBub25lO1xuICAgIC13ZWJraXQtYm94LXNoYWRvdzogbm9uZTtcbiAgICAgICAgICAgIGJveC1zaGFkb3c6IG5vbmU7XG4gIH1cbiAgLm91dGxpbmUtcmVhZGVyLS1yZWFkaW5nIHtcbiAgICBwYWRkaW5nOiAwO1xuICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmY7XG4gICAgLXdlYmtpdC1ib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgICAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgfVxuICAub3V0bGluZS1yZWFkZXJfX3BhcGVyIHtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgei1pbmRleDogMTtcbiAgICBtYXJnaW46IDA7XG4gICAgcGFkZGluZzogMDtcbiAgICBoZWlnaHQ6IDEwMCU7XG4gICAgLXdlYmtpdC1ib3gtc2hhZG93OiBub25lO1xuICAgICAgICAgICAgYm94LXNoYWRvdzogbm9uZTtcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xuICB9XG4gIC5vdXRsaW5lLXJlYWRlcl9fdGl0bGUge1xuICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIHotaW5kZXg6IDM7XG4gICAgdG9wOiAwO1xuICAgIGxlZnQ6IDA7XG4gICAgbWFyZ2luOiAwO1xuICAgIHdpZHRoOiAxMDAlO1xuICAgIGhlaWdodDogNDhweDtcbiAgICBsaW5lLWhlaWdodDogNDhweDtcbiAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI2RkZDtcbiAgICBmb250LXNpemU6IDEuOGVtO1xuICAgIGZvbnQtd2VpZ2h0OiA0MDA7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjtcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xuICB9XG4gIC5vdXRsaW5lLXJlYWRlcl9fYXJ0aWNsZSB7XG4gICAgbWFyZ2luOiA0OHB4IDA7XG4gICAgaGVpZ2h0OiBjYWxjKDEwMCUgLSA5NnB4KTtcbiAgICBwYWRkaW5nOiAwIDEuMjVlbTtcbiAgICBzY3JvbGwtdGltZWxpbmUtbmFtZTogLS1Nb2JpbGVQcm9ncmVzc1RpbWVsaW5lO1xuICAgIG92ZXJmbG93LXg6IGhpZGRlbjtcbiAgICBvdmVyZmxvdy15OiBzY3JvbGw7XG4gIH1cbiAgLm91dGxpbmUtcmVhZGVyX19hcnRpY2xlIC5vdXRsaW5lLXJlYWRlcl9fcHJvZ3Jlc3Mge1xuICAgIHotaW5kZXg6IDQ7XG4gICAgLXdlYmtpdC1hbmltYXRpb246IG91dGxpbmUtcmVhZGVyLXByb2dyZXNzIGxpbmVhcjtcbiAgICAgICAgICAgIGFuaW1hdGlvbjogb3V0bGluZS1yZWFkZXItcHJvZ3Jlc3MgbGluZWFyO1xuICAgIGFuaW1hdGlvbi10aW1lbGluZTogLS1Nb2JpbGVQcm9ncmVzc1RpbWVsaW5lO1xuICAgIGRpc3BsYXk6IGJsb2NrO1xuICB9XG59XG5AbWVkaWEgcHJpbnQge1xuICBodG1sLFxuICBib2R5IHtcbiAgICAvKiDmiZPljbDnmoTln7rnoYDlrZfkvZPlpKflsI8gKi9cbiAgICBmb250LXNpemU6IDEycHQ7XG4gICAgLyog5pi+56S66K6+572u5paH5a2X6aKc6Imy5ZKM6IOM5pmv6aKc6ImyICovXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjtcbiAgICBjb2xvcjogIzMzMztcbiAgICBoZWlnaHQ6IGluaXRpYWwgIWltcG9ydGFudDtcbiAgfVxuICAvKiDorr7nva7pk77mjqXmoLflvI8gKi9cbiAgYTpsaW5rLFxuICBhOnZpc2l0ZWQsXG4gIGE6aG92ZXIge1xuICAgIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lICFpbXBvcnRhbnQ7XG4gICAgY29sb3I6ICM1MDdhZmU7XG4gIH1cbiAgLyog6ZqQ6JeP5aqS5L2T5qCH562+ICovXG4gIHZpZGVvLFxuICBhdWRpbyB7XG4gICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50O1xuICB9XG4gIC8qIOehruS/neihqOagvOWcqOaJk+WNsOaXtueahOi+ueahhuWSjOWvuem9kOaWueW8j+a4heaZsCAqL1xuICB0YWJsZSB7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTtcbiAgfVxuICB0aCxcbiAgdGQge1xuICAgIGJvcmRlcjogMXB4IHNvbGlkICNkY2RmZTY7XG4gICAgcGFkZGluZzogOHB4IDIwcHg7XG4gIH1cbiAgLm91dGxpbmUtbWVzc2FnZSxcbiAgLm91dGxpbmUtdG9vbGJhciB7XG4gICAgLyog6ZqQ6JeP5LqG5bel5YW35qCP5ZKM5L+h5oGv5o+Q56S65qGGICovXG4gICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50O1xuICB9XG4gIC5vdXRsaW5lLXJlYWRlciB7XG4gICAgZGlzcGxheTogYmxvY2sgIWltcG9ydGFudDtcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgIC8qIOWPlua2iOS6hue7neWvueWumuS9jSAqL1xuICAgIC8qIOmakOiXj+mYheivu+i/m+W6puadoSAqL1xuICAgIC8qIOaJk+WNsOaXtuS4jeaYvuekuuato+aWhyBET00g55qE6Zi05b2x5pWI5p6cICovXG4gICAgLyog5omA5pyJ5paH56ug5YaF5a65IERPTSDnm7jlhbPnmoTpgrvlsYXoioLngrnpg73pmpDol4/kuoYgKi9cbiAgfVxuICAub3V0bGluZS1yZWFkZXJfX3RpdGxlIHtcbiAgICBtYXJnaW46IDEzLjRwdCAwIDI4cHQgIWltcG9ydGFudDtcbiAgICB0ZXh0LWFsaWduOiBjZW50ZXIgIWltcG9ydGFudDtcbiAgICBmb250LXNpemU6IDMycHQgIWltcG9ydGFudDtcbiAgfVxuICAub3V0bGluZS1yZWFkZXItLXJlYWRpbmcge1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZSAhaW1wb3J0YW50O1xuICAgIGhlaWdodDogYXV0byAhaW1wb3J0YW50O1xuICAgIHBhZGRpbmc6IDAgIWltcG9ydGFudDtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmO1xuICAgIG92ZXJmbG93OiBoaWRkZW4gIWltcG9ydGFudDtcbiAgfVxuICAub3V0bGluZS1yZWFkZXJfX3Byb2dyZXNzIHtcbiAgICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7XG4gIH1cbiAgLm91dGxpbmUtcmVhZGVyX19wYXBlciB7XG4gICAgLXdlYmtpdC1ib3gtc2hhZG93OiBub25lO1xuICAgICAgICAgICAgYm94LXNoYWRvdzogbm9uZTtcbiAgfVxuICAub3V0bGluZS1yZWFkZXIgcHJlIHtcbiAgICBwYWRkaW5nOiAxZW0gIWltcG9ydGFudDtcbiAgICBib3JkZXI6IDFweCBzb2xpZCAjZGRkICFpbXBvcnRhbnQ7XG4gICAgYm9yZGVyLXJhZGl1czogNHB4ICFpbXBvcnRhbnQ7XG4gIH1cbiAgLm91dGxpbmUtcmVhZGVyIHByZSxcbiAgLm91dGxpbmUtcmVhZGVyIGNvZGUge1xuICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmYgIWltcG9ydGFudDtcbiAgfVxuICAub3V0bGluZS1yZWFkZXIgdGFibGUsXG4gIC5vdXRsaW5lLXJlYWRlciBpbWcsXG4gIC5vdXRsaW5lLXJlYWRlciBzdmcge1xuICAgIC13ZWJraXQtY29sdW1uLWJyZWFrLWluc2lkZTogYXZvaWQ7XG4gICAgICAgLW1vei1jb2x1bW4tYnJlYWstaW5zaWRlOiBhdm9pZDtcbiAgICAgICAgICAgIGJyZWFrLWluc2lkZTogYXZvaWQ7XG4gIH1cbiAgLm91dGxpbmUtcmVhZGVyX3NpYmxpbmcge1xuICAgIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDtcbiAgfVxufVxuLyogPT09PT09PT09PSBidXR0b25zLnRoZW1lIC0g5oyJ6ZKu5a+86Iiq5qC35byPID09PT09PT09PT0gKi9cbi5vdXRsaW5lLXRvb2xiYXIge1xuICBwb3NpdGlvbjogZml4ZWQ7XG4gIHotaW5kZXg6IDk5OTk5O1xuICBtYXJnaW46IDA7XG4gIC13ZWJraXQtdHJhbnNpdGlvbi1kdXJhdGlvbjogMC4zcztcbiAgICAgICAgICB0cmFuc2l0aW9uLWR1cmF0aW9uOiAwLjNzO1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLm91dGxpbmUtdG9vbGJhcl9fYnV0dG9uIHtcbiAgLXdlYmtpdC1ib3gtc2hhZG93OiAwIDAgNnB4IDFweCAjZGNkZmU2O1xuICAgICAgICAgIGJveC1zaGFkb3c6IDAgMCA2cHggMXB4ICNkY2RmZTY7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgei1pbmRleDogMTtcbiAgbWFyZ2luOiAxMHB4O1xuICB3aWR0aDogMzZweDtcbiAgaGVpZ2h0OiAzNnB4O1xuICBib3JkZXI6IDFweCBzb2xpZCAjZGNkZmU2O1xuICBib3JkZXItcmFkaXVzOiAzcHg7XG4gIC13ZWJraXQtYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmO1xuICBjdXJzb3I6IHBvaW50ZXI7XG4gIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgY29sb3I6ICM5OTk7XG4gIC13ZWJraXQtdHJhbnNpdGlvbjogYWxsIDAuM3MgMC4xcyBlYXNlLWluLW91dDtcbiAgdHJhbnNpdGlvbjogYWxsIDAuM3MgMC4xcyBlYXNlLWluLW91dDtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi5vdXRsaW5lLXRvb2xiYXJfX2J1dHRvbjpob3ZlciB7XG4gIGNvbG9yOiAjMDU4OTQyO1xuICBib3JkZXItY29sb3I6ICMwNTg5NDI7XG4gIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZSgxLjM1KTtcbiAgICAgICAgICB0cmFuc2Zvcm06IHNjYWxlKDEuMzUpO1xufVxuLm91dGxpbmUtdG9vbGJhcl9fYnV0dG9uLmhpZGUge1xuICBkaXNwbGF5OiBub25lO1xufVxuLm91dGxpbmUtdG9vbGJhcl9fYW5jaG9yOmxpbmssXG4ub3V0bGluZS10b29sYmFyX19hbmNob3I6dmlzaXRlZCxcbi5vdXRsaW5lLXRvb2xiYXJfX2FuY2hvcjpob3ZlciB7XG4gIGNvbG9yOiAjOTk5O1xuICB0ZXh0LWRlY29yYXRpb246IG5vbmU7XG59XG4ub3V0bGluZS10b29sYmFyX19hbmNob3I6aG92ZXIge1xuICBjb2xvcjogIzA1ODk0Mjtcbn1cbi5vdXRsaW5lLXRvb2xiYXJfX2ljb24ge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHotaW5kZXg6IDI7XG4gIHRvcDogNTAlO1xuICBsZWZ0OiA1MCU7XG4gIHdpZHRoOiAyMHB4O1xuICBoZWlnaHQ6IDIwcHg7XG4gIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgLTUwJSk7XG4gICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgLTUwJSk7XG4gIGZpbGw6IGN1cnJlbnRjb2xvcjtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi5vdXRsaW5lLXRvb2xiYXJfYWN0aXZlLm91dGxpbmUtdG9vbGJhcl9fYnV0dG9uIHtcbiAgY29sb3I6ICNmZmY7XG4gIGJhY2tncm91bmQtY29sb3I6ICMwNTg5NDI7XG4gIGJvcmRlci1jb2xvcjogIzA1ODk0Mjtcbn1cbi5vdXRsaW5lLXRvb2xiYXJfYWN0aXZlLm91dGxpbmUtdG9vbGJhcl9fYnV0dG9uOmhvdmVyIHtcbiAgY29sb3I6ICNmZmY7XG59XG4ub3V0bGluZS10b29sYmFyX2FjdGl2ZSAub3V0bGluZS10b29sYmFyX19hbmNob3I6bGluayxcbi5vdXRsaW5lLXRvb2xiYXJfYWN0aXZlIC5vdXRsaW5lLXRvb2xiYXJfX2FuY2hvcjp2aXNpdGVkLFxuLm91dGxpbmUtdG9vbGJhcl9hY3RpdmUgLm91dGxpbmUtdG9vbGJhcl9fYW5jaG9yOmhvdmVyIHtcbiAgY29sb3I6ICNmZmY7XG59XG4ub3V0bGluZS10b29sYmFyX3JvdW5kZWQub3V0bGluZS10b29sYmFyX19idXR0b24ge1xuICBib3JkZXItcmFkaXVzOiAxOHB4O1xufVxuLm91dGxpbmUtdG9vbGJhcl9kaXNhYmxlZC5vdXRsaW5lLXRvb2xiYXJfX2FuY2hvcjpsaW5rLFxuLm91dGxpbmUtdG9vbGJhcl9kaXNhYmxlZCAub3V0bGluZS10b29sYmFyX19hbmNob3I6bGluayxcbi5vdXRsaW5lLXRvb2xiYXJfZGlzYWJsZWQub3V0bGluZS10b29sYmFyX19hbmNob3I6dmlzaXRlZCxcbi5vdXRsaW5lLXRvb2xiYXJfZGlzYWJsZWQgLm91dGxpbmUtdG9vbGJhcl9fYW5jaG9yOnZpc2l0ZWQsXG4ub3V0bGluZS10b29sYmFyX2Rpc2FibGVkLm91dGxpbmUtdG9vbGJhcl9fYW5jaG9yOmhvdmVyLFxuLm91dGxpbmUtdG9vbGJhcl9kaXNhYmxlZCAub3V0bGluZS10b29sYmFyX19hbmNob3I6aG92ZXIsXG4ub3V0bGluZS10b29sYmFyX2Rpc2FibGVkLm91dGxpbmUtdG9vbGJhcl9fYnV0dG9uLFxuLm91dGxpbmUtdG9vbGJhcl9kaXNhYmxlZCAub3V0bGluZS10b29sYmFyX19idXR0b24ge1xuICBjdXJzb3I6IG5vdC1hbGxvd2VkO1xuICBjb2xvcjogIzk5OTtcbiAgYm9yZGVyLWNvbG9yOiAjOTk5O1xufVxuLm91dGxpbmUtdG9vbGJhcl9kaXNhYmxlZC5vdXRsaW5lLXRvb2xiYXJfX2FuY2hvcjpsaW5rOmhvdmVyLFxuLm91dGxpbmUtdG9vbGJhcl9kaXNhYmxlZCAub3V0bGluZS10b29sYmFyX19hbmNob3I6bGluazpob3Zlcixcbi5vdXRsaW5lLXRvb2xiYXJfZGlzYWJsZWQub3V0bGluZS10b29sYmFyX19hbmNob3I6dmlzaXRlZDpob3Zlcixcbi5vdXRsaW5lLXRvb2xiYXJfZGlzYWJsZWQgLm91dGxpbmUtdG9vbGJhcl9fYW5jaG9yOnZpc2l0ZWQ6aG92ZXIsXG4ub3V0bGluZS10b29sYmFyX2Rpc2FibGVkLm91dGxpbmUtdG9vbGJhcl9fYW5jaG9yOmhvdmVyOmhvdmVyLFxuLm91dGxpbmUtdG9vbGJhcl9kaXNhYmxlZCAub3V0bGluZS10b29sYmFyX19hbmNob3I6aG92ZXI6aG92ZXIsXG4ub3V0bGluZS10b29sYmFyX2Rpc2FibGVkLm91dGxpbmUtdG9vbGJhcl9fYnV0dG9uOmhvdmVyLFxuLm91dGxpbmUtdG9vbGJhcl9kaXNhYmxlZCAub3V0bGluZS10b29sYmFyX19idXR0b246aG92ZXIge1xuICBjb2xvcjogIzk5OTtcbiAgYm9yZGVyLWNvbG9yOiAjOTk5O1xufVxuLm91dGxpbmUtdG9vbGJhcl9kaXNhYmxlZC5vdXRsaW5lLXRvb2xiYXJfX2J1dHRvbixcbi5vdXRsaW5lLXRvb2xiYXJfZGlzYWJsZWQgLm91dGxpbmUtdG9vbGJhcl9fYnV0dG9uIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2Y1ZjVmNTtcbn1cbi5vdXRsaW5lLXRvb2xiYXJfdHRiLFxuLm91dGxpbmUtdG9vbGJhcl9idHQge1xuICBsZWZ0OiA1MCU7XG4gIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC01MCUpO1xuICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgtNTAlKTtcbn1cbi5vdXRsaW5lLXRvb2xiYXJfdHRiIC5vdXRsaW5lLXRvb2xiYXJfX2J1dHRvbixcbi5vdXRsaW5lLXRvb2xiYXJfYnR0IC5vdXRsaW5lLXRvb2xiYXJfX2J1dHRvbiB7XG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbn1cbi5vdXRsaW5lLXRvb2xiYXJfdHRiIHtcbiAgdG9wOiAxMnB4O1xufVxuLm91dGxpbmUtdG9vbGJhcl90dGIub3V0bGluZS10b29sYmFyX2hpZGRlbiB7XG4gIHRvcDogLTU2cHg7XG59XG4ub3V0bGluZS10b29sYmFyX2J0dCB7XG4gIGJvdHRvbTogMTJweDtcbn1cbi5vdXRsaW5lLXRvb2xiYXJfYnR0Lm91dGxpbmUtdG9vbGJhcl9oaWRkZW4ge1xuICBib3R0b206IC01NnB4O1xufVxuLm91dGxpbmUtdG9vbGJhcl9ydGwsXG4ub3V0bGluZS10b29sYmFyX2x0ciB7XG4gIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC01MCUpO1xuICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtNTAlKTtcbiAgd2lkdGg6IDU2cHg7XG59XG4ub3V0bGluZS10b29sYmFyX3J0bCB7XG4gIHRvcDogNTAlO1xuICByaWdodDogMTJweDtcbn1cbi5vdXRsaW5lLXRvb2xiYXJfcnRsLm91dGxpbmUtdG9vbGJhcl9oaWRkZW4ge1xuICByaWdodDogLTg2cHg7XG59XG4ub3V0bGluZS10b29sYmFyX2x0ciB7XG4gIHRvcDogNTAlO1xuICBsZWZ0OiAxMnB4O1xufVxuLm91dGxpbmUtdG9vbGJhcl9sdHIub3V0bGluZS10b29sYmFyX2hpZGRlbiB7XG4gIGxlZnQ6IC04NnB4O1xufVxuLm91dGxpbmUtdG9vbGJhcl90dGIgLm91dGxpbmUtdG9vbGJhcl9fYnV0dG9uLm91dGxpbmUtdG9vbGJhcl9oaWRkZW4sXG4ub3V0bGluZS10b29sYmFyX3J0bCAub3V0bGluZS10b29sYmFyX19idXR0b24ub3V0bGluZS10b29sYmFyX2hpZGRlbixcbi5vdXRsaW5lLXRvb2xiYXJfYnR0IC5vdXRsaW5lLXRvb2xiYXJfX2J1dHRvbi5vdXRsaW5lLXRvb2xiYXJfaGlkZGVuLFxuLm91dGxpbmUtdG9vbGJhcl9sdHIgLm91dGxpbmUtdG9vbGJhcl9fYnV0dG9uLm91dGxpbmUtdG9vbGJhcl9oaWRkZW4ge1xuICBkaXNwbGF5OiBub25lO1xufVxuLm91dGxpbmUtbWVzc2FnZSB7XG4gIGJvcmRlci1yYWRpdXM6IDNweDtcbiAgLXdlYmtpdC1ib3gtc2hhZG93OiAwIDAgNnB4IDFweCAjZGNkZmU2O1xuICAgICAgICAgIGJveC1zaGFkb3c6IDAgMCA2cHggMXB4ICNkY2RmZTY7XG4gIHBvc2l0aW9uOiBmaXhlZDtcbiAgei1pbmRleDogOTk5OTtcbiAgb3BhY2l0eTogMC4xO1xuICB0b3A6IC01MHB4O1xuICBsZWZ0OiA1MCU7XG4gIGhlaWdodDogNDBweDtcbiAgbWFyZ2luOiAwO1xuICBwYWRkaW5nOiAwIDUwcHg7XG4gIGxpbmUtaGVpZ2h0OiA0MHB4O1xuICBmb250LXNpemU6IDEzcHg7XG4gIGJhY2tncm91bmQtY29sb3I6ICNmZmY7XG4gIGNvbG9yOiAjNjY2O1xuICAtd2Via2l0LXRyYW5zaXRpb246IGFsbCAwLjVzIGVhc2UtaW4tb3V0O1xuICB0cmFuc2l0aW9uOiBhbGwgMC41cyBlYXNlLWluLW91dDtcbiAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTUwJSk7XG4gICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC01MCUpO1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLm91dGxpbmUtbWVzc2FnZV9fY29udGVudCB7XG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzO1xuICBtYXJnaW46IDA7XG4gIG1heC13aWR0aDogNzAwcHg7XG4gIGhlaWdodDogNDBweDtcbiAgbGluZS1oZWlnaHQ6IDQwcHg7XG4gIGZvbnQtc2l6ZTogMTNweDtcbiAgY29sb3I6ICM2NjY7XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4ub3V0bGluZS1tZXNzYWdlX19jbG9zZSxcbi5vdXRsaW5lLW1lc3NhZ2VfX2ljb24ge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHotaW5kZXg6IDI7XG4gIHRvcDogMDtcbiAgd2lkdGg6IDQwcHg7XG4gIGhlaWdodDogNDBweDtcbiAgbGluZS1oZWlnaHQ6IDQwcHg7XG4gIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi5vdXRsaW5lLW1lc3NhZ2VfX2ljb24ge1xuICBsZWZ0OiAwO1xuICBjb2xvcjogI2ZmZjtcbn1cbi5vdXRsaW5lLW1lc3NhZ2VfX2ljb24gLm91dGxpbmUtaWNvbiB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgei1pbmRleDogMjtcbiAgdG9wOiA1MCU7XG4gIGxlZnQ6IDUwJTtcbiAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCAtNTAlKTtcbiAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCAtNTAlKTtcbn1cbi5vdXRsaW5lLW1lc3NhZ2VfX2Nsb3NlIHtcbiAgcmlnaHQ6IDA7XG4gIGN1cnNvcjogcG9pbnRlcjtcbiAgY29sb3I6ICM5OTk7XG59XG4ub3V0bGluZS1tZXNzYWdlX19jbG9zZSAub3V0bGluZS1pY29uIHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB6LWluZGV4OiAyO1xuICB0b3A6IDUwJTtcbiAgbGVmdDogNTAlO1xuICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIC01MCUpO1xuICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIC01MCUpO1xufVxuLm91dGxpbmUtbWVzc2FnZV9fY2xvc2U6aG92ZXIge1xuICBjb2xvcjogIzY2Njtcbn1cbi5vdXRsaW5lLW1lc3NhZ2VfaW5mbyAub3V0bGluZS1tZXNzYWdlX19pY29uIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogIzUwN2FmZTtcbn1cbi5vdXRsaW5lLW1lc3NhZ2Vfd2FybmluZyAub3V0bGluZS1tZXNzYWdlX19pY29uIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ZmOTkwMTtcbn1cbi5vdXRsaW5lLW1lc3NhZ2Vfc3VjY2VzcyAub3V0bGluZS1tZXNzYWdlX19pY29uIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogIzA1ODk0Mjtcbn1cbi5vdXRsaW5lLW1lc3NhZ2VfZXJyb3IgLm91dGxpbmUtbWVzc2FnZV9faWNvbiB7XG4gIGJhY2tncm91bmQtY29sb3I6ICNmZjVkNWQ7XG59XG4ub3V0bGluZS1tZXNzYWdlX3BsYWluIHtcbiAgbWluLXdpZHRoOiAxOTBweDtcbiAgcGFkZGluZzogMCA1MHB4IDAgMTVweDtcbn1cbi5vdXRsaW5lLW1lc3NhZ2VfcGxhaW4ub3V0bGluZS1tZXNzYWdlX2luZm8ge1xuICBib3JkZXItbGVmdDogNXB4IHNvbGlkICM1MDdhZmU7XG4gIGJhY2tncm91bmQtY29sb3I6ICNlY2Y4ZmY7XG59XG4ub3V0bGluZS1tZXNzYWdlX3BsYWluLm91dGxpbmUtbWVzc2FnZV93YXJuaW5nIHtcbiAgYm9yZGVyLWxlZnQ6IDVweCBzb2xpZCAjZmY5OTAxO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmYmU2O1xufVxuLm91dGxpbmUtbWVzc2FnZV9wbGFpbi5vdXRsaW5lLW1lc3NhZ2Vfc3VjY2VzcyB7XG4gIGJvcmRlci1sZWZ0OiA1cHggc29saWQgIzA1ODk0MjtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2UxZjZlYjtcbn1cbi5vdXRsaW5lLW1lc3NhZ2VfcGxhaW4ub3V0bGluZS1tZXNzYWdlX2Vycm9yIHtcbiAgYm9yZGVyLWxlZnQ6IDVweCBzb2xpZCAjZmY1ZDVkO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmMWYwO1xufVxuLm91dGxpbmUtbWVzc2FnZV9wbGFpbiAub3V0bGluZS1tZXNzYWdlX19pY29uIHtcbiAgd2lkdGg6IDA7XG4gIGRpc3BsYXk6IG5vbmU7XG59XG4ub3V0bGluZS1tZXNzYWdlX3BsYWluIC5vdXRsaW5lLW1lc3NhZ2VfX2ljb24gLm91dGxpbmUtaWNvbiB7XG4gIGRpc3BsYXk6IG5vbmU7XG59XG4ub3V0bGluZS1tZXNzYWdlX2xpZ2h0IHtcbiAgbWluLXdpZHRoOiAxODBweDtcbiAgcGFkZGluZzogMCA0MHB4O1xufVxuLm91dGxpbmUtbWVzc2FnZV9saWdodC5vdXRsaW5lLW1lc3NhZ2VfaW5mbyAub3V0bGluZS1tZXNzYWdlX19pY29uIHtcbiAgY29sb3I6ICM1MDdhZmU7XG59XG4ub3V0bGluZS1tZXNzYWdlX2xpZ2h0Lm91dGxpbmUtbWVzc2FnZV93YXJuaW5nIC5vdXRsaW5lLW1lc3NhZ2VfX2ljb24ge1xuICBjb2xvcjogI2ZmOTkwMTtcbn1cbi5vdXRsaW5lLW1lc3NhZ2VfbGlnaHQub3V0bGluZS1tZXNzYWdlX3N1Y2Nlc3MgLm91dGxpbmUtbWVzc2FnZV9faWNvbiB7XG4gIGNvbG9yOiAjMDU4OTQyO1xufVxuLm91dGxpbmUtbWVzc2FnZV9saWdodC5vdXRsaW5lLW1lc3NhZ2VfZXJyb3IgLm91dGxpbmUtbWVzc2FnZV9faWNvbiB7XG4gIGNvbG9yOiAjZmY1ZDVkO1xufVxuLm91dGxpbmUtbWVzc2FnZV9saWdodCAub3V0bGluZS1tZXNzYWdlX19pY29uIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjtcbn1cbi5vdXRsaW5lLW1lc3NhZ2Vfcm91bmQge1xuICBib3JkZXItcmFkaXVzOiAyMHB4O1xufVxuLm91dGxpbmUtbWVzc2FnZV9yb3VuZC5vdXRsaW5lLW1lc3NhZ2VfZGVmYXVsdCB7XG4gIG1pbi13aWR0aDogMTgwcHg7XG4gIHBhZGRpbmc6IDAgNDBweDtcbn1cbi5vdXRsaW5lLW1lc3NhZ2Vfcm91bmQub3V0bGluZS1tZXNzYWdlX2RlZmF1bHQgLm91dGxpbmUtbWVzc2FnZV9faWNvbiB7XG4gIGJvcmRlci1yYWRpdXM6IDEwcHg7XG4gIHRvcDogMTBweDtcbiAgbGVmdDogMTBweDtcbiAgd2lkdGg6IDIwcHg7XG4gIGhlaWdodDogMjBweDtcbiAgbGluZS1oZWlnaHQ6IDIwcHg7XG59XG4ub3V0bGluZS1tZXNzYWdlX3JvdW5kLm91dGxpbmUtbWVzc2FnZV9kZWZhdWx0Lm91dGxpbmUtbWVzc2FnZV9mdWxsLXdpZHRoIHtcbiAgbWluLXdpZHRoOiAyMDBweDtcbiAgcGFkZGluZzogMCAyMHB4IDAgNDBweDtcbn1cbi5vdXRsaW5lLW1lc3NhZ2Vfcm91bmQub3V0bGluZS1tZXNzYWdlX3BsYWluIHtcbiAgbWluLXdpZHRoOiAxOTVweDtcbiAgcGFkZGluZzogMCA0MHB4IDAgMjBweDtcbn1cbi5vdXRsaW5lLW1lc3NhZ2Vfcm91bmQub3V0bGluZS1tZXNzYWdlX3BsYWluLm91dGxpbmUtbWVzc2FnZV9mdWxsLXdpZHRoIHtcbiAgbWluLXdpZHRoOiAyMTVweDtcbiAgcGFkZGluZzogMCAyMHB4O1xufVxuLm91dGxpbmUtbWVzc2FnZV9mdWxsLXdpZHRoIHtcbiAgbWluLXdpZHRoOiAyMDBweDtcbiAgcGFkZGluZzogMCAxMHB4IDAgNTBweDtcbn1cbi5vdXRsaW5lLW1lc3NhZ2VfZnVsbC13aWR0aC5vdXRsaW5lLW1lc3NhZ2VfcGxhaW4ge1xuICBtaW4td2lkdGg6IDIzMHB4O1xuICBwYWRkaW5nOiAwIDEwcHggMCAxNXB4O1xufVxuLm91dGxpbmUtbWVzc2FnZV9mdWxsLXdpZHRoLm91dGxpbmUtbWVzc2FnZV9saWdodCB7XG4gIG1pbi13aWR0aDogMjEwcHg7XG4gIHBhZGRpbmc6IDAgMTBweCAwIDQwcHg7XG59XG4ub3V0bGluZS1tZXNzYWdlX3Zpc2libGUge1xuICBvcGFjaXR5OiAxO1xufVxuLm91dGxpbmUtbWVzc2FnZV9oaWRkZW4ge1xuICBkaXNwbGF5OiBub25lO1xufVxuLyogPT09PT0gU2Nyb2xsYmFyID09PT09ICovXG46Oi13ZWJraXQtc2Nyb2xsYmFyIHtcbiAgd2lkdGg6IDdweDtcbiAgaGVpZ2h0OiA3cHg7XG4gIC13ZWJraXQtYm9yZGVyLXJhZGl1czogNXB4O1xufVxuOjotd2Via2l0LXNjcm9sbGJhci10cmFjay1waWVjZSB7XG4gIC13ZWJraXQtYm9yZGVyLXJhZGl1czogNXB4O1xufVxuOjotd2Via2l0LXNjcm9sbGJhci10aHVtYjp2ZXJ0aWNhbCB7XG4gIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMCwgMCwgMCwgMC4yNSk7XG4gIC13ZWJraXQtYm9yZGVyLXJhZGl1czogNXB4O1xufVxuOjotd2Via2l0LXNjcm9sbGJhci10aHVtYjpob3Jpem9udGFsIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjI1KTtcbiAgLXdlYmtpdC1ib3JkZXItcmFkaXVzOiA1cHg7XG59XG46Oi13ZWJraXQtc2Nyb2xsYmFyLXRodW1iOmhvdmVyIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjM1KTtcbn1cbjo6LXdlYmtpdC1zY3JvbGxiYXI6aG92ZXIge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuMTUpO1xufVxuXG4vKiMgc291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247Y2hhcnNldD11dGY4O2Jhc2U2NCxleUoyWlhKemFXOXVJam96TENKemIzVnlZMlZ6SWpwYklpNHVMeTR1THp4cGJuQjFkQ0JqYzNNZ01qNGlMQ0p6WTNKdmJHeGlZWEl1YkdWemN5SXNJbk5sWTNScGIyNHViR1Z6Y3lJc0ltTmhjMlV1YkdWemN5SXNJbkJoWjJWeUxteGxjM01pTENJdUxpOHVMaTkwYUdWdFpTOXphR0ZrYjNjdWJHVnpjeUlzSWk0dUx5NHVMM1JvWlcxbEwzWmhjbWxoWW14bGN5NXNaWE56SWl3aUxpNHZMaTR2ZEdobGJXVXZhV052Ym5NdWJHVnpjeUlzSWk0dUx5NHVMM1JvWlcxbEwyRnVZMmh2Y25NdWJHVnpjeUlzSWk0dUx5NHVMM1JvWlcxbEwyUnlZWGRsY2k1c1pYTnpJaXdpTGk0dkxpNHZkR2hsYldVdmJtRjJhV2RoZEc5eUxteGxjM01pTENJdUxpOHVMaTkwYUdWdFpTOWxiR3hwY0hOcGN5NXNaWE56SWl3aUxpNHZMaTR2ZEdobGJXVXZjbVZoWkdWeUxteGxjM01pTENJdUxpOHVMaTkwYUdWdFpTOXlZV1JwZFhNdWJHVnpjeUlzSWk0dUx5NHVMM1JvWlcxbEwzUnZiMnhpWVhJdWJHVnpjeUlzSWk0dUx5NHVMM1JvWlcxbEwyMWxjM05oWjJVdWJHVnpjeUlzSWk0dUx5NHVMM1JvWlcxbEwzTmpjbTlzYkdKaGNpNXNaWE56SWwwc0ltNWhiV1Z6SWpwYlhTd2liV0Z3Y0dsdVozTWlPaUpCUVVGQkxESkNRVUV5UWp0QlEwTXpRanRGUVVORkxGZEJRVUU3UlVGRFFTeFpRVUZCTzBWQlEwRXNNa0pCUVVFN1EwUkRSRHRCUTBWRU8wVkJRMFVzTWtKQlFVRTdRMFJCUkR0QlEwZEVPMFZCUTBVc2MwTkJRVUU3UlVGRFFTd3lRa0ZCUVR0RFJFUkVPMEZEU1VRN1JVRkRSU3h6UTBGQlFUdEZRVU5CTERKQ1FVRkJPME5FUmtRN1FVTkxSRHRGUVVORkxITkRRVUZCTzBORVNFUTdRVU5OUkR0RlFVTkZMSE5EUVVGQk8wTkVTa1E3UVVWd1FrUTdSVUZEUlN4alFVRkJPMFZCUTBFc2FVSkJRVUU3UTBaelFrUTdRVVZ3UWtNN096dEZRVWRGTEZWQlFVRTdSVUZEUVN4bFFVRkJPMFZCUTBFc2FVSkJRVUU3UTBaelFrZzdRVVZ1UWtNN1JVRkRSU3haUVVGQk8wTkdjVUpJTzBGRmJFSkRPMFZCUTBVc1pVRkJRVHRGUVVOQkxHdENRVUZCTzBOR2IwSklPMEZGYWtKRE8wVkJRMFVzYVVKQlFVRTdSVUZEUVN4WlFVRkJPME5HYlVKSU8wRkZhRUpETzBWQlEwVXNaVUZCUVR0RlFVTkJMRmxCUVVFN1EwWnJRa2c3UVVWbVF6czdPMFZCUjBVc1ZVRkJRVHRGUVVOQkxGZEJRVUU3UlVGRFFTeHBRa0ZCUVR0RFJtbENTRHRCUldSRE8wVkJRMFVzYlVKQlFVRTdSVUZEUVN4WFFVRkJPME5HWjBKSU8wRkZZa003UlVGRFJTeHpRa0ZCUVR0RFJtVklPMEZGV2tNN1JVRkRSU3h6UWtGQlFUdEZRVU5CTEdWQlFVRTdRMFpqU0R0QlJWaERPMFZCUTBVc1kwRkJRVHRGUVVOQkxHRkJRVUU3UlVGRFFTeG5Ra0ZCUVR0RlFVTkJMR3RDUVVGQk8wVkJRMEVzYVVKQlFVRTdSVUZEUVN3d1FrRkJRVHRGUVVOQkxIVkNRVUZCTzBWQlEwRXNiVUpCUVVFN1JVRkRRU3haUVVGQk8wVkJRMEVzWlVGQlFUdERSbUZJTzBGRlZrTTdSVUZEUlN4bFFVRkJPMFZCUTBFc1pVRkJRVHRGUVVOQkxHbENRVUZCTzBOR1dVZzdRVVZVUXp0RlFVTkZMREpDUVVGQk8wVkJRMEVzWjBKQlFVRTdSVUZEUVN3d1FrRkJRVHRGUVVOQkxGbEJRVUU3UTBaWFNEdEJSVkpETzBWQlEwVXNhVUpCUVVFN1JVRkRRU3haUVVGQk8wVkJRMEVzTWtKQlFVRTdRMFpWU0R0QlJWQkRPenRGUVVWRkxHdENRVUZCTzBWQlEwRXNhMEpCUVVFN1JVRkRRU3c0UWtGQlFUdERSbE5JTzBGRlRrTTdSVUZEUlN4dFFrRkJRVHRGUVVOQkxEQkNRVUZCTzBOR1VVZzdRVVZLUkR0RlFVVkpPenRKUVVWRkxHVkJRVUU3UjBaTFNEdERRVU5HTzBGSE5VZEVPMFZCUTBVc2JVSkJRVUU3UlVGRFFTeFhRVUZCTzBWQlEwRXNZMEZCUVR0RlFVTkJMSE5EUVVGQk8wVkJRMEVzVlVGQlFUdEZRVU5CTEdGQlFVRTdSVUZEUVN3eVFrRkJRVHRGUVVOQkxEaENRVUZCTzBWQlEwRXNhVUpCUVVFN1EwZzRSMFE3UVVjMVIwTTdSVUZEUlN4WlFVRkJPMFZCUTBFc2JVSkJRVUU3UlVGRFFTeFhRVUZCTzBWQlEwRXNUMEZCUVR0RlFVTkJMRlZCUVVFN1JVRkRRU3hoUVVGQk8wVkJRMEVzVTBGQlFUdEZRVU5CTERSQ1FVRkJPMFZCUTBFc2FVSkJRVUU3UTBnNFIwZzdRVWN6UjBNN08wVkJSVVVzWjBKQlFVRTdSVUZEUVN4clFrRkJRVHREU0RaSFNEdEJSekZIUXpzN08wVkJSMFVzYVVWQlFVRTdRMGcwUjBnN1FVZDZSME03UlVGRFJTeFZRVUZCTzBWQlEwRXNZVUZCUVR0RlFVTkJMREJDUVVGQk8wVkJRMEVzWVVGQlFUdEZRVU5CTEcxQ1FVRkJPMFZCUTBFc0swSkJRVUU3VlVGQlFTeDFRa0ZCUVR0RlFVTkJMR1ZCUVVFN1EwZ3lSMGc3UVVkNFIwTTdSVUZEUlN4bFFVRkJPMFZCUTBFc1lVRkJRVHRGUVVOQkxHdENRVUZCTzBWQlEwRXNaMEpCUVVFN1JVRkRRU3huUWtGQlFUdEZRVU5CTEd0Q1FVRkJPMFZCUTBFc2FVSkJRVUU3UTBnd1IwZzdRVWQyUjBNN08wVkJSVVVzWjBKQlFVRTdSVUZEUVN4bFFVRkJPMFZCUTBFc01FSkJRVUU3UzBGQlFTeDFRa0ZCUVR0TlFVRkJMSE5DUVVGQk8xVkJRVUVzYTBKQlFVRTdRMGg1UjBnN1FVZDBSME03UlVGRFJTeG5Ra0ZCUVR0RlFVTkJMRzFDUVVGQk8wTklkMGRJTzBGSGRFZEhPMFZCUTBVc1owSkJRVUU3UTBoM1IwdzdRVWR3UjBNN1JVRkRSU3hoUVVGQk8wTkljMGRJTzBGSGJrZERPMFZCUTBVc1pVRkJRVHRGUVVOQkxHTkJRVUU3UlVGRFFTeDFRa0ZCUVR0RlFVTkJMR2xDUVVGQk8wTkljVWRJTzBGSGJFZERPMFZCUTBVc1pVRkJRVHRGUVVOQkxGbEJRVUU3UlVGRFFTeGhRVUZCTzBWQlEwRXNZVUZCUVR0RlFVTkJMR05CUVVFN1JVRkRRU3hoUVVGQk8wVkJRMEVzSzBKQlFVRTdWVUZCUVN4MVFrRkJRVHRGUVVOQkxHVkJRVUU3UTBodlIwZzdRVWRxUjBNN08wVkJSVVVzVlVGQlFUdEZRVU5CTEZkQlFVRTdSVUZEUVN4elFrRkJRVHRGUVVOQkxHbENRVUZCTzBOSWJVZElPMEZIYUVkRE8wVkJRMFVzWTBGQlFUdEZRVU5CTERKQ1FVRkJPMFZCUTBFc09FSkJRVUU3UlVGRFFTeG5Ra0ZCUVR0RlFVTkJMR1ZCUVVFN1EwaHJSMGc3UVVjdlJrTTdSVUZEUlN4aFFVRkJPMFZCUTBFc2EwSkJRVUU3UlVGRFFTeG5Ra0ZCUVR0RlFVTkJMR2RDUVVGQk8wTklhVWRJTzBGSEwwWkhPMFZCUTBVc01FSkJRVUU3UTBocFIwdzdRVUZEUkRzN096czdSMEZMUnp0QlFVTklPenM3T3p0SFFVdEhPMEZCUTBnc05FSkJRVFJDTzBGSmJFODFRanRGUTA5M1JDeDNRMEZCUVR0VlFVRkJMR2REUVVGQk8wVkVUSFJFTEdsQ1FVRkJPMFZCUTBFc2EwSkJRVUU3UlVGRFFTeGhRVUZCTzBWQlEwRXNkVUpCUVVFN1JVRkRRU3dyUWtGQlFUdFZRVUZCTEhWQ1FVRkJPME5LYjA5RU8wRkpiRTlETzBWQlEwVXNjVUpCUVVFN1JVRkJRU3h4UWtGQlFUdEZRVUZCTEdOQlFVRTdSVUZEUVN3clFrRkJRVHRGUVVGQkxEaENRVUZCTzAxQlFVRXNkMEpCUVVFN1ZVRkJRU3h2UWtGQlFUdEZRVU5CTEhOQ1FVRkJPMDFCUVVFc2EwSkJRVUU3UlVGRFFTeFZRVUZCTzBWQlEwRXNXVUZCUVR0RlFVTkJMR2RDUVVGQk8wVkJRMEVzWVVGQlFUdEZRVU5CTEZkQlFVRTdSVUZEUVN4cFFrRkJRVHREU205UFNEdEJTVGRQUXp0RlFWbEpMRFpDUVVGQk8wVkJRVUVzT0VKQlFVRTdUVUZCUVN3eVFrRkJRVHRWUVVGQkxIVkNRVUZCTzBWQlEwRXNXVUZCUVR0RlFVTkJMQ3RDUVVGQk8xVkJRVUVzZFVKQlFVRTdRMHB2VDB3N1FVbHNUMHM3UlVGRFJTeGhRVUZCTzBWQlEwRXNLMEpCUVVFN1ZVRkJRU3gxUWtGQlFUdEZRVU5CTEdWQlFVRTdRMHB2VDFBN1FVbHFUMHM3UlVGRFJTeG5RMEZCUVR0RFNtMVBVRHRCU1RkT1JEdEZRVU5GTEdsQ1FVRkJPMFZCUTBFc1YwRkJRVHRGUVVOQkxFOUJRVUU3UlVGRFFTeGxRVUZCTzBWQlEwRXNPRUpCUVVFN1JVRkRRU3gxUWtGQlFUdEZRVU5CTEcxQ1FVRkJPMFZCUTBFc2EwTkJRVUU3VlVGQlFTd3dRa0ZCUVR0RlFVTkJMR2xDUVVGQk8wTktLMDVFTzBGSk4wNURPMFZCUTBVc2IwSkJRVUU3UTBvclRrZzdRVWt6VGtRN1JVRkRSU3h4UWtGQlFUdEZRVUZCTEhGQ1FVRkJPMFZCUVVFc1kwRkJRVHRGUVVOQkxDdENRVUZCTzBWQlFVRXNPRUpCUVVFN1RVRkJRU3gzUWtGQlFUdFZRVUZCTEc5Q1FVRkJPMFZCUTBFc2MwSkJRVUU3VFVGQlFTeHJRa0ZCUVR0RlFVTkJMR1ZCUVVFN1JVRkRRU3huUWtGQlFUdEZRVU5CTEd0Q1FVRkJPME5LTms1RU8wRkpNMDVETzBWQlEwVXNiMEpCUVVFN1RVRkJRU3haUVVGQk8xVkJRVUVzVVVGQlFUdEZRVU5CTEdWQlFVRTdSVUZEUVN4cFFrRkJRVHREU2paT1NEdEJTV2hQUXp0RlFVMUpMR3RDUVVGQk8wTktOazVNTzBGSk0wNUxPenM3UlVGSFJTeHJRa0ZCUVR0RFNqWk9VRHRCU1RGT1N6czdSVUZGUlN4VlFVRkJPME5LTkU1UU8wRkpkazVETzBWQlEwVXNjVUpCUVVFN1RVRkJRU3hsUVVGQk8wVkJRMEVzWVVGQlFUdEZRVU5CTERSQ1FVRkJPME5LZVU1SU8wRkpkazVITzBWQlEwVXNOa0pCUVVFN1JVRkRRU3hyUWtGQlFUdERTbmxPVER0QlNXaFBRenRGUVZkSkxIVkNRVUZCTzBOS2QwNU1PMEZKYms1RU96dEZRVVZGTEdGQlFVRTdSVUZEUVN3NFEwRkJRVHRGUVVOQkxEQkNRVUZCTzBWQlEwRXNaVUZCUVR0RFNuRk9SRHRCU1d4T1JEczdSVUZGUlN3NFEwRkJRVHRGUVVOQkxHZENRVUZCTzBOS2IwNUVPMEZKYWs1RU8wVkJRMFVzT0VKQlFVRTdSVUZEUVN4bFFVRkJPMFZCUTBFc2JVSkJRVUU3UTBwdFRrUTdRVWxvVGtjN096dEZRVWRGTEhOQ1FVRkJPMFZCUTBFc1pVRkJRVHREU210T1REdEJTUzlOUnp0RlFVTkZMREpDUVVGQk8wTkthVTVNTzBGSk5VMUVPMFZCUTBVc1owTkJRVUU3UTBvNFRVUTdRVWt6VFVRN1JVRkRSU3hqUVVGQk8wTktOazFFTzBGSk1VMUVPMFZCUTBVN08wbEJSVVVzVlVGQlFUdEhTalJOUkR0RlNYcE5SRHRKUVVORkxGVkJRVUU3U1VGRFFTeFhRVUZCTzBkS01rMUVPMFZKZUUxRU8wbEJRMFVzWlVGQlFUdEhTakJOUkR0RFFVTkdPMEZOY0ZkRU8wVkJRME1zZFVKQlFVRTdSVUZEUkN3NFFrRkJRVHRGUVVGcFF5eG5RMEZCUVR0RFRuVlhhRU03UVVGRFJDeHRSRUZCYlVRN1FVRkRia1E3T3pzN08wZEJTMGM3UVVGRFNDd3dRa0ZCTUVJN1FVRkRNVUk3T3pzN08wZEJTMGM3UVVGRFNDdzBRa0ZCTkVJN1FVRkROVUlzYTBSQlFXdEVPMEZQZWxoRE8wVkJSVzVFTEcxQ1FVRkJPMFZCUVhOQ0xGZEJRVUU3UlVGRFZDeHpRa0ZCUVR0RlFVTlZMSFZDUVVGQk8wVkJRMEVzVjBGQlFUdEZRVU5pTEZsQlFVRTdSVUZEUVN4cFFrRkJRVHREVURKWVZEdEJUekZZWXp0RlFVVldMRzFDUVVGQk8wVkJRMWtzVjBGQlFUdEZRVU5VTEZOQlFVRTdSVUZEU0N4VlFVRkJPMFZCUTBFc1YwRkJRVHRGUVVOQkxGbEJRVUU3UlVGRFFTeHRRa0ZCUVR0RlFVTk5MSGxEUVVGQk8xVkJRVUVzYVVOQlFVRTdSVUZEWVN4cFFrRkJRVHREVURKWWRrSTdRVTh4V0ZNN1JVRkRVaXhqUVVGQk8wTlFORmhFTzBGUk9WbEVPMFZCUTBVc2JVSkJRVUU3UlVGRFFTeFhRVUZCTzBWQlEwRXNhVUpCUVVFN1ExSm5Xa1E3UVZFNVdVTTdSVUZEUlN4alFVRkJPME5TWjFwSU8wRlJPVmxIT3pzN1JVRkhSU3haUVVGQk8wVkJRMEVzYzBKQlFVRTdRMUpuV2t3N1FWRTNXVWM3UlVGRFJTeGxRVUZCTzBOU0sxbE1PMEZSTTFsRE8wVkJSVWtzYzBKQlFVRTdRMUkwV1V3N1FWRjJXVWM3UlVGRFJTeHJRa0ZCUVR0RFVubFpURHRCVVROWlF6dEZRVTFKTEcxQ1FVRkJPMFZCUTBFc1YwRkJRVHRGUVVOQkxGTkJRVUU3UlVGRFFTeHZRMEZCUVR0VlFVRkJMRFJDUVVGQk8wVkJRMEVzVjBGQlFUdERVbmRaVER0QlV6RmhSRHRGUVVORkxHMUNRVUZCTzBWQlEwRXNXVUZCUVR0RlFVTkJMRTlCUVVFN1JVRkRRU3hSUVVGQk8wVkJRMEVzVlVGQlFUdEZRVU5CTEZsQlFVRTdSVUZEUVN4aFFVRkJPMFZCUTBFc0swSkJRVUU3VlVGQlFTeDFRa0ZCUVR0RlFVTkJMRzFDUVVGQk8wVkJRMEVzYVVKQlFVRTdRMVEwWVVRN1FWTXhZVU03UlVwUWMwUXNkME5CUVVFN1ZVRkJRU3huUTBGQlFUdEZTVk53UkN4eFFrRkJRVHRGUVVGQkxIRkNRVUZCTzBWQlFVRXNZMEZCUVR0RlFVTkJMRFpDUVVGQk8wVkJRVUVzT0VKQlFVRTdUVUZCUVN3eVFrRkJRVHRWUVVGQkxIVkNRVUZCTzBWQlEwRXNjMEpCUVVFN1RVRkJRU3hyUWtGQlFUdEZRVU5CTEcxQ1FVRkJPMFZCUTBFc1dVRkJRVHRGUVVOQkxHRkJRVUU3UlVGRFFTeDFRa0ZCUVR0RlFVTkJMR3REUVVGQk8xVkJRVUVzTUVKQlFVRTdSVUZEUVN4cFFrRkJRVHREVkRSaFNEdEJVM3BoUXpzN08wVkJSMFVzV1VGQlFUdEZRVU5CTEN0Q1FVRkJPMVZCUVVFc2RVSkJRVUU3UTFReVlVZzdRVk40WVVNN08wVkJSVVVzY1VKQlFVRTdUVUZCUVN4bFFVRkJPME5VTUdGSU8wRlRkbUZET3pzN1JVRkhSU3huUWtGQlFUdERWSGxoU0R0QlUzUmhRenM3UlVGRlJTeHRRa0ZCUVR0RlFVTkJMRmRCUVVFN1JVRkRRU3hsUVVGQk8wVkJRMEVzWVVGQlFUdEZRVU5CTEd0Q1FVRkJPMFZCUTBFc2FVSkJRVUU3UTFSM1lVZzdRVk55WVVNN1JVRkRSU3huUWtGQlFUdEZRVU5CTEdsQ1FVRkJPMFZCUTBFc1pVRkJRVHRGUVVOQkxDdENRVUZCTzFWQlFVRXNkVUpCUVVFN1JVRkRRU3hwUTBGQlFUdERWSFZoU0R0QlUzQmhRenRGUVVORkxHMUNRVUZCTzBWQlEwRXNWMEZCUVR0RlFVTkJMRk5CUVVFN1JVRkRRU3haUVVGQk8wVkJRMEVzV1VGQlFUdEZRVU5CTEdGQlFVRTdSVUZEUVN4clFrRkJRVHRGUVVOQkxGbEJRVUU3UlVGRFFTeG5Ra0ZCUVR0RlFVTkJMRzFDUVVGQk8wVkJRMEVzWjBKQlFVRTdSVUZEUVN4dlEwRkJRVHRWUVVGQkxEUkNRVUZCTzBWQlEwRXNhVUpCUVVFN1ExUnpZVWc3UVZOdVlrTTdSVUZuUWtrc2JVSkJRVUU3UlVGRFFTeFhRVUZCTzBWQlEwRXNUMEZCUVR0RlFVTkJMRkZCUVVFN1ExUnpZVXc3UVZOdVlVYzdSVUZEUlN4WlFVRkJPME5VY1dGTU8wRlRhbUZETzBWQlEwVXNiMEpCUVVFN1RVRkJRU3haUVVGQk8xVkJRVUVzVVVGQlFUdEZRVU5CTEdWQlFVRTdRMVJ0WVVnN1FWTnFZVWM3UlVGRFJTeHBRa0ZCUVR0RFZHMWhURHRCVXk5YVF6dEZRVU5GTEdWQlFVRTdSVUZEUVN4clFrRkJRVHRGUVVOQkxHbENRVUZCTzBOVWFXRklPMEZUT1ZwRE8wVkJRMFVzV1VGQlFUdEZRVU5CTEcxQ1FVRkJPMFZCUTBFc1YwRkJRVHRGUVVOQkxFOUJRVUU3UlVGRFFTeFJRVUZCTzBWQlEwRXNXVUZCUVR0RlFVTkJMR0ZCUVVFN1JVRkRRU3gxUWtGQlFUdEZRVU5CTEdGQlFVRTdSVUZEUVN4cFFrRkJRVHREVkdkaFNEdEJVekZhU3pzN1JVRkRSU3hoUVVGQk8wTlVObHBRTzBGVE1WcExPenRGUVVORkxHRkJRVUU3UTFRMldsQTdRVk14V2tzN08wVkJRMFVzWVVGQlFUdERWRFphVUR0QlV6RmFTenM3UlVGRFJTeGhRVUZCTzBOVU5scFFPMEZUTVZwTE96dEZRVU5GTEdGQlFVRTdRMVEyV2xBN1FWTXhXa3M3TzBWQlEwVXNZVUZCUVR0RFZEWmFVRHRCVTNoYVF6dEZRVU5GTEN0Q1FVRkJPME5VTUZwSU8wRlRkRnBQTzBWQlEwVXNZMEZCUVR0RFZIZGFWRHRCVTI1YVR6dEZRVU5GTEdOQlFVRTdRMVJ4V2xRN1FWTm9Xazg3UlVGRFJTeGpRVUZCTzBOVWExcFVPMEZUTjFsUE8wVkJRMFVzWTBGQlFUdERWQ3RaVkR0QlV6RlpUenRGUVVORkxHTkJRVUU3UTFRMFdWUTdRVk4yV1U4N1JVRkRSU3hqUVVGQk8wTlVlVmxVTzBGVGJsbERPMFZCUTBVc1owTkJRVUU3UTFSeFdVZzdRVk5xV1U4N1JVRkRSU3hoUVVGQk8wTlViVmxVTzBGVE9WaFBPMFZCUTBVc1lVRkJRVHREVkdkWlZEdEJVek5ZVHp0RlFVTkZMR0ZCUVVFN1ExUTJXRlE3UVZONFdFODdSVUZEUlN4aFFVRkJPME5VTUZoVU8wRlRjbGhQTzBWQlEwVXNZVUZCUVR0RFZIVllWRHRCVTJ4WVR6dEZRVU5GTEdGQlFVRTdRMVJ2V0ZRN1FWTTVWME03TzBWQlJVVXNVVUZCUVR0RlFVTkJMRmxCUVVFN1ExUm5XRWc3UVZNM1YwczdPMFZCUTBVc1kwRkJRVHREVkdkWVVEdEJVemRYU3pzN1JVRkRSU3hqUVVGQk8wTlVaMWhRTzBGVE4xZExPenRGUVVORkxHTkJRVUU3UTFSbldGQTdRVk0zVjBzN08wVkJRMFVzWTBGQlFUdERWR2RZVUR0QlV6ZFhTenM3UlVGRFJTeGpRVUZCTzBOVVoxaFFPMEZUTjFkTE96dEZRVU5GTEdOQlFVRTdRMVJuV0ZBN1FWTXpWME03UlVGRFJTeHBRMEZCUVR0RFZEWlhTRHRCVTNwWFR6dEZRVU5GTEZsQlFVRTdRMVF5VjFRN1FWTjBWMDg3UlVGRFJTeFpRVUZCTzBOVWQxZFVPMEZUYmxkUE8wVkJRMFVzV1VGQlFUdERWSEZYVkR0QlUyaFhUenRGUVVORkxGbEJRVUU3UTFSclYxUTdRVk0zVms4N1JVRkRSU3haUVVGQk8wTlVLMVpVTzBGVE1WWlBPMFZCUTBVc1dVRkJRVHREVkRSV1ZEdEJVM1JXUXp0RlFVTkZMR0ZCUVVFN1JVRkRRU3c0UWtGQlFUdERWSGRXU0R0QlUzQldUenRGUVVORkxHVkJRVUU3UTFSelZsUTdRVk5xVms4N1JVRkRSU3hsUVVGQk8wTlViVlpVTzBGVE9WVlBPMFZCUTBVc1pVRkJRVHREVkdkV1ZEdEJVek5WVHp0RlFVTkZMR1ZCUVVFN1ExUTJWVlE3UVZONFZVODdSVUZEUlN4bFFVRkJPME5VTUZWVU8wRlRjbFZQTzBWQlEwVXNaVUZCUVR0RFZIVlZWRHRCVTJwVlF6dEZRVU5GTEc5Q1FVRkJPMFZCUTBFc0swSkJRVUU3UTFSdFZVZzdRVk5xVlVjN1JVRkRSU3huUWtGQlFUdERWRzFWVER0QlUycFZTenRGUVVORkxGTkJRVUU3UTFSdFZWQTdRVk5vVlVzN1JVRkRSU3hSUVVGQk8wTlVhMVZRTzBGVEwxUkxPMFZCUTBVc1QwRkJRVHREVkdsVlVEdEJVemxVU3p0RlFVTkZMRlZCUVVFN1ExUm5WVkE3UVZONlZFczdPMFZCUlVVc2VVSkJRVUU3UlVGRFFTeFRRVUZCTzBWQlEwRXNiME5CUVVFN1ZVRkJRU3cwUWtGQlFUdERWREpVVUR0QlUzaFVTenM3UlVGRlJTeDNRa0ZCUVR0RlFVTkJMRlZCUVVFN1JVRkRRU3h2UTBGQlFUdFZRVUZCTERSQ1FVRkJPME5VTUZSUU8wRlRjbFJUTzBWQlEwVXNWMEZCUVR0RFZIVlVXRHRCVTNCVVV6dEZRVU5GTEZWQlFVRTdRMVJ6VkZnN1FWTnVWRk03UlVGRFJTeFRRVUZCTzBOVWNWUllPMEZUYkZSVE8wVkJRMFVzV1VGQlFUdERWRzlVV0R0QlV6TlRTenM3UlVGRlJTeGhRVUZCTzBWQlEwRXNOa0pCUVVFN1ExUTJVMUE3UVZONFUwTTdSVUZEUlN4WFFVRkJPME5VTUZOSU8wRlZPWE5DUkR0RlFVTkZMRzFDUVVGQk8wVkJRMEVzVjBGQlFUdEZRVU5CTEZWQlFVRTdSVUZEUVN4elEwRkJRVHRGUVVOQkxHVkJRVUU3UTFabmRFSkVPMEZWT1hOQ1F6dEZRVU5GTEhGRFFVRkJPMFZCUVVFc05rSkJRVUU3UTFabmRFSklPMEZWTjNOQ1F6dEZRVU5GTEdWQlFVRTdSVUZEUVN4aFFVRkJPMFZCUTBFc2EwSkJRVUU3UlVGRFFTeG5Ra0ZCUVR0RlFVTkJMR2xEUVVGQk8wVkJRMEVzWjBKQlFVRTdSVUZEUVN4cFFrRkJRVHRGUVVOQkxHbENRVUZCTzBOV0szTkNTRHRCVlRWelFrTTdSVUZEUlN4dFFrRkJRVHRGUVVOQkxGZEJRVUU3UlVGRFFTeFZRVUZCTzBWQlEwRXNhVUpCUVVFN1ExWTRjMEpJTzBGVk0zTkNRenM3TzBWQlIwVXNiVUpCUVVFN1JVRkRRU3hYUVVGQk8wVkJRMEVzVlVGQlFUdEZRVU5CTEZkQlFVRTdSVUZEUVN4elFrRkJRVHRGUVVOQkxHbENRVUZCTzBOV05uTkNTRHRCVlRGelFrTTdSVUZEUlN4cFFrRkJRVHREVmpSelFrZzdRVlY2YzBKRE8wVkJRMFVzYTBKQlFVRTdRMVl5YzBKSU8wRlZlSE5DUXp0RlFVTkZMRlZCUVVFN1JVRkRRU3hyUWtGQlFUdEZRVU5CTEdkQ1FVRkJPMFZCUTBFc2FVSkJRVUU3UTFZd2MwSklPMEZWZG5OQ1F6dEZRVU5GTEcxQ1FVRkJPMFZCUTBFc1YwRkJRVHRGUVVOQkxFOUJRVUU3UlVGRFFTeFJRVUZCTzBWQlEwRXNXVUZCUVR0RlFVTkJMR0ZCUVVFN1JVRkRRU3d3UWtGQlFUdEZRVU5CTEN0Q1FVRkJPMFZCUTBFc2EwTkJRVUU3VlVGQlFTd3dRa0ZCUVR0RlFVTkJMQ3RDUVVGQk8xVkJRVUVzZFVKQlFVRTdSVUZEUVN4cFFrRkJRVHREVm5selFrZzdRVlYwYzBKRE8wVkRha1UyUWl4dlFrRkJRVHRGUVVObUxIZENRVUZCTzBWQlEwY3NhVUpCUVVFN1JVUnBSV1lzWlVGQlFUdEZRVU5CTEdsQ1FVRkJPME5XTUhOQ1NEdEJWWGh6UWtjN096dEZRVWRGTEhOQ1FVRkJPMFZCUTBFc1dVRkJRVHREVmpCelFrdzdRVlYyYzBKSE8wVkJRMFVzWlVGQlFUdERWbmx6UWt3N1FWVnljMEpETzBWQlEwVXNjVUpCUVVFN1ExWjFjMEpJTzBGVmJITkNTenM3TzBWQlIwVXNaVUZCUVR0RlFVTkJMR3RDUVVGQk8wTldiM05DVUR0QlZTOXlRa003TzBWQlJVVXNjVUpCUVVFN1JVRkJRU3h4UWtGQlFUdEZRVUZCTEdOQlFVRTdSVUZEUVN4elFrRkJRVHROUVVGQkxHdENRVUZCTzBWQlEwRXNOa0pCUVVFN1JVRkJRU3c0UWtGQlFUdE5RVUZCTERKQ1FVRkJPMVZCUVVFc2RVSkJRVUU3UlVGRFFTd3JRa0ZCUVR0RlFVTkJMRTlCUVVFN1JVRkRRU3hwUWtGQlFUdERWbWx6UWtnN1FWVTVja0pMT3pzN08wVkJSVVVzSzBKQlFVRTdWVUZCUVN4MVFrRkJRVHREVm10elFsQTdRVlV2Y2tKTE96dEZRVU5GTEhGQ1FVRkJPMDFCUVVFc1pVRkJRVHREVm10elFsQTdRVlV2Y2tKTE96dEZRVU5GTEc5Q1FVRkJPMDFCUVVFc1dVRkJRVHRWUVVGQkxGRkJRVUU3UlVGRFFTeGxRVUZCTzBOV2EzTkNVRHRCVlRkeVFrTTdSVUZEUlN4cFFrRkJRVHRGUVVOQkxIbERRVUZCTzBOV0szSkNTRHRCVlRWeVFrTTdSVUZEUlN4blFrRkJRVHRGUVVOQkxHbENRVUZCTzBOV09ISkNTRHRCVlROeVFrTTdSVUZEUlN4alFVRkJPME5XTm5KQ1NEdEJWVEZ5UWtNN1JVRkRSU3hUUVVGQk8wVkJRMEVzYVVKQlFVRTdRMVkwY2tKSU8wRkJRMFE3T3pzN08wZEJTMGM3UVVGRFNDeHpRa0ZCYzBJN1FVRkRkRUlzYzBKQlFYTkNPMEZCUTNSQ0xITkNRVUZ6UWp0QldXNHhRbkJDTzBWQlEwVXNaMEpCUVVFN1JVRkRRU3hQUVVGQk8wVkJRMEVzVVVGQlFUdEZRVU5CTEZkQlFVRTdSVUZEUVN4WlFVRkJPMFZCUTBFc1dVRkJRVHRGUVVOQkxEQkNRVUZCTzBWQlEwRXNWMEZCUVR0RlFVTkJMQ3RDUVVGQk8xVkJRVUVzZFVKQlFVRTdSVUZEUVN4clJFRkJRVHRWUVVGQkxEQkRRVUZCTzBWQlEwRXNkVU5CUVVFN1ExcHhNVUpJTzBGWmJERkNRenRGVUZaelJDeHhRMEZCUVR0VlFVRkJMRFpDUVVGQk8wVlBXWEJFTEdsQ1FVRkJPMFZCUTBFc2EwSkJRVUU3UlVGRFFTeGxRVUZCTzBWQlEwRXNLMEpCUVVFN1ZVRkJRU3gxUWtGQlFUdEZRVU5CTEhWQ1FVRkJPMFZCUTBFc2FVSkJRVUU3UTFwdk1VSklPMEZaYWpGQ1F6dEZRVU5GTEdsQ1FVRkJPMFZCUTBFc2JVSkJRVUU3UlVGRFFTd3lUa0ZCUVR0RlFVTkJMRzlDUVVGQk8wVkJRMEVzYlVKQlFVRTdSVUZEUVN4cFFrRkJRVHRGUVVOQkxHbENRVUZCTzBOYWJURkNTRHRCV1dneFFrTTdSVUZGU1N4alFVRkJPME5hYVRGQ1REdEJXVGN3UWtNN1JVRkRSU3hqUVVGQk8wTmFLekJDU0R0QldUY3dRa2M3UlVGRFJTeDVRa0ZCUVR0RFdpc3dRa3c3UVZrMU1FSlBPMFZCUTBVc1kwRkJRVHREV2pnd1FsUTdRVmw0TUVKRE8wVkJRMFVzWlVGQlFUdEZRVU5CTEdkQ1FVRkJPMFZCUTBFc1YwRkJRVHRGUVVOQkxFOUJRVUU3UlVGRFFTeFJRVUZCTzBWQlEwRXNXVUZCUVR0RlFVTkJMR0ZCUVVFN1JVRkRRU3hWUVVGQk8wVkJRMEVzSzBKQlFVRTdWVUZCUVN4MVFrRkJRVHRGUVVOQkxHbENRVUZCTzBWQlEwRXNNRUpCUVVFN1JVRkRRU3g1UTBGQlFUdEZRVU5CTEdsQ1FVRkJPME5hTURCQ1NEdEJXWFF3UWtRN1JVRkRSVHRKUVVORkxGZEJRVUU3UjFwM01FSkVPME5CUTBZN1FWa3pNRUpFTzBWQlEwVTdTVUZEUlN4WFFVRkJPMGRhZHpCQ1JEdERRVU5HTzBGWmNqQkNSRHRGUVVWSk8wbEJRMFVzYVVKQlFVRTdSMXB6TUVKSU8wVlpkakJDUXp0SlFVbEpMSEZDUVVGQk8wbEJRVUVzY1VKQlFVRTdTVUZCUVN4alFVRkJPMGxCUTBFc0swSkJRVUU3U1VGQlFTdzRRa0ZCUVR0UlFVRkJMSGRDUVVGQk8xbEJRVUVzYjBKQlFVRTdTVUZEUVN4elFrRkJRVHRSUVVGQkxHdENRVUZCTzBsQlEwRXNNRUpCUVVFN1VVRkJRU3gxUWtGQlFUdFpRVUZCTEc5Q1FVRkJPMGxCUTBFc01FSkJRVUU3VVVGQlFTeHBRa0ZCUVR0SlFVTkJMRlZCUVVFN1NVRkRRU3hUUVVGQk8wbEJRMEVzY1VOQlFVRTdXVUZCUVN3MlFrRkJRVHRKUVVOQkxGbEJRVUU3U1VGRFFTeGhRVUZCTzBsQlEwRXNLMEpCUVVFN1dVRkJRU3gxUWtGQlFUdEpRVU5CTERKQ1FVRkJPMGxCUTBFc2RVSkJRVUU3U1VGRFFTeG5Ra0ZCUVR0SFduTXdRa3c3UlZsd01FSkxPMGxET1VaT0xHbENRVUZCTzBsRVowZFJMRzlDUVVGQk8xRkJRVUVzV1VGQlFUdFpRVUZCTEZGQlFVRTdTVUZEUVN4aFFVRkJPMGxCUTBFc2VVSkJRVUU3V1VGQlFTeHBRa0ZCUVR0SFduTXdRbEE3UlZsc01FSkhPMGxCUTBVc1YwRkJRVHRKUVVOQkxIVkNRVUZCTzBsQlEwRXNLMEpCUVVFN1dVRkJRU3gxUWtGQlFUdEhXbTh3UWt3N1JWbHFNRUpITzBsQlEwVXNiVUpCUVVFN1NVRkRRU3hYUVVGQk8wbEJRMEVzVlVGQlFUdEpRVU5CTEZkQlFVRTdTVUZEUVN4aFFVRkJPMGxCUTBFc2VVSkJRVUU3V1VGQlFTeHBRa0ZCUVR0SlFVTkJMR2xDUVVGQk8wZGFiVEJDVER0RldXZ3dRa2M3U1VSMlNIbENMRzlDUVVGQk8wbEJRMllzZDBKQlFVRTdTVU4zU0ZJc2JVSkJRVUU3U1VGRFFTeFhRVUZCTzBsQlEwRXNUMEZCUVR0SlFVTkJMRkZCUVVFN1NVRkRRU3hWUVVGQk8wbEJRMEVzV1VGQlFUdEpRVU5CTEdGQlFVRTdTVUZEUVN4clFrRkJRVHRKUVVOQkxEaENRVUZCTzBsQlEwRXNhVUpCUVVFN1NVRkRRU3hwUWtGQlFUdEpRVU5CTEhWQ1FVRkJPMGxCUTBFc2FVSkJRVUU3UjFwdE1FSk1PMFZaYURCQ1J6dEpRVU5GTEdWQlFVRTdTVUZEUVN3d1FrRkJRVHRKUVVOQkxHdENRVUZCTzBsQlEwRXNLME5CUVVFN1NVRkRRU3h0UWtGQlFUdEpRVU5CTEcxQ1FVRkJPMGRhYXpCQ1REdEZXWGd3UWtjN1NVRlRTU3hYUVVGQk8wbEJRMEVzYTBSQlFVRTdXVUZCUVN3d1EwRkJRVHRKUVVOQkxEWkRRVUZCTzBsQlEwRXNaVUZCUVR0SFdtc3dRbEE3UTBGRFJqdEJXVFY2UWtRN1JVRkRSVHM3U1ZvcmVrSkZMR1ZCUVdVN1NWazFla0ptTEdkQ1FVRkJPMGxhT0hwQ1FTeHRRa0ZCYlVJN1NWazFla0p1UWl4MVFrRkJRVHRKUVVOQkxGbEJRVUU3U1VGRFFTd3lRa0ZCUVR0SFdqaDZRa1E3UlVGRFJDeFpRVUZaTzBWWk0zcENXanM3TzBsQlIwVXNjME5CUVVFN1NVRkRRU3hsUVVGQk8wZGFObnBDUkR0RlFVTkVMRmxCUVZrN1JWa3hla0phT3p0SlFVVkZMSGxDUVVGQk8wZGFOSHBDUkR0RlFVTkVMSGRDUVVGM1FqdEZXWHA2UW5oQ08wbEJRMFVzV1VGQlFUdEpRVU5CTERCQ1FVRkJPMGRhTW5wQ1JEdEZXWHA2UWtRN08wbEJSVVVzTUVKQlFVRTdTVUZEUVN4clFrRkJRVHRIV2pKNlFrUTdSVmwyZWtKRE96dEpXakI2UWtFc2EwSkJRV3RDTzBsWmRucENhRUlzZVVKQlFVRTdSMXA1ZWtKSU8wVlpkSHBDUXp0SlFVTkZMREJDUVVGQk8wbEJRMEVzYVVKQlFVRTdTVnAzZWtKR0xHRkJRV0U3U1VGRFlpeGhRVUZoTzBsQlEySXNkMEpCUVhkQ08wbEJRM2hDTERSQ1FVRTBRanRIUVVNM1FqdEZXVEY2UWtjN1NVRkRSU3hwUTBGQlFUdEpRVU5CTERoQ1FVRkJPMGxCUTBFc01rSkJRVUU3UjFvMGVrSk1PMFZaZUhwQ1J6dEpRVU5GTERoQ1FVRkJPMGxCUTBFc2QwSkJRVUU3U1VGRFFTeHpRa0ZCUVR0SlFVTkJMSFZDUVVGQk8wbEJRMEVzTkVKQlFVRTdSMW93ZWtKTU8wVlpkSHBDUnp0SlFVTkZMSGxDUVVGQk8wZGFkM3BDVER0RldYQjZRa2M3U1VGRFJTeDVRa0ZCUVR0WlFVRkJMR2xDUVVGQk8wZGFjM3BDVER0RldXZ3hRa003U1VFNFFra3NkMEpCUVVFN1NVRkRRU3hyUTBGQlFUdEpRVU5CTERoQ1FVRkJPMGRhY1hwQ1REdEZXWEl4UWtNN08wbEJjVU5KTEd0RFFVRkJPMGRhYjNwQ1REdEZXWG94UWtNN096dEpRVEpEU1N4dFEwRkJRVHRQUVVGQkxHZERRVUZCTzFsQlFVRXNiMEpCUVVFN1IxcHRla0pNTzBWWkwzbENSenRKUVVORkxIbENRVUZCTzBkYWFYcENURHREUVVOR08wRkJRMFFzYTBSQlFXdEVPMEZqTjJsRGJFUTdSVUZEUlN4blFrRkJRVHRGUVVOQkxHVkJRVUU3UlVGRFFTeFZRVUZCTzBWQlEwRXNhME5CUVVFN1ZVRkJRU3d3UWtGQlFUdEZRVU5CTEdsQ1FVRkJPME5rSzJsRFJEdEJZemRwUTBNN1JWUkdjMFFzZDBOQlFVRTdWVUZCUVN4blEwRkJRVHRGVTBsd1JDeHRRa0ZCUVR0RlFVTkJMRmRCUVVFN1JVRkRRU3hoUVVGQk8wVkJRMEVzV1VGQlFUdEZRVU5CTEdGQlFVRTdSVUZEUVN3d1FrRkJRVHRGUVVOQkxHMUNRVUZCTzBWQlEwRXNLMEpCUVVFN1ZVRkJRU3gxUWtGQlFUdEZRVU5CTEhWQ1FVRkJPMFZCUTBFc1owSkJRVUU3UlVGRFFTeHRRa0ZCUVR0RlFVTkJMRmxCUVVFN1JVRkRRU3c0UTBGQlFUdEZRVUZCTEhORFFVRkJPMFZCUTBFc2FVSkJRVUU3UTJRcmFVTklPMEZqTjJsRFJ6dEZRVU5GTEdWQlFVRTdSVUZEUVN4elFrRkJRVHRGUVVOQkxDdENRVUZCTzFWQlFVRXNkVUpCUVVFN1EyUXJhVU5NTzBGak5XbERSenRGUVVORkxHTkJRVUU3UTJRNGFVTk1PMEZqZW1sRFJ6czdPMFZCUjBVc1dVRkJRVHRGUVVOQkxITkNRVUZCTzBOa01tbERURHRCWTNocFEwYzdSVUZEUlN4bFFVRkJPME5rTUdsRFREdEJZM1JwUTBNN1JVRkRSU3h0UWtGQlFUdEZRVU5CTEZkQlFVRTdSVUZEUVN4VFFVRkJPMFZCUTBFc1ZVRkJRVHRGUVVOQkxGbEJRVUU3UlVGRFFTeGhRVUZCTzBWQlEwRXNlVU5CUVVFN1ZVRkJRU3hwUTBGQlFUdEZRVU5CTEcxQ1FVRkJPMFZCUTBFc2FVSkJRVUU3UTJSM2FVTklPMEZqYm1sRFN6dEZRVU5GTEZsQlFVRTdSVUZEUVN3d1FrRkJRVHRGUVVOQkxITkNRVUZCTzBOa2NXbERVRHRCWTI1cFEwODdSVUZEUlN4WlFVRkJPME5rY1dsRFZEdEJZeTlvUTBzN096dEZRVWRGTEZsQlFVRTdRMlJwYVVOUU8wRmpNMmhEUnp0RlFVTkZMRzlDUVVGQk8wTmtObWhEVER0QlkzUm9RMHM3T3pzN096czdPMFZCU1VVc2IwSkJRVUU3UlVGRFFTeFpRVUZCTzBWQlEwRXNiVUpCUVVFN1EyUTBhRU5RTzBGak1XaERUenM3T3pzN096czdSVUZEUlN4WlFVRkJPMFZCUTBFc2JVSkJRVUU3UTJSdGFVTlVPMEZqTDJoRFN6czdSVUZEUlN3d1FrRkJRVHREWkd0cFExQTdRV00zYUVORE96dEZRVVZGTEZWQlFVRTdSVUZEUVN4dlEwRkJRVHRWUVVGQkxEUkNRVUZCTzBOa0syaERTRHRCWTJ4cFEwTTdPMFZCVFVrc2MwSkJRVUU3UTJSbmFVTk1PMEZqTldoRFF6dEZRVU5GTEZWQlFVRTdRMlE0YUVOSU8wRmpOV2hEUnp0RlFVTkZMRmRCUVVFN1EyUTRhRU5NTzBGak1XaERRenRGUVVORkxHRkJRVUU3UTJRMGFFTklPMEZqTVdoRFJ6dEZRVU5GTEdOQlFVRTdRMlEwYUVOTU8wRmplR2hEUXpzN1JVRkZSU3h2UTBGQlFUdFZRVUZCTERSQ1FVRkJPMFZCUTBFc1dVRkJRVHREWkRCb1EwZzdRV04yYUVORE8wVkJRMFVzVTBGQlFUdEZRVU5CTEZsQlFVRTdRMlI1YUVOSU8wRmpkbWhEUnp0RlFVTkZMR0ZCUVVFN1EyUjVhRU5NTzBGamNtaERRenRGUVVORkxGTkJRVUU3UlVGRFFTeFhRVUZCTzBOa2RXaERTRHRCWTNKb1EwYzdSVUZEUlN4WlFVRkJPME5rZFdoRFREdEJZemxuUTBzN096czdSVUZEUlN4alFVRkJPME5rYldoRFVEdEJaWHB5UTBRN1JVWkpSU3h0UWtGQlFUdEZVa0Z6UkN4M1EwRkJRVHRWUVVGQkxHZERRVUZCTzBWVlJIUkVMR2RDUVVGQk8wVkJRMEVzWTBGQlFUdEZRVU5CTEdGQlFVRTdSVUZEUVN4WFFVRkJPMFZCUTBFc1ZVRkJRVHRGUVVOQkxHRkJRVUU3UlVGRFFTeFZRVUZCTzBWQlEwRXNaMEpCUVVFN1JVRkRRU3hyUWtGQlFUdEZRVU5CTEdkQ1FVRkJPMFZCUTBFc2RVSkJRVUU3UlVGRFFTeFpRVUZCTzBWQlEwRXNlVU5CUVVFN1JVRkJRU3hwUTBGQlFUdEZRVU5CTEc5RFFVRkJPMVZCUVVFc05FSkJRVUU3UlVGRFFTeHBRa0ZCUVR0RFpqSnlRMFE3UVdWNmNrTkRPMFZLYUVJMlFpeHZRa0ZCUVR0RlFVTm1MSGRDUVVGQk8wVkphVUphTEZWQlFVRTdSVUZEUVN4cFFrRkJRVHRGUVVOQkxHRkJRVUU3UlVGRFFTeHJRa0ZCUVR0RlFVTkJMR2RDUVVGQk8wVkJRMEVzV1VGQlFUdEZRVU5CTEdsQ1FVRkJPME5tTkhKRFNEdEJaWHB5UTBNN08wVkJSVVVzYlVKQlFVRTdSVUZEUVN4WFFVRkJPMFZCUTBFc1QwRkJRVHRGUVVOQkxGbEJRVUU3UlVGRFFTeGhRVUZCTzBWQlEwRXNhMEpCUVVFN1JVRkRRU3h0UWtGQlFUdEZRVU5CTEdsQ1FVRkJPME5tTW5KRFNEdEJaWGh5UTBNN1JVRkRSU3hSUVVGQk8wVkJRMEVzV1VGQlFUdERaakJ5UTBnN1FXVTFja05ETzBWQlMwa3NiVUpCUVVFN1JVRkRRU3hYUVVGQk8wVkJRMEVzVTBGQlFUdEZRVU5CTEZWQlFVRTdSVUZEUVN4NVEwRkJRVHRWUVVGQkxHbERRVUZCTzBObU1ISkRURHRCWlhSeVEwTTdSVUZEUlN4VFFVRkJPMFZCUTBFc1owSkJRVUU3UlVGRFFTeFpRVUZCTzBObWQzSkRTRHRCWlROeVEwTTdSVUZOU1N4dFFrRkJRVHRGUVVOQkxGZEJRVUU3UlVGRFFTeFRRVUZCTzBWQlEwRXNWVUZCUVR0RlFVTkJMSGxEUVVGQk8xVkJRVUVzYVVOQlFVRTdRMlozY2tOTU8wRmxjbkpEUnp0RlFVTkZMRmxCUVVFN1EyWjFja05NTzBGbGJuSkRRenRGUVVWSkxEQkNRVUZCTzBObWIzSkRURHRCWldoeVEwTTdSVUZGU1N3d1FrRkJRVHREWm1seVEwdzdRV1UzY1VORE8wVkJSVWtzTUVKQlFVRTdRMlk0Y1VOTU8wRmxNWEZEUXp0RlFVVkpMREJDUVVGQk8wTm1NbkZEVER0QlpYWnhRME03UlVGRFJTeHBRa0ZCUVR0RlFVTkJMSFZDUVVGQk8wTm1lWEZEU0R0QlpYUnhRMHM3UlVGRFJTd3JRa0ZCUVR0RlFVTkJMREJDUVVGQk8wTm1kM0ZEVUR0QlpYSnhRMHM3UlVGRFJTd3JRa0ZCUVR0RlFVTkJMREJDUVVGQk8wTm1kWEZEVUR0QlpYQnhRMHM3UlVGRFJTd3JRa0ZCUVR0RlFVTkJMREJDUVVGQk8wTm1jM0ZEVUR0QlpXNXhRMHM3UlVGRFJTd3JRa0ZCUVR0RlFVTkJMREJDUVVGQk8wTm1jWEZEVUR0QlpUTnlRME03UlVFeVFra3NVMEZCUVR0RlFVTkJMR05CUVVFN1EyWnRjVU5NTzBGbEwzSkRRenRGUVN0Q1RTeGpRVUZCTzBObWJYRkRVRHRCWlRsd1EwTTdSVUZEUlN4cFFrRkJRVHRGUVVOQkxHZENRVUZCTzBObVozRkRTRHRCWlRkd1EwczdSVUZGU1N4bFFVRkJPME5tT0hCRFZEdEJaVEZ3UTBzN1JVRkZTU3hsUVVGQk8wTm1NbkJEVkR0QlpYWndRMHM3UlVGRlNTeGxRVUZCTzBObWQzQkRWRHRCWlhCd1EwczdSVUZGU1N4bFFVRkJPME5tY1hCRFZEdEJaVGx4UTBNN1JVRXJRa2tzZFVKQlFVRTdRMlpyY0VOTU8wRmxPVzlEUXp0RlJuQkxRU3h2UWtGQlFUdERZbkY2UTBRN1FXVTNiME5MTzBWQlEwVXNhVUpCUVVFN1JVRkRRU3huUWtGQlFUdERaaXR2UTFBN1FXVnFjRU5MTzBWR2VFdEtMRzlDUVVGQk8wVkZPRXRSTEZWQlFVRTdSVUZEUVN4WFFVRkJPMFZCUTBFc1dVRkJRVHRGUVVOQkxHRkJRVUU3UlVGRFFTeHJRa0ZCUVR0RFppdHZRMVE3UVdVMWIwTlBPMFZCUTBVc2FVSkJRVUU3UlVGRFFTeDFRa0ZCUVR0RFpqaHZRMVE3UVdVeGIwTkxPMFZCUTBVc2FVSkJRVUU3UlVGRFFTeDFRa0ZCUVR0RFpqUnZRMUE3UVdVeGIwTlBPMFZCUTBVc2FVSkJRVUU3UlVGRFFTeG5Ra0ZCUVR0RFpqUnZRMVE3UVdWMGIwTkRPMFZCUTBVc2FVSkJRVUU3UlVGRFFTeDFRa0ZCUVR0RFpuZHZRMGc3UVdWeWIwTkxPMFZCUTBVc2FVSkJRVUU3UlVGRFFTeDFRa0ZCUVR0RFpuVnZRMUE3UVdWd2IwTkxPMFZCUTBVc2FVSkJRVUU3UlVGRFFTeDFRa0ZCUVR0RFpuTnZRMUE3UVdWcWIwTkRPMFZCUTBVc1YwRkJRVHREWm0xdlEwZzdRV1ZvYjBORE8wVkJRMFVzWTBGQlFUdERabXR2UTBnN1FVRkRSQ3d5UWtGQk1rSTdRV2RDZURKRE0wSTdSVUZEUlN4WFFVRkJPMFZCUTBFc1dVRkJRVHRGUVVOQkxESkNRVUZCTzBOb1FqQXlRMFE3UVdkQ2VESkRRenRGUVVORkxESkNRVUZCTzBOb1FqQXlRMGc3UVdkQ2RESkRSenRGUVVORkxITkRRVUZCTzBWQlEwRXNNa0pCUVVFN1EyaENkekpEVER0QlowSnlNa05ITzBWQlEwVXNjME5CUVVFN1JVRkRRU3d5UWtGQlFUdERhRUoxTWtOTU8wRm5RbkF5UTBjN1JVRkRSU3h6UTBGQlFUdERhRUp6TWtOTU8wRm5RbXd5UTBNN1JVRkRSU3h6UTBGQlFUdERhRUp2TWtOSUlpd2labWxzWlNJNkltVjRZVzF3YkdVdVkzTnpJaXdpYzI5MWNtTmxjME52Ym5SbGJuUWlPbHNpTHlvZ1BUMDlQVDBnVTJOeWIyeHNZbUZ5SUQwOVBUMDlJQ292WEc0Nk9pMTNaV0pyYVhRdGMyTnliMnhzWW1GeUlIdGNiaUFnZDJsa2RHZzZJRGR3ZUR0Y2JpQWdhR1ZwWjJoME9pQTNjSGc3WEc0Z0lDMTNaV0pyYVhRdFltOXlaR1Z5TFhKaFpHbDFjem9nTlhCNE8xeHVmVnh1T2pvdGQyVmlhMmwwTFhOamNtOXNiR0poY2kxMGNtRmpheTF3YVdWalpTQjdYRzRnSUMxM1pXSnJhWFF0WW05eVpHVnlMWEpoWkdsMWN6b2dOWEI0TzF4dWZWeHVPam90ZDJWaWEybDBMWE5qY205c2JHSmhjaTEwYUhWdFlqcDJaWEowYVdOaGJDQjdYRzRnSUdKaFkydG5jbTkxYm1RdFkyOXNiM0k2SUhKblltRW9NQ3dnTUN3Z01Dd2dNQzR5TlNrN1hHNGdJQzEzWldKcmFYUXRZbTl5WkdWeUxYSmhaR2wxY3pvZ05YQjRPMXh1ZlZ4dU9qb3RkMlZpYTJsMExYTmpjbTlzYkdKaGNpMTBhSFZ0WWpwb2IzSnBlbTl1ZEdGc0lIdGNiaUFnWW1GamEyZHliM1Z1WkMxamIyeHZjam9nY21kaVlTZ3dMQ0F3TENBd0xDQXdMakkxS1R0Y2JpQWdMWGRsWW10cGRDMWliM0prWlhJdGNtRmthWFZ6T2lBMWNIZzdYRzU5WEc0Nk9pMTNaV0pyYVhRdGMyTnliMnhzWW1GeU9taHZkbVZ5SUh0Y2JpQWdZbUZqYTJkeWIzVnVaQzFqYjJ4dmNqb2djbWRpWVNnd0xDQXdMQ0F3TENBd0xqRTFLVHRjYm4xY2JqbzZMWGRsWW10cGRDMXpZM0p2Ykd4aVlYSXRkR2gxYldJNmFHOTJaWElnZTF4dUlDQmlZV05yWjNKdmRXNWtMV052Ykc5eU9pQnlaMkpoS0RBc0lEQXNJREFzSURBdU16VXBPMXh1ZlZ4dUxuTmxZM1JwYjI0Z2UxeHVJQ0J0WVhKbmFXNDZJREZsYlNBd08xeHVJQ0J2ZG1WeVpteHZkem9nYUdsa1pHVnVPMXh1ZlZ4dUxuTmxZM1JwYjI1ZlgyaGxZV1JsY2l4Y2JpNXpaV04wYVc5dVgxOWpiMjUwWlc1MExGeHVMbk5sWTNScGIyNWZYMlp2YjNSbGNpQjdYRzRnSUcxaGNtZHBiam9nTUR0Y2JpQWdjR0ZrWkdsdVp6b2dNQ0F6WlcwN1hHNGdJRzkyWlhKbWJHOTNPaUJvYVdSa1pXNDdYRzU5WEc0dWMyVmpkR2x2Ymw5ZmRHbDBiR1VnZTF4dUlDQmpiMnh2Y2pvZ0l6WTJOanRjYm4xY2JpNXpaV04wYVc5dVgxOW9NeUI3WEc0Z0lHTnZiRzl5T2lBak5UQTNZV1psTzF4dUlDQm1iMjUwTFhOcGVtVTZJREV1TXpWbGJUdGNibjFjYmk1elpXTjBhVzl1WDE5b05DQjdYRzRnSUdadmJuUXRjMmw2WlRvZ01TNHhaVzA3WEc0Z0lHTnZiRzl5T2lBak5qWTJPMXh1ZlZ4dUxuTmxZM1JwYjI1ZlgyZzFJSHRjYmlBZ1ptOXVkQzF6YVhwbE9pQXhaVzA3WEc0Z0lHTnZiRzl5T2lBak9UazVPMXh1ZlZ4dUxuTmxZM1JwYjI1ZlgyUnNMRnh1TG5ObFkzUnBiMjVmWDJSMExGeHVMbk5sWTNScGIyNWZYMlJrSUh0Y2JpQWdiV0Z5WjJsdU9pQXdPMXh1SUNCd1lXUmthVzVuT2lBd08xeHVJQ0J2ZG1WeVpteHZkem9nYUdsa1pHVnVPMXh1ZlZ4dUxuTmxZM1JwYjI1ZlgyUnNJSHRjYmlBZ2NHOXphWFJwYjI0NklISmxiR0YwYVhabE8xeHVJQ0I2TFdsdVpHVjRPaUF4TzF4dWZWeHVMbk5sWTNScGIyNWZYMlIwSUh0Y2JpQWdaR2x6Y0d4aGVUb2dhVzVzYVc1bExXSnNiMk5yTzF4dWZWeHVMbk5sWTNScGIyNWZYMlJrSUh0Y2JpQWdaR2x6Y0d4aGVUb2dhVzVzYVc1bExXSnNiMk5yTzF4dUlDQmpiMnh2Y2pvZ0l6QTFPRGswTWp0Y2JuMWNiaTV6WldOMGFXOXVYMTl3Y21VZ2UxeHVJQ0J0WVhKbmFXNDZJREpsYlNBd08xeHVJQ0J3WVdSa2FXNW5PaUF4WlcwN1hHNGdJR1p2Ym5RdGMybDZaVG9nTVRSd2VEdGNiaUFnYkdsdVpTMW9aV2xuYUhRNklERTFNQ1U3WEc0Z0lIUmxlSFF0WVd4cFoyNDZJR3hsWm5RN1hHNGdJR0poWTJ0bmNtOTFibVF0WTI5c2IzSTZJQ05tWVdaaFptRTdYRzRnSUdKdmNtUmxjam9nTVhCNElITnZiR2xrSUNOa1pHUTdYRzRnSUdKdmNtUmxjaTF5WVdScGRYTTZJRFJ3ZUR0Y2JpQWdZMjlzYjNJNklDTTJOalk3WEc0Z0lHOTJaWEptYkc5M09pQmhkWFJ2TzF4dWZWeHVMbk5sWTNScGIyNWZYMk52WkdVZ2UxeHVJQ0JrYVhOd2JHRjVPaUJpYkc5amF6dGNiaUFnYldGeVoybHVPaUF3SUdGMWRHODdYRzRnSUc5MlpYSm1iRzkzT2lCb2FXUmtaVzQ3WEc1OVhHNHVjMlZqZEdsdmJsOWZabTl2ZEdWeUlIdGNiaUFnWW05eVpHVnlMWFJ2Y0RvZ01YQjRJSE52Ykdsa0lDTmtaR1E3WEc0Z0lHMWhjbWRwYmkxMGIzQTZJRE5sYlR0Y2JpQWdZbUZqYTJkeWIzVnVaQzFqYjJ4dmNqb2dJMlpoWm1GbVlUdGNiaUFnWTI5c2IzSTZJQ001T1RrN1hHNTlYRzR1YzJWamRHbHZibDlmZEdGaWJHVWdlMXh1SUNCdFlYSm5hVzQ2SURGbGJTQmhkWFJ2TzF4dUlDQjNhV1IwYURvZ01UQXdKVHRjYmlBZ1ltOXlaR1Z5TFhSdmNEb2dNWEI0SUhOdmJHbGtJQ05rWkdRN1hHNTlYRzR1YzJWamRHbHZibDlmZEdnc1hHNHVjMlZqZEdsdmJsOWZkR1FnZTF4dUlDQndZV1JrYVc1bk9pQTFjSGdnTVRad2VEdGNiaUFnYkdsdVpTMW9aV2xuYUhRNklESTJjSGc3WEc0Z0lHSnZjbVJsY2kxaWIzUjBiMjA2SURGd2VDQnpiMnhwWkNBalpHUmtPMXh1ZlZ4dUxuTmxZM1JwYjI1ZlgzUm9JSHRjYmlBZ2RHVjRkQzFoYkdsbmJqb2dZMlZ1ZEdWeU8xeHVJQ0JpWVdOclozSnZkVzVrTFdOdmJHOXlPaUFqWm1GbVlXWmhPMXh1ZlZ4dVFHMWxaR2xoSUNodFlYZ3RkMmxrZEdnNklEVXdNSEI0S1NCN1hHNGdJQzV6WldOMGFXOXVYMTlvWldGa1pYSXNYRzRnSUM1elpXTjBhVzl1WDE5amIyNTBaVzUwSUh0Y2JpQWdJQ0J3WVdSa2FXNW5PaUF3SURGbGJUdGNiaUFnZlZ4dWZWeHVMbU5oYzJVZ2UxeHVJQ0J3YjNOcGRHbHZiam9nY21Wc1lYUnBkbVU3WEc0Z0lIb3RhVzVrWlhnNklERTdYRzRnSUdScGMzQnNZWGs2SUdkeWFXUTdYRzRnSUdkeWFXUXRkR1Z0Y0d4aGRHVXRZMjlzZFcxdWN6b2djbVZ3WldGMEtESXNJREZtY2lrN1hHNGdJR2RoY0RvZ05EQndlRHRjYmlBZ2NHRmtaR2x1WnpvZ01XVnRPMXh1SUNCaWIzSmtaWEl0ZEc5d09pQXhjSGdnYzI5c2FXUWdJMlJrWkR0Y2JpQWdZbTl5WkdWeUxXSnZkSFJ2YlRvZ01YQjRJSE52Ykdsa0lDTmtaR1E3WEc0Z0lHOTJaWEptYkc5M09pQm9hV1JrWlc0N1hHNTlYRzR1WTJGelpUcGhablJsY2lCN1hHNGdJR052Ym5SbGJuUTZJQ2NuTzF4dUlDQndiM05wZEdsdmJqb2dZV0p6YjJ4MWRHVTdYRzRnSUhvdGFXNWtaWGc2SURJN1hHNGdJSFJ2Y0RvZ01EdGNiaUFnYkdWbWREb2dOVEFsTzF4dUlDQm9aV2xuYUhRNklERXdNQ1U3WEc0Z0lIZHBaSFJvT2lBd08xeHVJQ0JpYjNKa1pYSXRiR1ZtZERvZ01YQjRJSE52Ykdsa0lDTmtaR1E3WEc0Z0lHOTJaWEptYkc5M09pQm9hV1JrWlc0N1hHNTlYRzR1WTJGelpWOWZjSEpsTEZ4dUxtTmhjMlZmWDNSbGVIUmhjbVZoSUh0Y2JpQWdabTl1ZEMxemFYcGxPaUF4TTNCNE8xeHVJQ0JzYVc1bExXaGxhV2RvZERvZ01UVXdKVHRjYm4xY2JpNWpZWE5sWDE5d2NtVXNYRzR1WTJGelpWOWZZMjlrWlN4Y2JpNWpZWE5sWDE5MFpYaDBZWEpsWVNCN1hHNGdJR1p2Ym5RdFptRnRhV3g1T2lBblEyOTFjbWxsY2lCT1pYY25MQ0JEYjI1emIyeGhjeXdnUjJWdmNtZHBZU3dnUVhKcFlXd3NJSE5oYm5NdGMyVnlhV1k3WEc1OVhHNHVZMkZ6WlY5ZmNISmxJSHRjYmlBZ2JXRnlaMmx1T2lBd08xeHVJQ0J3WVdSa2FXNW5PaUF4WlcwN1hHNGdJR0poWTJ0bmNtOTFibVF0WTI5c2IzSTZJQ05tWVdaaFptRTdYRzRnSUdobGFXZG9kRG9nTVRBd0pUdGNiaUFnWW05eVpHVnlMWEpoWkdsMWN6b2dOSEI0TzF4dUlDQmliM2d0YzJsNmFXNW5PaUJpYjNKa1pYSXRZbTk0TzF4dUlDQnZkbVZ5Wm14dmR6b2dZWFYwYnp0Y2JuMWNiaTVqWVhObFgxOTBiMjlzWW1GeUlIdGNiaUFnYldGeVoybHVPaUF3SUdGMWRHODdYRzRnSUdobGFXZG9kRG9nTXpad2VEdGNiaUFnYkdsdVpTMW9aV2xuYUhRNklETTJjSGc3WEc0Z0lHWnZiblF0YzJsNlpUb2dNVFJ3ZUR0Y2JpQWdjR0ZrWkdsdVp6b2dNQ0F4Tm5CNE8xeHVJQ0IwWlhoMExXRnNhV2R1T2lCeWFXZG9kRHRjYmlBZ2IzWmxjbVpzYjNjNklHaHBaR1JsYmp0Y2JuMWNiaTVqWVhObFgxOWhZM1JwYjI0c1hHNHVZMkZ6WlY5ZmNtVnRiM1psSUh0Y2JpQWdZM1Z5YzI5eU9pQndiMmx1ZEdWeU8xeHVJQ0JqYjJ4dmNqb2dJekExT0RrME1qdGNiaUFnZFhObGNpMXpaV3hsWTNRNklHNXZibVU3WEc1OVhHNHVZMkZ6WlY5ZllXTjBhVzl1SUh0Y2JpQWdabTl1ZEMxemFYcGxPaUF4TTNCNE8xeHVJQ0J3WVdSa2FXNW5MV3hsWm5RNklERXdjSGc3WEc1OVhHNHVZMkZ6WlY5ZllXTjBhVzl1T21acGNuTjBMV05vYVd4a0lIdGNiaUFnY0dGa1pHbHVaeTFzWldaME9pQXdPMXh1ZlZ4dUxtTmhjMlZmWDNKbGJXOTJaU0I3WEc0Z0lHWnNiMkYwT2lCeWFXZG9kRHRjYm4xY2JpNWpZWE5sWDE5amIyNXpiMnhsSUh0Y2JpQWdiV0Z5WjJsdU9pQXdJR0YxZEc4N1hHNGdJR2hsYVdkb2REb2dNVGd3Y0hnN1hHNGdJR0p2Y21SbGNqb2dNWEI0SUhOdmJHbGtJQ05rWkdRN1hHNGdJRzkyWlhKbWJHOTNPaUJvYVdSa1pXNDdYRzU5WEc0dVkyRnpaVjlmZEdWNGRHRnlaV0VnZTF4dUlDQnRZWEpuYVc0NklEQWdZWFYwYnp0Y2JpQWdkMmxrZEdnNklERXdNQ1U3WEc0Z0lHaGxhV2RvZERvZ01UQXdKVHRjYmlBZ1ltOXlaR1Z5T2lCdWIyNWxPMXh1SUNCdmRYUnNhVzVsT2lCdWIyNWxPMXh1SUNCd1lXUmthVzVuT2lBeFpXMDdYRzRnSUdKdmVDMXphWHBwYm1jNklHSnZjbVJsY2kxaWIzZzdYRzRnSUc5MlpYSm1iRzkzT2lCaGRYUnZPMXh1ZlZ4dUxtTmhjMlZmWDJ4cGMzUXNYRzR1WTJGelpWOWZhWFJsYlNCN1hHNGdJRzFoY21kcGJqb2dNRHRjYmlBZ2NHRmtaR2x1WnpvZ01EdGNiaUFnYkdsemRDMXpkSGxzWlMxMGVYQmxPaUJ1YjI1bE8xeHVJQ0J2ZG1WeVpteHZkem9nYUdsa1pHVnVPMXh1ZlZ4dUxtTmhjMlZmWDJ4cGMzUWdlMXh1SUNCb1pXbG5hSFE2SURNMk1IQjRPMXh1SUNCaWIzSmtaWEl0ZEc5d09pQXhjSGdnYzI5c2FXUWdJMlJrWkR0Y2JpQWdZbTl5WkdWeUxXSnZkSFJ2YlRvZ01YQjRJSE52Ykdsa0lDTmtaR1E3WEc0Z0lHWnZiblF0YzJsNlpUb2dNVE53ZUR0Y2JpQWdiM1psY21ac2IzYzZJR0YxZEc4N1hHNTlYRzR1WTJGelpWOWZhWFJsYlNCN1hHNGdJR2hsYVdkb2REb2dNelp3ZUR0Y2JpQWdiR2x1WlMxb1pXbG5hSFE2SURNMmNIZzdYRzRnSUdOMWNuTnZjam9nY0c5cGJuUmxjanRjYmlBZ2NHRmtaR2x1WnpvZ01DQXhObkI0TzF4dWZWeHVMbU5oYzJWZlgybDBaVzA2YUc5MlpYSWdlMXh1SUNCaVlXTnJaM0p2ZFc1a0xXTnZiRzl5T2lBalpqZG1PR1k1TzF4dWZWeHVMeW9xWEc0Z0tpQnRhWGhwYm5NdWJHVnpjeUF0SU9XM3BlV0Z0K1dIdmVhVnNGeHVJQ29nUFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVnh1SUNvZ1EzSmxZWFJsWkNCQ2VUb2dXV0Z2YUdGcGVHbGhiMXh1SUNvZ1ZYQmtZWFJsT2lBeU1ESXlMak11TVRGY2JpQXFMMXh1THlvcVhHNGdLaUJ5WVdScGRYTXViR1Z6Y3lBdElPV2NodWlua3VpdXZ1ZTlyaUJ0YVhocGJuZ2c1WWU5NXBXd1hHNGdLaUE5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlYRzRnS2lCRGNtVmhkR1ZrSUVKNU9pQlpZVzlvWVdsNGFXRnZYRzRnS2lCVmNHUmhkR1U2SURJd01qUXVOQzR4Tmx4dUlDb3ZYRzR2S2lBOVBUMDlQVDBnNVp5RzZLZVM1cUMzNWJ5UDZLNis1NzJ1NVllOTVwV3dJRDA5UFQwOVBTQXFMMXh1TG5CaGNHVnlJSHRjYmlBZ1ltOTRMWE5vWVdSdmR6b2dNQ0F3SURad2VDQXhjSGdnSTJSalpHWmxOanRjYmlBZ2JXRnlaMmx1T2lBelpXMGdZWFYwYnp0Y2JpQWdiV0Y0TFhkcFpIUm9PaUF4TWpBd2NIZzdYRzRnSUhCaFpHUnBibWM2SURKbGJUdGNiaUFnWW1GamEyZHliM1Z1WkMxamIyeHZjam9nSTJabVpqdGNiaUFnWW05NExYTnBlbWx1WnpvZ1ltOXlaR1Z5TFdKdmVEdGNibjFjYmk1d1lYQmxjaTVtYkdWNElIdGNiaUFnWkdsemNHeGhlVG9nWm14bGVEdGNiaUFnWm14bGVDMWthWEpsWTNScGIyNDZJSEp2ZHp0Y2JpQWdabXhsZUMxM2NtRndPaUJ1YjNkeVlYQTdYRzRnSUcxaGNtZHBiam9nTUR0Y2JpQWdkMmxrZEdnNklERXdNQ1U3WEc0Z0lHMWhlQzEzYVdSMGFEb2dNVEF3SlR0Y2JpQWdhR1ZwWjJoME9pQXhNREFsTzF4dUlDQndZV1JrYVc1bk9pQXdPMXh1SUNCdmRtVnlabXh2ZHpvZ2FHbGtaR1Z1TzF4dWZWeHVMbkJoY0dWeUxtWnNaWGdnTG1GeWRHbGpiR1VnZTF4dUlDQm1iR1Y0TFdScGNtVmpkR2x2YmpvZ1kyOXNkVzF1TzF4dUlDQjNhV1IwYURvZ01UQXdKVHRjYmlBZ1ltOTRMWE5wZW1sdVp6b2dZbTl5WkdWeUxXSnZlRHRjYm4xY2JpNXdZWEJsY2k1bWJHVjRJQzVoY25ScFkyeGxYMTl0WVdsdUlIdGNiaUFnYUdWcFoyaDBPaUF4TURBbE8xeHVJQ0JpYjNndGMybDZhVzVuT2lCaWIzSmtaWEl0WW05NE8xeHVJQ0J2ZG1WeVpteHZkem9nWVhWMGJ6dGNibjFjYmk1d1lYQmxjaTVtYkdWNElDNWhjblJwWTJ4bFgxOWhjMmxrWlNCN1hHNGdJR0p2Y21SbGNpMXlhV2RvZERvZ01YQjRJSE52Ykdsa0lDTmtZMlJtWlRZN1hHNTlYRzR1YUdWaFpHVnlJSHRjYmlBZ2NHOXphWFJwYjI0NklITjBhV05yZVR0Y2JpQWdlaTFwYm1SbGVEb2dNenRjYmlBZ2RHOXdPaUF3TzF4dUlDQnRZWEpuYVc0NklEQWdZWFYwYnp0Y2JpQWdZbTl5WkdWeUxXSnZkSFJ2YlRvZ01YQjRJSE52Ykdsa0lDTmtaR1E3WEc0Z0lHSmhZMnRuY205MWJtUXRZMjlzYjNJNklDTm1abVk3WEc0Z0lIUmxlSFF0WVd4cFoyNDZJR05sYm5SbGNqdGNiaUFnZEhKaGJuTnBkR2x2Ymkxa2RYSmhkR2x2YmpvZ01DNHpjenRjYmlBZ2IzWmxjbVpzYjNjNklHaHBaR1JsYmp0Y2JuMWNiaTVvWldGa1pYSmZjM1JwWTJ0NUlIdGNiaUFnY0dGa1pHbHVaeTFzWldaME9pQXlOakJ3ZUR0Y2JuMWNiaTVoY25ScFkyeGxJSHRjYmlBZ1pHbHpjR3hoZVRvZ1pteGxlRHRjYmlBZ1pteGxlQzFrYVhKbFkzUnBiMjQ2SUhKdmR6dGNiaUFnWm14bGVDMTNjbUZ3T2lCdWIzZHlZWEE3WEc0Z0lIQmhaR1JwYm1jNklESmxiU0F3TzF4dUlDQm1iMjUwTFhOcGVtVTZJREUyY0hnN1hHNGdJR3hwYm1VdGFHVnBaMmgwT2lBeE5UQWxPMXh1ZlZ4dUxtRnlkR2xqYkdWZlgyMWhhVzRnZTF4dUlDQm1iR1Y0T2lBeE8xeHVJQ0J3WVdSa2FXNW5PaUF3SURKbGJUdGNiaUFnYjNabGNtWnNiM2M2SUdocFpHUmxianRjYm4xY2JpNWhjblJwWTJ4bFgxOXRZV2x1SUM1elpXTjBhVzl1SUh0Y2JpQWdiM1psY21ac2IzYzZJSFpwYzJsaWJHVTdYRzU5WEc0dVlYSjBhV05zWlY5ZmJXRnBiaUF1YzJWamRHbHZibDlmWTI5dWRHVnVkQ3hjYmk1aGNuUnBZMnhsWDE5dFlXbHVJQzV6WldOMGFXOXVYMTltYjI5MFpYSXNYRzR1WVhKMGFXTnNaVjlmYldGcGJpQXVjMlZqZEdsdmJsOWZhR1ZoWkdWeUlIdGNiaUFnYjNabGNtWnNiM2M2SUhacGMybGliR1U3WEc1OVhHNHVZWEowYVdOc1pWOWZiV0ZwYmlBdWMyVmpkR2x2Ymw5ZmFHVmhaR1Z5TEZ4dUxtRnlkR2xqYkdWZlgyMWhhVzRnTG5ObFkzUnBiMjVmWDJOdmJuUmxiblFnZTF4dUlDQnRZWEpuYVc0NklEQTdYRzU5WEc0dVlYSjBhV05zWlY5ZllYTnBaR1VnZTF4dUlDQm1iR1Y0TFhOb2NtbHVhem9nTUR0Y2JpQWdkMmxrZEdnNklESTBNSEI0TzF4dUlDQmliM0prWlhJdGJHVm1kRG9nTVhCNElITnZiR2xrSUNOa1pHUTdYRzU5WEc0dVlYSjBhV05zWlY5ZllYTnBaR1V1YkhSeUlIdGNiaUFnWW05eVpHVnlMWEpwWjJoME9pQXhjSGdnYzI5c2FXUWdJMlJrWkR0Y2JpQWdZbTl5WkdWeUxXeGxablE2SUc1dmJtVTdYRzU5WEc0dVlYSjBhV05zWlY5ZllYTnBaR1VnTG05MWRHeHBibVV0Ym1GMmFXZGhkRzl5SUh0Y2JpQWdZbUZqYTJkeWIzVnVaQzFqYjJ4dmNqb2dJMlptWmp0Y2JuMWNibkJ5WlN4Y2JpNXpaV04wYVc5dVgxOXdjbVVnZTF4dUlDQndZV1JrYVc1bk9pQXlaVzA3WEc0Z0lHWnZiblF0Wm1GdGFXeDVPaUFuUTI5MWNtbGxjaUJPWlhjbkxDQkJjbWxoYkN3Z2MyRnVjeTF6WlhKcFpqdGNiaUFnWW1GamEyZHliM1Z1WkMxamIyeHZjam9nSTJaaFptRm1ZVHRjYmlBZ2IzWmxjbVpzYjNjNklHRjFkRzg3WEc1OVhHNWpiMlJsTEZ4dUxuTmxZM1JwYjI1ZlgyTnZaR1VnZTF4dUlDQm1iMjUwTFdaaGJXbHNlVG9nSjBOdmRYSnBaWElnVG1WM0p5d2dRWEpwWVd3c0lITmhibk10YzJWeWFXWTdYRzRnSUdadmJuUXRjMmw2WlRvZ01UWndlRHRjYm4xY2JpNW1iMjkwWlhJZ2UxeHVJQ0JpYjNKa1pYSXRkRzl3T2lBeGNIZ2djMjlzYVdRZ0kyUmpaR1psTmp0Y2JpQWdjR0ZrWkdsdVp6b2dNMlZ0SURBN1hHNGdJSFJsZUhRdFlXeHBaMjQ2SUdObGJuUmxjanRjYm4xY2JpNW1iMjkwWlhJZ1lUcHNhVzVyTEZ4dUxtWnZiM1JsY2lCaE9uWnBjMmwwWldRc1hHNHVabTl2ZEdWeUlHRTZhRzkyWlhJZ2UxeHVJQ0IwWlhoMExXUmxZMjl5WVhScGIyNDZJRzV2Ym1VN1hHNGdJR052Ykc5eU9pQWpNRFU0T1RReU8xeHVmVnh1TG1admIzUmxjaUJoT21odmRtVnlJSHRjYmlBZ2RHVjRkQzFrWldOdmNtRjBhVzl1T2lCMWJtUmxjbXhwYm1VN1hHNTlYRzR1ZFhScGJITXRZbTl5WkdWeUxYSnBaMmgwSUh0Y2JpQWdZbTl5WkdWeUxYSnBaMmgwT2lBeGNIZ2djMjlzYVdRZ0kyUmpaR1psTmp0Y2JuMWNiaTVvYVdSa1pXNGdlMXh1SUNCa2FYTndiR0Y1T2lCdWIyNWxPMXh1ZlZ4dVFHMWxaR2xoSUNodFlYZ3RkMmxrZEdnNklEVXdNSEI0S1NCN1hHNGdJR2gwYld3c1hHNGdJR0p2WkhrZ2UxeHVJQ0FnSUcxaGNtZHBiam9nTUR0Y2JpQWdmVnh1SUNBdWNHRndaWElnZTF4dUlDQWdJRzFoY21kcGJqb2dNRHRjYmlBZ0lDQndZV1JrYVc1bk9pQXdPMXh1SUNCOVhHNGdJQzVoY25ScFkyeGxYMTl0WVdsdUlIdGNiaUFnSUNCd1lXUmthVzVuT2lBd0lESmxiVHRjYmlBZ2ZWeHVmVnh1T25KdmIzUWdlMXh1SUNBdExXOTFkR3hwYm1VdGVrbHVaR1Y0T2lBeU1EQXdPMXh1SUNBdExXOTFkR3hwYm1VdGMzUnBZMnQ1TFdobGFXZG9kRG9nTVRBd0pUdGNiaUFnTFMxdmRYUnNhVzVsTFc1aGRtbG5ZWFJ2Y2kxM2FXUjBhRG9nTVRBd0pUdGNibjFjYmk4cUlEMDlQVDA5UFQwOVBUMGdZMjlzYjNKekxuUm9aVzFsSUMwZzVaKzY1NkdBNmFLYzZJbXk1WStZNlllUDZadUc1WkNJSUQwOVBUMDlQVDA5UFQwZ0tpOWNiaThxS2x4dUlDb2daV3hzYVhCemFYTXViR1Z6Y3lBdElPYVdoK2Fjck9lY2dlZVZwU0J0YVhocGJuZ2c1WWU5NXBXd1hHNGdLaUE5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlYRzRnS2lCRGNtVmhkR1ZrSUVKNU9pQlpZVzlvWVdsNGFXRnZYRzRnS2lCVmNHUmhkR1U2SURJd01qSXVNeTR4TVZ4dUlDb3ZYRzR2S2lBOVBUMDlQVDBnNXBhSDVweXM1NXlCNTVXbDVZZTk1cFd3SUQwOVBUMDlQU0FxTDF4dUx5b3FYRzRnS2lCemFHRmtiM2N1YkdWemN5QXRJT21ZdE9XOXNlYWd0K1c4aitpdXZ1ZTlyaUJ0YVhocGJuZ2c1WWU5NXBXd1hHNGdLaUE5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlYRzRnS2lCRGNtVmhkR1ZrSUVKNU9pQlpZVzlvWVdsNGFXRnZYRzRnS2lCVmNHUmhkR1U2SURJd01qSXVNeTR5TUZ4dUlDb3ZYRzR2S2lBOVBUMDlQVDBnNlppMDViMng1cUMzNWJ5UDZLNis1NzJ1NVllOTVwV3dJRDA5UFQwOVBTQXFMMXh1THlvZ1BUMDlQVDA5UFQwOVBTQnBZMjl1TG5Sb1pXMWxJQzBnYzNabklPV2J2dWFnaCtlYWhPYWd0K1c4anlBOVBUMDlQVDA5UFQwOUlDb3ZYRzR1YjNWMGJHbHVaUzFwWTI5dUlIdGNiaUFnY0c5emFYUnBiMjQ2SUhKbGJHRjBhWFpsTzF4dUlDQjZMV2x1WkdWNE9pQXhPMXh1SUNCa2FYTndiR0Y1T2lCcGJteHBibVV0WW14dlkyczdYRzRnSUhabGNuUnBZMkZzTFdGc2FXZHVPaUJ0YVdSa2JHVTdYRzRnSUhkcFpIUm9PaUF4WlcwN1hHNGdJR2hsYVdkb2REb2dNV1Z0TzF4dUlDQnZkbVZ5Wm14dmR6b2dhR2xrWkdWdU8xeHVmVnh1TG05MWRHeHBibVV0YVdOdmJsOWZjM1puSUh0Y2JpQWdjRzl6YVhScGIyNDZJR0ZpYzI5c2RYUmxPMXh1SUNCNkxXbHVaR1Y0T2lBeU8xeHVJQ0IwYjNBNklEVXdKVHRjYmlBZ2JHVm1kRG9nTlRBbE8xeHVJQ0IzYVdSMGFEb2dNV1Z0TzF4dUlDQm9aV2xuYUhRNklERmxiVHRjYmlBZ1ptbHNiRG9nWTNWeWNtVnVkR052Ykc5eU8xeHVJQ0IwY21GdWMyWnZjbTA2SUhSeVlXNXpiR0YwWlNndE5UQWxMQ0F0TlRBbEtUdGNiaUFnYjNabGNtWnNiM2M2SUdocFpHUmxianRjYm4xY2JpNXZkWFJzYVc1bExXbGpiMjVmYUdsa1pHVnVJSHRjYmlBZ1pHbHpjR3hoZVRvZ2JtOXVaVHRjYm4xY2JpNXZkWFJzYVc1bExXaGxZV1JwYm1jZ2UxeHVJQ0J3YjNOcGRHbHZiam9nY21Wc1lYUnBkbVU3WEc0Z0lIb3RhVzVrWlhnNklERTdYRzRnSUc5MlpYSm1iRzkzT2lCb2FXUmtaVzQ3WEc1OVhHNHViM1YwYkdsdVpTMW9aV0ZrYVc1blgxOWhibU5vYjNJZ2UxeHVJQ0JrYVhOd2JHRjVPaUJ1YjI1bE8xeHVmVnh1TG05MWRHeHBibVV0YUdWaFpHbHVaMTlmWVc1amFHOXlPbXhwYm1zc1hHNHViM1YwYkdsdVpTMW9aV0ZrYVc1blgxOWhibU5vYjNJNmRtbHphWFJsWkN4Y2JpNXZkWFJzYVc1bExXaGxZV1JwYm1kZlgyRnVZMmh2Y2pwb2IzWmxjaUI3WEc0Z0lHTnZiRzl5T2lBak9UazVPMXh1SUNCMFpYaDBMV1JsWTI5eVlYUnBiMjQ2SUc1dmJtVTdYRzU5WEc0dWIzVjBiR2x1WlMxb1pXRmthVzVuWDE5aGJtTm9iM0k2YUc5MlpYSWdlMXh1SUNCamIyeHZjam9nSXpVd04yRm1aVHRjYm4xY2JpNXZkWFJzYVc1bExXaGxZV1JwYm1jNmFHOTJaWElnTG05MWRHeHBibVV0YUdWaFpHbHVaMTlmWVc1amFHOXlJSHRjYmlBZ1pHbHpjR3hoZVRvZ2FXNXNhVzVsTFdKc2IyTnJPMXh1ZlZ4dUxtOTFkR3hwYm1VdGFHVmhaR2x1WjE5emRHRnlkRHBvYjNabGNpQjdYRzRnSUc5MlpYSm1iRzkzT2lCMmFYTnBZbXhsTzF4dWZWeHVMbTkxZEd4cGJtVXRhR1ZoWkdsdVoxOXpkR0Z5ZENBdWIzVjBiR2x1WlMxb1pXRmthVzVuWDE5aGJtTm9iM0lnZTF4dUlDQndiM05wZEdsdmJqb2dZV0p6YjJ4MWRHVTdYRzRnSUhvdGFXNWtaWGc2SURJN1hHNGdJSFJ2Y0RvZ05UQWxPMXh1SUNCMGNtRnVjMlp2Y20wNklIUnlZVzV6YkdGMFpWa29MVFV3SlNrN1hHNGdJR3hsWm5RNklDMHhaVzA3WEc1OVhHNHViM1YwYkdsdVpTMWtjbUYzWlhJZ2UxeHVJQ0J3YjNOcGRHbHZiam9nY21Wc1lYUnBkbVU3WEc0Z0lIb3RhVzVrWlhnNklDMHhPMXh1SUNCMGIzQTZJREE3WEc0Z0lHeGxablE2SURBN1hHNGdJRzFoY21kcGJqb2dNRHRjYmlBZ2QybGtkR2c2SURFd01DVTdYRzRnSUdobGFXZG9kRG9nTVRBd0pUdGNiaUFnWW05NExYTnBlbWx1WnpvZ1ltOXlaR1Z5TFdKdmVEdGNiaUFnZG1semFXSnBiR2wwZVRvZ2FHbGtaR1Z1TzF4dUlDQnZkbVZ5Wm14dmR6b2dhR2xrWkdWdU8xeHVmVnh1TG05MWRHeHBibVV0WkhKaGQyVnlYMTl0YjJSaGJDQjdYRzRnSUdKdmVDMXphR0ZrYjNjNklEQWdNQ0EyY0hnZ01YQjRJQ05rWTJSbVpUWTdYRzRnSUdScGMzQnNZWGs2SUdac1pYZzdYRzRnSUdac1pYZ3RaR2x5WldOMGFXOXVPaUJqYjJ4MWJXNDdYRzRnSUdac1pYZ3RkM0poY0RvZ2JtOTNjbUZ3TzF4dUlDQndiM05wZEdsdmJqb2dZV0p6YjJ4MWRHVTdYRzRnSUhvdGFXNWtaWGc2SURJeE8xeHVJQ0JvWldsbmFIUTZJREV3TUNVN1hHNGdJR0poWTJ0bmNtOTFibVF0WTI5c2IzSTZJQ05tWm1ZN1hHNGdJSFJ5WVc1emFYUnBiMjR0WkhWeVlYUnBiMjQ2SURBdU5ITTdYRzRnSUc5MlpYSm1iRzkzT2lCb2FXUmtaVzQ3WEc1OVhHNHViM1YwYkdsdVpTMWtjbUYzWlhKZlgyaGxZV1JsY2l4Y2JpNXZkWFJzYVc1bExXUnlZWGRsY2w5ZmJXRnBiaXhjYmk1dmRYUnNhVzVsTFdSeVlYZGxjbDlmWm05dmRHVnlJSHRjYmlBZ2QybGtkR2c2SURFd01DVTdYRzRnSUdKdmVDMXphWHBwYm1jNklHSnZjbVJsY2kxaWIzZzdYRzU5WEc0dWIzVjBiR2x1WlMxa2NtRjNaWEpmWDJobFlXUmxjaXhjYmk1dmRYUnNhVzVsTFdSeVlYZGxjbDlmWm05dmRHVnlJSHRjYmlBZ1pteGxlQzF6YUhKcGJtczZJREE3WEc1OVhHNHViM1YwYkdsdVpTMWtjbUYzWlhKZlgzUnBkR3hsTEZ4dUxtOTFkR3hwYm1VdFpISmhkMlZ5WDE5dFlXbHVMRnh1TG05MWRHeHBibVV0WkhKaGQyVnlYMTltYjI5MFpYSWdlMXh1SUNCd1lXUmthVzVuT2lBd0lERTJjSGc3WEc1OVhHNHViM1YwYkdsdVpTMWtjbUYzWlhKZlgyaGxZV1JsY2l4Y2JpNXZkWFJzYVc1bExXUnlZWGRsY2w5ZmRHbDBiR1VnZTF4dUlDQndiM05wZEdsdmJqb2djbVZzWVhScGRtVTdYRzRnSUhvdGFXNWtaWGc2SURFN1hHNGdJRzFoY21kcGJqb2dNQ0JoZFhSdk8xeHVJQ0JvWldsbmFIUTZJRFV5Y0hnN1hHNGdJR3hwYm1VdGFHVnBaMmgwT2lBMU1uQjRPMXh1SUNCdmRtVnlabXh2ZHpvZ2FHbGtaR1Z1TzF4dWZWeHVMbTkxZEd4cGJtVXRaSEpoZDJWeVgxOTBhWFJzWlNCN1hHNGdJR1p2Ym5RdGMybDZaVG9nTVRad2VEdGNiaUFnWm05dWRDMTNaV2xuYUhRNklEUXdNRHRjYmlBZ2JXRnlaMmx1T2lBd0lERTJjSGc3WEc0Z0lHSnZlQzF6YVhwcGJtYzZJR0p2Y21SbGNpMWliM2c3WEc0Z0lHSnZjbVJsY2kxaWIzUjBiMjA2SURGd2VDQnpiMnhwWkNBalpHTmtabVUyTzF4dWZWeHVMbTkxZEd4cGJtVXRaSEpoZDJWeVgxOWpiRzl6WlNCN1hHNGdJSEJ2YzJsMGFXOXVPaUJoWW5OdmJIVjBaVHRjYmlBZ2VpMXBibVJsZURvZ01qdGNiaUFnZEc5d09pQTFNQ1U3WEc0Z0lISnBaMmgwT2lBeE1uQjRPMXh1SUNCM2FXUjBhRG9nTWpCd2VEdGNiaUFnYUdWcFoyaDBPaUF5TUhCNE8xeHVJQ0JzYVc1bExXaGxhV2RvZERvZ01qQndlRHRjYmlBZ1kyOXNiM0k2SUNNNU9UazdYRzRnSUdadmJuUXRjMmw2WlRvZ01qQndlRHRjYmlBZ2RHVjRkQzFoYkdsbmJqb2dZMlZ1ZEdWeU8xeHVJQ0JqZFhKemIzSTZJSEJ2YVc1MFpYSTdYRzRnSUhSeVlXNXpabTl5YlRvZ2RISmhibk5zWVhSbFdTZ3ROVEFsS1R0Y2JpQWdiM1psY21ac2IzYzZJR2hwWkdSbGJqdGNibjFjYmk1dmRYUnNhVzVsTFdSeVlYZGxjbDlmWTJ4dmMyVWdMbTkxZEd4cGJtVXRhV052YmlCN1hHNGdJSEJ2YzJsMGFXOXVPaUJoWW5OdmJIVjBaVHRjYmlBZ2VpMXBibVJsZURvZ01qdGNiaUFnZEc5d09pQXdPMXh1SUNCc1pXWjBPaUF3TzF4dWZWeHVMbTkxZEd4cGJtVXRaSEpoZDJWeVgxOWpiRzl6WlRwb2IzWmxjaUI3WEc0Z0lHTnZiRzl5T2lBak5qWTJPMXh1ZlZ4dUxtOTFkR3hwYm1VdFpISmhkMlZ5WDE5dFlXbHVJSHRjYmlBZ1pteGxlRG9nTVR0Y2JpQWdiM1psY21ac2IzYzZJR0YxZEc4N1hHNTlYRzR1YjNWMGJHbHVaUzFrY21GM1pYSmZYMjFoYVc0dWIzWmxjbVpzYjNjdGFHbGtaR1Z1SUh0Y2JpQWdiM1psY21ac2IzYzZJR2hwWkdSbGJqdGNibjFjYmk1dmRYUnNhVzVsTFdSeVlYZGxjbDlmWm05dmRHVnlJSHRjYmlBZ2JXRnlaMmx1T2lBd0lHRjFkRzg3WEc0Z0lIUmxlSFF0WVd4cFoyNDZJSEpwWjJoME8xeHVJQ0J2ZG1WeVpteHZkem9nYUdsa1pHVnVPMXh1ZlZ4dUxtOTFkR3hwYm1VdFpISmhkMlZ5WDE5dmRtVnliR0Y1SUh0Y2JpQWdZMjl1ZEdWdWREb2dKeWM3WEc0Z0lIQnZjMmwwYVc5dU9pQnlaV3hoZEdsMlpUdGNiaUFnZWkxcGJtUmxlRG9nTVR0Y2JpQWdkRzl3T2lBd08xeHVJQ0JzWldaME9pQXdPMXh1SUNCM2FXUjBhRG9nTVRBd0pUdGNiaUFnYUdWcFoyaDBPaUF4TURBbE8xeHVJQ0JpWVdOclozSnZkVzVrTFdOdmJHOXlPaUFqWm1abU8xeHVJQ0J2Y0dGamFYUjVPaUF3TGpFN1hHNGdJRzkyWlhKbWJHOTNPaUJvYVdSa1pXNDdYRzU5WEc0dWIzVjBiR2x1WlMxa2NtRjNaWEpmY25Sc0xtOTFkR3hwYm1VdFpISmhkMlZ5WDNScGJua3NYRzR1YjNWMGJHbHVaUzFrY21GM1pYSmZiSFJ5TG05MWRHeHBibVV0WkhKaGQyVnlYM1JwYm5rZ2UxeHVJQ0IzYVdSMGFEb2dNamd3Y0hnN1hHNTlYRzR1YjNWMGJHbHVaUzFrY21GM1pYSmZjblJzTG05MWRHeHBibVV0WkhKaGQyVnlYMjFwYm1rc1hHNHViM1YwYkdsdVpTMWtjbUYzWlhKZmJIUnlMbTkxZEd4cGJtVXRaSEpoZDJWeVgyMXBibWtnZTF4dUlDQjNhV1IwYURvZ05EZ3djSGc3WEc1OVhHNHViM1YwYkdsdVpTMWtjbUYzWlhKZmNuUnNMbTkxZEd4cGJtVXRaSEpoZDJWeVgzTnRZV3hzTEZ4dUxtOTFkR3hwYm1VdFpISmhkMlZ5WDJ4MGNpNXZkWFJzYVc1bExXUnlZWGRsY2w5emJXRnNiQ0I3WEc0Z0lIZHBaSFJvT2lBMU5EQndlRHRjYm4xY2JpNXZkWFJzYVc1bExXUnlZWGRsY2w5eWRHd3ViM1YwYkdsdVpTMWtjbUYzWlhKZmNtVm5kV3hoY2l4Y2JpNXZkWFJzYVc1bExXUnlZWGRsY2w5c2RISXViM1YwYkdsdVpTMWtjbUYzWlhKZmNtVm5kV3hoY2lCN1hHNGdJSGRwWkhSb09pQTJPREJ3ZUR0Y2JuMWNiaTV2ZFhSc2FXNWxMV1J5WVhkbGNsOXlkR3d1YjNWMGJHbHVaUzFrY21GM1pYSmZiV1ZrYVhWdExGeHVMbTkxZEd4cGJtVXRaSEpoZDJWeVgyeDBjaTV2ZFhSc2FXNWxMV1J5WVhkbGNsOXRaV1JwZFcwZ2UxeHVJQ0IzYVdSMGFEb2dOekl3Y0hnN1hHNTlYRzR1YjNWMGJHbHVaUzFrY21GM1pYSmZjblJzTG05MWRHeHBibVV0WkhKaGQyVnlYMnhoY21kbExGeHVMbTkxZEd4cGJtVXRaSEpoZDJWeVgyeDBjaTV2ZFhSc2FXNWxMV1J5WVhkbGNsOXNZWEpuWlNCN1hHNGdJSGRwWkhSb09pQTVOakJ3ZUR0Y2JuMWNiaTV2ZFhSc2FXNWxMV1J5WVhkbGNsOXlkR3dnZTF4dUlDQmliM0prWlhJdGJHVm1kRG9nTVhCNElITnZiR2xrSUNOa1kyUm1aVFk3WEc1OVhHNHViM1YwYkdsdVpTMWtjbUYzWlhKZmNuUnNMbTkxZEd4cGJtVXRaSEpoZDJWeVgzUnBibmt1YjNWMGJHbHVaUzFrY21GM1pYSmZZMnh2YzJWa0lIdGNiaUFnY21sbmFIUTZJQzB5T1RCd2VEdGNibjFjYmk1dmRYUnNhVzVsTFdSeVlYZGxjbDl5ZEd3dWIzVjBiR2x1WlMxa2NtRjNaWEpmYldsdWFTNXZkWFJzYVc1bExXUnlZWGRsY2w5amJHOXpaV1FnZTF4dUlDQnlhV2RvZERvZ0xUUTVNSEI0TzF4dWZWeHVMbTkxZEd4cGJtVXRaSEpoZDJWeVgzSjBiQzV2ZFhSc2FXNWxMV1J5WVhkbGNsOXpiV0ZzYkM1dmRYUnNhVzVsTFdSeVlYZGxjbDlqYkc5elpXUWdlMXh1SUNCeWFXZG9kRG9nTFRVMU1IQjRPMXh1ZlZ4dUxtOTFkR3hwYm1VdFpISmhkMlZ5WDNKMGJDNXZkWFJzYVc1bExXUnlZWGRsY2w5eVpXZDFiR0Z5TG05MWRHeHBibVV0WkhKaGQyVnlYMk5zYjNObFpDQjdYRzRnSUhKcFoyaDBPaUF0Tmprd2NIZzdYRzU5WEc0dWIzVjBiR2x1WlMxa2NtRjNaWEpmY25Sc0xtOTFkR3hwYm1VdFpISmhkMlZ5WDIxbFpHbDFiUzV2ZFhSc2FXNWxMV1J5WVhkbGNsOWpiRzl6WldRZ2UxeHVJQ0J5YVdkb2REb2dMVGN6TUhCNE8xeHVmVnh1TG05MWRHeHBibVV0WkhKaGQyVnlYM0owYkM1dmRYUnNhVzVsTFdSeVlYZGxjbDlzWVhKblpTNXZkWFJzYVc1bExXUnlZWGRsY2w5amJHOXpaV1FnZTF4dUlDQnlhV2RvZERvZ0xUazNNSEI0TzF4dWZWeHVMbTkxZEd4cGJtVXRaSEpoZDJWeVgyeDBjaUI3WEc0Z0lHSnZjbVJsY2kxeWFXZG9kRG9nTVhCNElITnZiR2xrSUNOa1kyUm1aVFk3WEc1OVhHNHViM1YwYkdsdVpTMWtjbUYzWlhKZmJIUnlMbTkxZEd4cGJtVXRaSEpoZDJWeVgzUnBibmt1YjNWMGJHbHVaUzFrY21GM1pYSmZZMnh2YzJWa0lIdGNiaUFnYkdWbWREb2dMVEk1TUhCNE8xeHVmVnh1TG05MWRHeHBibVV0WkhKaGQyVnlYMngwY2k1dmRYUnNhVzVsTFdSeVlYZGxjbDl0YVc1cExtOTFkR3hwYm1VdFpISmhkMlZ5WDJOc2IzTmxaQ0I3WEc0Z0lHeGxablE2SUMwME9UQndlRHRjYm4xY2JpNXZkWFJzYVc1bExXUnlZWGRsY2w5c2RISXViM1YwYkdsdVpTMWtjbUYzWlhKZmMyMWhiR3d1YjNWMGJHbHVaUzFrY21GM1pYSmZZMnh2YzJWa0lIdGNiaUFnYkdWbWREb2dMVFUxTUhCNE8xeHVmVnh1TG05MWRHeHBibVV0WkhKaGQyVnlYMngwY2k1dmRYUnNhVzVsTFdSeVlYZGxjbDl5WldkMWJHRnlMbTkxZEd4cGJtVXRaSEpoZDJWeVgyTnNiM05sWkNCN1hHNGdJR3hsWm5RNklDMDJPVEJ3ZUR0Y2JuMWNiaTV2ZFhSc2FXNWxMV1J5WVhkbGNsOXNkSEl1YjNWMGJHbHVaUzFrY21GM1pYSmZiV1ZrYVhWdExtOTFkR3hwYm1VdFpISmhkMlZ5WDJOc2IzTmxaQ0I3WEc0Z0lHeGxablE2SUMwM016QndlRHRjYm4xY2JpNXZkWFJzYVc1bExXUnlZWGRsY2w5c2RISXViM1YwYkdsdVpTMWtjbUYzWlhKZmJHRnlaMlV1YjNWMGJHbHVaUzFrY21GM1pYSmZZMnh2YzJWa0lIdGNiaUFnYkdWbWREb2dMVGszTUhCNE8xeHVmVnh1TG05MWRHeHBibVV0WkhKaGQyVnlYM1IwWWl4Y2JpNXZkWFJzYVc1bExXUnlZWGRsY2w5aWRIUWdlMXh1SUNCc1pXWjBPaUF3TzF4dUlDQjNhV1IwYURvZ01UQXdKVHRjYm4xY2JpNXZkWFJzYVc1bExXUnlZWGRsY2w5MGRHSXViM1YwYkdsdVpTMWtjbUYzWlhKZmRHbHVlU3hjYmk1dmRYUnNhVzVsTFdSeVlYZGxjbDlpZEhRdWIzVjBiR2x1WlMxa2NtRjNaWEpmZEdsdWVTQjdYRzRnSUdobGFXZG9kRG9nTWpRd2NIZzdYRzU5WEc0dWIzVjBiR2x1WlMxa2NtRjNaWEpmZEhSaUxtOTFkR3hwYm1VdFpISmhkMlZ5WDIxcGJta3NYRzR1YjNWMGJHbHVaUzFrY21GM1pYSmZZblIwTG05MWRHeHBibVV0WkhKaGQyVnlYMjFwYm1rZ2UxeHVJQ0JvWldsbmFIUTZJRE15TUhCNE8xeHVmVnh1TG05MWRHeHBibVV0WkhKaGQyVnlYM1IwWWk1dmRYUnNhVzVsTFdSeVlYZGxjbDl6YldGc2JDeGNiaTV2ZFhSc2FXNWxMV1J5WVhkbGNsOWlkSFF1YjNWMGJHbHVaUzFrY21GM1pYSmZjMjFoYkd3Z2UxeHVJQ0JvWldsbmFIUTZJRE0yTUhCNE8xeHVmVnh1TG05MWRHeHBibVV0WkhKaGQyVnlYM1IwWWk1dmRYUnNhVzVsTFdSeVlYZGxjbDl5WldkMWJHRnlMRnh1TG05MWRHeHBibVV0WkhKaGQyVnlYMkowZEM1dmRYUnNhVzVsTFdSeVlYZGxjbDl5WldkMWJHRnlJSHRjYmlBZ2FHVnBaMmgwT2lBME1EQndlRHRjYm4xY2JpNXZkWFJzYVc1bExXUnlZWGRsY2w5MGRHSXViM1YwYkdsdVpTMWtjbUYzWlhKZmJXVmthWFZ0TEZ4dUxtOTFkR3hwYm1VdFpISmhkMlZ5WDJKMGRDNXZkWFJzYVc1bExXUnlZWGRsY2w5dFpXUnBkVzBnZTF4dUlDQm9aV2xuYUhRNklEUTBNSEI0TzF4dWZWeHVMbTkxZEd4cGJtVXRaSEpoZDJWeVgzUjBZaTV2ZFhSc2FXNWxMV1J5WVhkbGNsOXNZWEpuWlN4Y2JpNXZkWFJzYVc1bExXUnlZWGRsY2w5aWRIUXViM1YwYkdsdVpTMWtjbUYzWlhKZmJHRnlaMlVnZTF4dUlDQm9aV2xuYUhRNklEUTRNSEI0TzF4dWZWeHVMbTkxZEd4cGJtVXRaSEpoZDJWeVgzUjBZaUI3WEc0Z0lHSnZjbVJsY2kxaWIzUjBiMjA2SURGd2VDQnpiMnhwWkNBalpHTmtabVUyTzF4dWZWeHVMbTkxZEd4cGJtVXRaSEpoZDJWeVgzUjBZaTV2ZFhSc2FXNWxMV1J5WVhkbGNsOTBhVzU1TG05MWRHeHBibVV0WkhKaGQyVnlYMk5zYjNObFpDQjdYRzRnSUhSdmNEb2dMVEkxTUhCNE8xeHVmVnh1TG05MWRHeHBibVV0WkhKaGQyVnlYM1IwWWk1dmRYUnNhVzVsTFdSeVlYZGxjbDl0YVc1cExtOTFkR3hwYm1VdFpISmhkMlZ5WDJOc2IzTmxaQ0I3WEc0Z0lIUnZjRG9nTFRNek1IQjRPMXh1ZlZ4dUxtOTFkR3hwYm1VdFpISmhkMlZ5WDNSMFlpNXZkWFJzYVc1bExXUnlZWGRsY2w5emJXRnNiQzV2ZFhSc2FXNWxMV1J5WVhkbGNsOWpiRzl6WldRZ2UxeHVJQ0IwYjNBNklDMHpOekJ3ZUR0Y2JuMWNiaTV2ZFhSc2FXNWxMV1J5WVhkbGNsOTBkR0l1YjNWMGJHbHVaUzFrY21GM1pYSmZjbVZuZFd4aGNpNXZkWFJzYVc1bExXUnlZWGRsY2w5amJHOXpaV1FnZTF4dUlDQjBiM0E2SUMwME1UQndlRHRjYm4xY2JpNXZkWFJzYVc1bExXUnlZWGRsY2w5MGRHSXViM1YwYkdsdVpTMWtjbUYzWlhKZmJXVmthWFZ0TG05MWRHeHBibVV0WkhKaGQyVnlYMk5zYjNObFpDQjdYRzRnSUhSdmNEb2dMVFExTUhCNE8xeHVmVnh1TG05MWRHeHBibVV0WkhKaGQyVnlYM1IwWWk1dmRYUnNhVzVsTFdSeVlYZGxjbDlzWVhKblpTNXZkWFJzYVc1bExXUnlZWGRsY2w5amJHOXpaV1FnZTF4dUlDQjBiM0E2SUMwME9UQndlRHRjYm4xY2JpNXZkWFJzYVc1bExXUnlZWGRsY2w5aWRIUWdlMXh1SUNCMGIzQTZJR2x1YVhScFlXdzdYRzRnSUdKdmNtUmxjaTEwYjNBNklERndlQ0J6YjJ4cFpDQWpaR05rWm1VMk8xeHVmVnh1TG05MWRHeHBibVV0WkhKaGQyVnlYMkowZEM1dmRYUnNhVzVsTFdSeVlYZGxjbDkwYVc1NUxtOTFkR3hwYm1VdFpISmhkMlZ5WDJOc2IzTmxaQ0I3WEc0Z0lHSnZkSFJ2YlRvZ0xUSTFNSEI0TzF4dWZWeHVMbTkxZEd4cGJtVXRaSEpoZDJWeVgySjBkQzV2ZFhSc2FXNWxMV1J5WVhkbGNsOXRhVzVwTG05MWRHeHBibVV0WkhKaGQyVnlYMk5zYjNObFpDQjdYRzRnSUdKdmRIUnZiVG9nTFRNek1IQjRPMXh1ZlZ4dUxtOTFkR3hwYm1VdFpISmhkMlZ5WDJKMGRDNXZkWFJzYVc1bExXUnlZWGRsY2w5emJXRnNiQzV2ZFhSc2FXNWxMV1J5WVhkbGNsOWpiRzl6WldRZ2UxeHVJQ0JpYjNSMGIyMDZJQzB6TnpCd2VEdGNibjFjYmk1dmRYUnNhVzVsTFdSeVlYZGxjbDlpZEhRdWIzVjBiR2x1WlMxa2NtRjNaWEpmY21WbmRXeGhjaTV2ZFhSc2FXNWxMV1J5WVhkbGNsOWpiRzl6WldRZ2UxeHVJQ0JpYjNSMGIyMDZJQzAwTVRCd2VEdGNibjFjYmk1dmRYUnNhVzVsTFdSeVlYZGxjbDlpZEhRdWIzVjBiR2x1WlMxa2NtRjNaWEpmYldWa2FYVnRMbTkxZEd4cGJtVXRaSEpoZDJWeVgyTnNiM05sWkNCN1hHNGdJR0p2ZEhSdmJUb2dMVFExTUhCNE8xeHVmVnh1TG05MWRHeHBibVV0WkhKaGQyVnlYMkowZEM1dmRYUnNhVzVsTFdSeVlYZGxjbDlzWVhKblpTNXZkWFJzYVc1bExXUnlZWGRsY2w5amJHOXpaV1FnZTF4dUlDQmliM1IwYjIwNklDMDBPVEJ3ZUR0Y2JuMWNiaTV2ZFhSc2FXNWxMV1J5WVhkbGNsOXZjR1Z1WldRZ2UxeHVJQ0IyYVhOcFltbHNhWFI1T2lCMmFYTnBZbXhsTzF4dUlDQjZMV2x1WkdWNE9pQjJZWElvTFMxdmRYUnNhVzVsTFhwSmJtUmxlQ2s3WEc1OVhHNHViM1YwYkdsdVpTMWtjbUYzWlhKZmIzQmxibVZrTG05MWRHeHBibVV0WkhKaGQyVnlJSHRjYmlBZ2NHOXphWFJwYjI0NklHWnBlR1ZrTzF4dWZWeHVMbTkxZEd4cGJtVXRaSEpoZDJWeVgyOXdaVzVsWkM1dmRYUnNhVzVsTFdSeVlYZGxjbDl5ZEd3Z2UxeHVJQ0J5YVdkb2REb2dNRHRjYm4xY2JpNXZkWFJzYVc1bExXUnlZWGRsY2w5dmNHVnVaV1F1YjNWMGJHbHVaUzFrY21GM1pYSmZiSFJ5SUh0Y2JpQWdiR1ZtZERvZ01EdGNibjFjYmk1dmRYUnNhVzVsTFdSeVlYZGxjbDl2Y0dWdVpXUXViM1YwYkdsdVpTMWtjbUYzWlhKZmRIUmlJSHRjYmlBZ2RHOXdPaUF3TzF4dWZWeHVMbTkxZEd4cGJtVXRaSEpoZDJWeVgyOXdaVzVsWkM1dmRYUnNhVzVsTFdSeVlYZGxjbDlpZEhRZ2UxeHVJQ0JpYjNSMGIyMDZJREE3WEc1OVhHNHViM1YwYkdsdVpTMWtjbUYzWlhKZmIyWm1jMlYwTG05MWRHeHBibVV0WkhKaGQyVnlYM0owYkN4Y2JpNXZkWFJzYVc1bExXUnlZWGRsY2w5dlptWnpaWFF1YjNWMGJHbHVaUzFrY21GM1pYSmZiSFJ5SUh0Y2JpQWdhR1ZwWjJoME9pQmpZV3hqS0RFd01DVWdMU0EwWlcwcE8xeHVJQ0IwYjNBNklEVXdKVHRjYmlBZ2RISmhibk5tYjNKdE9pQjBjbUZ1YzJ4aGRHVlpLQzAxTUNVcE8xeHVmVnh1TG05MWRHeHBibVV0WkhKaGQyVnlYMjltWm5ObGRDNXZkWFJzYVc1bExXUnlZWGRsY2w5MGRHSXNYRzR1YjNWMGJHbHVaUzFrY21GM1pYSmZiMlptYzJWMExtOTFkR3hwYm1VdFpISmhkMlZ5WDJKMGRDQjdYRzRnSUhkcFpIUm9PaUJqWVd4aktERXdNQ1VnTFNBMFpXMHBPMXh1SUNCc1pXWjBPaUExTUNVN1hHNGdJSFJ5WVc1elptOXliVG9nZEhKaGJuTnNZWFJsV0NndE5UQWxLVHRjYm4xY2JpNXZkWFJzYVc1bExXUnlZWGRsY2w5dlptWnpaWFF1YjNWMGJHbHVaUzFrY21GM1pYSmZiM0JsYm1Wa0xtOTFkR3hwYm1VdFpISmhkMlZ5WDNKMGJDQjdYRzRnSUhKcFoyaDBPaUF5WlcwN1hHNTlYRzR1YjNWMGJHbHVaUzFrY21GM1pYSmZiMlptYzJWMExtOTFkR3hwYm1VdFpISmhkMlZ5WDI5d1pXNWxaQzV2ZFhSc2FXNWxMV1J5WVhkbGNsOXNkSElnZTF4dUlDQnNaV1owT2lBeVpXMDdYRzU5WEc0dWIzVjBiR2x1WlMxa2NtRjNaWEpmYjJabWMyVjBMbTkxZEd4cGJtVXRaSEpoZDJWeVgyOXdaVzVsWkM1dmRYUnNhVzVsTFdSeVlYZGxjbDkwZEdJZ2UxeHVJQ0IwYjNBNklESmxiVHRjYm4xY2JpNXZkWFJzYVc1bExXUnlZWGRsY2w5dlptWnpaWFF1YjNWMGJHbHVaUzFrY21GM1pYSmZiM0JsYm1Wa0xtOTFkR3hwYm1VdFpISmhkMlZ5WDJKMGRDQjdYRzRnSUdKdmRIUnZiVG9nTW1WdE8xeHVmVnh1TG05MWRHeHBibVV0WkhKaGQyVnlYMkYxZEc4dWIzVjBiR2x1WlMxa2NtRjNaWEpmY25Sc0xGeHVMbTkxZEd4cGJtVXRaSEpoZDJWeVgyRjFkRzh1YjNWMGJHbHVaUzFrY21GM1pYSmZiSFJ5SUh0Y2JpQWdhR1ZwWjJoME9pQmhkWFJ2TzF4dUlDQnRZWGd0YUdWcFoyaDBPaUJqWVd4aktERXdNQ1VnTFNBMFpXMHBPMXh1ZlZ4dUxtOTFkR3hwYm1VdFpISmhkMlZ5WDJaMWJHd2dlMXh1SUNCd1lXUmthVzVuT2lBd08xeHVmVnh1TG05MWRHeHBibVV0Ym1GMmFXZGhkRzl5SUh0Y2JpQWdjRzl6YVhScGIyNDZJSEpsYkdGMGFYWmxPMXh1SUNCNkxXbHVaR1Y0T2lBeE8xeHVJQ0J0WVhKbmFXNDZJREE3WEc0Z0lIZHBaSFJvT2lCMllYSW9MUzF2ZFhSc2FXNWxMVzVoZG1sbllYUnZjaTEzYVdSMGFDazdYRzRnSUc5MlpYSm1iRzkzT2lCaGRYUnZPMXh1ZlZ4dUxtOTFkR3hwYm1VdGJtRjJhV2RoZEc5eUxYQmhjbVZ1ZENCN1hHNGdJSFJ5WVc1emFYUnBiMjQ2SURBdU0zTWdaV0Z6WlMxcGJpMXZkWFE3WEc1OVhHNHViM1YwYkdsdVpTMXVZWFpwWjJGMGIzSmZYM1JwZEd4bElIdGNiaUFnYldGeVoybHVPaUF3SURFMmNIZzdYRzRnSUdobGFXZG9kRG9nTkRCd2VEdGNiaUFnYkdsdVpTMW9aV2xuYUhRNklEUXdjSGc3WEc0Z0lIQmhaR1JwYm1jNklEQWdNVFp3ZUR0Y2JpQWdZbTl5WkdWeUxXSnZkSFJ2YlRvZ01YQjRJSE52Ykdsa0lDTmtZMlJtWlRZN1hHNGdJR1p2Ym5RdGMybDZaVG9nTVRad2VEdGNiaUFnWm05dWRDMTNaV2xuYUhRNklEUXdNRHRjYmlBZ2IzWmxjbVpzYjNjNklHaHBaR1JsYmp0Y2JuMWNiaTV2ZFhSc2FXNWxMVzVoZG1sbllYUnZjbDlmYldGcGJpQjdYRzRnSUhCdmMybDBhVzl1T2lCeVpXeGhkR2wyWlR0Y2JpQWdlaTFwYm1SbGVEb2dNVHRjYmlBZ2JXRnlaMmx1T2lBd08xeHVJQ0J2ZG1WeVpteHZkem9nYUdsa1pHVnVPMXh1ZlZ4dUxtOTFkR3hwYm1VdGJtRjJhV2RoZEc5eVgxOXNhWE4wTEZ4dUxtOTFkR3hwYm1VdGJtRjJhV2RoZEc5eVgxOXpkV0pxWldOMExGeHVMbTkxZEd4cGJtVXRibUYyYVdkaGRHOXlYMTlwZEdWdElIdGNiaUFnY0c5emFYUnBiMjQ2SUhKbGJHRjBhWFpsTzF4dUlDQjZMV2x1WkdWNE9pQXlPMXh1SUNCdFlYSm5hVzQ2SURBN1hHNGdJSEJoWkdScGJtYzZJREE3WEc0Z0lHeHBjM1F0YzNSNWJHVXRkSGx3WlRvZ2JtOXVaVHRjYmlBZ2IzWmxjbVpzYjNjNklHaHBaR1JsYmp0Y2JuMWNiaTV2ZFhSc2FXNWxMVzVoZG1sbllYUnZjbDlmYkdsemRDQjdYRzRnSUhCaFpHUnBibWM2SURBdU5XVnRJREE3WEc1OVhHNHViM1YwYkdsdVpTMXVZWFpwWjJGMGIzSmZYM04xWW1wbFkzUWdlMXh1SUNCd1lXUmthVzVuTFd4bFpuUTZJREZsYlR0Y2JuMWNiaTV2ZFhSc2FXNWxMVzVoZG1sbllYUnZjbDlmYVhSbGJTQjdYRzRnSUcxaGNtZHBiam9nTUR0Y2JpQWdiR2x1WlMxb1pXbG5hSFE2SURNd2NIZzdYRzRnSUdadmJuUXRjMmw2WlRvZ01UTndlRHRjYmlBZ2IzWmxjbVpzYjNjNklHaHBaR1JsYmp0Y2JuMWNiaTV2ZFhSc2FXNWxMVzVoZG1sbllYUnZjbDlmY0d4aFkyVm9iMnhrWlhJZ2UxeHVJQ0J3YjNOcGRHbHZiam9nWVdKemIyeDFkR1U3WEc0Z0lIb3RhVzVrWlhnNklERTdYRzRnSUhSdmNEb2dNRHRjYmlBZ2JHVm1kRG9nTUR0Y2JpQWdkMmxrZEdnNklERXdNQ1U3WEc0Z0lHaGxhV2RvZERvZ016QndlRHRjYmlBZ1ltRmphMmR5YjNWdVpDMWpiMnh2Y2pvZ0kyWTNaamhtT1R0Y2JpQWdZbTl5WkdWeUxXeGxablE2SURKd2VDQnpiMnhwWkNBak1EVTRPVFF5TzF4dUlDQjBjbUZ1YzJsMGFXOXVMV1IxY21GMGFXOXVPaUF3TGpKek8xeHVJQ0JpYjNndGMybDZhVzVuT2lCaWIzSmtaWEl0WW05NE8xeHVJQ0J2ZG1WeVpteHZkem9nYUdsa1pHVnVPMXh1ZlZ4dUxtOTFkR3hwYm1VdGJtRjJhV2RoZEc5eVgxOWhibU5vYjNJZ2UxeHVJQ0IzYUdsMFpTMXpjR0ZqWlRvZ2JtOTNjbUZ3TzF4dUlDQjBaWGgwTFc5MlpYSm1iRzkzT2lCbGJHeHBjSE5wY3p0Y2JpQWdiM1psY21ac2IzYzZJR2hwWkdSbGJqdGNiaUFnWkdsemNHeGhlVG9nWW14dlkyczdYRzRnSUhCaFpHUnBibWM2SURBZ01TNDFaVzA3WEc1OVhHNHViM1YwYkdsdVpTMXVZWFpwWjJGMGIzSmZYMkZ1WTJodmNqcHNhVzVyTEZ4dUxtOTFkR3hwYm1VdGJtRjJhV2RoZEc5eVgxOWhibU5vYjNJNmRtbHphWFJsWkN4Y2JpNXZkWFJzYVc1bExXNWhkbWxuWVhSdmNsOWZZVzVqYUc5eU9taHZkbVZ5SUh0Y2JpQWdkR1Y0ZEMxa1pXTnZjbUYwYVc5dU9pQnViMjVsTzF4dUlDQmpiMnh2Y2pvZ0l6VTFOVHRjYm4xY2JpNXZkWFJzYVc1bExXNWhkbWxuWVhSdmNsOWZZVzVqYUc5eU9taHZkbVZ5SUh0Y2JpQWdZMjlzYjNJNklDTXdOVGc1TkRJN1hHNTlYRzR1YjNWMGJHbHVaUzF1WVhacFoyRjBiM0pmWDJOdlpHVWdlMXh1SUNCd1lXUmthVzVuTFhKcFoyaDBPaUF3TGpWbGJUdGNibjFjYmk1dmRYUnNhVzVsTFc1aGRtbG5ZWFJ2Y2w5b2FXZG9iR2xuYUhRdWIzVjBiR2x1WlMxdVlYWnBaMkYwYjNKZlgyRnVZMmh2Y2pwc2FXNXJMRnh1TG05MWRHeHBibVV0Ym1GMmFXZGhkRzl5WDJocFoyaHNhV2RvZEM1dmRYUnNhVzVsTFc1aGRtbG5ZWFJ2Y2w5ZllXNWphRzl5T25acGMybDBaV1FzWEc0dWIzVjBiR2x1WlMxdVlYWnBaMkYwYjNKZmFHbG5hR3hwWjJoMExtOTFkR3hwYm1VdGJtRjJhV2RoZEc5eVgxOWhibU5vYjNJNmFHOTJaWElnZTF4dUlDQmpiMnh2Y2pvZ0l6QTFPRGswTWp0Y2JpQWdabTl1ZEMxM1pXbG5hSFE2SUdKdmJHUTdYRzU5WEc0dWIzVjBiR2x1WlMxdVlYWnBaMkYwYjNKZmMzUnBZMnQ1TEZ4dUxtOTFkR3hwYm1VdGJtRjJhV2RoZEc5eVgyWnBlR1ZrSUh0Y2JpQWdaR2x6Y0d4aGVUb2dabXhsZUR0Y2JpQWdabXhsZUMxM2NtRndPaUJ1YjNkeVlYQTdYRzRnSUdac1pYZ3RaR2x5WldOMGFXOXVPaUJqYjJ4MWJXNDdYRzRnSUhvdGFXNWtaWGc2SUhaaGNpZ3RMVzkxZEd4cGJtVXRla2x1WkdWNEtUdGNiaUFnZEc5d09pQXdPMXh1SUNCdmRtVnlabXh2ZHpvZ2FHbGtaR1Z1TzF4dWZWeHVMbTkxZEd4cGJtVXRibUYyYVdkaGRHOXlYM04wYVdOcmVTQXViM1YwYkdsdVpTMXVZWFpwWjJGMGIzSmZYM1JwZEd4bExGeHVMbTkxZEd4cGJtVXRibUYyYVdkaGRHOXlYMlpwZUdWa0lDNXZkWFJzYVc1bExXNWhkbWxuWVhSdmNsOWZkR2wwYkdVc1hHNHViM1YwYkdsdVpTMXVZWFpwWjJGMGIzSmZjM1JwWTJ0NUlDNXZkWFJzYVc1bExXNWhkbWxuWVhSdmNsOWZiV0ZwYml4Y2JpNXZkWFJzYVc1bExXNWhkbWxuWVhSdmNsOW1hWGhsWkNBdWIzVjBiR2x1WlMxdVlYWnBaMkYwYjNKZlgyMWhhVzRnZTF4dUlDQmliM2d0YzJsNmFXNW5PaUJpYjNKa1pYSXRZbTk0TzF4dWZWeHVMbTkxZEd4cGJtVXRibUYyYVdkaGRHOXlYM04wYVdOcmVTQXViM1YwYkdsdVpTMXVZWFpwWjJGMGIzSmZYM1JwZEd4bExGeHVMbTkxZEd4cGJtVXRibUYyYVdkaGRHOXlYMlpwZUdWa0lDNXZkWFJzYVc1bExXNWhkbWxuWVhSdmNsOWZkR2wwYkdVZ2UxeHVJQ0JtYkdWNExYTm9jbWx1YXpvZ01EdGNibjFjYmk1dmRYUnNhVzVsTFc1aGRtbG5ZWFJ2Y2w5emRHbGphM2tnTG05MWRHeHBibVV0Ym1GMmFXZGhkRzl5WDE5dFlXbHVMRnh1TG05MWRHeHBibVV0Ym1GMmFXZGhkRzl5WDJacGVHVmtJQzV2ZFhSc2FXNWxMVzVoZG1sbllYUnZjbDlmYldGcGJpQjdYRzRnSUdac1pYZzZJREU3WEc0Z0lHOTJaWEptYkc5M09pQmhkWFJ2TzF4dWZWeHVMbTkxZEd4cGJtVXRibUYyYVdkaGRHOXlYM04wYVdOcmVTQjdYRzRnSUhCdmMybDBhVzl1T2lCemRHbGphM2s3WEc0Z0lHMWhlQzFvWldsbmFIUTZJSFpoY2lndExXOTFkR3hwYm1VdGMzUnBZMnQ1TFdobGFXZG9kQ2s3WEc1OVhHNHViM1YwYkdsdVpTMXVZWFpwWjJGMGIzSmZabWw0WldRZ2UxeHVJQ0J3YjNOcGRHbHZiam9nWm1sNFpXUTdYRzRnSUcxaGVDMW9aV2xuYUhRNklERXdNQ1U3WEc1OVhHNHViM1YwYkdsdVpTMXVZWFpwWjJGMGIzSmZhR2xrWkdWdUlIdGNiaUFnWkdsemNHeGhlVG9nYm05dVpUdGNibjFjYmk1dmRYUnNhVzVsTFc1aGRtbG5ZWFJ2Y2w5bWIyeGtaV1FnZTF4dUlDQjNhV1IwYURvZ01EdGNiaUFnYjNabGNtWnNiM2M2SUdocFpHUmxianRjYm4xY2JpOHFLbHh1SUNvZ1ptOXVkQzVzWlhOeklDMGc1YTJYNUwyVDU1dTQ1WVd6NXFDMzVieVBYRzRnS2lBOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5WEc0Z0tpQkRjbVZoZEdWa0lFSjVPaUJaWVc5b1lXbDRhV0Z2WEc0Z0tpQlZjR1JoZEdVNklESXdNakl1TXk0eE5seHVJQ292WEc0dktpQTlQVDA5UFQwZzVhMlg1TDJUSUQwOVBUMDlQU0FxTDF4dUx5b2dQVDA5UFQwOUlPV3RsK21IalNBOVBUMDlQVDBnS2k5Y2JpOHFJRDA5UFQwOVBTRGxyWmZsajdjZ1BUMDlQVDA5SUNvdlhHNHViM1YwYkdsdVpTMXlaV0ZrWlhKZlgzQnliMmR5WlhOeklIdGNiaUFnY0c5emFYUnBiMjQ2SUdacGVHVmtPMXh1SUNCMGIzQTZJREE3WEc0Z0lHeGxablE2SURBN1hHNGdJSG90YVc1a1pYZzZJRE03WEc0Z0lHaGxhV2RvZERvZ05IQjRPMXh1SUNCM2FXUjBhRG9nTVRBd0pUdGNiaUFnWW1GamEyZHliM1Z1WkMxamIyeHZjam9nSXpVd04yRm1aVHRjYmlBZ2MyTmhiR1U2SURBZ01UdGNiaUFnZEhKaGJuTm1iM0p0TFc5eWFXZHBiam9nYkdWbWREdGNiaUFnWVc1cGJXRjBhVzl1T2lCdmRYUnNhVzVsTFhKbFlXUmxjaTF3Y205bmNtVnpjeUJzYVc1bFlYSTdYRzRnSUdGdWFXMWhkR2x2YmkxMGFXMWxiR2x1WlRvZ0xTMVFjbTluY21WemMxUnBiV1ZzYVc1bE8xeHVmVnh1TG05MWRHeHBibVV0Y21WaFpHVnlYMTl3WVhCbGNpQjdYRzRnSUdKdmVDMXphR0ZrYjNjNklEQWdNQ0EyY0hnZ01YQjRJQ05rWkdRN1hHNGdJRzFoY21kcGJqb2dNbVZ0SUdGMWRHODdYRzRnSUcxaGVDMTNhV1IwYURvZ01USXdNSEI0TzF4dUlDQndZV1JrYVc1bk9pQXpMakpsYlR0Y2JpQWdZbTk0TFhOcGVtbHVaem9nWW05eVpHVnlMV0p2ZUR0Y2JpQWdZbUZqYTJkeWIzVnVaQzFqYjJ4dmNqb2dJMlptWmp0Y2JpQWdiM1psY21ac2IzYzZJR2hwWkdSbGJqdGNibjFjYmk1dmRYUnNhVzVsTFhKbFlXUmxjbDlmZEdsMGJHVWdlMXh1SUNCdFlYSm5hVzQ2SURBdU5qZGxiU0F3TzF4dUlDQjBaWGgwTFdGc2FXZHVPaUJqWlc1MFpYSTdYRzRnSUdadmJuUXRabUZ0YVd4NU9pQXRZWEJ3YkdVdGMzbHpkR1Z0TENCQ2JHbHVhMDFoWTFONWMzUmxiVVp2Ym5Rc0lDZFRaV2R2WlNCVlNTY3NJQ2RRYVc1blJtRnVaeUJUUXljc0lDZElhWEpoWjJsdWJ5QlRZVzV6SUVkQ0p5d2dKMDFwWTNKdmMyOW1kQ0JaWVVobGFTY3NJQ2RJWld4MlpYUnBZMkVnVG1WMVpTY3NJQ2RCY0hCc1pTQkRiMnh2Y2lCRmJXOXFhU2NzSUNkVFpXZHZaU0JWU1NCRmJXOXFhU2NzSUNkVFpXZHZaU0JWU1NCVGVXMWliMnduTENCSVpXeDJaWFJwWTJFc0lFRnlhV0ZzTENCellXNXpMWE5sY21sbU8xeHVJQ0JtYjI1MExYZGxhV2RvZERvZ2JtOXliV0ZzTzF4dUlDQnNhVzVsTFdobGFXZG9kRG9nTVM0elpXMDdYRzRnSUdadmJuUXRjMmw2WlRvZ05DNHlaVzA3WEc0Z0lHOTJaWEptYkc5M09pQm9hV1JrWlc0N1hHNTlYRzR1YjNWMGJHbHVaUzF5WldGa1pYSmZYMkZ5ZEdsamJHVWdMbTkxZEd4cGJtVXRjbVZoWkdWeVgxOXdjbTluY21WemN5QjdYRzRnSUdScGMzQnNZWGs2SUc1dmJtVTdYRzU5WEc0dWIzVjBiR2x1WlMxeVpXRmtaWEpmYUdsa1pHVnVJSHRjYmlBZ1pHbHpjR3hoZVRvZ2JtOXVaVHRjYm4xY2JpNXZkWFJzYVc1bExYSmxZV1JsY2w5b2FXUmtaVzR1YjNWMGJHbHVaUzF5WldGa1pYSmZjMmxpYkdsdVp5QjdYRzRnSUdScGMzQnNZWGs2SUc1dmJtVWdJV2x0Y0c5eWRHRnVkRHRjYm4xY2JpNXZkWFJzYVc1bExYSmxZV1JsY2w5b2FXUmtaVzR1YjNWMGJHbHVaUzF5WldGa1pYSmZjMmxpYkdsdVp5NTNjbUZ3Y0dWeUxuQnZjM1FnZTF4dUlDQmthWE53YkdGNU9pQnViMjVsTzF4dWZWeHVMbTkxZEd4cGJtVXRjbVZoWkdWeUxTMXlaV0ZrYVc1bklIdGNiaUFnWkdsemNHeGhlVG9nWW14dlkyczdYRzRnSUhCdmMybDBhVzl1T2lCbWFYaGxaRHRjYmlBZ2VpMXBibVJsZURvZ01qdGNiaUFnZEc5d09pQXdPMXh1SUNCc1pXWjBPaUF3TzF4dUlDQjNhV1IwYURvZ01UQXdKVHRjYmlBZ2FHVnBaMmgwT2lBeE1EQWxPMXh1SUNCdFlYSm5hVzQ2SURBN1hHNGdJR0p2ZUMxemFYcHBibWM2SUdKdmNtUmxjaTFpYjNnN1hHNGdJSEJoWkdScGJtYzZJRE5sYlNBMFpXMDdYRzRnSUdKaFkydG5jbTkxYm1RdFkyOXNiM0k2SUNObVlXWmhabUU3WEc0Z0lITmpjbTlzYkMxMGFXMWxiR2x1WlMxdVlXMWxPaUF0TFZCeWIyZHlaWE56VkdsdFpXeHBibVU3WEc0Z0lHOTJaWEptYkc5M09pQnpZM0p2Ykd3N1hHNTlYRzVBYTJWNVpuSmhiV1Z6SUc5MWRHeHBibVV0Y21WaFpHVnlMWEJ5YjJkeVpYTnpJSHRjYmlBZ2RHOGdlMXh1SUNBZ0lITmpZV3hsT2lBeElERTdYRzRnSUgxY2JuMWNia0J0WldScFlTQW9iV0Y0TFhkcFpIUm9PaUExTURCd2VDa2dlMXh1SUNBdWIzVjBiR2x1WlMxeVpXRmtaWElnZTF4dUlDQWdJRzkyWlhKbWJHOTNPaUJvYVdSa1pXNDdYRzRnSUgxY2JpQWdMbTkxZEd4cGJtVXRjbVZoWkdWeUlDNXZkWFJzYVc1bExYUnZiMnhpWVhJZ2UxeHVJQ0FnSUdScGMzQnNZWGs2SUdac1pYZzdYRzRnSUNBZ1pteGxlQzFrYVhKbFkzUnBiMjQ2SUhKdmR6dGNiaUFnSUNCbWJHVjRMWGR5WVhBNklHNXZkM0poY0R0Y2JpQWdJQ0JoYkdsbmJpMXBkR1Z0Y3pvZ1kyVnVkR1Z5TzF4dUlDQWdJR0ZzYVdkdUxYTmxiR1k2SUdGMWRHODdYRzRnSUNBZ2RHOXdPaUF4TURBbE8xeHVJQ0FnSUhKcFoyaDBPaUF3TzF4dUlDQWdJSFJ5WVc1elptOXliVG9nZEhKaGJuTnNZWFJsV1NndE5EaHdlQ2s3WEc0Z0lDQWdkMmxrZEdnNklERXdNQ1U3WEc0Z0lDQWdhR1ZwWjJoME9pQTBPSEI0TzF4dUlDQWdJR0p2ZUMxemFYcHBibWM2SUdKdmNtUmxjaTFpYjNnN1hHNGdJQ0FnWW05eVpHVnlMWFJ2Y0RvZ01YQjRJSE52Ykdsa0lDTmtaR1E3WEc0Z0lDQWdZbUZqYTJkeWIzVnVaQzFqYjJ4dmNqb2dJMlptWmp0Y2JpQWdJQ0J3WVdSa2FXNW5PaUF3SURFMmNIZzdYRzRnSUgxY2JpQWdMbTkxZEd4cGJtVXRjbVZoWkdWeUlDNXZkWFJzYVc1bExYUnZiMnhpWVhKZlgySjFkSFJ2YmlCN1hHNGdJQ0FnWW05eVpHVnlMWEpoWkdsMWN6b2dNRHRjYmlBZ0lDQm1iR1Y0T2lBeE8xeHVJQ0FnSUdKdmNtUmxjam9nYm05dVpUdGNiaUFnSUNCaWIzZ3RjMmhoWkc5M09pQnViMjVsTzF4dUlDQjlYRzRnSUM1dmRYUnNhVzVsTFhKbFlXUmxjaTB0Y21WaFpHbHVaeUI3WEc0Z0lDQWdjR0ZrWkdsdVp6b2dNRHRjYmlBZ0lDQmlZV05yWjNKdmRXNWtMV052Ykc5eU9pQWpabVptTzF4dUlDQWdJR0p2ZUMxemFYcHBibWM2SUdKdmNtUmxjaTFpYjNnN1hHNGdJSDFjYmlBZ0xtOTFkR3hwYm1VdGNtVmhaR1Z5WDE5d1lYQmxjaUI3WEc0Z0lDQWdjRzl6YVhScGIyNDZJSEpsYkdGMGFYWmxPMXh1SUNBZ0lIb3RhVzVrWlhnNklERTdYRzRnSUNBZ2JXRnlaMmx1T2lBd08xeHVJQ0FnSUhCaFpHUnBibWM2SURBN1hHNGdJQ0FnYUdWcFoyaDBPaUF4TURBbE8xeHVJQ0FnSUdKdmVDMXphR0ZrYjNjNklHNXZibVU3WEc0Z0lDQWdiM1psY21ac2IzYzZJR2hwWkdSbGJqdGNiaUFnZlZ4dUlDQXViM1YwYkdsdVpTMXlaV0ZrWlhKZlgzUnBkR3hsSUh0Y2JpQWdJQ0IzYUdsMFpTMXpjR0ZqWlRvZ2JtOTNjbUZ3TzF4dUlDQWdJSFJsZUhRdGIzWmxjbVpzYjNjNklHVnNiR2x3YzJsek8xeHVJQ0FnSUhCdmMybDBhVzl1T2lCaFluTnZiSFYwWlR0Y2JpQWdJQ0I2TFdsdVpHVjRPaUF6TzF4dUlDQWdJSFJ2Y0RvZ01EdGNiaUFnSUNCc1pXWjBPaUF3TzF4dUlDQWdJRzFoY21kcGJqb2dNRHRjYmlBZ0lDQjNhV1IwYURvZ01UQXdKVHRjYmlBZ0lDQm9aV2xuYUhRNklEUTRjSGc3WEc0Z0lDQWdiR2x1WlMxb1pXbG5hSFE2SURRNGNIZzdYRzRnSUNBZ1ltOXlaR1Z5TFdKdmRIUnZiVG9nTVhCNElITnZiR2xrSUNOa1pHUTdYRzRnSUNBZ1ptOXVkQzF6YVhwbE9pQXhMamhsYlR0Y2JpQWdJQ0JtYjI1MExYZGxhV2RvZERvZ05EQXdPMXh1SUNBZ0lHSmhZMnRuY205MWJtUXRZMjlzYjNJNklDTm1abVk3WEc0Z0lDQWdiM1psY21ac2IzYzZJR2hwWkdSbGJqdGNiaUFnZlZ4dUlDQXViM1YwYkdsdVpTMXlaV0ZrWlhKZlgyRnlkR2xqYkdVZ2UxeHVJQ0FnSUcxaGNtZHBiam9nTkRod2VDQXdPMXh1SUNBZ0lHaGxhV2RvZERvZ1kyRnNZeWd4TURBbElDMGdPVFp3ZUNrN1hHNGdJQ0FnY0dGa1pHbHVaem9nTUNBeExqSTFaVzA3WEc0Z0lDQWdjMk55YjJ4c0xYUnBiV1ZzYVc1bExXNWhiV1U2SUMwdFRXOWlhV3hsVUhKdlozSmxjM05VYVcxbGJHbHVaVHRjYmlBZ0lDQnZkbVZ5Wm14dmR5MTRPaUJvYVdSa1pXNDdYRzRnSUNBZ2IzWmxjbVpzYjNjdGVUb2djMk55YjJ4c08xeHVJQ0I5WEc0Z0lDNXZkWFJzYVc1bExYSmxZV1JsY2w5ZllYSjBhV05zWlNBdWIzVjBiR2x1WlMxeVpXRmtaWEpmWDNCeWIyZHlaWE56SUh0Y2JpQWdJQ0I2TFdsdVpHVjRPaUEwTzF4dUlDQWdJR0Z1YVcxaGRHbHZiam9nYjNWMGJHbHVaUzF5WldGa1pYSXRjSEp2WjNKbGMzTWdiR2x1WldGeU8xeHVJQ0FnSUdGdWFXMWhkR2x2YmkxMGFXMWxiR2x1WlRvZ0xTMU5iMkpwYkdWUWNtOW5jbVZ6YzFScGJXVnNhVzVsTzF4dUlDQWdJR1JwYzNCc1lYazZJR0pzYjJOck8xeHVJQ0I5WEc1OVhHNUFiV1ZrYVdFZ2NISnBiblFnZTF4dUlDQm9kRzFzTEZ4dUlDQmliMlI1SUh0Y2JpQWdJQ0F2S2lEbWlaUGxqYkRubW9UbG43cm5vWURsclpma3ZaUGxwS2Zsc0k4Z0tpOWNiaUFnSUNCbWIyNTBMWE5wZW1VNklERXljSFE3WEc0Z0lDQWdMeW9nNXBpKzU2UzY2SzYrNTcydTVwYUg1YTJYNmFLYzZJbXk1WktNNklPTTVwbXY2YUtjNklteUlDb3ZYRzRnSUNBZ1ltRmphMmR5YjNWdVpDMWpiMnh2Y2pvZ0kyWm1aanRjYmlBZ0lDQmpiMnh2Y2pvZ0l6TXpNenRjYmlBZ0lDQm9aV2xuYUhRNklHbHVhWFJwWVd3Z0lXbHRjRzl5ZEdGdWREdGNiaUFnZlZ4dUlDQXZLaURvcnI3bnZhN3BrNzdtanFYbW9MZmx2SThnS2k5Y2JpQWdZVHBzYVc1ckxGeHVJQ0JoT25acGMybDBaV1FzWEc0Z0lHRTZhRzkyWlhJZ2UxeHVJQ0FnSUhSbGVIUXRaR1ZqYjNKaGRHbHZiam9nZFc1a1pYSnNhVzVsSUNGcGJYQnZjblJoYm5RN1hHNGdJQ0FnWTI5c2IzSTZJQ00xTURkaFptVTdYRzRnSUgxY2JpQWdMeW9nNlpxUTZKZVA1YXFTNUwyVDVxQ0g1NjIrSUNvdlhHNGdJSFpwWkdWdkxGeHVJQ0JoZFdScGJ5QjdYRzRnSUNBZ1pHbHpjR3hoZVRvZ2JtOXVaU0FoYVcxd2IzSjBZVzUwTzF4dUlDQjlYRzRnSUM4cUlPZWhydVMvbmVpaHFPYWd2T1djcU9hSmsrV05zT2FYdHVlYWhPaSt1ZWFoaHVXU2pPV3Z1ZW05a09hV3VlVzhqK2E0aGVhWnNDQXFMMXh1SUNCMFlXSnNaU0I3WEc0Z0lDQWdkMmxrZEdnNklERXdNQ1U3WEc0Z0lDQWdZbTl5WkdWeUxXTnZiR3hoY0hObE9pQmpiMnhzWVhCelpUdGNiaUFnZlZ4dUlDQjBhQ3hjYmlBZ2RHUWdlMXh1SUNBZ0lHSnZjbVJsY2pvZ01YQjRJSE52Ykdsa0lDTmtZMlJtWlRZN1hHNGdJQ0FnY0dGa1pHbHVaem9nT0hCNElESXdjSGc3WEc0Z0lIMWNiaUFnTG05MWRHeHBibVV0YldWemMyRm5aU3hjYmlBZ0xtOTFkR3hwYm1VdGRHOXZiR0poY2lCN1hHNGdJQ0FnTHlvZzZacVE2SmVQNUxxRzViZWw1WVczNXFDUDVaS001TCtoNW9HdjVvK1E1NlM2NXFHR0lDb3ZYRzRnSUNBZ1pHbHpjR3hoZVRvZ2JtOXVaU0FoYVcxd2IzSjBZVzUwTzF4dUlDQjlYRzRnSUM1dmRYUnNhVzVsTFhKbFlXUmxjaUI3WEc0Z0lDQWdaR2x6Y0d4aGVUb2dZbXh2WTJzZ0lXbHRjRzl5ZEdGdWREdGNiaUFnSUNCdmRtVnlabXh2ZHpvZ2FHbGtaR1Z1TzF4dUlDQWdJQzhxSU9XUGx1YTJpT1M2aHVlN25lV3Z1ZVd1bXVTOWpTQXFMMXh1SUNBZ0lDOHFJT21ha09pWGorbVloZWl2dStpL20rVzZwdWFkb1NBcUwxeHVJQ0FnSUM4cUlPYUprK1dOc09hWHR1UzRqZWFZdnVla3V1YXRvK2FXaHlCRVQwMGc1NXFFNlppMDViMng1cFdJNXA2Y0lDb3ZYRzRnSUNBZ0x5b2c1b21BNXB5SjVwYUg1NnVnNVlhRjVhNjVJRVJQVFNEbm03amxoYlBubW9UcGdydmxzWVhvaW9MbmdybnBnNzNwbXBEb2w0L2t1b1lnS2k5Y2JpQWdmVnh1SUNBdWIzVjBiR2x1WlMxeVpXRmtaWEpmWDNScGRHeGxJSHRjYmlBZ0lDQnRZWEpuYVc0NklERXpMalJ3ZENBd0lESTRjSFFnSVdsdGNHOXlkR0Z1ZER0Y2JpQWdJQ0IwWlhoMExXRnNhV2R1T2lCalpXNTBaWElnSVdsdGNHOXlkR0Z1ZER0Y2JpQWdJQ0JtYjI1MExYTnBlbVU2SURNeWNIUWdJV2x0Y0c5eWRHRnVkRHRjYmlBZ2ZWeHVJQ0F1YjNWMGJHbHVaUzF5WldGa1pYSXRMWEpsWVdScGJtY2dlMXh1SUNBZ0lIQnZjMmwwYVc5dU9pQnlaV3hoZEdsMlpTQWhhVzF3YjNKMFlXNTBPMXh1SUNBZ0lHaGxhV2RvZERvZ1lYVjBieUFoYVcxd2IzSjBZVzUwTzF4dUlDQWdJSEJoWkdScGJtYzZJREFnSVdsdGNHOXlkR0Z1ZER0Y2JpQWdJQ0JpWVdOclozSnZkVzVrTFdOdmJHOXlPaUFqWm1abU8xeHVJQ0FnSUc5MlpYSm1iRzkzT2lCb2FXUmtaVzRnSVdsdGNHOXlkR0Z1ZER0Y2JpQWdmVnh1SUNBdWIzVjBiR2x1WlMxeVpXRmtaWEpmWDNCeWIyZHlaWE56SUh0Y2JpQWdJQ0JrYVhOd2JHRjVPaUJ1YjI1bElDRnBiWEJ2Y25SaGJuUTdYRzRnSUgxY2JpQWdMbTkxZEd4cGJtVXRjbVZoWkdWeVgxOXdZWEJsY2lCN1hHNGdJQ0FnWW05NExYTm9ZV1J2ZHpvZ2JtOXVaVHRjYmlBZ2ZWeHVJQ0F1YjNWMGJHbHVaUzF5WldGa1pYSWdjSEpsSUh0Y2JpQWdJQ0J3WVdSa2FXNW5PaUF4WlcwZ0lXbHRjRzl5ZEdGdWREdGNiaUFnSUNCaWIzSmtaWEk2SURGd2VDQnpiMnhwWkNBalpHUmtJQ0ZwYlhCdmNuUmhiblE3WEc0Z0lDQWdZbTl5WkdWeUxYSmhaR2wxY3pvZ05IQjRJQ0ZwYlhCdmNuUmhiblE3WEc0Z0lIMWNiaUFnTG05MWRHeHBibVV0Y21WaFpHVnlJSEJ5WlN4Y2JpQWdMbTkxZEd4cGJtVXRjbVZoWkdWeUlHTnZaR1VnZTF4dUlDQWdJR0poWTJ0bmNtOTFibVF0WTI5c2IzSTZJQ05tWm1ZZ0lXbHRjRzl5ZEdGdWREdGNiaUFnZlZ4dUlDQXViM1YwYkdsdVpTMXlaV0ZrWlhJZ2RHRmliR1VzWEc0Z0lDNXZkWFJzYVc1bExYSmxZV1JsY2lCcGJXY3NYRzRnSUM1dmRYUnNhVzVsTFhKbFlXUmxjaUJ6ZG1jZ2UxeHVJQ0FnSUdKeVpXRnJMV2x1YzJsa1pUb2dZWFp2YVdRN1hHNGdJSDFjYmlBZ0xtOTFkR3hwYm1VdGNtVmhaR1Z5WDNOcFlteHBibWNnZTF4dUlDQWdJR1JwYzNCc1lYazZJRzV2Ym1VZ0lXbHRjRzl5ZEdGdWREdGNiaUFnZlZ4dWZWeHVMeW9nUFQwOVBUMDlQVDA5UFNCaWRYUjBiMjV6TG5Sb1pXMWxJQzBnNW95SjZaS3U1YSs4NklpcTVxQzM1YnlQSUQwOVBUMDlQVDA5UFQwZ0tpOWNiaTV2ZFhSc2FXNWxMWFJ2YjJ4aVlYSWdlMXh1SUNCd2IzTnBkR2x2YmpvZ1ptbDRaV1E3WEc0Z0lIb3RhVzVrWlhnNklEazVPVGs1TzF4dUlDQnRZWEpuYVc0NklEQTdYRzRnSUhSeVlXNXphWFJwYjI0dFpIVnlZWFJwYjI0NklEQXVNM003WEc0Z0lHOTJaWEptYkc5M09pQm9hV1JrWlc0N1hHNTlYRzR1YjNWMGJHbHVaUzEwYjI5c1ltRnlYMTlpZFhSMGIyNGdlMXh1SUNCaWIzZ3RjMmhoWkc5M09pQXdJREFnTm5CNElERndlQ0FqWkdOa1ptVTJPMXh1SUNCd2IzTnBkR2x2YmpvZ2NtVnNZWFJwZG1VN1hHNGdJSG90YVc1a1pYZzZJREU3WEc0Z0lHMWhjbWRwYmpvZ01UQndlRHRjYmlBZ2QybGtkR2c2SURNMmNIZzdYRzRnSUdobGFXZG9kRG9nTXpad2VEdGNiaUFnWW05eVpHVnlPaUF4Y0hnZ2MyOXNhV1FnSTJSalpHWmxOanRjYmlBZ1ltOXlaR1Z5TFhKaFpHbDFjem9nTTNCNE8xeHVJQ0JpYjNndGMybDZhVzVuT2lCaWIzSmtaWEl0WW05NE8xeHVJQ0JpWVdOclozSnZkVzVrTFdOdmJHOXlPaUFqWm1abU8xeHVJQ0JqZFhKemIzSTZJSEJ2YVc1MFpYSTdYRzRnSUhSbGVIUXRZV3hwWjI0NklHTmxiblJsY2p0Y2JpQWdZMjlzYjNJNklDTTVPVGs3WEc0Z0lIUnlZVzV6YVhScGIyNDZJR0ZzYkNBd0xqTnpJREF1TVhNZ1pXRnpaUzFwYmkxdmRYUTdYRzRnSUc5MlpYSm1iRzkzT2lCb2FXUmtaVzQ3WEc1OVhHNHViM1YwYkdsdVpTMTBiMjlzWW1GeVgxOWlkWFIwYjI0NmFHOTJaWElnZTF4dUlDQmpiMnh2Y2pvZ0l6QTFPRGswTWp0Y2JpQWdZbTl5WkdWeUxXTnZiRzl5T2lBak1EVTRPVFF5TzF4dUlDQjBjbUZ1YzJadmNtMDZJSE5qWVd4bEtERXVNelVwTzF4dWZWeHVMbTkxZEd4cGJtVXRkRzl2YkdKaGNsOWZZblYwZEc5dUxtaHBaR1VnZTF4dUlDQmthWE53YkdGNU9pQnViMjVsTzF4dWZWeHVMbTkxZEd4cGJtVXRkRzl2YkdKaGNsOWZZVzVqYUc5eU9teHBibXNzWEc0dWIzVjBiR2x1WlMxMGIyOXNZbUZ5WDE5aGJtTm9iM0k2ZG1semFYUmxaQ3hjYmk1dmRYUnNhVzVsTFhSdmIyeGlZWEpmWDJGdVkyaHZjanBvYjNabGNpQjdYRzRnSUdOdmJHOXlPaUFqT1RrNU8xeHVJQ0IwWlhoMExXUmxZMjl5WVhScGIyNDZJRzV2Ym1VN1hHNTlYRzR1YjNWMGJHbHVaUzEwYjI5c1ltRnlYMTloYm1Ob2IzSTZhRzkyWlhJZ2UxeHVJQ0JqYjJ4dmNqb2dJekExT0RrME1qdGNibjFjYmk1dmRYUnNhVzVsTFhSdmIyeGlZWEpmWDJsamIyNGdlMXh1SUNCd2IzTnBkR2x2YmpvZ1lXSnpiMngxZEdVN1hHNGdJSG90YVc1a1pYZzZJREk3WEc0Z0lIUnZjRG9nTlRBbE8xeHVJQ0JzWldaME9pQTFNQ1U3WEc0Z0lIZHBaSFJvT2lBeU1IQjRPMXh1SUNCb1pXbG5hSFE2SURJd2NIZzdYRzRnSUhSeVlXNXpabTl5YlRvZ2RISmhibk5zWVhSbEtDMDFNQ1VzSUMwMU1DVXBPMXh1SUNCbWFXeHNPaUJqZFhKeVpXNTBZMjlzYjNJN1hHNGdJRzkyWlhKbWJHOTNPaUJvYVdSa1pXNDdYRzU5WEc0dWIzVjBiR2x1WlMxMGIyOXNZbUZ5WDJGamRHbDJaUzV2ZFhSc2FXNWxMWFJ2YjJ4aVlYSmZYMkoxZEhSdmJpQjdYRzRnSUdOdmJHOXlPaUFqWm1abU8xeHVJQ0JpWVdOclozSnZkVzVrTFdOdmJHOXlPaUFqTURVNE9UUXlPMXh1SUNCaWIzSmtaWEl0WTI5c2IzSTZJQ013TlRnNU5ESTdYRzU5WEc0dWIzVjBiR2x1WlMxMGIyOXNZbUZ5WDJGamRHbDJaUzV2ZFhSc2FXNWxMWFJ2YjJ4aVlYSmZYMkoxZEhSdmJqcG9iM1psY2lCN1hHNGdJR052Ykc5eU9pQWpabVptTzF4dWZWeHVMbTkxZEd4cGJtVXRkRzl2YkdKaGNsOWhZM1JwZG1VZ0xtOTFkR3hwYm1VdGRHOXZiR0poY2w5ZllXNWphRzl5T214cGJtc3NYRzR1YjNWMGJHbHVaUzEwYjI5c1ltRnlYMkZqZEdsMlpTQXViM1YwYkdsdVpTMTBiMjlzWW1GeVgxOWhibU5vYjNJNmRtbHphWFJsWkN4Y2JpNXZkWFJzYVc1bExYUnZiMnhpWVhKZllXTjBhWFpsSUM1dmRYUnNhVzVsTFhSdmIyeGlZWEpmWDJGdVkyaHZjanBvYjNabGNpQjdYRzRnSUdOdmJHOXlPaUFqWm1abU8xeHVmVnh1TG05MWRHeHBibVV0ZEc5dmJHSmhjbDl5YjNWdVpHVmtMbTkxZEd4cGJtVXRkRzl2YkdKaGNsOWZZblYwZEc5dUlIdGNiaUFnWW05eVpHVnlMWEpoWkdsMWN6b2dNVGh3ZUR0Y2JuMWNiaTV2ZFhSc2FXNWxMWFJ2YjJ4aVlYSmZaR2x6WVdKc1pXUXViM1YwYkdsdVpTMTBiMjlzWW1GeVgxOWhibU5vYjNJNmJHbHVheXhjYmk1dmRYUnNhVzVsTFhSdmIyeGlZWEpmWkdsellXSnNaV1FnTG05MWRHeHBibVV0ZEc5dmJHSmhjbDlmWVc1amFHOXlPbXhwYm1zc1hHNHViM1YwYkdsdVpTMTBiMjlzWW1GeVgyUnBjMkZpYkdWa0xtOTFkR3hwYm1VdGRHOXZiR0poY2w5ZllXNWphRzl5T25acGMybDBaV1FzWEc0dWIzVjBiR2x1WlMxMGIyOXNZbUZ5WDJScGMyRmliR1ZrSUM1dmRYUnNhVzVsTFhSdmIyeGlZWEpmWDJGdVkyaHZjanAyYVhOcGRHVmtMRnh1TG05MWRHeHBibVV0ZEc5dmJHSmhjbDlrYVhOaFlteGxaQzV2ZFhSc2FXNWxMWFJ2YjJ4aVlYSmZYMkZ1WTJodmNqcG9iM1psY2l4Y2JpNXZkWFJzYVc1bExYUnZiMnhpWVhKZlpHbHpZV0pzWldRZ0xtOTFkR3hwYm1VdGRHOXZiR0poY2w5ZllXNWphRzl5T21odmRtVnlMRnh1TG05MWRHeHBibVV0ZEc5dmJHSmhjbDlrYVhOaFlteGxaQzV2ZFhSc2FXNWxMWFJ2YjJ4aVlYSmZYMkoxZEhSdmJpeGNiaTV2ZFhSc2FXNWxMWFJ2YjJ4aVlYSmZaR2x6WVdKc1pXUWdMbTkxZEd4cGJtVXRkRzl2YkdKaGNsOWZZblYwZEc5dUlIdGNiaUFnWTNWeWMyOXlPaUJ1YjNRdFlXeHNiM2RsWkR0Y2JpQWdZMjlzYjNJNklDTTVPVGs3WEc0Z0lHSnZjbVJsY2kxamIyeHZjam9nSXprNU9UdGNibjFjYmk1dmRYUnNhVzVsTFhSdmIyeGlZWEpmWkdsellXSnNaV1F1YjNWMGJHbHVaUzEwYjI5c1ltRnlYMTloYm1Ob2IzSTZiR2x1YXpwb2IzWmxjaXhjYmk1dmRYUnNhVzVsTFhSdmIyeGlZWEpmWkdsellXSnNaV1FnTG05MWRHeHBibVV0ZEc5dmJHSmhjbDlmWVc1amFHOXlPbXhwYm1zNmFHOTJaWElzWEc0dWIzVjBiR2x1WlMxMGIyOXNZbUZ5WDJScGMyRmliR1ZrTG05MWRHeHBibVV0ZEc5dmJHSmhjbDlmWVc1amFHOXlPblpwYzJsMFpXUTZhRzkyWlhJc1hHNHViM1YwYkdsdVpTMTBiMjlzWW1GeVgyUnBjMkZpYkdWa0lDNXZkWFJzYVc1bExYUnZiMnhpWVhKZlgyRnVZMmh2Y2pwMmFYTnBkR1ZrT21odmRtVnlMRnh1TG05MWRHeHBibVV0ZEc5dmJHSmhjbDlrYVhOaFlteGxaQzV2ZFhSc2FXNWxMWFJ2YjJ4aVlYSmZYMkZ1WTJodmNqcG9iM1psY2pwb2IzWmxjaXhjYmk1dmRYUnNhVzVsTFhSdmIyeGlZWEpmWkdsellXSnNaV1FnTG05MWRHeHBibVV0ZEc5dmJHSmhjbDlmWVc1amFHOXlPbWh2ZG1WeU9taHZkbVZ5TEZ4dUxtOTFkR3hwYm1VdGRHOXZiR0poY2w5a2FYTmhZbXhsWkM1dmRYUnNhVzVsTFhSdmIyeGlZWEpmWDJKMWRIUnZianBvYjNabGNpeGNiaTV2ZFhSc2FXNWxMWFJ2YjJ4aVlYSmZaR2x6WVdKc1pXUWdMbTkxZEd4cGJtVXRkRzl2YkdKaGNsOWZZblYwZEc5dU9taHZkbVZ5SUh0Y2JpQWdZMjlzYjNJNklDTTVPVGs3WEc0Z0lHSnZjbVJsY2kxamIyeHZjam9nSXprNU9UdGNibjFjYmk1dmRYUnNhVzVsTFhSdmIyeGlZWEpmWkdsellXSnNaV1F1YjNWMGJHbHVaUzEwYjI5c1ltRnlYMTlpZFhSMGIyNHNYRzR1YjNWMGJHbHVaUzEwYjI5c1ltRnlYMlJwYzJGaWJHVmtJQzV2ZFhSc2FXNWxMWFJ2YjJ4aVlYSmZYMkoxZEhSdmJpQjdYRzRnSUdKaFkydG5jbTkxYm1RdFkyOXNiM0k2SUNObU5XWTFaalU3WEc1OVhHNHViM1YwYkdsdVpTMTBiMjlzWW1GeVgzUjBZaXhjYmk1dmRYUnNhVzVsTFhSdmIyeGlZWEpmWW5SMElIdGNiaUFnYkdWbWREb2dOVEFsTzF4dUlDQjBjbUZ1YzJadmNtMDZJSFJ5WVc1emJHRjBaVmdvTFRVd0pTazdYRzU5WEc0dWIzVjBiR2x1WlMxMGIyOXNZbUZ5WDNSMFlpQXViM1YwYkdsdVpTMTBiMjlzWW1GeVgxOWlkWFIwYjI0c1hHNHViM1YwYkdsdVpTMTBiMjlzWW1GeVgySjBkQ0F1YjNWMGJHbHVaUzEwYjI5c1ltRnlYMTlpZFhSMGIyNGdlMXh1SUNCa2FYTndiR0Y1T2lCcGJteHBibVV0WW14dlkyczdYRzU5WEc0dWIzVjBiR2x1WlMxMGIyOXNZbUZ5WDNSMFlpQjdYRzRnSUhSdmNEb2dNVEp3ZUR0Y2JuMWNiaTV2ZFhSc2FXNWxMWFJ2YjJ4aVlYSmZkSFJpTG05MWRHeHBibVV0ZEc5dmJHSmhjbDlvYVdSa1pXNGdlMXh1SUNCMGIzQTZJQzAxTm5CNE8xeHVmVnh1TG05MWRHeHBibVV0ZEc5dmJHSmhjbDlpZEhRZ2UxeHVJQ0JpYjNSMGIyMDZJREV5Y0hnN1hHNTlYRzR1YjNWMGJHbHVaUzEwYjI5c1ltRnlYMkowZEM1dmRYUnNhVzVsTFhSdmIyeGlZWEpmYUdsa1pHVnVJSHRjYmlBZ1ltOTBkRzl0T2lBdE5UWndlRHRjYm4xY2JpNXZkWFJzYVc1bExYUnZiMnhpWVhKZmNuUnNMRnh1TG05MWRHeHBibVV0ZEc5dmJHSmhjbDlzZEhJZ2UxeHVJQ0IwY21GdWMyWnZjbTA2SUhSeVlXNXpiR0YwWlZrb0xUVXdKU2s3WEc0Z0lIZHBaSFJvT2lBMU5uQjRPMXh1ZlZ4dUxtOTFkR3hwYm1VdGRHOXZiR0poY2w5eWRHd2dlMXh1SUNCMGIzQTZJRFV3SlR0Y2JpQWdjbWxuYUhRNklERXljSGc3WEc1OVhHNHViM1YwYkdsdVpTMTBiMjlzWW1GeVgzSjBiQzV2ZFhSc2FXNWxMWFJ2YjJ4aVlYSmZhR2xrWkdWdUlIdGNiaUFnY21sbmFIUTZJQzA0Tm5CNE8xeHVmVnh1TG05MWRHeHBibVV0ZEc5dmJHSmhjbDlzZEhJZ2UxeHVJQ0IwYjNBNklEVXdKVHRjYmlBZ2JHVm1kRG9nTVRKd2VEdGNibjFjYmk1dmRYUnNhVzVsTFhSdmIyeGlZWEpmYkhSeUxtOTFkR3hwYm1VdGRHOXZiR0poY2w5b2FXUmtaVzRnZTF4dUlDQnNaV1owT2lBdE9EWndlRHRjYm4xY2JpNXZkWFJzYVc1bExYUnZiMnhpWVhKZmRIUmlJQzV2ZFhSc2FXNWxMWFJ2YjJ4aVlYSmZYMkoxZEhSdmJpNXZkWFJzYVc1bExYUnZiMnhpWVhKZmFHbGtaR1Z1TEZ4dUxtOTFkR3hwYm1VdGRHOXZiR0poY2w5eWRHd2dMbTkxZEd4cGJtVXRkRzl2YkdKaGNsOWZZblYwZEc5dUxtOTFkR3hwYm1VdGRHOXZiR0poY2w5b2FXUmtaVzRzWEc0dWIzVjBiR2x1WlMxMGIyOXNZbUZ5WDJKMGRDQXViM1YwYkdsdVpTMTBiMjlzWW1GeVgxOWlkWFIwYjI0dWIzVjBiR2x1WlMxMGIyOXNZbUZ5WDJocFpHUmxiaXhjYmk1dmRYUnNhVzVsTFhSdmIyeGlZWEpmYkhSeUlDNXZkWFJzYVc1bExYUnZiMnhpWVhKZlgySjFkSFJ2Ymk1dmRYUnNhVzVsTFhSdmIyeGlZWEpmYUdsa1pHVnVJSHRjYmlBZ1pHbHpjR3hoZVRvZ2JtOXVaVHRjYm4xY2JpNXZkWFJzYVc1bExXMWxjM05oWjJVZ2UxeHVJQ0JpYjNKa1pYSXRjbUZrYVhWek9pQXpjSGc3WEc0Z0lHSnZlQzF6YUdGa2IzYzZJREFnTUNBMmNIZ2dNWEI0SUNOa1kyUm1aVFk3WEc0Z0lIQnZjMmwwYVc5dU9pQm1hWGhsWkR0Y2JpQWdlaTFwYm1SbGVEb2dPVGs1T1R0Y2JpQWdiM0JoWTJsMGVUb2dNQzR4TzF4dUlDQjBiM0E2SUMwMU1IQjRPMXh1SUNCc1pXWjBPaUExTUNVN1hHNGdJR2hsYVdkb2REb2dOREJ3ZUR0Y2JpQWdiV0Z5WjJsdU9pQXdPMXh1SUNCd1lXUmthVzVuT2lBd0lEVXdjSGc3WEc0Z0lHeHBibVV0YUdWcFoyaDBPaUEwTUhCNE8xeHVJQ0JtYjI1MExYTnBlbVU2SURFemNIZzdYRzRnSUdKaFkydG5jbTkxYm1RdFkyOXNiM0k2SUNObVptWTdYRzRnSUdOdmJHOXlPaUFqTmpZMk8xeHVJQ0IwY21GdWMybDBhVzl1T2lCaGJHd2dNQzQxY3lCbFlYTmxMV2x1TFc5MWREdGNiaUFnZEhKaGJuTm1iM0p0T2lCMGNtRnVjMnhoZEdWWUtDMDFNQ1VwTzF4dUlDQnZkbVZ5Wm14dmR6b2dhR2xrWkdWdU8xeHVmVnh1TG05MWRHeHBibVV0YldWemMyRm5aVjlmWTI5dWRHVnVkQ0I3WEc0Z0lIZG9hWFJsTFhOd1lXTmxPaUJ1YjNkeVlYQTdYRzRnSUhSbGVIUXRiM1psY21ac2IzYzZJR1ZzYkdsd2MybHpPMXh1SUNCdFlYSm5hVzQ2SURBN1hHNGdJRzFoZUMxM2FXUjBhRG9nTnpBd2NIZzdYRzRnSUdobGFXZG9kRG9nTkRCd2VEdGNiaUFnYkdsdVpTMW9aV2xuYUhRNklEUXdjSGc3WEc0Z0lHWnZiblF0YzJsNlpUb2dNVE53ZUR0Y2JpQWdZMjlzYjNJNklDTTJOalk3WEc0Z0lHOTJaWEptYkc5M09pQm9hV1JrWlc0N1hHNTlYRzR1YjNWMGJHbHVaUzF0WlhOellXZGxYMTlqYkc5elpTeGNiaTV2ZFhSc2FXNWxMVzFsYzNOaFoyVmZYMmxqYjI0Z2UxeHVJQ0J3YjNOcGRHbHZiam9nWVdKemIyeDFkR1U3WEc0Z0lIb3RhVzVrWlhnNklESTdYRzRnSUhSdmNEb2dNRHRjYmlBZ2QybGtkR2c2SURRd2NIZzdYRzRnSUdobGFXZG9kRG9nTkRCd2VEdGNiaUFnYkdsdVpTMW9aV2xuYUhRNklEUXdjSGc3WEc0Z0lIUmxlSFF0WVd4cFoyNDZJR05sYm5SbGNqdGNiaUFnYjNabGNtWnNiM2M2SUdocFpHUmxianRjYm4xY2JpNXZkWFJzYVc1bExXMWxjM05oWjJWZlgybGpiMjRnZTF4dUlDQnNaV1owT2lBd08xeHVJQ0JqYjJ4dmNqb2dJMlptWmp0Y2JuMWNiaTV2ZFhSc2FXNWxMVzFsYzNOaFoyVmZYMmxqYjI0Z0xtOTFkR3hwYm1VdGFXTnZiaUI3WEc0Z0lIQnZjMmwwYVc5dU9pQmhZbk52YkhWMFpUdGNiaUFnZWkxcGJtUmxlRG9nTWp0Y2JpQWdkRzl3T2lBMU1DVTdYRzRnSUd4bFpuUTZJRFV3SlR0Y2JpQWdkSEpoYm5ObWIzSnRPaUIwY21GdWMyeGhkR1VvTFRVd0pTd2dMVFV3SlNrN1hHNTlYRzR1YjNWMGJHbHVaUzF0WlhOellXZGxYMTlqYkc5elpTQjdYRzRnSUhKcFoyaDBPaUF3TzF4dUlDQmpkWEp6YjNJNklIQnZhVzUwWlhJN1hHNGdJR052Ykc5eU9pQWpPVGs1TzF4dWZWeHVMbTkxZEd4cGJtVXRiV1Z6YzJGblpWOWZZMnh2YzJVZ0xtOTFkR3hwYm1VdGFXTnZiaUI3WEc0Z0lIQnZjMmwwYVc5dU9pQmhZbk52YkhWMFpUdGNiaUFnZWkxcGJtUmxlRG9nTWp0Y2JpQWdkRzl3T2lBMU1DVTdYRzRnSUd4bFpuUTZJRFV3SlR0Y2JpQWdkSEpoYm5ObWIzSnRPaUIwY21GdWMyeGhkR1VvTFRVd0pTd2dMVFV3SlNrN1hHNTlYRzR1YjNWMGJHbHVaUzF0WlhOellXZGxYMTlqYkc5elpUcG9iM1psY2lCN1hHNGdJR052Ykc5eU9pQWpOalkyTzF4dWZWeHVMbTkxZEd4cGJtVXRiV1Z6YzJGblpWOXBibVp2SUM1dmRYUnNhVzVsTFcxbGMzTmhaMlZmWDJsamIyNGdlMXh1SUNCaVlXTnJaM0p2ZFc1a0xXTnZiRzl5T2lBak5UQTNZV1psTzF4dWZWeHVMbTkxZEd4cGJtVXRiV1Z6YzJGblpWOTNZWEp1YVc1bklDNXZkWFJzYVc1bExXMWxjM05oWjJWZlgybGpiMjRnZTF4dUlDQmlZV05yWjNKdmRXNWtMV052Ykc5eU9pQWpabVk1T1RBeE8xeHVmVnh1TG05MWRHeHBibVV0YldWemMyRm5aVjl6ZFdOalpYTnpJQzV2ZFhSc2FXNWxMVzFsYzNOaFoyVmZYMmxqYjI0Z2UxeHVJQ0JpWVdOclozSnZkVzVrTFdOdmJHOXlPaUFqTURVNE9UUXlPMXh1ZlZ4dUxtOTFkR3hwYm1VdGJXVnpjMkZuWlY5bGNuSnZjaUF1YjNWMGJHbHVaUzF0WlhOellXZGxYMTlwWTI5dUlIdGNiaUFnWW1GamEyZHliM1Z1WkMxamIyeHZjam9nSTJabU5XUTFaRHRjYm4xY2JpNXZkWFJzYVc1bExXMWxjM05oWjJWZmNHeGhhVzRnZTF4dUlDQnRhVzR0ZDJsa2RHZzZJREU1TUhCNE8xeHVJQ0J3WVdSa2FXNW5PaUF3SURVd2NIZ2dNQ0F4TlhCNE8xeHVmVnh1TG05MWRHeHBibVV0YldWemMyRm5aVjl3YkdGcGJpNXZkWFJzYVc1bExXMWxjM05oWjJWZmFXNW1ieUI3WEc0Z0lHSnZjbVJsY2kxc1pXWjBPaUExY0hnZ2MyOXNhV1FnSXpVd04yRm1aVHRjYmlBZ1ltRmphMmR5YjNWdVpDMWpiMnh2Y2pvZ0kyVmpaamhtWmp0Y2JuMWNiaTV2ZFhSc2FXNWxMVzFsYzNOaFoyVmZjR3hoYVc0dWIzVjBiR2x1WlMxdFpYTnpZV2RsWDNkaGNtNXBibWNnZTF4dUlDQmliM0prWlhJdGJHVm1kRG9nTlhCNElITnZiR2xrSUNObVpqazVNREU3WEc0Z0lHSmhZMnRuY205MWJtUXRZMjlzYjNJNklDTm1abVppWlRZN1hHNTlYRzR1YjNWMGJHbHVaUzF0WlhOellXZGxYM0JzWVdsdUxtOTFkR3hwYm1VdGJXVnpjMkZuWlY5emRXTmpaWE56SUh0Y2JpQWdZbTl5WkdWeUxXeGxablE2SURWd2VDQnpiMnhwWkNBak1EVTRPVFF5TzF4dUlDQmlZV05yWjNKdmRXNWtMV052Ykc5eU9pQWpaVEZtTm1WaU8xeHVmVnh1TG05MWRHeHBibVV0YldWemMyRm5aVjl3YkdGcGJpNXZkWFJzYVc1bExXMWxjM05oWjJWZlpYSnliM0lnZTF4dUlDQmliM0prWlhJdGJHVm1kRG9nTlhCNElITnZiR2xrSUNObVpqVmtOV1E3WEc0Z0lHSmhZMnRuY205MWJtUXRZMjlzYjNJNklDTm1abVl4WmpBN1hHNTlYRzR1YjNWMGJHbHVaUzF0WlhOellXZGxYM0JzWVdsdUlDNXZkWFJzYVc1bExXMWxjM05oWjJWZlgybGpiMjRnZTF4dUlDQjNhV1IwYURvZ01EdGNiaUFnWkdsemNHeGhlVG9nYm05dVpUdGNibjFjYmk1dmRYUnNhVzVsTFcxbGMzTmhaMlZmY0d4aGFXNGdMbTkxZEd4cGJtVXRiV1Z6YzJGblpWOWZhV052YmlBdWIzVjBiR2x1WlMxcFkyOXVJSHRjYmlBZ1pHbHpjR3hoZVRvZ2JtOXVaVHRjYm4xY2JpNXZkWFJzYVc1bExXMWxjM05oWjJWZmJHbG5hSFFnZTF4dUlDQnRhVzR0ZDJsa2RHZzZJREU0TUhCNE8xeHVJQ0J3WVdSa2FXNW5PaUF3SURRd2NIZzdYRzU5WEc0dWIzVjBiR2x1WlMxdFpYTnpZV2RsWDJ4cFoyaDBMbTkxZEd4cGJtVXRiV1Z6YzJGblpWOXBibVp2SUM1dmRYUnNhVzVsTFcxbGMzTmhaMlZmWDJsamIyNGdlMXh1SUNCamIyeHZjam9nSXpVd04yRm1aVHRjYm4xY2JpNXZkWFJzYVc1bExXMWxjM05oWjJWZmJHbG5hSFF1YjNWMGJHbHVaUzF0WlhOellXZGxYM2RoY201cGJtY2dMbTkxZEd4cGJtVXRiV1Z6YzJGblpWOWZhV052YmlCN1hHNGdJR052Ykc5eU9pQWpabVk1T1RBeE8xeHVmVnh1TG05MWRHeHBibVV0YldWemMyRm5aVjlzYVdkb2RDNXZkWFJzYVc1bExXMWxjM05oWjJWZmMzVmpZMlZ6Y3lBdWIzVjBiR2x1WlMxdFpYTnpZV2RsWDE5cFkyOXVJSHRjYmlBZ1kyOXNiM0k2SUNNd05UZzVOREk3WEc1OVhHNHViM1YwYkdsdVpTMXRaWE56WVdkbFgyeHBaMmgwTG05MWRHeHBibVV0YldWemMyRm5aVjlsY25KdmNpQXViM1YwYkdsdVpTMXRaWE56WVdkbFgxOXBZMjl1SUh0Y2JpQWdZMjlzYjNJNklDTm1aalZrTldRN1hHNTlYRzR1YjNWMGJHbHVaUzF0WlhOellXZGxYMnhwWjJoMElDNXZkWFJzYVc1bExXMWxjM05oWjJWZlgybGpiMjRnZTF4dUlDQmlZV05yWjNKdmRXNWtMV052Ykc5eU9pQWpabVptTzF4dWZWeHVMbTkxZEd4cGJtVXRiV1Z6YzJGblpWOXliM1Z1WkNCN1hHNGdJR0p2Y21SbGNpMXlZV1JwZFhNNklESXdjSGc3WEc1OVhHNHViM1YwYkdsdVpTMXRaWE56WVdkbFgzSnZkVzVrTG05MWRHeHBibVV0YldWemMyRm5aVjlrWldaaGRXeDBJSHRjYmlBZ2JXbHVMWGRwWkhSb09pQXhPREJ3ZUR0Y2JpQWdjR0ZrWkdsdVp6b2dNQ0EwTUhCNE8xeHVmVnh1TG05MWRHeHBibVV0YldWemMyRm5aVjl5YjNWdVpDNXZkWFJzYVc1bExXMWxjM05oWjJWZlpHVm1ZWFZzZENBdWIzVjBiR2x1WlMxdFpYTnpZV2RsWDE5cFkyOXVJSHRjYmlBZ1ltOXlaR1Z5TFhKaFpHbDFjem9nTVRCd2VEdGNiaUFnZEc5d09pQXhNSEI0TzF4dUlDQnNaV1owT2lBeE1IQjRPMXh1SUNCM2FXUjBhRG9nTWpCd2VEdGNiaUFnYUdWcFoyaDBPaUF5TUhCNE8xeHVJQ0JzYVc1bExXaGxhV2RvZERvZ01qQndlRHRjYm4xY2JpNXZkWFJzYVc1bExXMWxjM05oWjJWZmNtOTFibVF1YjNWMGJHbHVaUzF0WlhOellXZGxYMlJsWm1GMWJIUXViM1YwYkdsdVpTMXRaWE56WVdkbFgyWjFiR3d0ZDJsa2RHZ2dlMXh1SUNCdGFXNHRkMmxrZEdnNklESXdNSEI0TzF4dUlDQndZV1JrYVc1bk9pQXdJREl3Y0hnZ01DQTBNSEI0TzF4dWZWeHVMbTkxZEd4cGJtVXRiV1Z6YzJGblpWOXliM1Z1WkM1dmRYUnNhVzVsTFcxbGMzTmhaMlZmY0d4aGFXNGdlMXh1SUNCdGFXNHRkMmxrZEdnNklERTVOWEI0TzF4dUlDQndZV1JrYVc1bk9pQXdJRFF3Y0hnZ01DQXlNSEI0TzF4dWZWeHVMbTkxZEd4cGJtVXRiV1Z6YzJGblpWOXliM1Z1WkM1dmRYUnNhVzVsTFcxbGMzTmhaMlZmY0d4aGFXNHViM1YwYkdsdVpTMXRaWE56WVdkbFgyWjFiR3d0ZDJsa2RHZ2dlMXh1SUNCdGFXNHRkMmxrZEdnNklESXhOWEI0TzF4dUlDQndZV1JrYVc1bk9pQXdJREl3Y0hnN1hHNTlYRzR1YjNWMGJHbHVaUzF0WlhOellXZGxYMloxYkd3dGQybGtkR2dnZTF4dUlDQnRhVzR0ZDJsa2RHZzZJREl3TUhCNE8xeHVJQ0J3WVdSa2FXNW5PaUF3SURFd2NIZ2dNQ0ExTUhCNE8xeHVmVnh1TG05MWRHeHBibVV0YldWemMyRm5aVjltZFd4c0xYZHBaSFJvTG05MWRHeHBibVV0YldWemMyRm5aVjl3YkdGcGJpQjdYRzRnSUcxcGJpMTNhV1IwYURvZ01qTXdjSGc3WEc0Z0lIQmhaR1JwYm1jNklEQWdNVEJ3ZUNBd0lERTFjSGc3WEc1OVhHNHViM1YwYkdsdVpTMXRaWE56WVdkbFgyWjFiR3d0ZDJsa2RHZ3ViM1YwYkdsdVpTMXRaWE56WVdkbFgyeHBaMmgwSUh0Y2JpQWdiV2x1TFhkcFpIUm9PaUF5TVRCd2VEdGNiaUFnY0dGa1pHbHVaem9nTUNBeE1IQjRJREFnTkRCd2VEdGNibjFjYmk1dmRYUnNhVzVsTFcxbGMzTmhaMlZmZG1semFXSnNaU0I3WEc0Z0lHOXdZV05wZEhrNklERTdYRzU5WEc0dWIzVjBiR2x1WlMxdFpYTnpZV2RsWDJocFpHUmxiaUI3WEc0Z0lHUnBjM0JzWVhrNklHNXZibVU3WEc1OVhHNHZLaUE5UFQwOVBTQlRZM0p2Ykd4aVlYSWdQVDA5UFQwZ0tpOWNiam82TFhkbFltdHBkQzF6WTNKdmJHeGlZWElnZTF4dUlDQjNhV1IwYURvZ04zQjRPMXh1SUNCb1pXbG5hSFE2SURkd2VEdGNiaUFnTFhkbFltdHBkQzFpYjNKa1pYSXRjbUZrYVhWek9pQTFjSGc3WEc1OVhHNDZPaTEzWldKcmFYUXRjMk55YjJ4c1ltRnlMWFJ5WVdOckxYQnBaV05sSUh0Y2JpQWdMWGRsWW10cGRDMWliM0prWlhJdGNtRmthWFZ6T2lBMWNIZzdYRzU5WEc0Nk9pMTNaV0pyYVhRdGMyTnliMnhzWW1GeUxYUm9kVzFpT25abGNuUnBZMkZzSUh0Y2JpQWdZbUZqYTJkeWIzVnVaQzFqYjJ4dmNqb2djbWRpWVNnd0xDQXdMQ0F3TENBd0xqSTFLVHRjYmlBZ0xYZGxZbXRwZEMxaWIzSmtaWEl0Y21Ga2FYVnpPaUExY0hnN1hHNTlYRzQ2T2kxM1pXSnJhWFF0YzJOeWIyeHNZbUZ5TFhSb2RXMWlPbWh2Y21sNmIyNTBZV3dnZTF4dUlDQmlZV05yWjNKdmRXNWtMV052Ykc5eU9pQnlaMkpoS0RBc0lEQXNJREFzSURBdU1qVXBPMXh1SUNBdGQyVmlhMmwwTFdKdmNtUmxjaTF5WVdScGRYTTZJRFZ3ZUR0Y2JuMWNiam82TFhkbFltdHBkQzF6WTNKdmJHeGlZWEl0ZEdoMWJXSTZhRzkyWlhJZ2UxeHVJQ0JpWVdOclozSnZkVzVrTFdOdmJHOXlPaUJ5WjJKaEtEQXNJREFzSURBc0lEQXVNelVwTzF4dWZWeHVPam90ZDJWaWEybDBMWE5qY205c2JHSmhjanBvYjNabGNpQjdYRzRnSUdKaFkydG5jbTkxYm1RdFkyOXNiM0k2SUhKblltRW9NQ3dnTUN3Z01Dd2dNQzR4TlNrN1hHNTlYRzRpTENJdktpQTlQVDA5UFNCVFkzSnZiR3hpWVhJZ1BUMDlQVDBnS2k5Y2NseHVPam90ZDJWaWEybDBMWE5qY205c2JHSmhjaUI3WEhKY2JpQWdkMmxrZEdnNklEZHdlRHRjY2x4dUlDQm9aV2xuYUhRNklEZHdlRHRjY2x4dUlDQXRkMlZpYTJsMExXSnZjbVJsY2kxeVlXUnBkWE02SURWd2VEdGNjbHh1ZlZ4eVhHNWNjbHh1T2pvdGQyVmlhMmwwTFhOamNtOXNiR0poY2kxMGNtRmpheTF3YVdWalpTQjdYSEpjYmlBZ0xYZGxZbXRwZEMxaWIzSmtaWEl0Y21Ga2FYVnpPaUExY0hnN1hISmNibjFjY2x4dVhISmNiam82TFhkbFltdHBkQzF6WTNKdmJHeGlZWEl0ZEdoMWJXSTZkbVZ5ZEdsallXd2dlMXh5WEc0Z0lHSmhZMnRuY205MWJtUXRZMjlzYjNJNklISm5ZbUVvTUN3Z01Dd2dNQ3dnTUM0eU5TazdYSEpjYmlBZ0xYZGxZbXRwZEMxaWIzSmtaWEl0Y21Ga2FYVnpPaUExY0hnN1hISmNibjFjY2x4dVhISmNiam82TFhkbFltdHBkQzF6WTNKdmJHeGlZWEl0ZEdoMWJXSTZhRzl5YVhwdmJuUmhiQ0I3WEhKY2JpQWdZbUZqYTJkeWIzVnVaQzFqYjJ4dmNqb2djbWRpWVNnd0xDQXdMQ0F3TENBd0xqSTFLVHRjY2x4dUlDQXRkMlZpYTJsMExXSnZjbVJsY2kxeVlXUnBkWE02SURWd2VEdGNjbHh1ZlZ4eVhHNWNjbHh1T2pvdGQyVmlhMmwwTFhOamNtOXNiR0poY2pwb2IzWmxjaUI3WEhKY2JpQWdZbUZqYTJkeWIzVnVaQzFqYjJ4dmNqb2djbWRpWVNnd0xDQXdMQ0F3TENBd0xqRTFLVHRjY2x4dWZWeHlYRzVjY2x4dU9qb3RkMlZpYTJsMExYTmpjbTlzYkdKaGNpMTBhSFZ0WWpwb2IzWmxjaUI3WEhKY2JpQWdZbUZqYTJkeWIzVnVaQzFqYjJ4dmNqb2djbWRpWVNnd0xDQXdMQ0F3TENBd0xqTTFLVHRjY2x4dWZWeHlYRzRpTENKQWFXMXdiM0owSUNjdUwyTnZiRzl5Y3ljN1hISmNibHh5WEc0dWMyVmpkR2x2YmlCN1hISmNiaUFnYldGeVoybHVPaUF4WlcwZ01EdGNjbHh1SUNCdmRtVnlabXh2ZHpvZ2FHbGtaR1Z1TzF4eVhHNWNjbHh1SUNBbVgxOW9aV0ZrWlhJc1hISmNiaUFnSmw5ZlkyOXVkR1Z1ZEN4Y2NseHVJQ0FtWDE5bWIyOTBaWElnZTF4eVhHNGdJQ0FnYldGeVoybHVPaUF3TzF4eVhHNGdJQ0FnY0dGa1pHbHVaem9nTUNBelpXMDdYSEpjYmlBZ0lDQnZkbVZ5Wm14dmR6b2dhR2xrWkdWdU8xeHlYRzRnSUgxY2NseHVYSEpjYmlBZ0psOWZkR2wwYkdVZ2UxeHlYRzRnSUNBZ1kyOXNiM0k2SUVCMGFHbHlaRjkwWlhoMFgyTnZiRzl5TzF4eVhHNGdJSDFjY2x4dVhISmNiaUFnSmw5ZmFETWdlMXh5WEc0Z0lDQWdZMjlzYjNJNklFQndjbWx0WVhKNVgyTnZiRzl5TzF4eVhHNGdJQ0FnWm05dWRDMXphWHBsT2lBeExqTTFaVzA3WEhKY2JpQWdmVnh5WEc1Y2NseHVJQ0FtWDE5b05DQjdYSEpjYmlBZ0lDQm1iMjUwTFhOcGVtVTZJREV1TVdWdE8xeHlYRzRnSUNBZ1kyOXNiM0k2SUVCMGFHbHlaRjkwWlhoMFgyTnZiRzl5TzF4eVhHNGdJSDFjY2x4dVhISmNiaUFnSmw5ZmFEVWdlMXh5WEc0Z0lDQWdabTl1ZEMxemFYcGxPaUF4WlcwN1hISmNiaUFnSUNCamIyeHZjam9nUUdadmRYSjBhRjkwWlhoMFgyTnZiRzl5TzF4eVhHNGdJSDFjY2x4dVhISmNiaUFnSmw5ZlpHd3NYSEpjYmlBZ0psOWZaSFFzWEhKY2JpQWdKbDlmWkdRZ2UxeHlYRzRnSUNBZ2JXRnlaMmx1T2lBd08xeHlYRzRnSUNBZ2NHRmtaR2x1WnpvZ01EdGNjbHh1SUNBZ0lHOTJaWEptYkc5M09pQm9hV1JrWlc0N1hISmNiaUFnZlZ4eVhHNWNjbHh1SUNBbVgxOWtiQ0I3WEhKY2JpQWdJQ0J3YjNOcGRHbHZiam9nY21Wc1lYUnBkbVU3WEhKY2JpQWdJQ0I2TFdsdVpHVjRPaUF4TzF4eVhHNGdJSDFjY2x4dVhISmNiaUFnSmw5ZlpIUWdlMXh5WEc0Z0lDQWdaR2x6Y0d4aGVUb2dhVzVzYVc1bExXSnNiMk5yTzF4eVhHNGdJSDFjY2x4dVhISmNiaUFnSmw5ZlpHUWdlMXh5WEc0Z0lDQWdaR2x6Y0d4aGVUb2dhVzVzYVc1bExXSnNiMk5yTzF4eVhHNGdJQ0FnWTI5c2IzSTZJRUJ6ZFdOalpYTnpYMk52Ykc5eU8xeHlYRzRnSUgxY2NseHVYSEpjYmlBZ0psOWZjSEpsSUh0Y2NseHVJQ0FnSUcxaGNtZHBiam9nTW1WdElEQTdYSEpjYmlBZ0lDQndZV1JrYVc1bk9pQXhaVzA3WEhKY2JpQWdJQ0JtYjI1MExYTnBlbVU2SURFMGNIZzdYSEpjYmlBZ0lDQnNhVzVsTFdobGFXZG9kRG9nTVRVd0pUdGNjbHh1SUNBZ0lIUmxlSFF0WVd4cFoyNDZJR3hsWm5RN1hISmNiaUFnSUNCaVlXTnJaM0p2ZFc1a0xXTnZiRzl5T2lCQVltZGZZMjlzYjNJN1hISmNiaUFnSUNCaWIzSmtaWEk2SURGd2VDQnpiMnhwWkNCQVltOXlaR1Z5WDJOdmJHOXlPMXh5WEc0Z0lDQWdZbTl5WkdWeUxYSmhaR2wxY3pvZ05IQjRPMXh5WEc0Z0lDQWdZMjlzYjNJNklFQjBhR2x5WkY5MFpYaDBYMk52Ykc5eU8xeHlYRzRnSUNBZ2IzWmxjbVpzYjNjNklHRjFkRzg3WEhKY2JpQWdmVnh5WEc1Y2NseHVJQ0FtWDE5amIyUmxJSHRjY2x4dUlDQWdJR1JwYzNCc1lYazZJR0pzYjJOck8xeHlYRzRnSUNBZ2JXRnlaMmx1T2lBd0lHRjFkRzg3WEhKY2JpQWdJQ0J2ZG1WeVpteHZkem9nYUdsa1pHVnVPMXh5WEc0Z0lIMWNjbHh1WEhKY2JpQWdKbDlmWm05dmRHVnlJSHRjY2x4dUlDQWdJR0p2Y21SbGNpMTBiM0E2SURGd2VDQnpiMnhwWkNCQVltOXlaR1Z5WDJOdmJHOXlPMXh5WEc0Z0lDQWdiV0Z5WjJsdUxYUnZjRG9nTTJWdE8xeHlYRzRnSUNBZ1ltRmphMmR5YjNWdVpDMWpiMnh2Y2pvZ1FHSm5YMk52Ykc5eU8xeHlYRzRnSUNBZ1kyOXNiM0k2SUVCbWIzVnlkR2hmZEdWNGRGOWpiMnh2Y2p0Y2NseHVJQ0I5WEhKY2JseHlYRzRnSUNaZlgzUmhZbXhsSUh0Y2NseHVJQ0FnSUcxaGNtZHBiam9nTVdWdElHRjFkRzg3WEhKY2JpQWdJQ0IzYVdSMGFEb2dNVEF3SlR0Y2NseHVJQ0FnSUdKdmNtUmxjaTEwYjNBNklERndlQ0J6YjJ4cFpDQkFZbTl5WkdWeVgyTnZiRzl5TzF4eVhHNGdJSDFjY2x4dVhISmNiaUFnSmw5ZmRHZ3NYSEpjYmlBZ0psOWZkR1FnZTF4eVhHNGdJQ0FnY0dGa1pHbHVaem9nTlhCNElERTJjSGc3WEhKY2JpQWdJQ0JzYVc1bExXaGxhV2RvZERvZ01qWndlRHRjY2x4dUlDQWdJR0p2Y21SbGNpMWliM1IwYjIwNklERndlQ0J6YjJ4cFpDQkFZbTl5WkdWeVgyTnZiRzl5TzF4eVhHNGdJSDFjY2x4dVhISmNiaUFnSmw5ZmRHZ2dlMXh5WEc0Z0lDQWdkR1Y0ZEMxaGJHbG5iam9nWTJWdWRHVnlPMXh5WEc0Z0lDQWdZbUZqYTJkeWIzVnVaQzFqYjJ4dmNqb2dRR0puWDJOdmJHOXlPMXh5WEc0Z0lIMWNjbHh1ZlZ4eVhHNWNjbHh1UUcxbFpHbGhJQ2h0WVhndGQybGtkR2c2SURVd01IQjRLU0I3WEhKY2JpQWdMbk5sWTNScGIyNGdlMXh5WEc0Z0lDQWdKbDlmYUdWaFpHVnlMRnh5WEc0Z0lDQWdKbDlmWTI5dWRHVnVkQ0I3WEhKY2JpQWdJQ0FnSUhCaFpHUnBibWM2SURBZ01XVnRPMXh5WEc0Z0lDQWdmVnh5WEc0Z0lIMWNjbHh1ZlZ4eVhHNGlMQ0pBYVcxd2IzSjBJQ2N1TDJOdmJHOXljeWM3WEhKY2JseHlYRzR1WTJGelpTQjdYSEpjYmlBZ2NHOXphWFJwYjI0NklISmxiR0YwYVhabE8xeHlYRzRnSUhvdGFXNWtaWGc2SURFN1hISmNiaUFnWkdsemNHeGhlVG9nWjNKcFpEdGNjbHh1SUNCbmNtbGtMWFJsYlhCc1lYUmxMV052YkhWdGJuTTZJSEpsY0dWaGRDZ3lMQ0F4Wm5JcE8xeHlYRzRnSUdkaGNEb2dOREJ3ZUR0Y2NseHVJQ0J3WVdSa2FXNW5PaUF4WlcwN1hISmNiaUFnWW05eVpHVnlMWFJ2Y0RvZ01YQjRJSE52Ykdsa0lFQmliM0prWlhKZlkyOXNiM0k3WEhKY2JpQWdZbTl5WkdWeUxXSnZkSFJ2YlRvZ01YQjRJSE52Ykdsa0lFQmliM0prWlhKZlkyOXNiM0k3WEhKY2JpQWdiM1psY21ac2IzYzZJR2hwWkdSbGJqdGNjbHh1WEhKY2JpQWdKanBoWm5SbGNpQjdYSEpjYmlBZ0lDQmpiMjUwWlc1ME9pQW5KenRjY2x4dUlDQWdJSEJ2YzJsMGFXOXVPaUJoWW5OdmJIVjBaVHRjY2x4dUlDQWdJSG90YVc1a1pYZzZJREk3WEhKY2JpQWdJQ0IwYjNBNklEQTdYSEpjYmlBZ0lDQnNaV1owT2lBMU1DVTdYSEpjYmlBZ0lDQm9aV2xuYUhRNklERXdNQ1U3WEhKY2JpQWdJQ0IzYVdSMGFEb2dNRHRjY2x4dUlDQWdJR0p2Y21SbGNpMXNaV1owT2lBeGNIZ2djMjlzYVdRZ1FHSnZjbVJsY2w5amIyeHZjanRjY2x4dUlDQWdJRzkyWlhKbWJHOTNPaUJvYVdSa1pXNDdYSEpjYmlBZ2ZWeHlYRzVjY2x4dUlDQW1YMTl3Y21Vc1hISmNiaUFnSmw5ZmRHVjRkR0Z5WldFZ2UxeHlYRzRnSUNBZ1ptOXVkQzF6YVhwbE9pQXhNM0I0TzF4eVhHNGdJQ0FnYkdsdVpTMW9aV2xuYUhRNklERTFNQ1U3WEhKY2JpQWdmVnh5WEc1Y2NseHVJQ0FtWDE5d2NtVXNYSEpjYmlBZ0psOWZZMjlrWlN4Y2NseHVJQ0FtWDE5MFpYaDBZWEpsWVNCN1hISmNiaUFnSUNCbWIyNTBMV1poYldsc2VUb2dKME52ZFhKcFpYSWdUbVYzSnl3Z1EyOXVjMjlzWVhNc0lFZGxiM0puYVdFc0lFRnlhV0ZzTENCellXNXpMWE5sY21sbU8xeHlYRzRnSUgxY2NseHVYSEpjYmlBZ0psOWZjSEpsSUh0Y2NseHVJQ0FnSUcxaGNtZHBiam9nTUR0Y2NseHVJQ0FnSUhCaFpHUnBibWM2SURGbGJUdGNjbHh1SUNBZ0lHSmhZMnRuY205MWJtUXRZMjlzYjNJNklFQmlaMTlqYjJ4dmNqdGNjbHh1SUNBZ0lHaGxhV2RvZERvZ01UQXdKVHRjY2x4dUlDQWdJR0p2Y21SbGNpMXlZV1JwZFhNNklEUndlRHRjY2x4dUlDQWdJR0p2ZUMxemFYcHBibWM2SUdKdmNtUmxjaTFpYjNnN1hISmNiaUFnSUNCdmRtVnlabXh2ZHpvZ1lYVjBienRjY2x4dUlDQjlYSEpjYmx4eVhHNGdJQ1pmWDNSdmIyeGlZWElnZTF4eVhHNGdJQ0FnYldGeVoybHVPaUF3SUdGMWRHODdYSEpjYmlBZ0lDQm9aV2xuYUhRNklETTJjSGc3WEhKY2JpQWdJQ0JzYVc1bExXaGxhV2RvZERvZ016WndlRHRjY2x4dUlDQWdJR1p2Ym5RdGMybDZaVG9nTVRSd2VEdGNjbHh1SUNBZ0lIQmhaR1JwYm1jNklEQWdNVFp3ZUR0Y2NseHVJQ0FnSUhSbGVIUXRZV3hwWjI0NklISnBaMmgwTzF4eVhHNGdJQ0FnYjNabGNtWnNiM2M2SUdocFpHUmxianRjY2x4dUlDQjlYSEpjYmx4eVhHNGdJQ1pmWDJGamRHbHZiaXhjY2x4dUlDQW1YMTl5WlcxdmRtVWdlMXh5WEc0Z0lDQWdZM1Z5YzI5eU9pQndiMmx1ZEdWeU8xeHlYRzRnSUNBZ1kyOXNiM0k2SUVCemRXTmpaWE56WDJOdmJHOXlPMXh5WEc0Z0lDQWdkWE5sY2kxelpXeGxZM1E2SUc1dmJtVTdYSEpjYmlBZ2ZWeHlYRzVjY2x4dUlDQW1YMTloWTNScGIyNGdlMXh5WEc0Z0lDQWdabTl1ZEMxemFYcGxPaUF4TTNCNE8xeHlYRzRnSUNBZ2NHRmtaR2x1Wnkxc1pXWjBPaUF4TUhCNE8xeHlYRzVjY2x4dUlDQWdJQ1k2Wm1seWMzUXRZMmhwYkdRZ2UxeHlYRzRnSUNBZ0lDQndZV1JrYVc1bkxXeGxablE2SURBN1hISmNiaUFnSUNCOVhISmNiaUFnZlZ4eVhHNWNjbHh1SUNBbVgxOXlaVzF2ZG1VZ2UxeHlYRzRnSUNBZ1pteHZZWFE2SUhKcFoyaDBPMXh5WEc0Z0lIMWNjbHh1WEhKY2JpQWdKbDlmWTI5dWMyOXNaU0I3WEhKY2JpQWdJQ0J0WVhKbmFXNDZJREFnWVhWMGJ6dGNjbHh1SUNBZ0lHaGxhV2RvZERvZ01UZ3djSGc3WEhKY2JpQWdJQ0JpYjNKa1pYSTZJREZ3ZUNCemIyeHBaQ0JBWW05eVpHVnlYMk52Ykc5eU8xeHlYRzRnSUNBZ2IzWmxjbVpzYjNjNklHaHBaR1JsYmp0Y2NseHVJQ0I5WEhKY2JseHlYRzRnSUNaZlgzUmxlSFJoY21WaElIdGNjbHh1SUNBZ0lHMWhjbWRwYmpvZ01DQmhkWFJ2TzF4eVhHNGdJQ0FnZDJsa2RHZzZJREV3TUNVN1hISmNiaUFnSUNCb1pXbG5hSFE2SURFd01DVTdYSEpjYmlBZ0lDQmliM0prWlhJNklHNXZibVU3WEhKY2JpQWdJQ0J2ZFhSc2FXNWxPaUJ1YjI1bE8xeHlYRzRnSUNBZ2NHRmtaR2x1WnpvZ01XVnRPMXh5WEc0Z0lDQWdZbTk0TFhOcGVtbHVaem9nWW05eVpHVnlMV0p2ZUR0Y2NseHVJQ0FnSUc5MlpYSm1iRzkzT2lCaGRYUnZPMXh5WEc0Z0lIMWNjbHh1WEhKY2JpQWdKbDlmYkdsemRDeGNjbHh1SUNBbVgxOXBkR1Z0SUh0Y2NseHVJQ0FnSUcxaGNtZHBiam9nTUR0Y2NseHVJQ0FnSUhCaFpHUnBibWM2SURBN1hISmNiaUFnSUNCc2FYTjBMWE4wZVd4bExYUjVjR1U2SUc1dmJtVTdYSEpjYmlBZ0lDQnZkbVZ5Wm14dmR6b2dhR2xrWkdWdU8xeHlYRzRnSUgxY2NseHVYSEpjYmlBZ0psOWZiR2x6ZENCN1hISmNiaUFnSUNCb1pXbG5hSFE2SURNMk1IQjRPMXh5WEc0Z0lDQWdZbTl5WkdWeUxYUnZjRG9nTVhCNElITnZiR2xrSUVCaWIzSmtaWEpmWTI5c2IzSTdYSEpjYmlBZ0lDQmliM0prWlhJdFltOTBkRzl0T2lBeGNIZ2djMjlzYVdRZ1FHSnZjbVJsY2w5amIyeHZjanRjY2x4dUlDQWdJR1p2Ym5RdGMybDZaVG9nTVROd2VEdGNjbHh1SUNBZ0lHOTJaWEptYkc5M09pQmhkWFJ2TzF4eVhHNGdJSDFjY2x4dVhISmNiaUFnSmw5ZmFYUmxiU0I3WEhKY2JpQWdJQ0JvWldsbmFIUTZJRE0yY0hnN1hISmNiaUFnSUNCc2FXNWxMV2hsYVdkb2REb2dNelp3ZUR0Y2NseHVJQ0FnSUdOMWNuTnZjam9nY0c5cGJuUmxjanRjY2x4dUlDQWdJSEJoWkdScGJtYzZJREFnTVRad2VEdGNjbHh1WEhKY2JpQWdJQ0FtT21odmRtVnlJSHRjY2x4dUlDQWdJQ0FnWW1GamEyZHliM1Z1WkMxamIyeHZjam9nUUdodmRtVnlYMkpuWDJOdmJHOXlPMXh5WEc0Z0lDQWdmVnh5WEc0Z0lIMWNjbHh1ZlZ4eVhHNGlMQ0pBYVcxd2IzSjBJQ2N1TGk4dUxpOTBhR1Z0WlM5dGFYaHBibk1uTzF4eVhHNWNjbHh1TG5CaGNHVnlJSHRjY2x4dUlDQXVjMmhoWkc5M1gyeHBaMmgwWDNKbFozVnNZWElvS1R0Y2NseHVJQ0J0WVhKbmFXNDZJRE5sYlNCaGRYUnZPMXh5WEc0Z0lHMWhlQzEzYVdSMGFEb2dNVEl3TUhCNE8xeHlYRzRnSUhCaFpHUnBibWM2SURKbGJUdGNjbHh1SUNCaVlXTnJaM0p2ZFc1a0xXTnZiRzl5T2lCQWQyaHBkR1U3WEhKY2JpQWdZbTk0TFhOcGVtbHVaem9nWW05eVpHVnlMV0p2ZUR0Y2NseHVYSEpjYmlBZ0ppNW1iR1Y0SUh0Y2NseHVJQ0FnSUdScGMzQnNZWGs2SUdac1pYZzdYSEpjYmlBZ0lDQm1iR1Y0TFdScGNtVmpkR2x2YmpvZ2NtOTNPMXh5WEc0Z0lDQWdabXhsZUMxM2NtRndPaUJ1YjNkeVlYQTdYSEpjYmlBZ0lDQnRZWEpuYVc0NklEQTdYSEpjYmlBZ0lDQjNhV1IwYURvZ01UQXdKVHRjY2x4dUlDQWdJRzFoZUMxM2FXUjBhRG9nTVRBd0pUdGNjbHh1SUNBZ0lHaGxhV2RvZERvZ01UQXdKVHRjY2x4dUlDQWdJSEJoWkdScGJtYzZJREE3WEhKY2JpQWdJQ0J2ZG1WeVpteHZkem9nYUdsa1pHVnVPMXh5WEc1Y2NseHVJQ0FnSUM1aGNuUnBZMnhsSUh0Y2NseHVJQ0FnSUNBZ1pteGxlQzFrYVhKbFkzUnBiMjQ2SUdOdmJIVnRianRjY2x4dUlDQWdJQ0FnZDJsa2RHZzZJREV3TUNVN1hISmNiaUFnSUNBZ0lHSnZlQzF6YVhwcGJtYzZJR0p2Y21SbGNpMWliM2c3WEhKY2JseHlYRzRnSUNBZ0lDQW1YMTl0WVdsdUlIdGNjbHh1SUNBZ0lDQWdJQ0JvWldsbmFIUTZJREV3TUNVN1hISmNiaUFnSUNBZ0lDQWdZbTk0TFhOcGVtbHVaem9nWW05eVpHVnlMV0p2ZUR0Y2NseHVJQ0FnSUNBZ0lDQnZkbVZ5Wm14dmR6b2dZWFYwYnp0Y2NseHVJQ0FnSUNBZ2ZWeHlYRzVjY2x4dUlDQWdJQ0FnSmw5ZllYTnBaR1VnZTF4eVhHNGdJQ0FnSUNBZ0lHSnZjbVJsY2kxeWFXZG9kRG9nTVhCNElITnZiR2xrSUVCd2NtbHRZWEo1WDJKdmNtUmxjbDlqYjJ4dmNqdGNjbHh1SUNBZ0lDQWdmVnh5WEc0Z0lDQWdmVnh5WEc0Z0lIMWNjbHh1ZlZ4eVhHNWNjbHh1TG1obFlXUmxjaUI3WEhKY2JpQWdjRzl6YVhScGIyNDZJSE4wYVdOcmVUdGNjbHh1SUNCNkxXbHVaR1Y0T2lBek8xeHlYRzRnSUhSdmNEb2dNRHRjY2x4dUlDQnRZWEpuYVc0NklEQWdZWFYwYnp0Y2NseHVJQ0JpYjNKa1pYSXRZbTkwZEc5dE9pQXhjSGdnYzI5c2FXUWdRR0p2Y21SbGNsOWpiMnh2Y2p0Y2NseHVJQ0JpWVdOclozSnZkVzVrTFdOdmJHOXlPaUJBZDJocGRHVTdYSEpjYmlBZ2RHVjRkQzFoYkdsbmJqb2dZMlZ1ZEdWeU8xeHlYRzRnSUhSeVlXNXphWFJwYjI0dFpIVnlZWFJwYjI0NklEQXVNM003WEhKY2JpQWdiM1psY21ac2IzYzZJR2hwWkdSbGJqdGNjbHh1WEhKY2JpQWdKbDl6ZEdsamEza2dlMXh5WEc0Z0lDQWdjR0ZrWkdsdVp5MXNaV1owT2lBeU5qQndlRHRjY2x4dUlDQjlYSEpjYm4xY2NseHVYSEpjYmk1aGNuUnBZMnhsSUh0Y2NseHVJQ0JrYVhOd2JHRjVPaUJtYkdWNE8xeHlYRzRnSUdac1pYZ3RaR2x5WldOMGFXOXVPaUJ5YjNjN1hISmNiaUFnWm14bGVDMTNjbUZ3T2lCdWIzZHlZWEE3WEhKY2JpQWdjR0ZrWkdsdVp6b2dNbVZ0SURBN1hISmNiaUFnWm05dWRDMXphWHBsT2lBeE5uQjRPMXh5WEc0Z0lHeHBibVV0YUdWcFoyaDBPaUF4TlRBbE8xeHlYRzVjY2x4dUlDQW1YMTl0WVdsdUlIdGNjbHh1SUNBZ0lHWnNaWGc2SURFN1hISmNiaUFnSUNCd1lXUmthVzVuT2lBd0lESmxiVHRjY2x4dUlDQWdJRzkyWlhKbWJHOTNPaUJvYVdSa1pXNDdYSEpjYmx4eVhHNGdJQ0FnTG5ObFkzUnBiMjRnZTF4eVhHNGdJQ0FnSUNCdmRtVnlabXh2ZHpvZ2RtbHphV0pzWlR0Y2NseHVYSEpjYmlBZ0lDQWdJQ1pmWDJOdmJuUmxiblFzWEhKY2JpQWdJQ0FnSUNaZlgyWnZiM1JsY2l4Y2NseHVJQ0FnSUNBZ0psOWZhR1ZoWkdWeUlIdGNjbHh1SUNBZ0lDQWdJQ0J2ZG1WeVpteHZkem9nZG1semFXSnNaVHRjY2x4dUlDQWdJQ0FnZlZ4eVhHNWNjbHh1SUNBZ0lDQWdKbDlmYUdWaFpHVnlMRnh5WEc0Z0lDQWdJQ0FtWDE5amIyNTBaVzUwSUh0Y2NseHVJQ0FnSUNBZ0lDQnRZWEpuYVc0NklEQTdYSEpjYmlBZ0lDQWdJSDFjY2x4dUlDQWdJSDFjY2x4dUlDQjlYSEpjYmx4eVhHNGdJQ1pmWDJGemFXUmxJSHRjY2x4dUlDQWdJR1pzWlhndGMyaHlhVzVyT2lBd08xeHlYRzRnSUNBZ2QybGtkR2c2SURJME1IQjRPMXh5WEc0Z0lDQWdZbTl5WkdWeUxXeGxablE2SURGd2VDQnpiMnhwWkNCQVltOXlaR1Z5WDJOdmJHOXlPMXh5WEc1Y2NseHVJQ0FnSUNZdWJIUnlJSHRjY2x4dUlDQWdJQ0FnWW05eVpHVnlMWEpwWjJoME9pQXhjSGdnYzI5c2FXUWdRR0p2Y21SbGNsOWpiMnh2Y2p0Y2NseHVJQ0FnSUNBZ1ltOXlaR1Z5TFd4bFpuUTZJRzV2Ym1VN1hISmNiaUFnSUNCOVhISmNibHh5WEc0Z0lDQWdMbTkxZEd4cGJtVXRibUYyYVdkaGRHOXlJSHRjY2x4dUlDQWdJQ0FnWW1GamEyZHliM1Z1WkMxamIyeHZjam9nUUhkb2FYUmxPMXh5WEc0Z0lDQWdmVnh5WEc0Z0lIMWNjbHh1ZlZ4eVhHNWNjbHh1Y0hKbExGeHlYRzR1YzJWamRHbHZibDlmY0hKbElIdGNjbHh1SUNCd1lXUmthVzVuT2lBeVpXMDdYSEpjYmlBZ1ptOXVkQzFtWVcxcGJIazZJQ2REYjNWeWFXVnlJRTVsZHljc0lFRnlhV0ZzTENCellXNXpMWE5sY21sbU8xeHlYRzRnSUdKaFkydG5jbTkxYm1RdFkyOXNiM0k2SUVCaVoxOWpiMnh2Y2p0Y2NseHVJQ0J2ZG1WeVpteHZkem9nWVhWMGJ6dGNjbHh1ZlZ4eVhHNWNjbHh1WTI5a1pTeGNjbHh1TG5ObFkzUnBiMjVmWDJOdlpHVWdlMXh5WEc0Z0lHWnZiblF0Wm1GdGFXeDVPaUFuUTI5MWNtbGxjaUJPWlhjbkxDQkJjbWxoYkN3Z2MyRnVjeTF6WlhKcFpqdGNjbHh1SUNCbWIyNTBMWE5wZW1VNklERTJjSGc3WEhKY2JuMWNjbHh1WEhKY2JpNW1iMjkwWlhJZ2UxeHlYRzRnSUdKdmNtUmxjaTEwYjNBNklERndlQ0J6YjJ4cFpDQkFjSEpwYldGeWVWOWliM0prWlhKZlkyOXNiM0k3WEhKY2JpQWdjR0ZrWkdsdVp6b2dNMlZ0SURBN1hISmNiaUFnZEdWNGRDMWhiR2xuYmpvZ1kyVnVkR1Z5TzF4eVhHNWNjbHh1SUNCaElIdGNjbHh1SUNBZ0lDWTZiR2x1YXl4Y2NseHVJQ0FnSUNZNmRtbHphWFJsWkN4Y2NseHVJQ0FnSUNZNmFHOTJaWElnZTF4eVhHNGdJQ0FnSUNCMFpYaDBMV1JsWTI5eVlYUnBiMjQ2SUc1dmJtVTdYSEpjYmlBZ0lDQWdJR052Ykc5eU9pQkFjM1ZqWTJWemMxOWpiMnh2Y2p0Y2NseHVJQ0FnSUgxY2NseHVYSEpjYmlBZ0lDQW1PbWh2ZG1WeUlIdGNjbHh1SUNBZ0lDQWdkR1Y0ZEMxa1pXTnZjbUYwYVc5dU9pQjFibVJsY214cGJtVTdYSEpjYmlBZ0lDQjlYSEpjYmlBZ2ZWeHlYRzU5WEhKY2JseHlYRzR1ZFhScGJITXRZbTl5WkdWeUxYSnBaMmgwSUh0Y2NseHVJQ0JpYjNKa1pYSXRjbWxuYUhRNklERndlQ0J6YjJ4cFpDQkFjSEpwYldGeWVWOWliM0prWlhKZlkyOXNiM0k3WEhKY2JuMWNjbHh1WEhKY2JpNW9hV1JrWlc0Z2UxeHlYRzRnSUdScGMzQnNZWGs2SUc1dmJtVTdYSEpjYm4xY2NseHVYSEpjYmtCdFpXUnBZU0FvYldGNExYZHBaSFJvT2lBMU1EQndlQ2tnZTF4eVhHNGdJR2gwYld3c1hISmNiaUFnWW05a2VTQjdYSEpjYmlBZ0lDQnRZWEpuYVc0NklEQTdYSEpjYmlBZ2ZWeHlYRzVjY2x4dUlDQXVjR0Z3WlhJZ2UxeHlYRzRnSUNBZ2JXRnlaMmx1T2lBd08xeHlYRzRnSUNBZ2NHRmtaR2x1WnpvZ01EdGNjbHh1SUNCOVhISmNibHh5WEc0Z0lDNWhjblJwWTJ4bFgxOXRZV2x1SUh0Y2NseHVJQ0FnSUhCaFpHUnBibWM2SURBZ01tVnRPMXh5WEc0Z0lIMWNjbHh1ZlZ4eVhHNGlMQ0l2S2lwY2NseHVJQ29nYzJoaFpHOTNMbXhsYzNNZ0xTRHBtTFRsdmJIbW9MZmx2SS9vcnI3bnZhNGdiV2w0YVc1NElPV0h2ZWFWc0Z4eVhHNGdLaUE5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlYSEpjYmlBcUlFTnlaV0YwWldRZ1FuazZJRmxoYjJoaGFYaHBZVzljY2x4dUlDb2dWWEJrWVhSbE9pQXlNREl5TGpNdU1qQmNjbHh1SUNvdlhISmNia0JwYlhCdmNuUWdKeTR2WTI5c2IzSnpKenRjY2x4dVhISmNiaThxSUQwOVBUMDlQU0RwbUxUbHZiSG1vTGZsdkkvb3JyN252YTdsaDczbWxiQWdQVDA5UFQwOUlDb3ZYSEpjYmk1emFHRmtiM2NvUUc5bVpuTmxkRG9nTUNBd0lEWndlQ0F4Y0hnc0lFQmpiMnh2Y2pvZ1FIQnlhVzFoY25sZlltOXlaR1Z5WDJOdmJHOXlLU0I3WEhKY2JpQWdZbTk0TFhOb1lXUnZkem9nUUc5bVpuTmxkQ0JBWTI5c2IzSTdYSEpjYm4xY2NseHVYSEpjYmk1emFHRmtiM2RmY21WbmRXeGhjaWhBWTI5c2IzSTZJRUJ3Y21sdFlYSjVYMkp2Y21SbGNsOWpiMnh2Y2lrZ2UxeHlYRzRnSUM1emFHRmtiM2NvTUNBd0lEWndlQ0F4Y0hnc0lFQmpiMnh2Y2lrN1hISmNibjFjY2x4dVhISmNiaTV6YUdGa2IzZGZiR0Z5WjJVb1FHTnZiRzl5T2lCQWNISnBiV0Z5ZVY5aWIzSmtaWEpmWTI5c2IzSXBJSHRjY2x4dUlDQXVjMmhoWkc5M0tEQWdNQ0F4TW5CNElERndlQ3dnUUdOdmJHOXlLVHRjY2x4dWZWeHlYRzVjY2x4dUxuTm9ZV1J2ZDE5c2FXZG9kRjl5WldkMWJHRnlLQ2tnZTF4eVhHNGdJQzV6YUdGa2IzZGZjbVZuZFd4aGNpZ3BPMXh5WEc1OVhISmNibHh5WEc0dWMyaGhaRzkzWDJ4cFoyaDBYMnhoY21kbEtDa2dlMXh5WEc0Z0lDNXphR0ZrYjNkZmJHRnlaMlVvS1R0Y2NseHVmVnh5WEc1Y2NseHVMbk5vWVdSdmQxOWtZWEpyWDNKbFozVnNZWElvS1NCN1hISmNiaUFnTG5Ob1lXUnZkMTl5WldkMWJHRnlLRUJ6WldOdmJtUmhjbmxmWW05eVpHVnlYMk52Ykc5eUtUdGNjbHh1ZlZ4eVhHNWNjbHh1TG5Ob1lXUnZkMTlrWVhKclgyeGhjbWRsS0NrZ2UxeHlYRzRnSUM1emFHRmtiM2RmYkdGeVoyVW9RSE5sWTI5dVpHRnllVjlpYjNKa1pYSmZZMjlzYjNJcE8xeHlYRzU5WEhKY2JpSXNJanB5YjI5MElIdGNjbHh1SUNBdExXOTFkR3hwYm1VdGVrbHVaR1Y0T2lBeU1EQXdPMXh5WEc0Z0lDMHRiM1YwYkdsdVpTMXpkR2xqYTNrdGFHVnBaMmgwT2lBeE1EQWxPMXh5WEc0Z0lDMHRiM1YwYkdsdVpTMXVZWFpwWjJGMGIzSXRkMmxrZEdnNklERXdNQ1U3WEhKY2JuMWNjbHh1SWl3aUx5b2dQVDA5UFQwOVBUMDlQU0JwWTI5dUxuUm9aVzFsSUMwZ2MzWm5JT1didnVhZ2grZWFoT2FndCtXOGp5QTlQVDA5UFQwOVBUMDlJQ292WEhKY2JpNXZkWFJzYVc1bExXbGpiMjRnZTF4eVhHNGdJSEJ2YzJsMGFXOXVPaUJ5Wld4aGRHbDJaVHRjY2x4dUlDQjZMV2x1WkdWNE9pQXhPMXh5WEc0Z0lHUnBjM0JzWVhrNklHbHViR2x1WlMxaWJHOWphenRjY2x4dUlDQjJaWEowYVdOaGJDMWhiR2xuYmpvZ2JXbGtaR3hsTzF4eVhHNGdJSGRwWkhSb09pQXhaVzA3WEhKY2JpQWdhR1ZwWjJoME9pQXhaVzA3WEhKY2JpQWdiM1psY21ac2IzYzZJR2hwWkdSbGJqdGNjbHh1WEhKY2JpQWdKbDlmYzNabklIdGNjbHh1SUNBZ0lIQnZjMmwwYVc5dU9pQmhZbk52YkhWMFpUdGNjbHh1SUNBZ0lIb3RhVzVrWlhnNklESTdYSEpjYmlBZ0lDQjBiM0E2SURVd0pUdGNjbHh1SUNBZ0lHeGxablE2SURVd0pUdGNjbHh1SUNBZ0lIZHBaSFJvT2lBeFpXMDdYSEpjYmlBZ0lDQm9aV2xuYUhRNklERmxiVHRjY2x4dUlDQWdJR1pwYkd3NklHTjFjbkpsYm5SamIyeHZjanRjY2x4dUlDQWdJSFJ5WVc1elptOXliVG9nZEhKaGJuTnNZWFJsS0MwMU1DVXNJQzAxTUNVcE8xeHlYRzRnSUNBZ2IzWmxjbVpzYjNjNklHaHBaR1JsYmp0Y2NseHVJQ0I5WEhKY2JseHlYRzRnSUNaZmFHbGtaR1Z1SUh0Y2NseHVJQ0FnSUdScGMzQnNZWGs2SUc1dmJtVTdYSEpjYmlBZ2ZWeHlYRzU5WEhKY2JpSXNJa0JwYlhCdmNuUWdKMk52Ykc5eWN5YzdYSEpjYmx4eVhHNHViM1YwYkdsdVpTMW9aV0ZrYVc1bklIdGNjbHh1SUNCd2IzTnBkR2x2YmpvZ2NtVnNZWFJwZG1VN1hISmNiaUFnZWkxcGJtUmxlRG9nTVR0Y2NseHVJQ0J2ZG1WeVpteHZkem9nYUdsa1pHVnVPMXh5WEc1Y2NseHVJQ0FtWDE5aGJtTm9iM0lnZTF4eVhHNGdJQ0FnWkdsemNHeGhlVG9nYm05dVpUdGNjbHh1WEhKY2JpQWdJQ0FtT214cGJtc3NYSEpjYmlBZ0lDQW1PblpwYzJsMFpXUXNYSEpjYmlBZ0lDQW1PbWh2ZG1WeUlIdGNjbHh1SUNBZ0lDQWdZMjlzYjNJNklFQm1iM1Z5ZEdoZmRHVjRkRjlqYjJ4dmNqdGNjbHh1SUNBZ0lDQWdkR1Y0ZEMxa1pXTnZjbUYwYVc5dU9pQnViMjVsTzF4eVhHNGdJQ0FnZlZ4eVhHNWNjbHh1SUNBZ0lDWTZhRzkyWlhJZ2UxeHlYRzRnSUNBZ0lDQmpiMnh2Y2pvZ1FIQnlhVzFoY25sZlkyOXNiM0k3WEhKY2JpQWdJQ0I5WEhKY2JpQWdmVnh5WEc1Y2NseHVJQ0FtT21odmRtVnlJSHRjY2x4dUlDQWdJQzV2ZFhSc2FXNWxMV2hsWVdScGJtZGZYMkZ1WTJodmNpQjdYSEpjYmlBZ0lDQWdJR1JwYzNCc1lYazZJR2x1YkdsdVpTMWliRzlqYXp0Y2NseHVJQ0FnSUgxY2NseHVJQ0I5WEhKY2JseHlYRzRnSUNaZmMzUmhjblFnZTF4eVhHNGdJQ0FnSmpwb2IzWmxjaUI3WEhKY2JpQWdJQ0FnSUc5MlpYSm1iRzkzT2lCMmFYTnBZbXhsTzF4eVhHNGdJQ0FnZlZ4eVhHNWNjbHh1SUNBZ0lDNXZkWFJzYVc1bExXaGxZV1JwYm1kZlgyRnVZMmh2Y2lCN1hISmNiaUFnSUNBZ0lIQnZjMmwwYVc5dU9pQmhZbk52YkhWMFpUdGNjbHh1SUNBZ0lDQWdlaTFwYm1SbGVEb2dNanRjY2x4dUlDQWdJQ0FnZEc5d09pQTFNQ1U3WEhKY2JpQWdJQ0FnSUhSeVlXNXpabTl5YlRvZ2RISmhibk5zWVhSbFdTZ3ROVEFsS1R0Y2NseHVJQ0FnSUNBZ2JHVm1kRG9nTFRGbGJUdGNjbHh1SUNBZ0lIMWNjbHh1SUNCOVhISmNibjFjY2x4dUlpd2lRR2x0Y0c5eWRDQW5MaTkyWVhKcFlXSnNaWE1uTzF4eVhHNUFhVzF3YjNKMElDY3VMMk52Ykc5eWN5YzdYSEpjYmtCcGJYQnZjblFnSnk0dmMyaGhaRzkzSnp0Y2NseHVYSEpjYmk1dmRYUnNhVzVsTFdSeVlYZGxjaUI3WEhKY2JpQWdjRzl6YVhScGIyNDZJSEpsYkdGMGFYWmxPMXh5WEc0Z0lIb3RhVzVrWlhnNklDMHhPMXh5WEc0Z0lIUnZjRG9nTUR0Y2NseHVJQ0JzWldaME9pQXdPMXh5WEc0Z0lHMWhjbWRwYmpvZ01EdGNjbHh1SUNCM2FXUjBhRG9nTVRBd0pUdGNjbHh1SUNCb1pXbG5hSFE2SURFd01DVTdYSEpjYmlBZ1ltOTRMWE5wZW1sdVp6b2dZbTl5WkdWeUxXSnZlRHRjY2x4dUlDQjJhWE5wWW1sc2FYUjVPaUJvYVdSa1pXNDdYSEpjYmlBZ2IzWmxjbVpzYjNjNklHaHBaR1JsYmp0Y2NseHVYSEpjYmlBZ0psOWZiVzlrWVd3Z2UxeHlYRzRnSUNBZ0xuTm9ZV1J2ZDE5c2FXZG9kRjl5WldkMWJHRnlLQ2s3WEhKY2JpQWdJQ0JrYVhOd2JHRjVPaUJtYkdWNE8xeHlYRzRnSUNBZ1pteGxlQzFrYVhKbFkzUnBiMjQ2SUdOdmJIVnRianRjY2x4dUlDQWdJR1pzWlhndGQzSmhjRG9nYm05M2NtRndPMXh5WEc0Z0lDQWdjRzl6YVhScGIyNDZJR0ZpYzI5c2RYUmxPMXh5WEc0Z0lDQWdlaTFwYm1SbGVEb2dNakU3WEhKY2JpQWdJQ0JvWldsbmFIUTZJREV3TUNVN1hISmNiaUFnSUNCaVlXTnJaM0p2ZFc1a0xXTnZiRzl5T2lCQWQyaHBkR1U3WEhKY2JpQWdJQ0IwY21GdWMybDBhVzl1TFdSMWNtRjBhVzl1T2lBd0xqUnpPMXh5WEc0Z0lDQWdiM1psY21ac2IzYzZJR2hwWkdSbGJqdGNjbHh1SUNCOVhISmNibHh5WEc0Z0lDWmZYMmhsWVdSbGNpeGNjbHh1SUNBbVgxOXRZV2x1TEZ4eVhHNGdJQ1pmWDJadmIzUmxjaUI3WEhKY2JpQWdJQ0IzYVdSMGFEb2dNVEF3SlR0Y2NseHVJQ0FnSUdKdmVDMXphWHBwYm1jNklHSnZjbVJsY2kxaWIzZzdYSEpjYmlBZ2ZWeHlYRzVjY2x4dUlDQW1YMTlvWldGa1pYSXNYSEpjYmlBZ0psOWZabTl2ZEdWeUlIdGNjbHh1SUNBZ0lHWnNaWGd0YzJoeWFXNXJPaUF3TzF4eVhHNGdJSDFjY2x4dVhISmNiaUFnSmw5ZmRHbDBiR1VzWEhKY2JpQWdKbDlmYldGcGJpeGNjbHh1SUNBbVgxOW1iMjkwWlhJZ2UxeHlYRzRnSUNBZ2NHRmtaR2x1WnpvZ01DQXhObkI0TzF4eVhHNGdJSDFjY2x4dVhISmNiaUFnSmw5ZmFHVmhaR1Z5TEZ4eVhHNGdJQ1pmWDNScGRHeGxJSHRjY2x4dUlDQWdJSEJ2YzJsMGFXOXVPaUJ5Wld4aGRHbDJaVHRjY2x4dUlDQWdJSG90YVc1a1pYZzZJREU3WEhKY2JpQWdJQ0J0WVhKbmFXNDZJREFnWVhWMGJ6dGNjbHh1SUNBZ0lHaGxhV2RvZERvZ05USndlRHRjY2x4dUlDQWdJR3hwYm1VdGFHVnBaMmgwT2lBMU1uQjRPMXh5WEc0Z0lDQWdiM1psY21ac2IzYzZJR2hwWkdSbGJqdGNjbHh1SUNCOVhISmNibHh5WEc0Z0lDWmZYM1JwZEd4bElIdGNjbHh1SUNBZ0lHWnZiblF0YzJsNlpUb2dNVFp3ZUR0Y2NseHVJQ0FnSUdadmJuUXRkMlZwWjJoME9pQTBNREE3WEhKY2JpQWdJQ0J0WVhKbmFXNDZJREFnTVRad2VEdGNjbHh1SUNBZ0lHSnZlQzF6YVhwcGJtYzZJR0p2Y21SbGNpMWliM2c3WEhKY2JpQWdJQ0JpYjNKa1pYSXRZbTkwZEc5dE9pQXhjSGdnYzI5c2FXUWdRSEJ5YVcxaGNubGZZbTl5WkdWeVgyTnZiRzl5TzF4eVhHNGdJSDFjY2x4dVhISmNiaUFnSmw5ZlkyeHZjMlVnZTF4eVhHNGdJQ0FnY0c5emFYUnBiMjQ2SUdGaWMyOXNkWFJsTzF4eVhHNGdJQ0FnZWkxcGJtUmxlRG9nTWp0Y2NseHVJQ0FnSUhSdmNEb2dOVEFsTzF4eVhHNGdJQ0FnY21sbmFIUTZJREV5Y0hnN1hISmNiaUFnSUNCM2FXUjBhRG9nTWpCd2VEdGNjbHh1SUNBZ0lHaGxhV2RvZERvZ01qQndlRHRjY2x4dUlDQWdJR3hwYm1VdGFHVnBaMmgwT2lBeU1IQjRPMXh5WEc0Z0lDQWdZMjlzYjNJNklFQm1iM1Z5ZEdoZmRHVjRkRjlqYjJ4dmNqdGNjbHh1SUNBZ0lHWnZiblF0YzJsNlpUb2dNakJ3ZUR0Y2NseHVJQ0FnSUhSbGVIUXRZV3hwWjI0NklHTmxiblJsY2p0Y2NseHVJQ0FnSUdOMWNuTnZjam9nY0c5cGJuUmxjanRjY2x4dUlDQWdJSFJ5WVc1elptOXliVG9nZEhKaGJuTnNZWFJsV1NndE5UQWxLVHRjY2x4dUlDQWdJRzkyWlhKbWJHOTNPaUJvYVdSa1pXNDdYSEpjYmx4eVhHNGdJQ0FnTG05MWRHeHBibVV0YVdOdmJpQjdYSEpjYmlBZ0lDQWdJSEJ2YzJsMGFXOXVPaUJoWW5OdmJIVjBaVHRjY2x4dUlDQWdJQ0FnZWkxcGJtUmxlRG9nTWp0Y2NseHVJQ0FnSUNBZ2RHOXdPaUF3TzF4eVhHNGdJQ0FnSUNCc1pXWjBPaUF3TzF4eVhHNGdJQ0FnZlZ4eVhHNWNjbHh1SUNBZ0lDWTZhRzkyWlhJZ2UxeHlYRzRnSUNBZ0lDQmpiMnh2Y2pvZ1FIUm9hWEprWDNSbGVIUmZZMjlzYjNJN1hISmNiaUFnSUNCOVhISmNiaUFnZlZ4eVhHNWNjbHh1SUNBbVgxOXRZV2x1SUh0Y2NseHVJQ0FnSUdac1pYZzZJREU3WEhKY2JpQWdJQ0J2ZG1WeVpteHZkem9nWVhWMGJ6dGNjbHh1WEhKY2JpQWdJQ0FtTG05MlpYSm1iRzkzTFdocFpHUmxiaUI3WEhKY2JpQWdJQ0FnSUc5MlpYSm1iRzkzT2lCb2FXUmtaVzQ3WEhKY2JpQWdJQ0I5WEhKY2JpQWdmVnh5WEc1Y2NseHVJQ0FtWDE5bWIyOTBaWElnZTF4eVhHNGdJQ0FnYldGeVoybHVPaUF3SUdGMWRHODdYSEpjYmlBZ0lDQjBaWGgwTFdGc2FXZHVPaUJ5YVdkb2REdGNjbHh1SUNBZ0lHOTJaWEptYkc5M09pQm9hV1JrWlc0N1hISmNiaUFnZlZ4eVhHNWNjbHh1SUNBbVgxOXZkbVZ5YkdGNUlIdGNjbHh1SUNBZ0lHTnZiblJsYm5RNklDY25PMXh5WEc0Z0lDQWdjRzl6YVhScGIyNDZJSEpsYkdGMGFYWmxPMXh5WEc0Z0lDQWdlaTFwYm1SbGVEb2dNVHRjY2x4dUlDQWdJSFJ2Y0RvZ01EdGNjbHh1SUNBZ0lHeGxablE2SURBN1hISmNiaUFnSUNCM2FXUjBhRG9nTVRBd0pUdGNjbHh1SUNBZ0lHaGxhV2RvZERvZ01UQXdKVHRjY2x4dUlDQWdJR0poWTJ0bmNtOTFibVF0WTI5c2IzSTZJRUIzYUdsMFpUdGNjbHh1SUNBZ0lHOXdZV05wZEhrNklEQXVNVHRjY2x4dUlDQWdJRzkyWlhKbWJHOTNPaUJvYVdSa1pXNDdYSEpjYmlBZ2ZWeHlYRzVjY2x4dUlDQW1YM0owYkN4Y2NseHVJQ0FtWDJ4MGNpQjdYSEpjYmlBZ0lDQW1MbTkxZEd4cGJtVXRaSEpoZDJWeUlIdGNjbHh1SUNBZ0lDQWdKbDkwYVc1NUlIdGNjbHh1SUNBZ0lDQWdJQ0IzYVdSMGFEb2dNamd3Y0hnN1hISmNiaUFnSUNBZ0lIMWNjbHh1WEhKY2JpQWdJQ0FnSUNaZmJXbHVhU0I3WEhKY2JpQWdJQ0FnSUNBZ2QybGtkR2c2SURRNE1IQjRPMXh5WEc0Z0lDQWdJQ0I5WEhKY2JseHlYRzRnSUNBZ0lDQW1YM050WVd4c0lIdGNjbHh1SUNBZ0lDQWdJQ0IzYVdSMGFEb2dOVFF3Y0hnN1hISmNiaUFnSUNBZ0lIMWNjbHh1WEhKY2JpQWdJQ0FnSUNaZmNtVm5kV3hoY2lCN1hISmNiaUFnSUNBZ0lDQWdkMmxrZEdnNklEWTRNSEI0TzF4eVhHNGdJQ0FnSUNCOVhISmNibHh5WEc0Z0lDQWdJQ0FtWDIxbFpHbDFiU0I3WEhKY2JpQWdJQ0FnSUNBZ2QybGtkR2c2SURjeU1IQjRPMXh5WEc0Z0lDQWdJQ0I5WEhKY2JseHlYRzRnSUNBZ0lDQW1YMnhoY21kbElIdGNjbHh1SUNBZ0lDQWdJQ0IzYVdSMGFEb2dPVFl3Y0hnN1hISmNiaUFnSUNBZ0lIMWNjbHh1SUNBZ0lIMWNjbHh1SUNCOVhISmNibHh5WEc0Z0lDWmZjblJzSUh0Y2NseHVJQ0FnSUdKdmNtUmxjaTFzWldaME9pQXhjSGdnYzI5c2FXUWdRSEJ5YVcxaGNubGZZbTl5WkdWeVgyTnZiRzl5TzF4eVhHNWNjbHh1SUNBZ0lDWXViM1YwYkdsdVpTMWtjbUYzWlhJZ2UxeHlYRzRnSUNBZ0lDQW1YM1JwYm5rZ2UxeHlYRzRnSUNBZ0lDQWdJQ1l1YjNWMGJHbHVaUzFrY21GM1pYSmZZMnh2YzJWa0lIdGNjbHh1SUNBZ0lDQWdJQ0FnSUhKcFoyaDBPaUF0TWprd2NIZzdYSEpjYmlBZ0lDQWdJQ0FnZlZ4eVhHNGdJQ0FnSUNCOVhISmNibHh5WEc0Z0lDQWdJQ0FtWDIxcGJta2dlMXh5WEc0Z0lDQWdJQ0FnSUNZdWIzVjBiR2x1WlMxa2NtRjNaWEpmWTJ4dmMyVmtJSHRjY2x4dUlDQWdJQ0FnSUNBZ0lISnBaMmgwT2lBdE5Ea3djSGc3WEhKY2JpQWdJQ0FnSUNBZ2ZWeHlYRzRnSUNBZ0lDQjlYSEpjYmx4eVhHNGdJQ0FnSUNBbVgzTnRZV3hzSUh0Y2NseHVJQ0FnSUNBZ0lDQW1MbTkxZEd4cGJtVXRaSEpoZDJWeVgyTnNiM05sWkNCN1hISmNiaUFnSUNBZ0lDQWdJQ0J5YVdkb2REb2dMVFUxTUhCNE8xeHlYRzRnSUNBZ0lDQWdJSDFjY2x4dUlDQWdJQ0FnZlZ4eVhHNWNjbHh1SUNBZ0lDQWdKbDl5WldkMWJHRnlJSHRjY2x4dUlDQWdJQ0FnSUNBbUxtOTFkR3hwYm1VdFpISmhkMlZ5WDJOc2IzTmxaQ0I3WEhKY2JpQWdJQ0FnSUNBZ0lDQnlhV2RvZERvZ0xUWTVNSEI0TzF4eVhHNGdJQ0FnSUNBZ0lIMWNjbHh1SUNBZ0lDQWdmVnh5WEc1Y2NseHVJQ0FnSUNBZ0psOXRaV1JwZFcwZ2UxeHlYRzRnSUNBZ0lDQWdJQ1l1YjNWMGJHbHVaUzFrY21GM1pYSmZZMnh2YzJWa0lIdGNjbHh1SUNBZ0lDQWdJQ0FnSUhKcFoyaDBPaUF0TnpNd2NIZzdYSEpjYmlBZ0lDQWdJQ0FnZlZ4eVhHNGdJQ0FnSUNCOVhISmNibHh5WEc0Z0lDQWdJQ0FtWDJ4aGNtZGxJSHRjY2x4dUlDQWdJQ0FnSUNBbUxtOTFkR3hwYm1VdFpISmhkMlZ5WDJOc2IzTmxaQ0I3WEhKY2JpQWdJQ0FnSUNBZ0lDQnlhV2RvZERvZ0xUazNNSEI0TzF4eVhHNGdJQ0FnSUNBZ0lIMWNjbHh1SUNBZ0lDQWdmVnh5WEc0Z0lDQWdmVnh5WEc0Z0lIMWNjbHh1WEhKY2JpQWdKbDlzZEhJZ2UxeHlYRzRnSUNBZ1ltOXlaR1Z5TFhKcFoyaDBPaUF4Y0hnZ2MyOXNhV1FnUUhCeWFXMWhjbmxmWW05eVpHVnlYMk52Ykc5eU8xeHlYRzVjY2x4dUlDQWdJQ1l1YjNWMGJHbHVaUzFrY21GM1pYSWdlMXh5WEc0Z0lDQWdJQ0FtWDNScGJua2dlMXh5WEc0Z0lDQWdJQ0FnSUNZdWIzVjBiR2x1WlMxa2NtRjNaWEpmWTJ4dmMyVmtJSHRjY2x4dUlDQWdJQ0FnSUNBZ0lHeGxablE2SUMweU9UQndlRHRjY2x4dUlDQWdJQ0FnSUNCOVhISmNiaUFnSUNBZ0lIMWNjbHh1WEhKY2JpQWdJQ0FnSUNaZmJXbHVhU0I3WEhKY2JpQWdJQ0FnSUNBZ0ppNXZkWFJzYVc1bExXUnlZWGRsY2w5amJHOXpaV1FnZTF4eVhHNGdJQ0FnSUNBZ0lDQWdiR1ZtZERvZ0xUUTVNSEI0TzF4eVhHNGdJQ0FnSUNBZ0lIMWNjbHh1SUNBZ0lDQWdmVnh5WEc1Y2NseHVJQ0FnSUNBZ0psOXpiV0ZzYkNCN1hISmNiaUFnSUNBZ0lDQWdKaTV2ZFhSc2FXNWxMV1J5WVhkbGNsOWpiRzl6WldRZ2UxeHlYRzRnSUNBZ0lDQWdJQ0FnYkdWbWREb2dMVFUxTUhCNE8xeHlYRzRnSUNBZ0lDQWdJSDFjY2x4dUlDQWdJQ0FnZlZ4eVhHNWNjbHh1SUNBZ0lDQWdKbDl5WldkMWJHRnlJSHRjY2x4dUlDQWdJQ0FnSUNBbUxtOTFkR3hwYm1VdFpISmhkMlZ5WDJOc2IzTmxaQ0I3WEhKY2JpQWdJQ0FnSUNBZ0lDQnNaV1owT2lBdE5qa3djSGc3WEhKY2JpQWdJQ0FnSUNBZ2ZWeHlYRzRnSUNBZ0lDQjlYSEpjYmx4eVhHNGdJQ0FnSUNBbVgyMWxaR2wxYlNCN1hISmNiaUFnSUNBZ0lDQWdKaTV2ZFhSc2FXNWxMV1J5WVhkbGNsOWpiRzl6WldRZ2UxeHlYRzRnSUNBZ0lDQWdJQ0FnYkdWbWREb2dMVGN6TUhCNE8xeHlYRzRnSUNBZ0lDQWdJSDFjY2x4dUlDQWdJQ0FnZlZ4eVhHNWNjbHh1SUNBZ0lDQWdKbDlzWVhKblpTQjdYSEpjYmlBZ0lDQWdJQ0FnSmk1dmRYUnNhVzVsTFdSeVlYZGxjbDlqYkc5elpXUWdlMXh5WEc0Z0lDQWdJQ0FnSUNBZ2JHVm1kRG9nTFRrM01IQjRPMXh5WEc0Z0lDQWdJQ0FnSUgxY2NseHVJQ0FnSUNBZ2ZWeHlYRzRnSUNBZ2ZWeHlYRzRnSUgxY2NseHVYSEpjYmlBZ0psOTBkR0lzWEhKY2JpQWdKbDlpZEhRZ2UxeHlYRzRnSUNBZ2JHVm1kRG9nTUR0Y2NseHVJQ0FnSUhkcFpIUm9PaUF4TURBbE8xeHlYRzVjY2x4dUlDQWdJQ1l1YjNWMGJHbHVaUzFrY21GM1pYSWdlMXh5WEc0Z0lDQWdJQ0FtWDNScGJua2dlMXh5WEc0Z0lDQWdJQ0FnSUdobGFXZG9kRG9nTWpRd2NIZzdYSEpjYmlBZ0lDQWdJSDFjY2x4dVhISmNiaUFnSUNBZ0lDWmZiV2x1YVNCN1hISmNiaUFnSUNBZ0lDQWdhR1ZwWjJoME9pQXpNakJ3ZUR0Y2NseHVJQ0FnSUNBZ2ZWeHlYRzVjY2x4dUlDQWdJQ0FnSmw5emJXRnNiQ0I3WEhKY2JpQWdJQ0FnSUNBZ2FHVnBaMmgwT2lBek5qQndlRHRjY2x4dUlDQWdJQ0FnZlZ4eVhHNWNjbHh1SUNBZ0lDQWdKbDl5WldkMWJHRnlJSHRjY2x4dUlDQWdJQ0FnSUNCb1pXbG5hSFE2SURRd01IQjRPMXh5WEc0Z0lDQWdJQ0I5WEhKY2JseHlYRzRnSUNBZ0lDQW1YMjFsWkdsMWJTQjdYSEpjYmlBZ0lDQWdJQ0FnYUdWcFoyaDBPaUEwTkRCd2VEdGNjbHh1SUNBZ0lDQWdmVnh5WEc1Y2NseHVJQ0FnSUNBZ0psOXNZWEpuWlNCN1hISmNiaUFnSUNBZ0lDQWdhR1ZwWjJoME9pQTBPREJ3ZUR0Y2NseHVJQ0FnSUNBZ2ZWeHlYRzRnSUNBZ2ZWeHlYRzRnSUgxY2NseHVYSEpjYmlBZ0psOTBkR0lnZTF4eVhHNGdJQ0FnWW05eVpHVnlMV0p2ZEhSdmJUb2dNWEI0SUhOdmJHbGtJRUJ3Y21sdFlYSjVYMkp2Y21SbGNsOWpiMnh2Y2p0Y2NseHVYSEpjYmlBZ0lDQW1MbTkxZEd4cGJtVXRaSEpoZDJWeUlIdGNjbHh1SUNBZ0lDQWdKbDkwYVc1NUlIdGNjbHh1SUNBZ0lDQWdJQ0FtTG05MWRHeHBibVV0WkhKaGQyVnlYMk5zYjNObFpDQjdYSEpjYmlBZ0lDQWdJQ0FnSUNCMGIzQTZJQzB5TlRCd2VEdGNjbHh1SUNBZ0lDQWdJQ0I5WEhKY2JpQWdJQ0FnSUgxY2NseHVYSEpjYmlBZ0lDQWdJQ1pmYldsdWFTQjdYSEpjYmlBZ0lDQWdJQ0FnSmk1dmRYUnNhVzVsTFdSeVlYZGxjbDlqYkc5elpXUWdlMXh5WEc0Z0lDQWdJQ0FnSUNBZ2RHOXdPaUF0TXpNd2NIZzdYSEpjYmlBZ0lDQWdJQ0FnZlZ4eVhHNGdJQ0FnSUNCOVhISmNibHh5WEc0Z0lDQWdJQ0FtWDNOdFlXeHNJSHRjY2x4dUlDQWdJQ0FnSUNBbUxtOTFkR3hwYm1VdFpISmhkMlZ5WDJOc2IzTmxaQ0I3WEhKY2JpQWdJQ0FnSUNBZ0lDQjBiM0E2SUMwek56QndlRHRjY2x4dUlDQWdJQ0FnSUNCOVhISmNiaUFnSUNBZ0lIMWNjbHh1WEhKY2JpQWdJQ0FnSUNaZmNtVm5kV3hoY2lCN1hISmNiaUFnSUNBZ0lDQWdKaTV2ZFhSc2FXNWxMV1J5WVhkbGNsOWpiRzl6WldRZ2UxeHlYRzRnSUNBZ0lDQWdJQ0FnZEc5d09pQXROREV3Y0hnN1hISmNiaUFnSUNBZ0lDQWdmVnh5WEc0Z0lDQWdJQ0I5WEhKY2JseHlYRzRnSUNBZ0lDQW1YMjFsWkdsMWJTQjdYSEpjYmlBZ0lDQWdJQ0FnSmk1dmRYUnNhVzVsTFdSeVlYZGxjbDlqYkc5elpXUWdlMXh5WEc0Z0lDQWdJQ0FnSUNBZ2RHOXdPaUF0TkRVd2NIZzdYSEpjYmlBZ0lDQWdJQ0FnZlZ4eVhHNGdJQ0FnSUNCOVhISmNibHh5WEc0Z0lDQWdJQ0FtWDJ4aGNtZGxJSHRjY2x4dUlDQWdJQ0FnSUNBbUxtOTFkR3hwYm1VdFpISmhkMlZ5WDJOc2IzTmxaQ0I3WEhKY2JpQWdJQ0FnSUNBZ0lDQjBiM0E2SUMwME9UQndlRHRjY2x4dUlDQWdJQ0FnSUNCOVhISmNiaUFnSUNBZ0lIMWNjbHh1SUNBZ0lIMWNjbHh1SUNCOVhISmNibHh5WEc0Z0lDWmZZblIwSUh0Y2NseHVJQ0FnSUhSdmNEb2dhVzVwZEdsaGJEdGNjbHh1SUNBZ0lHSnZjbVJsY2kxMGIzQTZJREZ3ZUNCemIyeHBaQ0JBY0hKcGJXRnllVjlpYjNKa1pYSmZZMjlzYjNJN1hISmNibHh5WEc0Z0lDQWdKaTV2ZFhSc2FXNWxMV1J5WVhkbGNpQjdYSEpjYmlBZ0lDQWdJQ1pmZEdsdWVTQjdYSEpjYmlBZ0lDQWdJQ0FnSmk1dmRYUnNhVzVsTFdSeVlYZGxjbDlqYkc5elpXUWdlMXh5WEc0Z0lDQWdJQ0FnSUNBZ1ltOTBkRzl0T2lBdE1qVXdjSGc3WEhKY2JpQWdJQ0FnSUNBZ2ZWeHlYRzRnSUNBZ0lDQjlYSEpjYmx4eVhHNGdJQ0FnSUNBbVgyMXBibWtnZTF4eVhHNGdJQ0FnSUNBZ0lDWXViM1YwYkdsdVpTMWtjbUYzWlhKZlkyeHZjMlZrSUh0Y2NseHVJQ0FnSUNBZ0lDQWdJR0p2ZEhSdmJUb2dMVE16TUhCNE8xeHlYRzRnSUNBZ0lDQWdJSDFjY2x4dUlDQWdJQ0FnZlZ4eVhHNWNjbHh1SUNBZ0lDQWdKbDl6YldGc2JDQjdYSEpjYmlBZ0lDQWdJQ0FnSmk1dmRYUnNhVzVsTFdSeVlYZGxjbDlqYkc5elpXUWdlMXh5WEc0Z0lDQWdJQ0FnSUNBZ1ltOTBkRzl0T2lBdE16Y3djSGc3WEhKY2JpQWdJQ0FnSUNBZ2ZWeHlYRzRnSUNBZ0lDQjlYSEpjYmx4eVhHNGdJQ0FnSUNBbVgzSmxaM1ZzWVhJZ2UxeHlYRzRnSUNBZ0lDQWdJQ1l1YjNWMGJHbHVaUzFrY21GM1pYSmZZMnh2YzJWa0lIdGNjbHh1SUNBZ0lDQWdJQ0FnSUdKdmRIUnZiVG9nTFRReE1IQjRPMXh5WEc0Z0lDQWdJQ0FnSUgxY2NseHVJQ0FnSUNBZ2ZWeHlYRzVjY2x4dUlDQWdJQ0FnSmw5dFpXUnBkVzBnZTF4eVhHNGdJQ0FnSUNBZ0lDWXViM1YwYkdsdVpTMWtjbUYzWlhKZlkyeHZjMlZrSUh0Y2NseHVJQ0FnSUNBZ0lDQWdJR0p2ZEhSdmJUb2dMVFExTUhCNE8xeHlYRzRnSUNBZ0lDQWdJSDFjY2x4dUlDQWdJQ0FnZlZ4eVhHNWNjbHh1SUNBZ0lDQWdKbDlzWVhKblpTQjdYSEpjYmlBZ0lDQWdJQ0FnSmk1dmRYUnNhVzVsTFdSeVlYZGxjbDlqYkc5elpXUWdlMXh5WEc0Z0lDQWdJQ0FnSUNBZ1ltOTBkRzl0T2lBdE5Ea3djSGc3WEhKY2JpQWdJQ0FnSUNBZ2ZWeHlYRzRnSUNBZ0lDQjlYSEpjYmlBZ0lDQjlYSEpjYmlBZ2ZWeHlYRzVjY2x4dUlDQW1YMjl3Wlc1bFpDQjdYSEpjYmlBZ0lDQjJhWE5wWW1sc2FYUjVPaUIyYVhOcFlteGxPMXh5WEc0Z0lDQWdlaTFwYm1SbGVEb2dkbUZ5S0MwdGIzVjBiR2x1WlMxNlNXNWtaWGdwTzF4eVhHNWNjbHh1SUNBZ0lDWXViM1YwYkdsdVpTMWtjbUYzWlhJZ2UxeHlYRzRnSUNBZ0lDQndiM05wZEdsdmJqb2dabWw0WldRN1hISmNibHh5WEc0Z0lDQWdJQ0FtWDNKMGJDQjdYSEpjYmlBZ0lDQWdJQ0FnY21sbmFIUTZJREE3WEhKY2JpQWdJQ0FnSUgxY2NseHVYSEpjYmlBZ0lDQWdJQ1pmYkhSeUlIdGNjbHh1SUNBZ0lDQWdJQ0JzWldaME9pQXdPMXh5WEc0Z0lDQWdJQ0I5WEhKY2JseHlYRzRnSUNBZ0lDQW1YM1IwWWlCN1hISmNiaUFnSUNBZ0lDQWdkRzl3T2lBd08xeHlYRzRnSUNBZ0lDQjlYSEpjYmx4eVhHNGdJQ0FnSUNBbVgySjBkQ0I3WEhKY2JpQWdJQ0FnSUNBZ1ltOTBkRzl0T2lBd08xeHlYRzRnSUNBZ0lDQjlYSEpjYmlBZ0lDQjlYSEpjYmlBZ2ZWeHlYRzVjY2x4dUlDQW1YMjltWm5ObGRDQjdYSEpjYmlBZ0lDQW1MbTkxZEd4cGJtVXRaSEpoZDJWeUlIdGNjbHh1SUNBZ0lDQWdKbDl5ZEd3c1hISmNiaUFnSUNBZ0lDWmZiSFJ5SUh0Y2NseHVJQ0FnSUNBZ0lDQm9aV2xuYUhRNklHTmhiR01vTVRBd0pTQXRJRFJsYlNrN1hISmNiaUFnSUNBZ0lDQWdkRzl3T2lBMU1DVTdYSEpjYmlBZ0lDQWdJQ0FnZEhKaGJuTm1iM0p0T2lCMGNtRnVjMnhoZEdWWktDMDFNQ1VwTzF4eVhHNGdJQ0FnSUNCOVhISmNibHh5WEc0Z0lDQWdJQ0FtWDNSMFlpeGNjbHh1SUNBZ0lDQWdKbDlpZEhRZ2UxeHlYRzRnSUNBZ0lDQWdJSGRwWkhSb09pQmpZV3hqS0RFd01DVWdMU0EwWlcwcE8xeHlYRzRnSUNBZ0lDQWdJR3hsWm5RNklEVXdKVHRjY2x4dUlDQWdJQ0FnSUNCMGNtRnVjMlp2Y20wNklIUnlZVzV6YkdGMFpWZ29MVFV3SlNrN1hISmNiaUFnSUNBZ0lIMWNjbHh1WEhKY2JpQWdJQ0FnSUNaZmIzQmxibVZrSUh0Y2NseHVJQ0FnSUNBZ0lDQW1MbTkxZEd4cGJtVXRaSEpoZDJWeUlIdGNjbHh1SUNBZ0lDQWdJQ0FnSUNaZmNuUnNJSHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdjbWxuYUhRNklESmxiVHRjY2x4dUlDQWdJQ0FnSUNBZ0lIMWNjbHh1WEhKY2JpQWdJQ0FnSUNBZ0lDQW1YMngwY2lCN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUd4bFpuUTZJREpsYlR0Y2NseHVJQ0FnSUNBZ0lDQWdJSDFjY2x4dVhISmNiaUFnSUNBZ0lDQWdJQ0FtWDNSMFlpQjdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lIUnZjRG9nTW1WdE8xeHlYRzRnSUNBZ0lDQWdJQ0FnZlZ4eVhHNWNjbHh1SUNBZ0lDQWdJQ0FnSUNaZlluUjBJSHRjY2x4dUlDQWdJQ0FnSUNBZ0lDQWdZbTkwZEc5dE9pQXlaVzA3WEhKY2JpQWdJQ0FnSUNBZ0lDQjlYSEpjYmlBZ0lDQWdJQ0FnZlZ4eVhHNGdJQ0FnSUNCOVhISmNiaUFnSUNCOVhISmNiaUFnZlZ4eVhHNWNjbHh1SUNBbVgyRjFkRzhnZTF4eVhHNGdJQ0FnSmk1dmRYUnNhVzVsTFdSeVlYZGxjaUI3WEhKY2JpQWdJQ0FnSUNaZmNuUnNMRnh5WEc0Z0lDQWdJQ0FtWDJ4MGNpQjdYSEpjYmlBZ0lDQWdJQ0FnYUdWcFoyaDBPaUJoZFhSdk8xeHlYRzRnSUNBZ0lDQWdJRzFoZUMxb1pXbG5hSFE2SUdOaGJHTW9NVEF3SlNBdElEUmxiU2s3WEhKY2JpQWdJQ0FnSUgxY2NseHVJQ0FnSUgxY2NseHVJQ0I5WEhKY2JseHlYRzRnSUNaZlpuVnNiQ0I3WEhKY2JpQWdJQ0J3WVdSa2FXNW5PaUF3TzF4eVhHNGdJSDFjY2x4dWZWeHlYRzRpTENKQWFXMXdiM0owSUNjdUwzWmhjbWxoWW14bGN5YzdYSEpjYmtCcGJYQnZjblFnSnk0dlkyOXNiM0p6Snp0Y2NseHVRR2x0Y0c5eWRDQW5MaTlsYkd4cGNITnBjeWM3WEhKY2JseHlYRzR1YjNWMGJHbHVaUzF1WVhacFoyRjBiM0lnZTF4eVhHNGdJSEJ2YzJsMGFXOXVPaUJ5Wld4aGRHbDJaVHRjY2x4dUlDQjZMV2x1WkdWNE9pQXhPMXh5WEc0Z0lHMWhjbWRwYmpvZ01EdGNjbHh1SUNCM2FXUjBhRG9nZG1GeUtDMHRiM1YwYkdsdVpTMXVZWFpwWjJGMGIzSXRkMmxrZEdncE8xeHlYRzRnSUc5MlpYSm1iRzkzT2lCaGRYUnZPMXh5WEc1Y2NseHVJQ0FtTFhCaGNtVnVkQ0I3WEhKY2JpQWdJQ0IwY21GdWMybDBhVzl1T2lBd0xqTnpJR1ZoYzJVdGFXNHRiM1YwTzF4eVhHNGdJSDFjY2x4dVhISmNiaUFnSmw5ZmRHbDBiR1VnZTF4eVhHNGdJQ0FnYldGeVoybHVPaUF3SURFMmNIZzdYSEpjYmlBZ0lDQm9aV2xuYUhRNklEUXdjSGc3WEhKY2JpQWdJQ0JzYVc1bExXaGxhV2RvZERvZ05EQndlRHRjY2x4dUlDQWdJSEJoWkdScGJtYzZJREFnTVRad2VEdGNjbHh1SUNBZ0lHSnZjbVJsY2kxaWIzUjBiMjA2SURGd2VDQnpiMnhwWkNCQWNISnBiV0Z5ZVY5aWIzSmtaWEpmWTI5c2IzSTdYSEpjYmlBZ0lDQm1iMjUwTFhOcGVtVTZJREUyY0hnN1hISmNiaUFnSUNCbWIyNTBMWGRsYVdkb2REb2dOREF3TzF4eVhHNGdJQ0FnYjNabGNtWnNiM2M2SUdocFpHUmxianRjY2x4dUlDQjlYSEpjYmx4eVhHNGdJQ1pmWDIxaGFXNGdlMXh5WEc0Z0lDQWdjRzl6YVhScGIyNDZJSEpsYkdGMGFYWmxPMXh5WEc0Z0lDQWdlaTFwYm1SbGVEb2dNVHRjY2x4dUlDQWdJRzFoY21kcGJqb2dNRHRjY2x4dUlDQWdJRzkyWlhKbWJHOTNPaUJvYVdSa1pXNDdYSEpjYmlBZ2ZWeHlYRzVjY2x4dUlDQW1YMTlzYVhOMExGeHlYRzRnSUNaZlgzTjFZbXBsWTNRc1hISmNiaUFnSmw5ZmFYUmxiU0I3WEhKY2JpQWdJQ0J3YjNOcGRHbHZiam9nY21Wc1lYUnBkbVU3WEhKY2JpQWdJQ0I2TFdsdVpHVjRPaUF5TzF4eVhHNGdJQ0FnYldGeVoybHVPaUF3TzF4eVhHNGdJQ0FnY0dGa1pHbHVaem9nTUR0Y2NseHVJQ0FnSUd4cGMzUXRjM1I1YkdVdGRIbHdaVG9nYm05dVpUdGNjbHh1SUNBZ0lHOTJaWEptYkc5M09pQm9hV1JrWlc0N1hISmNiaUFnZlZ4eVhHNWNjbHh1SUNBbVgxOXNhWE4wSUh0Y2NseHVJQ0FnSUhCaFpHUnBibWM2SURBdU5XVnRJREE3WEhKY2JpQWdmVnh5WEc1Y2NseHVJQ0FtWDE5emRXSnFaV04wSUh0Y2NseHVJQ0FnSUhCaFpHUnBibWN0YkdWbWREb2dNV1Z0TzF4eVhHNGdJSDFjY2x4dVhISmNiaUFnSmw5ZmFYUmxiU0I3WEhKY2JpQWdJQ0J0WVhKbmFXNDZJREE3WEhKY2JpQWdJQ0JzYVc1bExXaGxhV2RvZERvZ016QndlRHRjY2x4dUlDQWdJR1p2Ym5RdGMybDZaVG9nTVROd2VEdGNjbHh1SUNBZ0lHOTJaWEptYkc5M09pQm9hV1JrWlc0N1hISmNiaUFnZlZ4eVhHNWNjbHh1SUNBbVgxOXdiR0ZqWldodmJHUmxjaUI3WEhKY2JpQWdJQ0J3YjNOcGRHbHZiam9nWVdKemIyeDFkR1U3WEhKY2JpQWdJQ0I2TFdsdVpHVjRPaUF4TzF4eVhHNGdJQ0FnZEc5d09pQXdPMXh5WEc0Z0lDQWdiR1ZtZERvZ01EdGNjbHh1SUNBZ0lIZHBaSFJvT2lBeE1EQWxPMXh5WEc0Z0lDQWdhR1ZwWjJoME9pQXpNSEI0TzF4eVhHNGdJQ0FnWW1GamEyZHliM1Z1WkMxamIyeHZjam9nUUdodmRtVnlYMkpuWDJOdmJHOXlPMXh5WEc0Z0lDQWdZbTl5WkdWeUxXeGxablE2SURKd2VDQnpiMnhwWkNCQWMzVmpZMlZ6YzE5amIyeHZjanRjY2x4dUlDQWdJSFJ5WVc1emFYUnBiMjR0WkhWeVlYUnBiMjQ2SURBdU1uTTdYSEpjYmlBZ0lDQmliM2d0YzJsNmFXNW5PaUJpYjNKa1pYSXRZbTk0TzF4eVhHNGdJQ0FnYjNabGNtWnNiM2M2SUdocFpHUmxianRjY2x4dUlDQjlYSEpjYmx4eVhHNGdJQ1pmWDJGdVkyaHZjaUI3WEhKY2JpQWdJQ0F1Wld4c2FYQnphWE1vTVNrN1hISmNiaUFnSUNCa2FYTndiR0Y1T2lCaWJHOWphenRjY2x4dUlDQWdJSEJoWkdScGJtYzZJREFnTVM0MVpXMDdYSEpjYmx4eVhHNGdJQ0FnSmpwc2FXNXJMRnh5WEc0Z0lDQWdKanAyYVhOcGRHVmtMRnh5WEc0Z0lDQWdKanBvYjNabGNpQjdYSEpjYmlBZ0lDQWdJSFJsZUhRdFpHVmpiM0poZEdsdmJqb2dibTl1WlR0Y2NseHVJQ0FnSUNBZ1kyOXNiM0k2SUVCelpXTnZibVJoY25sZmRHVjRkRjlqYjJ4dmNqdGNjbHh1SUNBZ0lIMWNjbHh1WEhKY2JpQWdJQ0FtT21odmRtVnlJSHRjY2x4dUlDQWdJQ0FnWTI5c2IzSTZJRUJ6ZFdOalpYTnpYMk52Ykc5eU8xeHlYRzRnSUNBZ2ZWeHlYRzRnSUgxY2NseHVYSEpjYmlBZ0psOWZZMjlrWlNCN1hISmNiaUFnSUNCd1lXUmthVzVuTFhKcFoyaDBPaUF3TGpWbGJUdGNjbHh1SUNCOVhISmNibHh5WEc0Z0lDWmZhR2xuYUd4cFoyaDBJSHRjY2x4dUlDQWdJQ1l1YjNWMGJHbHVaUzF1WVhacFoyRjBiM0pmWDJGdVkyaHZjaUI3WEhKY2JpQWdJQ0FnSUNZNmJHbHVheXhjY2x4dUlDQWdJQ0FnSmpwMmFYTnBkR1ZrTEZ4eVhHNGdJQ0FnSUNBbU9taHZkbVZ5SUh0Y2NseHVJQ0FnSUNBZ0lDQmpiMnh2Y2pvZ1FITjFZMk5sYzNOZlkyOXNiM0k3WEhKY2JpQWdJQ0FnSUNBZ1ptOXVkQzEzWldsbmFIUTZJR0p2YkdRN1hISmNiaUFnSUNBZ0lIMWNjbHh1SUNBZ0lIMWNjbHh1SUNCOVhISmNibHh5WEc0Z0lDWmZjM1JwWTJ0NUxGeHlYRzRnSUNaZlptbDRaV1FnZTF4eVhHNGdJQ0FnWkdsemNHeGhlVG9nWm14bGVEdGNjbHh1SUNBZ0lHWnNaWGd0ZDNKaGNEb2dibTkzY21Gd08xeHlYRzRnSUNBZ1pteGxlQzFrYVhKbFkzUnBiMjQ2SUdOdmJIVnRianRjY2x4dUlDQWdJSG90YVc1a1pYZzZJSFpoY2lndExXOTFkR3hwYm1VdGVrbHVaR1Y0S1R0Y2NseHVJQ0FnSUhSdmNEb2dNRHRjY2x4dUlDQWdJRzkyWlhKbWJHOTNPaUJvYVdSa1pXNDdYSEpjYmx4eVhHNGdJQ0FnTG05MWRHeHBibVV0Ym1GMmFXZGhkRzl5SUh0Y2NseHVJQ0FnSUNBZ0psOWZkR2wwYkdVc1hISmNiaUFnSUNBZ0lDWmZYMjFoYVc0Z2UxeHlYRzRnSUNBZ0lDQWdJR0p2ZUMxemFYcHBibWM2SUdKdmNtUmxjaTFpYjNnN1hISmNiaUFnSUNBZ0lIMWNjbHh1WEhKY2JpQWdJQ0FnSUNaZlgzUnBkR3hsSUh0Y2NseHVJQ0FnSUNBZ0lDQm1iR1Y0TFhOb2NtbHVhem9nTUR0Y2NseHVJQ0FnSUNBZ2ZWeHlYRzVjY2x4dUlDQWdJQ0FnSmw5ZmJXRnBiaUI3WEhKY2JpQWdJQ0FnSUNBZ1pteGxlRG9nTVR0Y2NseHVJQ0FnSUNBZ0lDQnZkbVZ5Wm14dmR6b2dZWFYwYnp0Y2NseHVJQ0FnSUNBZ2ZWeHlYRzRnSUNBZ2ZWeHlYRzRnSUgxY2NseHVYSEpjYmlBZ0psOXpkR2xqYTNrZ2UxeHlYRzRnSUNBZ2NHOXphWFJwYjI0NklITjBhV05yZVR0Y2NseHVJQ0FnSUcxaGVDMW9aV2xuYUhRNklIWmhjaWd0TFc5MWRHeHBibVV0YzNScFkydDVMV2hsYVdkb2RDazdYSEpjYmlBZ2ZWeHlYRzVjY2x4dUlDQW1YMlpwZUdWa0lIdGNjbHh1SUNBZ0lIQnZjMmwwYVc5dU9pQm1hWGhsWkR0Y2NseHVJQ0FnSUcxaGVDMW9aV2xuYUhRNklERXdNQ1U3WEhKY2JpQWdmVnh5WEc1Y2NseHVJQ0FtWDJocFpHUmxiaUI3WEhKY2JpQWdJQ0JrYVhOd2JHRjVPaUJ1YjI1bE8xeHlYRzRnSUgxY2NseHVYSEpjYmlBZ0psOW1iMnhrWldRZ2UxeHlYRzRnSUNBZ2QybGtkR2c2SURBN1hISmNiaUFnSUNCdmRtVnlabXh2ZHpvZ2FHbGtaR1Z1TzF4eVhHNGdJSDFjY2x4dWZWeHlYRzRpTENJdktpcGNjbHh1SUNvZ1pXeHNhWEJ6YVhNdWJHVnpjeUF0SU9hV2grYWNyT2VjZ2VlVnBTQnRhWGhwYm5nZzVZZTk1cFd3WEhKY2JpQXFJRDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMWNjbHh1SUNvZ1EzSmxZWFJsWkNCQ2VUb2dXV0Z2YUdGcGVHbGhiMXh5WEc0Z0tpQlZjR1JoZEdVNklESXdNakl1TXk0eE1WeHlYRzRnS2k5Y2NseHVYSEpjYmk4cUlEMDlQVDA5UFNEbWxvZm1uS3pubklIbmxhWGxoNzNtbGJBZ1BUMDlQVDA5SUNvdlhISmNiaTVsYkd4cGNITnBjeUFvUUd4cGJtVnpLU0IzYUdWdUlDaEFiR2x1WlhNOU1Ta2dlMXh5WEc0Z0lIZG9hWFJsTFhOd1lXTmxPaUJ1YjNkeVlYQTdYSEpjYmlBZ2RHVjRkQzF2ZG1WeVpteHZkem9nWld4c2FYQnphWE03WEhKY2JpQWdiM1psY21ac2IzYzZJR2hwWkdSbGJqdGNjbHh1ZlZ4eVhHNWNjbHh1TG1Wc2JHbHdjMmx6SUNoQWJHbHVaWE1wSUhkb1pXNGdLRUJzYVc1bGN6NDlNaWtnZTF4eVhHNGdJQzEzWldKcmFYUXRiR2x1WlMxamJHRnRjRG9nUUd4cGJtVnpPMXh5WEc0Z0lHUnBjM0JzWVhrNklHSnZlRHRjY2x4dUlDQXRkMlZpYTJsMExXSnZlQzF2Y21sbGJuUTZJSFpsY25ScFkyRnNPMXh5WEc0Z0lIUmxlSFF0YjNabGNtWnNiM2M2SUdWc2JHbHdjMmx6TzF4eVhHNGdJRzkyWlhKbWJHOTNPaUJvYVdSa1pXNDdYSEpjYm4xY2NseHVJaXdpUUdsdGNHOXlkQ0FuTGk5amIyeHZjbk1uTzF4eVhHNUFhVzF3YjNKMElDY3VMMlp2Ym5Rbk8xeHlYRzVBYVcxd2IzSjBJQ2N1TDIxcGVHbHVjeWM3WEhKY2JseHlYRzR1YjNWMGJHbHVaUzF5WldGa1pYSWdlMXh5WEc0Z0lDWmZYM0J5YjJkeVpYTnpJSHRjY2x4dUlDQWdJSEJ2YzJsMGFXOXVPaUJtYVhobFpEdGNjbHh1SUNBZ0lIUnZjRG9nTUR0Y2NseHVJQ0FnSUd4bFpuUTZJREE3WEhKY2JpQWdJQ0I2TFdsdVpHVjRPaUF6TzF4eVhHNGdJQ0FnYUdWcFoyaDBPaUEwY0hnN1hISmNiaUFnSUNCM2FXUjBhRG9nTVRBd0pUdGNjbHh1SUNBZ0lHSmhZMnRuY205MWJtUXRZMjlzYjNJNklFQndjbWx0WVhKNVgyTnZiRzl5TzF4eVhHNGdJQ0FnYzJOaGJHVTZJREFnTVR0Y2NseHVJQ0FnSUhSeVlXNXpabTl5YlMxdmNtbG5hVzQ2SUd4bFpuUTdYSEpjYmlBZ0lDQmhibWx0WVhScGIyNDZJRzkxZEd4cGJtVXRjbVZoWkdWeUxYQnliMmR5WlhOeklHeHBibVZoY2p0Y2NseHVJQ0FnSUdGdWFXMWhkR2x2YmkxMGFXMWxiR2x1WlRvZ0xTMVFjbTluY21WemMxUnBiV1ZzYVc1bE8xeHlYRzRnSUgxY2NseHVYSEpjYmlBZ0psOWZjR0Z3WlhJZ2UxeHlYRzRnSUNBZ0xuTm9ZV1J2ZDE5a1lYSnJYM0psWjNWc1lYSW9LVHRjY2x4dUlDQWdJRzFoY21kcGJqb2dNbVZ0SUdGMWRHODdYSEpjYmlBZ0lDQnRZWGd0ZDJsa2RHZzZJREV5TURCd2VEdGNjbHh1SUNBZ0lIQmhaR1JwYm1jNklETXVNbVZ0TzF4eVhHNGdJQ0FnWW05NExYTnBlbWx1WnpvZ1ltOXlaR1Z5TFdKdmVEdGNjbHh1SUNBZ0lHSmhZMnRuY205MWJtUXRZMjlzYjNJNklFQjNhR2wwWlR0Y2NseHVJQ0FnSUc5MlpYSm1iRzkzT2lCb2FXUmtaVzQ3WEhKY2JpQWdmVnh5WEc1Y2NseHVJQ0FtWDE5MGFYUnNaU0I3WEhKY2JpQWdJQ0J0WVhKbmFXNDZJREF1TmpkbGJTQXdPMXh5WEc0Z0lDQWdkR1Y0ZEMxaGJHbG5iam9nWTJWdWRHVnlPMXh5WEc0Z0lDQWdabTl1ZEMxbVlXMXBiSGs2SUVCbWIyNTBYM1JsZUhSZlptRnRhV3g1TzF4eVhHNGdJQ0FnWm05dWRDMTNaV2xuYUhRNklHNXZjbTFoYkR0Y2NseHVJQ0FnSUd4cGJtVXRhR1ZwWjJoME9pQXhMak5sYlR0Y2NseHVJQ0FnSUdadmJuUXRjMmw2WlRvZ05DNHlaVzA3WEhKY2JpQWdJQ0J2ZG1WeVpteHZkem9nYUdsa1pHVnVPMXh5WEc0Z0lIMWNjbHh1WEhKY2JpQWdKbDlmWVhKMGFXTnNaU0I3WEhKY2JpQWdJQ0F1YjNWMGJHbHVaUzF5WldGa1pYSmZYM0J5YjJkeVpYTnpJSHRjY2x4dUlDQWdJQ0FnWkdsemNHeGhlVG9nYm05dVpUdGNjbHh1SUNBZ0lIMWNjbHh1SUNCOVhISmNibHh5WEc0Z0lDWmZhR2xrWkdWdUlIdGNjbHh1SUNBZ0lHUnBjM0JzWVhrNklHNXZibVU3WEhKY2JseHlYRzRnSUNBZ0ppNXZkWFJzYVc1bExYSmxZV1JsY2w5emFXSnNhVzVuSUh0Y2NseHVJQ0FnSUNBZ1pHbHpjR3hoZVRvZ2JtOXVaU0FoYVcxd2IzSjBZVzUwTzF4eVhHNWNjbHh1SUNBZ0lDQWdKaTUzY21Gd2NHVnlJSHRjY2x4dUlDQWdJQ0FnSUNBbUxuQnZjM1FnZTF4eVhHNGdJQ0FnSUNBZ0lDQWdaR2x6Y0d4aGVUb2dibTl1WlR0Y2NseHVJQ0FnSUNBZ0lDQjlYSEpjYmlBZ0lDQWdJSDFjY2x4dUlDQWdJSDFjY2x4dUlDQjlYSEpjYmx4eVhHNGdJQ1l0TFhKbFlXUnBibWNnZTF4eVhHNGdJQ0FnWkdsemNHeGhlVG9nWW14dlkyczdYSEpjYmlBZ0lDQndiM05wZEdsdmJqb2dabWw0WldRN1hISmNiaUFnSUNCNkxXbHVaR1Y0T2lBeU8xeHlYRzRnSUNBZ2RHOXdPaUF3TzF4eVhHNGdJQ0FnYkdWbWREb2dNRHRjY2x4dUlDQWdJSGRwWkhSb09pQXhNREFsTzF4eVhHNGdJQ0FnYUdWcFoyaDBPaUF4TURBbE8xeHlYRzRnSUNBZ2JXRnlaMmx1T2lBd08xeHlYRzRnSUNBZ1ltOTRMWE5wZW1sdVp6b2dZbTl5WkdWeUxXSnZlRHRjY2x4dUlDQWdJSEJoWkdScGJtYzZJRE5sYlNBMFpXMDdYSEpjYmlBZ0lDQmlZV05yWjNKdmRXNWtMV052Ykc5eU9pQkFZbWRmWTI5c2IzSTdYSEpjYmlBZ0lDQnpZM0p2Ykd3dGRHbHRaV3hwYm1VdGJtRnRaVG9nTFMxUWNtOW5jbVZ6YzFScGJXVnNhVzVsTzF4eVhHNGdJQ0FnYjNabGNtWnNiM2M2SUhOamNtOXNiRHRjY2x4dUlDQjlYSEpjYm4xY2NseHVYSEpjYmtCclpYbG1jbUZ0WlhNZ2IzVjBiR2x1WlMxeVpXRmtaWEl0Y0hKdlozSmxjM01nZTF4eVhHNGdJSFJ2SUh0Y2NseHVJQ0FnSUhOallXeGxPaUF4SURFN1hISmNiaUFnZlZ4eVhHNTlYSEpjYmx4eVhHNUFiV1ZrYVdFZ0tHMWhlQzEzYVdSMGFEb2dOVEF3Y0hncElIdGNjbHh1SUNBdWIzVjBiR2x1WlNCN1hISmNiaUFnSUNBbUxYSmxZV1JsY2lCN1hISmNiaUFnSUNBZ0lHOTJaWEptYkc5M09pQm9hV1JrWlc0N1hISmNibHh5WEc0Z0lDQWdJQ0F1YjNWMGJHbHVaUzEwYjI5c1ltRnlJSHRjY2x4dUlDQWdJQ0FnSUNCa2FYTndiR0Y1T2lCbWJHVjRPMXh5WEc0Z0lDQWdJQ0FnSUdac1pYZ3RaR2x5WldOMGFXOXVPaUJ5YjNjN1hISmNiaUFnSUNBZ0lDQWdabXhsZUMxM2NtRndPaUJ1YjNkeVlYQTdYSEpjYmlBZ0lDQWdJQ0FnWVd4cFoyNHRhWFJsYlhNNklHTmxiblJsY2p0Y2NseHVJQ0FnSUNBZ0lDQmhiR2xuYmkxelpXeG1PaUJoZFhSdk8xeHlYRzRnSUNBZ0lDQWdJSFJ2Y0RvZ01UQXdKVHRjY2x4dUlDQWdJQ0FnSUNCeWFXZG9kRG9nTUR0Y2NseHVJQ0FnSUNBZ0lDQjBjbUZ1YzJadmNtMDZJSFJ5WVc1emJHRjBaVmtvTFRRNGNIZ3BPMXh5WEc0Z0lDQWdJQ0FnSUhkcFpIUm9PaUF4TURBbE8xeHlYRzRnSUNBZ0lDQWdJR2hsYVdkb2REb2dORGh3ZUR0Y2NseHVJQ0FnSUNBZ0lDQmliM2d0YzJsNmFXNW5PaUJpYjNKa1pYSXRZbTk0TzF4eVhHNGdJQ0FnSUNBZ0lHSnZjbVJsY2kxMGIzQTZJREZ3ZUNCemIyeHBaQ0JBWW05eVpHVnlYMk52Ykc5eU8xeHlYRzRnSUNBZ0lDQWdJR0poWTJ0bmNtOTFibVF0WTI5c2IzSTZJRUIzYUdsMFpUdGNjbHh1SUNBZ0lDQWdJQ0J3WVdSa2FXNW5PaUF3SURFMmNIZzdYSEpjYmx4eVhHNGdJQ0FnSUNBZ0lDWmZYMkoxZEhSdmJpQjdYSEpjYmlBZ0lDQWdJQ0FnSUNBdWNtRmthWFZ6WDI1dmJtVW9LVHRjY2x4dUlDQWdJQ0FnSUNBZ0lHWnNaWGc2SURFN1hISmNiaUFnSUNBZ0lDQWdJQ0JpYjNKa1pYSTZJRzV2Ym1VN1hISmNiaUFnSUNBZ0lDQWdJQ0JpYjNndGMyaGhaRzkzT2lCdWIyNWxPMXh5WEc0Z0lDQWdJQ0FnSUgxY2NseHVJQ0FnSUNBZ2ZWeHlYRzVjY2x4dUlDQWdJQ0FnSmkwdGNtVmhaR2x1WnlCN1hISmNiaUFnSUNBZ0lDQWdjR0ZrWkdsdVp6b2dNRHRjY2x4dUlDQWdJQ0FnSUNCaVlXTnJaM0p2ZFc1a0xXTnZiRzl5T2lCQWQyaHBkR1U3WEhKY2JpQWdJQ0FnSUNBZ1ltOTRMWE5wZW1sdVp6b2dZbTl5WkdWeUxXSnZlRHRjY2x4dUlDQWdJQ0FnZlZ4eVhHNWNjbHh1SUNBZ0lDQWdKbDlmY0dGd1pYSWdlMXh5WEc0Z0lDQWdJQ0FnSUhCdmMybDBhVzl1T2lCeVpXeGhkR2wyWlR0Y2NseHVJQ0FnSUNBZ0lDQjZMV2x1WkdWNE9pQXhPMXh5WEc0Z0lDQWdJQ0FnSUcxaGNtZHBiam9nTUR0Y2NseHVJQ0FnSUNBZ0lDQndZV1JrYVc1bk9pQXdPMXh5WEc0Z0lDQWdJQ0FnSUdobGFXZG9kRG9nTVRBd0pUdGNjbHh1SUNBZ0lDQWdJQ0JpYjNndGMyaGhaRzkzT2lCdWIyNWxPMXh5WEc0Z0lDQWdJQ0FnSUc5MlpYSm1iRzkzT2lCb2FXUmtaVzQ3WEhKY2JpQWdJQ0FnSUgxY2NseHVYSEpjYmlBZ0lDQWdJQ1pmWDNScGRHeGxJSHRjY2x4dUlDQWdJQ0FnSUNBdVpXeHNhWEJ6YVhNb01TazdYSEpjYmlBZ0lDQWdJQ0FnY0c5emFYUnBiMjQ2SUdGaWMyOXNkWFJsTzF4eVhHNGdJQ0FnSUNBZ0lIb3RhVzVrWlhnNklETTdYSEpjYmlBZ0lDQWdJQ0FnZEc5d09pQXdPMXh5WEc0Z0lDQWdJQ0FnSUd4bFpuUTZJREE3WEhKY2JpQWdJQ0FnSUNBZ2JXRnlaMmx1T2lBd08xeHlYRzRnSUNBZ0lDQWdJSGRwWkhSb09pQXhNREFsTzF4eVhHNGdJQ0FnSUNBZ0lHaGxhV2RvZERvZ05EaHdlRHRjY2x4dUlDQWdJQ0FnSUNCc2FXNWxMV2hsYVdkb2REb2dORGh3ZUR0Y2NseHVJQ0FnSUNBZ0lDQmliM0prWlhJdFltOTBkRzl0T2lBeGNIZ2djMjlzYVdRZ1FHSnZjbVJsY2w5amIyeHZjanRjY2x4dUlDQWdJQ0FnSUNCbWIyNTBMWE5wZW1VNklERXVPR1Z0TzF4eVhHNGdJQ0FnSUNBZ0lHWnZiblF0ZDJWcFoyaDBPaUEwTURBN1hISmNiaUFnSUNBZ0lDQWdZbUZqYTJkeWIzVnVaQzFqYjJ4dmNqb2dRSGRvYVhSbE8xeHlYRzRnSUNBZ0lDQWdJRzkyWlhKbWJHOTNPaUJvYVdSa1pXNDdYSEpjYmlBZ0lDQWdJSDFjY2x4dVhISmNiaUFnSUNBZ0lDWmZYMkZ5ZEdsamJHVWdlMXh5WEc0Z0lDQWdJQ0FnSUcxaGNtZHBiam9nTkRod2VDQXdPMXh5WEc0Z0lDQWdJQ0FnSUdobGFXZG9kRG9nWTJGc1l5Z3hNREFsSUMwZ09UWndlQ2s3WEhKY2JpQWdJQ0FnSUNBZ2NHRmtaR2x1WnpvZ01DQXhMakkxWlcwN1hISmNiaUFnSUNBZ0lDQWdjMk55YjJ4c0xYUnBiV1ZzYVc1bExXNWhiV1U2SUMwdFRXOWlhV3hsVUhKdlozSmxjM05VYVcxbGJHbHVaVHRjY2x4dUlDQWdJQ0FnSUNCdmRtVnlabXh2ZHkxNE9pQm9hV1JrWlc0N1hISmNiaUFnSUNBZ0lDQWdiM1psY21ac2IzY3RlVG9nYzJOeWIyeHNPMXh5WEc1Y2NseHVJQ0FnSUNBZ0lDQXViM1YwYkdsdVpTMXlaV0ZrWlhKZlgzQnliMmR5WlhOeklIdGNjbHh1SUNBZ0lDQWdJQ0FnSUhvdGFXNWtaWGc2SURRN1hISmNiaUFnSUNBZ0lDQWdJQ0JoYm1sdFlYUnBiMjQ2SUc5MWRHeHBibVV0Y21WaFpHVnlMWEJ5YjJkeVpYTnpJR3hwYm1WaGNqdGNjbHh1SUNBZ0lDQWdJQ0FnSUdGdWFXMWhkR2x2YmkxMGFXMWxiR2x1WlRvZ0xTMU5iMkpwYkdWUWNtOW5jbVZ6YzFScGJXVnNhVzVsTzF4eVhHNGdJQ0FnSUNBZ0lDQWdaR2x6Y0d4aGVUb2dZbXh2WTJzN1hISmNiaUFnSUNBZ0lDQWdmVnh5WEc0Z0lDQWdJQ0I5WEhKY2JpQWdJQ0I5WEhKY2JpQWdmVnh5WEc1OVhISmNibHh5WEc1QWJXVmthV0VnY0hKcGJuUWdlMXh5WEc0Z0lHaDBiV3dzWEhKY2JpQWdZbTlrZVNCN1hISmNiaUFnSUNBdktpRG1pWlBsamJEbm1vVGxuN3Jub1lEbHJaZmt2WlBscEtmbHNJOGdLaTljY2x4dUlDQWdJR1p2Ym5RdGMybDZaVG9nTVRKd2REdGNjbHh1SUNBZ0lDOHFJT2FZdnVla3V1aXV2dWU5cnVhV2grV3RsK21pbk9pSnN1V1NqT2lEak9hWnIrbWluT2lKc2lBcUwxeHlYRzRnSUNBZ1ltRmphMmR5YjNWdVpDMWpiMnh2Y2pvZ1FIZG9hWFJsTzF4eVhHNGdJQ0FnWTI5c2IzSTZJRUJ3Y21sdFlYSjVYM1JsZUhSZlkyOXNiM0k3WEhKY2JpQWdJQ0JvWldsbmFIUTZJR2x1YVhScFlXd2dJV2x0Y0c5eWRHRnVkRHRjY2x4dUlDQjlYSEpjYmx4eVhHNGdJQzhxSU9pdXZ1ZTlydW1UdnVhT3BlYWd0K1c4anlBcUwxeHlYRzRnSUdFNmJHbHVheXhjY2x4dUlDQmhPblpwYzJsMFpXUXNYSEpjYmlBZ1lUcG9iM1psY2lCN1hISmNiaUFnSUNCMFpYaDBMV1JsWTI5eVlYUnBiMjQ2SUhWdVpHVnliR2x1WlNBaGFXMXdiM0owWVc1ME8xeHlYRzRnSUNBZ1kyOXNiM0k2SUVCd2NtbHRZWEo1WDJOdmJHOXlPMXh5WEc0Z0lIMWNjbHh1WEhKY2JpQWdMeW9nNlpxUTZKZVA1YXFTNUwyVDVxQ0g1NjIrSUNvdlhISmNiaUFnZG1sa1pXOHNYSEpjYmlBZ1lYVmthVzhnZTF4eVhHNGdJQ0FnWkdsemNHeGhlVG9nYm05dVpTQWhhVzF3YjNKMFlXNTBPMXh5WEc0Z0lIMWNjbHh1WEhKY2JpQWdMeW9nNTZHdTVMK2Q2S0dvNXFDODVaeW81b21UNVkydzVwZTI1NXFFNkw2NTVxR0c1WktNNWErNTZiMlE1cGE1NWJ5UDVyaUY1cG13SUNvdlhISmNiaUFnZEdGaWJHVWdlMXh5WEc0Z0lDQWdkMmxrZEdnNklERXdNQ1U3WEhKY2JpQWdJQ0JpYjNKa1pYSXRZMjlzYkdGd2MyVTZJR052Ykd4aGNITmxPMXh5WEc0Z0lIMWNjbHh1SUNCMGFDeGNjbHh1SUNCMFpDQjdYSEpjYmlBZ0lDQmliM0prWlhJNklERndlQ0J6YjJ4cFpDQkFjSEpwYldGeWVWOWliM0prWlhKZlkyOXNiM0k3WEhKY2JpQWdJQ0J3WVdSa2FXNW5PaUE0Y0hnZ01qQndlRHRjY2x4dUlDQjlYSEpjYmx4eVhHNGdJQzV2ZFhSc2FXNWxJSHRjY2x4dUlDQWdJQ1l0YldWemMyRm5aU3hjY2x4dUlDQWdJQ1l0ZEc5dmJHSmhjaUI3WEhKY2JpQWdJQ0FnSUM4cUlPbWFrT2lYaitTNmh1VzNwZVdGdCthZ2orV1NqT1Mvb2VhQnIrYVBrT2VrdXVhaGhpQXFMMXh5WEc0Z0lDQWdJQ0JrYVhOd2JHRjVPaUJ1YjI1bElDRnBiWEJ2Y25SaGJuUTdYSEpjYmlBZ0lDQjlYSEpjYmx4eVhHNGdJQ0FnSmkxeVpXRmtaWElnZTF4eVhHNGdJQ0FnSUNCa2FYTndiR0Y1T2lCaWJHOWpheUFoYVcxd2IzSjBZVzUwTzF4eVhHNGdJQ0FnSUNCdmRtVnlabXh2ZHpvZ2FHbGtaR1Z1TzF4eVhHNWNjbHh1SUNBZ0lDQWdKbDlmZEdsMGJHVWdlMXh5WEc0Z0lDQWdJQ0FnSUcxaGNtZHBiam9nTVRNdU5IQjBJREFnTWpod2RDQWhhVzF3YjNKMFlXNTBPMXh5WEc0Z0lDQWdJQ0FnSUhSbGVIUXRZV3hwWjI0NklHTmxiblJsY2lBaGFXMXdiM0owWVc1ME8xeHlYRzRnSUNBZ0lDQWdJR1p2Ym5RdGMybDZaVG9nTXpKd2RDQWhhVzF3YjNKMFlXNTBPMXh5WEc0Z0lDQWdJQ0I5WEhKY2JseHlYRzRnSUNBZ0lDQXZLaURsajVibXRvamt1b2JudTUzbHI3bmxycHJrdlkwZ0tpOWNjbHh1SUNBZ0lDQWdKaTB0Y21WaFpHbHVaeUI3WEhKY2JpQWdJQ0FnSUNBZ2NHOXphWFJwYjI0NklISmxiR0YwYVhabElDRnBiWEJ2Y25SaGJuUTdYSEpjYmlBZ0lDQWdJQ0FnYUdWcFoyaDBPaUJoZFhSdklDRnBiWEJ2Y25SaGJuUTdYSEpjYmlBZ0lDQWdJQ0FnY0dGa1pHbHVaem9nTUNBaGFXMXdiM0owWVc1ME8xeHlYRzRnSUNBZ0lDQWdJR0poWTJ0bmNtOTFibVF0WTI5c2IzSTZJRUIzYUdsMFpUdGNjbHh1SUNBZ0lDQWdJQ0J2ZG1WeVpteHZkem9nYUdsa1pHVnVJQ0ZwYlhCdmNuUmhiblE3WEhKY2JpQWdJQ0FnSUgxY2NseHVYSEpjYmlBZ0lDQWdJQzhxSU9tYWtPaVhqK21ZaGVpdnUraS9tK1c2cHVhZG9TQXFMMXh5WEc0Z0lDQWdJQ0FtWDE5d2NtOW5jbVZ6Y3lCN1hISmNiaUFnSUNBZ0lDQWdaR2x6Y0d4aGVUb2dibTl1WlNBaGFXMXdiM0owWVc1ME8xeHlYRzRnSUNBZ0lDQjlYSEpjYmx4eVhHNGdJQ0FnSUNBdktpRG1pWlBsamJEbWw3Ymt1STNtbUw3bnBMcm1yYVBtbG9jZ1JFOU5JT2VhaE9tWXRPVzlzZWFWaU9hZW5DQXFMMXh5WEc0Z0lDQWdJQ0FtWDE5d1lYQmxjaUI3WEhKY2JpQWdJQ0FnSUNBZ1ltOTRMWE5vWVdSdmR6b2dibTl1WlR0Y2NseHVJQ0FnSUNBZ2ZWeHlYRzVjY2x4dUlDQWdJQ0FnY0hKbElIdGNjbHh1SUNBZ0lDQWdJQ0J3WVdSa2FXNW5PaUF4WlcwZ0lXbHRjRzl5ZEdGdWREdGNjbHh1SUNBZ0lDQWdJQ0JpYjNKa1pYSTZJREZ3ZUNCemIyeHBaQ0JBWW05eVpHVnlYMk52Ykc5eUlDRnBiWEJ2Y25SaGJuUTdYSEpjYmlBZ0lDQWdJQ0FnWW05eVpHVnlMWEpoWkdsMWN6b2dOSEI0SUNGcGJYQnZjblJoYm5RN1hISmNiaUFnSUNBZ0lIMWNjbHh1WEhKY2JpQWdJQ0FnSUhCeVpTeGNjbHh1SUNBZ0lDQWdZMjlrWlNCN1hISmNiaUFnSUNBZ0lDQWdZbUZqYTJkeWIzVnVaQzFqYjJ4dmNqb2dRSGRvYVhSbElDRnBiWEJ2Y25SaGJuUTdYSEpjYmlBZ0lDQWdJSDFjY2x4dVhISmNiaUFnSUNBZ0lIUmhZbXhsTEZ4eVhHNGdJQ0FnSUNCcGJXY3NYSEpjYmlBZ0lDQWdJSE4yWnlCN1hISmNiaUFnSUNBZ0lDQWdZbkpsWVdzdGFXNXphV1JsT2lCaGRtOXBaRHRjY2x4dUlDQWdJQ0FnZlZ4eVhHNWNjbHh1SUNBZ0lDQWdMeW9nNW9tQTVweUo1cGFINTZ1ZzVZYUY1YTY1SUVSUFRTRG5tN2psaGJQbm1vVHBncnZsc1lYb2lvTG5ncm5wZzczcG1wRG9sNC9rdW9ZZ0tpOWNjbHh1SUNBZ0lDQWdKbDl6YVdKc2FXNW5JSHRjY2x4dUlDQWdJQ0FnSUNCa2FYTndiR0Y1T2lCdWIyNWxJQ0ZwYlhCdmNuUmhiblE3WEhKY2JpQWdJQ0FnSUgxY2NseHVJQ0FnSUgxY2NseHVJQ0I5WEhKY2JuMWNjbHh1SWl3aUx5b3FYSEpjYmlBcUlISmhaR2wxY3k1c1pYTnpJQzBnNVp5RzZLZVM2SzYrNTcydUlHMXBlR2x1ZUNEbGg3M21sYkJjY2x4dUlDb2dQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBWeHlYRzRnS2lCRGNtVmhkR1ZrSUVKNU9pQlpZVzlvWVdsNGFXRnZYSEpjYmlBcUlGVndaR0YwWlRvZ01qQXlOQzQwTGpFMlhISmNiaUFxTDF4eVhHNWNjbHh1THlvZ1BUMDlQVDA5SU9XY2h1aW5rdWFndCtXOGoraXV2dWU5cnVXSHZlYVZzQ0E5UFQwOVBUMGdLaTljY2x4dUxuSmhaR2wxY3loQWJuVnRPaUF5Y0hncElIdGNjbHh1SUNCaWIzSmtaWEl0Y21Ga2FYVnpPaUJBYm5WdE8xeHlYRzU5WEhKY2JseHlYRzR1Y21Ga2FYVnpYMjV2Ym1Vb0tTQjdYSEpjYmlBZ0xuSmhaR2wxY3lnd0tUdGNjbHh1ZlZ4eVhHNWNjbHh1TG5KaFpHbDFjMTl0YVc1cEtDa2dlMXh5WEc0Z0lDNXlZV1JwZFhNb01uQjRLVHRjY2x4dWZWeHlYRzVjY2x4dUxuSmhaR2wxYzE5emJXRnNiQ2dwSUh0Y2NseHVJQ0F1Y21Ga2FYVnpLRE53ZUNrN1hISmNibjFjY2x4dVhISmNiaTV5WVdScGRYTmZjbVZuZFd4aGNpZ3BJSHRjY2x4dUlDQXVjbUZrYVhWektEUndlQ2s3WEhKY2JuMWNjbHh1WEhKY2JpNXlZV1JwZFhOZmJXVmthWFZ0S0NrZ2UxeHlYRzRnSUM1eVlXUnBkWE1vTlhCNEtUdGNjbHh1ZlZ4eVhHNWNjbHh1TG5KaFpHbDFjMTlzWVhKblpTZ3BJSHRjY2x4dUlDQXVjbUZrYVhWektERXdjSGdwTzF4eVhHNTlYSEpjYmx4eVhHNHVjbUZrYVhWelgyaDFaMlVvS1NCN1hISmNiaUFnTG5KaFpHbDFjeWd4Tm5CNEtUdGNjbHh1ZlZ4eVhHNWNjbHh1TG5KaFpHbDFjMTl5YjNWdVpDZ3BJSHRjY2x4dUlDQXVjbUZrYVhWektETXdjSGdwTzF4eVhHNTlYSEpjYmlJc0lpOHFJRDA5UFQwOVBUMDlQVDBnWW5WMGRHOXVjeTUwYUdWdFpTQXRJT2FNaWVtU3J1V3Z2T2lJcXVhZ3QrVzhqeUE5UFQwOVBUMDlQVDA5SUNvdlhISmNia0JwYlhCdmNuUWdKeTR2WTI5c2IzSnpKenRjY2x4dVFHbHRjRzl5ZENBbkxpOXphR0ZrYjNjbk8xeHlYRzVjY2x4dUxtOTFkR3hwYm1VdGRHOXZiR0poY2lCN1hISmNiaUFnY0c5emFYUnBiMjQ2SUdacGVHVmtPMXh5WEc0Z0lIb3RhVzVrWlhnNklEazVPVGs1TzF4eVhHNGdJRzFoY21kcGJqb2dNRHRjY2x4dUlDQjBjbUZ1YzJsMGFXOXVMV1IxY21GMGFXOXVPaUF3TGpOek8xeHlYRzRnSUc5MlpYSm1iRzkzT2lCb2FXUmtaVzQ3WEhKY2JseHlYRzRnSUNaZlgySjFkSFJ2YmlCN1hISmNiaUFnSUNBdWMyaGhaRzkzWDJ4cFoyaDBYM0psWjNWc1lYSW9LVHRjY2x4dUlDQWdJSEJ2YzJsMGFXOXVPaUJ5Wld4aGRHbDJaVHRjY2x4dUlDQWdJSG90YVc1a1pYZzZJREU3WEhKY2JpQWdJQ0J0WVhKbmFXNDZJREV3Y0hnN1hISmNiaUFnSUNCM2FXUjBhRG9nTXpad2VEdGNjbHh1SUNBZ0lHaGxhV2RvZERvZ016WndlRHRjY2x4dUlDQWdJR0p2Y21SbGNqb2dNWEI0SUhOdmJHbGtJRUJ3Y21sdFlYSjVYMkp2Y21SbGNsOWpiMnh2Y2p0Y2NseHVJQ0FnSUdKdmNtUmxjaTF5WVdScGRYTTZJRE53ZUR0Y2NseHVJQ0FnSUdKdmVDMXphWHBwYm1jNklHSnZjbVJsY2kxaWIzZzdYSEpjYmlBZ0lDQmlZV05yWjNKdmRXNWtMV052Ykc5eU9pQkFkMmhwZEdVN1hISmNiaUFnSUNCamRYSnpiM0k2SUhCdmFXNTBaWEk3WEhKY2JpQWdJQ0IwWlhoMExXRnNhV2R1T2lCalpXNTBaWEk3WEhKY2JpQWdJQ0JqYjJ4dmNqb2dRR1p2ZFhKMGFGOTBaWGgwWDJOdmJHOXlPMXh5WEc0Z0lDQWdkSEpoYm5OcGRHbHZiam9nWVd4c0lEQXVNM01nTUM0eGN5QmxZWE5sTFdsdUxXOTFkRHRjY2x4dUlDQWdJRzkyWlhKbWJHOTNPaUJvYVdSa1pXNDdYSEpjYmx4eVhHNGdJQ0FnSmpwb2IzWmxjaUI3WEhKY2JpQWdJQ0FnSUdOdmJHOXlPaUJBYzNWalkyVnpjMTlqYjJ4dmNqdGNjbHh1SUNBZ0lDQWdZbTl5WkdWeUxXTnZiRzl5T2lCQWMzVmpZMlZ6YzE5amIyeHZjanRjY2x4dUlDQWdJQ0FnZEhKaGJuTm1iM0p0T2lCelkyRnNaU2d4TGpNMUtUdGNjbHh1SUNBZ0lIMWNjbHh1WEhKY2JpQWdJQ0FtTG1ocFpHVWdlMXh5WEc0Z0lDQWdJQ0JrYVhOd2JHRjVPaUJ1YjI1bE8xeHlYRzRnSUNBZ2ZWeHlYRzRnSUgxY2NseHVYSEpjYmlBZ0psOWZZVzVqYUc5eUlIdGNjbHh1SUNBZ0lDWTZiR2x1YXl4Y2NseHVJQ0FnSUNZNmRtbHphWFJsWkN4Y2NseHVJQ0FnSUNZNmFHOTJaWElnZTF4eVhHNGdJQ0FnSUNCamIyeHZjam9nUUdadmRYSjBhRjkwWlhoMFgyTnZiRzl5TzF4eVhHNGdJQ0FnSUNCMFpYaDBMV1JsWTI5eVlYUnBiMjQ2SUc1dmJtVTdYSEpjYmlBZ0lDQjlYSEpjYmx4eVhHNGdJQ0FnSmpwb2IzWmxjaUI3WEhKY2JpQWdJQ0FnSUdOdmJHOXlPaUJBYzNWalkyVnpjMTlqYjJ4dmNqdGNjbHh1SUNBZ0lIMWNjbHh1SUNCOVhISmNibHh5WEc0Z0lDWmZYMmxqYjI0Z2UxeHlYRzRnSUNBZ2NHOXphWFJwYjI0NklHRmljMjlzZFhSbE8xeHlYRzRnSUNBZ2VpMXBibVJsZURvZ01qdGNjbHh1SUNBZ0lIUnZjRG9nTlRBbE8xeHlYRzRnSUNBZ2JHVm1kRG9nTlRBbE8xeHlYRzRnSUNBZ2QybGtkR2c2SURJd2NIZzdYSEpjYmlBZ0lDQm9aV2xuYUhRNklESXdjSGc3WEhKY2JpQWdJQ0IwY21GdWMyWnZjbTA2SUhSeVlXNXpiR0YwWlNndE5UQWxMQ0F0TlRBbEtUdGNjbHh1SUNBZ0lHWnBiR3c2SUdOMWNuSmxiblJqYjJ4dmNqdGNjbHh1SUNBZ0lHOTJaWEptYkc5M09pQm9hV1JrWlc0N1hISmNiaUFnZlZ4eVhHNWNjbHh1SUNBbVgyRmpkR2wyWlNCN1hISmNiaUFnSUNBbUxtOTFkR3hwYm1VdGRHOXZiR0poY2lCN1hISmNiaUFnSUNBZ0lDWmZYMkoxZEhSdmJpQjdYSEpjYmlBZ0lDQWdJQ0FnWTI5c2IzSTZJRUIzYUdsMFpUdGNjbHh1SUNBZ0lDQWdJQ0JpWVdOclozSnZkVzVrTFdOdmJHOXlPaUJBYzNWalkyVnpjMTlqYjJ4dmNqdGNjbHh1SUNBZ0lDQWdJQ0JpYjNKa1pYSXRZMjlzYjNJNklFQnpkV05qWlhOelgyTnZiRzl5TzF4eVhHNWNjbHh1SUNBZ0lDQWdJQ0FtT21odmRtVnlJSHRjY2x4dUlDQWdJQ0FnSUNBZ0lHTnZiRzl5T2lCQWQyaHBkR1U3WEhKY2JpQWdJQ0FnSUNBZ2ZWeHlYRzRnSUNBZ0lDQjlYSEpjYmlBZ0lDQjlYSEpjYmx4eVhHNGdJQ0FnTG05MWRHeHBibVV0ZEc5dmJHSmhjbDlmWVc1amFHOXlJSHRjY2x4dUlDQWdJQ0FnSmpwc2FXNXJMRnh5WEc0Z0lDQWdJQ0FtT25acGMybDBaV1FzWEhKY2JpQWdJQ0FnSUNZNmFHOTJaWElnZTF4eVhHNGdJQ0FnSUNBZ0lHTnZiRzl5T2lCQWQyaHBkR1U3WEhKY2JpQWdJQ0FnSUgxY2NseHVJQ0FnSUgxY2NseHVJQ0I5WEhKY2JseHlYRzRnSUNaZmNtOTFibVJsWkNCN1hISmNiaUFnSUNBbUxtOTFkR3hwYm1VdGRHOXZiR0poY2w5ZlluVjBkRzl1SUh0Y2NseHVJQ0FnSUNBZ1ltOXlaR1Z5TFhKaFpHbDFjem9nTVRod2VEdGNjbHh1SUNBZ0lIMWNjbHh1SUNCOVhISmNibHh5WEc0Z0lDWmZaR2x6WVdKc1pXUWdlMXh5WEc0Z0lDQWdKaTV2ZFhSc2FXNWxMWFJ2YjJ4aVlYSXNYSEpjYmlBZ0lDQXViM1YwYkdsdVpTMTBiMjlzWW1GeUlIdGNjbHh1SUNBZ0lDQWdKbDlmWVc1amFHOXlPbXhwYm1zc1hISmNiaUFnSUNBZ0lDWmZYMkZ1WTJodmNqcDJhWE5wZEdWa0xGeHlYRzRnSUNBZ0lDQW1YMTloYm1Ob2IzSTZhRzkyWlhJc1hISmNiaUFnSUNBZ0lDWmZYMkoxZEhSdmJpQjdYSEpjYmlBZ0lDQWdJQ0FnWTNWeWMyOXlPaUJ1YjNRdFlXeHNiM2RsWkR0Y2NseHVJQ0FnSUNBZ0lDQmpiMnh2Y2pvZ1FHWnZkWEowYUY5MFpYaDBYMk52Ykc5eU8xeHlYRzRnSUNBZ0lDQWdJR0p2Y21SbGNpMWpiMnh2Y2pvZ1FHWnZkWEowYUY5MFpYaDBYMk52Ykc5eU8xeHlYRzVjY2x4dUlDQWdJQ0FnSUNBbU9taHZkbVZ5SUh0Y2NseHVJQ0FnSUNBZ0lDQWdJR052Ykc5eU9pQkFabTkxY25Sb1gzUmxlSFJmWTI5c2IzSTdYSEpjYmlBZ0lDQWdJQ0FnSUNCaWIzSmtaWEl0WTI5c2IzSTZJRUJtYjNWeWRHaGZkR1Y0ZEY5amIyeHZjanRjY2x4dUlDQWdJQ0FnSUNCOVhISmNiaUFnSUNBZ0lIMWNjbHh1WEhKY2JpQWdJQ0FnSUNaZlgySjFkSFJ2YmlCN1hISmNiaUFnSUNBZ0lDQWdZbUZqYTJkeWIzVnVaQzFqYjJ4dmNqb2dRR1JwYzJGaWJHVmtYMkpuWDJOdmJHOXlPMXh5WEc0Z0lDQWdJQ0I5WEhKY2JpQWdJQ0I5WEhKY2JpQWdmVnh5WEc1Y2NseHVJQ0FtWDNSMFlpeGNjbHh1SUNBbVgySjBkQ0I3WEhKY2JpQWdJQ0JzWldaME9pQTFNQ1U3WEhKY2JpQWdJQ0IwY21GdWMyWnZjbTA2SUhSeVlXNXpiR0YwWlZnb0xUVXdKU2s3WEhKY2JseHlYRzRnSUNBZ0xtOTFkR3hwYm1VdGRHOXZiR0poY2w5ZlluVjBkRzl1SUh0Y2NseHVJQ0FnSUNBZ1pHbHpjR3hoZVRvZ2FXNXNhVzVsTFdKc2IyTnJPMXh5WEc0Z0lDQWdmVnh5WEc0Z0lIMWNjbHh1WEhKY2JpQWdKbDkwZEdJZ2UxeHlYRzRnSUNBZ2RHOXdPaUF4TW5CNE8xeHlYRzVjY2x4dUlDQWdJQ1l1YjNWMGJHbHVaUzEwYjI5c1ltRnlYMmhwWkdSbGJpQjdYSEpjYmlBZ0lDQWdJSFJ2Y0RvZ0xUVTJjSGc3WEhKY2JpQWdJQ0I5WEhKY2JpQWdmVnh5WEc1Y2NseHVJQ0FtWDJKMGRDQjdYSEpjYmlBZ0lDQmliM1IwYjIwNklERXljSGc3WEhKY2JseHlYRzRnSUNBZ0ppNXZkWFJzYVc1bExYUnZiMnhpWVhKZmFHbGtaR1Z1SUh0Y2NseHVJQ0FnSUNBZ1ltOTBkRzl0T2lBdE5UWndlRHRjY2x4dUlDQWdJSDFjY2x4dUlDQjlYSEpjYmx4eVhHNGdJQ1pmY25Sc0xGeHlYRzRnSUNaZmJIUnlJSHRjY2x4dUlDQWdJSFJ5WVc1elptOXliVG9nZEhKaGJuTnNZWFJsV1NndE5UQWxLVHRjY2x4dUlDQWdJSGRwWkhSb09pQTFObkI0TzF4eVhHNGdJSDFjY2x4dVhISmNiaUFnSmw5eWRHd2dlMXh5WEc0Z0lDQWdkRzl3T2lBMU1DVTdYSEpjYmlBZ0lDQnlhV2RvZERvZ01USndlRHRjY2x4dVhISmNiaUFnSUNBbUxtOTFkR3hwYm1VdGRHOXZiR0poY2w5b2FXUmtaVzRnZTF4eVhHNGdJQ0FnSUNCeWFXZG9kRG9nTFRnMmNIZzdYSEpjYmlBZ0lDQjlYSEpjYmlBZ2ZWeHlYRzVjY2x4dUlDQW1YMngwY2lCN1hISmNiaUFnSUNCMGIzQTZJRFV3SlR0Y2NseHVJQ0FnSUd4bFpuUTZJREV5Y0hnN1hISmNibHh5WEc0Z0lDQWdKaTV2ZFhSc2FXNWxMWFJ2YjJ4aVlYSmZhR2xrWkdWdUlIdGNjbHh1SUNBZ0lDQWdiR1ZtZERvZ0xUZzJjSGc3WEhKY2JpQWdJQ0I5WEhKY2JpQWdmVnh5WEc1Y2NseHVJQ0FtWDNSMFlpeGNjbHh1SUNBbVgzSjBiQ3hjY2x4dUlDQW1YMkowZEN4Y2NseHVJQ0FtWDJ4MGNpQjdYSEpjYmlBZ0lDQXViM1YwYkdsdVpTMTBiMjlzWW1GeVgxOWlkWFIwYjI0Z2UxeHlYRzRnSUNBZ0lDQW1MbTkxZEd4cGJtVXRkRzl2YkdKaGNsOW9hV1JrWlc0Z2UxeHlYRzRnSUNBZ0lDQWdJR1JwYzNCc1lYazZJRzV2Ym1VN1hISmNiaUFnSUNBZ0lIMWNjbHh1SUNBZ0lIMWNjbHh1SUNCOVhISmNibjFjY2x4dUlpd2lRR2x0Y0c5eWRDQW5MaTlqYjJ4dmNuTW5PMXh5WEc1QWFXMXdiM0owSUNjdUwyWnZiblFuTzF4eVhHNUFhVzF3YjNKMElDY3VMMmxqYjI1ekp6dGNjbHh1UUdsdGNHOXlkQ0FuTGk5dGFYaHBibk1uTzF4eVhHNWNjbHh1TG05MWRHeHBibVV0YldWemMyRm5aU0I3WEhKY2JpQWdMbkpoWkdsMWMxOXpiV0ZzYkNncE8xeHlYRzRnSUM1emFHRmtiM2RmYkdsbmFIUmZjbVZuZFd4aGNpZ3BPMXh5WEc0Z0lIQnZjMmwwYVc5dU9pQm1hWGhsWkR0Y2NseHVJQ0I2TFdsdVpHVjRPaUE1T1RrNU8xeHlYRzRnSUc5d1lXTnBkSGs2SURBdU1UdGNjbHh1SUNCMGIzQTZJQzAxTUhCNE8xeHlYRzRnSUd4bFpuUTZJRFV3SlR0Y2NseHVJQ0JvWldsbmFIUTZJRFF3Y0hnN1hISmNiaUFnYldGeVoybHVPaUF3TzF4eVhHNGdJSEJoWkdScGJtYzZJREFnTlRCd2VEdGNjbHh1SUNCc2FXNWxMV2hsYVdkb2REb2dOREJ3ZUR0Y2NseHVJQ0JtYjI1MExYTnBlbVU2SUVCbWIyNTBYM05wZW1WZmMyMWhiR3c3WEhKY2JpQWdZbUZqYTJkeWIzVnVaQzFqYjJ4dmNqb2dRSGRvYVhSbE8xeHlYRzRnSUdOdmJHOXlPaUJBZEdocGNtUmZkR1Y0ZEY5amIyeHZjanRjY2x4dUlDQjBjbUZ1YzJsMGFXOXVPaUJoYkd3Z01DNDFjeUJsWVhObExXbHVMVzkxZER0Y2NseHVJQ0IwY21GdWMyWnZjbTA2SUhSeVlXNXpiR0YwWlZnb0xUVXdKU2s3WEhKY2JpQWdiM1psY21ac2IzYzZJR2hwWkdSbGJqdGNjbHh1WEhKY2JpQWdKbDlmWTI5dWRHVnVkQ0I3WEhKY2JpQWdJQ0F1Wld4c2FYQnphWE1vTVNrN1hISmNiaUFnSUNCdFlYSm5hVzQ2SURBN1hISmNiaUFnSUNCdFlYZ3RkMmxrZEdnNklEY3dNSEI0TzF4eVhHNGdJQ0FnYUdWcFoyaDBPaUEwTUhCNE8xeHlYRzRnSUNBZ2JHbHVaUzFvWldsbmFIUTZJRFF3Y0hnN1hISmNiaUFnSUNCbWIyNTBMWE5wZW1VNklERXpjSGc3WEhKY2JpQWdJQ0JqYjJ4dmNqb2dRSFJvYVhKa1gzUmxlSFJmWTI5c2IzSTdYSEpjYmlBZ0lDQnZkbVZ5Wm14dmR6b2dhR2xrWkdWdU8xeHlYRzRnSUgxY2NseHVYSEpjYmlBZ0psOWZZMnh2YzJVc1hISmNiaUFnSmw5ZmFXTnZiaUI3WEhKY2JpQWdJQ0J3YjNOcGRHbHZiam9nWVdKemIyeDFkR1U3WEhKY2JpQWdJQ0I2TFdsdVpHVjRPaUF5TzF4eVhHNGdJQ0FnZEc5d09pQXdPMXh5WEc0Z0lDQWdkMmxrZEdnNklEUXdjSGc3WEhKY2JpQWdJQ0JvWldsbmFIUTZJRFF3Y0hnN1hISmNiaUFnSUNCc2FXNWxMV2hsYVdkb2REb2dOREJ3ZUR0Y2NseHVJQ0FnSUhSbGVIUXRZV3hwWjI0NklHTmxiblJsY2p0Y2NseHVJQ0FnSUc5MlpYSm1iRzkzT2lCb2FXUmtaVzQ3WEhKY2JpQWdmVnh5WEc1Y2NseHVJQ0FtWDE5cFkyOXVJSHRjY2x4dUlDQWdJR3hsWm5RNklEQTdYSEpjYmlBZ0lDQmpiMnh2Y2pvZ1FIZG9hWFJsTzF4eVhHNWNjbHh1SUNBZ0lDNXZkWFJzYVc1bExXbGpiMjRnZTF4eVhHNGdJQ0FnSUNCd2IzTnBkR2x2YmpvZ1lXSnpiMngxZEdVN1hISmNiaUFnSUNBZ0lIb3RhVzVrWlhnNklESTdYSEpjYmlBZ0lDQWdJSFJ2Y0RvZ05UQWxPMXh5WEc0Z0lDQWdJQ0JzWldaME9pQTFNQ1U3WEhKY2JpQWdJQ0FnSUhSeVlXNXpabTl5YlRvZ2RISmhibk5zWVhSbEtDMDFNQ1VzSUMwMU1DVXBPMXh5WEc0Z0lDQWdmVnh5WEc0Z0lIMWNjbHh1WEhKY2JpQWdKbDlmWTJ4dmMyVWdlMXh5WEc0Z0lDQWdjbWxuYUhRNklEQTdYSEpjYmlBZ0lDQmpkWEp6YjNJNklIQnZhVzUwWlhJN1hISmNiaUFnSUNCamIyeHZjam9nUUdadmRYSjBhRjkwWlhoMFgyTnZiRzl5TzF4eVhHNWNjbHh1SUNBZ0lDNXZkWFJzYVc1bExXbGpiMjRnZTF4eVhHNGdJQ0FnSUNCd2IzTnBkR2x2YmpvZ1lXSnpiMngxZEdVN1hISmNiaUFnSUNBZ0lIb3RhVzVrWlhnNklESTdYSEpjYmlBZ0lDQWdJSFJ2Y0RvZ05UQWxPMXh5WEc0Z0lDQWdJQ0JzWldaME9pQTFNQ1U3WEhKY2JpQWdJQ0FnSUhSeVlXNXpabTl5YlRvZ2RISmhibk5zWVhSbEtDMDFNQ1VzSUMwMU1DVXBPMXh5WEc0Z0lDQWdmVnh5WEc1Y2NseHVJQ0FnSUNZNmFHOTJaWElnZTF4eVhHNGdJQ0FnSUNCamIyeHZjam9nUUhSb2FYSmtYM1JsZUhSZlkyOXNiM0k3WEhKY2JpQWdJQ0I5WEhKY2JpQWdmVnh5WEc1Y2NseHVJQ0FtWDJsdVptOGdlMXh5WEc0Z0lDQWdMbTkxZEd4cGJtVXRiV1Z6YzJGblpWOWZhV052YmlCN1hISmNiaUFnSUNBZ0lHSmhZMnRuY205MWJtUXRZMjlzYjNJNklFQndjbWx0WVhKNVgyTnZiRzl5TzF4eVhHNGdJQ0FnZlZ4eVhHNGdJSDFjY2x4dVhISmNiaUFnSmw5M1lYSnVhVzVuSUh0Y2NseHVJQ0FnSUM1dmRYUnNhVzVsTFcxbGMzTmhaMlZmWDJsamIyNGdlMXh5WEc0Z0lDQWdJQ0JpWVdOclozSnZkVzVrTFdOdmJHOXlPaUJBZDJGeWJtbHVaMTlqYjJ4dmNqdGNjbHh1SUNBZ0lIMWNjbHh1SUNCOVhISmNibHh5WEc0Z0lDWmZjM1ZqWTJWemN5QjdYSEpjYmlBZ0lDQXViM1YwYkdsdVpTMXRaWE56WVdkbFgxOXBZMjl1SUh0Y2NseHVJQ0FnSUNBZ1ltRmphMmR5YjNWdVpDMWpiMnh2Y2pvZ1FITjFZMk5sYzNOZlkyOXNiM0k3WEhKY2JpQWdJQ0I5WEhKY2JpQWdmVnh5WEc1Y2NseHVJQ0FtWDJWeWNtOXlJSHRjY2x4dUlDQWdJQzV2ZFhSc2FXNWxMVzFsYzNOaFoyVmZYMmxqYjI0Z2UxeHlYRzRnSUNBZ0lDQmlZV05yWjNKdmRXNWtMV052Ykc5eU9pQkFaR0Z1WjJWeVgyTnZiRzl5TzF4eVhHNGdJQ0FnZlZ4eVhHNGdJSDFjY2x4dVhISmNiaUFnSmw5d2JHRnBiaUI3WEhKY2JpQWdJQ0J0YVc0dGQybGtkR2c2SURFNU1IQjRPMXh5WEc0Z0lDQWdjR0ZrWkdsdVp6b2dNQ0ExTUhCNElEQWdNVFZ3ZUR0Y2NseHVYSEpjYmlBZ0lDQW1MbTkxZEd4cGJtVXRiV1Z6YzJGblpTQjdYSEpjYmlBZ0lDQWdJQ1pmYVc1bWJ5QjdYSEpjYmlBZ0lDQWdJQ0FnWW05eVpHVnlMV3hsWm5RNklEVndlQ0J6YjJ4cFpDQkFjSEpwYldGeWVWOWpiMnh2Y2p0Y2NseHVJQ0FnSUNBZ0lDQmlZV05yWjNKdmRXNWtMV052Ykc5eU9pQkFhVzVtYjE5MGFYQmZZbWRmWTI5c2IzSTdYSEpjYmlBZ0lDQWdJSDFjY2x4dVhISmNiaUFnSUNBZ0lDWmZkMkZ5Ym1sdVp5QjdYSEpjYmlBZ0lDQWdJQ0FnWW05eVpHVnlMV3hsWm5RNklEVndlQ0J6YjJ4cFpDQkFkMkZ5Ym1sdVoxOWpiMnh2Y2p0Y2NseHVJQ0FnSUNBZ0lDQmlZV05yWjNKdmRXNWtMV052Ykc5eU9pQkFkMkZ5Ym1sdVoxOTBhWEJmWW1kZlkyOXNiM0k3WEhKY2JpQWdJQ0FnSUgxY2NseHVYSEpjYmlBZ0lDQWdJQ1pmYzNWalkyVnpjeUI3WEhKY2JpQWdJQ0FnSUNBZ1ltOXlaR1Z5TFd4bFpuUTZJRFZ3ZUNCemIyeHBaQ0JBYzNWalkyVnpjMTlqYjJ4dmNqdGNjbHh1SUNBZ0lDQWdJQ0JpWVdOclozSnZkVzVrTFdOdmJHOXlPaUJBYzNWalkyVnpjMTkwYVhCZlltZGZZMjlzYjNJN1hISmNiaUFnSUNBZ0lIMWNjbHh1WEhKY2JpQWdJQ0FnSUNaZlpYSnliM0lnZTF4eVhHNGdJQ0FnSUNBZ0lHSnZjbVJsY2kxc1pXWjBPaUExY0hnZ2MyOXNhV1FnUUdSaGJtZGxjbDlqYjJ4dmNqdGNjbHh1SUNBZ0lDQWdJQ0JpWVdOclozSnZkVzVrTFdOdmJHOXlPaUJBWkdGdVoyVnlYM1JwY0Y5aVoxOWpiMnh2Y2p0Y2NseHVJQ0FnSUNBZ2ZWeHlYRzRnSUNBZ2ZWeHlYRzVjY2x4dUlDQWdJQzV2ZFhSc2FXNWxMVzFsYzNOaFoyVmZYMmxqYjI0Z2UxeHlYRzRnSUNBZ0lDQjNhV1IwYURvZ01EdGNjbHh1SUNBZ0lDQWdaR2x6Y0d4aGVUb2dibTl1WlR0Y2NseHVYSEpjYmlBZ0lDQWdJQzV2ZFhSc2FXNWxMV2xqYjI0Z2UxeHlYRzRnSUNBZ0lDQWdJR1JwYzNCc1lYazZJRzV2Ym1VN1hISmNiaUFnSUNBZ0lIMWNjbHh1SUNBZ0lIMWNjbHh1SUNCOVhISmNibHh5WEc0Z0lDWmZiR2xuYUhRZ2UxeHlYRzRnSUNBZ2JXbHVMWGRwWkhSb09pQXhPREJ3ZUR0Y2NseHVJQ0FnSUhCaFpHUnBibWM2SURBZ05EQndlRHRjY2x4dVhISmNiaUFnSUNBbUxtOTFkR3hwYm1VdGJXVnpjMkZuWlNCN1hISmNiaUFnSUNBZ0lDWmZhVzVtYnlCN1hISmNiaUFnSUNBZ0lDQWdMbTkxZEd4cGJtVXRiV1Z6YzJGblpWOWZhV052YmlCN1hISmNiaUFnSUNBZ0lDQWdJQ0JqYjJ4dmNqb2dRSEJ5YVcxaGNubGZZMjlzYjNJN1hISmNiaUFnSUNBZ0lDQWdmVnh5WEc0Z0lDQWdJQ0I5WEhKY2JseHlYRzRnSUNBZ0lDQW1YM2RoY201cGJtY2dlMXh5WEc0Z0lDQWdJQ0FnSUM1dmRYUnNhVzVsTFcxbGMzTmhaMlZmWDJsamIyNGdlMXh5WEc0Z0lDQWdJQ0FnSUNBZ1kyOXNiM0k2SUVCM1lYSnVhVzVuWDJOdmJHOXlPMXh5WEc0Z0lDQWdJQ0FnSUgxY2NseHVJQ0FnSUNBZ2ZWeHlYRzVjY2x4dUlDQWdJQ0FnSmw5emRXTmpaWE56SUh0Y2NseHVJQ0FnSUNBZ0lDQXViM1YwYkdsdVpTMXRaWE56WVdkbFgxOXBZMjl1SUh0Y2NseHVJQ0FnSUNBZ0lDQWdJR052Ykc5eU9pQkFjM1ZqWTJWemMxOWpiMnh2Y2p0Y2NseHVJQ0FnSUNBZ0lDQjlYSEpjYmlBZ0lDQWdJSDFjY2x4dVhISmNiaUFnSUNBZ0lDWmZaWEp5YjNJZ2UxeHlYRzRnSUNBZ0lDQWdJQzV2ZFhSc2FXNWxMVzFsYzNOaFoyVmZYMmxqYjI0Z2UxeHlYRzRnSUNBZ0lDQWdJQ0FnWTI5c2IzSTZJRUJrWVc1blpYSmZZMjlzYjNJN1hISmNiaUFnSUNBZ0lDQWdmVnh5WEc0Z0lDQWdJQ0I5WEhKY2JpQWdJQ0I5WEhKY2JseHlYRzRnSUNBZ0xtOTFkR3hwYm1VdGJXVnpjMkZuWlY5ZmFXTnZiaUI3WEhKY2JpQWdJQ0FnSUdKaFkydG5jbTkxYm1RdFkyOXNiM0k2SUVCM2FHbDBaVHRjY2x4dUlDQWdJSDFjY2x4dUlDQjlYSEpjYmx4eVhHNGdJQ1pmY205MWJtUWdlMXh5WEc0Z0lDQWdMbkpoWkdsMWN5Z3lNSEI0S1R0Y2NseHVYSEpjYmlBZ0lDQW1MbTkxZEd4cGJtVXRiV1Z6YzJGblpTQjdYSEpjYmlBZ0lDQWdJQ1pmWkdWbVlYVnNkQ0I3WEhKY2JpQWdJQ0FnSUNBZ2JXbHVMWGRwWkhSb09pQXhPREJ3ZUR0Y2NseHVJQ0FnSUNBZ0lDQndZV1JrYVc1bk9pQXdJRFF3Y0hnN1hISmNibHh5WEc0Z0lDQWdJQ0FnSUM1dmRYUnNhVzVsTFcxbGMzTmhaMlZmWDJsamIyNGdlMXh5WEc0Z0lDQWdJQ0FnSUNBZ0xuSmhaR2wxY3lneE1IQjRLVHRjY2x4dUlDQWdJQ0FnSUNBZ0lIUnZjRG9nTVRCd2VEdGNjbHh1SUNBZ0lDQWdJQ0FnSUd4bFpuUTZJREV3Y0hnN1hISmNiaUFnSUNBZ0lDQWdJQ0IzYVdSMGFEb2dNakJ3ZUR0Y2NseHVJQ0FnSUNBZ0lDQWdJR2hsYVdkb2REb2dNakJ3ZUR0Y2NseHVJQ0FnSUNBZ0lDQWdJR3hwYm1VdGFHVnBaMmgwT2lBeU1IQjRPMXh5WEc0Z0lDQWdJQ0FnSUgxY2NseHVYSEpjYmlBZ0lDQWdJQ0FnSmk1dmRYUnNhVzVsTFcxbGMzTmhaMlZmWm5Wc2JDMTNhV1IwYUNCN1hISmNiaUFnSUNBZ0lDQWdJQ0J0YVc0dGQybGtkR2c2SURJd01IQjRPMXh5WEc0Z0lDQWdJQ0FnSUNBZ2NHRmtaR2x1WnpvZ01DQXlNSEI0SURBZ05EQndlRHRjY2x4dUlDQWdJQ0FnSUNCOVhISmNiaUFnSUNBZ0lIMWNjbHh1WEhKY2JpQWdJQ0FnSUNaZmNHeGhhVzRnZTF4eVhHNGdJQ0FnSUNBZ0lHMXBiaTEzYVdSMGFEb2dNVGsxY0hnN1hISmNiaUFnSUNBZ0lDQWdjR0ZrWkdsdVp6b2dNQ0EwTUhCNElEQWdNakJ3ZUR0Y2NseHVYSEpjYmlBZ0lDQWdJQ0FnSmk1dmRYUnNhVzVsTFcxbGMzTmhaMlZmWm5Wc2JDMTNhV1IwYUNCN1hISmNiaUFnSUNBZ0lDQWdJQ0J0YVc0dGQybGtkR2c2SURJeE5YQjRPMXh5WEc0Z0lDQWdJQ0FnSUNBZ2NHRmtaR2x1WnpvZ01DQXlNSEI0TzF4eVhHNGdJQ0FnSUNBZ0lIMWNjbHh1SUNBZ0lDQWdmVnh5WEc0Z0lDQWdmVnh5WEc0Z0lIMWNjbHh1WEhKY2JpQWdKbDltZFd4c0xYZHBaSFJvSUh0Y2NseHVJQ0FnSUcxcGJpMTNhV1IwYURvZ01qQXdjSGc3WEhKY2JpQWdJQ0J3WVdSa2FXNW5PaUF3SURFd2NIZ2dNQ0ExTUhCNE8xeHlYRzVjY2x4dUlDQWdJQ1l1YjNWMGJHbHVaUzF0WlhOellXZGxJSHRjY2x4dUlDQWdJQ0FnSmw5d2JHRnBiaUI3WEhKY2JpQWdJQ0FnSUNBZ2JXbHVMWGRwWkhSb09pQXlNekJ3ZUR0Y2NseHVJQ0FnSUNBZ0lDQndZV1JrYVc1bk9pQXdJREV3Y0hnZ01DQXhOWEI0TzF4eVhHNGdJQ0FnSUNCOVhISmNibHh5WEc0Z0lDQWdJQ0FtWDJ4cFoyaDBJSHRjY2x4dUlDQWdJQ0FnSUNCdGFXNHRkMmxrZEdnNklESXhNSEI0TzF4eVhHNGdJQ0FnSUNBZ0lIQmhaR1JwYm1jNklEQWdNVEJ3ZUNBd0lEUXdjSGc3WEhKY2JpQWdJQ0FnSUgxY2NseHVJQ0FnSUgxY2NseHVJQ0I5WEhKY2JseHlYRzRnSUNaZmRtbHphV0pzWlNCN1hISmNiaUFnSUNCdmNHRmphWFI1T2lBeE8xeHlYRzRnSUgxY2NseHVYSEpjYmlBZ0psOW9hV1JrWlc0Z2UxeHlYRzRnSUNBZ1pHbHpjR3hoZVRvZ2JtOXVaVHRjY2x4dUlDQjlYSEpjYm4xY2NseHVJaXdpTHlvZ1BUMDlQVDBnVTJOeWIyeHNZbUZ5SUQwOVBUMDlJQ292WEhKY2JqbzZMWGRsWW10cGRDMXpZM0p2Ykd4aVlYSWdlMXh5WEc0Z0lIZHBaSFJvT2lBM2NIZzdYSEpjYmlBZ2FHVnBaMmgwT2lBM2NIZzdYSEpjYmlBZ0xYZGxZbXRwZEMxaWIzSmtaWEl0Y21Ga2FYVnpPaUExY0hnN1hISmNibHh5WEc0Z0lDWXRkSEpoWTJzdGNHbGxZMlVnZTF4eVhHNGdJQ0FnTFhkbFltdHBkQzFpYjNKa1pYSXRjbUZrYVhWek9pQTFjSGc3WEhKY2JpQWdmVnh5WEc1Y2NseHVJQ0FtTFhSb2RXMWlJSHRjY2x4dUlDQWdJQ1k2ZG1WeWRHbGpZV3dnZTF4eVhHNGdJQ0FnSUNCaVlXTnJaM0p2ZFc1a0xXTnZiRzl5T2lCeVoySmhLREFzSURBc0lEQXNJREF1TWpVcE8xeHlYRzRnSUNBZ0lDQXRkMlZpYTJsMExXSnZjbVJsY2kxeVlXUnBkWE02SURWd2VEdGNjbHh1SUNBZ0lIMWNjbHh1WEhKY2JpQWdJQ0FtT21odmNtbDZiMjUwWVd3Z2UxeHlYRzRnSUNBZ0lDQmlZV05yWjNKdmRXNWtMV052Ykc5eU9pQnlaMkpoS0RBc0lEQXNJREFzSURBdU1qVXBPMXh5WEc0Z0lDQWdJQ0F0ZDJWaWEybDBMV0p2Y21SbGNpMXlZV1JwZFhNNklEVndlRHRjY2x4dUlDQWdJSDFjY2x4dVhISmNiaUFnSUNBbU9taHZkbVZ5SUh0Y2NseHVJQ0FnSUNBZ1ltRmphMmR5YjNWdVpDMWpiMnh2Y2pvZ2NtZGlZU2d3TENBd0xDQXdMQ0F3TGpNMUtUdGNjbHh1SUNBZ0lIMWNjbHh1SUNCOVhISmNibHh5WEc0Z0lDWTZhRzkyWlhJZ2UxeHlYRzRnSUNBZ1ltRmphMmR5YjNWdVpDMWpiMnh2Y2pvZ2NtZGlZU2d3TENBd0xDQXdMQ0F3TGpFMUtUdGNjbHh1SUNCOVhISmNibjFjY2x4dUlsMTkgKi9cbiJdLCJmaWxlIjoiY3NzL2V4YW1wbGUubWluLmNzcyJ9 */ +.section__dd,.section__dt{display:inline-block}.case,.section__dl{z-index:1;position:relative}.case,.section__footer,.section__table{border-top:1px solid #ddd}.case:after,.outline-drawer__overlay{content:''}.article,.paper.flex{-webkit-box-orient:horizontal}.section{margin:1em 0;overflow:hidden}.section__content,.section__footer,.section__header{margin:0;padding:0 3em;overflow:hidden}.section__title{color:#666}.section__h3{color:#507afe;font-size:1.35em}.section__h4{font-size:1.1em;color:#666}.section__h5{font-size:1em;color:#999}.section__dd,.section__dl,.section__dt{margin:0;padding:0;overflow:hidden}.section__dd{color:#058942}.section__pre{margin:2em 0;font-size:14px;line-height:150%;text-align:left;border:1px solid #ddd;border-radius:4px;color:#666}.section__code{display:block;margin:0 auto;overflow:hidden}.section__footer{margin-top:3em;background-color:#fafafa;color:#999}.section__table{margin:1em auto;width:100%}.section__td,.section__th{padding:5px 16px;line-height:26px;border-bottom:1px solid #ddd}.section__th{text-align:center;background-color:#fafafa}@media (max-width:500px){.section__content,.section__header{padding:0 1em}}.case{display:grid;grid-template-columns:repeat(2,1fr);gap:40px;padding:1em;border-bottom:1px solid #ddd;overflow:hidden}.case:after{position:absolute;z-index:2;top:0;left:50%;height:100%;width:0;border-left:1px solid #ddd;overflow:hidden}.case__pre,.case__textarea{font-size:13px;line-height:150%}.case__code,.case__pre,.case__textarea{font-family:'Courier New',Consolas,Georgia,Arial,sans-serif}.case__pre{margin:0;padding:1em;background-color:#fafafa;height:100%;border-radius:4px;-webkit-box-sizing:border-box;box-sizing:border-box;overflow:auto}.case__textarea,.paper,.paper.flex .article{-webkit-box-sizing:border-box}.case__toolbar{margin:0 auto;height:36px;line-height:36px;font-size:14px;padding:0 16px;text-align:right;overflow:hidden}.case__action,.case__remove{cursor:pointer;color:#058942;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.case__action{font-size:13px;padding-left:10px}.case__action:first-child{padding-left:0}.case__remove{float:right}.case__console{margin:0 auto;height:180px;border:1px solid #ddd;overflow:hidden}.case__textarea{margin:0 auto;width:100%;height:100%;border:none;outline:0;padding:1em;box-sizing:border-box;overflow:auto}.case__list,.header{border-bottom:1px solid #ddd}.case__item,.case__list{margin:0;padding:0;list-style-type:none;overflow:hidden}.case__list{height:360px;border-top:1px solid #ddd;font-size:13px;overflow:auto}.case__item{height:36px;line-height:36px;cursor:pointer;padding:0 16px}.case__item:hover{background-color:#f7f8f9}.article__aside .outline-navigator,.header,.outline-drawer__modal,.outline-drawer__overlay,.paper{background-color:#fff}.paper{-webkit-box-shadow:0 0 6px 1px #dcdfe6;box-shadow:0 0 6px 1px #dcdfe6;margin:3em auto;max-width:1200px;padding:2em;box-sizing:border-box}.paper.flex{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;-ms-flex-wrap:nowrap;flex-wrap:nowrap;margin:0;width:100%;max-width:100%;height:100%;padding:0;overflow:hidden}.paper.flex .article{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;width:100%;box-sizing:border-box}.paper.flex .article__main{height:100%;-webkit-box-sizing:border-box;box-sizing:border-box;overflow:auto}.paper.flex .article__aside{border-right:1px solid #dcdfe6}.header{position:sticky;z-index:3;top:0;margin:0 auto;text-align:center;-webkit-transition-duration:.3s;transition-duration:.3s;overflow:hidden}.header_sticky{padding-left:260px}.article{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;-ms-flex-wrap:nowrap;flex-wrap:nowrap;padding:2em 0;font-size:16px;line-height:150%}.hidden,.outline-heading__anchor,.outline-icon_hidden{display:none}.article__main{-webkit-box-flex:1;-ms-flex:1;flex:1;padding:0 2em;overflow:hidden}.article__main .section,.article__main .section__content,.article__main .section__footer,.article__main .section__header{overflow:visible}.article__main .section__content,.article__main .section__header{margin:0}.article__aside{-ms-flex-negative:0;flex-shrink:0;width:240px;border-left:1px solid #ddd}.article__aside.ltr{border-right:1px solid #ddd;border-left:none}.outline-drawer_ltr,.utils-border-right{border-right:1px solid #dcdfe6}.section__pre,pre{padding:2em;font-family:'Courier New',Arial,sans-serif;background-color:#fafafa;overflow:auto}.section__code,code{font-family:'Courier New',Arial,sans-serif;font-size:16px}.footer{border-top:1px solid #dcdfe6;padding:3em 0;text-align:center}.footer a:hover,.footer a:link,.footer a:visited{text-decoration:none;color:#058942}.footer a:hover{text-decoration:underline}@media (max-width:500px){.paper,body,html{margin:0}.paper{padding:0}.article__main{padding:0 2em}}:root{--outline-zIndex:2000;--outline-sticky-height:100%;--outline-navigator-width:100%}.outline-icon{position:relative;z-index:1;display:inline-block;vertical-align:middle;width:1em;height:1em;overflow:hidden}.outline-icon__svg{position:absolute;z-index:2;top:50%;left:50%;width:1em;height:1em;fill:currentcolor;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%);overflow:hidden}::-webkit-scrollbar{width:7px;height:7px;-webkit-border-radius:5px}::-webkit-scrollbar-track-piece{-webkit-border-radius:5px}::-webkit-scrollbar-thumb:vertical{background-color:rgba(0,0,0,.25);-webkit-border-radius:5px}::-webkit-scrollbar-thumb:horizontal{background-color:rgba(0,0,0,.25);-webkit-border-radius:5px}::-webkit-scrollbar-thumb:hover{background-color:rgba(0,0,0,.35)}::-webkit-scrollbar:hover{background-color:rgba(0,0,0,.15)}.outline-heading{position:relative;z-index:1;overflow:hidden}.outline-heading__anchor:hover,.outline-heading__anchor:link,.outline-heading__anchor:visited{color:#999;text-decoration:none}.outline-heading__anchor:hover{color:#507afe}.outline-heading:hover .outline-heading__anchor{display:inline-block}.outline-heading_start:hover{overflow:visible}.outline-heading_start .outline-heading__anchor{position:absolute;z-index:2;top:50%;-webkit-transform:translateY(-50%);transform:translateY(-50%);left:-1em}.outline-drawer{position:relative;z-index:-1;top:0;left:0;margin:0;width:100%;height:100%;-webkit-box-sizing:border-box;box-sizing:border-box;visibility:hidden;overflow:hidden}.outline-drawer__modal{-webkit-box-shadow:0 0 6px 1px #dcdfe6;box-shadow:0 0 6px 1px #dcdfe6;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-ms-flex-wrap:nowrap;flex-wrap:nowrap;position:absolute;z-index:21;height:100%;-webkit-transition-duration:.4s;transition-duration:.4s;overflow:hidden}.outline-drawer__footer,.outline-drawer__header,.outline-drawer__main{width:100%;-webkit-box-sizing:border-box;box-sizing:border-box}.outline-drawer__footer,.outline-drawer__header{-ms-flex-negative:0;flex-shrink:0}.outline-drawer__footer,.outline-drawer__main,.outline-drawer__title{padding:0 16px}.outline-drawer__header,.outline-drawer__title{position:relative;z-index:1;margin:0 auto;height:52px;line-height:52px;overflow:hidden}.outline-drawer__title{font-size:16px;font-weight:400;margin:0 16px;-webkit-box-sizing:border-box;box-sizing:border-box;border-bottom:1px solid #dcdfe6}.outline-drawer__close{position:absolute;z-index:2;top:50%;right:12px;width:20px;height:20px;line-height:20px;color:#999;font-size:20px;text-align:center;cursor:pointer;-webkit-transform:translateY(-50%);transform:translateY(-50%);overflow:hidden}.outline-drawer__close .outline-icon{position:absolute;z-index:2;top:0;left:0}.outline-drawer__close:hover{color:#666}.outline-drawer__main{-webkit-box-flex:1;-ms-flex:1;flex:1;overflow:auto}.outline-drawer__main.overflow-hidden{overflow:hidden}.outline-drawer__footer{margin:0 auto;text-align:right;overflow:hidden}.outline-drawer__overlay{position:relative;z-index:1;top:0;left:0;width:100%;height:100%;opacity:.1;overflow:hidden}.outline-drawer_ltr.outline-drawer_tiny,.outline-drawer_rtl.outline-drawer_tiny{width:280px}.outline-drawer_ltr.outline-drawer_mini,.outline-drawer_rtl.outline-drawer_mini{width:480px}.outline-drawer_ltr.outline-drawer_small,.outline-drawer_rtl.outline-drawer_small{width:540px}.outline-drawer_ltr.outline-drawer_regular,.outline-drawer_rtl.outline-drawer_regular{width:680px}.outline-drawer_ltr.outline-drawer_medium,.outline-drawer_rtl.outline-drawer_medium{width:720px}.outline-drawer_ltr.outline-drawer_large,.outline-drawer_rtl.outline-drawer_large{width:960px}.outline-drawer_rtl{border-left:1px solid #dcdfe6}.outline-drawer_rtl.outline-drawer_tiny.outline-drawer_closed{right:-290px}.outline-drawer_rtl.outline-drawer_mini.outline-drawer_closed{right:-490px}.outline-drawer_rtl.outline-drawer_small.outline-drawer_closed{right:-550px}.outline-drawer_rtl.outline-drawer_regular.outline-drawer_closed{right:-690px}.outline-drawer_rtl.outline-drawer_medium.outline-drawer_closed{right:-730px}.outline-drawer_rtl.outline-drawer_large.outline-drawer_closed{right:-970px}.outline-drawer_ltr.outline-drawer_tiny.outline-drawer_closed{left:-290px}.outline-drawer_ltr.outline-drawer_mini.outline-drawer_closed{left:-490px}.outline-drawer_ltr.outline-drawer_small.outline-drawer_closed{left:-550px}.outline-drawer_ltr.outline-drawer_regular.outline-drawer_closed{left:-690px}.outline-drawer_ltr.outline-drawer_medium.outline-drawer_closed{left:-730px}.outline-drawer_ltr.outline-drawer_large.outline-drawer_closed{left:-970px}.outline-drawer_btt,.outline-drawer_ttb{left:0;width:100%}.outline-drawer_btt.outline-drawer_tiny,.outline-drawer_ttb.outline-drawer_tiny{height:240px}.outline-drawer_btt.outline-drawer_mini,.outline-drawer_ttb.outline-drawer_mini{height:320px}.outline-drawer_btt.outline-drawer_small,.outline-drawer_ttb.outline-drawer_small{height:360px}.outline-drawer_btt.outline-drawer_regular,.outline-drawer_ttb.outline-drawer_regular{height:400px}.outline-drawer_btt.outline-drawer_medium,.outline-drawer_ttb.outline-drawer_medium{height:440px}.outline-drawer_btt.outline-drawer_large,.outline-drawer_ttb.outline-drawer_large{height:480px}.outline-drawer_ttb{border-bottom:1px solid #dcdfe6}.outline-drawer_ttb.outline-drawer_tiny.outline-drawer_closed{top:-250px}.outline-drawer_ttb.outline-drawer_mini.outline-drawer_closed{top:-330px}.outline-drawer_ttb.outline-drawer_small.outline-drawer_closed{top:-370px}.outline-drawer_ttb.outline-drawer_regular.outline-drawer_closed{top:-410px}.outline-drawer_ttb.outline-drawer_medium.outline-drawer_closed{top:-450px}.outline-drawer_ttb.outline-drawer_large.outline-drawer_closed{top:-490px}.outline-drawer_btt{top:initial;border-top:1px solid #dcdfe6}.outline-drawer_btt.outline-drawer_tiny.outline-drawer_closed{bottom:-250px}.outline-drawer_btt.outline-drawer_mini.outline-drawer_closed{bottom:-330px}.outline-drawer_btt.outline-drawer_small.outline-drawer_closed{bottom:-370px}.outline-drawer_btt.outline-drawer_regular.outline-drawer_closed{bottom:-410px}.outline-drawer_btt.outline-drawer_medium.outline-drawer_closed{bottom:-450px}.outline-drawer_btt.outline-drawer_large.outline-drawer_closed{bottom:-490px}.outline-drawer_opened{visibility:visible;z-index:var(--outline-zIndex)}.outline-drawer_opened.outline-drawer{position:fixed}.outline-drawer_opened.outline-drawer_rtl{right:0}.outline-drawer_opened.outline-drawer_ltr{left:0}.outline-drawer_opened.outline-drawer_ttb{top:0}.outline-drawer_opened.outline-drawer_btt{bottom:0}.outline-drawer_offset.outline-drawer_ltr,.outline-drawer_offset.outline-drawer_rtl{height:calc(100% - 4em);top:50%;-webkit-transform:translateY(-50%);transform:translateY(-50%)}.outline-drawer_offset.outline-drawer_btt,.outline-drawer_offset.outline-drawer_ttb{width:calc(100% - 4em);left:50%;-webkit-transform:translateX(-50%);transform:translateX(-50%)}.outline-drawer_offset.outline-drawer_opened.outline-drawer_rtl{right:2em}.outline-drawer_offset.outline-drawer_opened.outline-drawer_ltr{left:2em}.outline-drawer_offset.outline-drawer_opened.outline-drawer_ttb{top:2em}.outline-drawer_offset.outline-drawer_opened.outline-drawer_btt{bottom:2em}.outline-drawer_auto.outline-drawer_ltr,.outline-drawer_auto.outline-drawer_rtl{height:auto;max-height:calc(100% - 4em)}.outline-drawer_full{padding:0}.outline-navigator{position:relative;z-index:1;margin:0;width:var(--outline-navigator-width);overflow:auto}.outline-navigator-parent{-webkit-transition:.3s ease-in-out;transition:.3s ease-in-out}.outline-navigator__title{margin:0 16px;height:40px;line-height:40px;padding:0 16px;border-bottom:1px solid #dcdfe6;font-size:16px;font-weight:400;overflow:hidden}.outline-navigator__main{position:relative;z-index:1;margin:0;overflow:hidden}.outline-navigator__item,.outline-navigator__list,.outline-navigator__subject{position:relative;z-index:2;margin:0;padding:0;list-style-type:none;overflow:hidden}.outline-navigator__list{padding:.5em 0}.outline-navigator__subject{padding-left:1em}.outline-navigator__item{margin:0;line-height:30px;font-size:13px;overflow:hidden}.outline-navigator__placeholder{position:absolute;z-index:1;top:0;left:0;width:100%;height:30px;background-color:#f7f8f9;border-left:2px solid #058942;-webkit-transition-duration:.2s;transition-duration:.2s;-webkit-box-sizing:border-box;box-sizing:border-box;overflow:hidden}.outline-navigator__anchor{white-space:nowrap;text-overflow:ellipsis;overflow:hidden;display:block;padding:0 1.5em}.outline-navigator__anchor:hover,.outline-navigator__anchor:link,.outline-navigator__anchor:visited{text-decoration:none;color:#555}.outline-navigator__anchor:hover{color:#058942}.outline-navigator__code{padding-right:.5em}.outline-navigator_highlight.outline-navigator__anchor:hover,.outline-navigator_highlight.outline-navigator__anchor:link,.outline-navigator_highlight.outline-navigator__anchor:visited{color:#058942;font-weight:700}.outline-navigator_fixed,.outline-navigator_sticky{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;z-index:var(--outline-zIndex);top:0;overflow:hidden}.outline-navigator_hidden,.outline-reader__article .outline-reader__progress,.outline-reader_hidden{display:none}.outline-navigator_fixed .outline-navigator__main,.outline-navigator_fixed .outline-navigator__title,.outline-navigator_sticky .outline-navigator__main,.outline-navigator_sticky .outline-navigator__title{-webkit-box-sizing:border-box;box-sizing:border-box}.outline-navigator_fixed .outline-navigator__title,.outline-navigator_sticky .outline-navigator__title{-ms-flex-negative:0;flex-shrink:0}.outline-navigator_fixed .outline-navigator__main,.outline-navigator_sticky .outline-navigator__main{-webkit-box-flex:1;-ms-flex:1;flex:1;overflow:auto}.outline-navigator_sticky{position:sticky;max-height:var(--outline-sticky-height)}.outline-navigator_fixed{position:fixed;max-height:100%}.outline-navigator_folded{width:0;overflow:hidden}.outline-reader__progress{position:fixed;top:0;left:0;z-index:3;height:4px;width:100%;background-color:#507afe;scale:0 1;-webkit-transform-origin:left;transform-origin:left;-webkit-animation:outline-reader-progress linear;animation:outline-reader-progress linear;animation-timeline:--ProgressTimeline}.outline-reader__paper{-webkit-box-shadow:0 0 6px 1px #ddd;box-shadow:0 0 6px 1px #ddd;margin:2em auto;max-width:1200px;padding:3.2em;-webkit-box-sizing:border-box;box-sizing:border-box;background-color:#fff;overflow:hidden}.outline-reader__title{margin:.67em 0;text-align:center;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI','PingFang SC','Hiragino Sans GB','Microsoft YaHei','Helvetica Neue','Apple Color Emoji','Segoe UI Emoji','Segoe UI Symbol',Helvetica,Arial,sans-serif;font-weight:400;line-height:1.3em;font-size:4.2em;overflow:hidden}.outline-reader_hidden.outline-reader_sibling{display:none!important}.outline-reader_hidden.outline-reader_sibling.wrapper.post{display:none}.outline-reader--reading{display:block;position:fixed;z-index:2;top:0;left:0;width:100%;height:100%;margin:0;-webkit-box-sizing:border-box;box-sizing:border-box;padding:3em 4em;background-color:#fafafa;scroll-timeline-name:--ProgressTimeline;overflow:scroll}@-webkit-keyframes outline-reader-progress{to{scale:1 1}}@keyframes outline-reader-progress{to{scale:1 1}}@media (max-width:500px){.outline-reader{overflow:hidden}.outline-reader .outline-toolbar{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-ms-flex-item-align:auto;align-self:auto;top:100%;right:0;-webkit-transform:translateY(-48px);transform:translateY(-48px);width:100%;height:48px;-webkit-box-sizing:border-box;box-sizing:border-box;border-top:1px solid #ddd;background-color:#fff;padding:0 16px}.outline-reader .outline-toolbar__button{border-radius:0;-webkit-box-flex:1;-ms-flex:1;flex:1;border:none;-webkit-box-shadow:none;box-shadow:none}.outline-reader--reading{padding:0;background-color:#fff;-webkit-box-sizing:border-box;box-sizing:border-box}.outline-reader__paper{position:relative;z-index:1;margin:0;padding:0;height:100%;-webkit-box-shadow:none;box-shadow:none;overflow:hidden}.outline-reader__title{white-space:nowrap;text-overflow:ellipsis;position:absolute;z-index:3;top:0;left:0;margin:0;width:100%;height:48px;line-height:48px;border-bottom:1px solid #ddd;font-size:1.8em;font-weight:400;background-color:#fff;overflow:hidden}.outline-reader__article{margin:48px 0;height:calc(100% - 96px);padding:0 1.25em;scroll-timeline-name:--MobileProgressTimeline;overflow-x:hidden;overflow-y:scroll}.outline-reader__article .outline-reader__progress{z-index:4;-webkit-animation:outline-reader-progress linear;animation:outline-reader-progress linear;animation-timeline:--MobileProgressTimeline;display:block}}@media print{body,html{font-size:12pt;background-color:#fff;color:#333;height:initial!important}a:hover,a:link,a:visited{text-decoration:underline!important;color:#507afe}.outline-message,.outline-toolbar,audio,video{display:none!important}table{width:100%;border-collapse:collapse}td,th{border:1px solid #dcdfe6;padding:8px 20px}.outline-reader{display:block!important;overflow:hidden}.outline-reader__progress,.outline-reader_sibling{display:none!important}.outline-reader__title{margin:13.4pt 0 28pt!important;text-align:center!important;font-size:32pt!important}.outline-reader--reading{position:relative!important;height:auto!important;padding:0!important;background-color:#fff;overflow:hidden!important}.outline-reader__paper{-webkit-box-shadow:none;box-shadow:none}.outline-reader pre{padding:1em!important;border:1px solid #ddd!important;border-radius:4px!important}.outline-reader code,.outline-reader pre{background-color:#fff!important}.outline-reader img,.outline-reader svg,.outline-reader table{-webkit-column-break-inside:avoid;-moz-column-break-inside:avoid;break-inside:avoid}}.outline-toolbar{position:fixed;z-index:99999;margin:0;-webkit-transition-duration:.3s;transition-duration:.3s;overflow:hidden}.outline-toolbar__button{-webkit-box-shadow:0 0 6px 1px #dcdfe6;box-shadow:0 0 6px 1px #dcdfe6;position:relative;z-index:1;margin:10px;width:36px;height:36px;border:1px solid #dcdfe6;border-radius:3px;-webkit-box-sizing:border-box;box-sizing:border-box;background-color:#fff;cursor:pointer;text-align:center;color:#999;-webkit-transition:all .3s .1s ease-in-out;transition:all .3s .1s ease-in-out;overflow:hidden}.outline-toolbar__button:hover{color:#058942;border-color:#058942;-webkit-transform:scale(1.35);transform:scale(1.35)}.outline-toolbar__button.hide{display:none}.outline-toolbar__anchor:hover,.outline-toolbar__anchor:link,.outline-toolbar__anchor:visited{color:#999;text-decoration:none}.outline-toolbar__anchor:hover{color:#058942}.outline-toolbar__icon{position:absolute;z-index:2;top:50%;left:50%;width:20px;height:20px;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%);fill:currentcolor;overflow:hidden}.outline-toolbar_active.outline-toolbar__button{color:#fff;background-color:#058942;border-color:#058942}.outline-toolbar_active .outline-toolbar__anchor:hover,.outline-toolbar_active .outline-toolbar__anchor:link,.outline-toolbar_active .outline-toolbar__anchor:visited,.outline-toolbar_active.outline-toolbar__button:hover{color:#fff}.outline-toolbar_rounded.outline-toolbar__button{border-radius:18px}.outline-toolbar_disabled .outline-toolbar__anchor:hover,.outline-toolbar_disabled .outline-toolbar__anchor:link,.outline-toolbar_disabled .outline-toolbar__anchor:visited,.outline-toolbar_disabled .outline-toolbar__button,.outline-toolbar_disabled.outline-toolbar__anchor:hover,.outline-toolbar_disabled.outline-toolbar__anchor:link,.outline-toolbar_disabled.outline-toolbar__anchor:visited,.outline-toolbar_disabled.outline-toolbar__button{cursor:not-allowed;color:#999;border-color:#999}.outline-toolbar_disabled .outline-toolbar__anchor:hover:hover,.outline-toolbar_disabled .outline-toolbar__anchor:link:hover,.outline-toolbar_disabled .outline-toolbar__anchor:visited:hover,.outline-toolbar_disabled .outline-toolbar__button:hover,.outline-toolbar_disabled.outline-toolbar__anchor:hover:hover,.outline-toolbar_disabled.outline-toolbar__anchor:link:hover,.outline-toolbar_disabled.outline-toolbar__anchor:visited:hover,.outline-toolbar_disabled.outline-toolbar__button:hover{color:#999;border-color:#999}.outline-toolbar_disabled .outline-toolbar__button,.outline-toolbar_disabled.outline-toolbar__button{background-color:#f5f5f5}.outline-toolbar_btt,.outline-toolbar_ttb{left:50%;-webkit-transform:translateX(-50%);transform:translateX(-50%)}.outline-toolbar_btt .outline-toolbar__button,.outline-toolbar_ttb .outline-toolbar__button{display:inline-block}.outline-toolbar_ttb{top:12px}.outline-toolbar_ttb.outline-toolbar_hidden{top:-56px}.outline-toolbar_btt{bottom:12px}.outline-toolbar_btt.outline-toolbar_hidden{bottom:-56px}.outline-toolbar_ltr,.outline-toolbar_rtl{-webkit-transform:translateY(-50%);transform:translateY(-50%);width:56px}.outline-toolbar_rtl{top:50%;right:12px}.outline-toolbar_rtl.outline-toolbar_hidden{right:-86px}.outline-toolbar_ltr{top:50%;left:12px}.outline-toolbar_ltr.outline-toolbar_hidden{left:-86px}.outline-toolbar_btt .outline-toolbar__button.outline-toolbar_hidden,.outline-toolbar_ltr .outline-toolbar__button.outline-toolbar_hidden,.outline-toolbar_rtl .outline-toolbar__button.outline-toolbar_hidden,.outline-toolbar_ttb .outline-toolbar__button.outline-toolbar_hidden{display:none} +/*# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlcyI6WyJjc3MvZXhhbXBsZS5jc3MiXSwic291cmNlc0NvbnRlbnQiOlsiLyogPT09PT0gU2Nyb2xsYmFyID09PT09ICovXG46Oi13ZWJraXQtc2Nyb2xsYmFyIHtcbiAgd2lkdGg6IDdweDtcbiAgaGVpZ2h0OiA3cHg7XG4gIC13ZWJraXQtYm9yZGVyLXJhZGl1czogNXB4O1xufVxuOjotd2Via2l0LXNjcm9sbGJhci10cmFjay1waWVjZSB7XG4gIC13ZWJraXQtYm9yZGVyLXJhZGl1czogNXB4O1xufVxuOjotd2Via2l0LXNjcm9sbGJhci10aHVtYjp2ZXJ0aWNhbCB7XG4gIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMCwgMCwgMCwgMC4yNSk7XG4gIC13ZWJraXQtYm9yZGVyLXJhZGl1czogNXB4O1xufVxuOjotd2Via2l0LXNjcm9sbGJhci10aHVtYjpob3Jpem9udGFsIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjI1KTtcbiAgLXdlYmtpdC1ib3JkZXItcmFkaXVzOiA1cHg7XG59XG46Oi13ZWJraXQtc2Nyb2xsYmFyOmhvdmVyIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjE1KTtcbn1cbjo6LXdlYmtpdC1zY3JvbGxiYXItdGh1bWI6aG92ZXIge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuMzUpO1xufVxuLnNlY3Rpb24ge1xuICBtYXJnaW46IDFlbSAwO1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLnNlY3Rpb25fX2hlYWRlcixcbi5zZWN0aW9uX19jb250ZW50LFxuLnNlY3Rpb25fX2Zvb3RlciB7XG4gIG1hcmdpbjogMDtcbiAgcGFkZGluZzogMCAzZW07XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4uc2VjdGlvbl9fdGl0bGUge1xuICBjb2xvcjogIzY2Njtcbn1cbi5zZWN0aW9uX19oMyB7XG4gIGNvbG9yOiAjNTA3YWZlO1xuICBmb250LXNpemU6IDEuMzVlbTtcbn1cbi5zZWN0aW9uX19oNCB7XG4gIGZvbnQtc2l6ZTogMS4xZW07XG4gIGNvbG9yOiAjNjY2O1xufVxuLnNlY3Rpb25fX2g1IHtcbiAgZm9udC1zaXplOiAxZW07XG4gIGNvbG9yOiAjOTk5O1xufVxuLnNlY3Rpb25fX2RsLFxuLnNlY3Rpb25fX2R0LFxuLnNlY3Rpb25fX2RkIHtcbiAgbWFyZ2luOiAwO1xuICBwYWRkaW5nOiAwO1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLnNlY3Rpb25fX2RsIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICB6LWluZGV4OiAxO1xufVxuLnNlY3Rpb25fX2R0IHtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xufVxuLnNlY3Rpb25fX2RkIHtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICBjb2xvcjogIzA1ODk0Mjtcbn1cbi5zZWN0aW9uX19wcmUge1xuICBtYXJnaW46IDJlbSAwO1xuICBwYWRkaW5nOiAxZW07XG4gIGZvbnQtc2l6ZTogMTRweDtcbiAgbGluZS1oZWlnaHQ6IDE1MCU7XG4gIHRleHQtYWxpZ246IGxlZnQ7XG4gIGJhY2tncm91bmQtY29sb3I6ICNmYWZhZmE7XG4gIGJvcmRlcjogMXB4IHNvbGlkICNkZGQ7XG4gIGJvcmRlci1yYWRpdXM6IDRweDtcbiAgY29sb3I6ICM2NjY7XG4gIG92ZXJmbG93OiBhdXRvO1xufVxuLnNlY3Rpb25fX2NvZGUge1xuICBkaXNwbGF5OiBibG9jaztcbiAgbWFyZ2luOiAwIGF1dG87XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4uc2VjdGlvbl9fZm9vdGVyIHtcbiAgYm9yZGVyLXRvcDogMXB4IHNvbGlkICNkZGQ7XG4gIG1hcmdpbi10b3A6IDNlbTtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ZhZmFmYTtcbiAgY29sb3I6ICM5OTk7XG59XG4uc2VjdGlvbl9fdGFibGUge1xuICBtYXJnaW46IDFlbSBhdXRvO1xuICB3aWR0aDogMTAwJTtcbiAgYm9yZGVyLXRvcDogMXB4IHNvbGlkICNkZGQ7XG59XG4uc2VjdGlvbl9fdGgsXG4uc2VjdGlvbl9fdGQge1xuICBwYWRkaW5nOiA1cHggMTZweDtcbiAgbGluZS1oZWlnaHQ6IDI2cHg7XG4gIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjZGRkO1xufVxuLnNlY3Rpb25fX3RoIHtcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmFmYWZhO1xufVxuQG1lZGlhIChtYXgtd2lkdGg6IDUwMHB4KSB7XG4gIC5zZWN0aW9uX19oZWFkZXIsXG4gIC5zZWN0aW9uX19jb250ZW50IHtcbiAgICBwYWRkaW5nOiAwIDFlbTtcbiAgfVxufVxuLmNhc2Uge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIHotaW5kZXg6IDE7XG4gIGRpc3BsYXk6IGdyaWQ7XG4gIGdyaWQtdGVtcGxhdGUtY29sdW1uczogcmVwZWF0KDIsIDFmcik7XG4gIGdhcDogNDBweDtcbiAgcGFkZGluZzogMWVtO1xuICBib3JkZXItdG9wOiAxcHggc29saWQgI2RkZDtcbiAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNkZGQ7XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4uY2FzZTphZnRlciB7XG4gIGNvbnRlbnQ6ICcnO1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHotaW5kZXg6IDI7XG4gIHRvcDogMDtcbiAgbGVmdDogNTAlO1xuICBoZWlnaHQ6IDEwMCU7XG4gIHdpZHRoOiAwO1xuICBib3JkZXItbGVmdDogMXB4IHNvbGlkICNkZGQ7XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4uY2FzZV9fcHJlLFxuLmNhc2VfX3RleHRhcmVhIHtcbiAgZm9udC1zaXplOiAxM3B4O1xuICBsaW5lLWhlaWdodDogMTUwJTtcbn1cbi5jYXNlX19wcmUsXG4uY2FzZV9fY29kZSxcbi5jYXNlX190ZXh0YXJlYSB7XG4gIGZvbnQtZmFtaWx5OiAnQ291cmllciBOZXcnLCBDb25zb2xhcywgR2VvcmdpYSwgQXJpYWwsIHNhbnMtc2VyaWY7XG59XG4uY2FzZV9fcHJlIHtcbiAgbWFyZ2luOiAwO1xuICBwYWRkaW5nOiAxZW07XG4gIGJhY2tncm91bmQtY29sb3I6ICNmYWZhZmE7XG4gIGhlaWdodDogMTAwJTtcbiAgYm9yZGVyLXJhZGl1czogNHB4O1xuICAtd2Via2l0LWJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgb3ZlcmZsb3c6IGF1dG87XG59XG4uY2FzZV9fdG9vbGJhciB7XG4gIG1hcmdpbjogMCBhdXRvO1xuICBoZWlnaHQ6IDM2cHg7XG4gIGxpbmUtaGVpZ2h0OiAzNnB4O1xuICBmb250LXNpemU6IDE0cHg7XG4gIHBhZGRpbmc6IDAgMTZweDtcbiAgdGV4dC1hbGlnbjogcmlnaHQ7XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4uY2FzZV9fYWN0aW9uLFxuLmNhc2VfX3JlbW92ZSB7XG4gIGN1cnNvcjogcG9pbnRlcjtcbiAgY29sb3I6ICMwNTg5NDI7XG4gIC13ZWJraXQtdXNlci1zZWxlY3Q6IG5vbmU7XG4gICAgIC1tb3otdXNlci1zZWxlY3Q6IG5vbmU7XG4gICAgICAtbXMtdXNlci1zZWxlY3Q6IG5vbmU7XG4gICAgICAgICAgdXNlci1zZWxlY3Q6IG5vbmU7XG59XG4uY2FzZV9fYWN0aW9uIHtcbiAgZm9udC1zaXplOiAxM3B4O1xuICBwYWRkaW5nLWxlZnQ6IDEwcHg7XG59XG4uY2FzZV9fYWN0aW9uOmZpcnN0LWNoaWxkIHtcbiAgcGFkZGluZy1sZWZ0OiAwO1xufVxuLmNhc2VfX3JlbW92ZSB7XG4gIGZsb2F0OiByaWdodDtcbn1cbi5jYXNlX19jb25zb2xlIHtcbiAgbWFyZ2luOiAwIGF1dG87XG4gIGhlaWdodDogMTgwcHg7XG4gIGJvcmRlcjogMXB4IHNvbGlkICNkZGQ7XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4uY2FzZV9fdGV4dGFyZWEge1xuICBtYXJnaW46IDAgYXV0bztcbiAgd2lkdGg6IDEwMCU7XG4gIGhlaWdodDogMTAwJTtcbiAgYm9yZGVyOiBub25lO1xuICBvdXRsaW5lOiBub25lO1xuICBwYWRkaW5nOiAxZW07XG4gIC13ZWJraXQtYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICBvdmVyZmxvdzogYXV0bztcbn1cbi5jYXNlX19saXN0LFxuLmNhc2VfX2l0ZW0ge1xuICBtYXJnaW46IDA7XG4gIHBhZGRpbmc6IDA7XG4gIGxpc3Qtc3R5bGUtdHlwZTogbm9uZTtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi5jYXNlX19saXN0IHtcbiAgaGVpZ2h0OiAzNjBweDtcbiAgYm9yZGVyLXRvcDogMXB4IHNvbGlkICNkZGQ7XG4gIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjZGRkO1xuICBmb250LXNpemU6IDEzcHg7XG4gIG92ZXJmbG93OiBhdXRvO1xufVxuLmNhc2VfX2l0ZW0ge1xuICBoZWlnaHQ6IDM2cHg7XG4gIGxpbmUtaGVpZ2h0OiAzNnB4O1xuICBjdXJzb3I6IHBvaW50ZXI7XG4gIHBhZGRpbmc6IDAgMTZweDtcbn1cbi5jYXNlX19pdGVtOmhvdmVyIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2Y3ZjhmOTtcbn1cbi8qKlxuICogbWl4aW5zLmxlc3MgLSDlt6Xlhbflh73mlbBcbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIENyZWF0ZWQgQnk6IFlhb2hhaXhpYW9cbiAqIFVwZGF0ZTogMjAyMi4zLjExXG4gKi9cbi8qKlxuICogcmFkaXVzLmxlc3MgLSDlnIbop5Lorr7nva4gbWl4aW54IOWHveaVsFxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogQ3JlYXRlZCBCeTogWWFvaGFpeGlhb1xuICogVXBkYXRlOiAyMDI0LjQuMTZcbiAqL1xuLyogPT09PT09IOWchuinkuagt+W8j+iuvue9ruWHveaVsCA9PT09PT0gKi9cbi5wYXBlciB7XG4gIC13ZWJraXQtYm94LXNoYWRvdzogMCAwIDZweCAxcHggI2RjZGZlNjtcbiAgICAgICAgICBib3gtc2hhZG93OiAwIDAgNnB4IDFweCAjZGNkZmU2O1xuICBtYXJnaW46IDNlbSBhdXRvO1xuICBtYXgtd2lkdGg6IDEyMDBweDtcbiAgcGFkZGluZzogMmVtO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmO1xuICAtd2Via2l0LWJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbn1cbi5wYXBlci5mbGV4IHtcbiAgZGlzcGxheTogLXdlYmtpdC1ib3g7XG4gIGRpc3BsYXk6IC1tcy1mbGV4Ym94O1xuICBkaXNwbGF5OiBmbGV4O1xuICAtd2Via2l0LWJveC1vcmllbnQ6IGhvcml6b250YWw7XG4gIC13ZWJraXQtYm94LWRpcmVjdGlvbjogbm9ybWFsO1xuICAgICAgLW1zLWZsZXgtZGlyZWN0aW9uOiByb3c7XG4gICAgICAgICAgZmxleC1kaXJlY3Rpb246IHJvdztcbiAgLW1zLWZsZXgtd3JhcDogbm93cmFwO1xuICAgICAgZmxleC13cmFwOiBub3dyYXA7XG4gIG1hcmdpbjogMDtcbiAgd2lkdGg6IDEwMCU7XG4gIG1heC13aWR0aDogMTAwJTtcbiAgaGVpZ2h0OiAxMDAlO1xuICBwYWRkaW5nOiAwO1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLnBhcGVyLmZsZXggLmFydGljbGUge1xuICAtd2Via2l0LWJveC1vcmllbnQ6IHZlcnRpY2FsO1xuICAtd2Via2l0LWJveC1kaXJlY3Rpb246IG5vcm1hbDtcbiAgICAgIC1tcy1mbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gIHdpZHRoOiAxMDAlO1xuICAtd2Via2l0LWJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbn1cbi5wYXBlci5mbGV4IC5hcnRpY2xlX19tYWluIHtcbiAgaGVpZ2h0OiAxMDAlO1xuICAtd2Via2l0LWJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgb3ZlcmZsb3c6IGF1dG87XG59XG4ucGFwZXIuZmxleCAuYXJ0aWNsZV9fYXNpZGUge1xuICBib3JkZXItcmlnaHQ6IDFweCBzb2xpZCAjZGNkZmU2O1xufVxuLmhlYWRlciB7XG4gIHBvc2l0aW9uOiBzdGlja3k7XG4gIHotaW5kZXg6IDM7XG4gIHRvcDogMDtcbiAgbWFyZ2luOiAwIGF1dG87XG4gIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjZGRkO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmO1xuICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gIC13ZWJraXQtdHJhbnNpdGlvbi1kdXJhdGlvbjogMC4zcztcbiAgICAgICAgICB0cmFuc2l0aW9uLWR1cmF0aW9uOiAwLjNzO1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLmhlYWRlcl9zdGlja3kge1xuICBwYWRkaW5nLWxlZnQ6IDI2MHB4O1xufVxuLmFydGljbGUge1xuICBkaXNwbGF5OiAtd2Via2l0LWJveDtcbiAgZGlzcGxheTogLW1zLWZsZXhib3g7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIC13ZWJraXQtYm94LW9yaWVudDogaG9yaXpvbnRhbDtcbiAgLXdlYmtpdC1ib3gtZGlyZWN0aW9uOiBub3JtYWw7XG4gICAgICAtbXMtZmxleC1kaXJlY3Rpb246IHJvdztcbiAgICAgICAgICBmbGV4LWRpcmVjdGlvbjogcm93O1xuICAtbXMtZmxleC13cmFwOiBub3dyYXA7XG4gICAgICBmbGV4LXdyYXA6IG5vd3JhcDtcbiAgcGFkZGluZzogMmVtIDA7XG4gIGZvbnQtc2l6ZTogMTZweDtcbiAgbGluZS1oZWlnaHQ6IDE1MCU7XG59XG4uYXJ0aWNsZV9fbWFpbiB7XG4gIC13ZWJraXQtYm94LWZsZXg6IDE7XG4gICAgICAtbXMtZmxleDogMTtcbiAgICAgICAgICBmbGV4OiAxO1xuICBwYWRkaW5nOiAwIDJlbTtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi5hcnRpY2xlX19tYWluIC5zZWN0aW9uIHtcbiAgb3ZlcmZsb3c6IHZpc2libGU7XG59XG4uYXJ0aWNsZV9fbWFpbiAuc2VjdGlvbl9fY29udGVudCxcbi5hcnRpY2xlX19tYWluIC5zZWN0aW9uX19mb290ZXIsXG4uYXJ0aWNsZV9fbWFpbiAuc2VjdGlvbl9faGVhZGVyIHtcbiAgb3ZlcmZsb3c6IHZpc2libGU7XG59XG4uYXJ0aWNsZV9fbWFpbiAuc2VjdGlvbl9faGVhZGVyLFxuLmFydGljbGVfX21haW4gLnNlY3Rpb25fX2NvbnRlbnQge1xuICBtYXJnaW46IDA7XG59XG4uYXJ0aWNsZV9fYXNpZGUge1xuICAtbXMtZmxleC1uZWdhdGl2ZTogMDtcbiAgICAgIGZsZXgtc2hyaW5rOiAwO1xuICB3aWR0aDogMjQwcHg7XG4gIGJvcmRlci1sZWZ0OiAxcHggc29saWQgI2RkZDtcbn1cbi5hcnRpY2xlX19hc2lkZS5sdHIge1xuICBib3JkZXItcmlnaHQ6IDFweCBzb2xpZCAjZGRkO1xuICBib3JkZXItbGVmdDogbm9uZTtcbn1cbi5hcnRpY2xlX19hc2lkZSAub3V0bGluZS1uYXZpZ2F0b3Ige1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmO1xufVxucHJlLFxuLnNlY3Rpb25fX3ByZSB7XG4gIHBhZGRpbmc6IDJlbTtcbiAgZm9udC1mYW1pbHk6ICdDb3VyaWVyIE5ldycsIEFyaWFsLCBzYW5zLXNlcmlmO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmFmYWZhO1xuICBvdmVyZmxvdzogYXV0bztcbn1cbmNvZGUsXG4uc2VjdGlvbl9fY29kZSB7XG4gIGZvbnQtZmFtaWx5OiAnQ291cmllciBOZXcnLCBBcmlhbCwgc2Fucy1zZXJpZjtcbiAgZm9udC1zaXplOiAxNnB4O1xufVxuLmZvb3RlciB7XG4gIGJvcmRlci10b3A6IDFweCBzb2xpZCAjZGNkZmU2O1xuICBwYWRkaW5nOiAzZW0gMDtcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xufVxuLmZvb3RlciBhOmxpbmssXG4uZm9vdGVyIGE6dmlzaXRlZCxcbi5mb290ZXIgYTpob3ZlciB7XG4gIHRleHQtZGVjb3JhdGlvbjogbm9uZTtcbiAgY29sb3I6ICMwNTg5NDI7XG59XG4uZm9vdGVyIGE6aG92ZXIge1xuICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTtcbn1cbi51dGlscy1ib3JkZXItcmlnaHQge1xuICBib3JkZXItcmlnaHQ6IDFweCBzb2xpZCAjZGNkZmU2O1xufVxuLmhpZGRlbiB7XG4gIGRpc3BsYXk6IG5vbmU7XG59XG5AbWVkaWEgKG1heC13aWR0aDogNTAwcHgpIHtcbiAgaHRtbCxcbiAgYm9keSB7XG4gICAgbWFyZ2luOiAwO1xuICB9XG4gIC5wYXBlciB7XG4gICAgbWFyZ2luOiAwO1xuICAgIHBhZGRpbmc6IDA7XG4gIH1cbiAgLmFydGljbGVfX21haW4ge1xuICAgIHBhZGRpbmc6IDAgMmVtO1xuICB9XG59XG46cm9vdCB7XG4gIC0tb3V0bGluZS16SW5kZXg6IDIwMDA7XG4gIC0tb3V0bGluZS1zdGlja3ktaGVpZ2h0OiAxMDAlO1xuICAtLW91dGxpbmUtbmF2aWdhdG9yLXdpZHRoOiAxMDAlO1xufVxuLyogPT09PT09PT09PSBjb2xvcnMudGhlbWUgLSDln7rnoYDpopzoibLlj5jph4/pm4blkIggPT09PT09PT09PSAqL1xuLyoqXG4gKiBlbGxpcHNpcy5sZXNzIC0g5paH5pys55yB55WlIG1peGlueCDlh73mlbBcbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIENyZWF0ZWQgQnk6IFlhb2hhaXhpYW9cbiAqIFVwZGF0ZTogMjAyMi4zLjExXG4gKi9cbi8qID09PT09PSDmlofmnKznnIHnlaXlh73mlbAgPT09PT09ICovXG4vKipcbiAqIHNoYWRvdy5sZXNzIC0g6Zi05b2x5qC35byP6K6+572uIG1peGlueCDlh73mlbBcbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIENyZWF0ZWQgQnk6IFlhb2hhaXhpYW9cbiAqIFVwZGF0ZTogMjAyMi4zLjIwXG4gKi9cbi8qID09PT09PSDpmLTlvbHmoLflvI/orr7nva7lh73mlbAgPT09PT09ICovXG4vKiA9PT09PT09PT09IGljb24udGhlbWUgLSBzdmcg5Zu+5qCH55qE5qC35byPID09PT09PT09PT0gKi9cbi5vdXRsaW5lLWljb24ge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIHotaW5kZXg6IDE7XG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgdmVydGljYWwtYWxpZ246IG1pZGRsZTtcbiAgd2lkdGg6IDFlbTtcbiAgaGVpZ2h0OiAxZW07XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4ub3V0bGluZS1pY29uX19zdmcge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHotaW5kZXg6IDI7XG4gIHRvcDogNTAlO1xuICBsZWZ0OiA1MCU7XG4gIHdpZHRoOiAxZW07XG4gIGhlaWdodDogMWVtO1xuICBmaWxsOiBjdXJyZW50Y29sb3I7XG4gIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgLTUwJSk7XG4gICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgLTUwJSk7XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4ub3V0bGluZS1pY29uX2hpZGRlbiB7XG4gIGRpc3BsYXk6IG5vbmU7XG59XG4vKiA9PT09PSBTY3JvbGxiYXIgPT09PT0gKi9cbjo6LXdlYmtpdC1zY3JvbGxiYXIge1xuICB3aWR0aDogN3B4O1xuICBoZWlnaHQ6IDdweDtcbiAgLXdlYmtpdC1ib3JkZXItcmFkaXVzOiA1cHg7XG59XG46Oi13ZWJraXQtc2Nyb2xsYmFyLXRyYWNrLXBpZWNlIHtcbiAgLXdlYmtpdC1ib3JkZXItcmFkaXVzOiA1cHg7XG59XG46Oi13ZWJraXQtc2Nyb2xsYmFyLXRodW1iOnZlcnRpY2FsIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjI1KTtcbiAgLXdlYmtpdC1ib3JkZXItcmFkaXVzOiA1cHg7XG59XG46Oi13ZWJraXQtc2Nyb2xsYmFyLXRodW1iOmhvcml6b250YWwge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuMjUpO1xuICAtd2Via2l0LWJvcmRlci1yYWRpdXM6IDVweDtcbn1cbjo6LXdlYmtpdC1zY3JvbGxiYXItdGh1bWI6aG92ZXIge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuMzUpO1xufVxuOjotd2Via2l0LXNjcm9sbGJhcjpob3ZlciB7XG4gIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMCwgMCwgMCwgMC4xNSk7XG59XG4ub3V0bGluZS1oZWFkaW5nIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICB6LWluZGV4OiAxO1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLm91dGxpbmUtaGVhZGluZ19fYW5jaG9yIHtcbiAgZGlzcGxheTogbm9uZTtcbn1cbi5vdXRsaW5lLWhlYWRpbmdfX2FuY2hvcjpsaW5rLFxuLm91dGxpbmUtaGVhZGluZ19fYW5jaG9yOnZpc2l0ZWQsXG4ub3V0bGluZS1oZWFkaW5nX19hbmNob3I6aG92ZXIge1xuICBjb2xvcjogIzk5OTtcbiAgdGV4dC1kZWNvcmF0aW9uOiBub25lO1xufVxuLm91dGxpbmUtaGVhZGluZ19fYW5jaG9yOmhvdmVyIHtcbiAgY29sb3I6ICM1MDdhZmU7XG59XG4ub3V0bGluZS1oZWFkaW5nOmhvdmVyIC5vdXRsaW5lLWhlYWRpbmdfX2FuY2hvciB7XG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbn1cbi5vdXRsaW5lLWhlYWRpbmdfc3RhcnQ6aG92ZXIge1xuICBvdmVyZmxvdzogdmlzaWJsZTtcbn1cbi5vdXRsaW5lLWhlYWRpbmdfc3RhcnQgLm91dGxpbmUtaGVhZGluZ19fYW5jaG9yIHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB6LWluZGV4OiAyO1xuICB0b3A6IDUwJTtcbiAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTUwJSk7XG4gICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC01MCUpO1xuICBsZWZ0OiAtMWVtO1xufVxuLm91dGxpbmUtZHJhd2VyIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICB6LWluZGV4OiAtMTtcbiAgdG9wOiAwO1xuICBsZWZ0OiAwO1xuICBtYXJnaW46IDA7XG4gIHdpZHRoOiAxMDAlO1xuICBoZWlnaHQ6IDEwMCU7XG4gIC13ZWJraXQtYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICB2aXNpYmlsaXR5OiBoaWRkZW47XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4ub3V0bGluZS1kcmF3ZXJfX21vZGFsIHtcbiAgLXdlYmtpdC1ib3gtc2hhZG93OiAwIDAgNnB4IDFweCAjZGNkZmU2O1xuICAgICAgICAgIGJveC1zaGFkb3c6IDAgMCA2cHggMXB4ICNkY2RmZTY7XG4gIGRpc3BsYXk6IC13ZWJraXQtYm94O1xuICBkaXNwbGF5OiAtbXMtZmxleGJveDtcbiAgZGlzcGxheTogZmxleDtcbiAgLXdlYmtpdC1ib3gtb3JpZW50OiB2ZXJ0aWNhbDtcbiAgLXdlYmtpdC1ib3gtZGlyZWN0aW9uOiBub3JtYWw7XG4gICAgICAtbXMtZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAtbXMtZmxleC13cmFwOiBub3dyYXA7XG4gICAgICBmbGV4LXdyYXA6IG5vd3JhcDtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB6LWluZGV4OiAyMTtcbiAgaGVpZ2h0OiAxMDAlO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmO1xuICAtd2Via2l0LXRyYW5zaXRpb24tZHVyYXRpb246IDAuNHM7XG4gICAgICAgICAgdHJhbnNpdGlvbi1kdXJhdGlvbjogMC40cztcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi5vdXRsaW5lLWRyYXdlcl9faGVhZGVyLFxuLm91dGxpbmUtZHJhd2VyX19tYWluLFxuLm91dGxpbmUtZHJhd2VyX19mb290ZXIge1xuICB3aWR0aDogMTAwJTtcbiAgLXdlYmtpdC1ib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG59XG4ub3V0bGluZS1kcmF3ZXJfX2hlYWRlcixcbi5vdXRsaW5lLWRyYXdlcl9fZm9vdGVyIHtcbiAgLW1zLWZsZXgtbmVnYXRpdmU6IDA7XG4gICAgICBmbGV4LXNocmluazogMDtcbn1cbi5vdXRsaW5lLWRyYXdlcl9fdGl0bGUsXG4ub3V0bGluZS1kcmF3ZXJfX21haW4sXG4ub3V0bGluZS1kcmF3ZXJfX2Zvb3RlciB7XG4gIHBhZGRpbmc6IDAgMTZweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl9faGVhZGVyLFxuLm91dGxpbmUtZHJhd2VyX190aXRsZSB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgei1pbmRleDogMTtcbiAgbWFyZ2luOiAwIGF1dG87XG4gIGhlaWdodDogNTJweDtcbiAgbGluZS1oZWlnaHQ6IDUycHg7XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4ub3V0bGluZS1kcmF3ZXJfX3RpdGxlIHtcbiAgZm9udC1zaXplOiAxNnB4O1xuICBmb250LXdlaWdodDogNDAwO1xuICBtYXJnaW46IDAgMTZweDtcbiAgLXdlYmtpdC1ib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjZGNkZmU2O1xufVxuLm91dGxpbmUtZHJhd2VyX19jbG9zZSB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgei1pbmRleDogMjtcbiAgdG9wOiA1MCU7XG4gIHJpZ2h0OiAxMnB4O1xuICB3aWR0aDogMjBweDtcbiAgaGVpZ2h0OiAyMHB4O1xuICBsaW5lLWhlaWdodDogMjBweDtcbiAgY29sb3I6ICM5OTk7XG4gIGZvbnQtc2l6ZTogMjBweDtcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xuICBjdXJzb3I6IHBvaW50ZXI7XG4gIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC01MCUpO1xuICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtNTAlKTtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi5vdXRsaW5lLWRyYXdlcl9fY2xvc2UgLm91dGxpbmUtaWNvbiB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgei1pbmRleDogMjtcbiAgdG9wOiAwO1xuICBsZWZ0OiAwO1xufVxuLm91dGxpbmUtZHJhd2VyX19jbG9zZTpob3ZlciB7XG4gIGNvbG9yOiAjNjY2O1xufVxuLm91dGxpbmUtZHJhd2VyX19tYWluIHtcbiAgLXdlYmtpdC1ib3gtZmxleDogMTtcbiAgICAgIC1tcy1mbGV4OiAxO1xuICAgICAgICAgIGZsZXg6IDE7XG4gIG92ZXJmbG93OiBhdXRvO1xufVxuLm91dGxpbmUtZHJhd2VyX19tYWluLm92ZXJmbG93LWhpZGRlbiB7XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4ub3V0bGluZS1kcmF3ZXJfX2Zvb3RlciB7XG4gIG1hcmdpbjogMCBhdXRvO1xuICB0ZXh0LWFsaWduOiByaWdodDtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi5vdXRsaW5lLWRyYXdlcl9fb3ZlcmxheSB7XG4gIGNvbnRlbnQ6ICcnO1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIHotaW5kZXg6IDE7XG4gIHRvcDogMDtcbiAgbGVmdDogMDtcbiAgd2lkdGg6IDEwMCU7XG4gIGhlaWdodDogMTAwJTtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjtcbiAgb3BhY2l0eTogMC4xO1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLm91dGxpbmUtZHJhd2VyX3J0bC5vdXRsaW5lLWRyYXdlcl90aW55LFxuLm91dGxpbmUtZHJhd2VyX2x0ci5vdXRsaW5lLWRyYXdlcl90aW55IHtcbiAgd2lkdGg6IDI4MHB4O1xufVxuLm91dGxpbmUtZHJhd2VyX3J0bC5vdXRsaW5lLWRyYXdlcl9taW5pLFxuLm91dGxpbmUtZHJhd2VyX2x0ci5vdXRsaW5lLWRyYXdlcl9taW5pIHtcbiAgd2lkdGg6IDQ4MHB4O1xufVxuLm91dGxpbmUtZHJhd2VyX3J0bC5vdXRsaW5lLWRyYXdlcl9zbWFsbCxcbi5vdXRsaW5lLWRyYXdlcl9sdHIub3V0bGluZS1kcmF3ZXJfc21hbGwge1xuICB3aWR0aDogNTQwcHg7XG59XG4ub3V0bGluZS1kcmF3ZXJfcnRsLm91dGxpbmUtZHJhd2VyX3JlZ3VsYXIsXG4ub3V0bGluZS1kcmF3ZXJfbHRyLm91dGxpbmUtZHJhd2VyX3JlZ3VsYXIge1xuICB3aWR0aDogNjgwcHg7XG59XG4ub3V0bGluZS1kcmF3ZXJfcnRsLm91dGxpbmUtZHJhd2VyX21lZGl1bSxcbi5vdXRsaW5lLWRyYXdlcl9sdHIub3V0bGluZS1kcmF3ZXJfbWVkaXVtIHtcbiAgd2lkdGg6IDcyMHB4O1xufVxuLm91dGxpbmUtZHJhd2VyX3J0bC5vdXRsaW5lLWRyYXdlcl9sYXJnZSxcbi5vdXRsaW5lLWRyYXdlcl9sdHIub3V0bGluZS1kcmF3ZXJfbGFyZ2Uge1xuICB3aWR0aDogOTYwcHg7XG59XG4ub3V0bGluZS1kcmF3ZXJfcnRsIHtcbiAgYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjZGNkZmU2O1xufVxuLm91dGxpbmUtZHJhd2VyX3J0bC5vdXRsaW5lLWRyYXdlcl90aW55Lm91dGxpbmUtZHJhd2VyX2Nsb3NlZCB7XG4gIHJpZ2h0OiAtMjkwcHg7XG59XG4ub3V0bGluZS1kcmF3ZXJfcnRsLm91dGxpbmUtZHJhd2VyX21pbmkub3V0bGluZS1kcmF3ZXJfY2xvc2VkIHtcbiAgcmlnaHQ6IC00OTBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl9ydGwub3V0bGluZS1kcmF3ZXJfc21hbGwub3V0bGluZS1kcmF3ZXJfY2xvc2VkIHtcbiAgcmlnaHQ6IC01NTBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl9ydGwub3V0bGluZS1kcmF3ZXJfcmVndWxhci5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xuICByaWdodDogLTY5MHB4O1xufVxuLm91dGxpbmUtZHJhd2VyX3J0bC5vdXRsaW5lLWRyYXdlcl9tZWRpdW0ub3V0bGluZS1kcmF3ZXJfY2xvc2VkIHtcbiAgcmlnaHQ6IC03MzBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl9ydGwub3V0bGluZS1kcmF3ZXJfbGFyZ2Uub3V0bGluZS1kcmF3ZXJfY2xvc2VkIHtcbiAgcmlnaHQ6IC05NzBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl9sdHIge1xuICBib3JkZXItcmlnaHQ6IDFweCBzb2xpZCAjZGNkZmU2O1xufVxuLm91dGxpbmUtZHJhd2VyX2x0ci5vdXRsaW5lLWRyYXdlcl90aW55Lm91dGxpbmUtZHJhd2VyX2Nsb3NlZCB7XG4gIGxlZnQ6IC0yOTBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl9sdHIub3V0bGluZS1kcmF3ZXJfbWluaS5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xuICBsZWZ0OiAtNDkwcHg7XG59XG4ub3V0bGluZS1kcmF3ZXJfbHRyLm91dGxpbmUtZHJhd2VyX3NtYWxsLm91dGxpbmUtZHJhd2VyX2Nsb3NlZCB7XG4gIGxlZnQ6IC01NTBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl9sdHIub3V0bGluZS1kcmF3ZXJfcmVndWxhci5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xuICBsZWZ0OiAtNjkwcHg7XG59XG4ub3V0bGluZS1kcmF3ZXJfbHRyLm91dGxpbmUtZHJhd2VyX21lZGl1bS5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xuICBsZWZ0OiAtNzMwcHg7XG59XG4ub3V0bGluZS1kcmF3ZXJfbHRyLm91dGxpbmUtZHJhd2VyX2xhcmdlLm91dGxpbmUtZHJhd2VyX2Nsb3NlZCB7XG4gIGxlZnQ6IC05NzBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl90dGIsXG4ub3V0bGluZS1kcmF3ZXJfYnR0IHtcbiAgbGVmdDogMDtcbiAgd2lkdGg6IDEwMCU7XG59XG4ub3V0bGluZS1kcmF3ZXJfdHRiLm91dGxpbmUtZHJhd2VyX3RpbnksXG4ub3V0bGluZS1kcmF3ZXJfYnR0Lm91dGxpbmUtZHJhd2VyX3Rpbnkge1xuICBoZWlnaHQ6IDI0MHB4O1xufVxuLm91dGxpbmUtZHJhd2VyX3R0Yi5vdXRsaW5lLWRyYXdlcl9taW5pLFxuLm91dGxpbmUtZHJhd2VyX2J0dC5vdXRsaW5lLWRyYXdlcl9taW5pIHtcbiAgaGVpZ2h0OiAzMjBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl90dGIub3V0bGluZS1kcmF3ZXJfc21hbGwsXG4ub3V0bGluZS1kcmF3ZXJfYnR0Lm91dGxpbmUtZHJhd2VyX3NtYWxsIHtcbiAgaGVpZ2h0OiAzNjBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl90dGIub3V0bGluZS1kcmF3ZXJfcmVndWxhcixcbi5vdXRsaW5lLWRyYXdlcl9idHQub3V0bGluZS1kcmF3ZXJfcmVndWxhciB7XG4gIGhlaWdodDogNDAwcHg7XG59XG4ub3V0bGluZS1kcmF3ZXJfdHRiLm91dGxpbmUtZHJhd2VyX21lZGl1bSxcbi5vdXRsaW5lLWRyYXdlcl9idHQub3V0bGluZS1kcmF3ZXJfbWVkaXVtIHtcbiAgaGVpZ2h0OiA0NDBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl90dGIub3V0bGluZS1kcmF3ZXJfbGFyZ2UsXG4ub3V0bGluZS1kcmF3ZXJfYnR0Lm91dGxpbmUtZHJhd2VyX2xhcmdlIHtcbiAgaGVpZ2h0OiA0ODBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl90dGIge1xuICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI2RjZGZlNjtcbn1cbi5vdXRsaW5lLWRyYXdlcl90dGIub3V0bGluZS1kcmF3ZXJfdGlueS5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xuICB0b3A6IC0yNTBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl90dGIub3V0bGluZS1kcmF3ZXJfbWluaS5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xuICB0b3A6IC0zMzBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl90dGIub3V0bGluZS1kcmF3ZXJfc21hbGwub3V0bGluZS1kcmF3ZXJfY2xvc2VkIHtcbiAgdG9wOiAtMzcwcHg7XG59XG4ub3V0bGluZS1kcmF3ZXJfdHRiLm91dGxpbmUtZHJhd2VyX3JlZ3VsYXIub3V0bGluZS1kcmF3ZXJfY2xvc2VkIHtcbiAgdG9wOiAtNDEwcHg7XG59XG4ub3V0bGluZS1kcmF3ZXJfdHRiLm91dGxpbmUtZHJhd2VyX21lZGl1bS5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xuICB0b3A6IC00NTBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl90dGIub3V0bGluZS1kcmF3ZXJfbGFyZ2Uub3V0bGluZS1kcmF3ZXJfY2xvc2VkIHtcbiAgdG9wOiAtNDkwcHg7XG59XG4ub3V0bGluZS1kcmF3ZXJfYnR0IHtcbiAgdG9wOiBpbml0aWFsO1xuICBib3JkZXItdG9wOiAxcHggc29saWQgI2RjZGZlNjtcbn1cbi5vdXRsaW5lLWRyYXdlcl9idHQub3V0bGluZS1kcmF3ZXJfdGlueS5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xuICBib3R0b206IC0yNTBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl9idHQub3V0bGluZS1kcmF3ZXJfbWluaS5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xuICBib3R0b206IC0zMzBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl9idHQub3V0bGluZS1kcmF3ZXJfc21hbGwub3V0bGluZS1kcmF3ZXJfY2xvc2VkIHtcbiAgYm90dG9tOiAtMzcwcHg7XG59XG4ub3V0bGluZS1kcmF3ZXJfYnR0Lm91dGxpbmUtZHJhd2VyX3JlZ3VsYXIub3V0bGluZS1kcmF3ZXJfY2xvc2VkIHtcbiAgYm90dG9tOiAtNDEwcHg7XG59XG4ub3V0bGluZS1kcmF3ZXJfYnR0Lm91dGxpbmUtZHJhd2VyX21lZGl1bS5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xuICBib3R0b206IC00NTBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl9idHQub3V0bGluZS1kcmF3ZXJfbGFyZ2Uub3V0bGluZS1kcmF3ZXJfY2xvc2VkIHtcbiAgYm90dG9tOiAtNDkwcHg7XG59XG4ub3V0bGluZS1kcmF3ZXJfb3BlbmVkIHtcbiAgdmlzaWJpbGl0eTogdmlzaWJsZTtcbiAgei1pbmRleDogdmFyKC0tb3V0bGluZS16SW5kZXgpO1xufVxuLm91dGxpbmUtZHJhd2VyX29wZW5lZC5vdXRsaW5lLWRyYXdlciB7XG4gIHBvc2l0aW9uOiBmaXhlZDtcbn1cbi5vdXRsaW5lLWRyYXdlcl9vcGVuZWQub3V0bGluZS1kcmF3ZXJfcnRsIHtcbiAgcmlnaHQ6IDA7XG59XG4ub3V0bGluZS1kcmF3ZXJfb3BlbmVkLm91dGxpbmUtZHJhd2VyX2x0ciB7XG4gIGxlZnQ6IDA7XG59XG4ub3V0bGluZS1kcmF3ZXJfb3BlbmVkLm91dGxpbmUtZHJhd2VyX3R0YiB7XG4gIHRvcDogMDtcbn1cbi5vdXRsaW5lLWRyYXdlcl9vcGVuZWQub3V0bGluZS1kcmF3ZXJfYnR0IHtcbiAgYm90dG9tOiAwO1xufVxuLm91dGxpbmUtZHJhd2VyX29mZnNldC5vdXRsaW5lLWRyYXdlcl9ydGwsXG4ub3V0bGluZS1kcmF3ZXJfb2Zmc2V0Lm91dGxpbmUtZHJhd2VyX2x0ciB7XG4gIGhlaWdodDogY2FsYygxMDAlIC0gNGVtKTtcbiAgdG9wOiA1MCU7XG4gIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC01MCUpO1xuICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtNTAlKTtcbn1cbi5vdXRsaW5lLWRyYXdlcl9vZmZzZXQub3V0bGluZS1kcmF3ZXJfdHRiLFxuLm91dGxpbmUtZHJhd2VyX29mZnNldC5vdXRsaW5lLWRyYXdlcl9idHQge1xuICB3aWR0aDogY2FsYygxMDAlIC0gNGVtKTtcbiAgbGVmdDogNTAlO1xuICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlWCgtNTAlKTtcbiAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTUwJSk7XG59XG4ub3V0bGluZS1kcmF3ZXJfb2Zmc2V0Lm91dGxpbmUtZHJhd2VyX29wZW5lZC5vdXRsaW5lLWRyYXdlcl9ydGwge1xuICByaWdodDogMmVtO1xufVxuLm91dGxpbmUtZHJhd2VyX29mZnNldC5vdXRsaW5lLWRyYXdlcl9vcGVuZWQub3V0bGluZS1kcmF3ZXJfbHRyIHtcbiAgbGVmdDogMmVtO1xufVxuLm91dGxpbmUtZHJhd2VyX29mZnNldC5vdXRsaW5lLWRyYXdlcl9vcGVuZWQub3V0bGluZS1kcmF3ZXJfdHRiIHtcbiAgdG9wOiAyZW07XG59XG4ub3V0bGluZS1kcmF3ZXJfb2Zmc2V0Lm91dGxpbmUtZHJhd2VyX29wZW5lZC5vdXRsaW5lLWRyYXdlcl9idHQge1xuICBib3R0b206IDJlbTtcbn1cbi5vdXRsaW5lLWRyYXdlcl9hdXRvLm91dGxpbmUtZHJhd2VyX3J0bCxcbi5vdXRsaW5lLWRyYXdlcl9hdXRvLm91dGxpbmUtZHJhd2VyX2x0ciB7XG4gIGhlaWdodDogYXV0bztcbiAgbWF4LWhlaWdodDogY2FsYygxMDAlIC0gNGVtKTtcbn1cbi5vdXRsaW5lLWRyYXdlcl9mdWxsIHtcbiAgcGFkZGluZzogMDtcbn1cbi5vdXRsaW5lLW5hdmlnYXRvciB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgei1pbmRleDogMTtcbiAgbWFyZ2luOiAwO1xuICB3aWR0aDogdmFyKC0tb3V0bGluZS1uYXZpZ2F0b3Itd2lkdGgpO1xuICBvdmVyZmxvdzogYXV0bztcbn1cbi5vdXRsaW5lLW5hdmlnYXRvci1wYXJlbnQge1xuICAtd2Via2l0LXRyYW5zaXRpb246IDAuM3MgZWFzZS1pbi1vdXQ7XG4gIHRyYW5zaXRpb246IDAuM3MgZWFzZS1pbi1vdXQ7XG59XG4ub3V0bGluZS1uYXZpZ2F0b3JfX3RpdGxlIHtcbiAgbWFyZ2luOiAwIDE2cHg7XG4gIGhlaWdodDogNDBweDtcbiAgbGluZS1oZWlnaHQ6IDQwcHg7XG4gIHBhZGRpbmc6IDAgMTZweDtcbiAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNkY2RmZTY7XG4gIGZvbnQtc2l6ZTogMTZweDtcbiAgZm9udC13ZWlnaHQ6IDQwMDtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi5vdXRsaW5lLW5hdmlnYXRvcl9fbWFpbiB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgei1pbmRleDogMTtcbiAgbWFyZ2luOiAwO1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLm91dGxpbmUtbmF2aWdhdG9yX19saXN0LFxuLm91dGxpbmUtbmF2aWdhdG9yX19zdWJqZWN0LFxuLm91dGxpbmUtbmF2aWdhdG9yX19pdGVtIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICB6LWluZGV4OiAyO1xuICBtYXJnaW46IDA7XG4gIHBhZGRpbmc6IDA7XG4gIGxpc3Qtc3R5bGUtdHlwZTogbm9uZTtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi5vdXRsaW5lLW5hdmlnYXRvcl9fbGlzdCB7XG4gIHBhZGRpbmc6IDAuNWVtIDA7XG59XG4ub3V0bGluZS1uYXZpZ2F0b3JfX3N1YmplY3Qge1xuICBwYWRkaW5nLWxlZnQ6IDFlbTtcbn1cbi5vdXRsaW5lLW5hdmlnYXRvcl9faXRlbSB7XG4gIG1hcmdpbjogMDtcbiAgbGluZS1oZWlnaHQ6IDMwcHg7XG4gIGZvbnQtc2l6ZTogMTNweDtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi5vdXRsaW5lLW5hdmlnYXRvcl9fcGxhY2Vob2xkZXIge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHotaW5kZXg6IDE7XG4gIHRvcDogMDtcbiAgbGVmdDogMDtcbiAgd2lkdGg6IDEwMCU7XG4gIGhlaWdodDogMzBweDtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2Y3ZjhmOTtcbiAgYm9yZGVyLWxlZnQ6IDJweCBzb2xpZCAjMDU4OTQyO1xuICAtd2Via2l0LXRyYW5zaXRpb24tZHVyYXRpb246IDAuMnM7XG4gICAgICAgICAgdHJhbnNpdGlvbi1kdXJhdGlvbjogMC4ycztcbiAgLXdlYmtpdC1ib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4ub3V0bGluZS1uYXZpZ2F0b3JfX2FuY2hvciB7XG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzO1xuICBvdmVyZmxvdzogaGlkZGVuO1xuICBkaXNwbGF5OiBibG9jaztcbiAgcGFkZGluZzogMCAxLjVlbTtcbn1cbi5vdXRsaW5lLW5hdmlnYXRvcl9fYW5jaG9yOmxpbmssXG4ub3V0bGluZS1uYXZpZ2F0b3JfX2FuY2hvcjp2aXNpdGVkLFxuLm91dGxpbmUtbmF2aWdhdG9yX19hbmNob3I6aG92ZXIge1xuICB0ZXh0LWRlY29yYXRpb246IG5vbmU7XG4gIGNvbG9yOiAjNTU1O1xufVxuLm91dGxpbmUtbmF2aWdhdG9yX19hbmNob3I6aG92ZXIge1xuICBjb2xvcjogIzA1ODk0Mjtcbn1cbi5vdXRsaW5lLW5hdmlnYXRvcl9fY29kZSB7XG4gIHBhZGRpbmctcmlnaHQ6IDAuNWVtO1xufVxuLm91dGxpbmUtbmF2aWdhdG9yX2hpZ2hsaWdodC5vdXRsaW5lLW5hdmlnYXRvcl9fYW5jaG9yOmxpbmssXG4ub3V0bGluZS1uYXZpZ2F0b3JfaGlnaGxpZ2h0Lm91dGxpbmUtbmF2aWdhdG9yX19hbmNob3I6dmlzaXRlZCxcbi5vdXRsaW5lLW5hdmlnYXRvcl9oaWdobGlnaHQub3V0bGluZS1uYXZpZ2F0b3JfX2FuY2hvcjpob3ZlciB7XG4gIGNvbG9yOiAjMDU4OTQyO1xuICBmb250LXdlaWdodDogYm9sZDtcbn1cbi5vdXRsaW5lLW5hdmlnYXRvcl9zdGlja3ksXG4ub3V0bGluZS1uYXZpZ2F0b3JfZml4ZWQge1xuICBkaXNwbGF5OiAtd2Via2l0LWJveDtcbiAgZGlzcGxheTogLW1zLWZsZXhib3g7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIC1tcy1mbGV4LXdyYXA6IG5vd3JhcDtcbiAgICAgIGZsZXgtd3JhcDogbm93cmFwO1xuICAtd2Via2l0LWJveC1vcmllbnQ6IHZlcnRpY2FsO1xuICAtd2Via2l0LWJveC1kaXJlY3Rpb246IG5vcm1hbDtcbiAgICAgIC1tcy1mbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gIHotaW5kZXg6IHZhcigtLW91dGxpbmUtekluZGV4KTtcbiAgdG9wOiAwO1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLm91dGxpbmUtbmF2aWdhdG9yX3N0aWNreSAub3V0bGluZS1uYXZpZ2F0b3JfX3RpdGxlLFxuLm91dGxpbmUtbmF2aWdhdG9yX2ZpeGVkIC5vdXRsaW5lLW5hdmlnYXRvcl9fdGl0bGUsXG4ub3V0bGluZS1uYXZpZ2F0b3Jfc3RpY2t5IC5vdXRsaW5lLW5hdmlnYXRvcl9fbWFpbixcbi5vdXRsaW5lLW5hdmlnYXRvcl9maXhlZCAub3V0bGluZS1uYXZpZ2F0b3JfX21haW4ge1xuICAtd2Via2l0LWJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbn1cbi5vdXRsaW5lLW5hdmlnYXRvcl9zdGlja3kgLm91dGxpbmUtbmF2aWdhdG9yX190aXRsZSxcbi5vdXRsaW5lLW5hdmlnYXRvcl9maXhlZCAub3V0bGluZS1uYXZpZ2F0b3JfX3RpdGxlIHtcbiAgLW1zLWZsZXgtbmVnYXRpdmU6IDA7XG4gICAgICBmbGV4LXNocmluazogMDtcbn1cbi5vdXRsaW5lLW5hdmlnYXRvcl9zdGlja3kgLm91dGxpbmUtbmF2aWdhdG9yX19tYWluLFxuLm91dGxpbmUtbmF2aWdhdG9yX2ZpeGVkIC5vdXRsaW5lLW5hdmlnYXRvcl9fbWFpbiB7XG4gIC13ZWJraXQtYm94LWZsZXg6IDE7XG4gICAgICAtbXMtZmxleDogMTtcbiAgICAgICAgICBmbGV4OiAxO1xuICBvdmVyZmxvdzogYXV0bztcbn1cbi5vdXRsaW5lLW5hdmlnYXRvcl9zdGlja3kge1xuICBwb3NpdGlvbjogc3RpY2t5O1xuICBtYXgtaGVpZ2h0OiB2YXIoLS1vdXRsaW5lLXN0aWNreS1oZWlnaHQpO1xufVxuLm91dGxpbmUtbmF2aWdhdG9yX2ZpeGVkIHtcbiAgcG9zaXRpb246IGZpeGVkO1xuICBtYXgtaGVpZ2h0OiAxMDAlO1xufVxuLm91dGxpbmUtbmF2aWdhdG9yX2hpZGRlbiB7XG4gIGRpc3BsYXk6IG5vbmU7XG59XG4ub3V0bGluZS1uYXZpZ2F0b3JfZm9sZGVkIHtcbiAgd2lkdGg6IDA7XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4vKipcbiAqIGZvbnQubGVzcyAtIOWtl+S9k+ebuOWFs+agt+W8j1xuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogQ3JlYXRlZCBCeTogWWFvaGFpeGlhb1xuICogVXBkYXRlOiAyMDIyLjMuMTZcbiAqL1xuLyogPT09PT09IOWtl+S9kyA9PT09PT0gKi9cbi8qID09PT09PSDlrZfph40gPT09PT09ICovXG4vKiA9PT09PT0g5a2X5Y+3ID09PT09PSAqL1xuLm91dGxpbmUtcmVhZGVyX19wcm9ncmVzcyB7XG4gIHBvc2l0aW9uOiBmaXhlZDtcbiAgdG9wOiAwO1xuICBsZWZ0OiAwO1xuICB6LWluZGV4OiAzO1xuICBoZWlnaHQ6IDRweDtcbiAgd2lkdGg6IDEwMCU7XG4gIGJhY2tncm91bmQtY29sb3I6ICM1MDdhZmU7XG4gIHNjYWxlOiAwIDE7XG4gIC13ZWJraXQtdHJhbnNmb3JtLW9yaWdpbjogbGVmdDtcbiAgICAgICAgICB0cmFuc2Zvcm0tb3JpZ2luOiBsZWZ0O1xuICAtd2Via2l0LWFuaW1hdGlvbjogb3V0bGluZS1yZWFkZXItcHJvZ3Jlc3MgbGluZWFyO1xuICAgICAgICAgIGFuaW1hdGlvbjogb3V0bGluZS1yZWFkZXItcHJvZ3Jlc3MgbGluZWFyO1xuICBhbmltYXRpb24tdGltZWxpbmU6IC0tUHJvZ3Jlc3NUaW1lbGluZTtcbn1cbi5vdXRsaW5lLXJlYWRlcl9fcGFwZXIge1xuICAtd2Via2l0LWJveC1zaGFkb3c6IDAgMCA2cHggMXB4ICNkZGQ7XG4gICAgICAgICAgYm94LXNoYWRvdzogMCAwIDZweCAxcHggI2RkZDtcbiAgbWFyZ2luOiAyZW0gYXV0bztcbiAgbWF4LXdpZHRoOiAxMjAwcHg7XG4gIHBhZGRpbmc6IDMuMmVtO1xuICAtd2Via2l0LWJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi5vdXRsaW5lLXJlYWRlcl9fdGl0bGUge1xuICBtYXJnaW46IDAuNjdlbSAwO1xuICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gIGZvbnQtZmFtaWx5OiAtYXBwbGUtc3lzdGVtLCBCbGlua01hY1N5c3RlbUZvbnQsICdTZWdvZSBVSScsICdQaW5nRmFuZyBTQycsICdIaXJhZ2lubyBTYW5zIEdCJywgJ01pY3Jvc29mdCBZYUhlaScsICdIZWx2ZXRpY2EgTmV1ZScsICdBcHBsZSBDb2xvciBFbW9qaScsICdTZWdvZSBVSSBFbW9qaScsICdTZWdvZSBVSSBTeW1ib2wnLCBIZWx2ZXRpY2EsIEFyaWFsLCBzYW5zLXNlcmlmO1xuICBmb250LXdlaWdodDogbm9ybWFsO1xuICBsaW5lLWhlaWdodDogMS4zZW07XG4gIGZvbnQtc2l6ZTogNC4yZW07XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4ub3V0bGluZS1yZWFkZXJfX2FydGljbGUgLm91dGxpbmUtcmVhZGVyX19wcm9ncmVzcyB7XG4gIGRpc3BsYXk6IG5vbmU7XG59XG4ub3V0bGluZS1yZWFkZXJfaGlkZGVuIHtcbiAgZGlzcGxheTogbm9uZTtcbn1cbi5vdXRsaW5lLXJlYWRlcl9oaWRkZW4ub3V0bGluZS1yZWFkZXJfc2libGluZyB7XG4gIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDtcbn1cbi5vdXRsaW5lLXJlYWRlcl9oaWRkZW4ub3V0bGluZS1yZWFkZXJfc2libGluZy53cmFwcGVyLnBvc3Qge1xuICBkaXNwbGF5OiBub25lO1xufVxuLm91dGxpbmUtcmVhZGVyLS1yZWFkaW5nIHtcbiAgZGlzcGxheTogYmxvY2s7XG4gIHBvc2l0aW9uOiBmaXhlZDtcbiAgei1pbmRleDogMjtcbiAgdG9wOiAwO1xuICBsZWZ0OiAwO1xuICB3aWR0aDogMTAwJTtcbiAgaGVpZ2h0OiAxMDAlO1xuICBtYXJnaW46IDA7XG4gIC13ZWJraXQtYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICBwYWRkaW5nOiAzZW0gNGVtO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmFmYWZhO1xuICBzY3JvbGwtdGltZWxpbmUtbmFtZTogLS1Qcm9ncmVzc1RpbWVsaW5lO1xuICBvdmVyZmxvdzogc2Nyb2xsO1xufVxuQC13ZWJraXQta2V5ZnJhbWVzIG91dGxpbmUtcmVhZGVyLXByb2dyZXNzIHtcbiAgdG8ge1xuICAgIHNjYWxlOiAxIDE7XG4gIH1cbn1cbkBrZXlmcmFtZXMgb3V0bGluZS1yZWFkZXItcHJvZ3Jlc3Mge1xuICB0byB7XG4gICAgc2NhbGU6IDEgMTtcbiAgfVxufVxuQG1lZGlhIChtYXgtd2lkdGg6IDUwMHB4KSB7XG4gIC5vdXRsaW5lLXJlYWRlciB7XG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgfVxuICAub3V0bGluZS1yZWFkZXIgLm91dGxpbmUtdG9vbGJhciB7XG4gICAgZGlzcGxheTogLXdlYmtpdC1ib3g7XG4gICAgZGlzcGxheTogLW1zLWZsZXhib3g7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICAtd2Via2l0LWJveC1vcmllbnQ6IGhvcml6b250YWw7XG4gICAgLXdlYmtpdC1ib3gtZGlyZWN0aW9uOiBub3JtYWw7XG4gICAgICAgIC1tcy1mbGV4LWRpcmVjdGlvbjogcm93O1xuICAgICAgICAgICAgZmxleC1kaXJlY3Rpb246IHJvdztcbiAgICAtbXMtZmxleC13cmFwOiBub3dyYXA7XG4gICAgICAgIGZsZXgtd3JhcDogbm93cmFwO1xuICAgIC13ZWJraXQtYm94LWFsaWduOiBjZW50ZXI7XG4gICAgICAgIC1tcy1mbGV4LWFsaWduOiBjZW50ZXI7XG4gICAgICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgIC1tcy1mbGV4LWl0ZW0tYWxpZ246IGF1dG87XG4gICAgICAgIGFsaWduLXNlbGY6IGF1dG87XG4gICAgdG9wOiAxMDAlO1xuICAgIHJpZ2h0OiAwO1xuICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC00OHB4KTtcbiAgICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtNDhweCk7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgaGVpZ2h0OiA0OHB4O1xuICAgIC13ZWJraXQtYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICAgICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgYm9yZGVyLXRvcDogMXB4IHNvbGlkICNkZGQ7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjtcbiAgICBwYWRkaW5nOiAwIDE2cHg7XG4gIH1cbiAgLm91dGxpbmUtcmVhZGVyIC5vdXRsaW5lLXRvb2xiYXJfX2J1dHRvbiB7XG4gICAgYm9yZGVyLXJhZGl1czogMDtcbiAgICAtd2Via2l0LWJveC1mbGV4OiAxO1xuICAgICAgICAtbXMtZmxleDogMTtcbiAgICAgICAgICAgIGZsZXg6IDE7XG4gICAgYm9yZGVyOiBub25lO1xuICAgIC13ZWJraXQtYm94LXNoYWRvdzogbm9uZTtcbiAgICAgICAgICAgIGJveC1zaGFkb3c6IG5vbmU7XG4gIH1cbiAgLm91dGxpbmUtcmVhZGVyLS1yZWFkaW5nIHtcbiAgICBwYWRkaW5nOiAwO1xuICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmY7XG4gICAgLXdlYmtpdC1ib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgICAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgfVxuICAub3V0bGluZS1yZWFkZXJfX3BhcGVyIHtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgei1pbmRleDogMTtcbiAgICBtYXJnaW46IDA7XG4gICAgcGFkZGluZzogMDtcbiAgICBoZWlnaHQ6IDEwMCU7XG4gICAgLXdlYmtpdC1ib3gtc2hhZG93OiBub25lO1xuICAgICAgICAgICAgYm94LXNoYWRvdzogbm9uZTtcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xuICB9XG4gIC5vdXRsaW5lLXJlYWRlcl9fdGl0bGUge1xuICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIHotaW5kZXg6IDM7XG4gICAgdG9wOiAwO1xuICAgIGxlZnQ6IDA7XG4gICAgbWFyZ2luOiAwO1xuICAgIHdpZHRoOiAxMDAlO1xuICAgIGhlaWdodDogNDhweDtcbiAgICBsaW5lLWhlaWdodDogNDhweDtcbiAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI2RkZDtcbiAgICBmb250LXNpemU6IDEuOGVtO1xuICAgIGZvbnQtd2VpZ2h0OiA0MDA7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjtcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xuICB9XG4gIC5vdXRsaW5lLXJlYWRlcl9fYXJ0aWNsZSB7XG4gICAgbWFyZ2luOiA0OHB4IDA7XG4gICAgaGVpZ2h0OiBjYWxjKDEwMCUgLSA5NnB4KTtcbiAgICBwYWRkaW5nOiAwIDEuMjVlbTtcbiAgICBzY3JvbGwtdGltZWxpbmUtbmFtZTogLS1Nb2JpbGVQcm9ncmVzc1RpbWVsaW5lO1xuICAgIG92ZXJmbG93LXg6IGhpZGRlbjtcbiAgICBvdmVyZmxvdy15OiBzY3JvbGw7XG4gIH1cbiAgLm91dGxpbmUtcmVhZGVyX19hcnRpY2xlIC5vdXRsaW5lLXJlYWRlcl9fcHJvZ3Jlc3Mge1xuICAgIHotaW5kZXg6IDQ7XG4gICAgLXdlYmtpdC1hbmltYXRpb246IG91dGxpbmUtcmVhZGVyLXByb2dyZXNzIGxpbmVhcjtcbiAgICAgICAgICAgIGFuaW1hdGlvbjogb3V0bGluZS1yZWFkZXItcHJvZ3Jlc3MgbGluZWFyO1xuICAgIGFuaW1hdGlvbi10aW1lbGluZTogLS1Nb2JpbGVQcm9ncmVzc1RpbWVsaW5lO1xuICAgIGRpc3BsYXk6IGJsb2NrO1xuICB9XG59XG5AbWVkaWEgcHJpbnQge1xuICBodG1sLFxuICBib2R5IHtcbiAgICAvKiDmiZPljbDnmoTln7rnoYDlrZfkvZPlpKflsI8gKi9cbiAgICBmb250LXNpemU6IDEycHQ7XG4gICAgLyog5pi+56S66K6+572u5paH5a2X6aKc6Imy5ZKM6IOM5pmv6aKc6ImyICovXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjtcbiAgICBjb2xvcjogIzMzMztcbiAgICBoZWlnaHQ6IGluaXRpYWwgIWltcG9ydGFudDtcbiAgfVxuICAvKiDorr7nva7pk77mjqXmoLflvI8gKi9cbiAgYTpsaW5rLFxuICBhOnZpc2l0ZWQsXG4gIGE6aG92ZXIge1xuICAgIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lICFpbXBvcnRhbnQ7XG4gICAgY29sb3I6ICM1MDdhZmU7XG4gIH1cbiAgLyog6ZqQ6JeP5aqS5L2T5qCH562+ICovXG4gIHZpZGVvLFxuICBhdWRpbyB7XG4gICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50O1xuICB9XG4gIC8qIOehruS/neihqOagvOWcqOaJk+WNsOaXtueahOi+ueahhuWSjOWvuem9kOaWueW8j+a4heaZsCAqL1xuICB0YWJsZSB7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTtcbiAgfVxuICB0aCxcbiAgdGQge1xuICAgIGJvcmRlcjogMXB4IHNvbGlkICNkY2RmZTY7XG4gICAgcGFkZGluZzogOHB4IDIwcHg7XG4gIH1cbiAgLm91dGxpbmUtbWVzc2FnZSxcbiAgLm91dGxpbmUtdG9vbGJhciB7XG4gICAgLyog6ZqQ6JeP5LqG5bel5YW35qCP5ZKM5L+h5oGv5o+Q56S65qGGICovXG4gICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50O1xuICB9XG4gIC5vdXRsaW5lLXJlYWRlciB7XG4gICAgZGlzcGxheTogYmxvY2sgIWltcG9ydGFudDtcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgIC8qIOWPlua2iOS6hue7neWvueWumuS9jSAqL1xuICAgIC8qIOmakOiXj+mYheivu+i/m+W6puadoSAqL1xuICAgIC8qIOaJk+WNsOaXtuS4jeaYvuekuuato+aWhyBET00g55qE6Zi05b2x5pWI5p6cICovXG4gICAgLyog5omA5pyJ5paH56ug5YaF5a65IERPTSDnm7jlhbPnmoTpgrvlsYXoioLngrnpg73pmpDol4/kuoYgKi9cbiAgfVxuICAub3V0bGluZS1yZWFkZXJfX3RpdGxlIHtcbiAgICBtYXJnaW46IDEzLjRwdCAwIDI4cHQgIWltcG9ydGFudDtcbiAgICB0ZXh0LWFsaWduOiBjZW50ZXIgIWltcG9ydGFudDtcbiAgICBmb250LXNpemU6IDMycHQgIWltcG9ydGFudDtcbiAgfVxuICAub3V0bGluZS1yZWFkZXItLXJlYWRpbmcge1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZSAhaW1wb3J0YW50O1xuICAgIGhlaWdodDogYXV0byAhaW1wb3J0YW50O1xuICAgIHBhZGRpbmc6IDAgIWltcG9ydGFudDtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmO1xuICAgIG92ZXJmbG93OiBoaWRkZW4gIWltcG9ydGFudDtcbiAgfVxuICAub3V0bGluZS1yZWFkZXJfX3Byb2dyZXNzIHtcbiAgICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7XG4gIH1cbiAgLm91dGxpbmUtcmVhZGVyX19wYXBlciB7XG4gICAgLXdlYmtpdC1ib3gtc2hhZG93OiBub25lO1xuICAgICAgICAgICAgYm94LXNoYWRvdzogbm9uZTtcbiAgfVxuICAub3V0bGluZS1yZWFkZXIgcHJlIHtcbiAgICBwYWRkaW5nOiAxZW0gIWltcG9ydGFudDtcbiAgICBib3JkZXI6IDFweCBzb2xpZCAjZGRkICFpbXBvcnRhbnQ7XG4gICAgYm9yZGVyLXJhZGl1czogNHB4ICFpbXBvcnRhbnQ7XG4gIH1cbiAgLm91dGxpbmUtcmVhZGVyIHByZSxcbiAgLm91dGxpbmUtcmVhZGVyIGNvZGUge1xuICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmYgIWltcG9ydGFudDtcbiAgfVxuICAub3V0bGluZS1yZWFkZXIgdGFibGUsXG4gIC5vdXRsaW5lLXJlYWRlciBpbWcsXG4gIC5vdXRsaW5lLXJlYWRlciBzdmcge1xuICAgIC13ZWJraXQtY29sdW1uLWJyZWFrLWluc2lkZTogYXZvaWQ7XG4gICAgICAgLW1vei1jb2x1bW4tYnJlYWstaW5zaWRlOiBhdm9pZDtcbiAgICAgICAgICAgIGJyZWFrLWluc2lkZTogYXZvaWQ7XG4gIH1cbiAgLm91dGxpbmUtcmVhZGVyX3NpYmxpbmcge1xuICAgIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDtcbiAgfVxufVxuLm91dGxpbmUtdG9vbGJhciB7XG4gIHBvc2l0aW9uOiBmaXhlZDtcbiAgei1pbmRleDogOTk5OTk7XG4gIG1hcmdpbjogMDtcbiAgLXdlYmtpdC10cmFuc2l0aW9uLWR1cmF0aW9uOiAwLjNzO1xuICAgICAgICAgIHRyYW5zaXRpb24tZHVyYXRpb246IDAuM3M7XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4ub3V0bGluZS10b29sYmFyX19idXR0b24ge1xuICAtd2Via2l0LWJveC1zaGFkb3c6IDAgMCA2cHggMXB4ICNkY2RmZTY7XG4gICAgICAgICAgYm94LXNoYWRvdzogMCAwIDZweCAxcHggI2RjZGZlNjtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICB6LWluZGV4OiAxO1xuICBtYXJnaW46IDEwcHg7XG4gIHdpZHRoOiAzNnB4O1xuICBoZWlnaHQ6IDM2cHg7XG4gIGJvcmRlcjogMXB4IHNvbGlkICNkY2RmZTY7XG4gIGJvcmRlci1yYWRpdXM6IDNweDtcbiAgLXdlYmtpdC1ib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gIGJhY2tncm91bmQtY29sb3I6ICNmZmY7XG4gIGN1cnNvcjogcG9pbnRlcjtcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xuICBjb2xvcjogIzk5OTtcbiAgLXdlYmtpdC10cmFuc2l0aW9uOiBhbGwgMC4zcyAwLjFzIGVhc2UtaW4tb3V0O1xuICB0cmFuc2l0aW9uOiBhbGwgMC4zcyAwLjFzIGVhc2UtaW4tb3V0O1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLm91dGxpbmUtdG9vbGJhcl9fYnV0dG9uOmhvdmVyIHtcbiAgY29sb3I6ICMwNTg5NDI7XG4gIGJvcmRlci1jb2xvcjogIzA1ODk0MjtcbiAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlKDEuMzUpO1xuICAgICAgICAgIHRyYW5zZm9ybTogc2NhbGUoMS4zNSk7XG59XG4ub3V0bGluZS10b29sYmFyX19idXR0b24uaGlkZSB7XG4gIGRpc3BsYXk6IG5vbmU7XG59XG4ub3V0bGluZS10b29sYmFyX19hbmNob3I6bGluayxcbi5vdXRsaW5lLXRvb2xiYXJfX2FuY2hvcjp2aXNpdGVkLFxuLm91dGxpbmUtdG9vbGJhcl9fYW5jaG9yOmhvdmVyIHtcbiAgY29sb3I6ICM5OTk7XG4gIHRleHQtZGVjb3JhdGlvbjogbm9uZTtcbn1cbi5vdXRsaW5lLXRvb2xiYXJfX2FuY2hvcjpob3ZlciB7XG4gIGNvbG9yOiAjMDU4OTQyO1xufVxuLm91dGxpbmUtdG9vbGJhcl9faWNvbiB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgei1pbmRleDogMjtcbiAgdG9wOiA1MCU7XG4gIGxlZnQ6IDUwJTtcbiAgd2lkdGg6IDIwcHg7XG4gIGhlaWdodDogMjBweDtcbiAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCAtNTAlKTtcbiAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCAtNTAlKTtcbiAgZmlsbDogY3VycmVudGNvbG9yO1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLm91dGxpbmUtdG9vbGJhcl9hY3RpdmUub3V0bGluZS10b29sYmFyX19idXR0b24ge1xuICBjb2xvcjogI2ZmZjtcbiAgYmFja2dyb3VuZC1jb2xvcjogIzA1ODk0MjtcbiAgYm9yZGVyLWNvbG9yOiAjMDU4OTQyO1xufVxuLm91dGxpbmUtdG9vbGJhcl9hY3RpdmUub3V0bGluZS10b29sYmFyX19idXR0b246aG92ZXIge1xuICBjb2xvcjogI2ZmZjtcbn1cbi5vdXRsaW5lLXRvb2xiYXJfYWN0aXZlIC5vdXRsaW5lLXRvb2xiYXJfX2FuY2hvcjpsaW5rLFxuLm91dGxpbmUtdG9vbGJhcl9hY3RpdmUgLm91dGxpbmUtdG9vbGJhcl9fYW5jaG9yOnZpc2l0ZWQsXG4ub3V0bGluZS10b29sYmFyX2FjdGl2ZSAub3V0bGluZS10b29sYmFyX19hbmNob3I6aG92ZXIge1xuICBjb2xvcjogI2ZmZjtcbn1cbi5vdXRsaW5lLXRvb2xiYXJfcm91bmRlZC5vdXRsaW5lLXRvb2xiYXJfX2J1dHRvbiB7XG4gIGJvcmRlci1yYWRpdXM6IDE4cHg7XG59XG4ub3V0bGluZS10b29sYmFyX2Rpc2FibGVkLm91dGxpbmUtdG9vbGJhcl9fYW5jaG9yOmxpbmssXG4ub3V0bGluZS10b29sYmFyX2Rpc2FibGVkIC5vdXRsaW5lLXRvb2xiYXJfX2FuY2hvcjpsaW5rLFxuLm91dGxpbmUtdG9vbGJhcl9kaXNhYmxlZC5vdXRsaW5lLXRvb2xiYXJfX2FuY2hvcjp2aXNpdGVkLFxuLm91dGxpbmUtdG9vbGJhcl9kaXNhYmxlZCAub3V0bGluZS10b29sYmFyX19hbmNob3I6dmlzaXRlZCxcbi5vdXRsaW5lLXRvb2xiYXJfZGlzYWJsZWQub3V0bGluZS10b29sYmFyX19hbmNob3I6aG92ZXIsXG4ub3V0bGluZS10b29sYmFyX2Rpc2FibGVkIC5vdXRsaW5lLXRvb2xiYXJfX2FuY2hvcjpob3Zlcixcbi5vdXRsaW5lLXRvb2xiYXJfZGlzYWJsZWQub3V0bGluZS10b29sYmFyX19idXR0b24sXG4ub3V0bGluZS10b29sYmFyX2Rpc2FibGVkIC5vdXRsaW5lLXRvb2xiYXJfX2J1dHRvbiB7XG4gIGN1cnNvcjogbm90LWFsbG93ZWQ7XG4gIGNvbG9yOiAjOTk5O1xuICBib3JkZXItY29sb3I6ICM5OTk7XG59XG4ub3V0bGluZS10b29sYmFyX2Rpc2FibGVkLm91dGxpbmUtdG9vbGJhcl9fYW5jaG9yOmxpbms6aG92ZXIsXG4ub3V0bGluZS10b29sYmFyX2Rpc2FibGVkIC5vdXRsaW5lLXRvb2xiYXJfX2FuY2hvcjpsaW5rOmhvdmVyLFxuLm91dGxpbmUtdG9vbGJhcl9kaXNhYmxlZC5vdXRsaW5lLXRvb2xiYXJfX2FuY2hvcjp2aXNpdGVkOmhvdmVyLFxuLm91dGxpbmUtdG9vbGJhcl9kaXNhYmxlZCAub3V0bGluZS10b29sYmFyX19hbmNob3I6dmlzaXRlZDpob3Zlcixcbi5vdXRsaW5lLXRvb2xiYXJfZGlzYWJsZWQub3V0bGluZS10b29sYmFyX19hbmNob3I6aG92ZXI6aG92ZXIsXG4ub3V0bGluZS10b29sYmFyX2Rpc2FibGVkIC5vdXRsaW5lLXRvb2xiYXJfX2FuY2hvcjpob3Zlcjpob3Zlcixcbi5vdXRsaW5lLXRvb2xiYXJfZGlzYWJsZWQub3V0bGluZS10b29sYmFyX19idXR0b246aG92ZXIsXG4ub3V0bGluZS10b29sYmFyX2Rpc2FibGVkIC5vdXRsaW5lLXRvb2xiYXJfX2J1dHRvbjpob3ZlciB7XG4gIGNvbG9yOiAjOTk5O1xuICBib3JkZXItY29sb3I6ICM5OTk7XG59XG4ub3V0bGluZS10b29sYmFyX2Rpc2FibGVkLm91dGxpbmUtdG9vbGJhcl9fYnV0dG9uLFxuLm91dGxpbmUtdG9vbGJhcl9kaXNhYmxlZCAub3V0bGluZS10b29sYmFyX19idXR0b24ge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjVmNWY1O1xufVxuLm91dGxpbmUtdG9vbGJhcl90dGIsXG4ub3V0bGluZS10b29sYmFyX2J0dCB7XG4gIGxlZnQ6IDUwJTtcbiAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTUwJSk7XG4gICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC01MCUpO1xufVxuLm91dGxpbmUtdG9vbGJhcl90dGIgLm91dGxpbmUtdG9vbGJhcl9fYnV0dG9uLFxuLm91dGxpbmUtdG9vbGJhcl9idHQgLm91dGxpbmUtdG9vbGJhcl9fYnV0dG9uIHtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xufVxuLm91dGxpbmUtdG9vbGJhcl90dGIge1xuICB0b3A6IDEycHg7XG59XG4ub3V0bGluZS10b29sYmFyX3R0Yi5vdXRsaW5lLXRvb2xiYXJfaGlkZGVuIHtcbiAgdG9wOiAtNTZweDtcbn1cbi5vdXRsaW5lLXRvb2xiYXJfYnR0IHtcbiAgYm90dG9tOiAxMnB4O1xufVxuLm91dGxpbmUtdG9vbGJhcl9idHQub3V0bGluZS10b29sYmFyX2hpZGRlbiB7XG4gIGJvdHRvbTogLTU2cHg7XG59XG4ub3V0bGluZS10b29sYmFyX3J0bCxcbi5vdXRsaW5lLXRvb2xiYXJfbHRyIHtcbiAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTUwJSk7XG4gICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC01MCUpO1xuICB3aWR0aDogNTZweDtcbn1cbi5vdXRsaW5lLXRvb2xiYXJfcnRsIHtcbiAgdG9wOiA1MCU7XG4gIHJpZ2h0OiAxMnB4O1xufVxuLm91dGxpbmUtdG9vbGJhcl9ydGwub3V0bGluZS10b29sYmFyX2hpZGRlbiB7XG4gIHJpZ2h0OiAtODZweDtcbn1cbi5vdXRsaW5lLXRvb2xiYXJfbHRyIHtcbiAgdG9wOiA1MCU7XG4gIGxlZnQ6IDEycHg7XG59XG4ub3V0bGluZS10b29sYmFyX2x0ci5vdXRsaW5lLXRvb2xiYXJfaGlkZGVuIHtcbiAgbGVmdDogLTg2cHg7XG59XG4ub3V0bGluZS10b29sYmFyX3R0YiAub3V0bGluZS10b29sYmFyX19idXR0b24ub3V0bGluZS10b29sYmFyX2hpZGRlbixcbi5vdXRsaW5lLXRvb2xiYXJfcnRsIC5vdXRsaW5lLXRvb2xiYXJfX2J1dHRvbi5vdXRsaW5lLXRvb2xiYXJfaGlkZGVuLFxuLm91dGxpbmUtdG9vbGJhcl9idHQgLm91dGxpbmUtdG9vbGJhcl9fYnV0dG9uLm91dGxpbmUtdG9vbGJhcl9oaWRkZW4sXG4ub3V0bGluZS10b29sYmFyX2x0ciAub3V0bGluZS10b29sYmFyX19idXR0b24ub3V0bGluZS10b29sYmFyX2hpZGRlbiB7XG4gIGRpc3BsYXk6IG5vbmU7XG59XG5cbi8qIyBzb3VyY2VNYXBwaW5nVVJMPWRhdGE6YXBwbGljYXRpb24vanNvbjtjaGFyc2V0PXV0Zjg7YmFzZTY0LGV5SjJaWEp6YVc5dUlqb3pMQ0p6YjNWeVkyVnpJanBiSWk0dUx5NHVMenhwYm5CMWRDQmpjM01nTWo0aUxDSnpZM0p2Ykd4aVlYSXViR1Z6Y3lJc0luTmxZM1JwYjI0dWJHVnpjeUlzSW1OaGMyVXViR1Z6Y3lJc0luQmhaMlZ5TG14bGMzTWlMQ0l1TGk4dUxpOTBhR1Z0WlM5emFHRmtiM2N1YkdWemN5SXNJaTR1THk0dUwzUm9aVzFsTDNaaGNtbGhZbXhsY3k1c1pYTnpJaXdpTGk0dkxpNHZkR2hsYldVdmFXTnZibk11YkdWemN5SXNJaTR1THk0dUwzUm9aVzFsTDNOamNtOXNiR0poY2k1c1pYTnpJaXdpTGk0dkxpNHZZVzVqYUc5eWN5OWhibU5vYjNKekxteGxjM01pTENJdUxpOHVMaTlrY21GM1pYSXZaSEpoZDJWeUxteGxjM01pTENJdUxpOHVMaTl1WVhacFoyRjBiM0l2Ym1GMmFXZGhkRzl5TG14bGMzTWlMQ0l1TGk4dUxpOTBhR1Z0WlM5bGJHeHBjSE5wY3k1c1pYTnpJaXdpTGk0dkxpNHZjbVZoWkdWeUwzSmxZV1JsY2k1c1pYTnpJaXdpTGk0dkxpNHZkR2hsYldVdmNtRmthWFZ6TG14bGMzTWlMQ0l1TGk4dUxpOTBiMjlzWW1GeUwzUnZiMnhpWVhJdWJHVnpjeUpkTENKdVlXMWxjeUk2VzEwc0ltMWhjSEJwYm1keklqb2lRVUZCUVN3eVFrRkJNa0k3UVVORE0wSTdSVUZEUlN4WFFVRkJPMFZCUTBFc1dVRkJRVHRGUVVOQkxESkNRVUZCTzBORVEwUTdRVU5GUkR0RlFVTkZMREpDUVVGQk8wTkVRVVE3UVVOSFJEdEZRVU5GTEhORFFVRkJPMFZCUTBFc01rSkJRVUU3UTBSRVJEdEJRMGxFTzBWQlEwVXNjME5CUVVFN1JVRkRRU3d5UWtGQlFUdERSRVpFTzBGRFMwUTdSVUZEUlN4elEwRkJRVHREUkVoRU8wRkRUVVE3UlVGRFJTeHpRMEZCUVR0RFJFcEVPMEZGY0VKRU8wVkJRMFVzWTBGQlFUdEZRVU5CTEdsQ1FVRkJPME5HYzBKRU8wRkZjRUpET3pzN1JVRkhSU3hWUVVGQk8wVkJRMEVzWlVGQlFUdEZRVU5CTEdsQ1FVRkJPME5HYzBKSU8wRkZia0pETzBWQlEwVXNXVUZCUVR0RFJuRkNTRHRCUld4Q1F6dEZRVU5GTEdWQlFVRTdSVUZEUVN4clFrRkJRVHREUm05Q1NEdEJSV3BDUXp0RlFVTkZMR2xDUVVGQk8wVkJRMEVzV1VGQlFUdERSbTFDU0R0QlJXaENRenRGUVVORkxHVkJRVUU3UlVGRFFTeFpRVUZCTzBOR2EwSklPMEZGWmtNN096dEZRVWRGTEZWQlFVRTdSVUZEUVN4WFFVRkJPMFZCUTBFc2FVSkJRVUU3UTBacFFrZzdRVVZrUXp0RlFVTkZMRzFDUVVGQk8wVkJRMEVzVjBGQlFUdERSbWRDU0R0QlJXSkRPMFZCUTBVc2MwSkJRVUU3UTBabFNEdEJSVnBETzBWQlEwVXNjMEpCUVVFN1JVRkRRU3hsUVVGQk8wTkdZMGc3UVVWWVF6dEZRVU5GTEdOQlFVRTdSVUZEUVN4aFFVRkJPMFZCUTBFc1owSkJRVUU3UlVGRFFTeHJRa0ZCUVR0RlFVTkJMR2xDUVVGQk8wVkJRMEVzTUVKQlFVRTdSVUZEUVN4MVFrRkJRVHRGUVVOQkxHMUNRVUZCTzBWQlEwRXNXVUZCUVR0RlFVTkJMR1ZCUVVFN1EwWmhTRHRCUlZaRE8wVkJRMFVzWlVGQlFUdEZRVU5CTEdWQlFVRTdSVUZEUVN4cFFrRkJRVHREUmxsSU8wRkZWRU03UlVGRFJTd3lRa0ZCUVR0RlFVTkJMR2RDUVVGQk8wVkJRMEVzTUVKQlFVRTdSVUZEUVN4WlFVRkJPME5HVjBnN1FVVlNRenRGUVVORkxHbENRVUZCTzBWQlEwRXNXVUZCUVR0RlFVTkJMREpDUVVGQk8wTkdWVWc3UVVWUVF6czdSVUZGUlN4clFrRkJRVHRGUVVOQkxHdENRVUZCTzBWQlEwRXNPRUpCUVVFN1EwWlRTRHRCUlU1RE8wVkJRMFVzYlVKQlFVRTdSVUZEUVN3d1FrRkJRVHREUmxGSU8wRkZTa1E3UlVGRlNUczdTVUZGUlN4bFFVRkJPMGRHUzBnN1EwRkRSanRCUnpWSFJEdEZRVU5GTEcxQ1FVRkJPMFZCUTBFc1YwRkJRVHRGUVVOQkxHTkJRVUU3UlVGRFFTeHpRMEZCUVR0RlFVTkJMRlZCUVVFN1JVRkRRU3hoUVVGQk8wVkJRMEVzTWtKQlFVRTdSVUZEUVN3NFFrRkJRVHRGUVVOQkxHbENRVUZCTzBOSU9FZEVPMEZITlVkRE8wVkJRMFVzV1VGQlFUdEZRVU5CTEcxQ1FVRkJPMFZCUTBFc1YwRkJRVHRGUVVOQkxFOUJRVUU3UlVGRFFTeFZRVUZCTzBWQlEwRXNZVUZCUVR0RlFVTkJMRk5CUVVFN1JVRkRRU3cwUWtGQlFUdEZRVU5CTEdsQ1FVRkJPME5JT0VkSU8wRkhNMGRET3p0RlFVVkZMR2RDUVVGQk8wVkJRMEVzYTBKQlFVRTdRMGcyUjBnN1FVY3hSME03T3p0RlFVZEZMR2xGUVVGQk8wTklORWRJTzBGSGVrZERPMFZCUTBVc1ZVRkJRVHRGUVVOQkxHRkJRVUU3UlVGRFFTd3dRa0ZCUVR0RlFVTkJMR0ZCUVVFN1JVRkRRU3h0UWtGQlFUdEZRVU5CTEN0Q1FVRkJPMVZCUVVFc2RVSkJRVUU3UlVGRFFTeGxRVUZCTzBOSU1rZElPMEZIZUVkRE8wVkJRMFVzWlVGQlFUdEZRVU5CTEdGQlFVRTdSVUZEUVN4clFrRkJRVHRGUVVOQkxHZENRVUZCTzBWQlEwRXNaMEpCUVVFN1JVRkRRU3hyUWtGQlFUdEZRVU5CTEdsQ1FVRkJPME5JTUVkSU8wRkhka2RET3p0RlFVVkZMR2RDUVVGQk8wVkJRMEVzWlVGQlFUdEZRVU5CTERCQ1FVRkJPMHRCUVVFc2RVSkJRVUU3VFVGQlFTeHpRa0ZCUVR0VlFVRkJMR3RDUVVGQk8wTkllVWRJTzBGSGRFZERPMFZCUTBVc1owSkJRVUU3UlVGRFFTeHRRa0ZCUVR0RFNIZEhTRHRCUjNSSFJ6dEZRVU5GTEdkQ1FVRkJPME5JZDBkTU8wRkhjRWRETzBWQlEwVXNZVUZCUVR0RFNITkhTRHRCUjI1SFF6dEZRVU5GTEdWQlFVRTdSVUZEUVN4alFVRkJPMFZCUTBFc2RVSkJRVUU3UlVGRFFTeHBRa0ZCUVR0RFNIRkhTRHRCUjJ4SFF6dEZRVU5GTEdWQlFVRTdSVUZEUVN4WlFVRkJPMFZCUTBFc1lVRkJRVHRGUVVOQkxHRkJRVUU3UlVGRFFTeGpRVUZCTzBWQlEwRXNZVUZCUVR0RlFVTkJMQ3RDUVVGQk8xVkJRVUVzZFVKQlFVRTdSVUZEUVN4bFFVRkJPME5JYjBkSU8wRkhha2RET3p0RlFVVkZMRlZCUVVFN1JVRkRRU3hYUVVGQk8wVkJRMEVzYzBKQlFVRTdSVUZEUVN4cFFrRkJRVHREU0cxSFNEdEJSMmhIUXp0RlFVTkZMR05CUVVFN1JVRkRRU3d5UWtGQlFUdEZRVU5CTERoQ1FVRkJPMFZCUTBFc1owSkJRVUU3UlVGRFFTeGxRVUZCTzBOSWEwZElPMEZITDBaRE8wVkJRMFVzWVVGQlFUdEZRVU5CTEd0Q1FVRkJPMFZCUTBFc1owSkJRVUU3UlVGRFFTeG5Ra0ZCUVR0RFNHbEhTRHRCUnk5R1J6dEZRVU5GTERCQ1FVRkJPME5JYVVkTU8wRkJRMFE3T3pzN08wZEJTMGM3UVVGRFNEczdPenM3UjBGTFJ6dEJRVU5JTERSQ1FVRTBRanRCU1d4UE5VSTdSVU5QZDBRc2QwTkJRVUU3VlVGQlFTeG5RMEZCUVR0RlJFeDBSQ3hwUWtGQlFUdEZRVU5CTEd0Q1FVRkJPMFZCUTBFc1lVRkJRVHRGUVVOQkxIVkNRVUZCTzBWQlEwRXNLMEpCUVVFN1ZVRkJRU3gxUWtGQlFUdERTbTlQUkR0QlNXeFBRenRGUVVORkxIRkNRVUZCTzBWQlFVRXNjVUpCUVVFN1JVRkJRU3hqUVVGQk8wVkJRMEVzSzBKQlFVRTdSVUZCUVN3NFFrRkJRVHROUVVGQkxIZENRVUZCTzFWQlFVRXNiMEpCUVVFN1JVRkRRU3h6UWtGQlFUdE5RVUZCTEd0Q1FVRkJPMFZCUTBFc1ZVRkJRVHRGUVVOQkxGbEJRVUU3UlVGRFFTeG5Ra0ZCUVR0RlFVTkJMR0ZCUVVFN1JVRkRRU3hYUVVGQk8wVkJRMEVzYVVKQlFVRTdRMHB2VDBnN1FVazNUME03UlVGWlNTdzJRa0ZCUVR0RlFVRkJMRGhDUVVGQk8wMUJRVUVzTWtKQlFVRTdWVUZCUVN4MVFrRkJRVHRGUVVOQkxGbEJRVUU3UlVGRFFTd3JRa0ZCUVR0VlFVRkJMSFZDUVVGQk8wTktiMDlNTzBGSmJFOUxPMFZCUTBVc1lVRkJRVHRGUVVOQkxDdENRVUZCTzFWQlFVRXNkVUpCUVVFN1JVRkRRU3hsUVVGQk8wTktiMDlRTzBGSmFrOUxPMFZCUTBVc1owTkJRVUU3UTBwdFQxQTdRVWszVGtRN1JVRkRSU3hwUWtGQlFUdEZRVU5CTEZkQlFVRTdSVUZEUVN4UFFVRkJPMFZCUTBFc1pVRkJRVHRGUVVOQkxEaENRVUZCTzBWQlEwRXNkVUpCUVVFN1JVRkRRU3h0UWtGQlFUdEZRVU5CTEd0RFFVRkJPMVZCUVVFc01FSkJRVUU3UlVGRFFTeHBRa0ZCUVR0RFNpdE9SRHRCU1RkT1F6dEZRVU5GTEc5Q1FVRkJPME5LSzA1SU8wRkpNMDVFTzBWQlEwVXNjVUpCUVVFN1JVRkJRU3h4UWtGQlFUdEZRVUZCTEdOQlFVRTdSVUZEUVN3clFrRkJRVHRGUVVGQkxEaENRVUZCTzAxQlFVRXNkMEpCUVVFN1ZVRkJRU3h2UWtGQlFUdEZRVU5CTEhOQ1FVRkJPMDFCUVVFc2EwSkJRVUU3UlVGRFFTeGxRVUZCTzBWQlEwRXNaMEpCUVVFN1JVRkRRU3hyUWtGQlFUdERTalpPUkR0QlNUTk9RenRGUVVORkxHOUNRVUZCTzAxQlFVRXNXVUZCUVR0VlFVRkJMRkZCUVVFN1JVRkRRU3hsUVVGQk8wVkJRMEVzYVVKQlFVRTdRMG8yVGtnN1FVbG9UME03UlVGTlNTeHJRa0ZCUVR0RFNqWk9URHRCU1ROT1N6czdPMFZCUjBVc2EwSkJRVUU3UTBvMlRsQTdRVWt4VGtzN08wVkJSVVVzVlVGQlFUdERTalJPVUR0QlNYWk9RenRGUVVORkxIRkNRVUZCTzAxQlFVRXNaVUZCUVR0RlFVTkJMR0ZCUVVFN1JVRkRRU3cwUWtGQlFUdERTbmxPU0R0QlNYWk9SenRGUVVORkxEWkNRVUZCTzBWQlEwRXNhMEpCUVVFN1EwcDVUa3c3UVVsb1QwTTdSVUZYU1N4MVFrRkJRVHREU25kT1REdEJTVzVPUkRzN1JVRkZSU3hoUVVGQk8wVkJRMEVzT0VOQlFVRTdSVUZEUVN3d1FrRkJRVHRGUVVOQkxHVkJRVUU3UTBweFRrUTdRVWxzVGtRN08wVkJSVVVzT0VOQlFVRTdSVUZEUVN4blFrRkJRVHREU205T1JEdEJTV3BPUkR0RlFVTkZMRGhDUVVGQk8wVkJRMEVzWlVGQlFUdEZRVU5CTEcxQ1FVRkJPME5LYlU1RU8wRkphRTVIT3pzN1JVRkhSU3h6UWtGQlFUdEZRVU5CTEdWQlFVRTdRMHByVGt3N1FVa3ZUVWM3UlVGRFJTd3lRa0ZCUVR0RFNtbE9URHRCU1RWTlJEdEZRVU5GTEdkRFFVRkJPME5LT0UxRU8wRkpNMDFFTzBWQlEwVXNZMEZCUVR0RFNqWk5SRHRCU1RGTlJEdEZRVU5GT3p0SlFVVkZMRlZCUVVFN1IwbzBUVVE3UlVsNlRVUTdTVUZEUlN4VlFVRkJPMGxCUTBFc1YwRkJRVHRIU2pKTlJEdEZTWGhOUkR0SlFVTkZMR1ZCUVVFN1Iwb3dUVVE3UTBGRFJqdEJUWEJYUkR0RlFVTkRMSFZDUVVGQk8wVkJRMFFzT0VKQlFVRTdSVUZCYVVNc1owTkJRVUU3UTA1MVYyaERPMEZCUTBRc2JVUkJRVzFFTzBGQlEyNUVPenM3T3p0SFFVdEhPMEZCUTBnc01FSkJRVEJDTzBGQlF6RkNPenM3T3p0SFFVdEhPMEZCUTBnc05FSkJRVFJDTzBGQlF6VkNMR3RFUVVGclJEdEJUM2hZYkVRN1JVRkRSU3h0UWtGQlFUdEZRVU5CTEZkQlFVRTdSVUZEUVN4elFrRkJRVHRGUVVOQkxIVkNRVUZCTzBWQlEwRXNWMEZCUVR0RlFVTkJMRmxCUVVFN1JVRkRRU3hwUWtGQlFUdERVREJZUkR0QlQzaFlRenRGUVVORkxHMUNRVUZCTzBWQlEwRXNWMEZCUVR0RlFVTkJMRk5CUVVFN1JVRkRRU3hWUVVGQk8wVkJRMEVzVjBGQlFUdEZRVU5CTEZsQlFVRTdSVUZEUVN4dFFrRkJRVHRGUVVOQkxIbERRVUZCTzFWQlFVRXNhVU5CUVVFN1JVRkRRU3hwUWtGQlFUdERVREJZU0R0QlQzWllRenRGUVVORkxHTkJRVUU3UTFCNVdFZzdRVUZEUkN3eVFrRkJNa0k3UVZGb1dqTkNPMFZCUTBVc1YwRkJRVHRGUVVOQkxGbEJRVUU3UlVGRFFTd3lRa0ZCUVR0RFVtdGFSRHRCVVdoYVF6dEZRVU5GTERKQ1FVRkJPME5TYTFwSU8wRlJPVmxITzBWQlEwVXNjME5CUVVFN1JVRkRRU3d5UWtGQlFUdERVbWRhVER0QlVUZFpSenRGUVVORkxITkRRVUZCTzBWQlEwRXNNa0pCUVVFN1ExSXJXVXc3UVZFMVdVYzdSVUZEUlN4elEwRkJRVHREVWpoWlREdEJVVEZaUXp0RlFVTkZMSE5EUVVGQk8wTlNORmxJTzBGVGNtRkVPMFZCUTBVc2JVSkJRVUU3UlVGRFFTeFhRVUZCTzBWQlEwRXNhVUpCUVVFN1ExUjFZVVE3UVZOeVlVTTdSVUZEUlN4alFVRkJPME5VZFdGSU8wRlRjbUZIT3pzN1JVRkhSU3haUVVGQk8wVkJRMEVzYzBKQlFVRTdRMVIxWVV3N1FWTndZVWM3UlVGRFJTeGxRVUZCTzBOVWMyRk1PMEZUYkdGRE8wVkJSVWtzYzBKQlFVRTdRMVJ0WVV3N1FWTTVXa2M3UlVGRFJTeHJRa0ZCUVR0RFZHZGhURHRCVTJ4aFF6dEZRVTFKTEcxQ1FVRkJPMFZCUTBFc1YwRkJRVHRGUVVOQkxGTkJRVUU3UlVGRFFTeHZRMEZCUVR0VlFVRkJMRFJDUVVGQk8wVkJRMEVzVjBGQlFUdERWQ3RhVER0QlZXcGpSRHRGUVVORkxHMUNRVUZCTzBWQlEwRXNXVUZCUVR0RlFVTkJMRTlCUVVFN1JVRkRRU3hSUVVGQk8wVkJRMEVzVlVGQlFUdEZRVU5CTEZsQlFVRTdSVUZEUVN4aFFVRkJPMFZCUTBFc0swSkJRVUU3VlVGQlFTeDFRa0ZCUVR0RlFVTkJMRzFDUVVGQk8wVkJRMEVzYVVKQlFVRTdRMVp0WTBRN1FWVnFZME03UlV4UWMwUXNkME5CUVVFN1ZVRkJRU3huUTBGQlFUdEZTMU53UkN4eFFrRkJRVHRGUVVGQkxIRkNRVUZCTzBWQlFVRXNZMEZCUVR0RlFVTkJMRFpDUVVGQk8wVkJRVUVzT0VKQlFVRTdUVUZCUVN3eVFrRkJRVHRWUVVGQkxIVkNRVUZCTzBWQlEwRXNjMEpCUVVFN1RVRkJRU3hyUWtGQlFUdEZRVU5CTEcxQ1FVRkJPMFZCUTBFc1dVRkJRVHRGUVVOQkxHRkJRVUU3UlVGRFFTeDFRa0ZCUVR0RlFVTkJMR3REUVVGQk8xVkJRVUVzTUVKQlFVRTdSVUZEUVN4cFFrRkJRVHREVm0xalNEdEJWV2hqUXpzN08wVkJSMFVzV1VGQlFUdEZRVU5CTEN0Q1FVRkJPMVZCUVVFc2RVSkJRVUU3UTFaclkwZzdRVlV2WWtNN08wVkJSVVVzY1VKQlFVRTdUVUZCUVN4bFFVRkJPME5XYVdOSU8wRlZPV0pET3pzN1JVRkhSU3huUWtGQlFUdERWbWRqU0R0QlZUZGlRenM3UlVGRlJTeHRRa0ZCUVR0RlFVTkJMRmRCUVVFN1JVRkRRU3hsUVVGQk8wVkJRMEVzWVVGQlFUdEZRVU5CTEd0Q1FVRkJPMFZCUTBFc2FVSkJRVUU3UTFZcllrZzdRVlUxWWtNN1JVRkRSU3huUWtGQlFUdEZRVU5CTEdsQ1FVRkJPMFZCUTBFc1pVRkJRVHRGUVVOQkxDdENRVUZCTzFWQlFVRXNkVUpCUVVFN1JVRkRRU3hwUTBGQlFUdERWamhpU0R0QlZUTmlRenRGUVVORkxHMUNRVUZCTzBWQlEwRXNWMEZCUVR0RlFVTkJMRk5CUVVFN1JVRkRRU3haUVVGQk8wVkJRMEVzV1VGQlFUdEZRVU5CTEdGQlFVRTdSVUZEUVN4clFrRkJRVHRGUVVOQkxGbEJRVUU3UlVGRFFTeG5Ra0ZCUVR0RlFVTkJMRzFDUVVGQk8wVkJRMEVzWjBKQlFVRTdSVUZEUVN4dlEwRkJRVHRWUVVGQkxEUkNRVUZCTzBWQlEwRXNhVUpCUVVFN1ExWTJZa2c3UVZVeFkwTTdSVUZuUWtrc2JVSkJRVUU3UlVGRFFTeFhRVUZCTzBWQlEwRXNUMEZCUVR0RlFVTkJMRkZCUVVFN1ExWTJZa3c3UVZVeFlrYzdSVUZEUlN4WlFVRkJPME5XTkdKTU8wRlZlR0pETzBWQlEwVXNiMEpCUVVFN1RVRkJRU3haUVVGQk8xVkJRVUVzVVVGQlFUdEZRVU5CTEdWQlFVRTdRMVl3WWtnN1FWVjRZa2M3UlVGRFJTeHBRa0ZCUVR0RFZqQmlURHRCVlhSaVF6dEZRVU5GTEdWQlFVRTdSVUZEUVN4clFrRkJRVHRGUVVOQkxHbENRVUZCTzBOV2QySklPMEZWY21KRE8wVkJRMFVzV1VGQlFUdEZRVU5CTEcxQ1FVRkJPMFZCUTBFc1YwRkJRVHRGUVVOQkxFOUJRVUU3UlVGRFFTeFJRVUZCTzBWQlEwRXNXVUZCUVR0RlFVTkJMR0ZCUVVFN1JVRkRRU3gxUWtGQlFUdEZRVU5CTEdGQlFVRTdSVUZEUVN4cFFrRkJRVHREVm5WaVNEdEJWV3BpU3pzN1JVRkRSU3hoUVVGQk8wTldiMkpRTzBGVmFtSkxPenRGUVVORkxHRkJRVUU3UTFadllsQTdRVlZxWWtzN08wVkJRMFVzWVVGQlFUdERWbTlpVUR0QlZXcGlTenM3UlVGRFJTeGhRVUZCTzBOV2IySlFPMEZWYW1KTE96dEZRVU5GTEdGQlFVRTdRMVp2WWxBN1FWVnFZa3M3TzBWQlEwVXNZVUZCUVR0RFZtOWlVRHRCVlM5aFF6dEZRVU5GTEN0Q1FVRkJPME5XYVdKSU8wRlZOMkZQTzBWQlEwVXNZMEZCUVR0RFZpdGhWRHRCVlRGaFR6dEZRVU5GTEdOQlFVRTdRMVkwWVZRN1FWVjJZVTg3UlVGRFJTeGpRVUZCTzBOV2VXRlVPMEZWY0dGUE8wVkJRMFVzWTBGQlFUdERWbk5oVkR0QlZXcGhUenRGUVVORkxHTkJRVUU3UTFadFlWUTdRVlU1V2s4N1JVRkRSU3hqUVVGQk8wTldaMkZVTzBGVk1WcERPMFZCUTBVc1owTkJRVUU3UTFZMFdrZzdRVlY0V2s4N1JVRkRSU3hoUVVGQk8wTldNRnBVTzBGVmNscFBPMFZCUTBVc1lVRkJRVHREVm5WYVZEdEJWV3hhVHp0RlFVTkZMR0ZCUVVFN1ExWnZXbFE3UVZVdldVODdSVUZEUlN4aFFVRkJPME5XYVZwVU8wRlZOVmxQTzBWQlEwVXNZVUZCUVR0RFZqaFpWRHRCVlhwWlR6dEZRVU5GTEdGQlFVRTdRMVl5V1ZRN1FWVnlXVU03TzBWQlJVVXNVVUZCUVR0RlFVTkJMRmxCUVVFN1ExWjFXVWc3UVZWd1dVczdPMFZCUTBVc1kwRkJRVHREVm5WWlVEdEJWWEJaU3pzN1JVRkRSU3hqUVVGQk8wTldkVmxRTzBGVmNGbExPenRGUVVORkxHTkJRVUU3UTFaMVdWQTdRVlZ3V1VzN08wVkJRMFVzWTBGQlFUdERWblZaVUR0QlZYQlpTenM3UlVGRFJTeGpRVUZCTzBOV2RWbFFPMEZWY0ZsTE96dEZRVU5GTEdOQlFVRTdRMVoxV1ZBN1FWVnNXVU03UlVGRFJTeHBRMEZCUVR0RFZtOVpTRHRCVldoWlR6dEZRVU5GTEZsQlFVRTdRMVpyV1ZRN1FWVTNXRTg3UlVGRFJTeFpRVUZCTzBOV0sxaFVPMEZWTVZoUE8wVkJRMFVzV1VGQlFUdERWalJZVkR0QlZYWllUenRGUVVORkxGbEJRVUU3UTFaNVdGUTdRVlZ3V0U4N1JVRkRSU3haUVVGQk8wTldjMWhVTzBGVmFsaFBPMFZCUTBVc1dVRkJRVHREVm0xWVZEdEJWVGRYUXp0RlFVTkZMR0ZCUVVFN1JVRkRRU3c0UWtGQlFUdERWaXRYU0R0QlZUTlhUenRGUVVORkxHVkJRVUU3UTFZMlYxUTdRVlY0VjA4N1JVRkRSU3hsUVVGQk8wTldNRmRVTzBGVmNsZFBPMFZCUTBVc1pVRkJRVHREVm5WWFZEdEJWV3hYVHp0RlFVTkZMR1ZCUVVFN1ExWnZWMVE3UVZVdlZrODdSVUZEUlN4bFFVRkJPME5XYVZkVU8wRlZOVlpQTzBWQlEwVXNaVUZCUVR0RFZqaFdWRHRCVlhoV1F6dEZRVU5GTEc5Q1FVRkJPMFZCUTBFc0swSkJRVUU3UTFZd1ZrZzdRVlY0VmtjN1JVRkRSU3huUWtGQlFUdERWakJXVER0QlZYaFdTenRGUVVORkxGTkJRVUU3UTFZd1ZsQTdRVlYyVmtzN1JVRkRSU3hSUVVGQk8wTldlVlpRTzBGVmRGWkxPMFZCUTBVc1QwRkJRVHREVm5kV1VEdEJWWEpXU3p0RlFVTkZMRlZCUVVFN1ExWjFWbEE3UVZWb1ZrczdPMFZCUlVVc2VVSkJRVUU3UlVGRFFTeFRRVUZCTzBWQlEwRXNiME5CUVVFN1ZVRkJRU3cwUWtGQlFUdERWbXRXVUR0QlZTOVZTenM3UlVGRlJTeDNRa0ZCUVR0RlFVTkJMRlZCUVVFN1JVRkRRU3h2UTBGQlFUdFZRVUZCTERSQ1FVRkJPME5XYVZaUU8wRlZOVlZUTzBWQlEwVXNWMEZCUVR0RFZqaFZXRHRCVlROVlV6dEZRVU5GTEZWQlFVRTdRMVkyVlZnN1FWVXhWVk03UlVGRFJTeFRRVUZCTzBOV05GVllPMEZWZWxWVE8wVkJRMFVzV1VGQlFUdERWakpWV0R0QlZXeFZTenM3UlVGRlJTeGhRVUZCTzBWQlEwRXNOa0pCUVVFN1ExWnZWVkE3UVZVdlZFTTdSVUZEUlN4WFFVRkJPME5XYVZWSU8wRlhjblZDUkR0RlFVTkZMRzFDUVVGQk8wVkJRMEVzVjBGQlFUdEZRVU5CTEZWQlFVRTdSVUZEUVN4elEwRkJRVHRGUVVOQkxHVkJRVUU3UTFoMWRVSkVPMEZYY25WQ1F6dEZRVU5GTEhGRFFVRkJPMFZCUVVFc05rSkJRVUU3UTFoMWRVSklPMEZYY0hWQ1F6dEZRVU5GTEdWQlFVRTdSVUZEUVN4aFFVRkJPMFZCUTBFc2EwSkJRVUU3UlVGRFFTeG5Ra0ZCUVR0RlFVTkJMR2xEUVVGQk8wVkJRMEVzWjBKQlFVRTdSVUZEUVN4cFFrRkJRVHRGUVVOQkxHbENRVUZCTzBOWWMzVkNTRHRCVjI1MVFrTTdSVUZEUlN4dFFrRkJRVHRGUVVOQkxGZEJRVUU3UlVGRFFTeFZRVUZCTzBWQlEwRXNhVUpCUVVFN1ExaHhkVUpJTzBGWGJIVkNRenM3TzBWQlIwVXNiVUpCUVVFN1JVRkRRU3hYUVVGQk8wVkJRMEVzVlVGQlFUdEZRVU5CTEZkQlFVRTdSVUZEUVN4elFrRkJRVHRGUVVOQkxHbENRVUZCTzBOWWIzVkNTRHRCVjJwMVFrTTdSVUZEUlN4cFFrRkJRVHREV0cxMVFrZzdRVmRvZFVKRE8wVkJRMFVzYTBKQlFVRTdRMWhyZFVKSU8wRlhMM1JDUXp0RlFVTkZMRlZCUVVFN1JVRkRRU3hyUWtGQlFUdEZRVU5CTEdkQ1FVRkJPMFZCUTBFc2FVSkJRVUU3UTFocGRVSklPMEZYT1hSQ1F6dEZRVU5GTEcxQ1FVRkJPMFZCUTBFc1YwRkJRVHRGUVVOQkxFOUJRVUU3UlVGRFFTeFJRVUZCTzBWQlEwRXNXVUZCUVR0RlFVTkJMR0ZCUVVFN1JVRkRRU3d3UWtGQlFUdEZRVU5CTEN0Q1FVRkJPMFZCUTBFc2EwTkJRVUU3VlVGQlFTd3dRa0ZCUVR0RlFVTkJMQ3RDUVVGQk8xVkJRVUVzZFVKQlFVRTdSVUZEUVN4cFFrRkJRVHREV0dkMVFrZzdRVmMzZEVKRE8wVkRha1UyUWl4dlFrRkJRVHRGUVVObUxIZENRVUZCTzBWQlEwY3NhVUpCUVVFN1JVUnBSV1lzWlVGQlFUdEZRVU5CTEdsQ1FVRkJPME5ZYVhWQ1NEdEJWeTkwUWtjN096dEZRVWRGTEhOQ1FVRkJPMFZCUTBFc1dVRkJRVHREV0dsMVFrdzdRVmM1ZEVKSE8wVkJRMFVzWlVGQlFUdERXR2QxUWt3N1FWYzFkRUpETzBWQlEwVXNjVUpCUVVFN1ExZzRkRUpJTzBGWGVuUkNTenM3TzBWQlIwVXNaVUZCUVR0RlFVTkJMR3RDUVVGQk8wTllNblJDVUR0QlYzUjBRa003TzBWQlJVVXNjVUpCUVVFN1JVRkJRU3h4UWtGQlFUdEZRVUZCTEdOQlFVRTdSVUZEUVN4elFrRkJRVHROUVVGQkxHdENRVUZCTzBWQlEwRXNOa0pCUVVFN1JVRkJRU3c0UWtGQlFUdE5RVUZCTERKQ1FVRkJPMVZCUVVFc2RVSkJRVUU3UlVGRFFTd3JRa0ZCUVR0RlFVTkJMRTlCUVVFN1JVRkRRU3hwUWtGQlFUdERXSGQwUWtnN1FWZHlkRUpMT3pzN08wVkJSVVVzSzBKQlFVRTdWVUZCUVN4MVFrRkJRVHREV0hsMFFsQTdRVmQwZEVKTE96dEZRVU5GTEhGQ1FVRkJPMDFCUVVFc1pVRkJRVHREV0hsMFFsQTdRVmQwZEVKTE96dEZRVU5GTEc5Q1FVRkJPMDFCUVVFc1dVRkJRVHRWUVVGQkxGRkJRVUU3UlVGRFFTeGxRVUZCTzBOWWVYUkNVRHRCVjNCMFFrTTdSVUZEUlN4cFFrRkJRVHRGUVVOQkxIbERRVUZCTzBOWWMzUkNTRHRCVjI1MFFrTTdSVUZEUlN4blFrRkJRVHRGUVVOQkxHbENRVUZCTzBOWWNYUkNTRHRCVjJ4MFFrTTdSVUZEUlN4alFVRkJPME5ZYjNSQ1NEdEJWMnAwUWtNN1JVRkRSU3hUUVVGQk8wVkJRMEVzYVVKQlFVRTdRMWh0ZEVKSU8wRkJRMFE3T3pzN08wZEJTMGM3UVVGRFNDeHpRa0ZCYzBJN1FVRkRkRUlzYzBKQlFYTkNPMEZCUTNSQ0xITkNRVUZ6UWp0QllURXlRbkJDTzBWQlEwVXNaMEpCUVVFN1JVRkRRU3hQUVVGQk8wVkJRMEVzVVVGQlFUdEZRVU5CTEZkQlFVRTdSVUZEUVN4WlFVRkJPMFZCUTBFc1dVRkJRVHRGUVVOQkxEQkNRVUZCTzBWQlEwRXNWMEZCUVR0RlFVTkJMQ3RDUVVGQk8xVkJRVUVzZFVKQlFVRTdSVUZEUVN4clJFRkJRVHRWUVVGQkxEQkRRVUZCTzBWQlEwRXNkVU5CUVVFN1EySTBNa0pJTzBGaGVqSkNRenRGVWxaelJDeHhRMEZCUVR0VlFVRkJMRFpDUVVGQk8wVlJXWEJFTEdsQ1FVRkJPMFZCUTBFc2EwSkJRVUU3UlVGRFFTeGxRVUZCTzBWQlEwRXNLMEpCUVVFN1ZVRkJRU3gxUWtGQlFUdEZRVU5CTEhWQ1FVRkJPMFZCUTBFc2FVSkJRVUU3UTJJeU1rSklPMEZoZURKQ1F6dEZRVU5GTEdsQ1FVRkJPMFZCUTBFc2JVSkJRVUU3UlVGRFFTd3lUa0ZCUVR0RlFVTkJMRzlDUVVGQk8wVkJRMEVzYlVKQlFVRTdSVUZEUVN4cFFrRkJRVHRGUVVOQkxHbENRVUZCTzBOaU1ESkNTRHRCWVhZeVFrTTdSVUZGU1N4alFVRkJPME5pZHpKQ1REdEJZWEF5UWtNN1JVRkRSU3hqUVVGQk8wTmljekpDU0R0QllYQXlRa2M3UlVGRFJTeDVRa0ZCUVR0RFluTXlRa3c3UVdGdU1rSlBPMFZCUTBVc1kwRkJRVHREWW5FeVFsUTdRV0V2TVVKRE8wVkJRMFVzWlVGQlFUdEZRVU5CTEdkQ1FVRkJPMFZCUTBFc1YwRkJRVHRGUVVOQkxFOUJRVUU3UlVGRFFTeFJRVUZCTzBWQlEwRXNXVUZCUVR0RlFVTkJMR0ZCUVVFN1JVRkRRU3hWUVVGQk8wVkJRMEVzSzBKQlFVRTdWVUZCUVN4MVFrRkJRVHRGUVVOQkxHbENRVUZCTzBWQlEwRXNNRUpCUVVFN1JVRkRRU3g1UTBGQlFUdEZRVU5CTEdsQ1FVRkJPME5pYVRKQ1NEdEJZVGN4UWtRN1JVRkRSVHRKUVVORkxGZEJRVUU3UjJJck1VSkVPME5CUTBZN1FXRnNNa0pFTzBWQlEwVTdTVUZEUlN4WFFVRkJPMGRpS3pGQ1JEdERRVU5HTzBGaE5URkNSRHRGUVVWSk8wbEJRMFVzYVVKQlFVRTdSMkkyTVVKSU8wVmhPVEZDUXp0SlFVbEpMSEZDUVVGQk8wbEJRVUVzY1VKQlFVRTdTVUZCUVN4alFVRkJPMGxCUTBFc0swSkJRVUU3U1VGQlFTdzRRa0ZCUVR0UlFVRkJMSGRDUVVGQk8xbEJRVUVzYjBKQlFVRTdTVUZEUVN4elFrRkJRVHRSUVVGQkxHdENRVUZCTzBsQlEwRXNNRUpCUVVFN1VVRkJRU3gxUWtGQlFUdFpRVUZCTEc5Q1FVRkJPMGxCUTBFc01FSkJRVUU3VVVGQlFTeHBRa0ZCUVR0SlFVTkJMRlZCUVVFN1NVRkRRU3hUUVVGQk8wbEJRMEVzY1VOQlFVRTdXVUZCUVN3MlFrRkJRVHRKUVVOQkxGbEJRVUU3U1VGRFFTeGhRVUZCTzBsQlEwRXNLMEpCUVVFN1dVRkJRU3gxUWtGQlFUdEpRVU5CTERKQ1FVRkJPMGxCUTBFc2RVSkJRVUU3U1VGRFFTeG5Ra0ZCUVR0SFlqWXhRa3c3UldFek1VSkxPMGxET1VaT0xHbENRVUZCTzBsRVowZFJMRzlDUVVGQk8xRkJRVUVzV1VGQlFUdFpRVUZCTEZGQlFVRTdTVUZEUVN4aFFVRkJPMGxCUTBFc2VVSkJRVUU3V1VGQlFTeHBRa0ZCUVR0SFlqWXhRbEE3UldGNk1VSkhPMGxCUTBVc1YwRkJRVHRKUVVOQkxIVkNRVUZCTzBsQlEwRXNLMEpCUVVFN1dVRkJRU3gxUWtGQlFUdEhZakl4UWt3N1JXRjRNVUpITzBsQlEwVXNiVUpCUVVFN1NVRkRRU3hYUVVGQk8wbEJRMEVzVlVGQlFUdEpRVU5CTEZkQlFVRTdTVUZEUVN4aFFVRkJPMGxCUTBFc2VVSkJRVUU3V1VGQlFTeHBRa0ZCUVR0SlFVTkJMR2xDUVVGQk8wZGlNREZDVER0RllYWXhRa2M3U1VSMlNIbENMRzlDUVVGQk8wbEJRMllzZDBKQlFVRTdTVU4zU0ZJc2JVSkJRVUU3U1VGRFFTeFhRVUZCTzBsQlEwRXNUMEZCUVR0SlFVTkJMRkZCUVVFN1NVRkRRU3hWUVVGQk8wbEJRMEVzV1VGQlFUdEpRVU5CTEdGQlFVRTdTVUZEUVN4clFrRkJRVHRKUVVOQkxEaENRVUZCTzBsQlEwRXNhVUpCUVVFN1NVRkRRU3hwUWtGQlFUdEpRVU5CTEhWQ1FVRkJPMGxCUTBFc2FVSkJRVUU3UjJJd01VSk1PMFZoZGpGQ1J6dEpRVU5GTEdWQlFVRTdTVUZEUVN3d1FrRkJRVHRKUVVOQkxHdENRVUZCTzBsQlEwRXNLME5CUVVFN1NVRkRRU3h0UWtGQlFUdEpRVU5CTEcxQ1FVRkJPMGRpZVRGQ1REdEZZUzh4UWtjN1NVRlRTU3hYUVVGQk8wbEJRMEVzYTBSQlFVRTdXVUZCUVN3d1EwRkJRVHRKUVVOQkxEWkRRVUZCTzBsQlEwRXNaVUZCUVR0SFlua3hRbEE3UTBGRFJqdEJZVzR4UWtRN1JVRkRSVHM3U1dKek1VSkZMR1ZCUVdVN1NXRnVNVUptTEdkQ1FVRkJPMGxpY1RGQ1FTeHRRa0ZCYlVJN1NXRnVNVUp1UWl4MVFrRkJRVHRKUVVOQkxGbEJRVUU3U1VGRFFTd3lRa0ZCUVR0SFluRXhRa1E3UlVGRFJDeFpRVUZaTzBWaGJERkNXanM3TzBsQlIwVXNjME5CUVVFN1NVRkRRU3hsUVVGQk8wZGliekZDUkR0RlFVTkVMRmxCUVZrN1JXRnFNVUphT3p0SlFVVkZMSGxDUVVGQk8wZGliVEZDUkR0RlFVTkVMSGRDUVVGM1FqdEZZV2d4UW5oQ08wbEJRMFVzV1VGQlFUdEpRVU5CTERCQ1FVRkJPMGRpYXpGQ1JEdEZZV2d4UWtRN08wbEJSVVVzTUVKQlFVRTdTVUZEUVN4clFrRkJRVHRIWW1zeFFrUTdSV0U1TUVKRE96dEpZbWt4UWtFc2EwSkJRV3RDTzBsaE9UQkNhRUlzZVVKQlFVRTdSMkpuTVVKSU8wVmhOekJDUXp0SlFVTkZMREJDUVVGQk8wbEJRMEVzYVVKQlFVRTdTV0lyTUVKR0xHRkJRV0U3U1VGRFlpeGhRVUZoTzBsQlEySXNkMEpCUVhkQ08wbEJRM2hDTERSQ1FVRTBRanRIUVVNM1FqdEZZV294UWtjN1NVRkRSU3hwUTBGQlFUdEpRVU5CTERoQ1FVRkJPMGxCUTBFc01rSkJRVUU3UjJKdE1VSk1PMFZoTHpCQ1J6dEpRVU5GTERoQ1FVRkJPMGxCUTBFc2QwSkJRVUU3U1VGRFFTeHpRa0ZCUVR0SlFVTkJMSFZDUVVGQk8wbEJRMEVzTkVKQlFVRTdSMkpwTVVKTU8wVmhOekJDUnp0SlFVTkZMSGxDUVVGQk8wZGlLekJDVER0RllUTXdRa2M3U1VGRFJTeDVRa0ZCUVR0WlFVRkJMR2xDUVVGQk8wZGlOakJDVER0RllYWXlRa003U1VFNFFra3NkMEpCUVVFN1NVRkRRU3hyUTBGQlFUdEpRVU5CTERoQ1FVRkJPMGRpTkRCQ1REdEZZVFV5UWtNN08wbEJjVU5KTEd0RFFVRkJPMGRpTWpCQ1REdEZZV2d6UWtNN096dEpRVEpEU1N4dFEwRkJRVHRQUVVGQkxHZERRVUZCTzFsQlFVRXNiMEpCUVVFN1IySXdNRUpNTzBWaGREQkNSenRKUVVORkxIbENRVUZCTzBkaWR6QkNURHREUVVOR08wRmxjR3REUkR0RlFVTkZMR2RDUVVGQk8wVkJRMEVzWlVGQlFUdEZRVU5CTEZWQlFVRTdSVUZEUVN4clEwRkJRVHRWUVVGQkxEQkNRVUZCTzBWQlEwRXNhVUpCUVVFN1EyWnphME5FTzBGbGNHdERRenRGVmtSelJDeDNRMEZCUVR0VlFVRkJMR2REUVVGQk8wVlZSM0JFTEcxQ1FVRkJPMFZCUTBFc1YwRkJRVHRGUVVOQkxHRkJRVUU3UlVGRFFTeFpRVUZCTzBWQlEwRXNZVUZCUVR0RlFVTkJMREJDUVVGQk8wVkJRMEVzYlVKQlFVRTdSVUZEUVN3clFrRkJRVHRWUVVGQkxIVkNRVUZCTzBWQlEwRXNkVUpCUVVFN1JVRkRRU3huUWtGQlFUdEZRVU5CTEcxQ1FVRkJPMFZCUTBFc1dVRkJRVHRGUVVOQkxEaERRVUZCTzBWQlFVRXNjME5CUVVFN1JVRkRRU3hwUWtGQlFUdERabk5yUTBnN1FXVndhME5ITzBWQlEwVXNaVUZCUVR0RlFVTkJMSE5DUVVGQk8wVkJRMEVzSzBKQlFVRTdWVUZCUVN4MVFrRkJRVHREWm5OclEwdzdRV1Z1YTBOSE8wVkJRMFVzWTBGQlFUdERabkZyUTB3N1FXVm9hME5IT3pzN1JVRkhSU3haUVVGQk8wVkJRMEVzYzBKQlFVRTdRMlpyYTBOTU8wRmxMMnBEUnp0RlFVTkZMR1ZCUVVFN1EyWnBhME5NTzBGbE4ycERRenRGUVVORkxHMUNRVUZCTzBWQlEwRXNWMEZCUVR0RlFVTkJMRk5CUVVFN1JVRkRRU3hWUVVGQk8wVkJRMEVzV1VGQlFUdEZRVU5CTEdGQlFVRTdSVUZEUVN4NVEwRkJRVHRWUVVGQkxHbERRVUZCTzBWQlEwRXNiVUpCUVVFN1JVRkRRU3hwUWtGQlFUdERaaXRxUTBnN1FXVXhha05MTzBWQlEwVXNXVUZCUVR0RlFVTkJMREJDUVVGQk8wVkJRMEVzYzBKQlFVRTdRMlkwYWtOUU8wRmxNV3BEVHp0RlFVTkZMRmxCUVVFN1EyWTBha05VTzBGbGRHcERTenM3TzBWQlIwVXNXVUZCUVR0RFpuZHFRMUE3UVdWc2FrTkhPMFZCUTBVc2IwSkJRVUU3UTJadmFrTk1PMEZsTjJsRFN6czdPenM3T3pzN1JVRkpSU3h2UWtGQlFUdEZRVU5CTEZsQlFVRTdSVUZEUVN4dFFrRkJRVHREWm0xcVExQTdRV1ZxYWtOUE96czdPenM3T3p0RlFVTkZMRmxCUVVFN1JVRkRRU3h0UWtGQlFUdERaakJxUTFRN1FXVjBha05MT3p0RlFVTkZMREJDUVVGQk8wTm1lV3BEVUR0QlpYQnFRME03TzBWQlJVVXNWVUZCUVR0RlFVTkJMRzlEUVVGQk8xVkJRVUVzTkVKQlFVRTdRMlp6YWtOSU8wRmxlbXBEUXpzN1JVRk5TU3h6UWtGQlFUdERablZxUTB3N1FXVnVha05ETzBWQlEwVXNWVUZCUVR0RFpuRnFRMGc3UVdWdWFrTkhPMFZCUTBVc1YwRkJRVHREWm5GcVEwdzdRV1ZxYWtORE8wVkJRMFVzWVVGQlFUdERabTFxUTBnN1FXVnFha05ITzBWQlEwVXNZMEZCUVR0RFptMXFRMHc3UVdVdmFVTkRPenRGUVVWRkxHOURRVUZCTzFWQlFVRXNORUpCUVVFN1JVRkRRU3haUVVGQk8wTm1hV3BEU0R0QlpUbHBRME03UlVGRFJTeFRRVUZCTzBWQlEwRXNXVUZCUVR0RFptZHFRMGc3UVdVNWFVTkhPMFZCUTBVc1lVRkJRVHREWm1kcVEwdzdRV1UxYVVORE8wVkJRMFVzVTBGQlFUdEZRVU5CTEZkQlFVRTdRMlk0YVVOSU8wRmxOV2xEUnp0RlFVTkZMRmxCUVVFN1EyWTRhVU5NTzBGbGNtbERTenM3T3p0RlFVTkZMR05CUVVFN1EyWXdhVU5RSWl3aVptbHNaU0k2SW1WNFlXMXdiR1V1WTNOeklpd2ljMjkxY21ObGMwTnZiblJsYm5RaU9sc2lMeW9nUFQwOVBUMGdVMk55YjJ4c1ltRnlJRDA5UFQwOUlDb3ZYRzQ2T2kxM1pXSnJhWFF0YzJOeWIyeHNZbUZ5SUh0Y2JpQWdkMmxrZEdnNklEZHdlRHRjYmlBZ2FHVnBaMmgwT2lBM2NIZzdYRzRnSUMxM1pXSnJhWFF0WW05eVpHVnlMWEpoWkdsMWN6b2dOWEI0TzF4dWZWeHVPam90ZDJWaWEybDBMWE5qY205c2JHSmhjaTEwY21GamF5MXdhV1ZqWlNCN1hHNGdJQzEzWldKcmFYUXRZbTl5WkdWeUxYSmhaR2wxY3pvZ05YQjRPMXh1ZlZ4dU9qb3RkMlZpYTJsMExYTmpjbTlzYkdKaGNpMTBhSFZ0WWpwMlpYSjBhV05oYkNCN1hHNGdJR0poWTJ0bmNtOTFibVF0WTI5c2IzSTZJSEpuWW1Fb01Dd2dNQ3dnTUN3Z01DNHlOU2s3WEc0Z0lDMTNaV0pyYVhRdFltOXlaR1Z5TFhKaFpHbDFjem9nTlhCNE8xeHVmVnh1T2pvdGQyVmlhMmwwTFhOamNtOXNiR0poY2kxMGFIVnRZanBvYjNKcGVtOXVkR0ZzSUh0Y2JpQWdZbUZqYTJkeWIzVnVaQzFqYjJ4dmNqb2djbWRpWVNnd0xDQXdMQ0F3TENBd0xqSTFLVHRjYmlBZ0xYZGxZbXRwZEMxaWIzSmtaWEl0Y21Ga2FYVnpPaUExY0hnN1hHNTlYRzQ2T2kxM1pXSnJhWFF0YzJOeWIyeHNZbUZ5T21odmRtVnlJSHRjYmlBZ1ltRmphMmR5YjNWdVpDMWpiMnh2Y2pvZ2NtZGlZU2d3TENBd0xDQXdMQ0F3TGpFMUtUdGNibjFjYmpvNkxYZGxZbXRwZEMxelkzSnZiR3hpWVhJdGRHaDFiV0k2YUc5MlpYSWdlMXh1SUNCaVlXTnJaM0p2ZFc1a0xXTnZiRzl5T2lCeVoySmhLREFzSURBc0lEQXNJREF1TXpVcE8xeHVmVnh1TG5ObFkzUnBiMjRnZTF4dUlDQnRZWEpuYVc0NklERmxiU0F3TzF4dUlDQnZkbVZ5Wm14dmR6b2dhR2xrWkdWdU8xeHVmVnh1TG5ObFkzUnBiMjVmWDJobFlXUmxjaXhjYmk1elpXTjBhVzl1WDE5amIyNTBaVzUwTEZ4dUxuTmxZM1JwYjI1ZlgyWnZiM1JsY2lCN1hHNGdJRzFoY21kcGJqb2dNRHRjYmlBZ2NHRmtaR2x1WnpvZ01DQXpaVzA3WEc0Z0lHOTJaWEptYkc5M09pQm9hV1JrWlc0N1hHNTlYRzR1YzJWamRHbHZibDlmZEdsMGJHVWdlMXh1SUNCamIyeHZjam9nSXpZMk5qdGNibjFjYmk1elpXTjBhVzl1WDE5b015QjdYRzRnSUdOdmJHOXlPaUFqTlRBM1lXWmxPMXh1SUNCbWIyNTBMWE5wZW1VNklERXVNelZsYlR0Y2JuMWNiaTV6WldOMGFXOXVYMTlvTkNCN1hHNGdJR1p2Ym5RdGMybDZaVG9nTVM0eFpXMDdYRzRnSUdOdmJHOXlPaUFqTmpZMk8xeHVmVnh1TG5ObFkzUnBiMjVmWDJnMUlIdGNiaUFnWm05dWRDMXphWHBsT2lBeFpXMDdYRzRnSUdOdmJHOXlPaUFqT1RrNU8xeHVmVnh1TG5ObFkzUnBiMjVmWDJSc0xGeHVMbk5sWTNScGIyNWZYMlIwTEZ4dUxuTmxZM1JwYjI1ZlgyUmtJSHRjYmlBZ2JXRnlaMmx1T2lBd08xeHVJQ0J3WVdSa2FXNW5PaUF3TzF4dUlDQnZkbVZ5Wm14dmR6b2dhR2xrWkdWdU8xeHVmVnh1TG5ObFkzUnBiMjVmWDJSc0lIdGNiaUFnY0c5emFYUnBiMjQ2SUhKbGJHRjBhWFpsTzF4dUlDQjZMV2x1WkdWNE9pQXhPMXh1ZlZ4dUxuTmxZM1JwYjI1ZlgyUjBJSHRjYmlBZ1pHbHpjR3hoZVRvZ2FXNXNhVzVsTFdKc2IyTnJPMXh1ZlZ4dUxuTmxZM1JwYjI1ZlgyUmtJSHRjYmlBZ1pHbHpjR3hoZVRvZ2FXNXNhVzVsTFdKc2IyTnJPMXh1SUNCamIyeHZjam9nSXpBMU9EazBNanRjYm4xY2JpNXpaV04wYVc5dVgxOXdjbVVnZTF4dUlDQnRZWEpuYVc0NklESmxiU0F3TzF4dUlDQndZV1JrYVc1bk9pQXhaVzA3WEc0Z0lHWnZiblF0YzJsNlpUb2dNVFJ3ZUR0Y2JpQWdiR2x1WlMxb1pXbG5hSFE2SURFMU1DVTdYRzRnSUhSbGVIUXRZV3hwWjI0NklHeGxablE3WEc0Z0lHSmhZMnRuY205MWJtUXRZMjlzYjNJNklDTm1ZV1poWm1FN1hHNGdJR0p2Y21SbGNqb2dNWEI0SUhOdmJHbGtJQ05rWkdRN1hHNGdJR0p2Y21SbGNpMXlZV1JwZFhNNklEUndlRHRjYmlBZ1kyOXNiM0k2SUNNMk5qWTdYRzRnSUc5MlpYSm1iRzkzT2lCaGRYUnZPMXh1ZlZ4dUxuTmxZM1JwYjI1ZlgyTnZaR1VnZTF4dUlDQmthWE53YkdGNU9pQmliRzlqYXp0Y2JpQWdiV0Z5WjJsdU9pQXdJR0YxZEc4N1hHNGdJRzkyWlhKbWJHOTNPaUJvYVdSa1pXNDdYRzU5WEc0dWMyVmpkR2x2Ymw5ZlptOXZkR1Z5SUh0Y2JpQWdZbTl5WkdWeUxYUnZjRG9nTVhCNElITnZiR2xrSUNOa1pHUTdYRzRnSUcxaGNtZHBiaTEwYjNBNklETmxiVHRjYmlBZ1ltRmphMmR5YjNWdVpDMWpiMnh2Y2pvZ0kyWmhabUZtWVR0Y2JpQWdZMjlzYjNJNklDTTVPVGs3WEc1OVhHNHVjMlZqZEdsdmJsOWZkR0ZpYkdVZ2UxeHVJQ0J0WVhKbmFXNDZJREZsYlNCaGRYUnZPMXh1SUNCM2FXUjBhRG9nTVRBd0pUdGNiaUFnWW05eVpHVnlMWFJ2Y0RvZ01YQjRJSE52Ykdsa0lDTmtaR1E3WEc1OVhHNHVjMlZqZEdsdmJsOWZkR2dzWEc0dWMyVmpkR2x2Ymw5ZmRHUWdlMXh1SUNCd1lXUmthVzVuT2lBMWNIZ2dNVFp3ZUR0Y2JpQWdiR2x1WlMxb1pXbG5hSFE2SURJMmNIZzdYRzRnSUdKdmNtUmxjaTFpYjNSMGIyMDZJREZ3ZUNCemIyeHBaQ0FqWkdSa08xeHVmVnh1TG5ObFkzUnBiMjVmWDNSb0lIdGNiaUFnZEdWNGRDMWhiR2xuYmpvZ1kyVnVkR1Z5TzF4dUlDQmlZV05yWjNKdmRXNWtMV052Ykc5eU9pQWpabUZtWVdaaE8xeHVmVnh1UUcxbFpHbGhJQ2h0WVhndGQybGtkR2c2SURVd01IQjRLU0I3WEc0Z0lDNXpaV04wYVc5dVgxOW9aV0ZrWlhJc1hHNGdJQzV6WldOMGFXOXVYMTlqYjI1MFpXNTBJSHRjYmlBZ0lDQndZV1JrYVc1bk9pQXdJREZsYlR0Y2JpQWdmVnh1ZlZ4dUxtTmhjMlVnZTF4dUlDQndiM05wZEdsdmJqb2djbVZzWVhScGRtVTdYRzRnSUhvdGFXNWtaWGc2SURFN1hHNGdJR1JwYzNCc1lYazZJR2R5YVdRN1hHNGdJR2R5YVdRdGRHVnRjR3hoZEdVdFkyOXNkVzF1Y3pvZ2NtVndaV0YwS0RJc0lERm1jaWs3WEc0Z0lHZGhjRG9nTkRCd2VEdGNiaUFnY0dGa1pHbHVaem9nTVdWdE8xeHVJQ0JpYjNKa1pYSXRkRzl3T2lBeGNIZ2djMjlzYVdRZ0kyUmtaRHRjYmlBZ1ltOXlaR1Z5TFdKdmRIUnZiVG9nTVhCNElITnZiR2xrSUNOa1pHUTdYRzRnSUc5MlpYSm1iRzkzT2lCb2FXUmtaVzQ3WEc1OVhHNHVZMkZ6WlRwaFpuUmxjaUI3WEc0Z0lHTnZiblJsYm5RNklDY25PMXh1SUNCd2IzTnBkR2x2YmpvZ1lXSnpiMngxZEdVN1hHNGdJSG90YVc1a1pYZzZJREk3WEc0Z0lIUnZjRG9nTUR0Y2JpQWdiR1ZtZERvZ05UQWxPMXh1SUNCb1pXbG5hSFE2SURFd01DVTdYRzRnSUhkcFpIUm9PaUF3TzF4dUlDQmliM0prWlhJdGJHVm1kRG9nTVhCNElITnZiR2xrSUNOa1pHUTdYRzRnSUc5MlpYSm1iRzkzT2lCb2FXUmtaVzQ3WEc1OVhHNHVZMkZ6WlY5ZmNISmxMRnh1TG1OaGMyVmZYM1JsZUhSaGNtVmhJSHRjYmlBZ1ptOXVkQzF6YVhwbE9pQXhNM0I0TzF4dUlDQnNhVzVsTFdobGFXZG9kRG9nTVRVd0pUdGNibjFjYmk1allYTmxYMTl3Y21Vc1hHNHVZMkZ6WlY5ZlkyOWtaU3hjYmk1allYTmxYMTkwWlhoMFlYSmxZU0I3WEc0Z0lHWnZiblF0Wm1GdGFXeDVPaUFuUTI5MWNtbGxjaUJPWlhjbkxDQkRiMjV6YjJ4aGN5d2dSMlZ2Y21kcFlTd2dRWEpwWVd3c0lITmhibk10YzJWeWFXWTdYRzU5WEc0dVkyRnpaVjlmY0hKbElIdGNiaUFnYldGeVoybHVPaUF3TzF4dUlDQndZV1JrYVc1bk9pQXhaVzA3WEc0Z0lHSmhZMnRuY205MWJtUXRZMjlzYjNJNklDTm1ZV1poWm1FN1hHNGdJR2hsYVdkb2REb2dNVEF3SlR0Y2JpQWdZbTl5WkdWeUxYSmhaR2wxY3pvZ05IQjRPMXh1SUNCaWIzZ3RjMmw2YVc1bk9pQmliM0prWlhJdFltOTRPMXh1SUNCdmRtVnlabXh2ZHpvZ1lYVjBienRjYm4xY2JpNWpZWE5sWDE5MGIyOXNZbUZ5SUh0Y2JpQWdiV0Z5WjJsdU9pQXdJR0YxZEc4N1hHNGdJR2hsYVdkb2REb2dNelp3ZUR0Y2JpQWdiR2x1WlMxb1pXbG5hSFE2SURNMmNIZzdYRzRnSUdadmJuUXRjMmw2WlRvZ01UUndlRHRjYmlBZ2NHRmtaR2x1WnpvZ01DQXhObkI0TzF4dUlDQjBaWGgwTFdGc2FXZHVPaUJ5YVdkb2REdGNiaUFnYjNabGNtWnNiM2M2SUdocFpHUmxianRjYm4xY2JpNWpZWE5sWDE5aFkzUnBiMjRzWEc0dVkyRnpaVjlmY21WdGIzWmxJSHRjYmlBZ1kzVnljMjl5T2lCd2IybHVkR1Z5TzF4dUlDQmpiMnh2Y2pvZ0l6QTFPRGswTWp0Y2JpQWdkWE5sY2kxelpXeGxZM1E2SUc1dmJtVTdYRzU5WEc0dVkyRnpaVjlmWVdOMGFXOXVJSHRjYmlBZ1ptOXVkQzF6YVhwbE9pQXhNM0I0TzF4dUlDQndZV1JrYVc1bkxXeGxablE2SURFd2NIZzdYRzU5WEc0dVkyRnpaVjlmWVdOMGFXOXVPbVpwY25OMExXTm9hV3hrSUh0Y2JpQWdjR0ZrWkdsdVp5MXNaV1owT2lBd08xeHVmVnh1TG1OaGMyVmZYM0psYlc5MlpTQjdYRzRnSUdac2IyRjBPaUJ5YVdkb2REdGNibjFjYmk1allYTmxYMTlqYjI1emIyeGxJSHRjYmlBZ2JXRnlaMmx1T2lBd0lHRjFkRzg3WEc0Z0lHaGxhV2RvZERvZ01UZ3djSGc3WEc0Z0lHSnZjbVJsY2pvZ01YQjRJSE52Ykdsa0lDTmtaR1E3WEc0Z0lHOTJaWEptYkc5M09pQm9hV1JrWlc0N1hHNTlYRzR1WTJGelpWOWZkR1Y0ZEdGeVpXRWdlMXh1SUNCdFlYSm5hVzQ2SURBZ1lYVjBienRjYmlBZ2QybGtkR2c2SURFd01DVTdYRzRnSUdobGFXZG9kRG9nTVRBd0pUdGNiaUFnWW05eVpHVnlPaUJ1YjI1bE8xeHVJQ0J2ZFhSc2FXNWxPaUJ1YjI1bE8xeHVJQ0J3WVdSa2FXNW5PaUF4WlcwN1hHNGdJR0p2ZUMxemFYcHBibWM2SUdKdmNtUmxjaTFpYjNnN1hHNGdJRzkyWlhKbWJHOTNPaUJoZFhSdk8xeHVmVnh1TG1OaGMyVmZYMnhwYzNRc1hHNHVZMkZ6WlY5ZmFYUmxiU0I3WEc0Z0lHMWhjbWRwYmpvZ01EdGNiaUFnY0dGa1pHbHVaem9nTUR0Y2JpQWdiR2x6ZEMxemRIbHNaUzEwZVhCbE9pQnViMjVsTzF4dUlDQnZkbVZ5Wm14dmR6b2dhR2xrWkdWdU8xeHVmVnh1TG1OaGMyVmZYMnhwYzNRZ2UxeHVJQ0JvWldsbmFIUTZJRE0yTUhCNE8xeHVJQ0JpYjNKa1pYSXRkRzl3T2lBeGNIZ2djMjlzYVdRZ0kyUmtaRHRjYmlBZ1ltOXlaR1Z5TFdKdmRIUnZiVG9nTVhCNElITnZiR2xrSUNOa1pHUTdYRzRnSUdadmJuUXRjMmw2WlRvZ01UTndlRHRjYmlBZ2IzWmxjbVpzYjNjNklHRjFkRzg3WEc1OVhHNHVZMkZ6WlY5ZmFYUmxiU0I3WEc0Z0lHaGxhV2RvZERvZ016WndlRHRjYmlBZ2JHbHVaUzFvWldsbmFIUTZJRE0yY0hnN1hHNGdJR04xY25OdmNqb2djRzlwYm5SbGNqdGNiaUFnY0dGa1pHbHVaem9nTUNBeE5uQjRPMXh1ZlZ4dUxtTmhjMlZmWDJsMFpXMDZhRzkyWlhJZ2UxeHVJQ0JpWVdOclozSnZkVzVrTFdOdmJHOXlPaUFqWmpkbU9HWTVPMXh1ZlZ4dUx5b3FYRzRnS2lCdGFYaHBibk11YkdWemN5QXRJT1czcGVXRnQrV0h2ZWFWc0Z4dUlDb2dQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBWeHVJQ29nUTNKbFlYUmxaQ0JDZVRvZ1dXRnZhR0ZwZUdsaGIxeHVJQ29nVlhCa1lYUmxPaUF5TURJeUxqTXVNVEZjYmlBcUwxeHVMeW9xWEc0Z0tpQnlZV1JwZFhNdWJHVnpjeUF0SU9XY2h1aW5rdWl1dnVlOXJpQnRhWGhwYm5nZzVZZTk1cFd3WEc0Z0tpQTlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVhHNGdLaUJEY21WaGRHVmtJRUo1T2lCWllXOW9ZV2w0YVdGdlhHNGdLaUJWY0dSaGRHVTZJREl3TWpRdU5DNHhObHh1SUNvdlhHNHZLaUE5UFQwOVBUMGc1WnlHNktlUzVxQzM1YnlQNks2KzU3MnU1WWU5NXBXd0lEMDlQVDA5UFNBcUwxeHVMbkJoY0dWeUlIdGNiaUFnWW05NExYTm9ZV1J2ZHpvZ01DQXdJRFp3ZUNBeGNIZ2dJMlJqWkdabE5qdGNiaUFnYldGeVoybHVPaUF6WlcwZ1lYVjBienRjYmlBZ2JXRjRMWGRwWkhSb09pQXhNakF3Y0hnN1hHNGdJSEJoWkdScGJtYzZJREpsYlR0Y2JpQWdZbUZqYTJkeWIzVnVaQzFqYjJ4dmNqb2dJMlptWmp0Y2JpQWdZbTk0TFhOcGVtbHVaem9nWW05eVpHVnlMV0p2ZUR0Y2JuMWNiaTV3WVhCbGNpNW1iR1Y0SUh0Y2JpQWdaR2x6Y0d4aGVUb2dabXhsZUR0Y2JpQWdabXhsZUMxa2FYSmxZM1JwYjI0NklISnZkenRjYmlBZ1pteGxlQzEzY21Gd09pQnViM2R5WVhBN1hHNGdJRzFoY21kcGJqb2dNRHRjYmlBZ2QybGtkR2c2SURFd01DVTdYRzRnSUcxaGVDMTNhV1IwYURvZ01UQXdKVHRjYmlBZ2FHVnBaMmgwT2lBeE1EQWxPMXh1SUNCd1lXUmthVzVuT2lBd08xeHVJQ0J2ZG1WeVpteHZkem9nYUdsa1pHVnVPMXh1ZlZ4dUxuQmhjR1Z5TG1ac1pYZ2dMbUZ5ZEdsamJHVWdlMXh1SUNCbWJHVjRMV1JwY21WamRHbHZiam9nWTI5c2RXMXVPMXh1SUNCM2FXUjBhRG9nTVRBd0pUdGNiaUFnWW05NExYTnBlbWx1WnpvZ1ltOXlaR1Z5TFdKdmVEdGNibjFjYmk1d1lYQmxjaTVtYkdWNElDNWhjblJwWTJ4bFgxOXRZV2x1SUh0Y2JpQWdhR1ZwWjJoME9pQXhNREFsTzF4dUlDQmliM2d0YzJsNmFXNW5PaUJpYjNKa1pYSXRZbTk0TzF4dUlDQnZkbVZ5Wm14dmR6b2dZWFYwYnp0Y2JuMWNiaTV3WVhCbGNpNW1iR1Y0SUM1aGNuUnBZMnhsWDE5aGMybGtaU0I3WEc0Z0lHSnZjbVJsY2kxeWFXZG9kRG9nTVhCNElITnZiR2xrSUNOa1kyUm1aVFk3WEc1OVhHNHVhR1ZoWkdWeUlIdGNiaUFnY0c5emFYUnBiMjQ2SUhOMGFXTnJlVHRjYmlBZ2VpMXBibVJsZURvZ016dGNiaUFnZEc5d09pQXdPMXh1SUNCdFlYSm5hVzQ2SURBZ1lYVjBienRjYmlBZ1ltOXlaR1Z5TFdKdmRIUnZiVG9nTVhCNElITnZiR2xrSUNOa1pHUTdYRzRnSUdKaFkydG5jbTkxYm1RdFkyOXNiM0k2SUNObVptWTdYRzRnSUhSbGVIUXRZV3hwWjI0NklHTmxiblJsY2p0Y2JpQWdkSEpoYm5OcGRHbHZiaTFrZFhKaGRHbHZiam9nTUM0emN6dGNiaUFnYjNabGNtWnNiM2M2SUdocFpHUmxianRjYm4xY2JpNW9aV0ZrWlhKZmMzUnBZMnQ1SUh0Y2JpQWdjR0ZrWkdsdVp5MXNaV1owT2lBeU5qQndlRHRjYm4xY2JpNWhjblJwWTJ4bElIdGNiaUFnWkdsemNHeGhlVG9nWm14bGVEdGNiaUFnWm14bGVDMWthWEpsWTNScGIyNDZJSEp2ZHp0Y2JpQWdabXhsZUMxM2NtRndPaUJ1YjNkeVlYQTdYRzRnSUhCaFpHUnBibWM2SURKbGJTQXdPMXh1SUNCbWIyNTBMWE5wZW1VNklERTJjSGc3WEc0Z0lHeHBibVV0YUdWcFoyaDBPaUF4TlRBbE8xeHVmVnh1TG1GeWRHbGpiR1ZmWDIxaGFXNGdlMXh1SUNCbWJHVjRPaUF4TzF4dUlDQndZV1JrYVc1bk9pQXdJREpsYlR0Y2JpQWdiM1psY21ac2IzYzZJR2hwWkdSbGJqdGNibjFjYmk1aGNuUnBZMnhsWDE5dFlXbHVJQzV6WldOMGFXOXVJSHRjYmlBZ2IzWmxjbVpzYjNjNklIWnBjMmxpYkdVN1hHNTlYRzR1WVhKMGFXTnNaVjlmYldGcGJpQXVjMlZqZEdsdmJsOWZZMjl1ZEdWdWRDeGNiaTVoY25ScFkyeGxYMTl0WVdsdUlDNXpaV04wYVc5dVgxOW1iMjkwWlhJc1hHNHVZWEowYVdOc1pWOWZiV0ZwYmlBdWMyVmpkR2x2Ymw5ZmFHVmhaR1Z5SUh0Y2JpQWdiM1psY21ac2IzYzZJSFpwYzJsaWJHVTdYRzU5WEc0dVlYSjBhV05zWlY5ZmJXRnBiaUF1YzJWamRHbHZibDlmYUdWaFpHVnlMRnh1TG1GeWRHbGpiR1ZmWDIxaGFXNGdMbk5sWTNScGIyNWZYMk52Ym5SbGJuUWdlMXh1SUNCdFlYSm5hVzQ2SURBN1hHNTlYRzR1WVhKMGFXTnNaVjlmWVhOcFpHVWdlMXh1SUNCbWJHVjRMWE5vY21sdWF6b2dNRHRjYmlBZ2QybGtkR2c2SURJME1IQjRPMXh1SUNCaWIzSmtaWEl0YkdWbWREb2dNWEI0SUhOdmJHbGtJQ05rWkdRN1hHNTlYRzR1WVhKMGFXTnNaVjlmWVhOcFpHVXViSFJ5SUh0Y2JpQWdZbTl5WkdWeUxYSnBaMmgwT2lBeGNIZ2djMjlzYVdRZ0kyUmtaRHRjYmlBZ1ltOXlaR1Z5TFd4bFpuUTZJRzV2Ym1VN1hHNTlYRzR1WVhKMGFXTnNaVjlmWVhOcFpHVWdMbTkxZEd4cGJtVXRibUYyYVdkaGRHOXlJSHRjYmlBZ1ltRmphMmR5YjNWdVpDMWpiMnh2Y2pvZ0kyWm1aanRjYm4xY2JuQnlaU3hjYmk1elpXTjBhVzl1WDE5d2NtVWdlMXh1SUNCd1lXUmthVzVuT2lBeVpXMDdYRzRnSUdadmJuUXRabUZ0YVd4NU9pQW5RMjkxY21sbGNpQk9aWGNuTENCQmNtbGhiQ3dnYzJGdWN5MXpaWEpwWmp0Y2JpQWdZbUZqYTJkeWIzVnVaQzFqYjJ4dmNqb2dJMlpoWm1GbVlUdGNiaUFnYjNabGNtWnNiM2M2SUdGMWRHODdYRzU5WEc1amIyUmxMRnh1TG5ObFkzUnBiMjVmWDJOdlpHVWdlMXh1SUNCbWIyNTBMV1poYldsc2VUb2dKME52ZFhKcFpYSWdUbVYzSnl3Z1FYSnBZV3dzSUhOaGJuTXRjMlZ5YVdZN1hHNGdJR1p2Ym5RdGMybDZaVG9nTVRad2VEdGNibjFjYmk1bWIyOTBaWElnZTF4dUlDQmliM0prWlhJdGRHOXdPaUF4Y0hnZ2MyOXNhV1FnSTJSalpHWmxOanRjYmlBZ2NHRmtaR2x1WnpvZ00yVnRJREE3WEc0Z0lIUmxlSFF0WVd4cFoyNDZJR05sYm5SbGNqdGNibjFjYmk1bWIyOTBaWElnWVRwc2FXNXJMRnh1TG1admIzUmxjaUJoT25acGMybDBaV1FzWEc0dVptOXZkR1Z5SUdFNmFHOTJaWElnZTF4dUlDQjBaWGgwTFdSbFkyOXlZWFJwYjI0NklHNXZibVU3WEc0Z0lHTnZiRzl5T2lBak1EVTRPVFF5TzF4dWZWeHVMbVp2YjNSbGNpQmhPbWh2ZG1WeUlIdGNiaUFnZEdWNGRDMWtaV052Y21GMGFXOXVPaUIxYm1SbGNteHBibVU3WEc1OVhHNHVkWFJwYkhNdFltOXlaR1Z5TFhKcFoyaDBJSHRjYmlBZ1ltOXlaR1Z5TFhKcFoyaDBPaUF4Y0hnZ2MyOXNhV1FnSTJSalpHWmxOanRjYm4xY2JpNW9hV1JrWlc0Z2UxeHVJQ0JrYVhOd2JHRjVPaUJ1YjI1bE8xeHVmVnh1UUcxbFpHbGhJQ2h0WVhndGQybGtkR2c2SURVd01IQjRLU0I3WEc0Z0lHaDBiV3dzWEc0Z0lHSnZaSGtnZTF4dUlDQWdJRzFoY21kcGJqb2dNRHRjYmlBZ2ZWeHVJQ0F1Y0dGd1pYSWdlMXh1SUNBZ0lHMWhjbWRwYmpvZ01EdGNiaUFnSUNCd1lXUmthVzVuT2lBd08xeHVJQ0I5WEc0Z0lDNWhjblJwWTJ4bFgxOXRZV2x1SUh0Y2JpQWdJQ0J3WVdSa2FXNW5PaUF3SURKbGJUdGNiaUFnZlZ4dWZWeHVPbkp2YjNRZ2UxeHVJQ0F0TFc5MWRHeHBibVV0ZWtsdVpHVjRPaUF5TURBd08xeHVJQ0F0TFc5MWRHeHBibVV0YzNScFkydDVMV2hsYVdkb2REb2dNVEF3SlR0Y2JpQWdMUzF2ZFhSc2FXNWxMVzVoZG1sbllYUnZjaTEzYVdSMGFEb2dNVEF3SlR0Y2JuMWNiaThxSUQwOVBUMDlQVDA5UFQwZ1kyOXNiM0p6TG5Sb1pXMWxJQzBnNVorNjU2R0E2YUtjNklteTVZK1k2WWVQNlp1RzVaQ0lJRDA5UFQwOVBUMDlQVDBnS2k5Y2JpOHFLbHh1SUNvZ1pXeHNhWEJ6YVhNdWJHVnpjeUF0SU9hV2grYWNyT2VjZ2VlVnBTQnRhWGhwYm5nZzVZZTk1cFd3WEc0Z0tpQTlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVhHNGdLaUJEY21WaGRHVmtJRUo1T2lCWllXOW9ZV2w0YVdGdlhHNGdLaUJWY0dSaGRHVTZJREl3TWpJdU15NHhNVnh1SUNvdlhHNHZLaUE5UFQwOVBUMGc1cGFINXB5czU1eUI1NVdsNVllOTVwV3dJRDA5UFQwOVBTQXFMMXh1THlvcVhHNGdLaUJ6YUdGa2IzY3ViR1Z6Y3lBdElPbVl0T1c5c2VhZ3QrVzhqK2l1dnVlOXJpQnRhWGhwYm5nZzVZZTk1cFd3WEc0Z0tpQTlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVhHNGdLaUJEY21WaGRHVmtJRUo1T2lCWllXOW9ZV2w0YVdGdlhHNGdLaUJWY0dSaGRHVTZJREl3TWpJdU15NHlNRnh1SUNvdlhHNHZLaUE5UFQwOVBUMGc2WmkwNWIyeDVxQzM1YnlQNks2KzU3MnU1WWU5NXBXd0lEMDlQVDA5UFNBcUwxeHVMeW9nUFQwOVBUMDlQVDA5UFNCcFkyOXVMblJvWlcxbElDMGdjM1puSU9XYnZ1YWdoK2VhaE9hZ3QrVzhqeUE5UFQwOVBUMDlQVDA5SUNvdlhHNHViM1YwYkdsdVpTMXBZMjl1SUh0Y2JpQWdjRzl6YVhScGIyNDZJSEpsYkdGMGFYWmxPMXh1SUNCNkxXbHVaR1Y0T2lBeE8xeHVJQ0JrYVhOd2JHRjVPaUJwYm14cGJtVXRZbXh2WTJzN1hHNGdJSFpsY25ScFkyRnNMV0ZzYVdkdU9pQnRhV1JrYkdVN1hHNGdJSGRwWkhSb09pQXhaVzA3WEc0Z0lHaGxhV2RvZERvZ01XVnRPMXh1SUNCdmRtVnlabXh2ZHpvZ2FHbGtaR1Z1TzF4dWZWeHVMbTkxZEd4cGJtVXRhV052Ymw5ZmMzWm5JSHRjYmlBZ2NHOXphWFJwYjI0NklHRmljMjlzZFhSbE8xeHVJQ0I2TFdsdVpHVjRPaUF5TzF4dUlDQjBiM0E2SURVd0pUdGNiaUFnYkdWbWREb2dOVEFsTzF4dUlDQjNhV1IwYURvZ01XVnRPMXh1SUNCb1pXbG5hSFE2SURGbGJUdGNiaUFnWm1sc2JEb2dZM1Z5Y21WdWRHTnZiRzl5TzF4dUlDQjBjbUZ1YzJadmNtMDZJSFJ5WVc1emJHRjBaU2d0TlRBbExDQXROVEFsS1R0Y2JpQWdiM1psY21ac2IzYzZJR2hwWkdSbGJqdGNibjFjYmk1dmRYUnNhVzVsTFdsamIyNWZhR2xrWkdWdUlIdGNiaUFnWkdsemNHeGhlVG9nYm05dVpUdGNibjFjYmk4cUlEMDlQVDA5SUZOamNtOXNiR0poY2lBOVBUMDlQU0FxTDF4dU9qb3RkMlZpYTJsMExYTmpjbTlzYkdKaGNpQjdYRzRnSUhkcFpIUm9PaUEzY0hnN1hHNGdJR2hsYVdkb2REb2dOM0I0TzF4dUlDQXRkMlZpYTJsMExXSnZjbVJsY2kxeVlXUnBkWE02SURWd2VEdGNibjFjYmpvNkxYZGxZbXRwZEMxelkzSnZiR3hpWVhJdGRISmhZMnN0Y0dsbFkyVWdlMXh1SUNBdGQyVmlhMmwwTFdKdmNtUmxjaTF5WVdScGRYTTZJRFZ3ZUR0Y2JuMWNiam82TFhkbFltdHBkQzF6WTNKdmJHeGlZWEl0ZEdoMWJXSTZkbVZ5ZEdsallXd2dlMXh1SUNCaVlXTnJaM0p2ZFc1a0xXTnZiRzl5T2lCeVoySmhLREFzSURBc0lEQXNJREF1TWpVcE8xeHVJQ0F0ZDJWaWEybDBMV0p2Y21SbGNpMXlZV1JwZFhNNklEVndlRHRjYm4xY2JqbzZMWGRsWW10cGRDMXpZM0p2Ykd4aVlYSXRkR2gxYldJNmFHOXlhWHB2Ym5SaGJDQjdYRzRnSUdKaFkydG5jbTkxYm1RdFkyOXNiM0k2SUhKblltRW9NQ3dnTUN3Z01Dd2dNQzR5TlNrN1hHNGdJQzEzWldKcmFYUXRZbTl5WkdWeUxYSmhaR2wxY3pvZ05YQjRPMXh1ZlZ4dU9qb3RkMlZpYTJsMExYTmpjbTlzYkdKaGNpMTBhSFZ0WWpwb2IzWmxjaUI3WEc0Z0lHSmhZMnRuY205MWJtUXRZMjlzYjNJNklISm5ZbUVvTUN3Z01Dd2dNQ3dnTUM0ek5TazdYRzU5WEc0Nk9pMTNaV0pyYVhRdGMyTnliMnhzWW1GeU9taHZkbVZ5SUh0Y2JpQWdZbUZqYTJkeWIzVnVaQzFqYjJ4dmNqb2djbWRpWVNnd0xDQXdMQ0F3TENBd0xqRTFLVHRjYm4xY2JpNXZkWFJzYVc1bExXaGxZV1JwYm1jZ2UxeHVJQ0J3YjNOcGRHbHZiam9nY21Wc1lYUnBkbVU3WEc0Z0lIb3RhVzVrWlhnNklERTdYRzRnSUc5MlpYSm1iRzkzT2lCb2FXUmtaVzQ3WEc1OVhHNHViM1YwYkdsdVpTMW9aV0ZrYVc1blgxOWhibU5vYjNJZ2UxeHVJQ0JrYVhOd2JHRjVPaUJ1YjI1bE8xeHVmVnh1TG05MWRHeHBibVV0YUdWaFpHbHVaMTlmWVc1amFHOXlPbXhwYm1zc1hHNHViM1YwYkdsdVpTMW9aV0ZrYVc1blgxOWhibU5vYjNJNmRtbHphWFJsWkN4Y2JpNXZkWFJzYVc1bExXaGxZV1JwYm1kZlgyRnVZMmh2Y2pwb2IzWmxjaUI3WEc0Z0lHTnZiRzl5T2lBak9UazVPMXh1SUNCMFpYaDBMV1JsWTI5eVlYUnBiMjQ2SUc1dmJtVTdYRzU5WEc0dWIzVjBiR2x1WlMxb1pXRmthVzVuWDE5aGJtTm9iM0k2YUc5MlpYSWdlMXh1SUNCamIyeHZjam9nSXpVd04yRm1aVHRjYm4xY2JpNXZkWFJzYVc1bExXaGxZV1JwYm1jNmFHOTJaWElnTG05MWRHeHBibVV0YUdWaFpHbHVaMTlmWVc1amFHOXlJSHRjYmlBZ1pHbHpjR3hoZVRvZ2FXNXNhVzVsTFdKc2IyTnJPMXh1ZlZ4dUxtOTFkR3hwYm1VdGFHVmhaR2x1WjE5emRHRnlkRHBvYjNabGNpQjdYRzRnSUc5MlpYSm1iRzkzT2lCMmFYTnBZbXhsTzF4dWZWeHVMbTkxZEd4cGJtVXRhR1ZoWkdsdVoxOXpkR0Z5ZENBdWIzVjBiR2x1WlMxb1pXRmthVzVuWDE5aGJtTm9iM0lnZTF4dUlDQndiM05wZEdsdmJqb2dZV0p6YjJ4MWRHVTdYRzRnSUhvdGFXNWtaWGc2SURJN1hHNGdJSFJ2Y0RvZ05UQWxPMXh1SUNCMGNtRnVjMlp2Y20wNklIUnlZVzV6YkdGMFpWa29MVFV3SlNrN1hHNGdJR3hsWm5RNklDMHhaVzA3WEc1OVhHNHViM1YwYkdsdVpTMWtjbUYzWlhJZ2UxeHVJQ0J3YjNOcGRHbHZiam9nY21Wc1lYUnBkbVU3WEc0Z0lIb3RhVzVrWlhnNklDMHhPMXh1SUNCMGIzQTZJREE3WEc0Z0lHeGxablE2SURBN1hHNGdJRzFoY21kcGJqb2dNRHRjYmlBZ2QybGtkR2c2SURFd01DVTdYRzRnSUdobGFXZG9kRG9nTVRBd0pUdGNiaUFnWW05NExYTnBlbWx1WnpvZ1ltOXlaR1Z5TFdKdmVEdGNiaUFnZG1semFXSnBiR2wwZVRvZ2FHbGtaR1Z1TzF4dUlDQnZkbVZ5Wm14dmR6b2dhR2xrWkdWdU8xeHVmVnh1TG05MWRHeHBibVV0WkhKaGQyVnlYMTl0YjJSaGJDQjdYRzRnSUdKdmVDMXphR0ZrYjNjNklEQWdNQ0EyY0hnZ01YQjRJQ05rWTJSbVpUWTdYRzRnSUdScGMzQnNZWGs2SUdac1pYZzdYRzRnSUdac1pYZ3RaR2x5WldOMGFXOXVPaUJqYjJ4MWJXNDdYRzRnSUdac1pYZ3RkM0poY0RvZ2JtOTNjbUZ3TzF4dUlDQndiM05wZEdsdmJqb2dZV0p6YjJ4MWRHVTdYRzRnSUhvdGFXNWtaWGc2SURJeE8xeHVJQ0JvWldsbmFIUTZJREV3TUNVN1hHNGdJR0poWTJ0bmNtOTFibVF0WTI5c2IzSTZJQ05tWm1ZN1hHNGdJSFJ5WVc1emFYUnBiMjR0WkhWeVlYUnBiMjQ2SURBdU5ITTdYRzRnSUc5MlpYSm1iRzkzT2lCb2FXUmtaVzQ3WEc1OVhHNHViM1YwYkdsdVpTMWtjbUYzWlhKZlgyaGxZV1JsY2l4Y2JpNXZkWFJzYVc1bExXUnlZWGRsY2w5ZmJXRnBiaXhjYmk1dmRYUnNhVzVsTFdSeVlYZGxjbDlmWm05dmRHVnlJSHRjYmlBZ2QybGtkR2c2SURFd01DVTdYRzRnSUdKdmVDMXphWHBwYm1jNklHSnZjbVJsY2kxaWIzZzdYRzU5WEc0dWIzVjBiR2x1WlMxa2NtRjNaWEpmWDJobFlXUmxjaXhjYmk1dmRYUnNhVzVsTFdSeVlYZGxjbDlmWm05dmRHVnlJSHRjYmlBZ1pteGxlQzF6YUhKcGJtczZJREE3WEc1OVhHNHViM1YwYkdsdVpTMWtjbUYzWlhKZlgzUnBkR3hsTEZ4dUxtOTFkR3hwYm1VdFpISmhkMlZ5WDE5dFlXbHVMRnh1TG05MWRHeHBibVV0WkhKaGQyVnlYMTltYjI5MFpYSWdlMXh1SUNCd1lXUmthVzVuT2lBd0lERTJjSGc3WEc1OVhHNHViM1YwYkdsdVpTMWtjbUYzWlhKZlgyaGxZV1JsY2l4Y2JpNXZkWFJzYVc1bExXUnlZWGRsY2w5ZmRHbDBiR1VnZTF4dUlDQndiM05wZEdsdmJqb2djbVZzWVhScGRtVTdYRzRnSUhvdGFXNWtaWGc2SURFN1hHNGdJRzFoY21kcGJqb2dNQ0JoZFhSdk8xeHVJQ0JvWldsbmFIUTZJRFV5Y0hnN1hHNGdJR3hwYm1VdGFHVnBaMmgwT2lBMU1uQjRPMXh1SUNCdmRtVnlabXh2ZHpvZ2FHbGtaR1Z1TzF4dWZWeHVMbTkxZEd4cGJtVXRaSEpoZDJWeVgxOTBhWFJzWlNCN1hHNGdJR1p2Ym5RdGMybDZaVG9nTVRad2VEdGNiaUFnWm05dWRDMTNaV2xuYUhRNklEUXdNRHRjYmlBZ2JXRnlaMmx1T2lBd0lERTJjSGc3WEc0Z0lHSnZlQzF6YVhwcGJtYzZJR0p2Y21SbGNpMWliM2c3WEc0Z0lHSnZjbVJsY2kxaWIzUjBiMjA2SURGd2VDQnpiMnhwWkNBalpHTmtabVUyTzF4dWZWeHVMbTkxZEd4cGJtVXRaSEpoZDJWeVgxOWpiRzl6WlNCN1hHNGdJSEJ2YzJsMGFXOXVPaUJoWW5OdmJIVjBaVHRjYmlBZ2VpMXBibVJsZURvZ01qdGNiaUFnZEc5d09pQTFNQ1U3WEc0Z0lISnBaMmgwT2lBeE1uQjRPMXh1SUNCM2FXUjBhRG9nTWpCd2VEdGNiaUFnYUdWcFoyaDBPaUF5TUhCNE8xeHVJQ0JzYVc1bExXaGxhV2RvZERvZ01qQndlRHRjYmlBZ1kyOXNiM0k2SUNNNU9UazdYRzRnSUdadmJuUXRjMmw2WlRvZ01qQndlRHRjYmlBZ2RHVjRkQzFoYkdsbmJqb2dZMlZ1ZEdWeU8xeHVJQ0JqZFhKemIzSTZJSEJ2YVc1MFpYSTdYRzRnSUhSeVlXNXpabTl5YlRvZ2RISmhibk5zWVhSbFdTZ3ROVEFsS1R0Y2JpQWdiM1psY21ac2IzYzZJR2hwWkdSbGJqdGNibjFjYmk1dmRYUnNhVzVsTFdSeVlYZGxjbDlmWTJ4dmMyVWdMbTkxZEd4cGJtVXRhV052YmlCN1hHNGdJSEJ2YzJsMGFXOXVPaUJoWW5OdmJIVjBaVHRjYmlBZ2VpMXBibVJsZURvZ01qdGNiaUFnZEc5d09pQXdPMXh1SUNCc1pXWjBPaUF3TzF4dWZWeHVMbTkxZEd4cGJtVXRaSEpoZDJWeVgxOWpiRzl6WlRwb2IzWmxjaUI3WEc0Z0lHTnZiRzl5T2lBak5qWTJPMXh1ZlZ4dUxtOTFkR3hwYm1VdFpISmhkMlZ5WDE5dFlXbHVJSHRjYmlBZ1pteGxlRG9nTVR0Y2JpQWdiM1psY21ac2IzYzZJR0YxZEc4N1hHNTlYRzR1YjNWMGJHbHVaUzFrY21GM1pYSmZYMjFoYVc0dWIzWmxjbVpzYjNjdGFHbGtaR1Z1SUh0Y2JpQWdiM1psY21ac2IzYzZJR2hwWkdSbGJqdGNibjFjYmk1dmRYUnNhVzVsTFdSeVlYZGxjbDlmWm05dmRHVnlJSHRjYmlBZ2JXRnlaMmx1T2lBd0lHRjFkRzg3WEc0Z0lIUmxlSFF0WVd4cFoyNDZJSEpwWjJoME8xeHVJQ0J2ZG1WeVpteHZkem9nYUdsa1pHVnVPMXh1ZlZ4dUxtOTFkR3hwYm1VdFpISmhkMlZ5WDE5dmRtVnliR0Y1SUh0Y2JpQWdZMjl1ZEdWdWREb2dKeWM3WEc0Z0lIQnZjMmwwYVc5dU9pQnlaV3hoZEdsMlpUdGNiaUFnZWkxcGJtUmxlRG9nTVR0Y2JpQWdkRzl3T2lBd08xeHVJQ0JzWldaME9pQXdPMXh1SUNCM2FXUjBhRG9nTVRBd0pUdGNiaUFnYUdWcFoyaDBPaUF4TURBbE8xeHVJQ0JpWVdOclozSnZkVzVrTFdOdmJHOXlPaUFqWm1abU8xeHVJQ0J2Y0dGamFYUjVPaUF3TGpFN1hHNGdJRzkyWlhKbWJHOTNPaUJvYVdSa1pXNDdYRzU5WEc0dWIzVjBiR2x1WlMxa2NtRjNaWEpmY25Sc0xtOTFkR3hwYm1VdFpISmhkMlZ5WDNScGJua3NYRzR1YjNWMGJHbHVaUzFrY21GM1pYSmZiSFJ5TG05MWRHeHBibVV0WkhKaGQyVnlYM1JwYm5rZ2UxeHVJQ0IzYVdSMGFEb2dNamd3Y0hnN1hHNTlYRzR1YjNWMGJHbHVaUzFrY21GM1pYSmZjblJzTG05MWRHeHBibVV0WkhKaGQyVnlYMjFwYm1rc1hHNHViM1YwYkdsdVpTMWtjbUYzWlhKZmJIUnlMbTkxZEd4cGJtVXRaSEpoZDJWeVgyMXBibWtnZTF4dUlDQjNhV1IwYURvZ05EZ3djSGc3WEc1OVhHNHViM1YwYkdsdVpTMWtjbUYzWlhKZmNuUnNMbTkxZEd4cGJtVXRaSEpoZDJWeVgzTnRZV3hzTEZ4dUxtOTFkR3hwYm1VdFpISmhkMlZ5WDJ4MGNpNXZkWFJzYVc1bExXUnlZWGRsY2w5emJXRnNiQ0I3WEc0Z0lIZHBaSFJvT2lBMU5EQndlRHRjYm4xY2JpNXZkWFJzYVc1bExXUnlZWGRsY2w5eWRHd3ViM1YwYkdsdVpTMWtjbUYzWlhKZmNtVm5kV3hoY2l4Y2JpNXZkWFJzYVc1bExXUnlZWGRsY2w5c2RISXViM1YwYkdsdVpTMWtjbUYzWlhKZmNtVm5kV3hoY2lCN1hHNGdJSGRwWkhSb09pQTJPREJ3ZUR0Y2JuMWNiaTV2ZFhSc2FXNWxMV1J5WVhkbGNsOXlkR3d1YjNWMGJHbHVaUzFrY21GM1pYSmZiV1ZrYVhWdExGeHVMbTkxZEd4cGJtVXRaSEpoZDJWeVgyeDBjaTV2ZFhSc2FXNWxMV1J5WVhkbGNsOXRaV1JwZFcwZ2UxeHVJQ0IzYVdSMGFEb2dOekl3Y0hnN1hHNTlYRzR1YjNWMGJHbHVaUzFrY21GM1pYSmZjblJzTG05MWRHeHBibVV0WkhKaGQyVnlYMnhoY21kbExGeHVMbTkxZEd4cGJtVXRaSEpoZDJWeVgyeDBjaTV2ZFhSc2FXNWxMV1J5WVhkbGNsOXNZWEpuWlNCN1hHNGdJSGRwWkhSb09pQTVOakJ3ZUR0Y2JuMWNiaTV2ZFhSc2FXNWxMV1J5WVhkbGNsOXlkR3dnZTF4dUlDQmliM0prWlhJdGJHVm1kRG9nTVhCNElITnZiR2xrSUNOa1kyUm1aVFk3WEc1OVhHNHViM1YwYkdsdVpTMWtjbUYzWlhKZmNuUnNMbTkxZEd4cGJtVXRaSEpoZDJWeVgzUnBibmt1YjNWMGJHbHVaUzFrY21GM1pYSmZZMnh2YzJWa0lIdGNiaUFnY21sbmFIUTZJQzB5T1RCd2VEdGNibjFjYmk1dmRYUnNhVzVsTFdSeVlYZGxjbDl5ZEd3dWIzVjBiR2x1WlMxa2NtRjNaWEpmYldsdWFTNXZkWFJzYVc1bExXUnlZWGRsY2w5amJHOXpaV1FnZTF4dUlDQnlhV2RvZERvZ0xUUTVNSEI0TzF4dWZWeHVMbTkxZEd4cGJtVXRaSEpoZDJWeVgzSjBiQzV2ZFhSc2FXNWxMV1J5WVhkbGNsOXpiV0ZzYkM1dmRYUnNhVzVsTFdSeVlYZGxjbDlqYkc5elpXUWdlMXh1SUNCeWFXZG9kRG9nTFRVMU1IQjRPMXh1ZlZ4dUxtOTFkR3hwYm1VdFpISmhkMlZ5WDNKMGJDNXZkWFJzYVc1bExXUnlZWGRsY2w5eVpXZDFiR0Z5TG05MWRHeHBibVV0WkhKaGQyVnlYMk5zYjNObFpDQjdYRzRnSUhKcFoyaDBPaUF0Tmprd2NIZzdYRzU5WEc0dWIzVjBiR2x1WlMxa2NtRjNaWEpmY25Sc0xtOTFkR3hwYm1VdFpISmhkMlZ5WDIxbFpHbDFiUzV2ZFhSc2FXNWxMV1J5WVhkbGNsOWpiRzl6WldRZ2UxeHVJQ0J5YVdkb2REb2dMVGN6TUhCNE8xeHVmVnh1TG05MWRHeHBibVV0WkhKaGQyVnlYM0owYkM1dmRYUnNhVzVsTFdSeVlYZGxjbDlzWVhKblpTNXZkWFJzYVc1bExXUnlZWGRsY2w5amJHOXpaV1FnZTF4dUlDQnlhV2RvZERvZ0xUazNNSEI0TzF4dWZWeHVMbTkxZEd4cGJtVXRaSEpoZDJWeVgyeDBjaUI3WEc0Z0lHSnZjbVJsY2kxeWFXZG9kRG9nTVhCNElITnZiR2xrSUNOa1kyUm1aVFk3WEc1OVhHNHViM1YwYkdsdVpTMWtjbUYzWlhKZmJIUnlMbTkxZEd4cGJtVXRaSEpoZDJWeVgzUnBibmt1YjNWMGJHbHVaUzFrY21GM1pYSmZZMnh2YzJWa0lIdGNiaUFnYkdWbWREb2dMVEk1TUhCNE8xeHVmVnh1TG05MWRHeHBibVV0WkhKaGQyVnlYMngwY2k1dmRYUnNhVzVsTFdSeVlYZGxjbDl0YVc1cExtOTFkR3hwYm1VdFpISmhkMlZ5WDJOc2IzTmxaQ0I3WEc0Z0lHeGxablE2SUMwME9UQndlRHRjYm4xY2JpNXZkWFJzYVc1bExXUnlZWGRsY2w5c2RISXViM1YwYkdsdVpTMWtjbUYzWlhKZmMyMWhiR3d1YjNWMGJHbHVaUzFrY21GM1pYSmZZMnh2YzJWa0lIdGNiaUFnYkdWbWREb2dMVFUxTUhCNE8xeHVmVnh1TG05MWRHeHBibVV0WkhKaGQyVnlYMngwY2k1dmRYUnNhVzVsTFdSeVlYZGxjbDl5WldkMWJHRnlMbTkxZEd4cGJtVXRaSEpoZDJWeVgyTnNiM05sWkNCN1hHNGdJR3hsWm5RNklDMDJPVEJ3ZUR0Y2JuMWNiaTV2ZFhSc2FXNWxMV1J5WVhkbGNsOXNkSEl1YjNWMGJHbHVaUzFrY21GM1pYSmZiV1ZrYVhWdExtOTFkR3hwYm1VdFpISmhkMlZ5WDJOc2IzTmxaQ0I3WEc0Z0lHeGxablE2SUMwM016QndlRHRjYm4xY2JpNXZkWFJzYVc1bExXUnlZWGRsY2w5c2RISXViM1YwYkdsdVpTMWtjbUYzWlhKZmJHRnlaMlV1YjNWMGJHbHVaUzFrY21GM1pYSmZZMnh2YzJWa0lIdGNiaUFnYkdWbWREb2dMVGszTUhCNE8xeHVmVnh1TG05MWRHeHBibVV0WkhKaGQyVnlYM1IwWWl4Y2JpNXZkWFJzYVc1bExXUnlZWGRsY2w5aWRIUWdlMXh1SUNCc1pXWjBPaUF3TzF4dUlDQjNhV1IwYURvZ01UQXdKVHRjYm4xY2JpNXZkWFJzYVc1bExXUnlZWGRsY2w5MGRHSXViM1YwYkdsdVpTMWtjbUYzWlhKZmRHbHVlU3hjYmk1dmRYUnNhVzVsTFdSeVlYZGxjbDlpZEhRdWIzVjBiR2x1WlMxa2NtRjNaWEpmZEdsdWVTQjdYRzRnSUdobGFXZG9kRG9nTWpRd2NIZzdYRzU5WEc0dWIzVjBiR2x1WlMxa2NtRjNaWEpmZEhSaUxtOTFkR3hwYm1VdFpISmhkMlZ5WDIxcGJta3NYRzR1YjNWMGJHbHVaUzFrY21GM1pYSmZZblIwTG05MWRHeHBibVV0WkhKaGQyVnlYMjFwYm1rZ2UxeHVJQ0JvWldsbmFIUTZJRE15TUhCNE8xeHVmVnh1TG05MWRHeHBibVV0WkhKaGQyVnlYM1IwWWk1dmRYUnNhVzVsTFdSeVlYZGxjbDl6YldGc2JDeGNiaTV2ZFhSc2FXNWxMV1J5WVhkbGNsOWlkSFF1YjNWMGJHbHVaUzFrY21GM1pYSmZjMjFoYkd3Z2UxeHVJQ0JvWldsbmFIUTZJRE0yTUhCNE8xeHVmVnh1TG05MWRHeHBibVV0WkhKaGQyVnlYM1IwWWk1dmRYUnNhVzVsTFdSeVlYZGxjbDl5WldkMWJHRnlMRnh1TG05MWRHeHBibVV0WkhKaGQyVnlYMkowZEM1dmRYUnNhVzVsTFdSeVlYZGxjbDl5WldkMWJHRnlJSHRjYmlBZ2FHVnBaMmgwT2lBME1EQndlRHRjYm4xY2JpNXZkWFJzYVc1bExXUnlZWGRsY2w5MGRHSXViM1YwYkdsdVpTMWtjbUYzWlhKZmJXVmthWFZ0TEZ4dUxtOTFkR3hwYm1VdFpISmhkMlZ5WDJKMGRDNXZkWFJzYVc1bExXUnlZWGRsY2w5dFpXUnBkVzBnZTF4dUlDQm9aV2xuYUhRNklEUTBNSEI0TzF4dWZWeHVMbTkxZEd4cGJtVXRaSEpoZDJWeVgzUjBZaTV2ZFhSc2FXNWxMV1J5WVhkbGNsOXNZWEpuWlN4Y2JpNXZkWFJzYVc1bExXUnlZWGRsY2w5aWRIUXViM1YwYkdsdVpTMWtjbUYzWlhKZmJHRnlaMlVnZTF4dUlDQm9aV2xuYUhRNklEUTRNSEI0TzF4dWZWeHVMbTkxZEd4cGJtVXRaSEpoZDJWeVgzUjBZaUI3WEc0Z0lHSnZjbVJsY2kxaWIzUjBiMjA2SURGd2VDQnpiMnhwWkNBalpHTmtabVUyTzF4dWZWeHVMbTkxZEd4cGJtVXRaSEpoZDJWeVgzUjBZaTV2ZFhSc2FXNWxMV1J5WVhkbGNsOTBhVzU1TG05MWRHeHBibVV0WkhKaGQyVnlYMk5zYjNObFpDQjdYRzRnSUhSdmNEb2dMVEkxTUhCNE8xeHVmVnh1TG05MWRHeHBibVV0WkhKaGQyVnlYM1IwWWk1dmRYUnNhVzVsTFdSeVlYZGxjbDl0YVc1cExtOTFkR3hwYm1VdFpISmhkMlZ5WDJOc2IzTmxaQ0I3WEc0Z0lIUnZjRG9nTFRNek1IQjRPMXh1ZlZ4dUxtOTFkR3hwYm1VdFpISmhkMlZ5WDNSMFlpNXZkWFJzYVc1bExXUnlZWGRsY2w5emJXRnNiQzV2ZFhSc2FXNWxMV1J5WVhkbGNsOWpiRzl6WldRZ2UxeHVJQ0IwYjNBNklDMHpOekJ3ZUR0Y2JuMWNiaTV2ZFhSc2FXNWxMV1J5WVhkbGNsOTBkR0l1YjNWMGJHbHVaUzFrY21GM1pYSmZjbVZuZFd4aGNpNXZkWFJzYVc1bExXUnlZWGRsY2w5amJHOXpaV1FnZTF4dUlDQjBiM0E2SUMwME1UQndlRHRjYm4xY2JpNXZkWFJzYVc1bExXUnlZWGRsY2w5MGRHSXViM1YwYkdsdVpTMWtjbUYzWlhKZmJXVmthWFZ0TG05MWRHeHBibVV0WkhKaGQyVnlYMk5zYjNObFpDQjdYRzRnSUhSdmNEb2dMVFExTUhCNE8xeHVmVnh1TG05MWRHeHBibVV0WkhKaGQyVnlYM1IwWWk1dmRYUnNhVzVsTFdSeVlYZGxjbDlzWVhKblpTNXZkWFJzYVc1bExXUnlZWGRsY2w5amJHOXpaV1FnZTF4dUlDQjBiM0E2SUMwME9UQndlRHRjYm4xY2JpNXZkWFJzYVc1bExXUnlZWGRsY2w5aWRIUWdlMXh1SUNCMGIzQTZJR2x1YVhScFlXdzdYRzRnSUdKdmNtUmxjaTEwYjNBNklERndlQ0J6YjJ4cFpDQWpaR05rWm1VMk8xeHVmVnh1TG05MWRHeHBibVV0WkhKaGQyVnlYMkowZEM1dmRYUnNhVzVsTFdSeVlYZGxjbDkwYVc1NUxtOTFkR3hwYm1VdFpISmhkMlZ5WDJOc2IzTmxaQ0I3WEc0Z0lHSnZkSFJ2YlRvZ0xUSTFNSEI0TzF4dWZWeHVMbTkxZEd4cGJtVXRaSEpoZDJWeVgySjBkQzV2ZFhSc2FXNWxMV1J5WVhkbGNsOXRhVzVwTG05MWRHeHBibVV0WkhKaGQyVnlYMk5zYjNObFpDQjdYRzRnSUdKdmRIUnZiVG9nTFRNek1IQjRPMXh1ZlZ4dUxtOTFkR3hwYm1VdFpISmhkMlZ5WDJKMGRDNXZkWFJzYVc1bExXUnlZWGRsY2w5emJXRnNiQzV2ZFhSc2FXNWxMV1J5WVhkbGNsOWpiRzl6WldRZ2UxeHVJQ0JpYjNSMGIyMDZJQzB6TnpCd2VEdGNibjFjYmk1dmRYUnNhVzVsTFdSeVlYZGxjbDlpZEhRdWIzVjBiR2x1WlMxa2NtRjNaWEpmY21WbmRXeGhjaTV2ZFhSc2FXNWxMV1J5WVhkbGNsOWpiRzl6WldRZ2UxeHVJQ0JpYjNSMGIyMDZJQzAwTVRCd2VEdGNibjFjYmk1dmRYUnNhVzVsTFdSeVlYZGxjbDlpZEhRdWIzVjBiR2x1WlMxa2NtRjNaWEpmYldWa2FYVnRMbTkxZEd4cGJtVXRaSEpoZDJWeVgyTnNiM05sWkNCN1hHNGdJR0p2ZEhSdmJUb2dMVFExTUhCNE8xeHVmVnh1TG05MWRHeHBibVV0WkhKaGQyVnlYMkowZEM1dmRYUnNhVzVsTFdSeVlYZGxjbDlzWVhKblpTNXZkWFJzYVc1bExXUnlZWGRsY2w5amJHOXpaV1FnZTF4dUlDQmliM1IwYjIwNklDMDBPVEJ3ZUR0Y2JuMWNiaTV2ZFhSc2FXNWxMV1J5WVhkbGNsOXZjR1Z1WldRZ2UxeHVJQ0IyYVhOcFltbHNhWFI1T2lCMmFYTnBZbXhsTzF4dUlDQjZMV2x1WkdWNE9pQjJZWElvTFMxdmRYUnNhVzVsTFhwSmJtUmxlQ2s3WEc1OVhHNHViM1YwYkdsdVpTMWtjbUYzWlhKZmIzQmxibVZrTG05MWRHeHBibVV0WkhKaGQyVnlJSHRjYmlBZ2NHOXphWFJwYjI0NklHWnBlR1ZrTzF4dWZWeHVMbTkxZEd4cGJtVXRaSEpoZDJWeVgyOXdaVzVsWkM1dmRYUnNhVzVsTFdSeVlYZGxjbDl5ZEd3Z2UxeHVJQ0J5YVdkb2REb2dNRHRjYm4xY2JpNXZkWFJzYVc1bExXUnlZWGRsY2w5dmNHVnVaV1F1YjNWMGJHbHVaUzFrY21GM1pYSmZiSFJ5SUh0Y2JpQWdiR1ZtZERvZ01EdGNibjFjYmk1dmRYUnNhVzVsTFdSeVlYZGxjbDl2Y0dWdVpXUXViM1YwYkdsdVpTMWtjbUYzWlhKZmRIUmlJSHRjYmlBZ2RHOXdPaUF3TzF4dWZWeHVMbTkxZEd4cGJtVXRaSEpoZDJWeVgyOXdaVzVsWkM1dmRYUnNhVzVsTFdSeVlYZGxjbDlpZEhRZ2UxeHVJQ0JpYjNSMGIyMDZJREE3WEc1OVhHNHViM1YwYkdsdVpTMWtjbUYzWlhKZmIyWm1jMlYwTG05MWRHeHBibVV0WkhKaGQyVnlYM0owYkN4Y2JpNXZkWFJzYVc1bExXUnlZWGRsY2w5dlptWnpaWFF1YjNWMGJHbHVaUzFrY21GM1pYSmZiSFJ5SUh0Y2JpQWdhR1ZwWjJoME9pQmpZV3hqS0RFd01DVWdMU0EwWlcwcE8xeHVJQ0IwYjNBNklEVXdKVHRjYmlBZ2RISmhibk5tYjNKdE9pQjBjbUZ1YzJ4aGRHVlpLQzAxTUNVcE8xeHVmVnh1TG05MWRHeHBibVV0WkhKaGQyVnlYMjltWm5ObGRDNXZkWFJzYVc1bExXUnlZWGRsY2w5MGRHSXNYRzR1YjNWMGJHbHVaUzFrY21GM1pYSmZiMlptYzJWMExtOTFkR3hwYm1VdFpISmhkMlZ5WDJKMGRDQjdYRzRnSUhkcFpIUm9PaUJqWVd4aktERXdNQ1VnTFNBMFpXMHBPMXh1SUNCc1pXWjBPaUExTUNVN1hHNGdJSFJ5WVc1elptOXliVG9nZEhKaGJuTnNZWFJsV0NndE5UQWxLVHRjYm4xY2JpNXZkWFJzYVc1bExXUnlZWGRsY2w5dlptWnpaWFF1YjNWMGJHbHVaUzFrY21GM1pYSmZiM0JsYm1Wa0xtOTFkR3hwYm1VdFpISmhkMlZ5WDNKMGJDQjdYRzRnSUhKcFoyaDBPaUF5WlcwN1hHNTlYRzR1YjNWMGJHbHVaUzFrY21GM1pYSmZiMlptYzJWMExtOTFkR3hwYm1VdFpISmhkMlZ5WDI5d1pXNWxaQzV2ZFhSc2FXNWxMV1J5WVhkbGNsOXNkSElnZTF4dUlDQnNaV1owT2lBeVpXMDdYRzU5WEc0dWIzVjBiR2x1WlMxa2NtRjNaWEpmYjJabWMyVjBMbTkxZEd4cGJtVXRaSEpoZDJWeVgyOXdaVzVsWkM1dmRYUnNhVzVsTFdSeVlYZGxjbDkwZEdJZ2UxeHVJQ0IwYjNBNklESmxiVHRjYm4xY2JpNXZkWFJzYVc1bExXUnlZWGRsY2w5dlptWnpaWFF1YjNWMGJHbHVaUzFrY21GM1pYSmZiM0JsYm1Wa0xtOTFkR3hwYm1VdFpISmhkMlZ5WDJKMGRDQjdYRzRnSUdKdmRIUnZiVG9nTW1WdE8xeHVmVnh1TG05MWRHeHBibVV0WkhKaGQyVnlYMkYxZEc4dWIzVjBiR2x1WlMxa2NtRjNaWEpmY25Sc0xGeHVMbTkxZEd4cGJtVXRaSEpoZDJWeVgyRjFkRzh1YjNWMGJHbHVaUzFrY21GM1pYSmZiSFJ5SUh0Y2JpQWdhR1ZwWjJoME9pQmhkWFJ2TzF4dUlDQnRZWGd0YUdWcFoyaDBPaUJqWVd4aktERXdNQ1VnTFNBMFpXMHBPMXh1ZlZ4dUxtOTFkR3hwYm1VdFpISmhkMlZ5WDJaMWJHd2dlMXh1SUNCd1lXUmthVzVuT2lBd08xeHVmVnh1TG05MWRHeHBibVV0Ym1GMmFXZGhkRzl5SUh0Y2JpQWdjRzl6YVhScGIyNDZJSEpsYkdGMGFYWmxPMXh1SUNCNkxXbHVaR1Y0T2lBeE8xeHVJQ0J0WVhKbmFXNDZJREE3WEc0Z0lIZHBaSFJvT2lCMllYSW9MUzF2ZFhSc2FXNWxMVzVoZG1sbllYUnZjaTEzYVdSMGFDazdYRzRnSUc5MlpYSm1iRzkzT2lCaGRYUnZPMXh1ZlZ4dUxtOTFkR3hwYm1VdGJtRjJhV2RoZEc5eUxYQmhjbVZ1ZENCN1hHNGdJSFJ5WVc1emFYUnBiMjQ2SURBdU0zTWdaV0Z6WlMxcGJpMXZkWFE3WEc1OVhHNHViM1YwYkdsdVpTMXVZWFpwWjJGMGIzSmZYM1JwZEd4bElIdGNiaUFnYldGeVoybHVPaUF3SURFMmNIZzdYRzRnSUdobGFXZG9kRG9nTkRCd2VEdGNiaUFnYkdsdVpTMW9aV2xuYUhRNklEUXdjSGc3WEc0Z0lIQmhaR1JwYm1jNklEQWdNVFp3ZUR0Y2JpQWdZbTl5WkdWeUxXSnZkSFJ2YlRvZ01YQjRJSE52Ykdsa0lDTmtZMlJtWlRZN1hHNGdJR1p2Ym5RdGMybDZaVG9nTVRad2VEdGNiaUFnWm05dWRDMTNaV2xuYUhRNklEUXdNRHRjYmlBZ2IzWmxjbVpzYjNjNklHaHBaR1JsYmp0Y2JuMWNiaTV2ZFhSc2FXNWxMVzVoZG1sbllYUnZjbDlmYldGcGJpQjdYRzRnSUhCdmMybDBhVzl1T2lCeVpXeGhkR2wyWlR0Y2JpQWdlaTFwYm1SbGVEb2dNVHRjYmlBZ2JXRnlaMmx1T2lBd08xeHVJQ0J2ZG1WeVpteHZkem9nYUdsa1pHVnVPMXh1ZlZ4dUxtOTFkR3hwYm1VdGJtRjJhV2RoZEc5eVgxOXNhWE4wTEZ4dUxtOTFkR3hwYm1VdGJtRjJhV2RoZEc5eVgxOXpkV0pxWldOMExGeHVMbTkxZEd4cGJtVXRibUYyYVdkaGRHOXlYMTlwZEdWdElIdGNiaUFnY0c5emFYUnBiMjQ2SUhKbGJHRjBhWFpsTzF4dUlDQjZMV2x1WkdWNE9pQXlPMXh1SUNCdFlYSm5hVzQ2SURBN1hHNGdJSEJoWkdScGJtYzZJREE3WEc0Z0lHeHBjM1F0YzNSNWJHVXRkSGx3WlRvZ2JtOXVaVHRjYmlBZ2IzWmxjbVpzYjNjNklHaHBaR1JsYmp0Y2JuMWNiaTV2ZFhSc2FXNWxMVzVoZG1sbllYUnZjbDlmYkdsemRDQjdYRzRnSUhCaFpHUnBibWM2SURBdU5XVnRJREE3WEc1OVhHNHViM1YwYkdsdVpTMXVZWFpwWjJGMGIzSmZYM04xWW1wbFkzUWdlMXh1SUNCd1lXUmthVzVuTFd4bFpuUTZJREZsYlR0Y2JuMWNiaTV2ZFhSc2FXNWxMVzVoZG1sbllYUnZjbDlmYVhSbGJTQjdYRzRnSUcxaGNtZHBiam9nTUR0Y2JpQWdiR2x1WlMxb1pXbG5hSFE2SURNd2NIZzdYRzRnSUdadmJuUXRjMmw2WlRvZ01UTndlRHRjYmlBZ2IzWmxjbVpzYjNjNklHaHBaR1JsYmp0Y2JuMWNiaTV2ZFhSc2FXNWxMVzVoZG1sbllYUnZjbDlmY0d4aFkyVm9iMnhrWlhJZ2UxeHVJQ0J3YjNOcGRHbHZiam9nWVdKemIyeDFkR1U3WEc0Z0lIb3RhVzVrWlhnNklERTdYRzRnSUhSdmNEb2dNRHRjYmlBZ2JHVm1kRG9nTUR0Y2JpQWdkMmxrZEdnNklERXdNQ1U3WEc0Z0lHaGxhV2RvZERvZ016QndlRHRjYmlBZ1ltRmphMmR5YjNWdVpDMWpiMnh2Y2pvZ0kyWTNaamhtT1R0Y2JpQWdZbTl5WkdWeUxXeGxablE2SURKd2VDQnpiMnhwWkNBak1EVTRPVFF5TzF4dUlDQjBjbUZ1YzJsMGFXOXVMV1IxY21GMGFXOXVPaUF3TGpKek8xeHVJQ0JpYjNndGMybDZhVzVuT2lCaWIzSmtaWEl0WW05NE8xeHVJQ0J2ZG1WeVpteHZkem9nYUdsa1pHVnVPMXh1ZlZ4dUxtOTFkR3hwYm1VdGJtRjJhV2RoZEc5eVgxOWhibU5vYjNJZ2UxeHVJQ0IzYUdsMFpTMXpjR0ZqWlRvZ2JtOTNjbUZ3TzF4dUlDQjBaWGgwTFc5MlpYSm1iRzkzT2lCbGJHeHBjSE5wY3p0Y2JpQWdiM1psY21ac2IzYzZJR2hwWkdSbGJqdGNiaUFnWkdsemNHeGhlVG9nWW14dlkyczdYRzRnSUhCaFpHUnBibWM2SURBZ01TNDFaVzA3WEc1OVhHNHViM1YwYkdsdVpTMXVZWFpwWjJGMGIzSmZYMkZ1WTJodmNqcHNhVzVyTEZ4dUxtOTFkR3hwYm1VdGJtRjJhV2RoZEc5eVgxOWhibU5vYjNJNmRtbHphWFJsWkN4Y2JpNXZkWFJzYVc1bExXNWhkbWxuWVhSdmNsOWZZVzVqYUc5eU9taHZkbVZ5SUh0Y2JpQWdkR1Y0ZEMxa1pXTnZjbUYwYVc5dU9pQnViMjVsTzF4dUlDQmpiMnh2Y2pvZ0l6VTFOVHRjYm4xY2JpNXZkWFJzYVc1bExXNWhkbWxuWVhSdmNsOWZZVzVqYUc5eU9taHZkbVZ5SUh0Y2JpQWdZMjlzYjNJNklDTXdOVGc1TkRJN1hHNTlYRzR1YjNWMGJHbHVaUzF1WVhacFoyRjBiM0pmWDJOdlpHVWdlMXh1SUNCd1lXUmthVzVuTFhKcFoyaDBPaUF3TGpWbGJUdGNibjFjYmk1dmRYUnNhVzVsTFc1aGRtbG5ZWFJ2Y2w5b2FXZG9iR2xuYUhRdWIzVjBiR2x1WlMxdVlYWnBaMkYwYjNKZlgyRnVZMmh2Y2pwc2FXNXJMRnh1TG05MWRHeHBibVV0Ym1GMmFXZGhkRzl5WDJocFoyaHNhV2RvZEM1dmRYUnNhVzVsTFc1aGRtbG5ZWFJ2Y2w5ZllXNWphRzl5T25acGMybDBaV1FzWEc0dWIzVjBiR2x1WlMxdVlYWnBaMkYwYjNKZmFHbG5hR3hwWjJoMExtOTFkR3hwYm1VdGJtRjJhV2RoZEc5eVgxOWhibU5vYjNJNmFHOTJaWElnZTF4dUlDQmpiMnh2Y2pvZ0l6QTFPRGswTWp0Y2JpQWdabTl1ZEMxM1pXbG5hSFE2SUdKdmJHUTdYRzU5WEc0dWIzVjBiR2x1WlMxdVlYWnBaMkYwYjNKZmMzUnBZMnQ1TEZ4dUxtOTFkR3hwYm1VdGJtRjJhV2RoZEc5eVgyWnBlR1ZrSUh0Y2JpQWdaR2x6Y0d4aGVUb2dabXhsZUR0Y2JpQWdabXhsZUMxM2NtRndPaUJ1YjNkeVlYQTdYRzRnSUdac1pYZ3RaR2x5WldOMGFXOXVPaUJqYjJ4MWJXNDdYRzRnSUhvdGFXNWtaWGc2SUhaaGNpZ3RMVzkxZEd4cGJtVXRla2x1WkdWNEtUdGNiaUFnZEc5d09pQXdPMXh1SUNCdmRtVnlabXh2ZHpvZ2FHbGtaR1Z1TzF4dWZWeHVMbTkxZEd4cGJtVXRibUYyYVdkaGRHOXlYM04wYVdOcmVTQXViM1YwYkdsdVpTMXVZWFpwWjJGMGIzSmZYM1JwZEd4bExGeHVMbTkxZEd4cGJtVXRibUYyYVdkaGRHOXlYMlpwZUdWa0lDNXZkWFJzYVc1bExXNWhkbWxuWVhSdmNsOWZkR2wwYkdVc1hHNHViM1YwYkdsdVpTMXVZWFpwWjJGMGIzSmZjM1JwWTJ0NUlDNXZkWFJzYVc1bExXNWhkbWxuWVhSdmNsOWZiV0ZwYml4Y2JpNXZkWFJzYVc1bExXNWhkbWxuWVhSdmNsOW1hWGhsWkNBdWIzVjBiR2x1WlMxdVlYWnBaMkYwYjNKZlgyMWhhVzRnZTF4dUlDQmliM2d0YzJsNmFXNW5PaUJpYjNKa1pYSXRZbTk0TzF4dWZWeHVMbTkxZEd4cGJtVXRibUYyYVdkaGRHOXlYM04wYVdOcmVTQXViM1YwYkdsdVpTMXVZWFpwWjJGMGIzSmZYM1JwZEd4bExGeHVMbTkxZEd4cGJtVXRibUYyYVdkaGRHOXlYMlpwZUdWa0lDNXZkWFJzYVc1bExXNWhkbWxuWVhSdmNsOWZkR2wwYkdVZ2UxeHVJQ0JtYkdWNExYTm9jbWx1YXpvZ01EdGNibjFjYmk1dmRYUnNhVzVsTFc1aGRtbG5ZWFJ2Y2w5emRHbGphM2tnTG05MWRHeHBibVV0Ym1GMmFXZGhkRzl5WDE5dFlXbHVMRnh1TG05MWRHeHBibVV0Ym1GMmFXZGhkRzl5WDJacGVHVmtJQzV2ZFhSc2FXNWxMVzVoZG1sbllYUnZjbDlmYldGcGJpQjdYRzRnSUdac1pYZzZJREU3WEc0Z0lHOTJaWEptYkc5M09pQmhkWFJ2TzF4dWZWeHVMbTkxZEd4cGJtVXRibUYyYVdkaGRHOXlYM04wYVdOcmVTQjdYRzRnSUhCdmMybDBhVzl1T2lCemRHbGphM2s3WEc0Z0lHMWhlQzFvWldsbmFIUTZJSFpoY2lndExXOTFkR3hwYm1VdGMzUnBZMnQ1TFdobGFXZG9kQ2s3WEc1OVhHNHViM1YwYkdsdVpTMXVZWFpwWjJGMGIzSmZabWw0WldRZ2UxeHVJQ0J3YjNOcGRHbHZiam9nWm1sNFpXUTdYRzRnSUcxaGVDMW9aV2xuYUhRNklERXdNQ1U3WEc1OVhHNHViM1YwYkdsdVpTMXVZWFpwWjJGMGIzSmZhR2xrWkdWdUlIdGNiaUFnWkdsemNHeGhlVG9nYm05dVpUdGNibjFjYmk1dmRYUnNhVzVsTFc1aGRtbG5ZWFJ2Y2w5bWIyeGtaV1FnZTF4dUlDQjNhV1IwYURvZ01EdGNiaUFnYjNabGNtWnNiM2M2SUdocFpHUmxianRjYm4xY2JpOHFLbHh1SUNvZ1ptOXVkQzVzWlhOeklDMGc1YTJYNUwyVDU1dTQ1WVd6NXFDMzVieVBYRzRnS2lBOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5WEc0Z0tpQkRjbVZoZEdWa0lFSjVPaUJaWVc5b1lXbDRhV0Z2WEc0Z0tpQlZjR1JoZEdVNklESXdNakl1TXk0eE5seHVJQ292WEc0dktpQTlQVDA5UFQwZzVhMlg1TDJUSUQwOVBUMDlQU0FxTDF4dUx5b2dQVDA5UFQwOUlPV3RsK21IalNBOVBUMDlQVDBnS2k5Y2JpOHFJRDA5UFQwOVBTRGxyWmZsajdjZ1BUMDlQVDA5SUNvdlhHNHViM1YwYkdsdVpTMXlaV0ZrWlhKZlgzQnliMmR5WlhOeklIdGNiaUFnY0c5emFYUnBiMjQ2SUdacGVHVmtPMXh1SUNCMGIzQTZJREE3WEc0Z0lHeGxablE2SURBN1hHNGdJSG90YVc1a1pYZzZJRE03WEc0Z0lHaGxhV2RvZERvZ05IQjRPMXh1SUNCM2FXUjBhRG9nTVRBd0pUdGNiaUFnWW1GamEyZHliM1Z1WkMxamIyeHZjam9nSXpVd04yRm1aVHRjYmlBZ2MyTmhiR1U2SURBZ01UdGNiaUFnZEhKaGJuTm1iM0p0TFc5eWFXZHBiam9nYkdWbWREdGNiaUFnWVc1cGJXRjBhVzl1T2lCdmRYUnNhVzVsTFhKbFlXUmxjaTF3Y205bmNtVnpjeUJzYVc1bFlYSTdYRzRnSUdGdWFXMWhkR2x2YmkxMGFXMWxiR2x1WlRvZ0xTMVFjbTluY21WemMxUnBiV1ZzYVc1bE8xeHVmVnh1TG05MWRHeHBibVV0Y21WaFpHVnlYMTl3WVhCbGNpQjdYRzRnSUdKdmVDMXphR0ZrYjNjNklEQWdNQ0EyY0hnZ01YQjRJQ05rWkdRN1hHNGdJRzFoY21kcGJqb2dNbVZ0SUdGMWRHODdYRzRnSUcxaGVDMTNhV1IwYURvZ01USXdNSEI0TzF4dUlDQndZV1JrYVc1bk9pQXpMakpsYlR0Y2JpQWdZbTk0TFhOcGVtbHVaem9nWW05eVpHVnlMV0p2ZUR0Y2JpQWdZbUZqYTJkeWIzVnVaQzFqYjJ4dmNqb2dJMlptWmp0Y2JpQWdiM1psY21ac2IzYzZJR2hwWkdSbGJqdGNibjFjYmk1dmRYUnNhVzVsTFhKbFlXUmxjbDlmZEdsMGJHVWdlMXh1SUNCdFlYSm5hVzQ2SURBdU5qZGxiU0F3TzF4dUlDQjBaWGgwTFdGc2FXZHVPaUJqWlc1MFpYSTdYRzRnSUdadmJuUXRabUZ0YVd4NU9pQXRZWEJ3YkdVdGMzbHpkR1Z0TENCQ2JHbHVhMDFoWTFONWMzUmxiVVp2Ym5Rc0lDZFRaV2R2WlNCVlNTY3NJQ2RRYVc1blJtRnVaeUJUUXljc0lDZElhWEpoWjJsdWJ5QlRZVzV6SUVkQ0p5d2dKMDFwWTNKdmMyOW1kQ0JaWVVobGFTY3NJQ2RJWld4MlpYUnBZMkVnVG1WMVpTY3NJQ2RCY0hCc1pTQkRiMnh2Y2lCRmJXOXFhU2NzSUNkVFpXZHZaU0JWU1NCRmJXOXFhU2NzSUNkVFpXZHZaU0JWU1NCVGVXMWliMnduTENCSVpXeDJaWFJwWTJFc0lFRnlhV0ZzTENCellXNXpMWE5sY21sbU8xeHVJQ0JtYjI1MExYZGxhV2RvZERvZ2JtOXliV0ZzTzF4dUlDQnNhVzVsTFdobGFXZG9kRG9nTVM0elpXMDdYRzRnSUdadmJuUXRjMmw2WlRvZ05DNHlaVzA3WEc0Z0lHOTJaWEptYkc5M09pQm9hV1JrWlc0N1hHNTlYRzR1YjNWMGJHbHVaUzF5WldGa1pYSmZYMkZ5ZEdsamJHVWdMbTkxZEd4cGJtVXRjbVZoWkdWeVgxOXdjbTluY21WemN5QjdYRzRnSUdScGMzQnNZWGs2SUc1dmJtVTdYRzU5WEc0dWIzVjBiR2x1WlMxeVpXRmtaWEpmYUdsa1pHVnVJSHRjYmlBZ1pHbHpjR3hoZVRvZ2JtOXVaVHRjYm4xY2JpNXZkWFJzYVc1bExYSmxZV1JsY2w5b2FXUmtaVzR1YjNWMGJHbHVaUzF5WldGa1pYSmZjMmxpYkdsdVp5QjdYRzRnSUdScGMzQnNZWGs2SUc1dmJtVWdJV2x0Y0c5eWRHRnVkRHRjYm4xY2JpNXZkWFJzYVc1bExYSmxZV1JsY2w5b2FXUmtaVzR1YjNWMGJHbHVaUzF5WldGa1pYSmZjMmxpYkdsdVp5NTNjbUZ3Y0dWeUxuQnZjM1FnZTF4dUlDQmthWE53YkdGNU9pQnViMjVsTzF4dWZWeHVMbTkxZEd4cGJtVXRjbVZoWkdWeUxTMXlaV0ZrYVc1bklIdGNiaUFnWkdsemNHeGhlVG9nWW14dlkyczdYRzRnSUhCdmMybDBhVzl1T2lCbWFYaGxaRHRjYmlBZ2VpMXBibVJsZURvZ01qdGNiaUFnZEc5d09pQXdPMXh1SUNCc1pXWjBPaUF3TzF4dUlDQjNhV1IwYURvZ01UQXdKVHRjYmlBZ2FHVnBaMmgwT2lBeE1EQWxPMXh1SUNCdFlYSm5hVzQ2SURBN1hHNGdJR0p2ZUMxemFYcHBibWM2SUdKdmNtUmxjaTFpYjNnN1hHNGdJSEJoWkdScGJtYzZJRE5sYlNBMFpXMDdYRzRnSUdKaFkydG5jbTkxYm1RdFkyOXNiM0k2SUNObVlXWmhabUU3WEc0Z0lITmpjbTlzYkMxMGFXMWxiR2x1WlMxdVlXMWxPaUF0TFZCeWIyZHlaWE56VkdsdFpXeHBibVU3WEc0Z0lHOTJaWEptYkc5M09pQnpZM0p2Ykd3N1hHNTlYRzVBYTJWNVpuSmhiV1Z6SUc5MWRHeHBibVV0Y21WaFpHVnlMWEJ5YjJkeVpYTnpJSHRjYmlBZ2RHOGdlMXh1SUNBZ0lITmpZV3hsT2lBeElERTdYRzRnSUgxY2JuMWNia0J0WldScFlTQW9iV0Y0TFhkcFpIUm9PaUExTURCd2VDa2dlMXh1SUNBdWIzVjBiR2x1WlMxeVpXRmtaWElnZTF4dUlDQWdJRzkyWlhKbWJHOTNPaUJvYVdSa1pXNDdYRzRnSUgxY2JpQWdMbTkxZEd4cGJtVXRjbVZoWkdWeUlDNXZkWFJzYVc1bExYUnZiMnhpWVhJZ2UxeHVJQ0FnSUdScGMzQnNZWGs2SUdac1pYZzdYRzRnSUNBZ1pteGxlQzFrYVhKbFkzUnBiMjQ2SUhKdmR6dGNiaUFnSUNCbWJHVjRMWGR5WVhBNklHNXZkM0poY0R0Y2JpQWdJQ0JoYkdsbmJpMXBkR1Z0Y3pvZ1kyVnVkR1Z5TzF4dUlDQWdJR0ZzYVdkdUxYTmxiR1k2SUdGMWRHODdYRzRnSUNBZ2RHOXdPaUF4TURBbE8xeHVJQ0FnSUhKcFoyaDBPaUF3TzF4dUlDQWdJSFJ5WVc1elptOXliVG9nZEhKaGJuTnNZWFJsV1NndE5EaHdlQ2s3WEc0Z0lDQWdkMmxrZEdnNklERXdNQ1U3WEc0Z0lDQWdhR1ZwWjJoME9pQTBPSEI0TzF4dUlDQWdJR0p2ZUMxemFYcHBibWM2SUdKdmNtUmxjaTFpYjNnN1hHNGdJQ0FnWW05eVpHVnlMWFJ2Y0RvZ01YQjRJSE52Ykdsa0lDTmtaR1E3WEc0Z0lDQWdZbUZqYTJkeWIzVnVaQzFqYjJ4dmNqb2dJMlptWmp0Y2JpQWdJQ0J3WVdSa2FXNW5PaUF3SURFMmNIZzdYRzRnSUgxY2JpQWdMbTkxZEd4cGJtVXRjbVZoWkdWeUlDNXZkWFJzYVc1bExYUnZiMnhpWVhKZlgySjFkSFJ2YmlCN1hHNGdJQ0FnWW05eVpHVnlMWEpoWkdsMWN6b2dNRHRjYmlBZ0lDQm1iR1Y0T2lBeE8xeHVJQ0FnSUdKdmNtUmxjam9nYm05dVpUdGNiaUFnSUNCaWIzZ3RjMmhoWkc5M09pQnViMjVsTzF4dUlDQjlYRzRnSUM1dmRYUnNhVzVsTFhKbFlXUmxjaTB0Y21WaFpHbHVaeUI3WEc0Z0lDQWdjR0ZrWkdsdVp6b2dNRHRjYmlBZ0lDQmlZV05yWjNKdmRXNWtMV052Ykc5eU9pQWpabVptTzF4dUlDQWdJR0p2ZUMxemFYcHBibWM2SUdKdmNtUmxjaTFpYjNnN1hHNGdJSDFjYmlBZ0xtOTFkR3hwYm1VdGNtVmhaR1Z5WDE5d1lYQmxjaUI3WEc0Z0lDQWdjRzl6YVhScGIyNDZJSEpsYkdGMGFYWmxPMXh1SUNBZ0lIb3RhVzVrWlhnNklERTdYRzRnSUNBZ2JXRnlaMmx1T2lBd08xeHVJQ0FnSUhCaFpHUnBibWM2SURBN1hHNGdJQ0FnYUdWcFoyaDBPaUF4TURBbE8xeHVJQ0FnSUdKdmVDMXphR0ZrYjNjNklHNXZibVU3WEc0Z0lDQWdiM1psY21ac2IzYzZJR2hwWkdSbGJqdGNiaUFnZlZ4dUlDQXViM1YwYkdsdVpTMXlaV0ZrWlhKZlgzUnBkR3hsSUh0Y2JpQWdJQ0IzYUdsMFpTMXpjR0ZqWlRvZ2JtOTNjbUZ3TzF4dUlDQWdJSFJsZUhRdGIzWmxjbVpzYjNjNklHVnNiR2x3YzJsek8xeHVJQ0FnSUhCdmMybDBhVzl1T2lCaFluTnZiSFYwWlR0Y2JpQWdJQ0I2TFdsdVpHVjRPaUF6TzF4dUlDQWdJSFJ2Y0RvZ01EdGNiaUFnSUNCc1pXWjBPaUF3TzF4dUlDQWdJRzFoY21kcGJqb2dNRHRjYmlBZ0lDQjNhV1IwYURvZ01UQXdKVHRjYmlBZ0lDQm9aV2xuYUhRNklEUTRjSGc3WEc0Z0lDQWdiR2x1WlMxb1pXbG5hSFE2SURRNGNIZzdYRzRnSUNBZ1ltOXlaR1Z5TFdKdmRIUnZiVG9nTVhCNElITnZiR2xrSUNOa1pHUTdYRzRnSUNBZ1ptOXVkQzF6YVhwbE9pQXhMamhsYlR0Y2JpQWdJQ0JtYjI1MExYZGxhV2RvZERvZ05EQXdPMXh1SUNBZ0lHSmhZMnRuY205MWJtUXRZMjlzYjNJNklDTm1abVk3WEc0Z0lDQWdiM1psY21ac2IzYzZJR2hwWkdSbGJqdGNiaUFnZlZ4dUlDQXViM1YwYkdsdVpTMXlaV0ZrWlhKZlgyRnlkR2xqYkdVZ2UxeHVJQ0FnSUcxaGNtZHBiam9nTkRod2VDQXdPMXh1SUNBZ0lHaGxhV2RvZERvZ1kyRnNZeWd4TURBbElDMGdPVFp3ZUNrN1hHNGdJQ0FnY0dGa1pHbHVaem9nTUNBeExqSTFaVzA3WEc0Z0lDQWdjMk55YjJ4c0xYUnBiV1ZzYVc1bExXNWhiV1U2SUMwdFRXOWlhV3hsVUhKdlozSmxjM05VYVcxbGJHbHVaVHRjYmlBZ0lDQnZkbVZ5Wm14dmR5MTRPaUJvYVdSa1pXNDdYRzRnSUNBZ2IzWmxjbVpzYjNjdGVUb2djMk55YjJ4c08xeHVJQ0I5WEc0Z0lDNXZkWFJzYVc1bExYSmxZV1JsY2w5ZllYSjBhV05zWlNBdWIzVjBiR2x1WlMxeVpXRmtaWEpmWDNCeWIyZHlaWE56SUh0Y2JpQWdJQ0I2TFdsdVpHVjRPaUEwTzF4dUlDQWdJR0Z1YVcxaGRHbHZiam9nYjNWMGJHbHVaUzF5WldGa1pYSXRjSEp2WjNKbGMzTWdiR2x1WldGeU8xeHVJQ0FnSUdGdWFXMWhkR2x2YmkxMGFXMWxiR2x1WlRvZ0xTMU5iMkpwYkdWUWNtOW5jbVZ6YzFScGJXVnNhVzVsTzF4dUlDQWdJR1JwYzNCc1lYazZJR0pzYjJOck8xeHVJQ0I5WEc1OVhHNUFiV1ZrYVdFZ2NISnBiblFnZTF4dUlDQm9kRzFzTEZ4dUlDQmliMlI1SUh0Y2JpQWdJQ0F2S2lEbWlaUGxqYkRubW9UbG43cm5vWURsclpma3ZaUGxwS2Zsc0k4Z0tpOWNiaUFnSUNCbWIyNTBMWE5wZW1VNklERXljSFE3WEc0Z0lDQWdMeW9nNXBpKzU2UzY2SzYrNTcydTVwYUg1YTJYNmFLYzZJbXk1WktNNklPTTVwbXY2YUtjNklteUlDb3ZYRzRnSUNBZ1ltRmphMmR5YjNWdVpDMWpiMnh2Y2pvZ0kyWm1aanRjYmlBZ0lDQmpiMnh2Y2pvZ0l6TXpNenRjYmlBZ0lDQm9aV2xuYUhRNklHbHVhWFJwWVd3Z0lXbHRjRzl5ZEdGdWREdGNiaUFnZlZ4dUlDQXZLaURvcnI3bnZhN3BrNzdtanFYbW9MZmx2SThnS2k5Y2JpQWdZVHBzYVc1ckxGeHVJQ0JoT25acGMybDBaV1FzWEc0Z0lHRTZhRzkyWlhJZ2UxeHVJQ0FnSUhSbGVIUXRaR1ZqYjNKaGRHbHZiam9nZFc1a1pYSnNhVzVsSUNGcGJYQnZjblJoYm5RN1hHNGdJQ0FnWTI5c2IzSTZJQ00xTURkaFptVTdYRzRnSUgxY2JpQWdMeW9nNlpxUTZKZVA1YXFTNUwyVDVxQ0g1NjIrSUNvdlhHNGdJSFpwWkdWdkxGeHVJQ0JoZFdScGJ5QjdYRzRnSUNBZ1pHbHpjR3hoZVRvZ2JtOXVaU0FoYVcxd2IzSjBZVzUwTzF4dUlDQjlYRzRnSUM4cUlPZWhydVMvbmVpaHFPYWd2T1djcU9hSmsrV05zT2FYdHVlYWhPaSt1ZWFoaHVXU2pPV3Z1ZW05a09hV3VlVzhqK2E0aGVhWnNDQXFMMXh1SUNCMFlXSnNaU0I3WEc0Z0lDQWdkMmxrZEdnNklERXdNQ1U3WEc0Z0lDQWdZbTl5WkdWeUxXTnZiR3hoY0hObE9pQmpiMnhzWVhCelpUdGNiaUFnZlZ4dUlDQjBhQ3hjYmlBZ2RHUWdlMXh1SUNBZ0lHSnZjbVJsY2pvZ01YQjRJSE52Ykdsa0lDTmtZMlJtWlRZN1hHNGdJQ0FnY0dGa1pHbHVaem9nT0hCNElESXdjSGc3WEc0Z0lIMWNiaUFnTG05MWRHeHBibVV0YldWemMyRm5aU3hjYmlBZ0xtOTFkR3hwYm1VdGRHOXZiR0poY2lCN1hHNGdJQ0FnTHlvZzZacVE2SmVQNUxxRzViZWw1WVczNXFDUDVaS001TCtoNW9HdjVvK1E1NlM2NXFHR0lDb3ZYRzRnSUNBZ1pHbHpjR3hoZVRvZ2JtOXVaU0FoYVcxd2IzSjBZVzUwTzF4dUlDQjlYRzRnSUM1dmRYUnNhVzVsTFhKbFlXUmxjaUI3WEc0Z0lDQWdaR2x6Y0d4aGVUb2dZbXh2WTJzZ0lXbHRjRzl5ZEdGdWREdGNiaUFnSUNCdmRtVnlabXh2ZHpvZ2FHbGtaR1Z1TzF4dUlDQWdJQzhxSU9XUGx1YTJpT1M2aHVlN25lV3Z1ZVd1bXVTOWpTQXFMMXh1SUNBZ0lDOHFJT21ha09pWGorbVloZWl2dStpL20rVzZwdWFkb1NBcUwxeHVJQ0FnSUM4cUlPYUprK1dOc09hWHR1UzRqZWFZdnVla3V1YXRvK2FXaHlCRVQwMGc1NXFFNlppMDViMng1cFdJNXA2Y0lDb3ZYRzRnSUNBZ0x5b2c1b21BNXB5SjVwYUg1NnVnNVlhRjVhNjVJRVJQVFNEbm03amxoYlBubW9UcGdydmxzWVhvaW9MbmdybnBnNzNwbXBEb2w0L2t1b1lnS2k5Y2JpQWdmVnh1SUNBdWIzVjBiR2x1WlMxeVpXRmtaWEpmWDNScGRHeGxJSHRjYmlBZ0lDQnRZWEpuYVc0NklERXpMalJ3ZENBd0lESTRjSFFnSVdsdGNHOXlkR0Z1ZER0Y2JpQWdJQ0IwWlhoMExXRnNhV2R1T2lCalpXNTBaWElnSVdsdGNHOXlkR0Z1ZER0Y2JpQWdJQ0JtYjI1MExYTnBlbVU2SURNeWNIUWdJV2x0Y0c5eWRHRnVkRHRjYmlBZ2ZWeHVJQ0F1YjNWMGJHbHVaUzF5WldGa1pYSXRMWEpsWVdScGJtY2dlMXh1SUNBZ0lIQnZjMmwwYVc5dU9pQnlaV3hoZEdsMlpTQWhhVzF3YjNKMFlXNTBPMXh1SUNBZ0lHaGxhV2RvZERvZ1lYVjBieUFoYVcxd2IzSjBZVzUwTzF4dUlDQWdJSEJoWkdScGJtYzZJREFnSVdsdGNHOXlkR0Z1ZER0Y2JpQWdJQ0JpWVdOclozSnZkVzVrTFdOdmJHOXlPaUFqWm1abU8xeHVJQ0FnSUc5MlpYSm1iRzkzT2lCb2FXUmtaVzRnSVdsdGNHOXlkR0Z1ZER0Y2JpQWdmVnh1SUNBdWIzVjBiR2x1WlMxeVpXRmtaWEpmWDNCeWIyZHlaWE56SUh0Y2JpQWdJQ0JrYVhOd2JHRjVPaUJ1YjI1bElDRnBiWEJ2Y25SaGJuUTdYRzRnSUgxY2JpQWdMbTkxZEd4cGJtVXRjbVZoWkdWeVgxOXdZWEJsY2lCN1hHNGdJQ0FnWW05NExYTm9ZV1J2ZHpvZ2JtOXVaVHRjYmlBZ2ZWeHVJQ0F1YjNWMGJHbHVaUzF5WldGa1pYSWdjSEpsSUh0Y2JpQWdJQ0J3WVdSa2FXNW5PaUF4WlcwZ0lXbHRjRzl5ZEdGdWREdGNiaUFnSUNCaWIzSmtaWEk2SURGd2VDQnpiMnhwWkNBalpHUmtJQ0ZwYlhCdmNuUmhiblE3WEc0Z0lDQWdZbTl5WkdWeUxYSmhaR2wxY3pvZ05IQjRJQ0ZwYlhCdmNuUmhiblE3WEc0Z0lIMWNiaUFnTG05MWRHeHBibVV0Y21WaFpHVnlJSEJ5WlN4Y2JpQWdMbTkxZEd4cGJtVXRjbVZoWkdWeUlHTnZaR1VnZTF4dUlDQWdJR0poWTJ0bmNtOTFibVF0WTI5c2IzSTZJQ05tWm1ZZ0lXbHRjRzl5ZEdGdWREdGNiaUFnZlZ4dUlDQXViM1YwYkdsdVpTMXlaV0ZrWlhJZ2RHRmliR1VzWEc0Z0lDNXZkWFJzYVc1bExYSmxZV1JsY2lCcGJXY3NYRzRnSUM1dmRYUnNhVzVsTFhKbFlXUmxjaUJ6ZG1jZ2UxeHVJQ0FnSUdKeVpXRnJMV2x1YzJsa1pUb2dZWFp2YVdRN1hHNGdJSDFjYmlBZ0xtOTFkR3hwYm1VdGNtVmhaR1Z5WDNOcFlteHBibWNnZTF4dUlDQWdJR1JwYzNCc1lYazZJRzV2Ym1VZ0lXbHRjRzl5ZEdGdWREdGNiaUFnZlZ4dWZWeHVMbTkxZEd4cGJtVXRkRzl2YkdKaGNpQjdYRzRnSUhCdmMybDBhVzl1T2lCbWFYaGxaRHRjYmlBZ2VpMXBibVJsZURvZ09UazVPVGs3WEc0Z0lHMWhjbWRwYmpvZ01EdGNiaUFnZEhKaGJuTnBkR2x2Ymkxa2RYSmhkR2x2YmpvZ01DNHpjenRjYmlBZ2IzWmxjbVpzYjNjNklHaHBaR1JsYmp0Y2JuMWNiaTV2ZFhSc2FXNWxMWFJ2YjJ4aVlYSmZYMkoxZEhSdmJpQjdYRzRnSUdKdmVDMXphR0ZrYjNjNklEQWdNQ0EyY0hnZ01YQjRJQ05rWTJSbVpUWTdYRzRnSUhCdmMybDBhVzl1T2lCeVpXeGhkR2wyWlR0Y2JpQWdlaTFwYm1SbGVEb2dNVHRjYmlBZ2JXRnlaMmx1T2lBeE1IQjRPMXh1SUNCM2FXUjBhRG9nTXpad2VEdGNiaUFnYUdWcFoyaDBPaUF6Tm5CNE8xeHVJQ0JpYjNKa1pYSTZJREZ3ZUNCemIyeHBaQ0FqWkdOa1ptVTJPMXh1SUNCaWIzSmtaWEl0Y21Ga2FYVnpPaUF6Y0hnN1hHNGdJR0p2ZUMxemFYcHBibWM2SUdKdmNtUmxjaTFpYjNnN1hHNGdJR0poWTJ0bmNtOTFibVF0WTI5c2IzSTZJQ05tWm1ZN1hHNGdJR04xY25OdmNqb2djRzlwYm5SbGNqdGNiaUFnZEdWNGRDMWhiR2xuYmpvZ1kyVnVkR1Z5TzF4dUlDQmpiMnh2Y2pvZ0l6azVPVHRjYmlBZ2RISmhibk5wZEdsdmJqb2dZV3hzSURBdU0zTWdNQzR4Y3lCbFlYTmxMV2x1TFc5MWREdGNiaUFnYjNabGNtWnNiM2M2SUdocFpHUmxianRjYm4xY2JpNXZkWFJzYVc1bExYUnZiMnhpWVhKZlgySjFkSFJ2Ympwb2IzWmxjaUI3WEc0Z0lHTnZiRzl5T2lBak1EVTRPVFF5TzF4dUlDQmliM0prWlhJdFkyOXNiM0k2SUNNd05UZzVOREk3WEc0Z0lIUnlZVzV6Wm05eWJUb2djMk5oYkdVb01TNHpOU2s3WEc1OVhHNHViM1YwYkdsdVpTMTBiMjlzWW1GeVgxOWlkWFIwYjI0dWFHbGtaU0I3WEc0Z0lHUnBjM0JzWVhrNklHNXZibVU3WEc1OVhHNHViM1YwYkdsdVpTMTBiMjlzWW1GeVgxOWhibU5vYjNJNmJHbHVheXhjYmk1dmRYUnNhVzVsTFhSdmIyeGlZWEpmWDJGdVkyaHZjanAyYVhOcGRHVmtMRnh1TG05MWRHeHBibVV0ZEc5dmJHSmhjbDlmWVc1amFHOXlPbWh2ZG1WeUlIdGNiaUFnWTI5c2IzSTZJQ001T1RrN1hHNGdJSFJsZUhRdFpHVmpiM0poZEdsdmJqb2dibTl1WlR0Y2JuMWNiaTV2ZFhSc2FXNWxMWFJ2YjJ4aVlYSmZYMkZ1WTJodmNqcG9iM1psY2lCN1hHNGdJR052Ykc5eU9pQWpNRFU0T1RReU8xeHVmVnh1TG05MWRHeHBibVV0ZEc5dmJHSmhjbDlmYVdOdmJpQjdYRzRnSUhCdmMybDBhVzl1T2lCaFluTnZiSFYwWlR0Y2JpQWdlaTFwYm1SbGVEb2dNanRjYmlBZ2RHOXdPaUExTUNVN1hHNGdJR3hsWm5RNklEVXdKVHRjYmlBZ2QybGtkR2c2SURJd2NIZzdYRzRnSUdobGFXZG9kRG9nTWpCd2VEdGNiaUFnZEhKaGJuTm1iM0p0T2lCMGNtRnVjMnhoZEdVb0xUVXdKU3dnTFRVd0pTazdYRzRnSUdacGJHdzZJR04xY25KbGJuUmpiMnh2Y2p0Y2JpQWdiM1psY21ac2IzYzZJR2hwWkdSbGJqdGNibjFjYmk1dmRYUnNhVzVsTFhSdmIyeGlZWEpmWVdOMGFYWmxMbTkxZEd4cGJtVXRkRzl2YkdKaGNsOWZZblYwZEc5dUlIdGNiaUFnWTI5c2IzSTZJQ05tWm1ZN1hHNGdJR0poWTJ0bmNtOTFibVF0WTI5c2IzSTZJQ013TlRnNU5ESTdYRzRnSUdKdmNtUmxjaTFqYjJ4dmNqb2dJekExT0RrME1qdGNibjFjYmk1dmRYUnNhVzVsTFhSdmIyeGlZWEpmWVdOMGFYWmxMbTkxZEd4cGJtVXRkRzl2YkdKaGNsOWZZblYwZEc5dU9taHZkbVZ5SUh0Y2JpQWdZMjlzYjNJNklDTm1abVk3WEc1OVhHNHViM1YwYkdsdVpTMTBiMjlzWW1GeVgyRmpkR2wyWlNBdWIzVjBiR2x1WlMxMGIyOXNZbUZ5WDE5aGJtTm9iM0k2YkdsdWF5eGNiaTV2ZFhSc2FXNWxMWFJ2YjJ4aVlYSmZZV04wYVhabElDNXZkWFJzYVc1bExYUnZiMnhpWVhKZlgyRnVZMmh2Y2pwMmFYTnBkR1ZrTEZ4dUxtOTFkR3hwYm1VdGRHOXZiR0poY2w5aFkzUnBkbVVnTG05MWRHeHBibVV0ZEc5dmJHSmhjbDlmWVc1amFHOXlPbWh2ZG1WeUlIdGNiaUFnWTI5c2IzSTZJQ05tWm1ZN1hHNTlYRzR1YjNWMGJHbHVaUzEwYjI5c1ltRnlYM0p2ZFc1a1pXUXViM1YwYkdsdVpTMTBiMjlzWW1GeVgxOWlkWFIwYjI0Z2UxeHVJQ0JpYjNKa1pYSXRjbUZrYVhWek9pQXhPSEI0TzF4dWZWeHVMbTkxZEd4cGJtVXRkRzl2YkdKaGNsOWthWE5oWW14bFpDNXZkWFJzYVc1bExYUnZiMnhpWVhKZlgyRnVZMmh2Y2pwc2FXNXJMRnh1TG05MWRHeHBibVV0ZEc5dmJHSmhjbDlrYVhOaFlteGxaQ0F1YjNWMGJHbHVaUzEwYjI5c1ltRnlYMTloYm1Ob2IzSTZiR2x1YXl4Y2JpNXZkWFJzYVc1bExYUnZiMnhpWVhKZlpHbHpZV0pzWldRdWIzVjBiR2x1WlMxMGIyOXNZbUZ5WDE5aGJtTm9iM0k2ZG1semFYUmxaQ3hjYmk1dmRYUnNhVzVsTFhSdmIyeGlZWEpmWkdsellXSnNaV1FnTG05MWRHeHBibVV0ZEc5dmJHSmhjbDlmWVc1amFHOXlPblpwYzJsMFpXUXNYRzR1YjNWMGJHbHVaUzEwYjI5c1ltRnlYMlJwYzJGaWJHVmtMbTkxZEd4cGJtVXRkRzl2YkdKaGNsOWZZVzVqYUc5eU9taHZkbVZ5TEZ4dUxtOTFkR3hwYm1VdGRHOXZiR0poY2w5a2FYTmhZbXhsWkNBdWIzVjBiR2x1WlMxMGIyOXNZbUZ5WDE5aGJtTm9iM0k2YUc5MlpYSXNYRzR1YjNWMGJHbHVaUzEwYjI5c1ltRnlYMlJwYzJGaWJHVmtMbTkxZEd4cGJtVXRkRzl2YkdKaGNsOWZZblYwZEc5dUxGeHVMbTkxZEd4cGJtVXRkRzl2YkdKaGNsOWthWE5oWW14bFpDQXViM1YwYkdsdVpTMTBiMjlzWW1GeVgxOWlkWFIwYjI0Z2UxeHVJQ0JqZFhKemIzSTZJRzV2ZEMxaGJHeHZkMlZrTzF4dUlDQmpiMnh2Y2pvZ0l6azVPVHRjYmlBZ1ltOXlaR1Z5TFdOdmJHOXlPaUFqT1RrNU8xeHVmVnh1TG05MWRHeHBibVV0ZEc5dmJHSmhjbDlrYVhOaFlteGxaQzV2ZFhSc2FXNWxMWFJ2YjJ4aVlYSmZYMkZ1WTJodmNqcHNhVzVyT21odmRtVnlMRnh1TG05MWRHeHBibVV0ZEc5dmJHSmhjbDlrYVhOaFlteGxaQ0F1YjNWMGJHbHVaUzEwYjI5c1ltRnlYMTloYm1Ob2IzSTZiR2x1YXpwb2IzWmxjaXhjYmk1dmRYUnNhVzVsTFhSdmIyeGlZWEpmWkdsellXSnNaV1F1YjNWMGJHbHVaUzEwYjI5c1ltRnlYMTloYm1Ob2IzSTZkbWx6YVhSbFpEcG9iM1psY2l4Y2JpNXZkWFJzYVc1bExYUnZiMnhpWVhKZlpHbHpZV0pzWldRZ0xtOTFkR3hwYm1VdGRHOXZiR0poY2w5ZllXNWphRzl5T25acGMybDBaV1E2YUc5MlpYSXNYRzR1YjNWMGJHbHVaUzEwYjI5c1ltRnlYMlJwYzJGaWJHVmtMbTkxZEd4cGJtVXRkRzl2YkdKaGNsOWZZVzVqYUc5eU9taHZkbVZ5T21odmRtVnlMRnh1TG05MWRHeHBibVV0ZEc5dmJHSmhjbDlrYVhOaFlteGxaQ0F1YjNWMGJHbHVaUzEwYjI5c1ltRnlYMTloYm1Ob2IzSTZhRzkyWlhJNmFHOTJaWElzWEc0dWIzVjBiR2x1WlMxMGIyOXNZbUZ5WDJScGMyRmliR1ZrTG05MWRHeHBibVV0ZEc5dmJHSmhjbDlmWW5WMGRHOXVPbWh2ZG1WeUxGeHVMbTkxZEd4cGJtVXRkRzl2YkdKaGNsOWthWE5oWW14bFpDQXViM1YwYkdsdVpTMTBiMjlzWW1GeVgxOWlkWFIwYjI0NmFHOTJaWElnZTF4dUlDQmpiMnh2Y2pvZ0l6azVPVHRjYmlBZ1ltOXlaR1Z5TFdOdmJHOXlPaUFqT1RrNU8xeHVmVnh1TG05MWRHeHBibVV0ZEc5dmJHSmhjbDlrYVhOaFlteGxaQzV2ZFhSc2FXNWxMWFJ2YjJ4aVlYSmZYMkoxZEhSdmJpeGNiaTV2ZFhSc2FXNWxMWFJ2YjJ4aVlYSmZaR2x6WVdKc1pXUWdMbTkxZEd4cGJtVXRkRzl2YkdKaGNsOWZZblYwZEc5dUlIdGNiaUFnWW1GamEyZHliM1Z1WkMxamIyeHZjam9nSTJZMVpqVm1OVHRjYm4xY2JpNXZkWFJzYVc1bExYUnZiMnhpWVhKZmRIUmlMRnh1TG05MWRHeHBibVV0ZEc5dmJHSmhjbDlpZEhRZ2UxeHVJQ0JzWldaME9pQTFNQ1U3WEc0Z0lIUnlZVzV6Wm05eWJUb2dkSEpoYm5Oc1lYUmxXQ2d0TlRBbEtUdGNibjFjYmk1dmRYUnNhVzVsTFhSdmIyeGlZWEpmZEhSaUlDNXZkWFJzYVc1bExYUnZiMnhpWVhKZlgySjFkSFJ2Yml4Y2JpNXZkWFJzYVc1bExYUnZiMnhpWVhKZlluUjBJQzV2ZFhSc2FXNWxMWFJ2YjJ4aVlYSmZYMkoxZEhSdmJpQjdYRzRnSUdScGMzQnNZWGs2SUdsdWJHbHVaUzFpYkc5amF6dGNibjFjYmk1dmRYUnNhVzVsTFhSdmIyeGlZWEpmZEhSaUlIdGNiaUFnZEc5d09pQXhNbkI0TzF4dWZWeHVMbTkxZEd4cGJtVXRkRzl2YkdKaGNsOTBkR0l1YjNWMGJHbHVaUzEwYjI5c1ltRnlYMmhwWkdSbGJpQjdYRzRnSUhSdmNEb2dMVFUyY0hnN1hHNTlYRzR1YjNWMGJHbHVaUzEwYjI5c1ltRnlYMkowZENCN1hHNGdJR0p2ZEhSdmJUb2dNVEp3ZUR0Y2JuMWNiaTV2ZFhSc2FXNWxMWFJ2YjJ4aVlYSmZZblIwTG05MWRHeHBibVV0ZEc5dmJHSmhjbDlvYVdSa1pXNGdlMXh1SUNCaWIzUjBiMjA2SUMwMU5uQjRPMXh1ZlZ4dUxtOTFkR3hwYm1VdGRHOXZiR0poY2w5eWRHd3NYRzR1YjNWMGJHbHVaUzEwYjI5c1ltRnlYMngwY2lCN1hHNGdJSFJ5WVc1elptOXliVG9nZEhKaGJuTnNZWFJsV1NndE5UQWxLVHRjYmlBZ2QybGtkR2c2SURVMmNIZzdYRzU5WEc0dWIzVjBiR2x1WlMxMGIyOXNZbUZ5WDNKMGJDQjdYRzRnSUhSdmNEb2dOVEFsTzF4dUlDQnlhV2RvZERvZ01USndlRHRjYm4xY2JpNXZkWFJzYVc1bExYUnZiMnhpWVhKZmNuUnNMbTkxZEd4cGJtVXRkRzl2YkdKaGNsOW9hV1JrWlc0Z2UxeHVJQ0J5YVdkb2REb2dMVGcyY0hnN1hHNTlYRzR1YjNWMGJHbHVaUzEwYjI5c1ltRnlYMngwY2lCN1hHNGdJSFJ2Y0RvZ05UQWxPMXh1SUNCc1pXWjBPaUF4TW5CNE8xeHVmVnh1TG05MWRHeHBibVV0ZEc5dmJHSmhjbDlzZEhJdWIzVjBiR2x1WlMxMGIyOXNZbUZ5WDJocFpHUmxiaUI3WEc0Z0lHeGxablE2SUMwNE5uQjRPMXh1ZlZ4dUxtOTFkR3hwYm1VdGRHOXZiR0poY2w5MGRHSWdMbTkxZEd4cGJtVXRkRzl2YkdKaGNsOWZZblYwZEc5dUxtOTFkR3hwYm1VdGRHOXZiR0poY2w5b2FXUmtaVzRzWEc0dWIzVjBiR2x1WlMxMGIyOXNZbUZ5WDNKMGJDQXViM1YwYkdsdVpTMTBiMjlzWW1GeVgxOWlkWFIwYjI0dWIzVjBiR2x1WlMxMGIyOXNZbUZ5WDJocFpHUmxiaXhjYmk1dmRYUnNhVzVsTFhSdmIyeGlZWEpmWW5SMElDNXZkWFJzYVc1bExYUnZiMnhpWVhKZlgySjFkSFJ2Ymk1dmRYUnNhVzVsTFhSdmIyeGlZWEpmYUdsa1pHVnVMRnh1TG05MWRHeHBibVV0ZEc5dmJHSmhjbDlzZEhJZ0xtOTFkR3hwYm1VdGRHOXZiR0poY2w5ZlluVjBkRzl1TG05MWRHeHBibVV0ZEc5dmJHSmhjbDlvYVdSa1pXNGdlMXh1SUNCa2FYTndiR0Y1T2lCdWIyNWxPMXh1ZlZ4dUlpd2lMeW9nUFQwOVBUMGdVMk55YjJ4c1ltRnlJRDA5UFQwOUlDb3ZYSEpjYmpvNkxYZGxZbXRwZEMxelkzSnZiR3hpWVhJZ2UxeHlYRzRnSUhkcFpIUm9PaUEzY0hnN1hISmNiaUFnYUdWcFoyaDBPaUEzY0hnN1hISmNiaUFnTFhkbFltdHBkQzFpYjNKa1pYSXRjbUZrYVhWek9pQTFjSGc3WEhKY2JuMWNjbHh1WEhKY2JqbzZMWGRsWW10cGRDMXpZM0p2Ykd4aVlYSXRkSEpoWTJzdGNHbGxZMlVnZTF4eVhHNGdJQzEzWldKcmFYUXRZbTl5WkdWeUxYSmhaR2wxY3pvZ05YQjRPMXh5WEc1OVhISmNibHh5WEc0Nk9pMTNaV0pyYVhRdGMyTnliMnhzWW1GeUxYUm9kVzFpT25abGNuUnBZMkZzSUh0Y2NseHVJQ0JpWVdOclozSnZkVzVrTFdOdmJHOXlPaUJ5WjJKaEtEQXNJREFzSURBc0lEQXVNalVwTzF4eVhHNGdJQzEzWldKcmFYUXRZbTl5WkdWeUxYSmhaR2wxY3pvZ05YQjRPMXh5WEc1OVhISmNibHh5WEc0Nk9pMTNaV0pyYVhRdGMyTnliMnhzWW1GeUxYUm9kVzFpT21odmNtbDZiMjUwWVd3Z2UxeHlYRzRnSUdKaFkydG5jbTkxYm1RdFkyOXNiM0k2SUhKblltRW9NQ3dnTUN3Z01Dd2dNQzR5TlNrN1hISmNiaUFnTFhkbFltdHBkQzFpYjNKa1pYSXRjbUZrYVhWek9pQTFjSGc3WEhKY2JuMWNjbHh1WEhKY2JqbzZMWGRsWW10cGRDMXpZM0p2Ykd4aVlYSTZhRzkyWlhJZ2UxeHlYRzRnSUdKaFkydG5jbTkxYm1RdFkyOXNiM0k2SUhKblltRW9NQ3dnTUN3Z01Dd2dNQzR4TlNrN1hISmNibjFjY2x4dVhISmNiam82TFhkbFltdHBkQzF6WTNKdmJHeGlZWEl0ZEdoMWJXSTZhRzkyWlhJZ2UxeHlYRzRnSUdKaFkydG5jbTkxYm1RdFkyOXNiM0k2SUhKblltRW9NQ3dnTUN3Z01Dd2dNQzR6TlNrN1hISmNibjFjY2x4dUlpd2lRR2x0Y0c5eWRDQW5MaTlqYjJ4dmNuTW5PMXh5WEc1Y2NseHVMbk5sWTNScGIyNGdlMXh5WEc0Z0lHMWhjbWRwYmpvZ01XVnRJREE3WEhKY2JpQWdiM1psY21ac2IzYzZJR2hwWkdSbGJqdGNjbHh1WEhKY2JpQWdKbDlmYUdWaFpHVnlMRnh5WEc0Z0lDWmZYMk52Ym5SbGJuUXNYSEpjYmlBZ0psOWZabTl2ZEdWeUlIdGNjbHh1SUNBZ0lHMWhjbWRwYmpvZ01EdGNjbHh1SUNBZ0lIQmhaR1JwYm1jNklEQWdNMlZ0TzF4eVhHNGdJQ0FnYjNabGNtWnNiM2M2SUdocFpHUmxianRjY2x4dUlDQjlYSEpjYmx4eVhHNGdJQ1pmWDNScGRHeGxJSHRjY2x4dUlDQWdJR052Ykc5eU9pQkFkR2hwY21SZmRHVjRkRjlqYjJ4dmNqdGNjbHh1SUNCOVhISmNibHh5WEc0Z0lDWmZYMmd6SUh0Y2NseHVJQ0FnSUdOdmJHOXlPaUJBY0hKcGJXRnllVjlqYjJ4dmNqdGNjbHh1SUNBZ0lHWnZiblF0YzJsNlpUb2dNUzR6TldWdE8xeHlYRzRnSUgxY2NseHVYSEpjYmlBZ0psOWZhRFFnZTF4eVhHNGdJQ0FnWm05dWRDMXphWHBsT2lBeExqRmxiVHRjY2x4dUlDQWdJR052Ykc5eU9pQkFkR2hwY21SZmRHVjRkRjlqYjJ4dmNqdGNjbHh1SUNCOVhISmNibHh5WEc0Z0lDWmZYMmcxSUh0Y2NseHVJQ0FnSUdadmJuUXRjMmw2WlRvZ01XVnRPMXh5WEc0Z0lDQWdZMjlzYjNJNklFQm1iM1Z5ZEdoZmRHVjRkRjlqYjJ4dmNqdGNjbHh1SUNCOVhISmNibHh5WEc0Z0lDWmZYMlJzTEZ4eVhHNGdJQ1pmWDJSMExGeHlYRzRnSUNaZlgyUmtJSHRjY2x4dUlDQWdJRzFoY21kcGJqb2dNRHRjY2x4dUlDQWdJSEJoWkdScGJtYzZJREE3WEhKY2JpQWdJQ0J2ZG1WeVpteHZkem9nYUdsa1pHVnVPMXh5WEc0Z0lIMWNjbHh1WEhKY2JpQWdKbDlmWkd3Z2UxeHlYRzRnSUNBZ2NHOXphWFJwYjI0NklISmxiR0YwYVhabE8xeHlYRzRnSUNBZ2VpMXBibVJsZURvZ01UdGNjbHh1SUNCOVhISmNibHh5WEc0Z0lDWmZYMlIwSUh0Y2NseHVJQ0FnSUdScGMzQnNZWGs2SUdsdWJHbHVaUzFpYkc5amF6dGNjbHh1SUNCOVhISmNibHh5WEc0Z0lDWmZYMlJrSUh0Y2NseHVJQ0FnSUdScGMzQnNZWGs2SUdsdWJHbHVaUzFpYkc5amF6dGNjbHh1SUNBZ0lHTnZiRzl5T2lCQWMzVmpZMlZ6YzE5amIyeHZjanRjY2x4dUlDQjlYSEpjYmx4eVhHNGdJQ1pmWDNCeVpTQjdYSEpjYmlBZ0lDQnRZWEpuYVc0NklESmxiU0F3TzF4eVhHNGdJQ0FnY0dGa1pHbHVaem9nTVdWdE8xeHlYRzRnSUNBZ1ptOXVkQzF6YVhwbE9pQXhOSEI0TzF4eVhHNGdJQ0FnYkdsdVpTMW9aV2xuYUhRNklERTFNQ1U3WEhKY2JpQWdJQ0IwWlhoMExXRnNhV2R1T2lCc1pXWjBPMXh5WEc0Z0lDQWdZbUZqYTJkeWIzVnVaQzFqYjJ4dmNqb2dRR0puWDJOdmJHOXlPMXh5WEc0Z0lDQWdZbTl5WkdWeU9pQXhjSGdnYzI5c2FXUWdRR0p2Y21SbGNsOWpiMnh2Y2p0Y2NseHVJQ0FnSUdKdmNtUmxjaTF5WVdScGRYTTZJRFJ3ZUR0Y2NseHVJQ0FnSUdOdmJHOXlPaUJBZEdocGNtUmZkR1Y0ZEY5amIyeHZjanRjY2x4dUlDQWdJRzkyWlhKbWJHOTNPaUJoZFhSdk8xeHlYRzRnSUgxY2NseHVYSEpjYmlBZ0psOWZZMjlrWlNCN1hISmNiaUFnSUNCa2FYTndiR0Y1T2lCaWJHOWphenRjY2x4dUlDQWdJRzFoY21kcGJqb2dNQ0JoZFhSdk8xeHlYRzRnSUNBZ2IzWmxjbVpzYjNjNklHaHBaR1JsYmp0Y2NseHVJQ0I5WEhKY2JseHlYRzRnSUNaZlgyWnZiM1JsY2lCN1hISmNiaUFnSUNCaWIzSmtaWEl0ZEc5d09pQXhjSGdnYzI5c2FXUWdRR0p2Y21SbGNsOWpiMnh2Y2p0Y2NseHVJQ0FnSUcxaGNtZHBiaTEwYjNBNklETmxiVHRjY2x4dUlDQWdJR0poWTJ0bmNtOTFibVF0WTI5c2IzSTZJRUJpWjE5amIyeHZjanRjY2x4dUlDQWdJR052Ykc5eU9pQkFabTkxY25Sb1gzUmxlSFJmWTI5c2IzSTdYSEpjYmlBZ2ZWeHlYRzVjY2x4dUlDQW1YMTkwWVdKc1pTQjdYSEpjYmlBZ0lDQnRZWEpuYVc0NklERmxiU0JoZFhSdk8xeHlYRzRnSUNBZ2QybGtkR2c2SURFd01DVTdYSEpjYmlBZ0lDQmliM0prWlhJdGRHOXdPaUF4Y0hnZ2MyOXNhV1FnUUdKdmNtUmxjbDlqYjJ4dmNqdGNjbHh1SUNCOVhISmNibHh5WEc0Z0lDWmZYM1JvTEZ4eVhHNGdJQ1pmWDNSa0lIdGNjbHh1SUNBZ0lIQmhaR1JwYm1jNklEVndlQ0F4Tm5CNE8xeHlYRzRnSUNBZ2JHbHVaUzFvWldsbmFIUTZJREkyY0hnN1hISmNiaUFnSUNCaWIzSmtaWEl0WW05MGRHOXRPaUF4Y0hnZ2MyOXNhV1FnUUdKdmNtUmxjbDlqYjJ4dmNqdGNjbHh1SUNCOVhISmNibHh5WEc0Z0lDWmZYM1JvSUh0Y2NseHVJQ0FnSUhSbGVIUXRZV3hwWjI0NklHTmxiblJsY2p0Y2NseHVJQ0FnSUdKaFkydG5jbTkxYm1RdFkyOXNiM0k2SUVCaVoxOWpiMnh2Y2p0Y2NseHVJQ0I5WEhKY2JuMWNjbHh1WEhKY2JrQnRaV1JwWVNBb2JXRjRMWGRwWkhSb09pQTFNREJ3ZUNrZ2UxeHlYRzRnSUM1elpXTjBhVzl1SUh0Y2NseHVJQ0FnSUNaZlgyaGxZV1JsY2l4Y2NseHVJQ0FnSUNaZlgyTnZiblJsYm5RZ2UxeHlYRzRnSUNBZ0lDQndZV1JrYVc1bk9pQXdJREZsYlR0Y2NseHVJQ0FnSUgxY2NseHVJQ0I5WEhKY2JuMWNjbHh1SWl3aVFHbHRjRzl5ZENBbkxpOWpiMnh2Y25Nbk8xeHlYRzVjY2x4dUxtTmhjMlVnZTF4eVhHNGdJSEJ2YzJsMGFXOXVPaUJ5Wld4aGRHbDJaVHRjY2x4dUlDQjZMV2x1WkdWNE9pQXhPMXh5WEc0Z0lHUnBjM0JzWVhrNklHZHlhV1E3WEhKY2JpQWdaM0pwWkMxMFpXMXdiR0YwWlMxamIyeDFiVzV6T2lCeVpYQmxZWFFvTWl3Z01XWnlLVHRjY2x4dUlDQm5ZWEE2SURRd2NIZzdYSEpjYmlBZ2NHRmtaR2x1WnpvZ01XVnRPMXh5WEc0Z0lHSnZjbVJsY2kxMGIzQTZJREZ3ZUNCemIyeHBaQ0JBWW05eVpHVnlYMk52Ykc5eU8xeHlYRzRnSUdKdmNtUmxjaTFpYjNSMGIyMDZJREZ3ZUNCemIyeHBaQ0JBWW05eVpHVnlYMk52Ykc5eU8xeHlYRzRnSUc5MlpYSm1iRzkzT2lCb2FXUmtaVzQ3WEhKY2JseHlYRzRnSUNZNllXWjBaWElnZTF4eVhHNGdJQ0FnWTI5dWRHVnVkRG9nSnljN1hISmNiaUFnSUNCd2IzTnBkR2x2YmpvZ1lXSnpiMngxZEdVN1hISmNiaUFnSUNCNkxXbHVaR1Y0T2lBeU8xeHlYRzRnSUNBZ2RHOXdPaUF3TzF4eVhHNGdJQ0FnYkdWbWREb2dOVEFsTzF4eVhHNGdJQ0FnYUdWcFoyaDBPaUF4TURBbE8xeHlYRzRnSUNBZ2QybGtkR2c2SURBN1hISmNiaUFnSUNCaWIzSmtaWEl0YkdWbWREb2dNWEI0SUhOdmJHbGtJRUJpYjNKa1pYSmZZMjlzYjNJN1hISmNiaUFnSUNCdmRtVnlabXh2ZHpvZ2FHbGtaR1Z1TzF4eVhHNGdJSDFjY2x4dVhISmNiaUFnSmw5ZmNISmxMRnh5WEc0Z0lDWmZYM1JsZUhSaGNtVmhJSHRjY2x4dUlDQWdJR1p2Ym5RdGMybDZaVG9nTVROd2VEdGNjbHh1SUNBZ0lHeHBibVV0YUdWcFoyaDBPaUF4TlRBbE8xeHlYRzRnSUgxY2NseHVYSEpjYmlBZ0psOWZjSEpsTEZ4eVhHNGdJQ1pmWDJOdlpHVXNYSEpjYmlBZ0psOWZkR1Y0ZEdGeVpXRWdlMXh5WEc0Z0lDQWdabTl1ZEMxbVlXMXBiSGs2SUNkRGIzVnlhV1Z5SUU1bGR5Y3NJRU52Ym5OdmJHRnpMQ0JIWlc5eVoybGhMQ0JCY21saGJDd2djMkZ1Y3kxelpYSnBaanRjY2x4dUlDQjlYSEpjYmx4eVhHNGdJQ1pmWDNCeVpTQjdYSEpjYmlBZ0lDQnRZWEpuYVc0NklEQTdYSEpjYmlBZ0lDQndZV1JrYVc1bk9pQXhaVzA3WEhKY2JpQWdJQ0JpWVdOclozSnZkVzVrTFdOdmJHOXlPaUJBWW1kZlkyOXNiM0k3WEhKY2JpQWdJQ0JvWldsbmFIUTZJREV3TUNVN1hISmNiaUFnSUNCaWIzSmtaWEl0Y21Ga2FYVnpPaUEwY0hnN1hISmNiaUFnSUNCaWIzZ3RjMmw2YVc1bk9pQmliM0prWlhJdFltOTRPMXh5WEc0Z0lDQWdiM1psY21ac2IzYzZJR0YxZEc4N1hISmNiaUFnZlZ4eVhHNWNjbHh1SUNBbVgxOTBiMjlzWW1GeUlIdGNjbHh1SUNBZ0lHMWhjbWRwYmpvZ01DQmhkWFJ2TzF4eVhHNGdJQ0FnYUdWcFoyaDBPaUF6Tm5CNE8xeHlYRzRnSUNBZ2JHbHVaUzFvWldsbmFIUTZJRE0yY0hnN1hISmNiaUFnSUNCbWIyNTBMWE5wZW1VNklERTBjSGc3WEhKY2JpQWdJQ0J3WVdSa2FXNW5PaUF3SURFMmNIZzdYSEpjYmlBZ0lDQjBaWGgwTFdGc2FXZHVPaUJ5YVdkb2REdGNjbHh1SUNBZ0lHOTJaWEptYkc5M09pQm9hV1JrWlc0N1hISmNiaUFnZlZ4eVhHNWNjbHh1SUNBbVgxOWhZM1JwYjI0c1hISmNiaUFnSmw5ZmNtVnRiM1psSUh0Y2NseHVJQ0FnSUdOMWNuTnZjam9nY0c5cGJuUmxjanRjY2x4dUlDQWdJR052Ykc5eU9pQkFjM1ZqWTJWemMxOWpiMnh2Y2p0Y2NseHVJQ0FnSUhWelpYSXRjMlZzWldOME9pQnViMjVsTzF4eVhHNGdJSDFjY2x4dVhISmNiaUFnSmw5ZllXTjBhVzl1SUh0Y2NseHVJQ0FnSUdadmJuUXRjMmw2WlRvZ01UTndlRHRjY2x4dUlDQWdJSEJoWkdScGJtY3RiR1ZtZERvZ01UQndlRHRjY2x4dVhISmNiaUFnSUNBbU9tWnBjbk4wTFdOb2FXeGtJSHRjY2x4dUlDQWdJQ0FnY0dGa1pHbHVaeTFzWldaME9pQXdPMXh5WEc0Z0lDQWdmVnh5WEc0Z0lIMWNjbHh1WEhKY2JpQWdKbDlmY21WdGIzWmxJSHRjY2x4dUlDQWdJR1pzYjJGME9pQnlhV2RvZER0Y2NseHVJQ0I5WEhKY2JseHlYRzRnSUNaZlgyTnZibk52YkdVZ2UxeHlYRzRnSUNBZ2JXRnlaMmx1T2lBd0lHRjFkRzg3WEhKY2JpQWdJQ0JvWldsbmFIUTZJREU0TUhCNE8xeHlYRzRnSUNBZ1ltOXlaR1Z5T2lBeGNIZ2djMjlzYVdRZ1FHSnZjbVJsY2w5amIyeHZjanRjY2x4dUlDQWdJRzkyWlhKbWJHOTNPaUJvYVdSa1pXNDdYSEpjYmlBZ2ZWeHlYRzVjY2x4dUlDQW1YMTkwWlhoMFlYSmxZU0I3WEhKY2JpQWdJQ0J0WVhKbmFXNDZJREFnWVhWMGJ6dGNjbHh1SUNBZ0lIZHBaSFJvT2lBeE1EQWxPMXh5WEc0Z0lDQWdhR1ZwWjJoME9pQXhNREFsTzF4eVhHNGdJQ0FnWW05eVpHVnlPaUJ1YjI1bE8xeHlYRzRnSUNBZ2IzVjBiR2x1WlRvZ2JtOXVaVHRjY2x4dUlDQWdJSEJoWkdScGJtYzZJREZsYlR0Y2NseHVJQ0FnSUdKdmVDMXphWHBwYm1jNklHSnZjbVJsY2kxaWIzZzdYSEpjYmlBZ0lDQnZkbVZ5Wm14dmR6b2dZWFYwYnp0Y2NseHVJQ0I5WEhKY2JseHlYRzRnSUNaZlgyeHBjM1FzWEhKY2JpQWdKbDlmYVhSbGJTQjdYSEpjYmlBZ0lDQnRZWEpuYVc0NklEQTdYSEpjYmlBZ0lDQndZV1JrYVc1bk9pQXdPMXh5WEc0Z0lDQWdiR2x6ZEMxemRIbHNaUzEwZVhCbE9pQnViMjVsTzF4eVhHNGdJQ0FnYjNabGNtWnNiM2M2SUdocFpHUmxianRjY2x4dUlDQjlYSEpjYmx4eVhHNGdJQ1pmWDJ4cGMzUWdlMXh5WEc0Z0lDQWdhR1ZwWjJoME9pQXpOakJ3ZUR0Y2NseHVJQ0FnSUdKdmNtUmxjaTEwYjNBNklERndlQ0J6YjJ4cFpDQkFZbTl5WkdWeVgyTnZiRzl5TzF4eVhHNGdJQ0FnWW05eVpHVnlMV0p2ZEhSdmJUb2dNWEI0SUhOdmJHbGtJRUJpYjNKa1pYSmZZMjlzYjNJN1hISmNiaUFnSUNCbWIyNTBMWE5wZW1VNklERXpjSGc3WEhKY2JpQWdJQ0J2ZG1WeVpteHZkem9nWVhWMGJ6dGNjbHh1SUNCOVhISmNibHh5WEc0Z0lDWmZYMmwwWlcwZ2UxeHlYRzRnSUNBZ2FHVnBaMmgwT2lBek5uQjRPMXh5WEc0Z0lDQWdiR2x1WlMxb1pXbG5hSFE2SURNMmNIZzdYSEpjYmlBZ0lDQmpkWEp6YjNJNklIQnZhVzUwWlhJN1hISmNiaUFnSUNCd1lXUmthVzVuT2lBd0lERTJjSGc3WEhKY2JseHlYRzRnSUNBZ0pqcG9iM1psY2lCN1hISmNiaUFnSUNBZ0lHSmhZMnRuY205MWJtUXRZMjlzYjNJNklFQm9iM1psY2w5aVoxOWpiMnh2Y2p0Y2NseHVJQ0FnSUgxY2NseHVJQ0I5WEhKY2JuMWNjbHh1SWl3aVFHbHRjRzl5ZENBbkxpNHZMaTR2ZEdobGJXVXZiV2w0YVc1ekp6dGNjbHh1WEhKY2JpNXdZWEJsY2lCN1hISmNiaUFnTG5Ob1lXUnZkMTlzYVdkb2RGOXlaV2QxYkdGeUtDazdYSEpjYmlBZ2JXRnlaMmx1T2lBelpXMGdZWFYwYnp0Y2NseHVJQ0J0WVhndGQybGtkR2c2SURFeU1EQndlRHRjY2x4dUlDQndZV1JrYVc1bk9pQXlaVzA3WEhKY2JpQWdZbUZqYTJkeWIzVnVaQzFqYjJ4dmNqb2dRSGRvYVhSbE8xeHlYRzRnSUdKdmVDMXphWHBwYm1jNklHSnZjbVJsY2kxaWIzZzdYSEpjYmx4eVhHNGdJQ1l1Wm14bGVDQjdYSEpjYmlBZ0lDQmthWE53YkdGNU9pQm1iR1Y0TzF4eVhHNGdJQ0FnWm14bGVDMWthWEpsWTNScGIyNDZJSEp2ZHp0Y2NseHVJQ0FnSUdac1pYZ3RkM0poY0RvZ2JtOTNjbUZ3TzF4eVhHNGdJQ0FnYldGeVoybHVPaUF3TzF4eVhHNGdJQ0FnZDJsa2RHZzZJREV3TUNVN1hISmNiaUFnSUNCdFlYZ3RkMmxrZEdnNklERXdNQ1U3WEhKY2JpQWdJQ0JvWldsbmFIUTZJREV3TUNVN1hISmNiaUFnSUNCd1lXUmthVzVuT2lBd08xeHlYRzRnSUNBZ2IzWmxjbVpzYjNjNklHaHBaR1JsYmp0Y2NseHVYSEpjYmlBZ0lDQXVZWEowYVdOc1pTQjdYSEpjYmlBZ0lDQWdJR1pzWlhndFpHbHlaV04wYVc5dU9pQmpiMngxYlc0N1hISmNiaUFnSUNBZ0lIZHBaSFJvT2lBeE1EQWxPMXh5WEc0Z0lDQWdJQ0JpYjNndGMybDZhVzVuT2lCaWIzSmtaWEl0WW05NE8xeHlYRzVjY2x4dUlDQWdJQ0FnSmw5ZmJXRnBiaUI3WEhKY2JpQWdJQ0FnSUNBZ2FHVnBaMmgwT2lBeE1EQWxPMXh5WEc0Z0lDQWdJQ0FnSUdKdmVDMXphWHBwYm1jNklHSnZjbVJsY2kxaWIzZzdYSEpjYmlBZ0lDQWdJQ0FnYjNabGNtWnNiM2M2SUdGMWRHODdYSEpjYmlBZ0lDQWdJSDFjY2x4dVhISmNiaUFnSUNBZ0lDWmZYMkZ6YVdSbElIdGNjbHh1SUNBZ0lDQWdJQ0JpYjNKa1pYSXRjbWxuYUhRNklERndlQ0J6YjJ4cFpDQkFjSEpwYldGeWVWOWliM0prWlhKZlkyOXNiM0k3WEhKY2JpQWdJQ0FnSUgxY2NseHVJQ0FnSUgxY2NseHVJQ0I5WEhKY2JuMWNjbHh1WEhKY2JpNW9aV0ZrWlhJZ2UxeHlYRzRnSUhCdmMybDBhVzl1T2lCemRHbGphM2s3WEhKY2JpQWdlaTFwYm1SbGVEb2dNenRjY2x4dUlDQjBiM0E2SURBN1hISmNiaUFnYldGeVoybHVPaUF3SUdGMWRHODdYSEpjYmlBZ1ltOXlaR1Z5TFdKdmRIUnZiVG9nTVhCNElITnZiR2xrSUVCaWIzSmtaWEpmWTI5c2IzSTdYSEpjYmlBZ1ltRmphMmR5YjNWdVpDMWpiMnh2Y2pvZ1FIZG9hWFJsTzF4eVhHNGdJSFJsZUhRdFlXeHBaMjQ2SUdObGJuUmxjanRjY2x4dUlDQjBjbUZ1YzJsMGFXOXVMV1IxY21GMGFXOXVPaUF3TGpOek8xeHlYRzRnSUc5MlpYSm1iRzkzT2lCb2FXUmtaVzQ3WEhKY2JseHlYRzRnSUNaZmMzUnBZMnQ1SUh0Y2NseHVJQ0FnSUhCaFpHUnBibWN0YkdWbWREb2dNall3Y0hnN1hISmNiaUFnZlZ4eVhHNTlYSEpjYmx4eVhHNHVZWEowYVdOc1pTQjdYSEpjYmlBZ1pHbHpjR3hoZVRvZ1pteGxlRHRjY2x4dUlDQm1iR1Y0TFdScGNtVmpkR2x2YmpvZ2NtOTNPMXh5WEc0Z0lHWnNaWGd0ZDNKaGNEb2dibTkzY21Gd08xeHlYRzRnSUhCaFpHUnBibWM2SURKbGJTQXdPMXh5WEc0Z0lHWnZiblF0YzJsNlpUb2dNVFp3ZUR0Y2NseHVJQ0JzYVc1bExXaGxhV2RvZERvZ01UVXdKVHRjY2x4dVhISmNiaUFnSmw5ZmJXRnBiaUI3WEhKY2JpQWdJQ0JtYkdWNE9pQXhPMXh5WEc0Z0lDQWdjR0ZrWkdsdVp6b2dNQ0F5WlcwN1hISmNiaUFnSUNCdmRtVnlabXh2ZHpvZ2FHbGtaR1Z1TzF4eVhHNWNjbHh1SUNBZ0lDNXpaV04wYVc5dUlIdGNjbHh1SUNBZ0lDQWdiM1psY21ac2IzYzZJSFpwYzJsaWJHVTdYSEpjYmx4eVhHNGdJQ0FnSUNBbVgxOWpiMjUwWlc1MExGeHlYRzRnSUNBZ0lDQW1YMTltYjI5MFpYSXNYSEpjYmlBZ0lDQWdJQ1pmWDJobFlXUmxjaUI3WEhKY2JpQWdJQ0FnSUNBZ2IzWmxjbVpzYjNjNklIWnBjMmxpYkdVN1hISmNiaUFnSUNBZ0lIMWNjbHh1WEhKY2JpQWdJQ0FnSUNaZlgyaGxZV1JsY2l4Y2NseHVJQ0FnSUNBZ0psOWZZMjl1ZEdWdWRDQjdYSEpjYmlBZ0lDQWdJQ0FnYldGeVoybHVPaUF3TzF4eVhHNGdJQ0FnSUNCOVhISmNiaUFnSUNCOVhISmNiaUFnZlZ4eVhHNWNjbHh1SUNBbVgxOWhjMmxrWlNCN1hISmNiaUFnSUNCbWJHVjRMWE5vY21sdWF6b2dNRHRjY2x4dUlDQWdJSGRwWkhSb09pQXlOREJ3ZUR0Y2NseHVJQ0FnSUdKdmNtUmxjaTFzWldaME9pQXhjSGdnYzI5c2FXUWdRR0p2Y21SbGNsOWpiMnh2Y2p0Y2NseHVYSEpjYmlBZ0lDQW1MbXgwY2lCN1hISmNiaUFnSUNBZ0lHSnZjbVJsY2kxeWFXZG9kRG9nTVhCNElITnZiR2xrSUVCaWIzSmtaWEpmWTI5c2IzSTdYSEpjYmlBZ0lDQWdJR0p2Y21SbGNpMXNaV1owT2lCdWIyNWxPMXh5WEc0Z0lDQWdmVnh5WEc1Y2NseHVJQ0FnSUM1dmRYUnNhVzVsTFc1aGRtbG5ZWFJ2Y2lCN1hISmNiaUFnSUNBZ0lHSmhZMnRuY205MWJtUXRZMjlzYjNJNklFQjNhR2wwWlR0Y2NseHVJQ0FnSUgxY2NseHVJQ0I5WEhKY2JuMWNjbHh1WEhKY2JuQnlaU3hjY2x4dUxuTmxZM1JwYjI1ZlgzQnlaU0I3WEhKY2JpQWdjR0ZrWkdsdVp6b2dNbVZ0TzF4eVhHNGdJR1p2Ym5RdFptRnRhV3g1T2lBblEyOTFjbWxsY2lCT1pYY25MQ0JCY21saGJDd2djMkZ1Y3kxelpYSnBaanRjY2x4dUlDQmlZV05yWjNKdmRXNWtMV052Ykc5eU9pQkFZbWRmWTI5c2IzSTdYSEpjYmlBZ2IzWmxjbVpzYjNjNklHRjFkRzg3WEhKY2JuMWNjbHh1WEhKY2JtTnZaR1VzWEhKY2JpNXpaV04wYVc5dVgxOWpiMlJsSUh0Y2NseHVJQ0JtYjI1MExXWmhiV2xzZVRvZ0owTnZkWEpwWlhJZ1RtVjNKeXdnUVhKcFlXd3NJSE5oYm5NdGMyVnlhV1k3WEhKY2JpQWdabTl1ZEMxemFYcGxPaUF4Tm5CNE8xeHlYRzU5WEhKY2JseHlYRzR1Wm05dmRHVnlJSHRjY2x4dUlDQmliM0prWlhJdGRHOXdPaUF4Y0hnZ2MyOXNhV1FnUUhCeWFXMWhjbmxmWW05eVpHVnlYMk52Ykc5eU8xeHlYRzRnSUhCaFpHUnBibWM2SURObGJTQXdPMXh5WEc0Z0lIUmxlSFF0WVd4cFoyNDZJR05sYm5SbGNqdGNjbHh1WEhKY2JpQWdZU0I3WEhKY2JpQWdJQ0FtT214cGJtc3NYSEpjYmlBZ0lDQW1PblpwYzJsMFpXUXNYSEpjYmlBZ0lDQW1PbWh2ZG1WeUlIdGNjbHh1SUNBZ0lDQWdkR1Y0ZEMxa1pXTnZjbUYwYVc5dU9pQnViMjVsTzF4eVhHNGdJQ0FnSUNCamIyeHZjam9nUUhOMVkyTmxjM05mWTI5c2IzSTdYSEpjYmlBZ0lDQjlYSEpjYmx4eVhHNGdJQ0FnSmpwb2IzWmxjaUI3WEhKY2JpQWdJQ0FnSUhSbGVIUXRaR1ZqYjNKaGRHbHZiam9nZFc1a1pYSnNhVzVsTzF4eVhHNGdJQ0FnZlZ4eVhHNGdJSDFjY2x4dWZWeHlYRzVjY2x4dUxuVjBhV3h6TFdKdmNtUmxjaTF5YVdkb2RDQjdYSEpjYmlBZ1ltOXlaR1Z5TFhKcFoyaDBPaUF4Y0hnZ2MyOXNhV1FnUUhCeWFXMWhjbmxmWW05eVpHVnlYMk52Ykc5eU8xeHlYRzU5WEhKY2JseHlYRzR1YUdsa1pHVnVJSHRjY2x4dUlDQmthWE53YkdGNU9pQnViMjVsTzF4eVhHNTlYSEpjYmx4eVhHNUFiV1ZrYVdFZ0tHMWhlQzEzYVdSMGFEb2dOVEF3Y0hncElIdGNjbHh1SUNCb2RHMXNMRnh5WEc0Z0lHSnZaSGtnZTF4eVhHNGdJQ0FnYldGeVoybHVPaUF3TzF4eVhHNGdJSDFjY2x4dVhISmNiaUFnTG5CaGNHVnlJSHRjY2x4dUlDQWdJRzFoY21kcGJqb2dNRHRjY2x4dUlDQWdJSEJoWkdScGJtYzZJREE3WEhKY2JpQWdmVnh5WEc1Y2NseHVJQ0F1WVhKMGFXTnNaVjlmYldGcGJpQjdYSEpjYmlBZ0lDQndZV1JrYVc1bk9pQXdJREpsYlR0Y2NseHVJQ0I5WEhKY2JuMWNjbHh1SWl3aUx5b3FYSEpjYmlBcUlITm9ZV1J2ZHk1c1pYTnpJQzBnNlppMDViMng1cUMzNWJ5UDZLNis1NzJ1SUcxcGVHbHVlQ0RsaDczbWxiQmNjbHh1SUNvZ1BUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFZ4eVhHNGdLaUJEY21WaGRHVmtJRUo1T2lCWllXOW9ZV2w0YVdGdlhISmNiaUFxSUZWd1pHRjBaVG9nTWpBeU1pNHpMakl3WEhKY2JpQXFMMXh5WEc1QWFXMXdiM0owSUNjdUwyTnZiRzl5Y3ljN1hISmNibHh5WEc0dktpQTlQVDA5UFQwZzZaaTA1YjJ4NXFDMzVieVA2SzYrNTcydTVZZTk1cFd3SUQwOVBUMDlQU0FxTDF4eVhHNHVjMmhoWkc5M0tFQnZabVp6WlhRNklEQWdNQ0EyY0hnZ01YQjRMQ0JBWTI5c2IzSTZJRUJ3Y21sdFlYSjVYMkp2Y21SbGNsOWpiMnh2Y2lrZ2UxeHlYRzRnSUdKdmVDMXphR0ZrYjNjNklFQnZabVp6WlhRZ1FHTnZiRzl5TzF4eVhHNTlYSEpjYmx4eVhHNHVjMmhoWkc5M1gzSmxaM1ZzWVhJb1FHTnZiRzl5T2lCQWNISnBiV0Z5ZVY5aWIzSmtaWEpmWTI5c2IzSXBJSHRjY2x4dUlDQXVjMmhoWkc5M0tEQWdNQ0EyY0hnZ01YQjRMQ0JBWTI5c2IzSXBPMXh5WEc1OVhISmNibHh5WEc0dWMyaGhaRzkzWDJ4aGNtZGxLRUJqYjJ4dmNqb2dRSEJ5YVcxaGNubGZZbTl5WkdWeVgyTnZiRzl5S1NCN1hISmNiaUFnTG5Ob1lXUnZkeWd3SURBZ01USndlQ0F4Y0hnc0lFQmpiMnh2Y2lrN1hISmNibjFjY2x4dVhISmNiaTV6YUdGa2IzZGZiR2xuYUhSZmNtVm5kV3hoY2lncElIdGNjbHh1SUNBdWMyaGhaRzkzWDNKbFozVnNZWElvS1R0Y2NseHVmVnh5WEc1Y2NseHVMbk5vWVdSdmQxOXNhV2RvZEY5c1lYSm5aU2dwSUh0Y2NseHVJQ0F1YzJoaFpHOTNYMnhoY21kbEtDazdYSEpjYm4xY2NseHVYSEpjYmk1emFHRmtiM2RmWkdGeWExOXlaV2QxYkdGeUtDa2dlMXh5WEc0Z0lDNXphR0ZrYjNkZmNtVm5kV3hoY2loQWMyVmpiMjVrWVhKNVgySnZjbVJsY2w5amIyeHZjaWs3WEhKY2JuMWNjbHh1WEhKY2JpNXphR0ZrYjNkZlpHRnlhMTlzWVhKblpTZ3BJSHRjY2x4dUlDQXVjMmhoWkc5M1gyeGhjbWRsS0VCelpXTnZibVJoY25sZlltOXlaR1Z5WDJOdmJHOXlLVHRjY2x4dWZWeHlYRzRpTENJNmNtOXZkQ0I3WEhKY2JpQWdMUzF2ZFhSc2FXNWxMWHBKYm1SbGVEb2dNakF3TUR0Y2NseHVJQ0F0TFc5MWRHeHBibVV0YzNScFkydDVMV2hsYVdkb2REb2dNVEF3SlR0Y2NseHVJQ0F0TFc5MWRHeHBibVV0Ym1GMmFXZGhkRzl5TFhkcFpIUm9PaUF4TURBbE8xeHlYRzU5WEhKY2JpSXNJaThxSUQwOVBUMDlQVDA5UFQwZ2FXTnZiaTUwYUdWdFpTQXRJSE4yWnlEbG03N21vSWZubW9UbW9MZmx2SThnUFQwOVBUMDlQVDA5UFNBcUwxeHlYRzR1YjNWMGJHbHVaUzFwWTI5dUlIdGNjbHh1SUNCd2IzTnBkR2x2YmpvZ2NtVnNZWFJwZG1VN1hISmNiaUFnZWkxcGJtUmxlRG9nTVR0Y2NseHVJQ0JrYVhOd2JHRjVPaUJwYm14cGJtVXRZbXh2WTJzN1hISmNiaUFnZG1WeWRHbGpZV3d0WVd4cFoyNDZJRzFwWkdSc1pUdGNjbHh1SUNCM2FXUjBhRG9nTVdWdE8xeHlYRzRnSUdobGFXZG9kRG9nTVdWdE8xeHlYRzRnSUc5MlpYSm1iRzkzT2lCb2FXUmtaVzQ3WEhKY2JseHlYRzRnSUNaZlgzTjJaeUI3WEhKY2JpQWdJQ0J3YjNOcGRHbHZiam9nWVdKemIyeDFkR1U3WEhKY2JpQWdJQ0I2TFdsdVpHVjRPaUF5TzF4eVhHNGdJQ0FnZEc5d09pQTFNQ1U3WEhKY2JpQWdJQ0JzWldaME9pQTFNQ1U3WEhKY2JpQWdJQ0IzYVdSMGFEb2dNV1Z0TzF4eVhHNGdJQ0FnYUdWcFoyaDBPaUF4WlcwN1hISmNiaUFnSUNCbWFXeHNPaUJqZFhKeVpXNTBZMjlzYjNJN1hISmNiaUFnSUNCMGNtRnVjMlp2Y20wNklIUnlZVzV6YkdGMFpTZ3ROVEFsTENBdE5UQWxLVHRjY2x4dUlDQWdJRzkyWlhKbWJHOTNPaUJvYVdSa1pXNDdYSEpjYmlBZ2ZWeHlYRzVjY2x4dUlDQW1YMmhwWkdSbGJpQjdYSEpjYmlBZ0lDQmthWE53YkdGNU9pQnViMjVsTzF4eVhHNGdJSDFjY2x4dWZWeHlYRzRpTENJdktpQTlQVDA5UFNCVFkzSnZiR3hpWVhJZ1BUMDlQVDBnS2k5Y2NseHVPam90ZDJWaWEybDBMWE5qY205c2JHSmhjaUI3WEhKY2JpQWdkMmxrZEdnNklEZHdlRHRjY2x4dUlDQm9aV2xuYUhRNklEZHdlRHRjY2x4dUlDQXRkMlZpYTJsMExXSnZjbVJsY2kxeVlXUnBkWE02SURWd2VEdGNjbHh1WEhKY2JpQWdKaTEwY21GamF5MXdhV1ZqWlNCN1hISmNiaUFnSUNBdGQyVmlhMmwwTFdKdmNtUmxjaTF5WVdScGRYTTZJRFZ3ZUR0Y2NseHVJQ0I5WEhKY2JseHlYRzRnSUNZdGRHaDFiV0lnZTF4eVhHNGdJQ0FnSmpwMlpYSjBhV05oYkNCN1hISmNiaUFnSUNBZ0lHSmhZMnRuY205MWJtUXRZMjlzYjNJNklISm5ZbUVvTUN3Z01Dd2dNQ3dnTUM0eU5TazdYSEpjYmlBZ0lDQWdJQzEzWldKcmFYUXRZbTl5WkdWeUxYSmhaR2wxY3pvZ05YQjRPMXh5WEc0Z0lDQWdmVnh5WEc1Y2NseHVJQ0FnSUNZNmFHOXlhWHB2Ym5SaGJDQjdYSEpjYmlBZ0lDQWdJR0poWTJ0bmNtOTFibVF0WTI5c2IzSTZJSEpuWW1Fb01Dd2dNQ3dnTUN3Z01DNHlOU2s3WEhKY2JpQWdJQ0FnSUMxM1pXSnJhWFF0WW05eVpHVnlMWEpoWkdsMWN6b2dOWEI0TzF4eVhHNGdJQ0FnZlZ4eVhHNWNjbHh1SUNBZ0lDWTZhRzkyWlhJZ2UxeHlYRzRnSUNBZ0lDQmlZV05yWjNKdmRXNWtMV052Ykc5eU9pQnlaMkpoS0RBc0lEQXNJREFzSURBdU16VXBPMXh5WEc0Z0lDQWdmVnh5WEc0Z0lIMWNjbHh1WEhKY2JpQWdKanBvYjNabGNpQjdYSEpjYmlBZ0lDQmlZV05yWjNKdmRXNWtMV052Ykc5eU9pQnlaMkpoS0RBc0lEQXNJREFzSURBdU1UVXBPMXh5WEc0Z0lIMWNjbHh1ZlZ4eVhHNGlMQ0pBYVcxd2IzSjBJQ2N1TGk5MGFHVnRaUzlqYjJ4dmNuTW5PMXh5WEc1Y2NseHVMbTkxZEd4cGJtVXRhR1ZoWkdsdVp5QjdYSEpjYmlBZ2NHOXphWFJwYjI0NklISmxiR0YwYVhabE8xeHlYRzRnSUhvdGFXNWtaWGc2SURFN1hISmNiaUFnYjNabGNtWnNiM2M2SUdocFpHUmxianRjY2x4dVhISmNiaUFnSmw5ZllXNWphRzl5SUh0Y2NseHVJQ0FnSUdScGMzQnNZWGs2SUc1dmJtVTdYSEpjYmx4eVhHNGdJQ0FnSmpwc2FXNXJMRnh5WEc0Z0lDQWdKanAyYVhOcGRHVmtMRnh5WEc0Z0lDQWdKanBvYjNabGNpQjdYSEpjYmlBZ0lDQWdJR052Ykc5eU9pQkFabTkxY25Sb1gzUmxlSFJmWTI5c2IzSTdYSEpjYmlBZ0lDQWdJSFJsZUhRdFpHVmpiM0poZEdsdmJqb2dibTl1WlR0Y2NseHVJQ0FnSUgxY2NseHVYSEpjYmlBZ0lDQW1PbWh2ZG1WeUlIdGNjbHh1SUNBZ0lDQWdZMjlzYjNJNklFQndjbWx0WVhKNVgyTnZiRzl5TzF4eVhHNGdJQ0FnZlZ4eVhHNGdJSDFjY2x4dVhISmNiaUFnSmpwb2IzWmxjaUI3WEhKY2JpQWdJQ0F1YjNWMGJHbHVaUzFvWldGa2FXNW5YMTloYm1Ob2IzSWdlMXh5WEc0Z0lDQWdJQ0JrYVhOd2JHRjVPaUJwYm14cGJtVXRZbXh2WTJzN1hISmNiaUFnSUNCOVhISmNiaUFnZlZ4eVhHNWNjbHh1SUNBbVgzTjBZWEowSUh0Y2NseHVJQ0FnSUNZNmFHOTJaWElnZTF4eVhHNGdJQ0FnSUNCdmRtVnlabXh2ZHpvZ2RtbHphV0pzWlR0Y2NseHVJQ0FnSUgxY2NseHVYSEpjYmlBZ0lDQXViM1YwYkdsdVpTMW9aV0ZrYVc1blgxOWhibU5vYjNJZ2UxeHlYRzRnSUNBZ0lDQndiM05wZEdsdmJqb2dZV0p6YjJ4MWRHVTdYSEpjYmlBZ0lDQWdJSG90YVc1a1pYZzZJREk3WEhKY2JpQWdJQ0FnSUhSdmNEb2dOVEFsTzF4eVhHNGdJQ0FnSUNCMGNtRnVjMlp2Y20wNklIUnlZVzV6YkdGMFpWa29MVFV3SlNrN1hISmNiaUFnSUNBZ0lHeGxablE2SUMweFpXMDdYSEpjYmlBZ0lDQjlYSEpjYmlBZ2ZWeHlYRzU5WEhKY2JpSXNJa0JwYlhCdmNuUWdKeTR1TDNSb1pXMWxMM1poY21saFlteGxjeWM3WEhKY2JrQnBiWEJ2Y25RZ0p5NHVMM1JvWlcxbEwyTnZiRzl5Y3ljN1hISmNia0JwYlhCdmNuUWdKeTR1TDNSb1pXMWxMM05vWVdSdmR5YzdYSEpjYmx4eVhHNHViM1YwYkdsdVpTMWtjbUYzWlhJZ2UxeHlYRzRnSUhCdmMybDBhVzl1T2lCeVpXeGhkR2wyWlR0Y2NseHVJQ0I2TFdsdVpHVjRPaUF0TVR0Y2NseHVJQ0IwYjNBNklEQTdYSEpjYmlBZ2JHVm1kRG9nTUR0Y2NseHVJQ0J0WVhKbmFXNDZJREE3WEhKY2JpQWdkMmxrZEdnNklERXdNQ1U3WEhKY2JpQWdhR1ZwWjJoME9pQXhNREFsTzF4eVhHNGdJR0p2ZUMxemFYcHBibWM2SUdKdmNtUmxjaTFpYjNnN1hISmNiaUFnZG1semFXSnBiR2wwZVRvZ2FHbGtaR1Z1TzF4eVhHNGdJRzkyWlhKbWJHOTNPaUJvYVdSa1pXNDdYSEpjYmx4eVhHNGdJQ1pmWDIxdlpHRnNJSHRjY2x4dUlDQWdJQzV6YUdGa2IzZGZiR2xuYUhSZmNtVm5kV3hoY2lncE8xeHlYRzRnSUNBZ1pHbHpjR3hoZVRvZ1pteGxlRHRjY2x4dUlDQWdJR1pzWlhndFpHbHlaV04wYVc5dU9pQmpiMngxYlc0N1hISmNiaUFnSUNCbWJHVjRMWGR5WVhBNklHNXZkM0poY0R0Y2NseHVJQ0FnSUhCdmMybDBhVzl1T2lCaFluTnZiSFYwWlR0Y2NseHVJQ0FnSUhvdGFXNWtaWGc2SURJeE8xeHlYRzRnSUNBZ2FHVnBaMmgwT2lBeE1EQWxPMXh5WEc0Z0lDQWdZbUZqYTJkeWIzVnVaQzFqYjJ4dmNqb2dRSGRvYVhSbE8xeHlYRzRnSUNBZ2RISmhibk5wZEdsdmJpMWtkWEpoZEdsdmJqb2dNQzQwY3p0Y2NseHVJQ0FnSUc5MlpYSm1iRzkzT2lCb2FXUmtaVzQ3WEhKY2JpQWdmVnh5WEc1Y2NseHVJQ0FtWDE5b1pXRmtaWElzWEhKY2JpQWdKbDlmYldGcGJpeGNjbHh1SUNBbVgxOW1iMjkwWlhJZ2UxeHlYRzRnSUNBZ2QybGtkR2c2SURFd01DVTdYSEpjYmlBZ0lDQmliM2d0YzJsNmFXNW5PaUJpYjNKa1pYSXRZbTk0TzF4eVhHNGdJSDFjY2x4dVhISmNiaUFnSmw5ZmFHVmhaR1Z5TEZ4eVhHNGdJQ1pmWDJadmIzUmxjaUI3WEhKY2JpQWdJQ0JtYkdWNExYTm9jbWx1YXpvZ01EdGNjbHh1SUNCOVhISmNibHh5WEc0Z0lDWmZYM1JwZEd4bExGeHlYRzRnSUNaZlgyMWhhVzRzWEhKY2JpQWdKbDlmWm05dmRHVnlJSHRjY2x4dUlDQWdJSEJoWkdScGJtYzZJREFnTVRad2VEdGNjbHh1SUNCOVhISmNibHh5WEc0Z0lDWmZYMmhsWVdSbGNpeGNjbHh1SUNBbVgxOTBhWFJzWlNCN1hISmNiaUFnSUNCd2IzTnBkR2x2YmpvZ2NtVnNZWFJwZG1VN1hISmNiaUFnSUNCNkxXbHVaR1Y0T2lBeE8xeHlYRzRnSUNBZ2JXRnlaMmx1T2lBd0lHRjFkRzg3WEhKY2JpQWdJQ0JvWldsbmFIUTZJRFV5Y0hnN1hISmNiaUFnSUNCc2FXNWxMV2hsYVdkb2REb2dOVEp3ZUR0Y2NseHVJQ0FnSUc5MlpYSm1iRzkzT2lCb2FXUmtaVzQ3WEhKY2JpQWdmVnh5WEc1Y2NseHVJQ0FtWDE5MGFYUnNaU0I3WEhKY2JpQWdJQ0JtYjI1MExYTnBlbVU2SURFMmNIZzdYSEpjYmlBZ0lDQm1iMjUwTFhkbGFXZG9kRG9nTkRBd08xeHlYRzRnSUNBZ2JXRnlaMmx1T2lBd0lERTJjSGc3WEhKY2JpQWdJQ0JpYjNndGMybDZhVzVuT2lCaWIzSmtaWEl0WW05NE8xeHlYRzRnSUNBZ1ltOXlaR1Z5TFdKdmRIUnZiVG9nTVhCNElITnZiR2xrSUVCd2NtbHRZWEo1WDJKdmNtUmxjbDlqYjJ4dmNqdGNjbHh1SUNCOVhISmNibHh5WEc0Z0lDWmZYMk5zYjNObElIdGNjbHh1SUNBZ0lIQnZjMmwwYVc5dU9pQmhZbk52YkhWMFpUdGNjbHh1SUNBZ0lIb3RhVzVrWlhnNklESTdYSEpjYmlBZ0lDQjBiM0E2SURVd0pUdGNjbHh1SUNBZ0lISnBaMmgwT2lBeE1uQjRPMXh5WEc0Z0lDQWdkMmxrZEdnNklESXdjSGc3WEhKY2JpQWdJQ0JvWldsbmFIUTZJREl3Y0hnN1hISmNiaUFnSUNCc2FXNWxMV2hsYVdkb2REb2dNakJ3ZUR0Y2NseHVJQ0FnSUdOdmJHOXlPaUJBWm05MWNuUm9YM1JsZUhSZlkyOXNiM0k3WEhKY2JpQWdJQ0JtYjI1MExYTnBlbVU2SURJd2NIZzdYSEpjYmlBZ0lDQjBaWGgwTFdGc2FXZHVPaUJqWlc1MFpYSTdYSEpjYmlBZ0lDQmpkWEp6YjNJNklIQnZhVzUwWlhJN1hISmNiaUFnSUNCMGNtRnVjMlp2Y20wNklIUnlZVzV6YkdGMFpWa29MVFV3SlNrN1hISmNiaUFnSUNCdmRtVnlabXh2ZHpvZ2FHbGtaR1Z1TzF4eVhHNWNjbHh1SUNBZ0lDNXZkWFJzYVc1bExXbGpiMjRnZTF4eVhHNGdJQ0FnSUNCd2IzTnBkR2x2YmpvZ1lXSnpiMngxZEdVN1hISmNiaUFnSUNBZ0lIb3RhVzVrWlhnNklESTdYSEpjYmlBZ0lDQWdJSFJ2Y0RvZ01EdGNjbHh1SUNBZ0lDQWdiR1ZtZERvZ01EdGNjbHh1SUNBZ0lIMWNjbHh1WEhKY2JpQWdJQ0FtT21odmRtVnlJSHRjY2x4dUlDQWdJQ0FnWTI5c2IzSTZJRUIwYUdseVpGOTBaWGgwWDJOdmJHOXlPMXh5WEc0Z0lDQWdmVnh5WEc0Z0lIMWNjbHh1WEhKY2JpQWdKbDlmYldGcGJpQjdYSEpjYmlBZ0lDQm1iR1Y0T2lBeE8xeHlYRzRnSUNBZ2IzWmxjbVpzYjNjNklHRjFkRzg3WEhKY2JseHlYRzRnSUNBZ0ppNXZkbVZ5Wm14dmR5MW9hV1JrWlc0Z2UxeHlYRzRnSUNBZ0lDQnZkbVZ5Wm14dmR6b2dhR2xrWkdWdU8xeHlYRzRnSUNBZ2ZWeHlYRzRnSUgxY2NseHVYSEpjYmlBZ0psOWZabTl2ZEdWeUlIdGNjbHh1SUNBZ0lHMWhjbWRwYmpvZ01DQmhkWFJ2TzF4eVhHNGdJQ0FnZEdWNGRDMWhiR2xuYmpvZ2NtbG5hSFE3WEhKY2JpQWdJQ0J2ZG1WeVpteHZkem9nYUdsa1pHVnVPMXh5WEc0Z0lIMWNjbHh1WEhKY2JpQWdKbDlmYjNabGNteGhlU0I3WEhKY2JpQWdJQ0JqYjI1MFpXNTBPaUFuSnp0Y2NseHVJQ0FnSUhCdmMybDBhVzl1T2lCeVpXeGhkR2wyWlR0Y2NseHVJQ0FnSUhvdGFXNWtaWGc2SURFN1hISmNiaUFnSUNCMGIzQTZJREE3WEhKY2JpQWdJQ0JzWldaME9pQXdPMXh5WEc0Z0lDQWdkMmxrZEdnNklERXdNQ1U3WEhKY2JpQWdJQ0JvWldsbmFIUTZJREV3TUNVN1hISmNiaUFnSUNCaVlXTnJaM0p2ZFc1a0xXTnZiRzl5T2lCQWQyaHBkR1U3WEhKY2JpQWdJQ0J2Y0dGamFYUjVPaUF3TGpFN1hISmNiaUFnSUNCdmRtVnlabXh2ZHpvZ2FHbGtaR1Z1TzF4eVhHNGdJSDFjY2x4dVhISmNiaUFnSmw5eWRHd3NYSEpjYmlBZ0psOXNkSElnZTF4eVhHNGdJQ0FnSmk1dmRYUnNhVzVsTFdSeVlYZGxjaUI3WEhKY2JpQWdJQ0FnSUNaZmRHbHVlU0I3WEhKY2JpQWdJQ0FnSUNBZ2QybGtkR2c2SURJNE1IQjRPMXh5WEc0Z0lDQWdJQ0I5WEhKY2JseHlYRzRnSUNBZ0lDQW1YMjFwYm1rZ2UxeHlYRzRnSUNBZ0lDQWdJSGRwWkhSb09pQTBPREJ3ZUR0Y2NseHVJQ0FnSUNBZ2ZWeHlYRzVjY2x4dUlDQWdJQ0FnSmw5emJXRnNiQ0I3WEhKY2JpQWdJQ0FnSUNBZ2QybGtkR2c2SURVME1IQjRPMXh5WEc0Z0lDQWdJQ0I5WEhKY2JseHlYRzRnSUNBZ0lDQW1YM0psWjNWc1lYSWdlMXh5WEc0Z0lDQWdJQ0FnSUhkcFpIUm9PaUEyT0RCd2VEdGNjbHh1SUNBZ0lDQWdmVnh5WEc1Y2NseHVJQ0FnSUNBZ0psOXRaV1JwZFcwZ2UxeHlYRzRnSUNBZ0lDQWdJSGRwWkhSb09pQTNNakJ3ZUR0Y2NseHVJQ0FnSUNBZ2ZWeHlYRzVjY2x4dUlDQWdJQ0FnSmw5c1lYSm5aU0I3WEhKY2JpQWdJQ0FnSUNBZ2QybGtkR2c2SURrMk1IQjRPMXh5WEc0Z0lDQWdJQ0I5WEhKY2JpQWdJQ0I5WEhKY2JpQWdmVnh5WEc1Y2NseHVJQ0FtWDNKMGJDQjdYSEpjYmlBZ0lDQmliM0prWlhJdGJHVm1kRG9nTVhCNElITnZiR2xrSUVCd2NtbHRZWEo1WDJKdmNtUmxjbDlqYjJ4dmNqdGNjbHh1WEhKY2JpQWdJQ0FtTG05MWRHeHBibVV0WkhKaGQyVnlJSHRjY2x4dUlDQWdJQ0FnSmw5MGFXNTVJSHRjY2x4dUlDQWdJQ0FnSUNBbUxtOTFkR3hwYm1VdFpISmhkMlZ5WDJOc2IzTmxaQ0I3WEhKY2JpQWdJQ0FnSUNBZ0lDQnlhV2RvZERvZ0xUSTVNSEI0TzF4eVhHNGdJQ0FnSUNBZ0lIMWNjbHh1SUNBZ0lDQWdmVnh5WEc1Y2NseHVJQ0FnSUNBZ0psOXRhVzVwSUh0Y2NseHVJQ0FnSUNBZ0lDQW1MbTkxZEd4cGJtVXRaSEpoZDJWeVgyTnNiM05sWkNCN1hISmNiaUFnSUNBZ0lDQWdJQ0J5YVdkb2REb2dMVFE1TUhCNE8xeHlYRzRnSUNBZ0lDQWdJSDFjY2x4dUlDQWdJQ0FnZlZ4eVhHNWNjbHh1SUNBZ0lDQWdKbDl6YldGc2JDQjdYSEpjYmlBZ0lDQWdJQ0FnSmk1dmRYUnNhVzVsTFdSeVlYZGxjbDlqYkc5elpXUWdlMXh5WEc0Z0lDQWdJQ0FnSUNBZ2NtbG5hSFE2SUMwMU5UQndlRHRjY2x4dUlDQWdJQ0FnSUNCOVhISmNiaUFnSUNBZ0lIMWNjbHh1WEhKY2JpQWdJQ0FnSUNaZmNtVm5kV3hoY2lCN1hISmNiaUFnSUNBZ0lDQWdKaTV2ZFhSc2FXNWxMV1J5WVhkbGNsOWpiRzl6WldRZ2UxeHlYRzRnSUNBZ0lDQWdJQ0FnY21sbmFIUTZJQzAyT1RCd2VEdGNjbHh1SUNBZ0lDQWdJQ0I5WEhKY2JpQWdJQ0FnSUgxY2NseHVYSEpjYmlBZ0lDQWdJQ1pmYldWa2FYVnRJSHRjY2x4dUlDQWdJQ0FnSUNBbUxtOTFkR3hwYm1VdFpISmhkMlZ5WDJOc2IzTmxaQ0I3WEhKY2JpQWdJQ0FnSUNBZ0lDQnlhV2RvZERvZ0xUY3pNSEI0TzF4eVhHNGdJQ0FnSUNBZ0lIMWNjbHh1SUNBZ0lDQWdmVnh5WEc1Y2NseHVJQ0FnSUNBZ0psOXNZWEpuWlNCN1hISmNiaUFnSUNBZ0lDQWdKaTV2ZFhSc2FXNWxMV1J5WVhkbGNsOWpiRzl6WldRZ2UxeHlYRzRnSUNBZ0lDQWdJQ0FnY21sbmFIUTZJQzA1TnpCd2VEdGNjbHh1SUNBZ0lDQWdJQ0I5WEhKY2JpQWdJQ0FnSUgxY2NseHVJQ0FnSUgxY2NseHVJQ0I5WEhKY2JseHlYRzRnSUNaZmJIUnlJSHRjY2x4dUlDQWdJR0p2Y21SbGNpMXlhV2RvZERvZ01YQjRJSE52Ykdsa0lFQndjbWx0WVhKNVgySnZjbVJsY2w5amIyeHZjanRjY2x4dVhISmNiaUFnSUNBbUxtOTFkR3hwYm1VdFpISmhkMlZ5SUh0Y2NseHVJQ0FnSUNBZ0psOTBhVzU1SUh0Y2NseHVJQ0FnSUNBZ0lDQW1MbTkxZEd4cGJtVXRaSEpoZDJWeVgyTnNiM05sWkNCN1hISmNiaUFnSUNBZ0lDQWdJQ0JzWldaME9pQXRNamt3Y0hnN1hISmNiaUFnSUNBZ0lDQWdmVnh5WEc0Z0lDQWdJQ0I5WEhKY2JseHlYRzRnSUNBZ0lDQW1YMjFwYm1rZ2UxeHlYRzRnSUNBZ0lDQWdJQ1l1YjNWMGJHbHVaUzFrY21GM1pYSmZZMnh2YzJWa0lIdGNjbHh1SUNBZ0lDQWdJQ0FnSUd4bFpuUTZJQzAwT1RCd2VEdGNjbHh1SUNBZ0lDQWdJQ0I5WEhKY2JpQWdJQ0FnSUgxY2NseHVYSEpjYmlBZ0lDQWdJQ1pmYzIxaGJHd2dlMXh5WEc0Z0lDQWdJQ0FnSUNZdWIzVjBiR2x1WlMxa2NtRjNaWEpmWTJ4dmMyVmtJSHRjY2x4dUlDQWdJQ0FnSUNBZ0lHeGxablE2SUMwMU5UQndlRHRjY2x4dUlDQWdJQ0FnSUNCOVhISmNiaUFnSUNBZ0lIMWNjbHh1WEhKY2JpQWdJQ0FnSUNaZmNtVm5kV3hoY2lCN1hISmNiaUFnSUNBZ0lDQWdKaTV2ZFhSc2FXNWxMV1J5WVhkbGNsOWpiRzl6WldRZ2UxeHlYRzRnSUNBZ0lDQWdJQ0FnYkdWbWREb2dMVFk1TUhCNE8xeHlYRzRnSUNBZ0lDQWdJSDFjY2x4dUlDQWdJQ0FnZlZ4eVhHNWNjbHh1SUNBZ0lDQWdKbDl0WldScGRXMGdlMXh5WEc0Z0lDQWdJQ0FnSUNZdWIzVjBiR2x1WlMxa2NtRjNaWEpmWTJ4dmMyVmtJSHRjY2x4dUlDQWdJQ0FnSUNBZ0lHeGxablE2SUMwM016QndlRHRjY2x4dUlDQWdJQ0FnSUNCOVhISmNiaUFnSUNBZ0lIMWNjbHh1WEhKY2JpQWdJQ0FnSUNaZmJHRnlaMlVnZTF4eVhHNGdJQ0FnSUNBZ0lDWXViM1YwYkdsdVpTMWtjbUYzWlhKZlkyeHZjMlZrSUh0Y2NseHVJQ0FnSUNBZ0lDQWdJR3hsWm5RNklDMDVOekJ3ZUR0Y2NseHVJQ0FnSUNBZ0lDQjlYSEpjYmlBZ0lDQWdJSDFjY2x4dUlDQWdJSDFjY2x4dUlDQjlYSEpjYmx4eVhHNGdJQ1pmZEhSaUxGeHlYRzRnSUNaZlluUjBJSHRjY2x4dUlDQWdJR3hsWm5RNklEQTdYSEpjYmlBZ0lDQjNhV1IwYURvZ01UQXdKVHRjY2x4dVhISmNiaUFnSUNBbUxtOTFkR3hwYm1VdFpISmhkMlZ5SUh0Y2NseHVJQ0FnSUNBZ0psOTBhVzU1SUh0Y2NseHVJQ0FnSUNBZ0lDQm9aV2xuYUhRNklESTBNSEI0TzF4eVhHNGdJQ0FnSUNCOVhISmNibHh5WEc0Z0lDQWdJQ0FtWDIxcGJta2dlMXh5WEc0Z0lDQWdJQ0FnSUdobGFXZG9kRG9nTXpJd2NIZzdYSEpjYmlBZ0lDQWdJSDFjY2x4dVhISmNiaUFnSUNBZ0lDWmZjMjFoYkd3Z2UxeHlYRzRnSUNBZ0lDQWdJR2hsYVdkb2REb2dNell3Y0hnN1hISmNiaUFnSUNBZ0lIMWNjbHh1WEhKY2JpQWdJQ0FnSUNaZmNtVm5kV3hoY2lCN1hISmNiaUFnSUNBZ0lDQWdhR1ZwWjJoME9pQTBNREJ3ZUR0Y2NseHVJQ0FnSUNBZ2ZWeHlYRzVjY2x4dUlDQWdJQ0FnSmw5dFpXUnBkVzBnZTF4eVhHNGdJQ0FnSUNBZ0lHaGxhV2RvZERvZ05EUXdjSGc3WEhKY2JpQWdJQ0FnSUgxY2NseHVYSEpjYmlBZ0lDQWdJQ1pmYkdGeVoyVWdlMXh5WEc0Z0lDQWdJQ0FnSUdobGFXZG9kRG9nTkRnd2NIZzdYSEpjYmlBZ0lDQWdJSDFjY2x4dUlDQWdJSDFjY2x4dUlDQjlYSEpjYmx4eVhHNGdJQ1pmZEhSaUlIdGNjbHh1SUNBZ0lHSnZjbVJsY2kxaWIzUjBiMjA2SURGd2VDQnpiMnhwWkNCQWNISnBiV0Z5ZVY5aWIzSmtaWEpmWTI5c2IzSTdYSEpjYmx4eVhHNGdJQ0FnSmk1dmRYUnNhVzVsTFdSeVlYZGxjaUI3WEhKY2JpQWdJQ0FnSUNaZmRHbHVlU0I3WEhKY2JpQWdJQ0FnSUNBZ0ppNXZkWFJzYVc1bExXUnlZWGRsY2w5amJHOXpaV1FnZTF4eVhHNGdJQ0FnSUNBZ0lDQWdkRzl3T2lBdE1qVXdjSGc3WEhKY2JpQWdJQ0FnSUNBZ2ZWeHlYRzRnSUNBZ0lDQjlYSEpjYmx4eVhHNGdJQ0FnSUNBbVgyMXBibWtnZTF4eVhHNGdJQ0FnSUNBZ0lDWXViM1YwYkdsdVpTMWtjbUYzWlhKZlkyeHZjMlZrSUh0Y2NseHVJQ0FnSUNBZ0lDQWdJSFJ2Y0RvZ0xUTXpNSEI0TzF4eVhHNGdJQ0FnSUNBZ0lIMWNjbHh1SUNBZ0lDQWdmVnh5WEc1Y2NseHVJQ0FnSUNBZ0psOXpiV0ZzYkNCN1hISmNiaUFnSUNBZ0lDQWdKaTV2ZFhSc2FXNWxMV1J5WVhkbGNsOWpiRzl6WldRZ2UxeHlYRzRnSUNBZ0lDQWdJQ0FnZEc5d09pQXRNemN3Y0hnN1hISmNiaUFnSUNBZ0lDQWdmVnh5WEc0Z0lDQWdJQ0I5WEhKY2JseHlYRzRnSUNBZ0lDQW1YM0psWjNWc1lYSWdlMXh5WEc0Z0lDQWdJQ0FnSUNZdWIzVjBiR2x1WlMxa2NtRjNaWEpmWTJ4dmMyVmtJSHRjY2x4dUlDQWdJQ0FnSUNBZ0lIUnZjRG9nTFRReE1IQjRPMXh5WEc0Z0lDQWdJQ0FnSUgxY2NseHVJQ0FnSUNBZ2ZWeHlYRzVjY2x4dUlDQWdJQ0FnSmw5dFpXUnBkVzBnZTF4eVhHNGdJQ0FnSUNBZ0lDWXViM1YwYkdsdVpTMWtjbUYzWlhKZlkyeHZjMlZrSUh0Y2NseHVJQ0FnSUNBZ0lDQWdJSFJ2Y0RvZ0xUUTFNSEI0TzF4eVhHNGdJQ0FnSUNBZ0lIMWNjbHh1SUNBZ0lDQWdmVnh5WEc1Y2NseHVJQ0FnSUNBZ0psOXNZWEpuWlNCN1hISmNiaUFnSUNBZ0lDQWdKaTV2ZFhSc2FXNWxMV1J5WVhkbGNsOWpiRzl6WldRZ2UxeHlYRzRnSUNBZ0lDQWdJQ0FnZEc5d09pQXRORGt3Y0hnN1hISmNiaUFnSUNBZ0lDQWdmVnh5WEc0Z0lDQWdJQ0I5WEhKY2JpQWdJQ0I5WEhKY2JpQWdmVnh5WEc1Y2NseHVJQ0FtWDJKMGRDQjdYSEpjYmlBZ0lDQjBiM0E2SUdsdWFYUnBZV3c3WEhKY2JpQWdJQ0JpYjNKa1pYSXRkRzl3T2lBeGNIZ2djMjlzYVdRZ1FIQnlhVzFoY25sZlltOXlaR1Z5WDJOdmJHOXlPMXh5WEc1Y2NseHVJQ0FnSUNZdWIzVjBiR2x1WlMxa2NtRjNaWElnZTF4eVhHNGdJQ0FnSUNBbVgzUnBibmtnZTF4eVhHNGdJQ0FnSUNBZ0lDWXViM1YwYkdsdVpTMWtjbUYzWlhKZlkyeHZjMlZrSUh0Y2NseHVJQ0FnSUNBZ0lDQWdJR0p2ZEhSdmJUb2dMVEkxTUhCNE8xeHlYRzRnSUNBZ0lDQWdJSDFjY2x4dUlDQWdJQ0FnZlZ4eVhHNWNjbHh1SUNBZ0lDQWdKbDl0YVc1cElIdGNjbHh1SUNBZ0lDQWdJQ0FtTG05MWRHeHBibVV0WkhKaGQyVnlYMk5zYjNObFpDQjdYSEpjYmlBZ0lDQWdJQ0FnSUNCaWIzUjBiMjA2SUMwek16QndlRHRjY2x4dUlDQWdJQ0FnSUNCOVhISmNiaUFnSUNBZ0lIMWNjbHh1WEhKY2JpQWdJQ0FnSUNaZmMyMWhiR3dnZTF4eVhHNGdJQ0FnSUNBZ0lDWXViM1YwYkdsdVpTMWtjbUYzWlhKZlkyeHZjMlZrSUh0Y2NseHVJQ0FnSUNBZ0lDQWdJR0p2ZEhSdmJUb2dMVE0zTUhCNE8xeHlYRzRnSUNBZ0lDQWdJSDFjY2x4dUlDQWdJQ0FnZlZ4eVhHNWNjbHh1SUNBZ0lDQWdKbDl5WldkMWJHRnlJSHRjY2x4dUlDQWdJQ0FnSUNBbUxtOTFkR3hwYm1VdFpISmhkMlZ5WDJOc2IzTmxaQ0I3WEhKY2JpQWdJQ0FnSUNBZ0lDQmliM1IwYjIwNklDMDBNVEJ3ZUR0Y2NseHVJQ0FnSUNBZ0lDQjlYSEpjYmlBZ0lDQWdJSDFjY2x4dVhISmNiaUFnSUNBZ0lDWmZiV1ZrYVhWdElIdGNjbHh1SUNBZ0lDQWdJQ0FtTG05MWRHeHBibVV0WkhKaGQyVnlYMk5zYjNObFpDQjdYSEpjYmlBZ0lDQWdJQ0FnSUNCaWIzUjBiMjA2SUMwME5UQndlRHRjY2x4dUlDQWdJQ0FnSUNCOVhISmNiaUFnSUNBZ0lIMWNjbHh1WEhKY2JpQWdJQ0FnSUNaZmJHRnlaMlVnZTF4eVhHNGdJQ0FnSUNBZ0lDWXViM1YwYkdsdVpTMWtjbUYzWlhKZlkyeHZjMlZrSUh0Y2NseHVJQ0FnSUNBZ0lDQWdJR0p2ZEhSdmJUb2dMVFE1TUhCNE8xeHlYRzRnSUNBZ0lDQWdJSDFjY2x4dUlDQWdJQ0FnZlZ4eVhHNGdJQ0FnZlZ4eVhHNGdJSDFjY2x4dVhISmNiaUFnSmw5dmNHVnVaV1FnZTF4eVhHNGdJQ0FnZG1semFXSnBiR2wwZVRvZ2RtbHphV0pzWlR0Y2NseHVJQ0FnSUhvdGFXNWtaWGc2SUhaaGNpZ3RMVzkxZEd4cGJtVXRla2x1WkdWNEtUdGNjbHh1WEhKY2JpQWdJQ0FtTG05MWRHeHBibVV0WkhKaGQyVnlJSHRjY2x4dUlDQWdJQ0FnY0c5emFYUnBiMjQ2SUdacGVHVmtPMXh5WEc1Y2NseHVJQ0FnSUNBZ0psOXlkR3dnZTF4eVhHNGdJQ0FnSUNBZ0lISnBaMmgwT2lBd08xeHlYRzRnSUNBZ0lDQjlYSEpjYmx4eVhHNGdJQ0FnSUNBbVgyeDBjaUI3WEhKY2JpQWdJQ0FnSUNBZ2JHVm1kRG9nTUR0Y2NseHVJQ0FnSUNBZ2ZWeHlYRzVjY2x4dUlDQWdJQ0FnSmw5MGRHSWdlMXh5WEc0Z0lDQWdJQ0FnSUhSdmNEb2dNRHRjY2x4dUlDQWdJQ0FnZlZ4eVhHNWNjbHh1SUNBZ0lDQWdKbDlpZEhRZ2UxeHlYRzRnSUNBZ0lDQWdJR0p2ZEhSdmJUb2dNRHRjY2x4dUlDQWdJQ0FnZlZ4eVhHNGdJQ0FnZlZ4eVhHNGdJSDFjY2x4dVhISmNiaUFnSmw5dlptWnpaWFFnZTF4eVhHNGdJQ0FnSmk1dmRYUnNhVzVsTFdSeVlYZGxjaUI3WEhKY2JpQWdJQ0FnSUNaZmNuUnNMRnh5WEc0Z0lDQWdJQ0FtWDJ4MGNpQjdYSEpjYmlBZ0lDQWdJQ0FnYUdWcFoyaDBPaUJqWVd4aktERXdNQ1VnTFNBMFpXMHBPMXh5WEc0Z0lDQWdJQ0FnSUhSdmNEb2dOVEFsTzF4eVhHNGdJQ0FnSUNBZ0lIUnlZVzV6Wm05eWJUb2dkSEpoYm5Oc1lYUmxXU2d0TlRBbEtUdGNjbHh1SUNBZ0lDQWdmVnh5WEc1Y2NseHVJQ0FnSUNBZ0psOTBkR0lzWEhKY2JpQWdJQ0FnSUNaZlluUjBJSHRjY2x4dUlDQWdJQ0FnSUNCM2FXUjBhRG9nWTJGc1l5Z3hNREFsSUMwZ05HVnRLVHRjY2x4dUlDQWdJQ0FnSUNCc1pXWjBPaUExTUNVN1hISmNiaUFnSUNBZ0lDQWdkSEpoYm5ObWIzSnRPaUIwY21GdWMyeGhkR1ZZS0MwMU1DVXBPMXh5WEc0Z0lDQWdJQ0I5WEhKY2JseHlYRzRnSUNBZ0lDQW1YMjl3Wlc1bFpDQjdYSEpjYmlBZ0lDQWdJQ0FnSmk1dmRYUnNhVzVsTFdSeVlYZGxjaUI3WEhKY2JpQWdJQ0FnSUNBZ0lDQW1YM0owYkNCN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUhKcFoyaDBPaUF5WlcwN1hISmNiaUFnSUNBZ0lDQWdJQ0I5WEhKY2JseHlYRzRnSUNBZ0lDQWdJQ0FnSmw5c2RISWdlMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQnNaV1owT2lBeVpXMDdYSEpjYmlBZ0lDQWdJQ0FnSUNCOVhISmNibHh5WEc0Z0lDQWdJQ0FnSUNBZ0psOTBkR0lnZTF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0IwYjNBNklESmxiVHRjY2x4dUlDQWdJQ0FnSUNBZ0lIMWNjbHh1WEhKY2JpQWdJQ0FnSUNBZ0lDQW1YMkowZENCN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUdKdmRIUnZiVG9nTW1WdE8xeHlYRzRnSUNBZ0lDQWdJQ0FnZlZ4eVhHNGdJQ0FnSUNBZ0lIMWNjbHh1SUNBZ0lDQWdmVnh5WEc0Z0lDQWdmVnh5WEc0Z0lIMWNjbHh1WEhKY2JpQWdKbDloZFhSdklIdGNjbHh1SUNBZ0lDWXViM1YwYkdsdVpTMWtjbUYzWlhJZ2UxeHlYRzRnSUNBZ0lDQW1YM0owYkN4Y2NseHVJQ0FnSUNBZ0psOXNkSElnZTF4eVhHNGdJQ0FnSUNBZ0lHaGxhV2RvZERvZ1lYVjBienRjY2x4dUlDQWdJQ0FnSUNCdFlYZ3RhR1ZwWjJoME9pQmpZV3hqS0RFd01DVWdMU0EwWlcwcE8xeHlYRzRnSUNBZ0lDQjlYSEpjYmlBZ0lDQjlYSEpjYmlBZ2ZWeHlYRzVjY2x4dUlDQW1YMloxYkd3Z2UxeHlYRzRnSUNBZ2NHRmtaR2x1WnpvZ01EdGNjbHh1SUNCOVhISmNibjFjY2x4dUlpd2lRR2x0Y0c5eWRDQW5MaTR2ZEdobGJXVXZkbUZ5YVdGaWJHVnpKenRjY2x4dVFHbHRjRzl5ZENBbkxpNHZkR2hsYldVdlkyOXNiM0p6Snp0Y2NseHVRR2x0Y0c5eWRDQW5MaTR2ZEdobGJXVXZaV3hzYVhCemFYTW5PMXh5WEc1Y2NseHVMbTkxZEd4cGJtVXRibUYyYVdkaGRHOXlJSHRjY2x4dUlDQndiM05wZEdsdmJqb2djbVZzWVhScGRtVTdYSEpjYmlBZ2VpMXBibVJsZURvZ01UdGNjbHh1SUNCdFlYSm5hVzQ2SURBN1hISmNiaUFnZDJsa2RHZzZJSFpoY2lndExXOTFkR3hwYm1VdGJtRjJhV2RoZEc5eUxYZHBaSFJvS1R0Y2NseHVJQ0J2ZG1WeVpteHZkem9nWVhWMGJ6dGNjbHh1WEhKY2JpQWdKaTF3WVhKbGJuUWdlMXh5WEc0Z0lDQWdkSEpoYm5OcGRHbHZiam9nTUM0emN5QmxZWE5sTFdsdUxXOTFkRHRjY2x4dUlDQjlYSEpjYmx4eVhHNGdJQ1pmWDNScGRHeGxJSHRjY2x4dUlDQWdJRzFoY21kcGJqb2dNQ0F4Tm5CNE8xeHlYRzRnSUNBZ2FHVnBaMmgwT2lBME1IQjRPMXh5WEc0Z0lDQWdiR2x1WlMxb1pXbG5hSFE2SURRd2NIZzdYSEpjYmlBZ0lDQndZV1JrYVc1bk9pQXdJREUyY0hnN1hISmNiaUFnSUNCaWIzSmtaWEl0WW05MGRHOXRPaUF4Y0hnZ2MyOXNhV1FnUUhCeWFXMWhjbmxmWW05eVpHVnlYMk52Ykc5eU8xeHlYRzRnSUNBZ1ptOXVkQzF6YVhwbE9pQXhObkI0TzF4eVhHNGdJQ0FnWm05dWRDMTNaV2xuYUhRNklEUXdNRHRjY2x4dUlDQWdJRzkyWlhKbWJHOTNPaUJvYVdSa1pXNDdYSEpjYmlBZ2ZWeHlYRzVjY2x4dUlDQW1YMTl0WVdsdUlIdGNjbHh1SUNBZ0lIQnZjMmwwYVc5dU9pQnlaV3hoZEdsMlpUdGNjbHh1SUNBZ0lIb3RhVzVrWlhnNklERTdYSEpjYmlBZ0lDQnRZWEpuYVc0NklEQTdYSEpjYmlBZ0lDQnZkbVZ5Wm14dmR6b2dhR2xrWkdWdU8xeHlYRzRnSUgxY2NseHVYSEpjYmlBZ0psOWZiR2x6ZEN4Y2NseHVJQ0FtWDE5emRXSnFaV04wTEZ4eVhHNGdJQ1pmWDJsMFpXMGdlMXh5WEc0Z0lDQWdjRzl6YVhScGIyNDZJSEpsYkdGMGFYWmxPMXh5WEc0Z0lDQWdlaTFwYm1SbGVEb2dNanRjY2x4dUlDQWdJRzFoY21kcGJqb2dNRHRjY2x4dUlDQWdJSEJoWkdScGJtYzZJREE3WEhKY2JpQWdJQ0JzYVhOMExYTjBlV3hsTFhSNWNHVTZJRzV2Ym1VN1hISmNiaUFnSUNCdmRtVnlabXh2ZHpvZ2FHbGtaR1Z1TzF4eVhHNGdJSDFjY2x4dVhISmNiaUFnSmw5ZmJHbHpkQ0I3WEhKY2JpQWdJQ0J3WVdSa2FXNW5PaUF3TGpWbGJTQXdPMXh5WEc0Z0lIMWNjbHh1WEhKY2JpQWdKbDlmYzNWaWFtVmpkQ0I3WEhKY2JpQWdJQ0J3WVdSa2FXNW5MV3hsWm5RNklERmxiVHRjY2x4dUlDQjlYSEpjYmx4eVhHNGdJQ1pmWDJsMFpXMGdlMXh5WEc0Z0lDQWdiV0Z5WjJsdU9pQXdPMXh5WEc0Z0lDQWdiR2x1WlMxb1pXbG5hSFE2SURNd2NIZzdYSEpjYmlBZ0lDQm1iMjUwTFhOcGVtVTZJREV6Y0hnN1hISmNiaUFnSUNCdmRtVnlabXh2ZHpvZ2FHbGtaR1Z1TzF4eVhHNGdJSDFjY2x4dVhISmNiaUFnSmw5ZmNHeGhZMlZvYjJ4a1pYSWdlMXh5WEc0Z0lDQWdjRzl6YVhScGIyNDZJR0ZpYzI5c2RYUmxPMXh5WEc0Z0lDQWdlaTFwYm1SbGVEb2dNVHRjY2x4dUlDQWdJSFJ2Y0RvZ01EdGNjbHh1SUNBZ0lHeGxablE2SURBN1hISmNiaUFnSUNCM2FXUjBhRG9nTVRBd0pUdGNjbHh1SUNBZ0lHaGxhV2RvZERvZ016QndlRHRjY2x4dUlDQWdJR0poWTJ0bmNtOTFibVF0WTI5c2IzSTZJRUJvYjNabGNsOWlaMTlqYjJ4dmNqdGNjbHh1SUNBZ0lHSnZjbVJsY2kxc1pXWjBPaUF5Y0hnZ2MyOXNhV1FnUUhOMVkyTmxjM05mWTI5c2IzSTdYSEpjYmlBZ0lDQjBjbUZ1YzJsMGFXOXVMV1IxY21GMGFXOXVPaUF3TGpKek8xeHlYRzRnSUNBZ1ltOTRMWE5wZW1sdVp6b2dZbTl5WkdWeUxXSnZlRHRjY2x4dUlDQWdJRzkyWlhKbWJHOTNPaUJvYVdSa1pXNDdYSEpjYmlBZ2ZWeHlYRzVjY2x4dUlDQW1YMTloYm1Ob2IzSWdlMXh5WEc0Z0lDQWdMbVZzYkdsd2MybHpLREVwTzF4eVhHNGdJQ0FnWkdsemNHeGhlVG9nWW14dlkyczdYSEpjYmlBZ0lDQndZV1JrYVc1bk9pQXdJREV1TldWdE8xeHlYRzVjY2x4dUlDQWdJQ1k2YkdsdWF5eGNjbHh1SUNBZ0lDWTZkbWx6YVhSbFpDeGNjbHh1SUNBZ0lDWTZhRzkyWlhJZ2UxeHlYRzRnSUNBZ0lDQjBaWGgwTFdSbFkyOXlZWFJwYjI0NklHNXZibVU3WEhKY2JpQWdJQ0FnSUdOdmJHOXlPaUJBYzJWamIyNWtZWEo1WDNSbGVIUmZZMjlzYjNJN1hISmNiaUFnSUNCOVhISmNibHh5WEc0Z0lDQWdKanBvYjNabGNpQjdYSEpjYmlBZ0lDQWdJR052Ykc5eU9pQkFjM1ZqWTJWemMxOWpiMnh2Y2p0Y2NseHVJQ0FnSUgxY2NseHVJQ0I5WEhKY2JseHlYRzRnSUNaZlgyTnZaR1VnZTF4eVhHNGdJQ0FnY0dGa1pHbHVaeTF5YVdkb2REb2dNQzQxWlcwN1hISmNiaUFnZlZ4eVhHNWNjbHh1SUNBbVgyaHBaMmhzYVdkb2RDQjdYSEpjYmlBZ0lDQW1MbTkxZEd4cGJtVXRibUYyYVdkaGRHOXlYMTloYm1Ob2IzSWdlMXh5WEc0Z0lDQWdJQ0FtT214cGJtc3NYSEpjYmlBZ0lDQWdJQ1k2ZG1semFYUmxaQ3hjY2x4dUlDQWdJQ0FnSmpwb2IzWmxjaUI3WEhKY2JpQWdJQ0FnSUNBZ1kyOXNiM0k2SUVCemRXTmpaWE56WDJOdmJHOXlPMXh5WEc0Z0lDQWdJQ0FnSUdadmJuUXRkMlZwWjJoME9pQmliMnhrTzF4eVhHNGdJQ0FnSUNCOVhISmNiaUFnSUNCOVhISmNiaUFnZlZ4eVhHNWNjbHh1SUNBbVgzTjBhV05yZVN4Y2NseHVJQ0FtWDJacGVHVmtJSHRjY2x4dUlDQWdJR1JwYzNCc1lYazZJR1pzWlhnN1hISmNiaUFnSUNCbWJHVjRMWGR5WVhBNklHNXZkM0poY0R0Y2NseHVJQ0FnSUdac1pYZ3RaR2x5WldOMGFXOXVPaUJqYjJ4MWJXNDdYSEpjYmlBZ0lDQjZMV2x1WkdWNE9pQjJZWElvTFMxdmRYUnNhVzVsTFhwSmJtUmxlQ2s3WEhKY2JpQWdJQ0IwYjNBNklEQTdYSEpjYmlBZ0lDQnZkbVZ5Wm14dmR6b2dhR2xrWkdWdU8xeHlYRzVjY2x4dUlDQWdJQzV2ZFhSc2FXNWxMVzVoZG1sbllYUnZjaUI3WEhKY2JpQWdJQ0FnSUNaZlgzUnBkR3hsTEZ4eVhHNGdJQ0FnSUNBbVgxOXRZV2x1SUh0Y2NseHVJQ0FnSUNBZ0lDQmliM2d0YzJsNmFXNW5PaUJpYjNKa1pYSXRZbTk0TzF4eVhHNGdJQ0FnSUNCOVhISmNibHh5WEc0Z0lDQWdJQ0FtWDE5MGFYUnNaU0I3WEhKY2JpQWdJQ0FnSUNBZ1pteGxlQzF6YUhKcGJtczZJREE3WEhKY2JpQWdJQ0FnSUgxY2NseHVYSEpjYmlBZ0lDQWdJQ1pmWDIxaGFXNGdlMXh5WEc0Z0lDQWdJQ0FnSUdac1pYZzZJREU3WEhKY2JpQWdJQ0FnSUNBZ2IzWmxjbVpzYjNjNklHRjFkRzg3WEhKY2JpQWdJQ0FnSUgxY2NseHVJQ0FnSUgxY2NseHVJQ0I5WEhKY2JseHlYRzRnSUNaZmMzUnBZMnQ1SUh0Y2NseHVJQ0FnSUhCdmMybDBhVzl1T2lCemRHbGphM2s3WEhKY2JpQWdJQ0J0WVhndGFHVnBaMmgwT2lCMllYSW9MUzF2ZFhSc2FXNWxMWE4wYVdOcmVTMW9aV2xuYUhRcE8xeHlYRzRnSUgxY2NseHVYSEpjYmlBZ0psOW1hWGhsWkNCN1hISmNiaUFnSUNCd2IzTnBkR2x2YmpvZ1ptbDRaV1E3WEhKY2JpQWdJQ0J0WVhndGFHVnBaMmgwT2lBeE1EQWxPMXh5WEc0Z0lIMWNjbHh1WEhKY2JpQWdKbDlvYVdSa1pXNGdlMXh5WEc0Z0lDQWdaR2x6Y0d4aGVUb2dibTl1WlR0Y2NseHVJQ0I5WEhKY2JseHlYRzRnSUNaZlptOXNaR1ZrSUh0Y2NseHVJQ0FnSUhkcFpIUm9PaUF3TzF4eVhHNGdJQ0FnYjNabGNtWnNiM2M2SUdocFpHUmxianRjY2x4dUlDQjlYSEpjYm4xY2NseHVJaXdpTHlvcVhISmNiaUFxSUdWc2JHbHdjMmx6TG14bGMzTWdMU0RtbG9mbW5Lem5uSUhubGFVZ2JXbDRhVzU0SU9XSHZlYVZzRnh5WEc0Z0tpQTlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVhISmNiaUFxSUVOeVpXRjBaV1FnUW5rNklGbGhiMmhoYVhocFlXOWNjbHh1SUNvZ1ZYQmtZWFJsT2lBeU1ESXlMak11TVRGY2NseHVJQ292WEhKY2JseHlYRzR2S2lBOVBUMDlQVDBnNXBhSDVweXM1NXlCNTVXbDVZZTk1cFd3SUQwOVBUMDlQU0FxTDF4eVhHNHVaV3hzYVhCemFYTWdLRUJzYVc1bGN5a2dkMmhsYmlBb1FHeHBibVZ6UFRFcElIdGNjbHh1SUNCM2FHbDBaUzF6Y0dGalpUb2dibTkzY21Gd08xeHlYRzRnSUhSbGVIUXRiM1psY21ac2IzYzZJR1ZzYkdsd2MybHpPMXh5WEc0Z0lHOTJaWEptYkc5M09pQm9hV1JrWlc0N1hISmNibjFjY2x4dVhISmNiaTVsYkd4cGNITnBjeUFvUUd4cGJtVnpLU0IzYUdWdUlDaEFiR2x1WlhNK1BUSXBJSHRjY2x4dUlDQXRkMlZpYTJsMExXeHBibVV0WTJ4aGJYQTZJRUJzYVc1bGN6dGNjbHh1SUNCa2FYTndiR0Y1T2lCaWIzZzdYSEpjYmlBZ0xYZGxZbXRwZEMxaWIzZ3RiM0pwWlc1ME9pQjJaWEowYVdOaGJEdGNjbHh1SUNCMFpYaDBMVzkyWlhKbWJHOTNPaUJsYkd4cGNITnBjenRjY2x4dUlDQnZkbVZ5Wm14dmR6b2dhR2xrWkdWdU8xeHlYRzU5WEhKY2JpSXNJa0JwYlhCdmNuUWdKeTR1TDNSb1pXMWxMMk52Ykc5eWN5YzdYSEpjYmtCcGJYQnZjblFnSnk0dUwzUm9aVzFsTDJadmJuUW5PMXh5WEc1QWFXMXdiM0owSUNjdUxpOTBhR1Z0WlM5dGFYaHBibk1uTzF4eVhHNWNjbHh1TG05MWRHeHBibVV0Y21WaFpHVnlJSHRjY2x4dUlDQW1YMTl3Y205bmNtVnpjeUI3WEhKY2JpQWdJQ0J3YjNOcGRHbHZiam9nWm1sNFpXUTdYSEpjYmlBZ0lDQjBiM0E2SURBN1hISmNiaUFnSUNCc1pXWjBPaUF3TzF4eVhHNGdJQ0FnZWkxcGJtUmxlRG9nTXp0Y2NseHVJQ0FnSUdobGFXZG9kRG9nTkhCNE8xeHlYRzRnSUNBZ2QybGtkR2c2SURFd01DVTdYSEpjYmlBZ0lDQmlZV05yWjNKdmRXNWtMV052Ykc5eU9pQkFjSEpwYldGeWVWOWpiMnh2Y2p0Y2NseHVJQ0FnSUhOallXeGxPaUF3SURFN1hISmNiaUFnSUNCMGNtRnVjMlp2Y20wdGIzSnBaMmx1T2lCc1pXWjBPMXh5WEc0Z0lDQWdZVzVwYldGMGFXOXVPaUJ2ZFhSc2FXNWxMWEpsWVdSbGNpMXdjbTluY21WemN5QnNhVzVsWVhJN1hISmNiaUFnSUNCaGJtbHRZWFJwYjI0dGRHbHRaV3hwYm1VNklDMHRVSEp2WjNKbGMzTlVhVzFsYkdsdVpUdGNjbHh1SUNCOVhISmNibHh5WEc0Z0lDWmZYM0JoY0dWeUlIdGNjbHh1SUNBZ0lDNXphR0ZrYjNkZlpHRnlhMTl5WldkMWJHRnlLQ2s3WEhKY2JpQWdJQ0J0WVhKbmFXNDZJREpsYlNCaGRYUnZPMXh5WEc0Z0lDQWdiV0Y0TFhkcFpIUm9PaUF4TWpBd2NIZzdYSEpjYmlBZ0lDQndZV1JrYVc1bk9pQXpMakpsYlR0Y2NseHVJQ0FnSUdKdmVDMXphWHBwYm1jNklHSnZjbVJsY2kxaWIzZzdYSEpjYmlBZ0lDQmlZV05yWjNKdmRXNWtMV052Ykc5eU9pQkFkMmhwZEdVN1hISmNiaUFnSUNCdmRtVnlabXh2ZHpvZ2FHbGtaR1Z1TzF4eVhHNGdJSDFjY2x4dVhISmNiaUFnSmw5ZmRHbDBiR1VnZTF4eVhHNGdJQ0FnYldGeVoybHVPaUF3TGpZM1pXMGdNRHRjY2x4dUlDQWdJSFJsZUhRdFlXeHBaMjQ2SUdObGJuUmxjanRjY2x4dUlDQWdJR1p2Ym5RdFptRnRhV3g1T2lCQVptOXVkRjkwWlhoMFgyWmhiV2xzZVR0Y2NseHVJQ0FnSUdadmJuUXRkMlZwWjJoME9pQnViM0p0WVd3N1hISmNiaUFnSUNCc2FXNWxMV2hsYVdkb2REb2dNUzR6WlcwN1hISmNiaUFnSUNCbWIyNTBMWE5wZW1VNklEUXVNbVZ0TzF4eVhHNGdJQ0FnYjNabGNtWnNiM2M2SUdocFpHUmxianRjY2x4dUlDQjlYSEpjYmx4eVhHNGdJQ1pmWDJGeWRHbGpiR1VnZTF4eVhHNGdJQ0FnTG05MWRHeHBibVV0Y21WaFpHVnlYMTl3Y205bmNtVnpjeUI3WEhKY2JpQWdJQ0FnSUdScGMzQnNZWGs2SUc1dmJtVTdYSEpjYmlBZ0lDQjlYSEpjYmlBZ2ZWeHlYRzVjY2x4dUlDQW1YMmhwWkdSbGJpQjdYSEpjYmlBZ0lDQmthWE53YkdGNU9pQnViMjVsTzF4eVhHNWNjbHh1SUNBZ0lDWXViM1YwYkdsdVpTMXlaV0ZrWlhKZmMybGliR2x1WnlCN1hISmNiaUFnSUNBZ0lHUnBjM0JzWVhrNklHNXZibVVnSVdsdGNHOXlkR0Z1ZER0Y2NseHVYSEpjYmlBZ0lDQWdJQ1l1ZDNKaGNIQmxjaUI3WEhKY2JpQWdJQ0FnSUNBZ0ppNXdiM04wSUh0Y2NseHVJQ0FnSUNBZ0lDQWdJR1JwYzNCc1lYazZJRzV2Ym1VN1hISmNiaUFnSUNBZ0lDQWdmVnh5WEc0Z0lDQWdJQ0I5WEhKY2JpQWdJQ0I5WEhKY2JpQWdmVnh5WEc1Y2NseHVJQ0FtTFMxeVpXRmthVzVuSUh0Y2NseHVJQ0FnSUdScGMzQnNZWGs2SUdKc2IyTnJPMXh5WEc0Z0lDQWdjRzl6YVhScGIyNDZJR1pwZUdWa08xeHlYRzRnSUNBZ2VpMXBibVJsZURvZ01qdGNjbHh1SUNBZ0lIUnZjRG9nTUR0Y2NseHVJQ0FnSUd4bFpuUTZJREE3WEhKY2JpQWdJQ0IzYVdSMGFEb2dNVEF3SlR0Y2NseHVJQ0FnSUdobGFXZG9kRG9nTVRBd0pUdGNjbHh1SUNBZ0lHMWhjbWRwYmpvZ01EdGNjbHh1SUNBZ0lHSnZlQzF6YVhwcGJtYzZJR0p2Y21SbGNpMWliM2c3WEhKY2JpQWdJQ0J3WVdSa2FXNW5PaUF6WlcwZ05HVnRPMXh5WEc0Z0lDQWdZbUZqYTJkeWIzVnVaQzFqYjJ4dmNqb2dRR0puWDJOdmJHOXlPMXh5WEc0Z0lDQWdjMk55YjJ4c0xYUnBiV1ZzYVc1bExXNWhiV1U2SUMwdFVISnZaM0psYzNOVWFXMWxiR2x1WlR0Y2NseHVJQ0FnSUc5MlpYSm1iRzkzT2lCelkzSnZiR3c3WEhKY2JpQWdmVnh5WEc1OVhISmNibHh5WEc1QWEyVjVabkpoYldWeklHOTFkR3hwYm1VdGNtVmhaR1Z5TFhCeWIyZHlaWE56SUh0Y2NseHVJQ0IwYnlCN1hISmNiaUFnSUNCelkyRnNaVG9nTVNBeE8xeHlYRzRnSUgxY2NseHVmVnh5WEc1Y2NseHVRRzFsWkdsaElDaHRZWGd0ZDJsa2RHZzZJRFV3TUhCNEtTQjdYSEpjYmlBZ0xtOTFkR3hwYm1VZ2UxeHlYRzRnSUNBZ0ppMXlaV0ZrWlhJZ2UxeHlYRzRnSUNBZ0lDQnZkbVZ5Wm14dmR6b2dhR2xrWkdWdU8xeHlYRzVjY2x4dUlDQWdJQ0FnTG05MWRHeHBibVV0ZEc5dmJHSmhjaUI3WEhKY2JpQWdJQ0FnSUNBZ1pHbHpjR3hoZVRvZ1pteGxlRHRjY2x4dUlDQWdJQ0FnSUNCbWJHVjRMV1JwY21WamRHbHZiam9nY205M08xeHlYRzRnSUNBZ0lDQWdJR1pzWlhndGQzSmhjRG9nYm05M2NtRndPMXh5WEc0Z0lDQWdJQ0FnSUdGc2FXZHVMV2wwWlcxek9pQmpaVzUwWlhJN1hISmNiaUFnSUNBZ0lDQWdZV3hwWjI0dGMyVnNaam9nWVhWMGJ6dGNjbHh1SUNBZ0lDQWdJQ0IwYjNBNklERXdNQ1U3WEhKY2JpQWdJQ0FnSUNBZ2NtbG5hSFE2SURBN1hISmNiaUFnSUNBZ0lDQWdkSEpoYm5ObWIzSnRPaUIwY21GdWMyeGhkR1ZaS0MwME9IQjRLVHRjY2x4dUlDQWdJQ0FnSUNCM2FXUjBhRG9nTVRBd0pUdGNjbHh1SUNBZ0lDQWdJQ0JvWldsbmFIUTZJRFE0Y0hnN1hISmNiaUFnSUNBZ0lDQWdZbTk0TFhOcGVtbHVaem9nWW05eVpHVnlMV0p2ZUR0Y2NseHVJQ0FnSUNBZ0lDQmliM0prWlhJdGRHOXdPaUF4Y0hnZ2MyOXNhV1FnUUdKdmNtUmxjbDlqYjJ4dmNqdGNjbHh1SUNBZ0lDQWdJQ0JpWVdOclozSnZkVzVrTFdOdmJHOXlPaUJBZDJocGRHVTdYSEpjYmlBZ0lDQWdJQ0FnY0dGa1pHbHVaem9nTUNBeE5uQjRPMXh5WEc1Y2NseHVJQ0FnSUNBZ0lDQW1YMTlpZFhSMGIyNGdlMXh5WEc0Z0lDQWdJQ0FnSUNBZ0xuSmhaR2wxYzE5dWIyNWxLQ2s3WEhKY2JpQWdJQ0FnSUNBZ0lDQm1iR1Y0T2lBeE8xeHlYRzRnSUNBZ0lDQWdJQ0FnWW05eVpHVnlPaUJ1YjI1bE8xeHlYRzRnSUNBZ0lDQWdJQ0FnWW05NExYTm9ZV1J2ZHpvZ2JtOXVaVHRjY2x4dUlDQWdJQ0FnSUNCOVhISmNiaUFnSUNBZ0lIMWNjbHh1WEhKY2JpQWdJQ0FnSUNZdExYSmxZV1JwYm1jZ2UxeHlYRzRnSUNBZ0lDQWdJSEJoWkdScGJtYzZJREE3WEhKY2JpQWdJQ0FnSUNBZ1ltRmphMmR5YjNWdVpDMWpiMnh2Y2pvZ1FIZG9hWFJsTzF4eVhHNGdJQ0FnSUNBZ0lHSnZlQzF6YVhwcGJtYzZJR0p2Y21SbGNpMWliM2c3WEhKY2JpQWdJQ0FnSUgxY2NseHVYSEpjYmlBZ0lDQWdJQ1pmWDNCaGNHVnlJSHRjY2x4dUlDQWdJQ0FnSUNCd2IzTnBkR2x2YmpvZ2NtVnNZWFJwZG1VN1hISmNiaUFnSUNBZ0lDQWdlaTFwYm1SbGVEb2dNVHRjY2x4dUlDQWdJQ0FnSUNCdFlYSm5hVzQ2SURBN1hISmNiaUFnSUNBZ0lDQWdjR0ZrWkdsdVp6b2dNRHRjY2x4dUlDQWdJQ0FnSUNCb1pXbG5hSFE2SURFd01DVTdYSEpjYmlBZ0lDQWdJQ0FnWW05NExYTm9ZV1J2ZHpvZ2JtOXVaVHRjY2x4dUlDQWdJQ0FnSUNCdmRtVnlabXh2ZHpvZ2FHbGtaR1Z1TzF4eVhHNGdJQ0FnSUNCOVhISmNibHh5WEc0Z0lDQWdJQ0FtWDE5MGFYUnNaU0I3WEhKY2JpQWdJQ0FnSUNBZ0xtVnNiR2x3YzJsektERXBPMXh5WEc0Z0lDQWdJQ0FnSUhCdmMybDBhVzl1T2lCaFluTnZiSFYwWlR0Y2NseHVJQ0FnSUNBZ0lDQjZMV2x1WkdWNE9pQXpPMXh5WEc0Z0lDQWdJQ0FnSUhSdmNEb2dNRHRjY2x4dUlDQWdJQ0FnSUNCc1pXWjBPaUF3TzF4eVhHNGdJQ0FnSUNBZ0lHMWhjbWRwYmpvZ01EdGNjbHh1SUNBZ0lDQWdJQ0IzYVdSMGFEb2dNVEF3SlR0Y2NseHVJQ0FnSUNBZ0lDQm9aV2xuYUhRNklEUTRjSGc3WEhKY2JpQWdJQ0FnSUNBZ2JHbHVaUzFvWldsbmFIUTZJRFE0Y0hnN1hISmNiaUFnSUNBZ0lDQWdZbTl5WkdWeUxXSnZkSFJ2YlRvZ01YQjRJSE52Ykdsa0lFQmliM0prWlhKZlkyOXNiM0k3WEhKY2JpQWdJQ0FnSUNBZ1ptOXVkQzF6YVhwbE9pQXhMamhsYlR0Y2NseHVJQ0FnSUNBZ0lDQm1iMjUwTFhkbGFXZG9kRG9nTkRBd08xeHlYRzRnSUNBZ0lDQWdJR0poWTJ0bmNtOTFibVF0WTI5c2IzSTZJRUIzYUdsMFpUdGNjbHh1SUNBZ0lDQWdJQ0J2ZG1WeVpteHZkem9nYUdsa1pHVnVPMXh5WEc0Z0lDQWdJQ0I5WEhKY2JseHlYRzRnSUNBZ0lDQW1YMTloY25ScFkyeGxJSHRjY2x4dUlDQWdJQ0FnSUNCdFlYSm5hVzQ2SURRNGNIZ2dNRHRjY2x4dUlDQWdJQ0FnSUNCb1pXbG5hSFE2SUdOaGJHTW9NVEF3SlNBdElEazJjSGdwTzF4eVhHNGdJQ0FnSUNBZ0lIQmhaR1JwYm1jNklEQWdNUzR5TldWdE8xeHlYRzRnSUNBZ0lDQWdJSE5qY205c2JDMTBhVzFsYkdsdVpTMXVZVzFsT2lBdExVMXZZbWxzWlZCeWIyZHlaWE56VkdsdFpXeHBibVU3WEhKY2JpQWdJQ0FnSUNBZ2IzWmxjbVpzYjNjdGVEb2dhR2xrWkdWdU8xeHlYRzRnSUNBZ0lDQWdJRzkyWlhKbWJHOTNMWGs2SUhOamNtOXNiRHRjY2x4dVhISmNiaUFnSUNBZ0lDQWdMbTkxZEd4cGJtVXRjbVZoWkdWeVgxOXdjbTluY21WemN5QjdYSEpjYmlBZ0lDQWdJQ0FnSUNCNkxXbHVaR1Y0T2lBME8xeHlYRzRnSUNBZ0lDQWdJQ0FnWVc1cGJXRjBhVzl1T2lCdmRYUnNhVzVsTFhKbFlXUmxjaTF3Y205bmNtVnpjeUJzYVc1bFlYSTdYSEpjYmlBZ0lDQWdJQ0FnSUNCaGJtbHRZWFJwYjI0dGRHbHRaV3hwYm1VNklDMHRUVzlpYVd4bFVISnZaM0psYzNOVWFXMWxiR2x1WlR0Y2NseHVJQ0FnSUNBZ0lDQWdJR1JwYzNCc1lYazZJR0pzYjJOck8xeHlYRzRnSUNBZ0lDQWdJSDFjY2x4dUlDQWdJQ0FnZlZ4eVhHNGdJQ0FnZlZ4eVhHNGdJSDFjY2x4dWZWeHlYRzVjY2x4dVFHMWxaR2xoSUhCeWFXNTBJSHRjY2x4dUlDQm9kRzFzTEZ4eVhHNGdJR0p2WkhrZ2UxeHlYRzRnSUNBZ0x5b2c1b21UNVkydzU1cUU1Wis2NTZHQTVhMlg1TDJUNWFTbjViQ1BJQ292WEhKY2JpQWdJQ0JtYjI1MExYTnBlbVU2SURFeWNIUTdYSEpjYmlBZ0lDQXZLaURtbUw3bnBMcm9ycjdudmE3bWxvZmxyWmZwb3B6b2liTGxrb3pvZzR6bW1hL3BvcHpvaWJJZ0tpOWNjbHh1SUNBZ0lHSmhZMnRuY205MWJtUXRZMjlzYjNJNklFQjNhR2wwWlR0Y2NseHVJQ0FnSUdOdmJHOXlPaUJBY0hKcGJXRnllVjkwWlhoMFgyTnZiRzl5TzF4eVhHNGdJQ0FnYUdWcFoyaDBPaUJwYm1sMGFXRnNJQ0ZwYlhCdmNuUmhiblE3WEhKY2JpQWdmVnh5WEc1Y2NseHVJQ0F2S2lEb3JyN252YTdwazc3bWpxWG1vTGZsdkk4Z0tpOWNjbHh1SUNCaE9teHBibXNzWEhKY2JpQWdZVHAyYVhOcGRHVmtMRnh5WEc0Z0lHRTZhRzkyWlhJZ2UxeHlYRzRnSUNBZ2RHVjRkQzFrWldOdmNtRjBhVzl1T2lCMWJtUmxjbXhwYm1VZ0lXbHRjRzl5ZEdGdWREdGNjbHh1SUNBZ0lHTnZiRzl5T2lCQWNISnBiV0Z5ZVY5amIyeHZjanRjY2x4dUlDQjlYSEpjYmx4eVhHNGdJQzhxSU9tYWtPaVhqK1dxa3VTOWsrYWdoK2V0dmlBcUwxeHlYRzRnSUhacFpHVnZMRnh5WEc0Z0lHRjFaR2x2SUh0Y2NseHVJQ0FnSUdScGMzQnNZWGs2SUc1dmJtVWdJV2x0Y0c5eWRHRnVkRHRjY2x4dUlDQjlYSEpjYmx4eVhHNGdJQzhxSU9laHJ1Uy9uZWlocU9hZ3ZPV2NxT2FKaytXTnNPYVh0dWVhaE9pK3VlYWhodVdTak9XdnVlbTlrT2FXdWVXOGorYTRoZWFac0NBcUwxeHlYRzRnSUhSaFlteGxJSHRjY2x4dUlDQWdJSGRwWkhSb09pQXhNREFsTzF4eVhHNGdJQ0FnWW05eVpHVnlMV052Ykd4aGNITmxPaUJqYjJ4c1lYQnpaVHRjY2x4dUlDQjlYSEpjYmlBZ2RHZ3NYSEpjYmlBZ2RHUWdlMXh5WEc0Z0lDQWdZbTl5WkdWeU9pQXhjSGdnYzI5c2FXUWdRSEJ5YVcxaGNubGZZbTl5WkdWeVgyTnZiRzl5TzF4eVhHNGdJQ0FnY0dGa1pHbHVaem9nT0hCNElESXdjSGc3WEhKY2JpQWdmVnh5WEc1Y2NseHVJQ0F1YjNWMGJHbHVaU0I3WEhKY2JpQWdJQ0FtTFcxbGMzTmhaMlVzWEhKY2JpQWdJQ0FtTFhSdmIyeGlZWElnZTF4eVhHNGdJQ0FnSUNBdktpRHBtcERvbDQva3VvYmx0NlhsaGJmbW9JL2xrb3prdjZIbWdhL21qNURucExybW9ZWWdLaTljY2x4dUlDQWdJQ0FnWkdsemNHeGhlVG9nYm05dVpTQWhhVzF3YjNKMFlXNTBPMXh5WEc0Z0lDQWdmVnh5WEc1Y2NseHVJQ0FnSUNZdGNtVmhaR1Z5SUh0Y2NseHVJQ0FnSUNBZ1pHbHpjR3hoZVRvZ1lteHZZMnNnSVdsdGNHOXlkR0Z1ZER0Y2NseHVJQ0FnSUNBZ2IzWmxjbVpzYjNjNklHaHBaR1JsYmp0Y2NseHVYSEpjYmlBZ0lDQWdJQ1pmWDNScGRHeGxJSHRjY2x4dUlDQWdJQ0FnSUNCdFlYSm5hVzQ2SURFekxqUndkQ0F3SURJNGNIUWdJV2x0Y0c5eWRHRnVkRHRjY2x4dUlDQWdJQ0FnSUNCMFpYaDBMV0ZzYVdkdU9pQmpaVzUwWlhJZ0lXbHRjRzl5ZEdGdWREdGNjbHh1SUNBZ0lDQWdJQ0JtYjI1MExYTnBlbVU2SURNeWNIUWdJV2x0Y0c5eWRHRnVkRHRjY2x4dUlDQWdJQ0FnZlZ4eVhHNWNjbHh1SUNBZ0lDQWdMeW9nNVkrVzVyYUk1THFHNTd1ZDVhKzU1YTZhNUwyTklDb3ZYSEpjYmlBZ0lDQWdJQ1l0TFhKbFlXUnBibWNnZTF4eVhHNGdJQ0FnSUNBZ0lIQnZjMmwwYVc5dU9pQnlaV3hoZEdsMlpTQWhhVzF3YjNKMFlXNTBPMXh5WEc0Z0lDQWdJQ0FnSUdobGFXZG9kRG9nWVhWMGJ5QWhhVzF3YjNKMFlXNTBPMXh5WEc0Z0lDQWdJQ0FnSUhCaFpHUnBibWM2SURBZ0lXbHRjRzl5ZEdGdWREdGNjbHh1SUNBZ0lDQWdJQ0JpWVdOclozSnZkVzVrTFdOdmJHOXlPaUJBZDJocGRHVTdYSEpjYmlBZ0lDQWdJQ0FnYjNabGNtWnNiM2M2SUdocFpHUmxiaUFoYVcxd2IzSjBZVzUwTzF4eVhHNGdJQ0FnSUNCOVhISmNibHh5WEc0Z0lDQWdJQ0F2S2lEcG1wRG9sNC9wbUlYb3I3dm92NXZsdXFibW5hRWdLaTljY2x4dUlDQWdJQ0FnSmw5ZmNISnZaM0psYzNNZ2UxeHlYRzRnSUNBZ0lDQWdJR1JwYzNCc1lYazZJRzV2Ym1VZ0lXbHRjRzl5ZEdGdWREdGNjbHh1SUNBZ0lDQWdmVnh5WEc1Y2NseHVJQ0FnSUNBZ0x5b2c1b21UNVkydzVwZTI1TGlONXBpKzU2UzY1cTJqNXBhSElFUlBUU0RubW9UcG1MVGx2YkhtbFlqbW5wd2dLaTljY2x4dUlDQWdJQ0FnSmw5ZmNHRndaWElnZTF4eVhHNGdJQ0FnSUNBZ0lHSnZlQzF6YUdGa2IzYzZJRzV2Ym1VN1hISmNiaUFnSUNBZ0lIMWNjbHh1WEhKY2JpQWdJQ0FnSUhCeVpTQjdYSEpjYmlBZ0lDQWdJQ0FnY0dGa1pHbHVaem9nTVdWdElDRnBiWEJ2Y25SaGJuUTdYSEpjYmlBZ0lDQWdJQ0FnWW05eVpHVnlPaUF4Y0hnZ2MyOXNhV1FnUUdKdmNtUmxjbDlqYjJ4dmNpQWhhVzF3YjNKMFlXNTBPMXh5WEc0Z0lDQWdJQ0FnSUdKdmNtUmxjaTF5WVdScGRYTTZJRFJ3ZUNBaGFXMXdiM0owWVc1ME8xeHlYRzRnSUNBZ0lDQjlYSEpjYmx4eVhHNGdJQ0FnSUNCd2NtVXNYSEpjYmlBZ0lDQWdJR052WkdVZ2UxeHlYRzRnSUNBZ0lDQWdJR0poWTJ0bmNtOTFibVF0WTI5c2IzSTZJRUIzYUdsMFpTQWhhVzF3YjNKMFlXNTBPMXh5WEc0Z0lDQWdJQ0I5WEhKY2JseHlYRzRnSUNBZ0lDQjBZV0pzWlN4Y2NseHVJQ0FnSUNBZ2FXMW5MRnh5WEc0Z0lDQWdJQ0J6ZG1jZ2UxeHlYRzRnSUNBZ0lDQWdJR0p5WldGckxXbHVjMmxrWlRvZ1lYWnZhV1E3WEhKY2JpQWdJQ0FnSUgxY2NseHVYSEpjYmlBZ0lDQWdJQzhxSU9hSmdPYWNpZWFXaCtlcm9PV0doZVd1dVNCRVQwMGc1NXU0NVlXejU1cUU2WUs3NWJHRjZJcUM1NEs1NllPOTZacVE2SmVQNUxxR0lDb3ZYSEpjYmlBZ0lDQWdJQ1pmYzJsaWJHbHVaeUI3WEhKY2JpQWdJQ0FnSUNBZ1pHbHpjR3hoZVRvZ2JtOXVaU0FoYVcxd2IzSjBZVzUwTzF4eVhHNGdJQ0FnSUNCOVhISmNiaUFnSUNCOVhISmNiaUFnZlZ4eVhHNTlYSEpjYmlJc0lpOHFLbHh5WEc0Z0tpQnlZV1JwZFhNdWJHVnpjeUF0SU9XY2h1aW5rdWl1dnVlOXJpQnRhWGhwYm5nZzVZZTk1cFd3WEhKY2JpQXFJRDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMWNjbHh1SUNvZ1EzSmxZWFJsWkNCQ2VUb2dXV0Z2YUdGcGVHbGhiMXh5WEc0Z0tpQlZjR1JoZEdVNklESXdNalF1TkM0eE5seHlYRzRnS2k5Y2NseHVYSEpjYmk4cUlEMDlQVDA5UFNEbG5JYm9wNUxtb0xmbHZJL29ycjdudmE3bGg3M21sYkFnUFQwOVBUMDlJQ292WEhKY2JpNXlZV1JwZFhNb1FHNTFiVG9nTW5CNEtTQjdYSEpjYmlBZ1ltOXlaR1Z5TFhKaFpHbDFjem9nUUc1MWJUdGNjbHh1ZlZ4eVhHNWNjbHh1TG5KaFpHbDFjMTl1YjI1bEtDa2dlMXh5WEc0Z0lDNXlZV1JwZFhNb01DazdYSEpjYm4xY2NseHVYSEpjYmk1eVlXUnBkWE5mYldsdWFTZ3BJSHRjY2x4dUlDQXVjbUZrYVhWektESndlQ2s3WEhKY2JuMWNjbHh1WEhKY2JpNXlZV1JwZFhOZmMyMWhiR3dvS1NCN1hISmNiaUFnTG5KaFpHbDFjeWd6Y0hncE8xeHlYRzU5WEhKY2JseHlYRzR1Y21Ga2FYVnpYM0psWjNWc1lYSW9LU0I3WEhKY2JpQWdMbkpoWkdsMWN5ZzBjSGdwTzF4eVhHNTlYSEpjYmx4eVhHNHVjbUZrYVhWelgyMWxaR2wxYlNncElIdGNjbHh1SUNBdWNtRmthWFZ6S0RWd2VDazdYSEpjYm4xY2NseHVYSEpjYmk1eVlXUnBkWE5mYkdGeVoyVW9LU0I3WEhKY2JpQWdMbkpoWkdsMWN5Z3hNSEI0S1R0Y2NseHVmVnh5WEc1Y2NseHVMbkpoWkdsMWMxOW9kV2RsS0NrZ2UxeHlYRzRnSUM1eVlXUnBkWE1vTVRad2VDazdYSEpjYm4xY2NseHVYSEpjYmk1eVlXUnBkWE5mY205MWJtUW9LU0I3WEhKY2JpQWdMbkpoWkdsMWN5Z3pNSEI0S1R0Y2NseHVmVnh5WEc0aUxDSkFhVzF3YjNKMElDY3VMaTkwYUdWdFpTOWpiMnh2Y25Nbk8xeHlYRzVBYVcxd2IzSjBJQ2N1TGk5MGFHVnRaUzl6YUdGa2IzY25PMXh5WEc1Y2NseHVMbTkxZEd4cGJtVXRkRzl2YkdKaGNpQjdYSEpjYmlBZ2NHOXphWFJwYjI0NklHWnBlR1ZrTzF4eVhHNGdJSG90YVc1a1pYZzZJRGs1T1RrNU8xeHlYRzRnSUcxaGNtZHBiam9nTUR0Y2NseHVJQ0IwY21GdWMybDBhVzl1TFdSMWNtRjBhVzl1T2lBd0xqTnpPMXh5WEc0Z0lHOTJaWEptYkc5M09pQm9hV1JrWlc0N1hISmNibHh5WEc0Z0lDWmZYMkoxZEhSdmJpQjdYSEpjYmlBZ0lDQXVjMmhoWkc5M1gyeHBaMmgwWDNKbFozVnNZWElvS1R0Y2NseHVJQ0FnSUhCdmMybDBhVzl1T2lCeVpXeGhkR2wyWlR0Y2NseHVJQ0FnSUhvdGFXNWtaWGc2SURFN1hISmNiaUFnSUNCdFlYSm5hVzQ2SURFd2NIZzdYSEpjYmlBZ0lDQjNhV1IwYURvZ016WndlRHRjY2x4dUlDQWdJR2hsYVdkb2REb2dNelp3ZUR0Y2NseHVJQ0FnSUdKdmNtUmxjam9nTVhCNElITnZiR2xrSUVCd2NtbHRZWEo1WDJKdmNtUmxjbDlqYjJ4dmNqdGNjbHh1SUNBZ0lHSnZjbVJsY2kxeVlXUnBkWE02SUROd2VEdGNjbHh1SUNBZ0lHSnZlQzF6YVhwcGJtYzZJR0p2Y21SbGNpMWliM2c3WEhKY2JpQWdJQ0JpWVdOclozSnZkVzVrTFdOdmJHOXlPaUJBZDJocGRHVTdYSEpjYmlBZ0lDQmpkWEp6YjNJNklIQnZhVzUwWlhJN1hISmNiaUFnSUNCMFpYaDBMV0ZzYVdkdU9pQmpaVzUwWlhJN1hISmNiaUFnSUNCamIyeHZjam9nUUdadmRYSjBhRjkwWlhoMFgyTnZiRzl5TzF4eVhHNGdJQ0FnZEhKaGJuTnBkR2x2YmpvZ1lXeHNJREF1TTNNZ01DNHhjeUJsWVhObExXbHVMVzkxZER0Y2NseHVJQ0FnSUc5MlpYSm1iRzkzT2lCb2FXUmtaVzQ3WEhKY2JseHlYRzRnSUNBZ0pqcG9iM1psY2lCN1hISmNiaUFnSUNBZ0lHTnZiRzl5T2lCQWMzVmpZMlZ6YzE5amIyeHZjanRjY2x4dUlDQWdJQ0FnWW05eVpHVnlMV052Ykc5eU9pQkFjM1ZqWTJWemMxOWpiMnh2Y2p0Y2NseHVJQ0FnSUNBZ2RISmhibk5tYjNKdE9pQnpZMkZzWlNneExqTTFLVHRjY2x4dUlDQWdJSDFjY2x4dVhISmNiaUFnSUNBbUxtaHBaR1VnZTF4eVhHNGdJQ0FnSUNCa2FYTndiR0Y1T2lCdWIyNWxPMXh5WEc0Z0lDQWdmVnh5WEc0Z0lIMWNjbHh1WEhKY2JpQWdKbDlmWVc1amFHOXlJSHRjY2x4dUlDQWdJQ1k2YkdsdWF5eGNjbHh1SUNBZ0lDWTZkbWx6YVhSbFpDeGNjbHh1SUNBZ0lDWTZhRzkyWlhJZ2UxeHlYRzRnSUNBZ0lDQmpiMnh2Y2pvZ1FHWnZkWEowYUY5MFpYaDBYMk52Ykc5eU8xeHlYRzRnSUNBZ0lDQjBaWGgwTFdSbFkyOXlZWFJwYjI0NklHNXZibVU3WEhKY2JpQWdJQ0I5WEhKY2JseHlYRzRnSUNBZ0pqcG9iM1psY2lCN1hISmNiaUFnSUNBZ0lHTnZiRzl5T2lCQWMzVmpZMlZ6YzE5amIyeHZjanRjY2x4dUlDQWdJSDFjY2x4dUlDQjlYSEpjYmx4eVhHNGdJQ1pmWDJsamIyNGdlMXh5WEc0Z0lDQWdjRzl6YVhScGIyNDZJR0ZpYzI5c2RYUmxPMXh5WEc0Z0lDQWdlaTFwYm1SbGVEb2dNanRjY2x4dUlDQWdJSFJ2Y0RvZ05UQWxPMXh5WEc0Z0lDQWdiR1ZtZERvZ05UQWxPMXh5WEc0Z0lDQWdkMmxrZEdnNklESXdjSGc3WEhKY2JpQWdJQ0JvWldsbmFIUTZJREl3Y0hnN1hISmNiaUFnSUNCMGNtRnVjMlp2Y20wNklIUnlZVzV6YkdGMFpTZ3ROVEFsTENBdE5UQWxLVHRjY2x4dUlDQWdJR1pwYkd3NklHTjFjbkpsYm5SamIyeHZjanRjY2x4dUlDQWdJRzkyWlhKbWJHOTNPaUJvYVdSa1pXNDdYSEpjYmlBZ2ZWeHlYRzVjY2x4dUlDQW1YMkZqZEdsMlpTQjdYSEpjYmlBZ0lDQW1MbTkxZEd4cGJtVXRkRzl2YkdKaGNpQjdYSEpjYmlBZ0lDQWdJQ1pmWDJKMWRIUnZiaUI3WEhKY2JpQWdJQ0FnSUNBZ1kyOXNiM0k2SUVCM2FHbDBaVHRjY2x4dUlDQWdJQ0FnSUNCaVlXTnJaM0p2ZFc1a0xXTnZiRzl5T2lCQWMzVmpZMlZ6YzE5amIyeHZjanRjY2x4dUlDQWdJQ0FnSUNCaWIzSmtaWEl0WTI5c2IzSTZJRUJ6ZFdOalpYTnpYMk52Ykc5eU8xeHlYRzVjY2x4dUlDQWdJQ0FnSUNBbU9taHZkbVZ5SUh0Y2NseHVJQ0FnSUNBZ0lDQWdJR052Ykc5eU9pQkFkMmhwZEdVN1hISmNiaUFnSUNBZ0lDQWdmVnh5WEc0Z0lDQWdJQ0I5WEhKY2JpQWdJQ0I5WEhKY2JseHlYRzRnSUNBZ0xtOTFkR3hwYm1VdGRHOXZiR0poY2w5ZllXNWphRzl5SUh0Y2NseHVJQ0FnSUNBZ0pqcHNhVzVyTEZ4eVhHNGdJQ0FnSUNBbU9uWnBjMmwwWldRc1hISmNiaUFnSUNBZ0lDWTZhRzkyWlhJZ2UxeHlYRzRnSUNBZ0lDQWdJR052Ykc5eU9pQkFkMmhwZEdVN1hISmNiaUFnSUNBZ0lIMWNjbHh1SUNBZ0lIMWNjbHh1SUNCOVhISmNibHh5WEc0Z0lDWmZjbTkxYm1SbFpDQjdYSEpjYmlBZ0lDQW1MbTkxZEd4cGJtVXRkRzl2YkdKaGNsOWZZblYwZEc5dUlIdGNjbHh1SUNBZ0lDQWdZbTl5WkdWeUxYSmhaR2wxY3pvZ01UaHdlRHRjY2x4dUlDQWdJSDFjY2x4dUlDQjlYSEpjYmx4eVhHNGdJQ1pmWkdsellXSnNaV1FnZTF4eVhHNGdJQ0FnSmk1dmRYUnNhVzVsTFhSdmIyeGlZWElzWEhKY2JpQWdJQ0F1YjNWMGJHbHVaUzEwYjI5c1ltRnlJSHRjY2x4dUlDQWdJQ0FnSmw5ZllXNWphRzl5T214cGJtc3NYSEpjYmlBZ0lDQWdJQ1pmWDJGdVkyaHZjanAyYVhOcGRHVmtMRnh5WEc0Z0lDQWdJQ0FtWDE5aGJtTm9iM0k2YUc5MlpYSXNYSEpjYmlBZ0lDQWdJQ1pmWDJKMWRIUnZiaUI3WEhKY2JpQWdJQ0FnSUNBZ1kzVnljMjl5T2lCdWIzUXRZV3hzYjNkbFpEdGNjbHh1SUNBZ0lDQWdJQ0JqYjJ4dmNqb2dRR1p2ZFhKMGFGOTBaWGgwWDJOdmJHOXlPMXh5WEc0Z0lDQWdJQ0FnSUdKdmNtUmxjaTFqYjJ4dmNqb2dRR1p2ZFhKMGFGOTBaWGgwWDJOdmJHOXlPMXh5WEc1Y2NseHVJQ0FnSUNBZ0lDQW1PbWh2ZG1WeUlIdGNjbHh1SUNBZ0lDQWdJQ0FnSUdOdmJHOXlPaUJBWm05MWNuUm9YM1JsZUhSZlkyOXNiM0k3WEhKY2JpQWdJQ0FnSUNBZ0lDQmliM0prWlhJdFkyOXNiM0k2SUVCbWIzVnlkR2hmZEdWNGRGOWpiMnh2Y2p0Y2NseHVJQ0FnSUNBZ0lDQjlYSEpjYmlBZ0lDQWdJSDFjY2x4dVhISmNiaUFnSUNBZ0lDWmZYMkoxZEhSdmJpQjdYSEpjYmlBZ0lDQWdJQ0FnWW1GamEyZHliM1Z1WkMxamIyeHZjam9nUUdScGMyRmliR1ZrWDJKblgyTnZiRzl5TzF4eVhHNGdJQ0FnSUNCOVhISmNiaUFnSUNCOVhISmNiaUFnZlZ4eVhHNWNjbHh1SUNBbVgzUjBZaXhjY2x4dUlDQW1YMkowZENCN1hISmNiaUFnSUNCc1pXWjBPaUExTUNVN1hISmNiaUFnSUNCMGNtRnVjMlp2Y20wNklIUnlZVzV6YkdGMFpWZ29MVFV3SlNrN1hISmNibHh5WEc0Z0lDQWdMbTkxZEd4cGJtVXRkRzl2YkdKaGNsOWZZblYwZEc5dUlIdGNjbHh1SUNBZ0lDQWdaR2x6Y0d4aGVUb2dhVzVzYVc1bExXSnNiMk5yTzF4eVhHNGdJQ0FnZlZ4eVhHNGdJSDFjY2x4dVhISmNiaUFnSmw5MGRHSWdlMXh5WEc0Z0lDQWdkRzl3T2lBeE1uQjRPMXh5WEc1Y2NseHVJQ0FnSUNZdWIzVjBiR2x1WlMxMGIyOXNZbUZ5WDJocFpHUmxiaUI3WEhKY2JpQWdJQ0FnSUhSdmNEb2dMVFUyY0hnN1hISmNiaUFnSUNCOVhISmNiaUFnZlZ4eVhHNWNjbHh1SUNBbVgySjBkQ0I3WEhKY2JpQWdJQ0JpYjNSMGIyMDZJREV5Y0hnN1hISmNibHh5WEc0Z0lDQWdKaTV2ZFhSc2FXNWxMWFJ2YjJ4aVlYSmZhR2xrWkdWdUlIdGNjbHh1SUNBZ0lDQWdZbTkwZEc5dE9pQXROVFp3ZUR0Y2NseHVJQ0FnSUgxY2NseHVJQ0I5WEhKY2JseHlYRzRnSUNaZmNuUnNMRnh5WEc0Z0lDWmZiSFJ5SUh0Y2NseHVJQ0FnSUhSeVlXNXpabTl5YlRvZ2RISmhibk5zWVhSbFdTZ3ROVEFsS1R0Y2NseHVJQ0FnSUhkcFpIUm9PaUExTm5CNE8xeHlYRzRnSUgxY2NseHVYSEpjYmlBZ0psOXlkR3dnZTF4eVhHNGdJQ0FnZEc5d09pQTFNQ1U3WEhKY2JpQWdJQ0J5YVdkb2REb2dNVEp3ZUR0Y2NseHVYSEpjYmlBZ0lDQW1MbTkxZEd4cGJtVXRkRzl2YkdKaGNsOW9hV1JrWlc0Z2UxeHlYRzRnSUNBZ0lDQnlhV2RvZERvZ0xUZzJjSGc3WEhKY2JpQWdJQ0I5WEhKY2JpQWdmVnh5WEc1Y2NseHVJQ0FtWDJ4MGNpQjdYSEpjYmlBZ0lDQjBiM0E2SURVd0pUdGNjbHh1SUNBZ0lHeGxablE2SURFeWNIZzdYSEpjYmx4eVhHNGdJQ0FnSmk1dmRYUnNhVzVsTFhSdmIyeGlZWEpmYUdsa1pHVnVJSHRjY2x4dUlDQWdJQ0FnYkdWbWREb2dMVGcyY0hnN1hISmNiaUFnSUNCOVhISmNiaUFnZlZ4eVhHNWNjbHh1SUNBbVgzUjBZaXhjY2x4dUlDQW1YM0owYkN4Y2NseHVJQ0FtWDJKMGRDeGNjbHh1SUNBbVgyeDBjaUI3WEhKY2JpQWdJQ0F1YjNWMGJHbHVaUzEwYjI5c1ltRnlYMTlpZFhSMGIyNGdlMXh5WEc0Z0lDQWdJQ0FtTG05MWRHeHBibVV0ZEc5dmJHSmhjbDlvYVdSa1pXNGdlMXh5WEc0Z0lDQWdJQ0FnSUdScGMzQnNZWGs2SUc1dmJtVTdYSEpjYmlBZ0lDQWdJSDFjY2x4dUlDQWdJSDFjY2x4dUlDQjlYSEpjYm4xY2NseHVJbDE5ICovXG4iXSwiZmlsZSI6ImNzcy9leGFtcGxlLm1pbi5jc3MifQ== */ diff --git a/docs/examples/anchors.html b/docs/examples/anchors.html deleted file mode 100644 index 68764b20..00000000 --- a/docs/examples/anchors.html +++ /dev/null @@ -1,61 +0,0 @@ -outline.js - 自动生成文章导读(Table of Contents)导航的 JavaScript 工具

outline.js - 自动生成文章导读(Table of Contents)导航的 JavaScript 工具。会自动分析文章中的标题( h1~h6 )标签,并生成文章段落层次结构的导读导航菜单。

创作灵感

AnchorJS 是 outline.js 的创作灵感来源。既然 AnchorJS 可创建标题的链接,为什么不直接给文章生成一个文章导读(Table of Contents)导航呢? 于是就有了outline.js。

特点(Features)

  • 原生 JavaScript 编写,无需任何依赖;
  • 支持 UMD 规范;
  • 支持 E6 模块,提供功能独立的 ES6 模块;
    • Anchors 模块:类似 AnchorJS 基础功能模块,自动分析段落层级;
    • Drawer 模块:独立的侧滑窗口模块;
    • Navigator 模块:独立的导航菜单模块;
    • Toolbar 模块:独立的固定定位的工具栏模块;
  • 拥有 AnchorJS 基础功能;
  • 支持中文和英文标题文字生成ID;
  • 支持生成独立的侧边栏导航菜单;
  • 支持直接在文章中生成文章导读导航;
  • 自动分析标题关系,生成段落层级索引值;
  • 可以作为 jQuery 插件使用;
  • 界面简洁大方;
  • 配置灵活,丰富,让你随心所欲掌控 outline.js;

安装说明

outline.js 提供多种安装方式的支持: npm 安装、加载 CDN 资源、以及本地资源调用。

npm install

$ npm install -S @yaohaixiao/outline.js

CDN 调用

<script src="https://cdn.jsdelivr.net/gh/yaohaixiao/outline.js/outline.min.js"></script>

调用本地JS文件

<script src="path/to/outline.min.js"></script>

使用说明

outline.js 既支持在 node.js 环境中以 CommonJS 模块调用,也支持 ES6 模块方式加载。

// Node.js 环境中使用
-const Outline = require('@yaohaixiao/outline.js')
-
-// 作为 ES6 模块使用
-import Outline from '@yaohaixiao/outline.js/src/outline'
-// 调用其他独立模块
-import Anchors from '@yaohaixiao/outline.js/src/anchors'
-import Navigator from '@yaohaixiao/outline.js/src/navigator'
-import Drawer from '@yaohaixiao/outline.js/src/drawer'
-import Toolbar from '@yaohaixiao/outline.js/src/toolbar'
-import Reader form '@yaohaixiao/outline.js/src/reader'
-
-// 创建 Outline 实例
-// 2.0.0 调整了配置参数,配置更加简单
-const outline = new Outline({
-  // 文章显示区域的 DOM 元素或者选择器字符串
-  articleElement: '#article',
-  // 要收集的标题选择器
-  selector: 'h2,h3,h4,h5,h6',
-  // 负责文章区域滚动的元素
-  // String 类型 - 选择器字符串,默认值:html,body(window窗口)
-  // HTMLElement 类型 - DOM 元素
-  scrollElement: 'html,body',
-  // 文章导读菜单的位置
-  // relative - (默认值)创建独立的侧滑菜单
-  // sticky - 导航菜单将以 sticky 模式布局(需要确保菜单插入位置支持 sticky 模式布局)
-  // fixed - 导航菜单将以 fixed 模式布局,会自动监听滚动位置,模拟 sticky 布局
-  // sticky 和 fixed 布局时,需要设置 parentElement
-  // 2.0.0 暂时不支持在文章开始位置插入 chapters 导航菜单
-  position: 'sticky',
-  // 设置 position: relative 时,placment 定义侧滑菜单和 toolbar 导航位置:
-  // rtl - 菜单位置在窗口右侧,滑动动画为:right to left
-  // ltr - 菜单位置在窗口左侧,滑动动画为:left to right
-  // ttb - 菜单位置在窗口上方,滑动动画为:top to bottom
-  // btt - 菜单位置在窗口下方,滑动动画为:bottom to top
-  placement: '',
-  // 导航菜单将要插入的位置(DOM 元素)
-  // String 类型 - 选择器字符串
-  // HTMLElement 类型 - 插入的 DOM 元素
-  // 仅在 position 设置为 sticky 和 fixed 布局时有效
-  parentElement: '#aside',
-  // 是否显示段落章节编号
-  showCode: true,
-  // 标题图标链接的 URL 地址
-  // (默认)没有设置定制,点击链接页面滚动到标题位置
-  // 设置了链接地址,则不会滚动定位
-  anchorURL: '',
-  // DIYer的福利
-  // 独立侧滑菜单时,customClass 会追加到 drawer 侧滑窗口组件
-  // 在文章中显示导航菜单时,customClass 会追加到 chapters 导航菜单
-  customClass
-});
-
-// 可以在创建导航后,重置配置信息,重新生成新的导航
-Outline.reload({
-  // 调整位直接在文章内生成导航
-  position: 'sticky',
-  articleElement: '#article'
-})

License

JavaScript Code Licensed under MIT License.

API Documentation Licensed under CC BY 3.0

\ No newline at end of file diff --git a/docs/js/anchors.min.js b/docs/js/anchors.min.js deleted file mode 100644 index 0a554700..00000000 --- a/docs/js/anchors.min.js +++ /dev/null @@ -1,2 +0,0 @@ -!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(t="undefined"!=typeof globalThis?globalThis:t||self).Anchors=e()}(this,(function(){"use strict";function t(t,e){(null==e||e>t.length)&&(e=t.length);for(var r=0,n=Array(e);r"string"==typeof t,s=t=>Object.prototype.toString.apply(t),o=t=>"function"==typeof t||"[object Function]"===s(t),i=t=>("[object Object]"===s(t)||"object"==typeof t||o(t))&&null!==t,l=t=>!!(i(t)&&t.nodeName&&t.tagName&&1===t.nodeType),c=t=>Array.isArray?Array.isArray(t):"[object Array]"===s(t),a=t=>{let e={};return null===t?null:(c(t)?e=Array.from(t):(e=Object.assign({},t),Object.keys(e).forEach((r=>e[r]=i(t[r])?a(t[r]):t[r]))),e)},h=(t,e=300)=>!!o(t)&&setTimeout((()=>{t()}),e),u=[];let d,m;function p(t){for(;t.timeRemaining()>0&&u.length;){const t=u.shift();if(!o(t))return!1;t()}u.length?d=requestIdleCallback(p):(d=0,o(m)&&(m(),m=null))}void 0===window.requestIdleCallback&&(window.requestIdleCallback=function(t){const e=Date.now();return h((function(){t({didTimeout:!1,timeRemaining:function(){return Math.max(0,50-(Date.now()-e))}})}),10)},window.cancelIdleCallback=function(t){clearTimeout(t)});const f=(t,e=null)=>{u.push(t),o(e)&&(m=e),d||requestIdleCallback(p)},y=t=>t*t,b=(t=null)=>{let e,r;return t?n(t)?r=document.querySelector(t):l(t)&&(r=t):(e=document.querySelectorAll("html,body"),r=e[0].scrollTop-e[1].scrollTop>=0?e[0]:e[1]),r},g=t=>{let e=t.offsetTop;return null!==t.offsetParent&&(e+=g(t.offsetParent)),e},v=(t,e="")=>{const r=e.replace(/^>/i,"");return!!(e&&r&&t)&&(t.matches?t.matches(r):!!t.msMatchesSelector&&t.msMatchesSelector(r))},z=t=>t.host&&t!==document&&t.host.nodeType?t.host:t.parentNode,x=["focusout","blur","focusin","focus","load","unload","mouseenter","mouseleave"],M=(t,e,r)=>{const n=x.indexOf(e)>-1;r._delegateListener&&delete(r=r._delegateListener)._delegateListener,function(t,e,r){const n=t._listeners;let s=-1;if(n.length<1)return!1;n.forEach(((t,n)=>{const o=t.fn;e===t.type&&(s=n,o===r&&(s=n))})),s>-1&&n.splice(s,1)}(t,e,r),t.removeEventListener(e,r,n)},w=function(t,e,r=!1){const s=n(t)?document.querySelector(t):t,o=s.childNodes,i=((t,e)=>{let r=t._listeners||[];return n(e)&&e&&(r=r.filter((t=>t.type===e))),r})(s,e);i.forEach((t=>{M(s,t.type,t.fn)})),(r||!0===e||1===arguments.length)&&s&&o&&o.forEach((t=>{l(t)&&w(t,e,r)}))},A=(t,e,r)=>{if(!o(r))return w(t,e),!1;M(t,e,r)},L=(t,e,r,n,s,o,i=!1)=>{const l=x.indexOf(r)>-1,c=function(l){const a=function(t){const e=t.target;return(r=e)&&3===r.nodeType?r.parentNode:r;var r}(l),h=((t,e,r,n)=>{const s=r||document;if(!t)return null;do{if(null!=e&&(e.startsWith(">")?t.parentNode===s&&v(t,e):v(t,e))||n&&t===s)return t;if(t===s)break}while(t=z(t))})(a,e,t);let u=o||t;l.delegateTarget=h,!0===o&&(u=s),h&&(!0===i&&A(t,r,c),n.call(u,l,s))};if(!t)return!1;t._listeners||(t._listeners=[]),t._listeners.push({el:t,selector:e,type:r,fn:c,data:s,context:o,capture:l}),n._delegateListener=c,t.addEventListener(r,c,l)},$=e(r,['','','','','','','','','','','','','','','','','','','','']),T=(t,s="icon")=>n(t)?((t,e="icon")=>{const r=/id="(.*?)"/,n=/^(\w+)-/;return $.find((s=>{const o=r.exec(s)[1];return n.exec(o)[1]===e&&o===("icon"===e?`${e}-${t}`:`${e}-icon-${t}`)}))})(t,s):e(r,$),E=(t="")=>{const e=document.body;let r=document.querySelector("#outline-icons"),s=[];(t=>{if(!t)return!1;c(t)&&t.length>0?t.forEach((t=>{-1===$.indexOf(t)&&n(t)&&$.push(t)})):n(t)&&$.push(t)})(t),s=T(),r?r.innerHTML=s.join(""):(r=document.createElement("div"),r.innerHTML=``,e.insertBefore(r.firstChild,e.firstChild))},S=t=>!!n(t)&&t.replace(/(^\s+)|(\s+$)/g,""),C=t=>{return!(!i(t)||!(l(t)||(t=>!(!i(t)||"[object NodeList]"!==s(t)))(t)||(e=t,i(e)&&"[object DocumentFragment]"===s(e))||(t=>!(!i(t)||!("[object Text]"===s(t)||t.tagName&&3===t.nodeType)))(t)));var e},k=(t,e)=>{const r=Object.prototype.hasOwnProperty;return t&&r.call(t,e)},j=(t,e)=>{const r=new RegExp("(\\s|^)"+e+"(\\s|$)");let n,s;return!!l(t)&&(n=t.className,!!n&&(s=t.classList,s&&s.contains?t.classList.contains(e):!!r.exec(n)))},H=(t,e,r)=>{let n=t.tagName.toLowerCase();switch(e){case"style":t.style.cssText=r;break;case"value":"input"===n||"textarea"===n?t.value=r:t.setAttribute(e,r);break;case"htmlFor":t.setAttribute("for",r);break;case"className":((t,e)=>{var r;let n,s;if(j(t,e))return!1;n=t.classList,null!==(r=n)&&void 0!==r&&r.add?e.indexOf(" ")>-1?e.split(" ").forEach((t=>{n.add(t)})):n.add(e):(s=t.className,s+=s.length>0?" "+e:e,t.className=s)})(t,r);break;case"innerHTML":t.innerHTML=r;break;case"innerText":t.innerText=r;break;default:t.setAttribute(e,r)}},N=(t,e)=>{if(!t||!i(e))return!1;Object.keys(e).forEach((r=>{const n=e[r];k(e,r)&&H(t,r,n)}))},_=(t,e={})=>{const r="outline-icon",s=e.size||0,o=e.color||"",i=e.iconSet||"",l=c(s)?s[0]:s,a=c(s)?s[1]:s,h=s?`width:${l}px;height:${a}px;`:"",u=o?h+`color:${o}`:h,d=e.attrs||{},m=document.createElement("i");let p,f="",y="";return n(t)?((t=>{const e=new RegExp("^\\s*(?:<\\?xml[^>]*>\\s*)?(?:<\\!doctype svg[^>]*\\s*(?:\\[?(?:\\s*]*>\\s*)*\\]?)*[^>]*>\\s*)?]*>[^]*<\\/svg>\\s*$\\s*$","i");return n(t)&&e.test(t)})(t)?y=t:(f=i&&"icon"!==i?`xlink:href="#${i}-icon-${t}"`:`xlink:href="#icon-${t}"`,y=``),m.innerHTML=y,d.className?d.className=`${r} ${d.className}`:d.className=r,N(m,d),p=m.querySelector("svg"),N(p,{"aria-hidden":!0,xmlns:"http://www.w3.org/2000/svg",class:"outline-icon__svg",width:200,height:200,style:u}),m):null},B=(t,e,r)=>{const s="outline-heading",l=r.hasAnchor||!0,a=r.isAtStart||!0,h=r.showCode||!1,u=r.chapterCode||"",d=r.anchorURL||"",m=r.anchorLinkFilter||null,p=`heading-${e}`,f={id:p,className:a?`${s} ${s}_start`:s,"data-id":e},y=S(t.innerHTML);let b,g,v;if(h&&(f.innerHTML=u+" "+y,f["data-code"]=u),N(t,f),!l)return!1;b=d||(o(m)?m(t.tagName.toLowerCase(),y,e):`#${p}`),v=((t,e={})=>_(t,e))("hash",{iconSet:"outline"}),g=((t,e,r)=>{const s=document.createDocumentFragment(),o=document.createElement(t),l=t=>C(t)||n(t),a=t=>{let e;if(!l(t))return!1;C(t)?e=t:n(t)&&(e=document.createTextNode(t)),s.appendChild(e)};return i(e)?N(o,e):c(e)&&e.every((t=>l(t)))?e.forEach((t=>{a(t)})):C(e)?a(e):n(e)&&a(document.createTextNode(e)),c(r)?r.forEach((t=>{a(t)})):a(r),o.appendChild(s),o})("a",{id:`anchor-${e}`,className:`${s}__anchor anchor-${e}`,href:b,target:d?"_blank":"self","data-id":e},v),t.appendChild(g)},O=(t,e)=>{var r;let n,s=t.className;if(!s||!j(t,e))return!1;n=t.classList,null!==(r=n)&&void 0!==r&&r.remove?n.remove(e):(s=S(s.replace(e,"")),t.className=s)},q=(t,e=!0,r=!0)=>{const s="outline-heading",o=t.innerHTML;let i;if(t.innerHTML=o.replace(/^\d+(\.?\d+)*\s?/gi,""),t.removeAttribute("id"),t.removeAttribute("data-id"),O(t,s),!e)return!1;var l;i=t.querySelector(`.${s}__anchor`),r&&O(t,`${s}_start`),l=S(t.className),n(l)&&""===l&&t.removeAttribute("class"),i&&t.removeChild(i)},F=(t,e=!1,r=null)=>{const s=/^\d(\.|(\.\d+)*)\s?/gi,i=[];let l=1,a=0,h="";return t.forEach(((t,c)=>{const u=t.tagName,d=u.replace(/h/i,"");let m=parseInt(d,10),p=-1;var f;m>l?(a+=1,p=1===a?-1:c-1):m===l||ma?1===m?(a=1,p=-1):p=i[c-1].pid:m<=a&&(1===m?a=1:(a-=l-m,a<=1&&(a=1)),p=1===a?-1:((t,e,r)=>{let n,s,o=t[r-1];for(s=0;s]+(>|$)/g,""):"")),e&&(h=S(h.replace(s,""))),o(r)&&(h=r(h)),i.push({id:c,pid:p,level:a,rel:`heading-${c}`,text:h,tagName:u})})),e?(t=>{const e={};return t.forEach((t=>{const r=JSON.stringify((t=>[t.pid])(t));e[r]=e[r]||[],e[r].push(t),t.index=e[r].length,-1===t.pid&&(t.code=String(t.index))})),Object.keys(e).forEach((t=>{e[t].forEach((t=>{const r=e[`[${t.id}]`];if(!r||!c(r))return!1;r.forEach((e=>{e.code=t.code+"."+e.index}))}))})),t})(i):i},I=t=>{const{articleElement:s,selector:i,showCode:c,chapterTextFilter:a,isTreeStructured:h}=t;let u=document.querySelector("#article"),d=[],m=[],p=null;return n(s)?u=document.querySelector(s):l(s)&&(u=s),u?(o(a)?p=a:!0===a&&(p=t=>t.replace(/\(.*?\)/,"()")),d=e(r,u.querySelectorAll(i||"h1,h2,h3,h4,h5,h6")),m=F(d,c,p),!0===h?((t,e,r)=>{const n={},s=[];return t.forEach(((t,r)=>{n[t[e]]=r,t.children=[]})),t.forEach((e=>{const o=t[n[e[r]]];-1!==e[r]?o.children.push(e):s.push(e)})),s})(m,"id","pid"):m):m},U={},R=t=>k(U,t)&&U[t].length>0,D=(t,e=!0)=>e?R(t):(t=>{let e=R(t),r=t.lastIndexOf(".");for(;!e&&-1!==r;)r=(t=t.substring(0,r)).lastIndexOf("."),e=R(t);return e})(t),V=(t,e,r=!0)=>{const n=t=>{if(!R(t))return!1;U[t].forEach((t=>{const r=["[object Int8Array]","[object Uint8Array]","[object Uint8ClampedArray]","[object Int16Array]","[object Uint16Array]","[object Int32Array]","[object Uint32Array]","[object Float32Array]","[object Float64Array]","[object BigInt64Array]","[object BigUint64Array]"].indexOf(s(e))>-1?e.toString():e;t.callback.call(t.context||t,r)}))},o=()=>{let e=t,r=t.lastIndexOf(".");for(;-1!==r;)e=e.substring(0,r),r=e.lastIndexOf("."),n(e);n(t),n("*")};if(!D(t))return!1;r?setTimeout(o,10):o()},P=(()=>{let t=0;return e=>(t+=1,e?e+"-"+t:"guid-"+t)})(),J=t=>{if(!k(U,t))return!1;delete U[t]},W=(t,e)=>{if(!D(t))return!1;e?(t=>{const e=Object.keys(U);if(!t||e.length<1)return!1;e.forEach((e=>{const r=U[e];let n;r.forEach(((e,s)=>{e.callback!==t&&e.token!==t||(n=e.topic,r.splice(-1,s))})),r.length<1&&J(n)}))})(e):J(t)};class G{constructor(t){this.attrs={},t&&this.initialize(t)}initialize(t){return this.attr(t).render().addListeners(),this}attr(t,e){const r=this.attrs;return n(t)?e&&k(r,t)?(r[t]=e,this):r[t]:i(t)?(s=r,o=t,Object.keys(o).forEach((t=>{k(o,t)&&(s[t]=o[t])})),this):0===arguments.length?r:this;var s,o}render(){return this}refresh(){return this}destroy(){return this.removeListeners(),this}reload(t){let e=this.attr();return t&&(e=this.attr(t)),this.destroy().initialize(e),this}$emit(t,e){return V(t,e),this}$on(t,e){return((t,e,r=null)=>{const n=P();let s="symbol"==typeof t?t.toString():t;o(e)&&(U[s]||(U[s]=[]),U[s].push({topic:s,callback:e,context:r,token:n}))})(t,e,this),this}$off(t,e){return W(t,e),this}addListeners(){return this}removeListeners(){return this}}class K extends G{constructor(t){super(),this._default(),t&&this.initialize(t)}_default(){return this.attrs=a(K.DEFAULTS),this.$articleElement=null,this.$scrollElement=null,this.$headings=[],this}initialize(t){let e,r,s,i;return this.attr(t),i=this.attr("articleElement"),r=this.attr("scrollElement"),e=this.attr("created"),n(i)?s=document.querySelector(i):l(i)&&(s=i),s?(this.$articleElement=s,this.$scrollElement=b(r),this.$headings=this.getHeadings(),this.$headings.length<1||(o(e)&&e.call(this),this.render().addListeners()),this):this}getHeadings(){const t=this.$articleElement,n=this.attr("selector");return e(r,t.querySelectorAll(n))}count(){return this.getHeadings().length}render(){const t=this.attr("articleElement"),e=this.attr("selector"),r=this.attr("showCode"),n=this.attr("chapterTextFilter"),s=this.attr("mounted"),i=I({articleElement:t,selector:e,showCode:r,chapterTextFilter:n});return E(),this._paint(i),o(s)&&s.call(this),this}erase(){return this._remove(),this}_paint(t){const n=400,s=this.attr("hasAnchor"),o=this.attr("isAtStart"),i=this.attr("showCode"),l=this.attr("anchorURL"),c=this.attr("anchorLinkFilter"),a=this.count(),h=e(r,this.$headings),u=(e,r)=>{e.forEach(((e,a)=>{const h=a+r*n,u=t[h].code;B(e,h,{hasAnchor:s,isAtStart:o,showCode:i,chapterCode:u,anchorURL:l,anchorLinkFilter:c})}))};let d=-1;if(a>n)for(d+=1,u(h.splice(0,n),0);h.length>0;){const t=h.splice(0,n);f((()=>{u(t,d+=1)}),(()=>{this.$emit("anchors:all:paint")}))}else u(h,0);return this}_remove(){const t=this.attr("hasAnchor"),e=this.attr("isAtStart");return this.$headings.forEach((r=>{q(r,t,e)})),this}refresh(t){const e=this.attr("articleElement"),r=this.attr("selector"),n=this.attr("showCode"),s=this.attr("chapterTextFilter");return this.$headings=this.getHeadings(),this.erase()._paint(t||I({articleElement:e,selector:r,showCode:n,chapterTextFilter:s})),this}scrollTo(t,e){return((t,e,r)=>{const n=b(t);let s=n.scrollTop,i=0;const l=e-s,c=n.scrollHeight,a=e-c<=0?e:c,h=t=>(o(r)&&r(t),!1),u=()=>{if(i+=1,l<0){if(s-=y(i),n.scrollTop=s,console.log("$scrollElement up",t,n,s,n.scrollTop),s<=e)return n.scrollTop=e,h(e)}else if(s+=y(i),n.scrollTop=s,console.log("$scrollElement down",t,n,s,n.scrollTop),s>=a)return n.scrollTop=a,h(a);requestAnimationFrame(u)};requestAnimationFrame(u)})(this.$scrollElement,t,e),this}destroy(){const t=this.attr("beforeDestroy"),e=this.attr("afterDestroy");return o(t)&&t.call(this),this.removeListeners()._remove()._default(),o(e)&&e.call(this),this}onAnchorTrigger(t){const e=this.attr("anchorURL"),r=this.attr("afterScroll"),n=this.attr("stickyHeight"),s=t.delegateTarget.parentNode,i=g(s)-(n+10),l=this.$scrollElement,c=l.scrollHeight-l.clientHeight;return this.scrollTo(i,(()=>{o(r)&&r.call(this,"anchor"),h((()=>{this.$emit("toolbar:update",{top:i,min:0,max:c})}))})),e||function(t){t.stopPropagation(),t.preventDefault()}(t),this}onRefresh(t){return this.refresh(t),this}addListeners(){const t=this.$articleElement;return this.count()<1||(L(t,".outline-heading__anchor","click",this.onAnchorTrigger,this,!0),this.$on("anchors:refresh",this.onRefresh)),this}removeListeners(){const t=this.$articleElement;return this.count()<1||(A(t,"click",this.onAnchorTrigger),this.$off("anchors:refresh",this.onRefresh)),this}}return K.DEFAULTS=a({scrollElement:"html,body",articleElement:"#article",selector:"h1,h2,h3,h4,h5,h6",stickyHeight:0,anchorURL:"",hasAnchor:!0,isAtStart:!0,showCode:!1,created:null,mounted:null,afterScroll:null,beforeDestroy:null,afterDestroy:null,chapterTextFilter:null,anchorLinkFilter:null}),K})); -//# sourceMappingURL=anchors.min.js.map diff --git a/docs/js/anchors.min.js.map b/docs/js/anchors.min.js.map deleted file mode 100644 index 6f937c6f..00000000 --- a/docs/js/anchors.min.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"anchors.min.js","sources":["../../utils/types/isString.js","../../utils/lang/toString.js","../../utils/types/isFunction.js","../../utils/types/isObject.js","../../utils/types/isElement.js","../../utils/types/isArray.js","../../utils/lang/cloneDeep.js","../../utils/lang/later.js","../../utils/lang/timeSlice.js","../../utils/lang/easeInQuad.js","../../utils/dom/_getScrollElement.js","../../utils/dom/offsetTop.js","../../utils/dom/matches.js","../../utils/dom/getParentOrHost.js","../../utils/event/enum.js","../../utils/event/_off.js","../../utils/event/_delete.js","../../utils/event/purgeElement.js","../../utils/event/getListeners.js","../../utils/event/off.js","../../utils/event/on.js","../../utils/event/getTarget.js","../../utils/dom/resolveTextNode.js","../../utils/dom/closest.js","../../utils/icons/symbols.js","../../utils/icons/defaults.js","../../utils/icons/getSymbols.js","../../utils/icons/getSymbol.js","../../utils/icons/paint.js","../../utils/icons/add.js","../../utils/lang/trim.js","../../utils/types/isDOM.js","../../utils/types/isHTMLCollection.js","../../utils/types/isFragment.js","../../utils/types/isTextNode.js","../../utils/lang/hasOwn.js","../../utils/dom/hasClass.js","../../utils/dom/setAttribute.js","../../utils/dom/addClass.js","../../utils/dom/setAttributes.js","../../utils/icons/createElement.js","../../utils/types/isSVG.js","../../_updateHeading.js","../../utils/icons/icon.js","../../utils/dom/createElement.js","../../utils/dom/removeClass.js","../../_removeHeading.js","../../utils/types/isEmpty.js","../../getChaptersByHeadings.js","../../utils/lang/stripTags.js","../../_getChapterParentIdByDiffer.js","../../_getChaptersWithCode.js","../../getChapters.js","../../utils/lang/toTree.js","../../utils/observer/_subscribers.js","../../utils/observer/_hasDirectSubscribersFor.js","../../utils/observer/has.js","../../utils/observer/_hasSubscribers.js","../../utils/observer/emit.js","../../utils/types/isTypedArray.js","../../utils/lang/guid.js","../../utils/observer/_removeSubscriber.js","../../utils/observer/off.js","../../utils/observer/_removeSubscriberByToken.js","../../base.js","../../utils/lang/extend.js","../../utils/observer/on.js","../../anchors.js","../../utils/dom/scrollTo.js","../../utils/event/stop.js"],"sourcesContent":["/**\r\n * 检测数据是否为 String 类型\r\n * ========================================================================\r\n * @method isArray\r\n * @param {*} str\r\n * @returns {boolean}\r\n */\r\nconst isString = (str) => {\r\n return typeof str === 'string'\r\n}\r\n\r\nexport default isString\r\n","/**\r\n * Object 对象原型上的 toString 方法\r\n * ========================================================================\r\n * @method toString\r\n * @param {*} val\r\n * @returns {string}\r\n */\r\nconst toString = (val) => {\r\n return Object.prototype.toString.apply(val)\r\n}\r\n\r\nexport default toString\r\n","import toString from '../lang/toString'\r\n\r\n/**\r\n * 检测测试数据是否为 Function 类型\r\n * ========================================================================\r\n * @method isFunction\r\n * @param {*} val - (必须)待检测的数据\r\n * @returns {boolean} 'val' 是 Function 类型返回 true,否则返回 false\r\n */\r\nconst isFunction = (val) => {\r\n return typeof val === 'function' || toString(val) === '[object Function]'\r\n}\r\n\r\nexport default isFunction\r\n","import toString from '../lang/toString'\r\nimport isFunction from './isFunction'\r\n\r\n/**\r\n * 检测数据是否为 Object 类型\r\n * ========================================================================\r\n * @method isObject\r\n * @param {*} o\r\n * @returns {boolean}\r\n */\r\nconst isObject = (o) => {\r\n return (\r\n (toString(o) === '[object Object]' ||\r\n typeof o === 'object' ||\r\n isFunction(o)) &&\r\n o !== null\r\n )\r\n}\r\n\r\nexport default isObject\r\n","import isObject from './isObject'\r\n\r\n/**\r\n * 检测数据是否为 HTMLElement DOM 节点\r\n * ========================================================================\r\n * @method isElement\r\n * @param {*} o\r\n * @returns {boolean}\r\n */\r\nconst isElement = (o) => {\r\n return !!(isObject(o) && o.nodeName && o.tagName && o.nodeType === 1)\r\n}\r\n\r\nexport default isElement\r\n","import toString from '../lang/toString'\r\n\r\n/**\r\n * 检测数据是否为 Array 类型\r\n * ========================================================================\r\n * @method isArray\r\n * @param {*} o\r\n * @returns {boolean}\r\n */\r\nconst isArray = (o) => {\r\n if (Array.isArray) {\r\n return Array.isArray(o)\r\n } else {\r\n return toString(o) === '[object Array]'\r\n }\r\n}\r\n\r\nexport default isArray\r\n","import isObject from '../types/isObject'\r\nimport isArray from '../types/isArray'\r\n\r\n/**\r\n * 深拷贝对象函数\r\n * ========================================================================\r\n * @methods cloneDeep\r\n * @param {Object} obj - 深拷贝的对象\r\n * @returns {Array|Object|*}\r\n *\r\n * @example\r\n * const arr = cloneDeep([2,3,4,6])\r\n * => [2,3,4,6]\r\n */\r\nconst cloneDeep = (obj) => {\r\n let clone = {}\r\n\r\n if (obj === null) {\r\n return null\r\n }\r\n\r\n if (isArray(obj)) {\r\n clone = Array.from(obj)\r\n } else {\r\n clone = Object.assign({}, obj)\r\n Object.keys(clone).forEach((key) => {\r\n return (clone[key] = isObject(obj[key]) ? cloneDeep(obj[key]) : obj[key])\r\n })\r\n }\r\n\r\n return clone\r\n}\r\n\r\nexport default cloneDeep\r\n","import isFunction from '../types/isFunction'\r\n\r\n/**\r\n * later - 延迟执行方法\r\n * ========================================================================\r\n * @method later\r\n * @param {Function} fn\r\n * @param {Number} [delay]\r\n * @returns {number|boolean}\r\n */\r\nconst later = (fn, delay = 300) => {\r\n if (!isFunction(fn)) {\r\n return false\r\n }\r\n\r\n return setTimeout(() => {\r\n fn()\r\n }, delay)\r\n}\r\n\r\nexport default later\r\n","/**\r\n * timeSlice.js 时间切片功能函数\r\n * ====================================================\r\n * Created By: Yaohaixiao\r\n * Update: 2023.09.04\r\n */\r\nimport isFunction from '../types/isFunction'\r\nimport later from './later'\r\n\r\nconst queue = []\r\nlet isHandling\r\nlet done\r\n\r\n// Shim from https://developers.google.com/web/updates/2015/08/using-requestidlecallback\r\nif (typeof window.requestIdleCallback === 'undefined') {\r\n window.requestIdleCallback = function (cb) {\r\n const start = Date.now()\r\n return later(function () {\r\n cb({\r\n didTimeout: false,\r\n timeRemaining: function () {\r\n return Math.max(0, 50 - (Date.now() - start))\r\n }\r\n })\r\n }, 10)\r\n }\r\n\r\n window.cancelIdleCallback = function (id) {\r\n clearTimeout(id)\r\n }\r\n}\r\n\r\nfunction runIdle(idleDeadline) {\r\n while (idleDeadline.timeRemaining() > 0 && queue.length) {\r\n const fn = queue.shift()\r\n\r\n if (!isFunction(fn)) {\r\n return false\r\n }\r\n\r\n fn()\r\n }\r\n\r\n if (queue.length) {\r\n isHandling = requestIdleCallback(runIdle)\r\n } else {\r\n isHandling = 0\r\n\r\n if (isFunction(done)) {\r\n done()\r\n done = null\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * 时间切片功能函数:主要用于优化长时任务的性能,将长时任务分解成\r\n * 多个短时间任务\r\n * ====================================================\r\n * @param {Function} fn - 需要在空闲时执行的回调函数\r\n * @param {Function} afterComplete - queen 的\r\n * @return {(function(): (boolean|undefined))|*|boolean}\r\n */\r\nconst timeSlice = (fn, afterComplete = null) => {\r\n queue.push(fn)\r\n\r\n if (isFunction(afterComplete)) {\r\n done = afterComplete\r\n }\r\n\r\n if (!isHandling) {\r\n requestIdleCallback(runIdle)\r\n }\r\n}\r\n\r\nexport default timeSlice\r\n","/**\r\n * 返回给定值的平方值\r\n * ========================================================================\r\n * @method easeInQuad\r\n * @param {Number} x\r\n * @returns {number}\r\n */\r\nconst easeInQuad = (x) => {\r\n return x * x\r\n}\r\n\r\nexport default easeInQuad\r\n","import isString from '../types/isString'\r\nimport isElement from '../types/isElement'\r\n\r\n/**\r\n * 通过给的 scrollElement 参数,获取滚动 DOM 元素\r\n * ========================================================================\r\n * @method _getScrollElement\r\n * @param {String|HTMLElement} scrollElement\r\n * @returns {Element}\r\n * @private\r\n */\r\nconst _getScrollElement = (scrollElement = null) => {\r\n let $rootElements\r\n let $scrollElement\r\n\r\n if (!scrollElement) {\r\n $rootElements = document.querySelectorAll('html,body')\r\n $scrollElement =\r\n $rootElements[0].scrollTop - $rootElements[1].scrollTop >= 0\r\n ? $rootElements[0]\r\n : $rootElements[1]\r\n } else {\r\n if (isString(scrollElement)) {\r\n $scrollElement = document.querySelector(scrollElement)\r\n } else if (isElement(scrollElement)) {\r\n $scrollElement = scrollElement\r\n }\r\n }\r\n\r\n return $scrollElement\r\n}\r\n\r\nexport default _getScrollElement\r\n","/**\r\n * 获取 DOM 节点相对于窗口的 left (纵坐标)值\r\n * ========================================================================\r\n * @method offsetTop\r\n * @param {HTMLElement} el - DOM 节点\r\n * @returns {Number}\r\n */\r\nconst offsetTop = (el) => {\r\n let top = el.offsetTop\r\n\r\n if (el.offsetParent !== null) {\r\n top += offsetTop(el.offsetParent)\r\n }\r\n\r\n return top\r\n}\r\n\r\nexport default offsetTop\r\n","/**\r\n * 获取 options 节点下匹配 selector 选择器的 DOM 节点\r\n * ========================================================================\r\n * Element.matches() 方法可以用来判断 DOM 元素是否与给定的选择器匹配,事件代理判断是\r\n * 否触发绑定的代理事件回调函数,关键就是使用 Element.matches() 辨别当前事件触发的目\r\n * 标 DOM 元素是否为事件代理所期望触发的目标。\r\n * ========================================================================\r\n * @method matches\r\n * @see https://developer.mozilla.org/en-US/docs/web/api/element/matches\r\n * @param {HTMLElement} el - (必须)DOM 元素\r\n * @param {String} selector - (必须)匹配 DOM 元素的选择器\r\n * @returns {Boolean}\r\n */\r\nconst matches = (el, selector = '') => {\r\n const sel = selector.replace(/^>/i, '')\r\n\r\n if (!selector || !sel || !el) {\r\n return false\r\n }\r\n\r\n /* istanbul ignore else */\r\n if (el.matches) {\r\n return el.matches(sel)\r\n } else if (el.msMatchesSelector) {\r\n return el.msMatchesSelector(sel)\r\n } else {\r\n return false\r\n }\r\n}\r\n\r\nexport default matches\r\n","/**\r\n * 获取 DOM 元素的父节点\r\n * ========================================================================\r\n * @method getParentOrHost\r\n * @param {*|HTMLElement} el - (必须)要获取父节点的 DOM 元素\r\n * @returns {*|HTMLElement}\r\n */\r\nconst getParentOrHost = (el) => {\r\n return el.host && el !== document && el.host.nodeType\r\n ? el.host\r\n : el.parentNode\r\n}\r\n\r\nexport default getParentOrHost\r\n","export const CAPTURE_EVENTS = [\r\n 'focusout',\r\n 'blur',\r\n 'focusin',\r\n 'focus',\r\n 'load',\r\n 'unload',\r\n 'mouseenter',\r\n 'mouseleave'\r\n]\r\n","import { CAPTURE_EVENTS } from './enum'\r\nimport _delete from './_delete'\r\n\r\n/**\r\n * (私有方法)取消 type 类型的代理事件绑定\r\n * ========================================================================\r\n * 如果没有设置 handler,则销毁 this.$options 绑定的所有符合 type 事件类型的事件绑定\r\n * ========================================================================\r\n * @method _off\r\n * @param {HTMLElement} el - (必须)取消事件绑定的 DOM 元素\r\n * @param {String} type - (必须)事件类型\r\n * @param {Function} fn - (必须)事件处理器回调函数\r\n * @private\r\n */\r\nconst _off = (el, type, fn) => {\r\n const capture = CAPTURE_EVENTS.indexOf(type) > -1\r\n\r\n /* istanbul ignore else */\r\n if (fn._delegateListener) {\r\n fn = fn._delegateListener\r\n delete fn._delegateListener\r\n }\r\n\r\n // 移除缓存的 _listeners 数据\r\n _delete(el, type, fn)\r\n\r\n el.removeEventListener(type, fn, capture)\r\n}\r\n\r\nexport default _off\r\n","/**\r\n * 删除 DOM 元素缓存的 _listeners 数据\r\n * ========================================================================\r\n * @method _delete\r\n * @param {HTMLElement} el - 要删除 listener 的 DOM 元素\r\n * @param {String} type - 事件类型(名称)\r\n * @param {Function} [fn] - 事件处理器回调函数\r\n */\r\nconst _delete = function (el, type, fn) {\r\n const listeners = el._listeners\r\n let index = -1\r\n\r\n if (listeners.length < 1) {\r\n return false\r\n }\r\n\r\n // 移除缓存的 _listeners 数据\r\n listeners.forEach((listener, i) => {\r\n const handler = listener.fn\r\n\r\n if (type === listener.type) {\r\n index = i\r\n\r\n if (handler === fn) {\r\n index = i\r\n }\r\n }\r\n })\r\n\r\n /* istanbul ignore else */\r\n if (index > -1) {\r\n listeners.splice(index, 1)\r\n }\r\n}\r\n\r\nexport default _delete\r\n","import isString from '../types/isString'\r\nimport isElement from '../types/isElement'\r\nimport getListeners from './getListeners'\r\nimport _off from './_off'\r\n\r\n/**\r\n * 销毁(type 类型的)代理事件绑定\r\n * ========================================================================\r\n * 1. 设置了事件类型 type,则销毁指定类型的事件绑定,否则清除所有代理事件绑定\r\n * 2. recurse 设置为 true,递归销毁子节点全部事件绑定\r\n * ========================================================================\r\n * @method purgeElement\r\n * @param {HTMLElement|String} el - (必须)DOM 元素或者其选择器\r\n * @param {String|Boolean} type - (必须)事件类型\r\n * @param {Boolean} [recurse] - (可选)是否递归销毁子节点所有事件绑定\r\n */\r\nconst purgeElement = function (el, type, recurse = false) {\r\n const $element = isString(el) ? document.querySelector(el) : el\r\n const $children = $element.childNodes\r\n const listeners = getListeners($element, type)\r\n\r\n listeners.forEach((listener) => {\r\n _off($element, listener.type, listener.fn)\r\n })\r\n\r\n if (\r\n (recurse || type === true || arguments.length === 1) &&\r\n $element &&\r\n $children\r\n ) {\r\n $children.forEach(($child) => {\r\n if (isElement($child)) {\r\n purgeElement($child, type, recurse)\r\n }\r\n })\r\n }\r\n}\r\n\r\nexport default purgeElement\r\n","import isString from '../types/isString'\r\n\r\n/**\r\n * 获取 DOM 元素(type 事件类型)事件绑定信息\r\n * ========================================================================\r\n * 如果设置了事件类型 type, 则返回指定类型的事件绑定信息,否则返回所有事件绑定信息\r\n * ========================================================================\r\n * @methods getListeners\r\n * @param {HTMLElement} el - (必须)要获取事件绑定信息的 DOM 元素\r\n * @param {String} [type] - (可选)事件类型\r\n * @returns {Array} - 已绑定的事件信息\r\n */\r\nconst getListeners = (el, type) => {\r\n let listeners = el._listeners || []\r\n\r\n if (isString(type) && type) {\r\n listeners = listeners.filter((listener) => {\r\n return listener.type === type\r\n })\r\n }\r\n\r\n return listeners\r\n}\r\n\r\nexport default getListeners\r\n","import purgeElement from './purgeElement'\r\nimport isFunction from '../types/isFunction'\r\nimport _off from './_off'\r\n\r\n/**\r\n * 取消 type 类型的代理事件绑定\r\n * ========================================================================\r\n * 如果没有设置 handler,则销毁 this.$options 绑定的所有符合 type 事件类型的事件绑定\r\n * ========================================================================\r\n * @method off\r\n * @param {HTMLElement|Object} el - (必须)取消事件绑定的 DOM 元素\r\n * @param {String} type - (必须)事件类型\r\n * @param {Function} [fn] - (可选)事件处理器回调函数\r\n */\r\nconst off = (el, type, fn) => {\r\n // 如果不设置 fn 参数,默认清除 el 元素上绑定的所有事件处理器\r\n if (!isFunction(fn)) {\r\n purgeElement(el, type)\r\n return false\r\n }\r\n\r\n _off(el, type, fn)\r\n}\r\n\r\nexport default off\r\n","import closest from '../dom/closest'\r\nimport off from './off'\r\nimport getTarget from './getTarget'\r\n\r\nimport { CAPTURE_EVENTS } from './enum'\r\n\r\n/**\r\n * 绑定代理事件\r\n * ========================================================================\r\n * @method on\r\n * @param {HTMLElement|String|Object} el - (必须)绑定代理事件的 DOM 节点\r\n * @param {String} selector - (必须)事件代理目标 DOM 元素的选择器\r\n * @param {String|Function} type - (必须)事件类型或者事件处理器回调函数\r\n * @param {Function|Object} fn - (可选) 事件处理器回调函数或者传递给事件处理器回调函数的数据对象\r\n * @param {Object|Boolean} [data] - (可选)传递给事件处理器回调函数的数据对象或者事件处理器回调函数的 this 上下文指向,\r\n * @param {Object|Boolean} [context] - (可选)事件处理器回调函数的 this 上下文指向,或者是否仅触发一次\r\n * 当设置为 true 时,则事件处理器回调函数的 this 上下文指向为 data 对象\r\n * @param {Boolean} once - (可选)是否仅触发一次\r\n */\r\nconst on = (el, selector, type, fn, data, context, once = false) => {\r\n // CAPTURE_EVENTS 中的特殊事件,采用事件捕获模型\r\n const capture = CAPTURE_EVENTS.indexOf(type) > -1\r\n\r\n const listener = function (evt) {\r\n const target = getTarget(evt)\r\n // 通过 Element.matches 方法获得点击的目标元素\r\n const delegateTarget = closest(target, selector, el)\r\n let overrideContext = context || el\r\n\r\n evt.delegateTarget = delegateTarget\r\n\r\n // 当设置为 true 时,则事件处理器回调函数的\r\n // this 上下文指向为 data 对象\r\n if (context === true) {\r\n overrideContext = data\r\n }\r\n\r\n /* istanbul ignore else */\r\n if (delegateTarget) {\r\n // 仅触发一次\r\n /* istanbul ignore else */\r\n if (once === true) {\r\n off(el, type, listener)\r\n }\r\n\r\n fn.call(overrideContext, evt, data)\r\n }\r\n }\r\n\r\n if (!el) {\r\n return false\r\n }\r\n\r\n if (!el._listeners) {\r\n el._listeners = []\r\n }\r\n\r\n // 缓存 options 元素绑定的事件处理器\r\n el._listeners.push({\r\n el,\r\n selector,\r\n type,\r\n fn: listener,\r\n data,\r\n context,\r\n capture\r\n })\r\n\r\n // 缓存包装后的事件处理器\r\n fn._delegateListener = listener\r\n\r\n el.addEventListener(type, listener, capture)\r\n}\r\n\r\nexport default on\r\n","import resolveTextNode from '../dom/resolveTextNode'\r\n\r\n/**\r\n * 返回触发事件的 target DOM 元素\r\n * ========================================================================\r\n * @method getTarget\r\n * @param {Event} evt - Event 对象\r\n * @return {HTMLElement} - Event 对象的 target DOM 元素\r\n */\r\nconst getTarget = function (evt) {\r\n const target = evt.target\r\n\r\n return resolveTextNode(target)\r\n}\r\n\r\nexport default getTarget\r\n","/**\r\n * 在某些情况下,某些浏览器(例如:Safari 浏览器)会返回实际的目标元素内部的文本节点。\r\n * resolveTextNode() 方法则会返回实际的目标节点。\r\n * ========================================================================\r\n * @method resolveTextNode\r\n * @param {HTMLElement|Text} el - 要解析的节点\r\n * @return {*|HTMLElement} - 实际的目标 DOM 节点\r\n */\r\nconst resolveTextNode = function (el) {\r\n if (el && el.nodeType === 3) {\r\n return el.parentNode\r\n }\r\n\r\n return el\r\n}\r\n\r\nexport default resolveTextNode\r\n","import matches from './matches'\r\nimport getParentOrHost from './getParentOrHost'\r\n\r\n/**\r\n * 获取 options 元素父元素最近的包含 selector 选择器的元素\r\n * ========================================================================\r\n * @method closest\r\n * @param {HTMLElement} el - (必须)DOM 元素\r\n * @param {String} selector - (必须)DOM 元素的选择其\r\n * @param {HTMLElement} [ctx] - (必须)比对的 DOM 元素\r\n * @param {Boolean} [includeCTX] - (必须)是否包含 context DOM 元素\r\n * @returns {null|HTMLElement} - 返回最接近的 DOM 元素\r\n */\r\nconst closest = (el, selector, ctx, includeCTX) => {\r\n const context = ctx || document\r\n\r\n if (!el) {\r\n return null\r\n }\r\n\r\n do {\r\n /* istanbul ignore else */\r\n if (\r\n (selector != null &&\r\n (selector.startsWith('>')\r\n ? el.parentNode === context && matches(el, selector)\r\n : matches(el, selector))) ||\r\n (includeCTX && el === context)\r\n ) {\r\n return el\r\n }\r\n\r\n /* istanbul ignore else */\r\n if (el === context) {\r\n break\r\n }\r\n\r\n /* jshint boss:true */\r\n } while ((el = getParentOrHost(el)))\r\n}\r\n\r\nexport default closest\r\n","import DEFAULTS from './defaults'\r\n\r\nconst SYMBOLS = [...DEFAULTS]\r\n\r\nexport default SYMBOLS\r\n","const DEFAULTS = [\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n ''\r\n]\r\n\r\nexport default DEFAULTS\r\n","import isString from '../types/isString'\r\nimport getSymbol from './getSymbol'\r\nimport SYMBOLS from './symbols'\r\n\r\n/**\r\n *\r\n * @method getSymbols\r\n * @param {String} [name]\r\n * @param {String} [iconSet]\r\n * @returns {string[]|*}\r\n */\r\nconst getSymbols = (name, iconSet = 'icon') => {\r\n if (isString(name)) {\r\n return getSymbol(name, iconSet)\r\n }\r\n\r\n return [...SYMBOLS]\r\n}\r\n\r\nexport default getSymbols\r\n","import SYMBOLS from './symbols'\r\n\r\n/**\r\n * @method getSymbol\r\n * @param {String} name\r\n * @param {String} [iconSet]\r\n * @returns {String}\r\n */\r\nconst getSymbol = (name, iconSet = 'icon') => {\r\n const patternName = /id=\"(.*?)\"/\r\n const patternSet = /^(\\w+)-/\r\n const symbols = SYMBOLS\r\n\r\n return symbols.find((symbol) => {\r\n const names = patternName.exec(symbol)\r\n const fullName = names[1]\r\n const sets = patternSet.exec(fullName)\r\n const setName = sets[1]\r\n const iconName =\r\n iconSet === 'icon' ? `${iconSet}-${name}` : `${iconSet}-icon-${name}`\r\n\r\n return setName === iconSet && fullName === iconName\r\n })\r\n}\r\n\r\nexport default getSymbol\r\n","import add from './add'\r\nimport getSymbols from './getSymbols'\r\n\r\n/**\r\n * 绘制 SVG 图标集\r\n * ========================================================================\r\n * @method paint\r\n * @param {String|Array} symbol\r\n */\r\nconst paint = (symbol = '') => {\r\n const $body = document.body\r\n let $icons = document.querySelector('#outline-icons')\r\n let symbols = []\r\n\r\n add(symbol)\r\n symbols = getSymbols()\r\n\r\n if ($icons) {\r\n $icons.innerHTML = symbols.join('')\r\n } else {\r\n $icons = document.createElement('div')\r\n $icons.innerHTML =\r\n ``\r\n $body.insertBefore($icons.firstChild, $body.firstChild)\r\n }\r\n}\r\n\r\nexport default paint\r\n","import isArray from '../types/isArray'\r\nimport isString from '../types/isString'\r\nimport SYMBOLS from './symbols'\r\n\r\n/**\r\n * @method add\r\n * @param {Array|String} symbols\r\n * @return {Boolean}\r\n */\r\nconst add = (symbols) => {\r\n if (!symbols) {\r\n return false\r\n }\r\n\r\n if (isArray(symbols) && symbols.length > 0) {\r\n symbols.forEach((symbol) => {\r\n /* istanbul ignore else */\r\n if (SYMBOLS.indexOf(symbol) === -1 && isString(symbol)) {\r\n SYMBOLS.push(symbol)\r\n }\r\n })\r\n } else {\r\n /* istanbul ignore else */\r\n if (isString(symbols)) {\r\n SYMBOLS.push(symbols)\r\n }\r\n }\r\n}\r\n\r\nexport default add\r\n","import isString from '../types/isString'\r\n\r\n/**\r\n * 清楚字符串起始位置所有的空格\r\n * ========================================================================\r\n * @method trim\r\n * @param {string} str\r\n * @returns {string|Boolean}\r\n */\r\nconst trim = (str) => {\r\n if (!isString(str)) {\r\n return false\r\n }\r\n return str.replace(/(^\\s+)|(\\s+$)/g, '')\r\n}\r\n\r\nexport default trim\r\n","import isObject from './isObject'\r\nimport isElement from './isElement'\r\nimport isHTMLCollection from './isHTMLCollection'\r\nimport isFragment from './isFragment'\r\nimport isTextNode from './isTextNode'\r\n\r\nconst isDOM = (el) => {\r\n return !!(\r\n isObject(el) &&\r\n (isElement(el) || isHTMLCollection(el) || isFragment(el) || isTextNode(el))\r\n )\r\n}\r\n\r\nexport default isDOM\r\n","import toString from '../lang/toString'\r\nimport isObject from './isObject'\r\n\r\nconst isHTMLCollection = (el) => {\r\n return !!(isObject(el) && toString(el) === '[object NodeList]')\r\n}\r\n\r\nexport default isHTMLCollection\r\n","import toString from '../lang/toString'\r\nimport isObject from './isObject'\r\n\r\nconst isFragment = (fragment) => {\r\n return !!(\r\n isObject(fragment) && toString(fragment) === '[object DocumentFragment]'\r\n )\r\n}\r\n\r\nexport default isFragment\r\n","import toString from '../lang/toString'\r\nimport isObject from './isObject'\r\n\r\nconst isTextNode = (el) => {\r\n return !!(\r\n isObject(el) &&\r\n (toString(el) === '[object Text]' || (el.tagName && el.nodeType === 3))\r\n )\r\n}\r\n\r\nexport default isTextNode\r\n","/**\r\n * 检测对象自身属性中是否具有指定的属性。\r\n * ========================================================================\r\n * @method hasOwn\r\n * @param {Object} obj - (必须)检测的目标对象\r\n * @param {String} prop - (必须)属性名\r\n * @returns {Boolean}\r\n */\r\nconst hasOwn = (obj, prop) => {\r\n const hasOwnProperty = Object.prototype.hasOwnProperty\r\n return obj && hasOwnProperty.call(obj, prop)\r\n}\r\n\r\nexport default hasOwn\r\n","import isElement from '../types/isElement'\r\n/**\r\n * 检测 DOM 节点是否包含名为 className 的样式\r\n * ========================================================================\r\n * @method hasClass\r\n * @param {HTMLElement} el - DOM 节点\r\n * @param {String} className - 样式名称\r\n * @returns {Boolean}\r\n */\r\nconst hasClass = (el, className) => {\r\n const pattern = new RegExp('(\\\\s|^)' + className + '(\\\\s|$)')\r\n let allClass\r\n let classList\r\n\r\n if (!isElement(el)) {\r\n return false\r\n }\r\n\r\n allClass = el.className\r\n\r\n if (!allClass) {\r\n return false\r\n }\r\n\r\n classList = el.classList\r\n\r\n if (classList && classList.contains) {\r\n return el.classList.contains(className)\r\n }\r\n\r\n return !!pattern.exec(allClass)\r\n}\r\n\r\nexport default hasClass\r\n","import addClass from './addClass.js'\r\n\r\n/**\r\n * 给 DOM 节点设置属性/值\r\n * ========================================================================\r\n * @method setAttribute\r\n * @param {HTMLElement} el - DOM 节点\r\n * @param {String} attr - 属性名称\r\n * @param {String|Number|Boolean} value - 属性值\r\n */\r\nconst setAttribute = (el, attr, value) => {\r\n let tagName = el.tagName.toLowerCase()\r\n\r\n switch (attr) {\r\n case 'style':\r\n el.style.cssText = value\r\n break\r\n case 'value':\r\n if (tagName === 'input' || tagName === 'textarea') {\r\n el.value = value\r\n } else {\r\n el.setAttribute(attr, value)\r\n }\r\n break\r\n case 'htmlFor':\r\n el.setAttribute('for', value)\r\n break\r\n case 'className':\r\n addClass(el, value)\r\n break\r\n case 'innerHTML':\r\n el.innerHTML = value\r\n break\r\n case 'innerText':\r\n el.innerText = value\r\n break\r\n default:\r\n el.setAttribute(attr, value)\r\n break\r\n }\r\n}\r\n\r\nexport default setAttribute\r\n","import hasClass from './hasClass'\r\n\r\n/**\r\n * 给 DOM 节点添加名为 className 的样式\r\n * ========================================================================\r\n * @method addClass\r\n * @param {HTMLElement} el - DOM 节点\r\n * @param {String} className - 样式名称\r\n * @returns {Boolean}\r\n */\r\nconst addClass = (el, className) => {\r\n let classList\r\n let allClass\r\n\r\n if (hasClass(el, className)) {\r\n return false\r\n }\r\n\r\n classList = el.classList\r\n\r\n if (classList?.add) {\r\n if (className.indexOf(' ') > -1) {\r\n className.split(' ').forEach((name) => {\r\n classList.add(name)\r\n })\r\n } else {\r\n classList.add(className)\r\n }\r\n } else {\r\n allClass = el.className\r\n allClass += allClass.length > 0 ? ' ' + className : className\r\n el.className = allClass\r\n }\r\n}\r\n\r\nexport default addClass\r\n","import isObject from '../types/isObject'\r\nimport hasOwn from '../lang/hasOwn'\r\nimport setAttribute from './setAttribute'\r\n\r\nconst setAttributes = (el, attrs) => {\r\n if (!el || !isObject(attrs)) {\r\n return false\r\n }\r\n\r\n Object.keys(attrs).forEach((attr) => {\r\n const value = attrs[attr]\r\n if (hasOwn(attrs, attr)) {\r\n setAttribute(el, attr, value)\r\n }\r\n })\r\n}\r\n\r\nexport default setAttributes\r\n","import isArray from '../types/isArray'\r\nimport isString from '../types/isString'\r\nimport isSVG from '../types/isSVG'\r\nimport setAttributes from '../dom/setAttributes'\r\n\r\n/**\r\n * 创建 SVG 图标 DOM 元素\r\n * ========================================================================\r\n * @method createElement\r\n * @param {String} name\r\n * @param {Object} [options]\r\n * @param {Number|Array} [options.size]\r\n * @param {String} [options.color]\r\n * @param {String} [options.iconSet]\r\n * @param {Object} [options.attrs]\r\n * @returns {HTMLElement}\r\n */\r\nconst createElement = (name, options = {}) => {\r\n const ICON = 'outline-icon'\r\n const size = options.size || 0\r\n const color = options.color || ''\r\n const iconSet = options.iconSet || ''\r\n const width = isArray(size) ? size[0] : size\r\n const height = isArray(size) ? size[1] : size\r\n const defaultRules = size ? `width:${width}px;height:${height}px;` : ''\r\n const cssRules = color ? defaultRules + `color:${color}` : defaultRules\r\n const attrs = options.attrs || {}\r\n const $icon = document.createElement('i')\r\n let binds = ''\r\n let svg = ''\r\n let $svg\r\n\r\n if (!isString(name)) {\r\n return null\r\n }\r\n\r\n if (isSVG(name)) {\r\n svg = name\r\n } else {\r\n binds =\r\n iconSet && iconSet !== 'icon'\r\n ? `xlink:href=\"#${iconSet}-icon-${name}\"`\r\n : `xlink:href=\"#icon-${name}\"`\r\n svg = ``\r\n }\r\n\r\n $icon.innerHTML = svg\r\n\r\n if (attrs.className) {\r\n attrs.className = `${ICON} ${attrs.className}`\r\n } else {\r\n attrs.className = ICON\r\n }\r\n\r\n setAttributes($icon, attrs)\r\n\r\n $svg = $icon.querySelector('svg')\r\n setAttributes($svg, {\r\n 'aria-hidden': true,\r\n xmlns: 'http://www.w3.org/2000/svg',\r\n class: 'outline-icon__svg',\r\n width: 200,\r\n height: 200,\r\n style: cssRules\r\n })\r\n\r\n return $icon\r\n}\r\n\r\nexport default createElement\r\n","import isString from './isString'\r\n\r\nconst isSVG = (str) => {\r\n const declaration = '(?:<\\\\?xml[^>]*>\\\\s*)?'\r\n const doctype =\r\n '(?:<\\\\!doctype svg[^>]*\\\\s*(?:\\\\[?(?:\\\\s*]*>\\\\s*)*\\\\]?)*[^>]*>\\\\s*)?'\r\n const content = ']*>[^]*<\\\\/svg>\\\\s*$'\r\n const svg = `^\\\\s*${declaration}${doctype}${content}\\\\s*$`\r\n const pattern = new RegExp(svg, 'i')\r\n\r\n return isString(str) && pattern.test(str)\r\n}\r\n\r\nexport default isSVG\r\n","import isFunction from './utils/types/isFunction'\r\nimport trim from './utils/lang/trim'\r\nimport createElement from './utils/dom/createElement'\r\nimport setAttributes from './utils/dom/setAttributes'\r\n\r\nimport icon from './utils/icons/icon'\r\n\r\nconst _updateHeading = ($heading, i, options) => {\r\n const CLS_HEADING = 'outline-heading'\r\n const hasAnchor = options.hasAnchor || true\r\n const isAtStart = options.isAtStart || true\r\n const showCode = options.showCode || false\r\n const chapterCode = options.chapterCode || ''\r\n const anchorURL = options.anchorURL || ''\r\n const anchorLinkFilter = options.anchorLinkFilter || null\r\n const headingId = `heading-${i}`\r\n const attrs = {\r\n id: headingId,\r\n className: isAtStart ? `${CLS_HEADING} ${CLS_HEADING}_start` : CLS_HEADING,\r\n 'data-id': i\r\n }\r\n const text = trim($heading.innerHTML)\r\n let url\r\n let $anchor\r\n let $icon\r\n\r\n if (showCode) {\r\n attrs.innerHTML = chapterCode + ' ' + text\r\n attrs['data-code'] = chapterCode\r\n }\r\n setAttributes($heading, attrs)\r\n\r\n if (!hasAnchor) {\r\n return false\r\n }\r\n\r\n if (anchorURL) {\r\n url = anchorURL\r\n } else {\r\n if (isFunction(anchorLinkFilter)) {\r\n url = anchorLinkFilter($heading.tagName.toLowerCase(), text, i)\r\n } else {\r\n url = `#${headingId}`\r\n }\r\n }\r\n\r\n $icon = icon('hash', { iconSet: 'outline' })\r\n $anchor = createElement(\r\n 'a',\r\n {\r\n id: `anchor-${i}`,\r\n className: `${CLS_HEADING}__anchor anchor-${i}`,\r\n href: url,\r\n target: anchorURL ? '_blank' : 'self',\r\n 'data-id': i\r\n },\r\n $icon\r\n )\r\n $heading.appendChild($anchor)\r\n}\r\n\r\nexport default _updateHeading\r\n","import createElement from './createElement'\r\n\r\n/**\r\n * 创建 SVG 图标 DOM 元素\r\n * ========================================================================\r\n * @method icon\r\n * @alias createElement\r\n * @see createElement\r\n * @param {String} name\r\n * @param {Object} [options]\r\n * @param {Number|Array} [options.size]\r\n * @param {String} [options.color]\r\n * @param {String} [options.iconSet]\r\n * @returns {HTMLElement}\r\n */\r\nconst icon = (name, options = {}) => {\r\n return createElement(name, options)\r\n}\r\n\r\nexport default icon\r\n","import isObject from '../types/isObject'\r\nimport isString from '../types/isString'\r\nimport isArray from '../types/isArray'\r\nimport isDOM from '../types/isDOM'\r\nimport setAttributes from './setAttributes'\r\n\r\n/**\r\n * 创建 DOM 节点,并添加属性和子节点\r\n * ========================================================================\r\n * @method createElement\r\n * @param {String} tagName - 标签名称\r\n * @param {Object|Array|HTMLElement|DocumentFragment|String} attrs - 属性对象或者子节点\r\n * @param {Array|HTMLElement|DocumentFragment|String} [children] - 子节点数组\r\n * @returns {HTMLElement}\r\n */\r\nconst createElement = (tagName, attrs, children) => {\r\n const $fragment = document.createDocumentFragment()\r\n const $el = document.createElement(tagName)\r\n const isValidChild = (child) => {\r\n return isDOM(child) || isString(child)\r\n }\r\n const append = (child) => {\r\n let $child\r\n\r\n if (!isValidChild(child)) {\r\n return false\r\n }\r\n\r\n if (isDOM(child)) {\r\n $child = child\r\n } else if (isString(child)) {\r\n $child = document.createTextNode(child)\r\n }\r\n\r\n $fragment.appendChild($child)\r\n }\r\n\r\n if (isObject(attrs)) {\r\n setAttributes($el, attrs)\r\n } else if (isArray(attrs) && attrs.every((attr) => isValidChild(attr))) {\r\n attrs.forEach((child) => {\r\n append(child)\r\n })\r\n } else if (isDOM(attrs)) {\r\n append(attrs)\r\n } else if (isString(attrs)) {\r\n append(document.createTextNode(attrs))\r\n }\r\n\r\n if (isArray(children)) {\r\n children.forEach((child) => {\r\n append(child)\r\n })\r\n } else {\r\n append(children)\r\n }\r\n\r\n $el.appendChild($fragment)\r\n\r\n return $el\r\n}\r\n\r\nexport default createElement\r\n","import trim from '../lang/trim'\r\nimport hasClass from './hasClass'\r\n\r\n/**\r\n * 移除 DOM 节点的 className 样式\r\n * ========================================================================\r\n * @method removeClass\r\n * @param {HTMLElement} el - DOM 节点\r\n * @param {String} className - 样式名称\r\n * @returns {Boolean}\r\n */\r\nconst removeClass = (el, className) => {\r\n let allClass = el.className\r\n let classList\r\n\r\n if (!allClass || !hasClass(el, className)) {\r\n return false\r\n }\r\n\r\n classList = el.classList\r\n\r\n if (classList?.remove) {\r\n classList.remove(className)\r\n } else {\r\n allClass = trim(allClass.replace(className, ''))\r\n el.className = allClass\r\n }\r\n}\r\n\r\nexport default removeClass\r\n","import removeClass from './utils/dom/removeClass'\r\nimport isEmpty from './utils/types/isEmpty'\r\nimport trim from './utils/lang/trim'\r\n\r\nconst _removeHeading = ($heading, hasAnchor = true, isAtStart = true) => {\r\n const CLS_HEADING = 'outline-heading'\r\n const text = $heading.innerHTML\r\n const pattern = /^\\d+(\\.?\\d+)*\\s?/gi\r\n let $anchor\r\n\r\n $heading.innerHTML = text.replace(pattern, '')\r\n $heading.removeAttribute('id')\r\n $heading.removeAttribute('data-id')\r\n\r\n removeClass($heading, CLS_HEADING)\r\n\r\n if (!hasAnchor) {\r\n return false\r\n }\r\n\r\n $anchor = $heading.querySelector(`.${CLS_HEADING}__anchor`)\r\n\r\n if (isAtStart) {\r\n removeClass($heading, `${CLS_HEADING}_start`)\r\n }\r\n\r\n if (isEmpty(trim($heading.className))) {\r\n $heading.removeAttribute('class')\r\n }\r\n\r\n // 存在锚点才移除\r\n if ($anchor) {\r\n $heading.removeChild($anchor)\r\n }\r\n}\r\n\r\nexport default _removeHeading\r\n","import isString from './isString'\r\n/**\r\n * 检测数据是否为空字符串\r\n * ========================================================================\r\n * @method isEmpty\r\n * @param {String} str\r\n * @returns {boolean}\r\n */\r\nconst isEmpty = (str) => {\r\n return isString(str) && str === ''\r\n}\r\n\r\nexport default isEmpty\r\n","import trim from './utils/lang/trim'\r\nimport stripTags from './utils/lang/stripTags'\r\nimport isFunction from './utils/types/isFunction'\r\n\r\nimport _getChapterParentIdByDiffer from './_getChapterParentIdByDiffer'\r\nimport _getChaptersWithCode from './_getChaptersWithCode'\r\n\r\n/**\r\n * 根据文章中的 h1~h6 标签,自动分析返回文章章节数据\r\n * ========================================================================\r\n * @method getChaptersByHeadings\r\n * @param {Array} headings\r\n * @param {Boolean} [showCode]\r\n * @param {Function} [chapterTextFilter]\r\n * @return {*|*[]}\r\n */\r\nconst getChaptersByHeadings = (\r\n headings,\r\n showCode = false,\r\n chapterTextFilter = null\r\n) => {\r\n const pattern = /^\\d(\\.|(\\.\\d+)*)\\s?/gi\r\n const chapters = []\r\n let previous = 1\r\n let level = 0\r\n let text = ''\r\n\r\n headings.forEach((heading, i) => {\r\n const tagName = heading.tagName\r\n const headingLevel = tagName.replace(/h/i, '')\r\n let current = parseInt(headingLevel, 10)\r\n let pid = -1\r\n\r\n // 场景1:当前标题是前一个标题的子标题\r\n // 当前标题的(标题标签)序号 > 前一个标题的序号:两个相连的标题是父标题 -> 子标题关系;\r\n // h2 (前一个标题)\r\n // h3 (当前标题)\r\n if (current > previous) {\r\n level += 1\r\n\r\n // 第一层级的 pid 是 -1\r\n if (level === 1) {\r\n pid = -1\r\n } else {\r\n pid = i - 1\r\n }\r\n }\r\n // 场景2:当前标题和前一个标题层级相同\r\n // 当前标题的(标题标签)序号 = 前一个标题的序号\r\n // h2 (前一个标题)\r\n // h2 (当前标题)\r\n // 当前标题的(标题标签)序号 < 前一个标题的序号,并且当前标题序号 > 当前的级别\r\n // h2\r\n // h4 (前一个标题)\r\n // h3 (当前标题:这种情况我们还是任务 h3 是 h2 的下一级章节)\r\n else if (current === previous || (current < previous && current > level)) {\r\n // H1 的层级肯定是 1\r\n if (current === 1) {\r\n level = 1\r\n pid = -1\r\n } else {\r\n pid = chapters[i - 1].pid\r\n }\r\n }\r\n // 场景3:当前标题比前一个标题层级高\r\n else if (current <= level) {\r\n // H1 的层级肯定是 1\r\n if (current === 1) {\r\n level = 1\r\n } else {\r\n level = level - (previous - current)\r\n\r\n if (level <= 1) {\r\n level = 1\r\n }\r\n }\r\n\r\n // 第一级的标题\r\n if (level === 1) {\r\n pid = -1\r\n } else {\r\n // 通过当前标题和前一个标题之间的等级差,获得当前标题的父标题ID\r\n pid = _getChapterParentIdByDiffer(chapters, previous - current, i)\r\n }\r\n }\r\n\r\n previous = current\r\n\r\n text = trim(stripTags(heading.innerHTML))\r\n\r\n // 如果自动生成章节编号,则去掉标题中自带的编号文本\r\n if (showCode) {\r\n text = trim(text.replace(pattern, ''))\r\n }\r\n\r\n if (isFunction(chapterTextFilter)) {\r\n text = chapterTextFilter(text)\r\n }\r\n\r\n chapters.push({\r\n id: i,\r\n pid: pid,\r\n level: level,\r\n rel: `heading-${i}`,\r\n text,\r\n tagName\r\n })\r\n })\r\n\r\n return showCode ? _getChaptersWithCode(chapters) : chapters\r\n}\r\n\r\nexport default getChaptersByHeadings\r\n","import isString from '../types/isString'\r\n\r\n/**\r\n * 过滤所有 HTML 标签\r\n * ========================================================================\r\n * @method stripTags\r\n * @param {string} str\r\n * @returns {string}\r\n */\r\nconst stripTags = (str) => {\r\n if (!isString(str)) {\r\n return ''\r\n }\r\n return str.replace(/<\\/?[^>]+(>|$)/g, '')\r\n}\r\n\r\nexport default stripTags\r\n","const _getChapterParentIdByDiffer = (chapters, differ, index) => {\r\n let previous = chapters[index - 1]\r\n let pid\r\n let i\r\n\r\n for (i = 0; i < differ; i += 1) {\r\n pid = previous.pid\r\n previous = chapters[pid]\r\n }\r\n\r\n pid = previous.pid\r\n\r\n return pid\r\n}\r\n\r\nexport default _getChapterParentIdByDiffer\r\n","import isArray from './utils/types/isArray'\r\n\r\nconst _getChaptersWithCode = (chapters) => {\r\n const groups = {}\r\n const cb = (o) => {\r\n return [o.pid]\r\n }\r\n\r\n chapters.forEach((o) => {\r\n const group = JSON.stringify(cb(o))\r\n\r\n groups[group] = groups[group] || []\r\n groups[group].push(o)\r\n\r\n o.index = groups[group].length\r\n\r\n if (o.pid === -1) {\r\n o.code = String(o.index)\r\n }\r\n })\r\n\r\n Object.keys(groups).forEach((group) => {\r\n groups[group].forEach((c) => {\r\n const subjects = groups[`[${c.id}]`]\r\n\r\n if (!subjects || !isArray(subjects)) {\r\n return false\r\n }\r\n\r\n subjects.forEach((o) => {\r\n o.code = c.code + '.' + o.index\r\n })\r\n })\r\n })\r\n\r\n return chapters\r\n}\r\n\r\nexport default _getChaptersWithCode\r\n","import isString from './utils/types/isString'\r\nimport isFunction from './utils/types/isFunction'\r\nimport isElement from './utils/types/isElement'\r\nimport toTree from './utils/lang/toTree'\r\n\r\nimport getChaptersByHeadings from './getChaptersByHeadings'\r\n\r\n/**\r\n *\r\n * @param {Object} [options]\r\n * @param {String|HTMLElement} [options.articleElement]\r\n * @param {String} [options.selector]\r\n * @param {Boolean} [options.showCode]\r\n * @param {Function} [options.chapterTextFilter]\r\n * @param {Boolean} [options.isTreeStructured]\r\n * @returns {Array}\r\n */\r\nconst getChapters = (options) => {\r\n const {\r\n articleElement,\r\n selector,\r\n showCode,\r\n chapterTextFilter,\r\n isTreeStructured\r\n } = options\r\n let $article = document.querySelector('#article')\r\n let $headings = []\r\n let chapters = []\r\n let filter = null\r\n\r\n if (isString(articleElement)) {\r\n $article = document.querySelector(articleElement)\r\n } else if (isElement(articleElement)) {\r\n $article = articleElement\r\n }\r\n\r\n if (!$article) {\r\n return chapters\r\n }\r\n\r\n if (isFunction(chapterTextFilter)) {\r\n filter = chapterTextFilter\r\n } else {\r\n if (chapterTextFilter === true) {\r\n filter = (text) => {\r\n return text.replace(/\\(.*?\\)/, '()')\r\n }\r\n }\r\n }\r\n\r\n $headings = [...$article.querySelectorAll(selector || 'h1,h2,h3,h4,h5,h6')]\r\n chapters = getChaptersByHeadings($headings, showCode, filter)\r\n\r\n return isTreeStructured === true ? toTree(chapters, 'id', 'pid') : chapters\r\n}\r\n\r\nexport default getChapters\r\n","const toTree = (list, nodeKey, parentKey) => {\r\n const map = {}\r\n const roots = []\r\n\r\n list.forEach((item, i) => {\r\n // initialize the map\r\n map[item[nodeKey]] = i\r\n // initialize the children\r\n item.children = []\r\n })\r\n\r\n list.forEach((item) => {\r\n const node = list[map[item[parentKey]]]\r\n\r\n if (item[parentKey] !== -1) {\r\n // if you have dangling branches check that map[node.parentId] exists\r\n node.children.push(item)\r\n } else {\r\n roots.push(item)\r\n }\r\n })\r\n\r\n return roots\r\n}\r\n\r\nexport default toTree\r\n","/**\r\n * 存储订阅者(主题和处理器的)私有对象\r\n * ========================================================================\r\n * @type {{}}\r\n * @private\r\n */\r\nconst _subscribers = {}\r\n\r\nexport default _subscribers\r\n","import _subscribers from './_subscribers'\r\nimport hasOwn from '../lang/hasOwn'\r\n\r\n/**\r\n * 判断是否存在与给定 topic 完全匹配的订阅者信息\r\n * ========================================================================\r\n * @method _hasDirectSubscribersFor\r\n * @param {String} topic - (必须)订阅主题字符串\r\n * @returns {Boolean}\r\n */\r\nconst _hasDirectSubscribersFor = (topic) => {\r\n return hasOwn(_subscribers, topic) && _subscribers[topic].length > 0\r\n}\r\n\r\nexport default _hasDirectSubscribersFor\r\n","import _hasDirectSubscribersFor from './_hasDirectSubscribersFor'\r\nimport _hasSubscribers from './_hasSubscribers'\r\n\r\n/**\r\n * 判断是否存在包含 topic 指定的订阅者信息\r\n * ========================================================================\r\n * @method has\r\n * @param {String} topic - (必须)主题名称\r\n * @param {Boolean} [isDirect] - (可选)是否为直接的主题,默认值:true\r\n * @returns {Boolean}\r\n */\r\nconst has = (topic, isDirect = true) => {\r\n return isDirect ? _hasDirectSubscribersFor(topic) : _hasSubscribers(topic)\r\n}\r\n\r\nexport default has\r\n","import _hasDirectSubscribersFor from './_hasDirectSubscribersFor'\r\n\r\n/**\r\n * 判断是否存在包含给定 topic 相关的订阅者信息\r\n * ========================================================================\r\n * @method _hasSubscribers\r\n * @param {String} topic - (必须)订阅主题字符串\r\n * @returns {Boolean}\r\n */\r\nconst _hasSubscribers = (topic) => {\r\n let found = _hasDirectSubscribersFor(topic)\r\n let position = topic.lastIndexOf('.')\r\n\r\n while (!found && position !== -1) {\r\n topic = topic.substring(0, position)\r\n position = topic.lastIndexOf('.')\r\n found = _hasDirectSubscribersFor(topic)\r\n }\r\n\r\n return found\r\n}\r\n\r\nexport default _hasSubscribers\r\n","import isTypedArray from '../types/isTypedArray'\r\nimport _subscribers from './_subscribers'\r\nimport has from './has'\r\nimport _hasDirectSubscribersFor from './_hasDirectSubscribersFor'\r\n\r\n/**\r\n * (异步)发布订阅主题信息\r\n * ========================================================================\r\n * 主题默认是异步发布的。确保在消费者处理主题时,主题的发起者不会被阻止。\r\n * ========================================================================\r\n * @method emit\r\n * @param {String} topic - (必须)主题名称\r\n * @param {Object} [data] - (可选)数据对象\r\n * @param {Boolean} [async] - (可选) 是否异步发布\r\n */\r\nconst emit = (topic, data, async = true) => {\r\n const execute = (topic) => {\r\n if (!_hasDirectSubscribersFor(topic)) {\r\n return false\r\n }\r\n\r\n _subscribers[topic].forEach((subscriber) => {\r\n // 针对 mqtt 消息服务返回的 Uint8Array 类似的 typed arrays 格式的数据\r\n // 采用 toString() 方法转化为普通(JSON)字符串\r\n const message = isTypedArray(data) ? data.toString() : data\r\n\r\n subscriber.callback.call(subscriber.context || subscriber, message)\r\n })\r\n }\r\n const deliver = () => {\r\n let subscriber = topic\r\n let position = topic.lastIndexOf('.')\r\n\r\n while (position !== -1) {\r\n subscriber = subscriber.substring(0, position)\r\n position = subscriber.lastIndexOf('.')\r\n\r\n execute(subscriber)\r\n }\r\n\r\n // 执行 topic 对应的处理器\r\n execute(topic)\r\n // 执行特殊 topic:'*'(监听全部消息的发布)\r\n execute('*')\r\n }\r\n\r\n if (!has(topic)) {\r\n return false\r\n }\r\n\r\n if (async) {\r\n setTimeout(deliver, 10)\r\n } else {\r\n deliver()\r\n }\r\n}\r\n\r\nexport default emit\r\n","import toString from '../lang/toString'\r\n/**\r\n * 判断检测数据是否为 Typed Arrays 类型的数据\r\n * ========================================================================\r\n * @param {*} val\r\n * @returns {boolean}\r\n */\r\nconst isTypedArray = (val) => {\r\n const TYPES = [\r\n '[object Int8Array]',\r\n '[object Uint8Array]',\r\n '[object Uint8ClampedArray]',\r\n '[object Int16Array]',\r\n '[object Uint16Array]',\r\n '[object Int32Array]',\r\n '[object Uint32Array]',\r\n '[object Float32Array]',\r\n '[object Float64Array]',\r\n '[object BigInt64Array]',\r\n '[object BigUint64Array]'\r\n ]\r\n\r\n return TYPES.indexOf(toString(val)) > -1\r\n}\r\n\r\nexport default isTypedArray\r\n","/**\r\n * 生成唯一 id 字符串的函数\r\n * ========================================================================\r\n * @method guid\r\n * @param {String} [prefix] - 生成 id 的前缀字符串\r\n * @return {String} 返回一个表示唯一 id 的字符串\r\n */\r\nconst guid = (() => {\r\n let uuid = 0\r\n\r\n return (prefix) => {\r\n uuid += 1\r\n\r\n return prefix ? prefix + '-' + uuid : 'guid-' + uuid\r\n }\r\n})()\r\n\r\nexport default guid\r\n","import _subscribers from './_subscribers'\r\nimport hasOwn from '../lang/hasOwn'\r\n\r\n/**\r\n * 删除与给定 topic 相同的订阅者信息\r\n * ========================================================================\r\n * @method _removeSubscriber\r\n * @param {String} topic - (必须)订阅主题字符串\r\n * @returns {Boolean}\r\n */\r\nconst _removeSubscriber = (topic) => {\r\n if (!hasOwn(_subscribers, topic)) {\r\n return false\r\n }\r\n\r\n delete _subscribers[topic]\r\n}\r\n\r\nexport default _removeSubscriber\r\n","import has from './has'\r\nimport _removeSubscriber from './_removeSubscriber'\r\nimport _removeSubscriberByToken from './_removeSubscriberByToken'\r\n\r\n/**\r\n * 取消订阅主题\r\n * ========================================================================\r\n * @method off\r\n * @param {String} topic - (必须)订阅的主题\r\n * @param {Function|String} [token] - (可选)订阅主题的处理器函数或者唯一 Id 值\r\n */\r\nconst off = (topic, token) => {\r\n if (!has(topic)) {\r\n return false\r\n }\r\n\r\n if (token) {\r\n _removeSubscriberByToken(token)\r\n } else {\r\n _removeSubscriber(topic)\r\n }\r\n}\r\n\r\nexport default off\r\n","import _subscribers from './_subscribers'\r\nimport _removeSubscriber from './_removeSubscriber'\r\n\r\n/**\r\n * 通过订阅者 token 值删除订阅者信息\r\n * ========================================================================\r\n * @method _removeSubscriberByToken\r\n * @param {String} token - 订阅者 token 字符串\r\n * @returns {boolean}\r\n * @private\r\n */\r\nconst _removeSubscriberByToken = (token) => {\r\n const keys = Object.keys(_subscribers)\r\n let index = -1\r\n\r\n if (!token || keys.length < 1) {\r\n return false\r\n }\r\n\r\n keys.forEach((subject) => {\r\n const subscriber = _subscribers[subject]\r\n let topic\r\n\r\n subscriber.forEach((execution, j) => {\r\n if (execution.callback === token || execution.token === token) {\r\n topic = execution.topic\r\n subscriber.splice(index, j)\r\n }\r\n })\r\n\r\n /* istanbul ignore else */\r\n if (subscriber.length < 1) {\r\n _removeSubscriber(topic)\r\n }\r\n })\r\n}\r\n\r\nexport default _removeSubscriberByToken\r\n","import isString from './utils/types/isString'\r\nimport hasOwn from './utils/lang/hasOwn'\r\nimport isObject from './utils/types/isObject'\r\nimport extend from './utils/lang/extend'\r\nimport publish from './utils/observer/emit'\r\nimport subscribe from './utils/observer/on'\r\nimport unsubscribe from './utils/observer/off'\r\n\r\nclass Base {\r\n constructor(options) {\r\n this.attrs = {}\r\n\r\n if (options) {\r\n this.initialize(options)\r\n }\r\n }\r\n\r\n initialize(options) {\r\n this.attr(options).render().addListeners()\r\n return this\r\n }\r\n\r\n attr(prop, value) {\r\n const attrs = this.attrs\r\n\r\n if (isString(prop)) {\r\n // 只能扩展 attrs 中已有的属性\r\n if (value && hasOwn(attrs, prop)) {\r\n // 更新单个配置信息\r\n attrs[prop] = value\r\n return this\r\n }\r\n\r\n // 只传递 prop 参数,则返回对应的属性值\r\n return attrs[prop]\r\n } else if (isObject(prop)) {\r\n // 批量更新配置信息\r\n extend(attrs, prop)\r\n\r\n return this\r\n } else if (arguments.length === 0) {\r\n // 不传递参数,直接返回整个\r\n return attrs\r\n }\r\n\r\n return this\r\n }\r\n\r\n render() {\r\n return this\r\n }\r\n\r\n refresh() {\r\n return this\r\n }\r\n\r\n destroy() {\r\n this.removeListeners()\r\n return this\r\n }\r\n\r\n reload(options) {\r\n let attrs = this.attr()\r\n\r\n if (options) {\r\n attrs = this.attr(options)\r\n }\r\n\r\n this.destroy().initialize(attrs)\r\n\r\n return this\r\n }\r\n\r\n $emit(event, data) {\r\n publish(event, data)\r\n return this\r\n }\r\n\r\n $on(event, callback) {\r\n subscribe(event, callback, this)\r\n return this\r\n }\r\n\r\n $off(event, callback) {\r\n unsubscribe(event, callback)\r\n return this\r\n }\r\n\r\n addListeners() {\r\n return this\r\n }\r\n\r\n removeListeners() {\r\n return this\r\n }\r\n}\r\n\r\nexport default Base\r\n","import hasOwn from './hasOwn'\r\n\r\n/**\r\n * 扩展对象\r\n * ========================================================================\r\n * @method extend\r\n * @param {Object} origin\r\n * @param {Object} source\r\n */\r\nconst extend = (origin, source) => {\r\n const keys = Object.keys(source)\r\n\r\n keys.forEach((prop) => {\r\n if (hasOwn(source, prop)) {\r\n origin[prop] = source[prop]\r\n }\r\n })\r\n}\r\n\r\nexport default extend\r\n","import _subscribers from './_subscribers'\r\nimport isFunction from '../types/isFunction'\r\nimport guid from '../lang/guid'\r\n\r\n/**\r\n * 订阅主题,并给出处理器函数\r\n * ========================================================================\r\n * @method on\r\n * @param {String} topic - (必须)主题名称\r\n * @param {Function} handler - (必须)主题的处理器函数\r\n * @param {Object} [context] - (可选)指定 this 执行上下文\r\n * @return {String} - 唯一的 token 字符串,例如:'guid-1'。\r\n */\r\nconst on = (topic, handler, context = null) => {\r\n const token = guid()\r\n let subject = typeof topic === 'symbol' ? topic.toString() : topic\r\n\r\n if (!isFunction(handler)) {\r\n return ''\r\n }\r\n\r\n /* istanbul ignore else */\r\n if (!_subscribers[subject]) {\r\n _subscribers[subject] = []\r\n }\r\n\r\n _subscribers[subject].push({\r\n topic: subject,\r\n callback: handler,\r\n context,\r\n token\r\n })\r\n\r\n return token\r\n}\r\n\r\nexport default on\r\n","import isString from './utils/types/isString'\r\nimport isFunction from './utils/types/isFunction'\r\nimport isElement from './utils/types/isElement'\r\nimport cloneDeep from './utils/lang/cloneDeep'\r\nimport timeSlice from './utils/lang/timeSlice'\r\nimport later from './utils/lang/later'\r\nimport scrollTo from './utils/dom/scrollTo'\r\nimport _getScrollElement from './utils/dom/_getScrollElement'\r\nimport offsetTop from './utils/dom/offsetTop'\r\nimport on from './utils/event/on'\r\nimport off from './utils/event/off'\r\nimport stop from './utils/event/stop'\r\nimport paint from './utils/icons/paint'\r\n\r\nimport _updateHeading from './_updateHeading'\r\nimport _removeHeading from './_removeHeading'\r\nimport getChapters from './getChapters'\r\n\r\nimport Base from './base'\r\n\r\nclass Anchors extends Base {\r\n constructor(options) {\r\n super()\r\n\r\n this._default()\r\n\r\n if (options) {\r\n this.initialize(options)\r\n }\r\n }\r\n\r\n _default() {\r\n this.attrs = cloneDeep(Anchors.DEFAULTS)\r\n\r\n this.$articleElement = null\r\n this.$scrollElement = null\r\n this.$headings = []\r\n\r\n return this\r\n }\r\n\r\n initialize(options) {\r\n let created\r\n let scrollElement\r\n let $articleElement\r\n let articleElement\r\n\r\n this.attr(options)\r\n\r\n articleElement = this.attr('articleElement')\r\n scrollElement = this.attr('scrollElement')\r\n created = this.attr('created')\r\n\r\n if (isString(articleElement)) {\r\n $articleElement = document.querySelector(articleElement)\r\n } else if (isElement(articleElement)) {\r\n $articleElement = articleElement\r\n }\r\n\r\n if (!$articleElement) {\r\n return this\r\n }\r\n\r\n this.$articleElement = $articleElement\r\n this.$scrollElement = _getScrollElement(scrollElement)\r\n this.$headings = this.getHeadings()\r\n\r\n if (this.$headings.length < 1) {\r\n return this\r\n }\r\n\r\n if (isFunction(created)) {\r\n created.call(this)\r\n }\r\n\r\n this.render().addListeners()\r\n\r\n return this\r\n }\r\n\r\n getHeadings() {\r\n const $articleElement = this.$articleElement\r\n const selector = this.attr('selector')\r\n\r\n return [...$articleElement.querySelectorAll(selector)]\r\n }\r\n\r\n count() {\r\n return this.getHeadings().length\r\n }\r\n\r\n render() {\r\n const articleElement = this.attr('articleElement')\r\n const selector = this.attr('selector')\r\n const showCode = this.attr('showCode')\r\n const chapterTextFilter = this.attr('chapterTextFilter')\r\n const mounted = this.attr('mounted')\r\n const chapters = getChapters({\r\n articleElement,\r\n selector,\r\n showCode,\r\n chapterTextFilter\r\n })\r\n\r\n paint()\r\n\r\n this._paint(chapters)\r\n\r\n if (isFunction(mounted)) {\r\n mounted.call(this)\r\n }\r\n\r\n return this\r\n }\r\n\r\n erase() {\r\n this._remove()\r\n\r\n return this\r\n }\r\n\r\n _paint(chapters) {\r\n const LIMIT = 400\r\n const hasAnchor = this.attr('hasAnchor')\r\n const isAtStart = this.attr('isAtStart')\r\n const showCode = this.attr('showCode')\r\n const anchorURL = this.attr('anchorURL')\r\n const anchorLinkFilter = this.attr('anchorLinkFilter')\r\n const count = this.count()\r\n const $headings = [...this.$headings]\r\n const update = (headings, group) => {\r\n headings.forEach(($heading, i) => {\r\n const id = i + group * LIMIT\r\n const chapterCode = chapters[id].code\r\n _updateHeading($heading, id, {\r\n hasAnchor,\r\n isAtStart,\r\n showCode,\r\n chapterCode,\r\n anchorURL,\r\n anchorLinkFilter\r\n })\r\n })\r\n }\r\n let groupIndex = -1\r\n\r\n // 针对超长的文章,进行 timeSlice 处理\r\n if (count > LIMIT) {\r\n groupIndex += 1\r\n // 同步绘制 Limit 以内的标题链接(可以确保 50ms 完成绘制)\r\n update($headings.splice(0, LIMIT), 0)\r\n // 采用 timeSlice 处理机制绘制剩余的标题\r\n while ($headings.length > 0) {\r\n const once = $headings.splice(0, LIMIT)\r\n timeSlice(\r\n () => {\r\n update(once, (groupIndex += 1))\r\n },\r\n () => {\r\n this.$emit('anchors:all:paint')\r\n }\r\n )\r\n }\r\n } else {\r\n update($headings, 0)\r\n }\r\n\r\n return this\r\n }\r\n\r\n _remove() {\r\n const hasAnchor = this.attr('hasAnchor')\r\n const isAtStart = this.attr('isAtStart')\r\n const $headings = this.$headings\r\n\r\n $headings.forEach(($heading) => {\r\n _removeHeading($heading, hasAnchor, isAtStart)\r\n })\r\n\r\n return this\r\n }\r\n\r\n refresh(chapters) {\r\n const articleElement = this.attr('articleElement')\r\n const selector = this.attr('selector')\r\n const showCode = this.attr('showCode')\r\n const chapterTextFilter = this.attr('chapterTextFilter')\r\n\r\n this.$headings = this.getHeadings()\r\n\r\n this.erase()._paint(\r\n chapters ||\r\n getChapters({\r\n articleElement,\r\n selector,\r\n showCode,\r\n chapterTextFilter\r\n })\r\n )\r\n\r\n return this\r\n }\r\n\r\n scrollTo(top, after) {\r\n const el = this.$scrollElement\r\n\r\n scrollTo(el, top, after)\r\n\r\n return this\r\n }\r\n\r\n destroy() {\r\n const beforeDestroy = this.attr('beforeDestroy')\r\n const afterDestroy = this.attr('afterDestroy')\r\n\r\n if (isFunction(beforeDestroy)) {\r\n beforeDestroy.call(this)\r\n }\r\n\r\n this.removeListeners()._remove()._default()\r\n\r\n if (isFunction(afterDestroy)) {\r\n afterDestroy.call(this)\r\n }\r\n\r\n return this\r\n }\r\n\r\n onAnchorTrigger(evt) {\r\n const anchorURL = this.attr('anchorURL')\r\n const afterScroll = this.attr('afterScroll')\r\n const stickyHeight = this.attr('stickyHeight')\r\n const $anchor = evt.delegateTarget\r\n const $heading = $anchor.parentNode\r\n const top = offsetTop($heading) - (stickyHeight + 10)\r\n const $scrollElement = this.$scrollElement\r\n const min = 0\r\n const max = $scrollElement.scrollHeight - $scrollElement.clientHeight\r\n const after = () => {\r\n if (isFunction(afterScroll)) {\r\n afterScroll.call(this, 'anchor')\r\n }\r\n\r\n later(() => {\r\n this.$emit('toolbar:update', {\r\n top,\r\n min,\r\n max\r\n })\r\n })\r\n }\r\n\r\n this.scrollTo(top, after)\r\n\r\n if (!anchorURL) {\r\n stop(evt)\r\n }\r\n\r\n return this\r\n }\r\n\r\n onRefresh(chapters) {\r\n this.refresh(chapters)\r\n\r\n return this\r\n }\r\n\r\n addListeners() {\r\n const $articleElement = this.$articleElement\r\n\r\n if (this.count() < 1) {\r\n return this\r\n }\r\n\r\n on(\r\n $articleElement,\r\n '.outline-heading__anchor',\r\n 'click',\r\n this.onAnchorTrigger,\r\n this,\r\n true\r\n )\r\n\r\n this.$on('anchors:refresh', this.onRefresh)\r\n\r\n return this\r\n }\r\n\r\n removeListeners() {\r\n const $articleElement = this.$articleElement\r\n\r\n if (this.count() < 1) {\r\n return this\r\n }\r\n\r\n off($articleElement, 'click', this.onAnchorTrigger)\r\n this.$off('anchors:refresh', this.onRefresh)\r\n\r\n return this\r\n }\r\n}\r\n\r\nAnchors.DEFAULTS = (() => {\r\n const OPTIONS = {\r\n scrollElement: 'html,body',\r\n articleElement: '#article',\r\n selector: 'h1,h2,h3,h4,h5,h6',\r\n stickyHeight: 0,\r\n anchorURL: '',\r\n hasAnchor: true,\r\n isAtStart: true,\r\n showCode: false,\r\n created: null,\r\n mounted: null,\r\n afterScroll: null,\r\n beforeDestroy: null,\r\n afterDestroy: null,\r\n chapterTextFilter: null,\r\n anchorLinkFilter: null\r\n }\r\n\r\n return cloneDeep(OPTIONS)\r\n})()\r\n\r\nexport default Anchors\r\n","import easeInQuad from '../lang/easeInQuad'\r\nimport isFunction from '../types/isFunction'\r\nimport _getScrollElement from './_getScrollElement'\r\n\r\n/**\r\n * 指定 rootElement DOM 节点滚动到指定 top 位置\r\n * ========================================================================\r\n * @method scrollTo\r\n * @param {HTMLElement|Object} [scrollElement] - (必须)要滚动的 DOM 节点\r\n * @param {Number} top - (必须)滚动的 scrollTop 数值\r\n * @param {Function} [afterStop] - (可选)滚动完成的回调函数\r\n */\r\nconst scrollTo = (scrollElement, top, afterStop) => {\r\n const $scrollElement = _getScrollElement(scrollElement)\r\n let scrollTop = $scrollElement.scrollTop\r\n let step = 0\r\n const distance = top - scrollTop\r\n const MAX_HEIGHT = $scrollElement.scrollHeight\r\n const MAX_TOP = top - MAX_HEIGHT <= 0 ? top : MAX_HEIGHT\r\n const stop = (top) => {\r\n if (isFunction(afterStop)) {\r\n afterStop(top)\r\n }\r\n\r\n return false\r\n }\r\n const play = () => {\r\n step += 1\r\n\r\n // 向上滚动\r\n if (distance < 0) {\r\n scrollTop -= easeInQuad(step)\r\n $scrollElement.scrollTop = scrollTop\r\n\r\n console.log(\r\n '$scrollElement up',\r\n scrollElement,\r\n $scrollElement,\r\n scrollTop,\r\n $scrollElement.scrollTop\r\n )\r\n\r\n if (scrollTop <= top) {\r\n $scrollElement.scrollTop = top\r\n return stop(top)\r\n }\r\n } else {\r\n scrollTop += easeInQuad(step)\r\n $scrollElement.scrollTop = scrollTop\r\n\r\n console.log(\r\n '$scrollElement down',\r\n scrollElement,\r\n $scrollElement,\r\n scrollTop,\r\n $scrollElement.scrollTop\r\n )\r\n\r\n if (scrollTop >= MAX_TOP) {\r\n $scrollElement.scrollTop = MAX_TOP\r\n return stop(MAX_TOP)\r\n }\r\n }\r\n\r\n // eslint-disable-next-line compat/compat\r\n requestAnimationFrame(play)\r\n }\r\n\r\n // eslint-disable-next-line compat/compat\r\n requestAnimationFrame(play)\r\n}\r\n\r\nexport default scrollTo\r\n","/**\r\n * 停止事件(阻止默认行为和阻止事件的捕获或冒泡)\r\n * ========================================================================\r\n * @method stop\r\n * @param {Event} evt - 事件对象\r\n *\r\n * @example\r\n *
\r\n * Service\r\n * Help\r\n *
\r\n *\r\n * const $nav = document.querySelector('#nav')\r\n * const $service = document.querySelector('.anchor')\r\n *\r\n * on($nav, 'click', function(evt) {\r\n * console.log('你点击了导航栏')\r\n * })\r\n *\r\n * on($anchor, 'click', function(evt) {\r\n * console.log('tagName', this.tagName)\r\n *\r\n * // 工作台输出:'a'\r\n * // 不会触发事件冒泡,输出:'你点击了导航栏'\r\n * // 也不会切换到 href 属性的页面,阻止了点击链接的默认行为\r\n * stopEvent(evt)\r\n * })\r\n */\r\nconst stop = function (evt) {\r\n evt.stopPropagation()\r\n evt.preventDefault()\r\n}\r\n\r\nexport default stop\r\n"],"names":["isString","str","toString","val","Object","prototype","apply","isFunction","isObject","o","isElement","nodeName","tagName","nodeType","isArray","Array","cloneDeep","obj","clone","from","assign","keys","forEach","key","later","fn","delay","setTimeout","queue","isHandling","done","runIdle","idleDeadline","timeRemaining","length","shift","requestIdleCallback","window","cb","start","Date","now","didTimeout","Math","max","cancelIdleCallback","id","clearTimeout","timeSlice","afterComplete","push","easeInQuad","x","_getScrollElement","scrollElement","$rootElements","$scrollElement","document","querySelector","querySelectorAll","scrollTop","offsetTop","el","top","offsetParent","matches","selector","sel","replace","msMatchesSelector","getParentOrHost","host","parentNode","CAPTURE_EVENTS","_off","type","capture","indexOf","_delegateListener","listeners","_listeners","index","listener","i","handler","splice","_delete","removeEventListener","purgeElement","recurse","$element","$children","childNodes","getListeners","filter","arguments","$child","off","on","data","context","once","evt","target","getTarget","delegateTarget","closest","ctx","includeCTX","startsWith","overrideContext","call","addEventListener","SYMBOLS","_maybeArrayLike","_toConsumableArray","getSymbols","name","iconSet","getSymbol","patternName","patternSet","find","symbol","fullName","exec","paint","$body","body","$icons","symbols","add","innerHTML","join","createElement","insertBefore","firstChild","trim","isDOM","isHTMLCollection","fragment","isTextNode","hasOwn","prop","hasOwnProperty","hasClass","className","pattern","RegExp","allClass","classList","contains","setAttribute","attr","value","toLowerCase","style","cssText","addClass","_classList","split","innerText","setAttributes","attrs","options","ICON","size","color","width","height","defaultRules","cssRules","$icon","$svg","binds","svg","test","isSVG","xmlns","class","_updateHeading","$heading","CLS_HEADING","hasAnchor","isAtStart","showCode","chapterCode","anchorURL","anchorLinkFilter","headingId","text","url","$anchor","icon","children","$fragment","createDocumentFragment","$el","isValidChild","child","append","createTextNode","appendChild","every","href","removeClass","remove","_removeHeading","removeAttribute","removeChild","getChaptersByHeadings","headings","chapterTextFilter","chapters","previous","level","heading","headingLevel","current","parseInt","pid","_getChapterParentIdByDiffer","differ","rel","groups","group","JSON","stringify","code","String","c","subjects","_getChaptersWithCode","getChapters","articleElement","isTreeStructured","$article","$headings","toTree","list","nodeKey","parentKey","map","roots","item","node","_subscribers","_hasDirectSubscribersFor","topic","has","isDirect","found","position","lastIndexOf","substring","_hasSubscribers","emit","async","execute","subscriber","message","callback","deliver","guid","uuid","prefix","_removeSubscriber","token","subject","execution","j","_removeSubscriberByToken","Base","constructor","this","initialize","render","addListeners","origin","source","extend","refresh","destroy","removeListeners","reload","$emit","event","publish","$on","subscribe","$off","unsubscribe","Anchors","super","_default","DEFAULTS","$articleElement","created","getHeadings","count","mounted","_paint","erase","_remove","LIMIT","update","groupIndex","scrollTo","after","afterStop","step","distance","MAX_HEIGHT","scrollHeight","MAX_TOP","stop","play","console","log","requestAnimationFrame","beforeDestroy","afterDestroy","onAnchorTrigger","afterScroll","stickyHeight","clientHeight","min","stopPropagation","preventDefault","onRefresh"],"mappings":"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"} \ No newline at end of file diff --git a/docs/js/docs.min.js b/docs/js/docs.min.js index a5f03c69..84b4cdf6 100644 --- a/docs/js/docs.min.js +++ b/docs/js/docs.min.js @@ -1,2 +1,2 @@ -!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(t="undefined"!=typeof globalThis?globalThis:t||self).outline=e()}(this,(function(){"use strict";function t(t,e){(null==e||e>t.length)&&(e=t.length);for(var i=0,s=Array(e);iObject.prototype.toString.apply(t),l=t=>"function"==typeof t||"[object Function]"===o(t),a=(t,e=300)=>!!l(t)&&setTimeout((()=>{t()}),e),h=t=>("[object Object]"===o(t)||"object"==typeof t||l(t))&&null!==t,c=t=>Array.isArray?Array.isArray(t):"[object Array]"===o(t),u=t=>{let e={};return null===t?null:(c(t)?e=Array.from(t):(e=Object.assign({},t),Object.keys(e).forEach((i=>e[i]=h(t[i])?u(t[i]):t[i]))),e)},d=t=>"string"==typeof t,m=t=>!!(h(t)&&t.nodeName&&t.tagName&&1===t.nodeType),p=(t,e)=>{const i=new RegExp("(\\s|^)"+e+"(\\s|$)");let s,r;return!!m(t)&&(s=t.className,!!s&&(r=t.classList,r&&r.contains?t.classList.contains(e):!!i.exec(s)))},g=(t,e)=>{var i;let s,r;if(p(t,e))return!1;s=t.classList,null!==(i=s)&&void 0!==i&&i.add?e.indexOf(" ")>-1?e.split(" ").forEach((t=>{s.add(t)})):s.add(e):(r=t.className,r+=r.length>0?" "+e:e,t.className=r)},f=t=>t*t,b=(t=null)=>{let e,i;return t?d(t)?i=document.querySelector(t):m(t)&&(i=t):(e=document.querySelectorAll("html,body"),i=e[0].scrollTop-e[1].scrollTop>=0?e[0]:e[1]),i},y=(t,e,i)=>{const s=b(t);let r=s.scrollTop,n=0;const o=e-r,a=s.scrollHeight,h=e-a<=0?e:a,c=t=>(l(i)&&i(t),!1),u=()=>{if(n+=1,o<0){if(r-=f(n),s.scrollTop=r,console.log("$scrollElement up",t,s,r,s.scrollTop),r<=e)return s.scrollTop=e,c(e)}else if(r+=f(n),s.scrollTop=r,console.log("$scrollElement down",t,s,r,s.scrollTop),r>=h)return s.scrollTop=h,c(h);requestAnimationFrame(u)};requestAnimationFrame(u)},v=t=>!!d(t)&&t.replace(/(^\s+)|(\s+$)/g,""),$=(t,e=!1,i=null)=>{const s=/^\d(\.|(\.\d+)*)\s?/gi,r=[];let n=1,o=0,a="";return t.forEach(((t,h)=>{const c=t.tagName,u=c.replace(/h/i,"");let m=parseInt(u,10),p=-1;var g;m>n?(o+=1,p=1===o?-1:h-1):m===n||mo?1===m?(o=1,p=-1):p=r[h-1].pid:m<=o&&(1===m?o=1:(o-=n-m,o<=1&&(o=1)),p=1===o?-1:((t,e,i)=>{let s,r,n=t[i-1];for(r=0;r]+(>|$)/g,""):"")),e&&(a=v(a.replace(s,""))),l(i)&&(a=i(a)),r.push({id:h,pid:p,level:o,rel:`heading-${h}`,text:a,tagName:c})})),e?(t=>{const e={};return t.forEach((t=>{const i=JSON.stringify((t=>[t.pid])(t));e[i]=e[i]||[],e[i].push(t),t.index=e[i].length,-1===t.pid&&(t.code=String(t.index))})),Object.keys(e).forEach((t=>{e[t].forEach((t=>{const i=e[`[${t.id}]`];if(!i||!c(i))return!1;i.forEach((e=>{e.code=t.code+"."+e.index}))}))})),t})(r):r},_=t=>{const{articleElement:e,selector:s,showCode:r,chapterTextFilter:o,isTreeStructured:a}=t;let h=document.querySelector("#article"),c=[],u=[],p=null;return d(e)?h=document.querySelector(e):m(e)&&(h=e),h?(l(o)?p=o:!0===o&&(p=t=>t.replace(/\(.*?\)/,"()")),c=i(n,h.querySelectorAll(s||"h1,h2,h3,h4,h5,h6")),u=$(c,r,p),!0===a?((t,e,i)=>{const s={},r=[];return t.forEach(((t,i)=>{s[t[e]]=i,t.children=[]})),t.forEach((e=>{const n=t[s[e[i]]];-1!==e[i]?n.children.push(e):r.push(e)})),r})(u,"id","pid"):u):u},x=(t,e)=>{const i=Object.prototype.hasOwnProperty;return t&&i.call(t,e)},w=(t,e)=>{Object.keys(e).forEach((i=>{x(e,i)&&(t[i]=e[i])}))},T={},E=t=>x(T,t)&&T[t].length>0,S=(t,e=!0)=>e?E(t):(t=>{let e=E(t),i=t.lastIndexOf(".");for(;!e&&-1!==i;)i=(t=t.substring(0,i)).lastIndexOf("."),e=E(t);return e})(t),C=(t,e,i=!0)=>{const s=t=>{if(!E(t))return!1;T[t].forEach((t=>{const i=["[object Int8Array]","[object Uint8Array]","[object Uint8ClampedArray]","[object Int16Array]","[object Uint16Array]","[object Int32Array]","[object Uint32Array]","[object Float32Array]","[object Float64Array]","[object BigInt64Array]","[object BigUint64Array]"].indexOf(o(e))>-1?e.toString():e;t.callback.call(t.context||t,i)}))},r=()=>{let e=t,i=t.lastIndexOf(".");for(;-1!==i;)e=e.substring(0,i),i=e.lastIndexOf("."),s(e);s(t),s("*")};if(!S(t))return!1;i?setTimeout(r,10):r()},L=(()=>{let t=0;return e=>(t+=1,e?e+"-"+t:"guid-"+t)})(),z=t=>{if(!x(T,t))return!1;delete T[t]},k=(t,e)=>{if(!S(t))return!1;e?(t=>{const e=Object.keys(T);if(!t||e.length<1)return!1;e.forEach((e=>{const i=T[e];let s;i.forEach(((e,r)=>{e.callback!==t&&e.token!==t||(s=e.topic,i.splice(-1,r))})),i.length<1&&z(s)}))})(e):z(t)};class M{constructor(t){this.attrs={},t&&this.initialize(t)}initialize(t){return this.attr(t).render().addListeners(),this}attr(t,e){const i=this.attrs;return d(t)?e&&x(i,t)?(i[t]=e,this):i[t]:h(t)?(w(i,t),this):0===arguments.length?i:this}render(){return this}refresh(){return this}destroy(){return this.removeListeners(),this}reload(t){let e=this.attr();return t&&(e=this.attr(t)),this.destroy().initialize(e),this}$emit(t,e){return C(t,e),this}$on(t,e){return((t,e,i=null)=>{const s=L();let r="symbol"==typeof t?t.toString():t;l(e)&&(T[r]||(T[r]=[]),T[r].push({topic:r,callback:e,context:i,token:s}))})(t,e,this),this}$off(t,e){return k(t,e),this}addListeners(){return this}removeListeners(){return this}}const A=[];let O,N;function H(t){for(;t.timeRemaining()>0&&A.length;){const t=A.shift();if(!l(t))return!1;t()}A.length?O=requestIdleCallback(H):(O=0,l(N)&&(N(),N=null))}void 0===window.requestIdleCallback&&(window.requestIdleCallback=function(t){const e=Date.now();return a((function(){t({didTimeout:!1,timeRemaining:function(){return Math.max(0,50-(Date.now()-e))}})}),10)},window.cancelIdleCallback=function(t){clearTimeout(t)});const D=(t,e=null)=>{A.push(t),l(e)&&(N=e),O||requestIdleCallback(H)},j=t=>{let e=t.offsetTop;return null!==t.offsetParent&&(e+=j(t.offsetParent)),e},F=(t,e="")=>{const i=e.replace(/^>/i,"");return!!(e&&i&&t)&&(t.matches?t.matches(i):!!t.msMatchesSelector&&t.msMatchesSelector(i))},q=t=>t.host&&t!==document&&t.host.nodeType?t.host:t.parentNode,R=["focusout","blur","focusin","focus","load","unload","mouseenter","mouseleave"],I=(t,e,i)=>{const s=R.indexOf(e)>-1;i._delegateListener&&delete(i=i._delegateListener)._delegateListener,function(t,e,i){const s=t._listeners;let r=-1;if(s.length<1)return!1;s.forEach(((t,s)=>{const n=t.fn;e===t.type&&(r=s,n===i&&(r=s))})),r>-1&&s.splice(r,1)}(t,e,i),t.removeEventListener(e,i,s)},U=function(t,e,i=!1){const s=d(t)?document.querySelector(t):t,r=s.childNodes,n=((t,e)=>{let i=t._listeners||[];return d(e)&&e&&(i=i.filter((t=>t.type===e))),i})(s,e);n.forEach((t=>{I(s,t.type,t.fn)})),(i||!0===e||1===arguments.length)&&s&&r&&r.forEach((t=>{m(t)&&U(t,e,i)}))},B=(t,e,i)=>{if(!l(i))return U(t,e),!1;I(t,e,i)},P=(t,e,i,s,r,n,o=!1)=>{const l=R.indexOf(i)>-1,a=function(l){const h=function(t){const e=t.target;return(i=e)&&3===i.nodeType?i.parentNode:i;var i}(l),c=((t,e,i,s)=>{const r=i||document;if(!t)return null;do{if(null!=e&&(e.startsWith(">")?t.parentNode===r&&F(t,e):F(t,e))||s&&t===r)return t;if(t===r)break}while(t=q(t))})(h,e,t);let u=n||t;l.delegateTarget=c,!0===n&&(u=r),c&&(!0===o&&B(t,i,a),s.call(u,l,r))};if(!t)return!1;t._listeners||(t._listeners=[]),t._listeners.push({el:t,selector:e,type:i,fn:a,data:r,context:n,capture:l}),s._delegateListener=a,t.addEventListener(i,a,l)},V=function(t){t.stopPropagation(),t.preventDefault()},W=i(n,['','','','','','','','','','','','','','','','','','','','']),Q=(t,e="icon")=>d(t)?((t,e="icon")=>{const i=/id="(.*?)"/,s=/^(\w+)-/;return W.find((r=>{const n=i.exec(r)[1];return s.exec(n)[1]===e&&n===("icon"===e?`${e}-${t}`:`${e}-icon-${t}`)}))})(t,e):i(n,W),J=(t="")=>{const e=document.body;let i=document.querySelector("#outline-icons"),s=[];(t=>{if(!t)return!1;c(t)&&t.length>0?t.forEach((t=>{-1===W.indexOf(t)&&d(t)&&W.push(t)})):d(t)&&W.push(t)})(t),s=Q(),i?i.innerHTML=s.join(""):(i=document.createElement("div"),i.innerHTML=``,e.insertBefore(i.firstChild,e.firstChild))},Y=t=>{return!(!h(t)||!(m(t)||(t=>!(!h(t)||"[object NodeList]"!==o(t)))(t)||(e=t,h(e)&&"[object DocumentFragment]"===o(e))||(t=>!(!h(t)||!("[object Text]"===o(t)||t.tagName&&3===t.nodeType)))(t)));var e},G=(t,e,i)=>{let s=t.tagName.toLowerCase();switch(e){case"style":t.style.cssText=i;break;case"value":"input"===s||"textarea"===s?t.value=i:t.setAttribute(e,i);break;case"htmlFor":t.setAttribute("for",i);break;case"className":g(t,i);break;case"innerHTML":t.innerHTML=i;break;case"innerText":t.innerText=i;break;default:t.setAttribute(e,i)}},K=(t,e)=>{if(!t||!h(e))return!1;Object.keys(e).forEach((i=>{const s=e[i];x(e,i)&&G(t,i,s)}))},X=(t,e,i)=>{const s=document.createDocumentFragment(),r=document.createElement(t),n=t=>Y(t)||d(t),o=t=>{let e;if(!n(t))return!1;Y(t)?e=t:d(t)&&(e=document.createTextNode(t)),s.appendChild(e)};return h(e)?K(r,e):c(e)&&e.every((t=>n(t)))?e.forEach((t=>{o(t)})):Y(e)?o(e):d(e)&&o(document.createTextNode(e)),c(i)?i.forEach((t=>{o(t)})):o(i),r.appendChild(s),r},Z=(t,e={})=>{const i="outline-icon",s=e.size||0,r=e.color||"",n=e.iconSet||"",o=c(s)?s[0]:s,l=c(s)?s[1]:s,a=s?`width:${o}px;height:${l}px;`:"",h=r?a+`color:${r}`:a,u=e.attrs||{},m=document.createElement("i");let p,g="",f="";return d(t)?((t=>{const e=new RegExp("^\\s*(?:<\\?xml[^>]*>\\s*)?(?:<\\!doctype svg[^>]*\\s*(?:\\[?(?:\\s*]*>\\s*)*\\]?)*[^>]*>\\s*)?]*>[^]*<\\/svg>\\s*$\\s*$","i");return d(t)&&e.test(t)})(t)?f=t:(g=n&&"icon"!==n?`xlink:href="#${n}-icon-${t}"`:`xlink:href="#icon-${t}"`,f=``),m.innerHTML=f,u.className?u.className=`${i} ${u.className}`:u.className=i,K(m,u),p=m.querySelector("svg"),K(p,{"aria-hidden":!0,xmlns:"http://www.w3.org/2000/svg",class:"outline-icon__svg",width:200,height:200,style:h}),m):null},tt=(t,e={})=>Z(t,e),et=(t,e)=>{var i;let s,r=t.className;if(!r||!p(t,e))return!1;s=t.classList,null!==(i=s)&&void 0!==i&&i.remove?s.remove(e):(r=v(r.replace(e,"")),t.className=r)},it=(t,e=!0,i=!0)=>{const s="outline-heading",r=t.innerHTML;let n;if(t.innerHTML=r.replace(/^\d+(\.?\d+)*\s?/gi,""),t.removeAttribute("id"),t.removeAttribute("data-id"),et(t,s),!e)return!1;var o;n=t.querySelector(`.${s}__anchor`),i&&et(t,`${s}_start`),o=v(t.className),d(o)&&""===o&&t.removeAttribute("class"),n&&t.removeChild(n)};class st extends M{constructor(t){super(),this._default(),t&&this.initialize(t)}_default(){return this.attrs=u(st.DEFAULTS),this.$articleElement=null,this.$scrollElement=null,this.$headings=[],this}initialize(t){let e,i,s,r;return this.attr(t),r=this.attr("articleElement"),i=this.attr("scrollElement"),e=this.attr("created"),d(r)?s=document.querySelector(r):m(r)&&(s=r),s?(this.$articleElement=s,this.$scrollElement=b(i),this.$headings=this.getHeadings(),this.$headings.length<1||(l(e)&&e.call(this),this.render().addListeners()),this):this}getHeadings(){const t=this.$articleElement,e=this.attr("selector");return i(n,t.querySelectorAll(e))}count(){return this.getHeadings().length}render(){const t=this.attr("articleElement"),e=this.attr("selector"),i=this.attr("showCode"),s=this.attr("chapterTextFilter"),r=this.attr("mounted"),n=_({articleElement:t,selector:e,showCode:i,chapterTextFilter:s});return J(),this._paint(n),l(r)&&r.call(this),this}erase(){return this._remove(),this}_paint(t){const e=400,s=this.attr("hasAnchor"),r=this.attr("isAtStart"),o=this.attr("showCode"),a=this.attr("anchorURL"),h=this.attr("anchorLinkFilter"),c=this.count(),u=i(n,this.$headings),d=(i,n)=>{i.forEach(((i,c)=>{const u=c+n*e,d=t[u].code;((t,e,i)=>{const s="outline-heading",r=i.hasAnchor||!0,n=i.isAtStart||!0,o=i.showCode||!1,a=i.chapterCode||"",h=i.anchorURL||"",c=i.anchorLinkFilter||null,u=`heading-${e}`,d={id:u,className:n?`${s} ${s}_start`:s,"data-id":e},m=v(t.innerHTML);let p,g,f;if(o&&(d.innerHTML=a+" "+m,d["data-code"]=a),K(t,d),!r)return!1;p=h||(l(c)?c(t.tagName.toLowerCase(),m,e):`#${u}`),f=tt("hash",{iconSet:"outline"}),g=X("a",{id:`anchor-${e}`,className:`${s}__anchor anchor-${e}`,href:p,target:h?"_blank":"self","data-id":e},f),t.appendChild(g)})(i,u,{hasAnchor:s,isAtStart:r,showCode:o,chapterCode:d,anchorURL:a,anchorLinkFilter:h})}))};let m=-1;if(c>e)for(m+=1,d(u.splice(0,e),0);u.length>0;){const t=u.splice(0,e);D((()=>{d(t,m+=1)}),(()=>{this.$emit("anchors:all:paint")}))}else d(u,0);return this}_remove(){const t=this.attr("hasAnchor"),e=this.attr("isAtStart");return this.$headings.forEach((i=>{it(i,t,e)})),this}refresh(t){const e=this.attr("articleElement"),i=this.attr("selector"),s=this.attr("showCode"),r=this.attr("chapterTextFilter");return this.$headings=this.getHeadings(),this.erase()._paint(t||_({articleElement:e,selector:i,showCode:s,chapterTextFilter:r})),this}scrollTo(t,e){const i=this.$scrollElement;return y(i,t,e),this}destroy(){const t=this.attr("beforeDestroy"),e=this.attr("afterDestroy");return l(t)&&t.call(this),this.removeListeners()._remove()._default(),l(e)&&e.call(this),this}onAnchorTrigger(t){const e=this.attr("anchorURL"),i=this.attr("afterScroll"),s=this.attr("stickyHeight"),r=t.delegateTarget.parentNode,n=j(r)-(s+10),o=this.$scrollElement,h=o.scrollHeight-o.clientHeight;return this.scrollTo(n,(()=>{l(i)&&i.call(this,"anchor"),a((()=>{this.$emit("toolbar:update",{top:n,min:0,max:h})}))})),e||V(t),this}onRefresh(t){return this.refresh(t),this}addListeners(){const t=this.$articleElement;return this.count()<1||(P(t,".outline-heading__anchor","click",this.onAnchorTrigger,this,!0),this.$on("anchors:refresh",this.onRefresh)),this}removeListeners(){const t=this.$articleElement;return this.count()<1||(B(t,"click",this.onAnchorTrigger),this.$off("anchors:refresh",this.onRefresh)),this}}st.DEFAULTS=u({scrollElement:"html,body",articleElement:"#article",selector:"h1,h2,h3,h4,h5,h6",stickyHeight:0,anchorURL:"",hasAnchor:!0,isAtStart:!0,showCode:!1,created:null,mounted:null,afterScroll:null,beforeDestroy:null,afterDestroy:null,chapterTextFilter:null,anchorLinkFilter:null});const rt=["a","abbr","address","area","article","aside","audio","b","base","bdi","bdo","blockquote","body","br","button","canvas","caption","cite","code","col","colgroup","data","datalist","dd","del","details","dfn","dialog","div","dl","dt","em","embed","fieldset","figcaption","figure","footer","form","h1","h2","h3","h4","h5","h6","head","header","hgroup","hr","html","i","iframe","img","input","ins","kbd","label","legend","li","link","main","map","mark","math","menu","menuitem","meta","meter","nav","noscript","object","ol","optgroup","option","output","p","param","picture","pre","progress","q","rb","rp","rt","rtc","ruby","s","samp","script","search","section","select","slot","small","source","span","strong","style","sub","summary","sup","svg","table","tbody","td","template","textarea","tfoot","th","thead","time","title","tr","track","u","ul","var","video","wbr"],nt=t=>{let e,i,s;return!!d(t)&&(e=v(t).slice(0,1e3),i=/\s*|]*>|]*>|]+>/i,s=new RegExp(rt.map((t=>`<${t}\\b[^>]*>`)).join("|"),"i"),i.test(e)||s.test(e))},ot=t=>t.replace(/]*>.*?<\/script>/gi,""),lt=(t,e)=>{document.documentElement.style.setProperty(t,e)};let at=2e3;const ht=t=>(t?at=t:at+=1,lt("--outline-zIndex",`${at}`),at);class ct extends M{constructor(t){super(),this._default(),this.zIndex=0,t&&this.initialize(t)}_default(){return this.attrs=u(ct.DEFAULTS),this.title="",this.closed=!1,this.$el=null,this.$modal=null,this.$header=null,this.$title=null,this.$close=null,this.$main=null,this.$footer=null,this.$overlay=null,this}initialize(t){let e;return this.attr(t),this.title=this.attr("title"),e=this.attr("created"),l(e)&&e.call(this),this.render().addListeners(),this}setTitle(t){return this.attr("title",t),this.title=t,this.$title.innerHTML=t,this}isClosed(){return this.closed}render(){const t=this.attr("mounted"),e=this.attr("size"),i=this.attr("placement"),s=this.attr("hasClose"),r=this.attr("hasOverlay"),n=this.attr("hasOffset"),o=this.attr("hasPadding"),a=this.attr("autoHeight"),h=this.attr("overflow"),c=this.attr("customClass");let u,d,m,p,f,b,y,v,$="outline-drawer__main";return J(),this.zIndex=ht(),p=X("h2",{className:"outline-drawer__title"},this.title),this.$title=p,s&&(f=X("div",{className:"outline-drawer__close"},tt("close",{iconSet:"outline",size:20})),this.$close=f),m=X("header",{className:"outline-drawer__header"},[p,f]),this.$header=m,"hidden"===h&&($+=" overflow-hidden"),b=X("div",{className:$}),this.$main=b,o||g(b,"outline-drawer_full"),y=X("footer",{className:"outline-drawer__footer"}),this.$footer=y,d=X("div",{className:`outline-drawer__modal outline-drawer_${i} outline-drawer_${e} outline-drawer_closed`},[m,b,y]),this.$modal=d,n&&g(d,"outline-drawer_offset"),a&&g(d,"outline-drawer_auto"),c&&g(d,c),r&&(v=X("div",{className:"outline-drawer__overlay"}),this.$overlay=v),u=X("div",{className:"outline-drawer"},[d,v]),this.$el=u,document.body.appendChild(u),l(t)&&t.call(this),this}erase(){return this.$main.innerHTML="",this}_paint(t){let e=null;return l(t)?e=t():Y(t)?e=t:nt(t)&&(e=((t,e)=>{const s=document.createDocumentFragment();if(!t||!nt(t)&&!d(t)&&!m(t))return null;if(nt(t)){const e=X("div");let r=[];return e.innerHTML=ot(t),r=i(n,e.childNodes),r.forEach((t=>{s.appendChild(t)})),s}if(!d(e))return t.innerHTML;t.innerHTML=ot(e)})(t)),e&&this.$main.appendChild(e),this}_remove(){return document.body.removeChild(this.$el),this}refresh(t){return this.erase()._paint(t),this}open(){const t=this.attr("afterOpened"),e=this.$modal;return g(this.$el,"outline-drawer_opened"),et(e,"outline-drawer_closed"),g(e,"outline-drawer_opened"),a((()=>{this.closed=!1,l(t)&&t.call(this)})),this}close(){const t=this.attr("afterClosed"),e=this.$modal;return et(e,"outline-drawer_opened"),g(e,"outline-drawer_closed"),a((()=>{et(this.$el,"outline-drawer_opened"),this.closed=!0,l(t)&&t.call(this)})),this}toggle(){const t=this.attr("afterToggle"),e=this.isClosed();return e?this.open():this.close(),l(t)&&a((()=>{t.call(this,e)})),this}destroy(){const t=this.attr("afterDestroy"),e=this.attr("beforeDestroy");let i=this.zIndex;return l(e)&&e.call(this),this.removeListeners()._remove()._default(),i-=1,ht(i),this.zIndex=0,l(t)&&t.call(this),this}onClose(){return this.close(),this}addListeners(){const t=this.attr("hasClose"),e=this.attr("hasOverlay"),i=this.attr("closeOnClickModal"),s=this.$el;return t&&P(s,".outline-drawer__close","click",this.onClose,this,!0),e&&i&&P(s,".outline-drawer__overlay","click",this.onClose,this,!0),this}removeListeners(){const t=this.attr("hasClose"),e=this.attr("hasOverlay"),i=this.$el;return t||e?(B(i,"click",this.onClose),this):this}}ct.DEFAULTS=u({placement:"rtl",title:"标题",size:"regular",hasClose:!0,hasOverlay:!0,hasOffset:!1,hasPadding:!0,autoHeight:!0,closeOnClickModal:!0,overflow:"auto",created:null,mounted:null,afterClosed:null,afterOpened:null,afterScroll:null,beforeDestroy:null,afterDestroy:null,afterToggle:null});const ut=(t,e,i,s,r,n=!1)=>{const o=R.indexOf(e)>-1,a=function(o){let l=r||t;!0===r&&(l=s),!0===n&&B(t,e,a),i.call(l,o,s)};if(!l(i))return!1;t._listeners||(t._listeners=[]),t._listeners.push({el:t,type:e,fn:a,data:s,context:r,capture:o}),i._delegateListener=a,t.addEventListener(e,a,o)},dt=(t,e)=>getComputedStyle(t)[e],mt="outline-navigator_hidden",pt="outline-navigator_expanded",gt="outline-navigator_folded";class ft extends M{constructor(t){super(),this._default(),this.scrollTimer=null,this.resizeTimer=null,this.observerTimer=null,this.Observer=null,t&&this.initialize(t)}_default(){return this.attrs=u(ft.DEFAULTS),this.$el=null,this.$title=null,this.$main=null,this.$list=null,this.$placeholder=null,this.$parentElement=null,this.$scrollElement=null,this.$active=null,this.chapters=[],this.active=0,this.offsetWidth=0,this.offsetTop=0,this.playing=!1,this.closed=!1,this}initialize(t){let e,i,s,r;return this.attr(t),e=this.attr("created"),i=this.attr("parentElement"),s=this.attr("scrollElement"),d(i)?r=document.querySelector(i):m(i)&&(r=i),this.$parentElement=r,this.$scrollElement=b(s),this.chapters=this.attr("chapters"),this.closed=this.attr("closed"),this.active=this.attr("active"),l(e)&&e.call(this),this.chapters.length<1||(this.render().addListeners(),this.$active=document.querySelector(`#chapter-${this.active}`)),this}isClosed(){return this.closed}isSticky(){return"sticky"===this.attr("position")}isFixed(){return"fixed"===this.attr("position")}isInside(){return this.isFixed()||this.isSticky()}isOutside(){return!this.isInside()}count(){return this.chapters.length}_paintEdge(){const t=document.createDocumentFragment(),e=this.attr("title"),i=this.attr("animationCurrent"),s=this.attr("customClass"),r=this.$parentElement,n=[],o=[];let l,a,h,c,u=null;return r?(this.isInside()&&e&&(u=X("h2",{className:"outline-navigator__title"},e),this.$title=u,o.push(u)),h=X("ul",{className:"outline-navigator__list"}),this.$list=h,n.push(h),i&&(c=X("div",{className:"outline-navigator__placeholder"}),this.$placeholder=c,n.push(c)),a=X("div",{className:"outline-navigator__main"},n),this.$main=a,o.push(a),l=X("nav",{id:"outline-navigator",className:`outline-navigator ${mt}`},o),this.$el=l,this.isSticky()&&(this.calculateStickyHeight(),g(l,"outline-navigator_sticky")),s&&g(l,s),t.appendChild(l),r.appendChild(t),this):this}render(){const t=this.attr("mounted"),e=this.$parentElement,i=this.chapters,s=this.count();let r;return!e||i.length<1||(this.isInside()&&g(e,"outline-navigator-parent"),this._paintEdge(),r=this.$el,this._paint(i),a((()=>{this.highlight(this.active)}),60),this.offsetTop=j(r),this.offsetWidth=r.offsetWidth,this.isFixed()&&(this.sticky(),lt("--outline-navigator-width",`${this.offsetWidth}px`)),l(t)&&t.call(this),s<400&&this.onObserver()),this}erase(){return this.$list.innerHTML="",this}_paint(t){const e=this.attr("showCode"),s=this.$el;return((t,e,s=!1)=>{const r=e.length,o=i(n,e),l=e=>{const i=e=>t.querySelector(`#${e}`);e.forEach((e=>{const r=e.pid,n=e.id,o=e.code,l=e.rel,a=[],h=X("span",{className:"outline-navigator__text"},e.text);let c,u,d,m,p;s&&(u=X("span",{className:"outline-navigator__code","data-id":n},e.code),a.push(u)),a.push(h),c=X("a",{id:`chapter__anchor-${n}`,className:"outline-navigator__anchor",href:"#"+l,rel:l,"data-id":n,"data-code":o},a),d=X("li",{id:`chapter-${n}`,className:"outline-navigator__item","data-id":n,"data-code":o},c),-1===r?t.appendChild(d):(p=i(`chapter-${r}`),m=i(`subject-${r}`),m?m.appendChild(d):(m=X("ul",{id:"subject-"+r,className:"outline-navigator__subject"},d),p.appendChild(m)))}))};if(r>400)for(l(o.splice(0,400));o.length>0;){const t=o.splice(0,400);D((()=>{l(t)}))}else l(o)})(this.$list,t,e),et(s,mt),g(s,pt),this}_remove(){return this.$parentElement.removeChild(this.$el),this}refresh(t){const e=this.$el;return et(e,mt),this.erase()._paint(t),this}_getPlaceholderOffset(t){const e=this.$main,i=this.$list,s=i.querySelector(".outline-navigator__anchor"),r=parseInt(dt(e,"padding-top"),10),n=parseInt(dt(e,"border-top-width"),10),o=parseInt(dt(i,"padding-top"),10),l=parseInt(dt(i,"margin-top"),10),a=parseInt(dt(i,"border-top-width"),10);let h,c=0;return r&&(c+=r),o&&(c+=o),l&&(c+=l),n&&(c+=n),a&&(c+=a),h=s.offsetHeight*t,c+h}positionPlaceholder(t){const e=this.$list,i=this.$placeholder,s=e.querySelector(".outline-navigator__anchor"),r=this.attr("animationCurrent"),n=s.offsetHeight;let o=0;return r?(o=this._getPlaceholderOffset(t),i.style.cssText=`transform: translateY(${o}px);height:${n}px;`,this):this}highlight(t){const e=this.$el,i=this.attr("animationCurrent"),s="outline-navigator_active",r="outline-navigator_highlight";let n="relative"===this.attr("position")?this.$parentElement:this.$main,o=null,l=0;return e?(o=e.querySelector(`#chapter__anchor-${t}`),o?(this.active=parseInt(o.getAttribute("data-id"),10),this.$active&&(et(this.$active,r),et(this.$active,s)),this.$active=o,g(this.$active,s),i?this.positionPlaceholder(this.active):g(this.$active,r),a((()=>{((t,e)=>{let i,s,r=!1;return m(t)&&m(e)?(i=e.getBoundingClientRect(),s=t.getBoundingClientRect(),r=!!(s.top>=i.top&&s.right<=i.right&&s.bottom<=i.bottom&&s.left>=i.left),r):r})(this.$active,n)||(l=this._getPlaceholderOffset(this.active),y(n,l))})),this):this):this}sticky(){const t=this.attr("afterSticky"),e="outline-navigator_fixed",i=this.$el,s=this.offsetTop,r=this.$scrollElement.scrollTop;let n;return this.isFixed()?(n=r>=s,n?g(i,e):et(i,e),l(t)&&t.call(this,this.isClosed(),n),this):this}calculateStickyHeight(){const t=document.documentElement,e=Math.max(t.clientHeight||0,window.innerHeight||0);return lt("--outline-sticky-height",`${e}px`),this}scrollTo(t,e){const i=this.$scrollElement;return y(i,t,e),this}show(){const t=this.attr("afterOpened"),e=this.count(),i=this.$el,s=this.$parentElement;return this.isInside()?e>800?et(s,mt):(et(s,mt),a((()=>{et(s,gt),g(s,pt)}),30)):et(i,mt),this.closed=!1,l(t)&&t.call(this),this}hide(){const t=this.attr("afterClosed"),e=this.count(),i=this.$el,s=this.$parentElement;return this.isInside()?e>800?g(s,mt):(g(s,gt),et(s,pt),a((()=>{g(s,mt)}))):g(i,mt),this.closed=!0,l(t)&&t.call(this),this}toggle(){const t=this.attr("afterToggle"),e=this.offsetTop,i=this.$scrollElement.scrollTop;let s;return this.isClosed()?this.show():this.hide(),l(t)&&a((()=>{s=i>=e,t.call(this,this.isClosed(),s)})),this}destroy(){const t=this.attr("beforeDestroy"),e=this.attr("afterDestroy");return l(t)&&t.call(this),this.removeListeners()._remove()._default(),this.scrollTimer&&(clearTimeout(this.scrollTimer),this.scrollTimer=null),this.resizeTimer&&(clearTimeout(this.resizeTimer),this.resizeTimer=null),this.observerTimer&&(clearTimeout(this.observerTimer),this.observerTimer=null),this.Observer&&(this.Observer=null),l(e)&&e.call(this),this}onObserver(){const t=this.attr("selector");return this.Observer=((t,e={})=>{const i=e.root||null,s=e.selector||".outline-heading",r=e.context||null,n={rootMargin:e.rootMargin||"0px 0px -90% 0px"},o=new IntersectionObserver((e=>{e.forEach((e=>{e.intersectionRatio>0&&l(t)&&t.call(r||e.target,e.target)}))}),n),a=m(i)?i:document;return i&&(n.root=i),a.querySelectorAll(s).forEach((t=>{o.observe(t)})),o})((t=>{const e=t.getAttribute("data-id");if(this.playing)return!1;this.observerTimer&&clearTimeout(this.observerTimer),this.observerTimer=a((()=>{this.highlight(e)}),100)}),{selector:t,context:this}),this}onSelect(t){const e=this.attr("stickyHeight"),i=t.delegateTarget,s=i.getAttribute("data-id"),r=i.href.split("#")[1],n=document.querySelector(`#${r}`),o=j(n)-(e+10),h=this.$scrollElement.scrollHeight,c=this.attr("afterScroll"),u=()=>{l(c)&&c.call(this,"chapter"),a((()=>{this.playing=!1,this.$emit("toolbar:update",{top:o,min:0,max:h})}))};return this.playing=!0,this.isFixed()?(this.sticky(),a((()=>{this.scrollTo(o,u),this.highlight(s)}),10)):(this.scrollTo(o,u),this.highlight(s)),V(t),this}onScroll(){const t=this.$scrollElement;return this.scrollTimer&&clearTimeout(this.scrollTimer),this.scrollTimer=a((()=>{const e=t.scrollTop,i=t.scrollHeight-t.clientHeight;this.isFixed()&&this.sticky(),this.$emit("toolbar:update",{top:e,min:0,max:i})}),100),this}onResize(){return this.isSticky()?(this.resizeTimer&&clearTimeout(this.resizeTimer),this.resizeTimer=a((()=>{this.calculateStickyHeight()})),this):this}onRefresh(t){return this.refresh(t),this}addListeners(){const t=this.$el,e=this.$scrollElement,i=e.tagName.toLowerCase();let s=e;return this.count()<1||("html"!==i&&"body"!==i||(s=window),P(t,".outline-navigator__anchor","click",this.onSelect,this,!0),ut(s,"scroll",this.onScroll,this,!0),this.isSticky()&&ut(window,"resize",this.onResize,this,!0),this.$on("anchors:all:paint",this.onObserver,this),this.$on("navigator:refresh",this.onRefresh,this)),this}removeListeners(){const t=this.attr("selector"),e=this.$el,i=this.$scrollElement,s=i.tagName.toLowerCase();let r=i;return this.count()<1||("html"!==s&&"body"!==s||(r=window),B(e,"click",this.onSelect),B(r,"scroll",this.onScroll),this.isSticky()&&B(window,"resize",this.onResize),this.$off("anchors:all:paint"),this.$off("navigator:refresh"),this.Observer&&document.querySelectorAll(t).forEach((t=>{this.Observer.unobserve(t)}))),this}}ft.DEFAULTS=u({parentElement:"",scrollElement:"",selector:".outline-heading",active:0,closed:!1,showCode:!0,animationCurrent:!0,position:"relative",stickyHeight:0,chapters:[],created:null,mounted:null,afterClosed:null,afterOpened:null,afterScroll:null,beforeDestroy:null,afterDestroy:null,afterSticky:null});const bt=t=>{const e=Object.getPrototypeOf;let i;if(!(t=>h(t)&&null!==t)(t))return!1;if(i=t.prototype,!i)return!0;for(i=t;null!==e(i);)i=e(i);return e(t)===i},yt=t=>{const e={"&":"&","<":"<",">":">","'":"'",'"':"""};return t.replace(/[&<>'"]/g,(t=>e[t]||t))},vt=[];let $t;J();class _t extends M{constructor(t){super(),this._default(),t&&this.initialize(t)}_default(){return this.attrs=u(_t.DEFAULTS),this.$el=null,this.id="",this.closed=!1,this.visible=!1,this.offset=-50,this.timer=null,this.destroyed=!1,this}initialize(t){return this.attr(t),this.id=this.attr("id"),this.offset=this.attr("offset")||-50,this.$emit("created",r({},this.attr())),this.render().addListeners(),this.attr("visible")&&this.open(),this}isClosed(){return this.closed}isDestroyed(){return this.destroyed}_getClassName(){const t=this.attr("type"),e=this.attr("effect"),i=this.attr("round"),s=this.attr("closable"),r=this.attr("visible"),n=this.attr("customClass"),o=["outline-message",`outline-message_${t}`,`outline-message_${e}`];return i&&o.push("outline-message_round"),s||o.push("outline-message_full-width"),r&&o.push("outline-message_visible"),n&&o.push(n),o}render(){const t=this.attr("type"),e=this.attr("message"),i=this.attr("effect"),s=this.attr("round"),r=this.attr("closable"),n=this.attr("dangerouslyUseHTMLString"),o=this._getClassName(),l=[];let a,h,c,u,d,m=20;return s&&"default"===i&&(m=12),"plain"!==i&&(a=tt("light"===i?`circle-${t}`:t,{iconSet:"outline",size:m}),g(a,"outline-message__icon"),l.push(a)),n?(c=document.createDocumentFragment(),c.innerHTML=e):c=document.createTextNode(yt(ot(e))),h=X("p",{className:"outline-message__content"},[c]),l.push(h),r&&(u=tt("close",{iconSet:"outline",size:18}),g(u,"outline-message__close"),l.push(u)),d=X("div",{className:o.join(" ")},l),d.style.cssText="top:-50px;",this.$el=d,document.body.appendChild(this.$el),this.$emit("mounted"),this}_refreshIcon(){const t=".outline-message_hidden",e=this.$el;let i,s,r,n,o,l,a,h=20;return this.isDestroyed()?this:(o=e.querySelector(".outline-icon"),o?(i=this.attr("type"),s=this.attr("effect"),r=this.attr("round"),"plain"===s?g(o,t):(et(o,t),r&&"default"===s&&(h=12)),l=o.querySelector(".outline-icon__svg"),K(l,{style:`width:${h}px;height:${h}px;`}),a=l.querySelector("use"),n="light"===s?`circle-${i}`:i,G(a,"xlink:href",`#outline-icon-${n}`),this):this)}_refreshMessage(){const t=this.$el;let e,i,s,r;return this.isDestroyed()||(e=t.querySelector(".outline-message__content"),i=this.attr("dangerouslyUseHTMLString"),s=this.attr("message"),r=i?s:yt(ot(s)),e.innerHTML=r),this}_refreshClose(){const t=".outline-message_hidden",e=this.$el;let i,s;return this.isDestroyed()||(i=e.querySelector(".outline-message__close"),s=this.attr("closable"),i&&(s?g(i,t):et(i,t))),this}_refreshEl(){const t=this.$el;let e;return this.isDestroyed()||(e=this._getClassName(),G(t,"className",e.join(" "))),this}refresh(t){return bt(t)?(this.attr(t)._refreshIcon()._refreshMessage()._refreshClose()._refreshEl(),this):this}clearTimer(){return this.isDestroyed()||this.timer&&(clearTimeout(this.timer),this.timer=null),this}startTimer(t){return this.isDestroyed()||(this.timer=a((()=>{this.$emit("opened"),this.close()}),1e3*t)),this}open(t){const e=this.$el;let i,s,r,n;return this.isDestroyed()||(this.isClosed()&&this.refresh(t),i=this.attr("offset"),s=this.attr("duration"),r=i&&i>=this.offset?i:this.offset,n=`top:${r}px;`,this.clearTimer(),this.$emit("beforeOpen"),a((()=>{this.visible=!0,g(e,"outline-message_visible"),e.style.cssText=n,s>0&&this.startTimer(s)}),100)),this}close(){const t=this.$el;let e,i;return this.isDestroyed()||(e=this.attr("destroyAfterClosed"),i=this.attr("beforeClose"),l(i)&&i.call(this),t.style.cssText="top:-50px;",et(t,"outline-message_visible"),this.visible=!1,this.closed=!0,a((()=>{this.$emit("closed"),e&&this.destroy()}),500)),this}destroy(){return this.$emit("beforeDestroy"),this.isDestroyed()||(this.removeListeners(),document.body.removeChild(this.$el),clearTimeout(this.timer),this._default(),this.$emit("afterDestroy")),this}onMouseEnter(){return this.clearTimer(),this}onMouseLeave(){const t=this.attr("duration"),e=this.attr("delay");return t<=0||this.startTimer(e),this}onClose(){return this.clearTimer(),this.close(),this}addListeners(){const t=this.$el;return P(t,".outline-message__content","mouseenter",this.onMouseEnter,this,!0),P(t,".outline-message__content","mouseleave",this.onMouseLeave,this,!0),P(t,".outline-message__close","click",this.onClose,this,!0),this}removeListeners(){const t=this.$el;return B(t,"mouseenter",this.onMouseEnter),B(t,"mouseleave",this.onMouseLeave),B(t,"click",this.onClose),this}}_t.DEFAULTS=u({id:"",type:"info",effect:"default",round:!1,offset:30,duration:3,delay:2,message:"",customClass:"",closable:!0,visible:!0,dangerouslyUseHTMLString:!1,destroyAfterClosed:!0,beforeClose:null}),["info","success","warning","error"].forEach((t=>{_t[t]=e=>{const i={},s=L("outline-message-"),r=e.beforeClose||null;let n=e.offset||30;return d(e)?i.message=e:bt(e)&&w(i,e),i.id=s,i.type=t,i.offset=n,i.visible=!1,i.beforeClose=()=>{_t.close(s,r)},$t=new _t(i),vt.forEach((t=>{n+=t.$el.offsetHeight+16})),$t.offset=n,$t.open(),vt.push($t),$t}})),_t.close=(t,e)=>{const i=vt.length;let s,r,n=-1;if(vt.forEach(((i,s)=>{t===i.id&&(r=i.$el.offsetHeight,n=s,l(e)&&e.call(i),vt.splice(s,1))})),i<=1||-1===n||n>vt.length-1)return!1;for(s=n;s{let t=vt.length-1;for(;t>=0;t-=1)vt[t].close()};class xt{constructor(t,e){this.name=t,l(e)&&(this.action=e)}execute(){return this.action(),this}}class wt{constructor(){this.commands=[]}get(t){return this.commands.find((e=>e.name===t))}add(t){return this.commands.push(t),this}del(t){const e=this.commands,i=e.find((e=>e.name===t)),s=i?e.indexOf(i):-1;return s>-1&&e.splice(s,1),this}clear(){return this.commands=[],this}execute(t){const e=this.commands.find((e=>e.name===t));return l(null==e?void 0:e.execute)&&e.execute(),this}}const Tt=(t,e=!0)=>{const i=tt(t.icon,{iconSet:t.iconSet||"outline",color:t.color||"",size:t.size}),s=X("a",{className:"outline-toolbar__anchor",href:t.link},i),r=X("div",{className:`outline-toolbar__button ${t.name}`,"data-cmd":t.name},[t.link?s:i]);return g(i,"outline-toolbar__icon"),e&&g(r,"outline-toolbar_rounded"),t.disabled&&g(r,"outline-toolbar_disabled"),r},Et="outline-toolbar_disabled",St="outline-toolbar_hidden",Ct="outline-toolbar_active";class Lt extends M{constructor(t){super(),this._default(),t&&this.initialize(t)}_default(){return this.attrs=u(Lt.DEFAULTS),this.disabled=!1,this.closed=!1,this.$el=null,this.buttons=[],this.commands=null,this}initialize(t){let e;return this.attr(t),this.disabled=this.attr("disabled"),this.closed=this.attr("closed"),this.commands=new wt,e=this.attr("created"),l(e)&&e.call(this),this.render().addListeners(),this}isHighlight(t){const e=this.get(t);return!!e&&p(e.$el,Ct)}isDisabled(t){let e;return t?(e=this.get(t),e.disabled):this.disabled}isExist(t){return!!this.get(t)}isClosed(){return this.closed}_getCommand(t){const e=this,{action:i,name:s}=t;let r,n,o=null,a=null;return i?(a=i.handler,r=i.context||this,l(a)?n=a:d(a)&&(n=function(){e.$emit(a,s)}),l(n)&&(o=new xt(s,n.bind(r))),o):o}get(t){return this.buttons.find((e=>e.name===t))}render(){const t=this.attr("mounted"),e=this.attr("buttons")||[],i=this.attr("placement");return J(),this.$el=X("div",{id:L("outline-toolbar"),className:`outline-toolbar outline-toolbar_${i}`}),this._paint(e),document.body.appendChild(this.$el),this.closed&&this.hide(),this.disabled&&this.disable(),l(t)&&t.call(this),this}erase(){return this.$el.innerHTML="",this}_paint(t){const e=this.attr("rounded"),i=document.createDocumentFragment();return t.forEach((t=>{const s=Tt(t,e),r=this._getCommand(t),{name:n,disabled:o,context:l}=t;i.appendChild(s),this.isExist(n)||(this.buttons.push({$el:s,name:n,disabled:o||!1,context:l||this}),r&&this.commands.add(r))})),this.$el.appendChild(i),this}_remove(){return document.body.removeChild(this.$el),this}refresh(t){return this.attr({buttons:t}),this.erase()._paint(t),this}add(t){const e=this.$el,i=document.createDocumentFragment(),s=this.attr("buttons")||[],{name:r,disabled:n,context:o}=t,l=this._getCommand(t),a=t=>{const e=Tt(t);i.appendChild(e),s.push(t),this.buttons.push({$el:e,name:r,disabled:n||!1,context:o||this,command:l}),l&&this.commands.add(l)};return h(t)?a(t):c(t)&&t.forEach((t=>{h(t)&&a(t)})),e.appendChild(i),this}remove(t){const e=this.$el,i=this.buttons,s=this.get(t);let r=-1;return s?(r=i.indexOf(s),r>-1&&(i.splice(r,1),this.attr("buttons").splice(r,1)),this._disable(t),e.removeChild(s.$el),this):this}_disable(t){const e=this.get(t),i=this.commands.get(t);return!e||e.disabled||(e.disabled=!0,i&&this.commands.del(i),g(e.$el,Et)),this}_enable(t){const e=this.get(t),i=this.commands.get(t);return e&&e.disabled?(e.disabled=!1,i&&this.commands.add(i),et(e.$el,Et),this):this}disable(t){const e=this.attr("afterDisabled");return t?this._disable(t):(g(this.$el,Et),this.removeListeners(),this.disabled=!0,l(e)&&e.call(this)),this}enable(t){const e=this.attr("afterEnabled");return t?this._enable(t):(this.disabled=!1,et(this.$el,Et),this.addListeners(),l(e)&&e.call(this)),this}show(t){const e=this.attr("afterOpened"),i=this.get(t),s=this.$el;if(t){if(!i)return this;et(i.$el,St)}else et(s,St),this.closed=!1,l(e)&&a((()=>{e.call(this)}),310);return this}hide(t){const e=this.attr("afterClosed"),i=this.get(t),s=this.$el;if(t){if(!i)return this;g(i.$el,St)}else g(s,St),this.closed=!0,l(e)&&a((()=>{e.call(this)}),310);return this}toggle(t){return this.isClosed()?this.show(t):this.hide(t),this}highlight(t){const e=this.get(t);let i;return e?(i=e.$el,p(i,Ct)?et(i,Ct):g(i,Ct),this):this}destroy(){const t=this.attr("beforeDestroy"),e=this.attr("afterDestroy");return l(t)&&t.call(this),this.commands.clear(),this.removeListeners()._remove()._default(),l(e)&&e.call(this),this}execute(t){return this.isDisabled(t)||this.commands.execute(t),this}onExecute(t){const e=t.delegateTarget;let i="";return e&&(i=e.getAttribute("data-cmd"),i&&this.execute(i)),this}_updateToolbar({top:t,min:e,max:i}){const s=Math.ceil(t);return s<=e?(this.hide("up"),this.show("down")):s>=i?(this.hide("down"),this.show("up")):s>e&&s{t[`on${i}`]=t=>{C(i,{event:t,speech:e})}})),speechSynthesis.onvoiceschanged=t=>{C("voiceschanged",{event:t,speech:e})},this}}zt.isSupport="speechSynthesis"in window;const kt=(t,e)=>{let i,s=t;for(;s;)i=s.tagName.toLowerCase(),"script"!==i&&"style"!==i&&g(s,"outline-reader_sibling"),s=e?s.previousElementSibling:s.nextElementSibling},Mt=()=>{const t=navigator.userAgent;return/Mobile|mini|Fennec|Android|iP(ad|od|hone)|NokiaN[^/]*/.test(t)},At="进入阅读模式,按 ESC 键可退出阅读模式";class Ot extends M{constructor(t){super(),this._default(),t&&this.initialize(t)}_default(){return this.attrs=u(Ot.DEFAULTS),this.reading=!1,this.$target=null,this.$el=null,this.$paper=null,this.$title=null,this.$article=null,this.$progress=null,this.toolbar=null,this.speech=null,this}initialize(t){let e;return this.attr(t),e=this.attr("target"),d(e)?this.$target=document.querySelector(e):m(e)&&(this.$target=e),this.$target?(zt.isSupport&&(this.speech=new zt),this.render().addListeners(),this):this}isSpeaking(){var t;return null==this||null===(t=this.speech)||void 0===t?void 0:t.isSpeaking()}render(){return this._renderEdge()._paint(this.$target),this}erase(){return this.$article.innerHTML="",this}_paint(t){const e=document.createDocumentFragment(),s=i(n,t.cloneNode(!0).children);return a((()=>{s.forEach((t=>{e.appendChild(t)})),this.$article.appendChild(e)})),this}_remove(){const t=this.$el,e=this.toolbar;return t&&document.body.removeChild(t),e&&e.destroy(),this}refresh(){return this.erase()._paint(this.$target),this}_animateTimeline(){return window.ScrollTimeline&&Mt()?(this.$progress.animate({scale:["0 1","1 1"]},{timeline:new ScrollTimeline({source:this.$article,axis:"block"})}),this):this}_renderEdge(){const t=this.$target,e=Mt()?26:20;let i,s,r,n,o,l,h=this.attr("title");o=X("div",{className:"outline-reader__progress"}),this.$progress=o,r=t.querySelector("h1"),m(h)&&(r=h),m(r)&&(h=r.innerText),r=X("h1",{className:"outline-reader__title"},h),this.$title=r,n=X("article",{id:"outline-reader__article",className:"outline-reader__article"},Mt()?[]:[o.cloneNode()]),this.$article=n,s=X("div",{id:"outline-reader__paper",className:"outline-reader__paper"},[r,n]),this.$paper=s;const c=[];return c.push({name:"print",icon:"print",size:e,action:{context:this,handler:this.print}}),zt.isSupport&&this.attr("allowSpeak")&&c.push({name:"speak",icon:"sound",size:e,action:{context:this,handler:this.speak}}),c.push({name:"exit",icon:"close",size:e,action:{context:this,handler:this.exit}}),this.toolbar=new Lt({placement:"rtl",buttons:c}),i=X("section",{id:"outline-reader",className:"outline-reader outline-reader_hidden"},[o,s,this.toolbar.$el]),this.$el=i,document.body.appendChild(i),this._animateTimeline(),a((()=>{l=i.previousElementSibling,kt(l,!0),l=i.nextElementSibling,kt(l)})),this}enter(){const t="outline-reader",e=`${t}--reading`,i=`${t}_hidden`,s=this.$el,r=document.querySelectorAll(".outline-reader_sibling"),n=this.attr("enterReadingTip")||At;return this.reading||!s||(r.forEach((t=>{g(t,i)})),g(s,e),et(s,i),this.toolbar.show(),this.reading=!0,_t.info({round:!0,message:n}),this.$emit("reader:enter")),this}exit(){const t="speak",e="outline-reader",i=`${e}--reading`,s=`${e}_hidden`,r=this.$el,n=document.querySelectorAll(".outline-reader_sibling"),o=this.speech,l=this.toolbar;return this.reading&&r?(g(r,s),et(r,i),n.forEach((t=>{et(t,s)})),l.hide(),this.reading=!1,o&&(l.isHighlight(t)&&l.highlight(t),o.cancel()),this.$emit("reader:exit"),this):this}toggle(){return this.reading?this.exit():this.enter(),this}speak(){const t=this.$article.innerText,e=this.speech;return zt.isSupport&&e?(this.toolbar.highlight("speak"),this.isSpeaking()?e.cancel():e.speak(t),this):this}print(){return l(print)?(print(),this):this}destroy(){return this.$el?(this.removeListeners()._remove()._default(),this):this}onPrint(){return this.print(),this}onEnterReading(){return this.toggle(),this}onExitReading(t){return 27===t.keyCode&&this.reading&&(this.toggle(),V(t)),this}onRefresh(){return this.refresh(),this}addListeners(){return this.$el?(ut(document,"keyup",this.onExitReading,this,!0),this.$on("toolbar:action:print",this.onPrint),this.$on("toolbar:action:reading",this.onEnterReading),this.$on("reader:print",this.onPrint),this.$on("reader:refresh",this.onRefresh),this.$on("reader:enter",this.enter),this.$on("reader:exit",this.exit),this.$on("reader:toggle",this.toggle),this):this}removeListeners(){return this.$el?(B(document,"keyup",this.onExitReading),this.$off("toolbar:action:print"),this.$off("toolbar:action:reading"),this.$off("reader:refresh"),this.$off("reader:toggle"),this):this}}var Nt;Ot.DEFAULTS=u({target:"",title:"",enterReadingTip:At,allowSpeak:!1});class Ht extends M{constructor(t){super(),this.version="3.39.0",this._default(),t&&this.initialize(t)}_default(){const t=Ht.DEFAULTS;return this.attrs=u(t),this.$article=null,this.$scrollElement=null,this.buttons=[],this.anchors=null,this.drawer=null,this.navigator=null,this.reader=null,this.toolbar=null,this}initialize(t){let e="",i="",s=null;return this.attr(t),e=this.attr("articleElement"),i=this.attr("scrollElement"),d(e)?s=document.querySelector(e):m(e)&&(s=e),this.$article=s,this.$scrollElement=b(i),this.$emit("created",r({},this.attr())),this.render().addListeners(),this}isExpanded(){const t=this.attr("position"),e=this.drawer,i=this.navigator;return!(this.count()<0)&&("relative"===t?!e.isClosed():!i.isClosed())}getChapters(t=!1){const e=this.$article,i=this.attr("selector"),s=this.attr("showCode"),r=this.attr("chapterTextFilter");return _({articleElement:e,selector:i,showCode:s,chapterTextFilter:r,isTreeStructured:t})}count(){return this.getChapters().length}render(){const t=this.attr("hasToolbar"),e=this.$scrollElement;return this._renderReader()._renderAnchors()._renderNavigator()._renderToolbar(),e&&t&&this.$emit("toolbar:update",{top:e.scrollTop,min:0,max:e.scrollHeight}),this.$emit("mounted"),this}_renderReader(){const t=this.attr("reader");return t.target?(g(this.$article,"outline-article"),this.reader=new Ot(t),this):this}_renderAnchors(){const t=this.attr("articleElement"),e=this.attr("selector"),i=this.attr("stickyHeight"),s=this.attr("scrollElement"),r=this.attr("showCode"),n=this.attr("anchorURL"),o=this.attr("afterScroll"),l=this.attr("chapterTextFilter"),a=this.attr("anchorLinkFilter");return this.anchors=new st({articleElement:t,stickyHeight:i,scrollElement:s,selector:e,showCode:r,anchorURL:n,afterScroll:o,chapterTextFilter:l,anchorLinkFilter:a}),this}_renderNavigator(){const t=this.attr("title"),e=this.attr("stickyHeight"),i=this.attr("scrollElement"),s=this.attr("customClass"),r=this.attr("showCode"),n=this.attr("animationCurrent"),o=this.attr("closeOnClickModal"),l=this.attr("showNavModalFirst"),a=this.attr("position"),h=this.attr("placement"),c=this.attr("afterSticky"),u=this.attr("afterToggle"),d=this.attr("afterScroll"),m=this.count();let p,g=this.attr("parentElement");return m<1||(p={scrollElement:i,showCode:r,animationCurrent:n,position:a,title:t,stickyHeight:e,chapters:this.getChapters(),afterSticky:c,afterToggle:u,afterScroll:d},"relative"===a?(this.drawer=new ct({placement:h,title:t,size:"tiny",hasOffset:!0,hasPadding:!1,closeOnClickModal:o,customClass:s,afterClosed:()=>{this.toolbar.toggle()}}),g=this.drawer.$main,l&&this.drawer.open()):p.customClass=s,p.parentElement=g,this.navigator=new ft(p)),this}_renderToolbar(){const t=this.attr("position"),e=this.attr("hasToolbar"),s=this.attr("showNavModalFirst"),r=this.attr("placement"),o=this.attr("homepage"),a=this.attr("git"),h=this.attr("tags"),c=this.attr("issues"),u=this.attr("tools"),d=this.attr("reader"),m=this.count(),p={name:"up",icon:"up",size:20,action:{context:this,handler:this.toTop}},g={name:"homepage",icon:"homepage",size:20,link:o},f={name:"github",icon:"github",size:20,link:a},b={name:"tags",icon:"tags",size:20,link:h},y={name:"issues",icon:"issues",size:20,link:c},v={name:"toggle",icon:"menu",size:18,action:{context:this,handler:this.toggle}},$={name:"reading",icon:"file",size:18,action:{context:this,handler:"toolbar:action:reading"}},_={name:"print",icon:"print",size:20,action:{handler:"toolbar:action:print"}},x={name:"down",icon:"down",size:20,action:{context:this,handler:this.toBottom}},w=[];return e?(w.push(p),m>0&&w.push(v),o&&w.push(g),a&&w.push(f),h&&w.push(b),c&&w.push(y),d.target&&(w.push($),l(print)&&w.push(_)),(null==u?void 0:u.length)>0&&w.push.apply(w,i(n,u)),w.push(x),this.buttons=[].concat(w),this.toolbar=new Lt({placement:r,buttons:w}),"relative"===t&&s&&this.toolbar.hide(),this):this}refresh(){const t=this.getChapters();return this.$emit("anchors:refresh",t),this.$emit("navigator:refresh",t),this.$emit("reader:refresh"),this.$emit("refresh",t),this}addButton(t){const e=this.buttons;return e.splice(-1,0,t),this.$emit("toolbar:add:button",e),this}removeButton(t){return this.$emit("toolbar:remove:button",t),this}toTop(){const t=this.attr("afterScroll"),e=this.toolbar,i=this.navigator,s=this.count();return s>0&&(i.playing=!0),this.scrollTo(0,(()=>{e.hide("up"),e.show("down"),s>0&&(i.highlight(0),i.playing=!1,y(i.$main,0)),l(t)&&t.call(e,"up")})),this}toBottom(){const t=this.attr("afterScroll"),e=this.$scrollElement,i=this.toolbar,s=this.navigator,r=this.count(),n=Math.floor(e.scrollHeight-e.clientHeight);return r>0&&(s.playing=!0),this.scrollTo(n,(()=>{const e=s.$main;i.hide("down"),i.show("up"),r>0&&(s.highlight(r-1),y(e,e.scrollHeight),s.playing=!1),l(t)&&t.call(i,"bottom")})),this}scrollTo(t,e){return y(this.$scrollElement,t,e),this}enterReading(){return this.$emit("toolbar:toggle"),this.$emit("reader:enter"),this}exitReading(){return this.$emit("toolbar:toggle"),this.$emit("reader:exit"),this}switchReading(){return this.$emit("toolbar:toggle"),this.$emit("reader:toggle"),this}expand(){const t=this.attr("position"),e=this.toolbar,i=this.drawer,s=this.navigator;return this.count()<1||("relative"!==t?(s.show(),e.highlight("toggle")):(e.hide(),a((()=>{i.open()})))),this}collapses(){const t=this.attr("position"),e=this.toolbar,i=this.drawer,s=this.navigator;return this.count()<1||("relative"!==t?(s.hide(),e.highlight("toggle")):(e.show(),a((()=>{i.close()})))),this}toggle(){return this.isExpanded()?this.collapses():this.expand(),this}print(){return this.$emit("reader:print"),this}_destroy(){const t=this.count();let e=this.anchors,i=this.navigator,s=this.drawer,r=this.reader,n=this.toolbar,o=!1;return this.removeListeners(),r&&r.destroy(),t>0&&i&&(o=i.isOutside(),i.destroy(),o&&s&&s.destroy()),e&&e.destroy(),n&&n.destroy(),this}destroy(){return this.$emit("beforeDestroy"),this._destroy()._default(),this.$emit("destroyed"),this}addListeners(){return this.attr("hasToolbar")?(this.$on("toolbar:update",this.onToolbarUpdate),this):this}removeListeners(){return this.attr("hasToolbar")?(this.$off("toolbar:update"),this):this}}if(Ht.DEFAULTS=u({articleElement:"#article",selector:"h2,h3,h4,h5,h6",parentElement:"#aside",scrollElement:"html,body",title:"目录",position:"relative",placement:"rtl",animationCurrent:!0,showCode:!1,hasToolbar:!0,closeOnClickModal:!0,showNavModalFirst:!1,anchorURL:"",stickyHeight:0,homepage:"",git:"",tags:"",issues:"",tools:[],reader:{target:"",title:"",enterReadingTip:"进入阅读模式,按 ESC 键可退出阅读模式",allowSpeak:!1},customClass:"",afterSticky:null,afterToggle:null,afterScroll:null,chapterTextFilter:null,anchorLinkFilter:null}),null!==(Nt=window)&&void 0!==Nt&&Nt.jQuery){const t=window.jQuery;t.extend(t.fn,{outline:function(e){let i=t(this);return new Ht(t.extend({},e,{articleElement:i}))}})}const Dt=(t,e=300)=>{let i;return function(...s){i&&clearTimeout(i),i=setTimeout((()=>{t.apply(this,s)}),e)}},jt=()=>Math.max(document.documentElement.clientWidth,window.innerWidth),Ft=Ht.DEFAULTS;Ft.articleElement=document.querySelector("#article"),Ft.parentElement=document.querySelector("#aside"),Ft.scrollElement=document.querySelector("#main"),Ft.selector="h2,h3",Ft.title=!1,Ft.showCode=!1,Ft.position="sticky",Ft.git="https://github.com/yaohaixiao/outline.js",Ft.tags="https://github.com/yaohaixiao/outline.js/tags",Ft.issues="https://github.com/yaohaixiao/outline.js/issues",Ft.reader={target:"#article",title:document.querySelector(".main__h1"),allowSpeak:!0},Ft.chapterTextFilter=!0,Ft.anchorLinkFilter=(t,e,i)=>`${t}-${e}-${i}`,Ft.customClass="aside-navigator",Ft.afterScroll=t=>{jt()<=500&&"chapter"===t&&qt.toggle()};const qt=new Ht(Ft);return((t,e,i=300)=>{let s,r;!(!m(t)||!l(e))&&(r=Dt(e,i),s=new ResizeObserver((t=>{for(const e of t)r(e)})),s.observe(t))})(document.querySelector("#docs"),(()=>{jt()<=500&&qt.isExpanded()&&qt.toggle()})),qt})); +!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(t="undefined"!=typeof globalThis?globalThis:t||self).outline=e()}(this,(function(){"use strict";function t(t,e){(null==e||e>t.length)&&(e=t.length);for(var i=0,r=Array(e);iObject.prototype.toString.apply(t),l=t=>"function"==typeof t||"[object Function]"===n(t),a=(t,e=300)=>!!l(t)&&setTimeout((()=>{t()}),e),h=t=>("[object Object]"===n(t)||"object"==typeof t||l(t))&&null!==t,d=t=>Array.isArray?Array.isArray(t):"[object Array]"===n(t),c=t=>{let e={};return null===t?null:(d(t)?e=Array.from(t):(e=Object.assign({},t),Object.keys(e).forEach((i=>e[i]=h(t[i])?c(t[i]):t[i]))),e)},u=t=>"string"==typeof t,p=t=>!!(h(t)&&t.nodeName&&t.tagName&&1===t.nodeType),m=(t,e)=>{const i=new RegExp("(\\s|^)"+e+"(\\s|$)");let r,o;return!!p(t)&&(r=t.className,!!r&&(o=t.classList,o&&o.contains?t.classList.contains(e):!!i.exec(r)))},g=(t,e)=>{var i;let r,o;if(m(t,e))return!1;r=t.classList,null!==(i=r)&&void 0!==i&&i.add?e.indexOf(" ")>-1?e.split(" ").forEach((t=>{r.add(t)})):r.add(e):(o=t.className,o+=o.length>0?" "+e:e,t.className=o)},_=t=>t*t,f=(t,e,i)=>{const r=((t=null)=>{let e,i;return t?u(t)?i=document.querySelector(t):p(t)&&(i=t):(e=document.querySelectorAll("html,body"),i=e[0].scrollTop-e[1].scrollTop>=0?e[0]:e[1]),i})(t);let o=r.scrollTop,s=0;const n=e-o,a=r.scrollHeight,h=e-a<=0?e:a,d=t=>(l(i)&&i(t),!1),c=()=>{if(s+=1,n<0){if(o-=_(s),r.scrollTop=o,o<=e)return r.scrollTop=e,d(e)}else if(o+=_(s),r.scrollTop=o,o>=h)return r.scrollTop=h,d(h);requestAnimationFrame(c)};requestAnimationFrame(c)},b=(t=null)=>{let e,i;return t?u(t)?i=document.querySelector(t):p(t)&&(i=t):(e=document.querySelectorAll("html,body"),i=e[0].scrollTop-e[1].scrollTop>=0?e[0]:e[1]),i},w=t=>!!u(t)&&t.replace(/(^\s+)|(\s+$)/g,""),v=(t,e=!1,i=null)=>{const r=/^\d(\.|(\.\d+)*)\s?/gi,o=[];let s=1,n=0,a="";return t.forEach(((t,h)=>{const d=t.tagName,c=d.replace(/h/i,"");let p=parseInt(c,10),m=-1;var g;p>s?(n+=1,m=1===n?-1:h-1):p===s||pn?1===p?(n=1,m=-1):m=o[h-1].pid:p<=n&&(1===p?n=1:(n-=s-p,n<=1&&(n=1)),m=1===n?-1:((t,e,i)=>{let r,o,s=t[i-1];for(o=0;o]+(>|$)/g,""):"")),e&&(a=w(a.replace(r,""))),l(i)&&(a=i(a)),o.push({id:h,pid:m,level:n,rel:`heading-${h}`,text:a,tagName:d})})),e?(t=>{const e={};return t.forEach((t=>{const i=JSON.stringify((t=>[t.pid])(t));e[i]=e[i]||[],e[i].push(t),t.index=e[i].length,-1===t.pid&&(t.code=String(t.index))})),Object.keys(e).forEach((t=>{e[t].forEach((t=>{const i=e[`[${t.id}]`];if(!i||!d(i))return!1;i.forEach((e=>{e.code=t.code+"."+e.index}))}))})),t})(o):o},x=t=>{const{articleElement:e,selector:r,showCode:o,chapterTextFilter:n,isTreeStructured:a}=t;let h=document.querySelector("#article"),d=[],c=[],m=null;return u(e)?h=document.querySelector(e):p(e)&&(h=e),h?(l(n)?m=n:!0===n&&(m=t=>t.replace(/\(.*?\)/,"()")),d=i(s,h.querySelectorAll(r||"h1,h2,h3,h4,h5,h6")),c=v(d,o,m),!0===a?((t,e,i)=>{const r={},o=[];return t.forEach(((t,i)=>{r[t[e]]=i,t.children=[]})),t.forEach((e=>{const s=t[r[e[i]]];-1!==e[i]?s.children.push(e):o.push(e)})),o})(c,"id","pid"):c):c},y=(t,e)=>{const i=Object.prototype.hasOwnProperty;return t&&i.call(t,e)},$=(t,e)=>{Object.keys(e).forEach((i=>{y(e,i)&&(t[i]=e[i])}))},T={},k=t=>y(T,t)&&T[t].length>0,z=(t,e=!0)=>e?k(t):(t=>{let e=k(t),i=t.lastIndexOf(".");for(;!e&&-1!==i;)i=(t=t.substring(0,i)).lastIndexOf("."),e=k(t);return e})(t),S=(t,e,i=!0)=>{const r=t=>{if(!k(t))return!1;T[t].forEach((t=>{const i=["[object Int8Array]","[object Uint8Array]","[object Uint8ClampedArray]","[object Int16Array]","[object Uint16Array]","[object Int32Array]","[object Uint32Array]","[object Float32Array]","[object Float64Array]","[object BigInt64Array]","[object BigUint64Array]"].indexOf(n(e))>-1?e.toString():e;t.callback.call(t.context||t,i)}))},o=()=>{let e=t,i=t.lastIndexOf(".");for(;-1!==i;)e=e.substring(0,i),i=e.lastIndexOf("."),r(e);r(t),r("*")};if(!z(t))return!1;i?setTimeout(o,10):o()},E=(()=>{let t=0;return e=>(t+=1,e?e+"-"+t:"guid-"+t)})(),C=t=>{if(!y(T,t))return!1;delete T[t]},L=(t,e)=>{if(!z(t))return!1;e?(t=>{const e=Object.keys(T);if(!t||e.length<1)return!1;e.forEach((e=>{const i=T[e];let r;i.forEach(((e,o)=>{e.callback!==t&&e.token!==t||(r=e.topic,i.splice(-1,o))})),i.length<1&&C(r)}))})(e):C(t)};class M{constructor(t){this.attrs={},this.name="component",t&&this.initialize(t)}initialize(t){return this.attr(t).render().addListeners(),this}attr(t,e){const i=this.attrs;return u(t)?e&&y(i,t)?(i[t]=e,this):i[t]:h(t)?($(i,t),this):0===arguments.length?i:this}render(){return this}refresh(){return this}destroy(){return this.removeListeners(),this}reload(t){let e=this.attr();return t&&(e=this.attr(t)),this.destroy().initialize(e),this}$emit(t,e){return S(t,e),this}$on(t,e){return((t,e,i=null)=>{const r=E();let o="symbol"==typeof t?t.toString():t;l(e)&&(T[o]||(T[o]=[]),T[o].push({topic:o,callback:e,context:i,token:r}))})(t,e,this),this}$off(t,e){return L(t,e),this}addListeners(){return this}removeListeners(){return this}}const A=[];let N,O;function H(t){for(;t.timeRemaining()>0&&A.length;){const t=A.shift();if(!l(t))return!1;t()}A.length?N=requestIdleCallback(H):(N=0,l(O)&&(O(),O=null))}void 0===window.requestIdleCallback&&(window.requestIdleCallback=function(t){const e=Date.now();return a((function(){t({didTimeout:!1,timeRemaining:function(){return Math.max(0,50-(Date.now()-e))}})}),10)},window.cancelIdleCallback=function(t){clearTimeout(t)});const j=(t,e=null)=>{A.push(t),l(e)&&(O=e),N||requestIdleCallback(H)},D=t=>{let e=t.offsetTop;return null!==t.offsetParent&&(e+=D(t.offsetParent)),e},F=(t,e="")=>{const i=e.replace(/^>/i,"");return!!(e&&i&&t)&&(t.matches?t.matches(i):!!t.msMatchesSelector&&t.msMatchesSelector(i))},q=t=>t.host&&t!==document&&t.host.nodeType?t.host:t.parentNode,I=["focusout","blur","focusin","focus","load","unload","mouseenter","mouseleave"],R=(t,e,i)=>{const r=I.indexOf(e)>-1;i._delegateListener&&delete(i=i._delegateListener)._delegateListener,function(t,e,i){const r=t._listeners;let o=-1;if(r.length<1)return!1;r.forEach(((t,r)=>{const s=t.fn;e===t.type&&(o=r,s===i&&(o=r))})),o>-1&&r.splice(o,1)}(t,e,i),t.removeEventListener(e,i,r)},U=function(t,e,i=!1){const r=u(t)?document.querySelector(t):t,o=r.childNodes,s=((t,e)=>{let i=t._listeners||[];return u(e)&&e&&(i=i.filter((t=>t.type===e))),i})(r,e);s.forEach((t=>{R(r,t.type,t.fn)})),(i||!0===e||1===arguments.length)&&r&&o&&o.forEach((t=>{p(t)&&U(t,e,i)}))},P=(t,e,i)=>{if(!l(i))return U(t,e),!1;R(t,e,i)},B=(t,e,i,r,o,s,n=!1)=>{const l=I.indexOf(i)>-1,a=function(l){const h=function(t){const e=t.target;return(i=e)&&3===i.nodeType?i.parentNode:i;var i}(l),d=((t,e,i,r)=>{const o=i||document;if(!t)return null;do{if(null!=e&&(e.startsWith(">")?t.parentNode===o&&F(t,e):F(t,e))||r&&t===o)return t;if(t===o)break}while(t=q(t))})(h,e,t);let c=s||t;l.delegateTarget=d,!0===s&&(c=o),d&&(!0===n&&P(t,i,a),r.call(c,l,o))};if(!t)return!1;t._listeners||(t._listeners=[]),t._listeners.push({el:t,selector:e,type:i,fn:a,data:o,context:s,capture:l}),r._delegateListener=a,t.addEventListener(i,a,l)},V=function(t){t.stopPropagation(),t.preventDefault()},W=i(s,['','','','','','','','','','','','','','','','','','','','']),Y=(t,e="icon")=>u(t)?((t,e="icon")=>{const i=/id="(.*?)"/,r=/^(\w+)-/;return W.find((o=>{const s=i.exec(o)[1];return r.exec(s)[1]===e&&s===("icon"===e?`${e}-${t}`:`${e}-icon-${t}`)}))})(t,e):i(s,W),X=(t="")=>{const e=document.body;let i=document.querySelector("#outline-icons"),r=[];(t=>{if(!t)return!1;d(t)&&t.length>0?t.forEach((t=>{-1===W.indexOf(t)&&u(t)&&W.push(t)})):u(t)&&W.push(t)})(t),r=Y(),i?i.innerHTML=r.join(""):(i=document.createElement("div"),i.innerHTML=``,e.insertBefore(i.firstChild,e.firstChild))},Q=t=>{return!(!h(t)||!(p(t)||(t=>!(!h(t)||"[object NodeList]"!==n(t)))(t)||(e=t,h(e)&&"[object DocumentFragment]"===n(e))||(t=>!(!h(t)||!("[object Text]"===n(t)||t.tagName&&3===t.nodeType)))(t)));var e},G=(t,e,i)=>{let r=t.tagName.toLowerCase();switch(e){case"style":t.style.cssText=i;break;case"value":"input"===r||"textarea"===r?t.value=i:t.setAttribute(e,i);break;case"htmlFor":t.setAttribute("for",i);break;case"className":g(t,i);break;case"innerHTML":t.innerHTML=i;break;case"innerText":t.innerText=i;break;default:t.setAttribute(e,i)}},J=(t,e)=>{if(!t||!h(e))return!1;Object.keys(e).forEach((i=>{const r=e[i];y(e,i)&&G(t,i,r)}))},K=(t,e,i)=>{const r=document.createDocumentFragment(),o=document.createElement(t),s=t=>Q(t)||u(t),n=t=>{let e;if(!s(t))return!1;Q(t)?e=t:u(t)&&(e=document.createTextNode(t)),r.appendChild(e)};return h(e)?J(o,e):d(e)&&e.every((t=>s(t)))?e.forEach((t=>{n(t)})):Q(e)?n(e):u(e)&&n(document.createTextNode(e)),d(i)?i.forEach((t=>{n(t)})):n(i),o.appendChild(r),o},Z=(t,e={})=>{const i="outline-icon",r=e.size||0,o=e.color||"",s=e.iconSet||"",n=d(r)?r[0]:r,l=d(r)?r[1]:r,a=r?`width:${n}px;height:${l}px;`:"",h=o?a+`color:${o}`:a,c=e.attrs||{},p=document.createElement("i");let m,g="",_="";return u(t)?((t=>{const e=new RegExp("^\\s*(?:<\\?xml[^>]*>\\s*)?(?:<\\!doctype svg[^>]*\\s*(?:\\[?(?:\\s*]*>\\s*)*\\]?)*[^>]*>\\s*)?]*>[^]*<\\/svg>\\s*$\\s*$","i");return u(t)&&e.test(t)})(t)?_=t:(g=s&&"icon"!==s?`xlink:href="#${s}-icon-${t}"`:`xlink:href="#icon-${t}"`,_=``),p.innerHTML=_,c.className?c.className=`${i} ${c.className}`:c.className=i,J(p,c),m=p.querySelector("svg"),J(m,{"aria-hidden":!0,xmlns:"http://www.w3.org/2000/svg",class:"outline-icon__svg",width:200,height:200,style:h}),p):null},tt=(t,e={})=>Z(t,e),et=(t,e)=>{var i;let r,o=t.className;if(!o||!m(t,e))return!1;r=t.classList,null!==(i=r)&&void 0!==i&&i.remove?r.remove(e):(o=w(o.replace(e,"")),t.className=o)},it=(t,e=!0,i=!0)=>{const r="outline-heading",o=t.innerHTML;let s;if(t.innerHTML=o.replace(/^\d+(\.?\d+)*\s?/gi,""),t.removeAttribute("id"),t.removeAttribute("data-id"),et(t,r),!e)return!1;var n;s=t.querySelector(`.${r}__anchor`),i&&et(t,`${r}_start`),n=w(t.className),u(n)&&""===n&&t.removeAttribute("class"),s&&t.removeChild(s)};function rt(t,e){void 0===e&&(e={});var i=e.insertAt;if(t&&"undefined"!=typeof document){var r=document.head||document.getElementsByTagName("head")[0],o=document.createElement("style");o.type="text/css","top"===i&&r.firstChild?r.insertBefore(o,r.firstChild):r.appendChild(o),o.styleSheet?o.styleSheet.cssText=t:o.appendChild(document.createTextNode(t))}}rt(".outline-heading{overflow:hidden;position:relative;z-index:1}.outline-heading__anchor{display:none}.outline-heading__anchor:hover,.outline-heading__anchor:link,.outline-heading__anchor:visited{color:#999;text-decoration:none}.outline-heading__anchor:hover{color:#507afe}.outline-heading:hover .outline-heading__anchor{display:inline-block}.outline-heading_start:hover{overflow:visible}.outline-heading_start .outline-heading__anchor{left:-1em;position:absolute;top:50%;transform:translateY(-50%);z-index:2}");class ot extends M{constructor(t){super(),this._default(),t&&this.initialize(t)}_default(){return this.attrs=c(ot.DEFAULTS),this.$articleElement=null,this.$scrollElement=null,this.$headings=[],this}initialize(t){let e,i,r,o;return this.attr(t),o=this.attr("articleElement"),i=this.attr("scrollElement"),e=this.attr("created"),u(o)?r=document.querySelector(o):p(o)&&(r=o),r?(this.$articleElement=r,this.$scrollElement=b(i),this.$headings=this.getHeadings(),this.$headings.length<1||(l(e)&&e.call(this),this.render().addListeners()),this):this}getHeadings(){const t=this.$articleElement,e=this.attr("selector");return i(s,t.querySelectorAll(e))}count(){return this.getHeadings().length}render(){const t=this.attr("articleElement"),e=this.attr("selector"),i=this.attr("showCode"),r=this.attr("chapterTextFilter"),o=this.attr("mounted"),s=x({articleElement:t,selector:e,showCode:i,chapterTextFilter:r});return X(),this._paint(s),l(o)&&o.call(this),this}erase(){return this._remove(),this}_paint(t){const e=400,r=this.attr("hasAnchor"),o=this.attr("isAtStart"),n=this.attr("showCode"),a=this.attr("anchorURL"),h=this.attr("anchorLinkFilter"),d=this.count(),c=i(s,this.$headings),u=(i,s)=>{i.forEach(((i,d)=>{const c=d+s*e,u=t[c].code;((t,e,i)=>{const r="outline-heading",o=i.hasAnchor||!0,s=i.isAtStart||!0,n=i.showCode||!1,a=i.chapterCode||"",h=i.anchorURL||"",d=i.anchorLinkFilter||null,c=`heading-${e}`,u={id:c,className:s?`${r} ${r}_start`:r,"data-id":e},p=w(t.innerHTML);let m,g,_;if(n&&(u.innerHTML=a+" "+p,u["data-code"]=a),J(t,u),!o)return!1;m=h||(l(d)?d(t.tagName.toLowerCase(),p,e):`#${c}`),_=tt("hash",{iconSet:"outline"}),g=K("a",{id:`anchor-${e}`,className:`${r}__anchor anchor-${e}`,href:m,target:h?"_blank":"self","data-id":e},_),t.appendChild(g)})(i,c,{hasAnchor:r,isAtStart:o,showCode:n,chapterCode:u,anchorURL:a,anchorLinkFilter:h})}))};let p=-1;if(d>e)for(p+=1,u(c.splice(0,e),0);c.length>0;){const t=c.splice(0,e);j((()=>{u(t,p+=1)}),(()=>{this.$emit("anchors:all:paint")}))}else u(c,0);return this}_remove(){const t=this.attr("hasAnchor"),e=this.attr("isAtStart");return this.$headings.forEach((i=>{it(i,t,e)})),this}refresh(t){const e=this.attr("articleElement"),i=this.attr("selector"),r=this.attr("showCode"),o=this.attr("chapterTextFilter");return this.$headings=this.getHeadings(),this.erase()._paint(t||x({articleElement:e,selector:i,showCode:r,chapterTextFilter:o})),this}scrollTo(t,e){const i=this.$scrollElement;return f(i,t,e),this}destroy(){const t=this.attr("beforeDestroy"),e=this.attr("afterDestroy");return l(t)&&t.call(this),this.removeListeners()._remove()._default(),l(e)&&e.call(this),this}onAnchorTrigger(t){const e=this.attr("anchorURL"),i=this.attr("afterScroll"),r=this.attr("stickyHeight"),o=t.delegateTarget.parentNode,s=D(o)-(r+10),n=this.$scrollElement,h=n.scrollHeight-n.clientHeight;return this.scrollTo(s,(()=>{l(i)&&i.call(this,"anchor"),a((()=>{this.$emit("toolbar:update",{top:s,min:0,max:h})}))})),e||V(t),this}onRefresh(t){return this.refresh(t),this}addListeners(){const t=this.$articleElement;return this.count()<1||(B(t,".outline-heading__anchor","click",this.onAnchorTrigger,this,!0),this.$on("anchors:refresh",this.onRefresh)),this}removeListeners(){const t=this.$articleElement;return this.count()<1||(P(t,"click",this.onAnchorTrigger),this.$off("anchors:refresh",this.onRefresh)),this}}ot.DEFAULTS=c({scrollElement:"html,body",articleElement:"#article",selector:"h1,h2,h3,h4,h5,h6",stickyHeight:0,anchorURL:"",hasAnchor:!0,isAtStart:!0,showCode:!1,created:null,mounted:null,afterScroll:null,beforeDestroy:null,afterDestroy:null,chapterTextFilter:null,anchorLinkFilter:null});const st=["a","abbr","address","area","article","aside","audio","b","base","bdi","bdo","blockquote","body","br","button","canvas","caption","cite","code","col","colgroup","data","datalist","dd","del","details","dfn","dialog","div","dl","dt","em","embed","fieldset","figcaption","figure","footer","form","h1","h2","h3","h4","h5","h6","head","header","hgroup","hr","html","i","iframe","img","input","ins","kbd","label","legend","li","link","main","map","mark","math","menu","menuitem","meta","meter","nav","noscript","object","ol","optgroup","option","output","p","param","picture","pre","progress","q","rb","rp","rt","rtc","ruby","s","samp","script","search","section","select","slot","small","source","span","strong","style","sub","summary","sup","svg","table","tbody","td","template","textarea","tfoot","th","thead","time","title","tr","track","u","ul","var","video","wbr"],nt=t=>{let e,i,r;return!!u(t)&&(e=w(t).slice(0,1e3),i=/\s*|]*>|]*>|]+>/i,r=new RegExp(st.map((t=>`<${t}\\b[^>]*>`)).join("|"),"i"),i.test(e)||r.test(e))},lt=t=>t.replace(/]*>.*?<\/script>/gi,""),at=(t,e)=>{document.documentElement.style.setProperty(t,e)};let ht=2e3;const dt=t=>(t?ht=t:ht+=1,at("--outline-zIndex",`${ht}`),ht);rt(':root{--outline-zIndex:2000;--outline-sticky-height:100%;--outline-navigator-width:100%}.outline-drawer{box-sizing:border-box;height:100%;left:0;margin:0;overflow:hidden;position:relative;top:0;visibility:hidden;width:100%;z-index:-1}.outline-drawer__modal{background-color:#fff;box-shadow:0 0 6px 1px #dcdfe6;display:flex;flex-direction:column;flex-wrap:nowrap;height:100%;overflow:hidden;position:absolute;transition-duration:.4s;z-index:21}.outline-drawer__footer,.outline-drawer__header,.outline-drawer__main{box-sizing:border-box;width:100%}.outline-drawer__footer,.outline-drawer__header{flex-shrink:0}.outline-drawer__footer,.outline-drawer__main,.outline-drawer__title{padding:0 16px}.outline-drawer__header,.outline-drawer__title{height:52px;line-height:52px;margin:0 auto;overflow:hidden;position:relative;z-index:1}.outline-drawer__title{border-bottom:1px solid #dcdfe6;box-sizing:border-box;font-size:16px;font-weight:400;margin:0 16px}.outline-drawer__close{color:#999;cursor:pointer;font-size:20px;height:20px;line-height:20px;overflow:hidden;position:absolute;right:12px;text-align:center;top:50%;transform:translateY(-50%);width:20px;z-index:2}.outline-drawer__close .outline-icon{left:0;position:absolute;top:0;z-index:2}.outline-drawer__close:hover{color:#666}.outline-drawer__main{flex:1;overflow:auto}.outline-drawer__main.overflow-hidden{overflow:hidden}.outline-drawer__footer{margin:0 auto;overflow:hidden;text-align:right}.outline-drawer__overlay{background-color:#fff;content:"";height:100%;left:0;opacity:.1;overflow:hidden;position:relative;top:0;width:100%;z-index:1}.outline-drawer_ltr.outline-drawer_tiny,.outline-drawer_rtl.outline-drawer_tiny{width:280px}.outline-drawer_ltr.outline-drawer_mini,.outline-drawer_rtl.outline-drawer_mini{width:480px}.outline-drawer_ltr.outline-drawer_small,.outline-drawer_rtl.outline-drawer_small{width:540px}.outline-drawer_ltr.outline-drawer_regular,.outline-drawer_rtl.outline-drawer_regular{width:680px}.outline-drawer_ltr.outline-drawer_medium,.outline-drawer_rtl.outline-drawer_medium{width:720px}.outline-drawer_ltr.outline-drawer_large,.outline-drawer_rtl.outline-drawer_large{width:960px}.outline-drawer_rtl{border-left:1px solid #dcdfe6}.outline-drawer_rtl.outline-drawer_tiny.outline-drawer_closed{right:-290px}.outline-drawer_rtl.outline-drawer_mini.outline-drawer_closed{right:-490px}.outline-drawer_rtl.outline-drawer_small.outline-drawer_closed{right:-550px}.outline-drawer_rtl.outline-drawer_regular.outline-drawer_closed{right:-690px}.outline-drawer_rtl.outline-drawer_medium.outline-drawer_closed{right:-730px}.outline-drawer_rtl.outline-drawer_large.outline-drawer_closed{right:-970px}.outline-drawer_ltr{border-right:1px solid #dcdfe6}.outline-drawer_ltr.outline-drawer_tiny.outline-drawer_closed{left:-290px}.outline-drawer_ltr.outline-drawer_mini.outline-drawer_closed{left:-490px}.outline-drawer_ltr.outline-drawer_small.outline-drawer_closed{left:-550px}.outline-drawer_ltr.outline-drawer_regular.outline-drawer_closed{left:-690px}.outline-drawer_ltr.outline-drawer_medium.outline-drawer_closed{left:-730px}.outline-drawer_ltr.outline-drawer_large.outline-drawer_closed{left:-970px}.outline-drawer_btt,.outline-drawer_ttb{left:0;width:100%}.outline-drawer_btt.outline-drawer_tiny,.outline-drawer_ttb.outline-drawer_tiny{height:240px}.outline-drawer_btt.outline-drawer_mini,.outline-drawer_ttb.outline-drawer_mini{height:320px}.outline-drawer_btt.outline-drawer_small,.outline-drawer_ttb.outline-drawer_small{height:360px}.outline-drawer_btt.outline-drawer_regular,.outline-drawer_ttb.outline-drawer_regular{height:400px}.outline-drawer_btt.outline-drawer_medium,.outline-drawer_ttb.outline-drawer_medium{height:440px}.outline-drawer_btt.outline-drawer_large,.outline-drawer_ttb.outline-drawer_large{height:480px}.outline-drawer_ttb{border-bottom:1px solid #dcdfe6}.outline-drawer_ttb.outline-drawer_tiny.outline-drawer_closed{top:-250px}.outline-drawer_ttb.outline-drawer_mini.outline-drawer_closed{top:-330px}.outline-drawer_ttb.outline-drawer_small.outline-drawer_closed{top:-370px}.outline-drawer_ttb.outline-drawer_regular.outline-drawer_closed{top:-410px}.outline-drawer_ttb.outline-drawer_medium.outline-drawer_closed{top:-450px}.outline-drawer_ttb.outline-drawer_large.outline-drawer_closed{top:-490px}.outline-drawer_btt{border-top:1px solid #dcdfe6;top:auto}.outline-drawer_btt.outline-drawer_tiny.outline-drawer_closed{bottom:-250px}.outline-drawer_btt.outline-drawer_mini.outline-drawer_closed{bottom:-330px}.outline-drawer_btt.outline-drawer_small.outline-drawer_closed{bottom:-370px}.outline-drawer_btt.outline-drawer_regular.outline-drawer_closed{bottom:-410px}.outline-drawer_btt.outline-drawer_medium.outline-drawer_closed{bottom:-450px}.outline-drawer_btt.outline-drawer_large.outline-drawer_closed{bottom:-490px}.outline-drawer_opened{visibility:visible;z-index:var(--outline-zIndex)}.outline-drawer_opened.outline-drawer{position:fixed}.outline-drawer_opened.outline-drawer_rtl{right:0}.outline-drawer_opened.outline-drawer_ltr{left:0}.outline-drawer_opened.outline-drawer_ttb{top:0}.outline-drawer_opened.outline-drawer_btt{bottom:0}.outline-drawer_offset.outline-drawer_ltr,.outline-drawer_offset.outline-drawer_rtl{height:calc(100% - 4em);top:50%;transform:translateY(-50%)}.outline-drawer_offset.outline-drawer_btt,.outline-drawer_offset.outline-drawer_ttb{left:50%;transform:translateX(-50%);width:calc(100% - 4em)}.outline-drawer_offset.outline-drawer_opened.outline-drawer_rtl{right:2em}.outline-drawer_offset.outline-drawer_opened.outline-drawer_ltr{left:2em}.outline-drawer_offset.outline-drawer_opened.outline-drawer_ttb{top:2em}.outline-drawer_offset.outline-drawer_opened.outline-drawer_btt{bottom:2em}.outline-drawer_auto.outline-drawer_ltr,.outline-drawer_auto.outline-drawer_rtl{height:auto;max-height:calc(100% - 4em)}.outline-drawer_full{padding:0}');class ct extends M{constructor(t){super(),this._default(),this.zIndex=0,t&&this.initialize(t)}_default(){return this.attrs=c(ct.DEFAULTS),this.title="",this.closed=!1,this.$el=null,this.$modal=null,this.$header=null,this.$title=null,this.$close=null,this.$main=null,this.$footer=null,this.$overlay=null,this}initialize(t){let e;return this.attr(t),this.title=this.attr("title"),e=this.attr("created"),l(e)&&e.call(this),this.render().addListeners(),this}setTitle(t){return this.attr("title",t),this.title=t,this.$title.innerHTML=t,this}isClosed(){return this.closed}render(){const t=this.attr("mounted"),e=this.attr("size"),i=this.attr("placement"),r=this.attr("hasClose"),o=this.attr("hasOverlay"),s=this.attr("hasOffset"),n=this.attr("hasPadding"),a=this.attr("autoHeight"),h=this.attr("overflow"),d=this.attr("customClass");let c,u,p,m,_,f,b,w,v="outline-drawer__main";return X(),this.zIndex=dt(),m=K("h2",{className:"outline-drawer__title"},this.title),this.$title=m,r&&(_=K("div",{className:"outline-drawer__close"},tt("close",{iconSet:"outline",size:20})),this.$close=_),p=K("header",{className:"outline-drawer__header"},[m,_]),this.$header=p,"hidden"===h&&(v+=" overflow-hidden"),f=K("div",{className:v}),this.$main=f,n||g(f,"outline-drawer_full"),b=K("footer",{className:"outline-drawer__footer"}),this.$footer=b,u=K("div",{className:`outline-drawer__modal outline-drawer_${i} outline-drawer_${e} outline-drawer_closed`},[p,f,b]),this.$modal=u,s&&g(u,"outline-drawer_offset"),a&&g(u,"outline-drawer_auto"),d&&g(u,d),o&&(w=K("div",{className:"outline-drawer__overlay"}),this.$overlay=w),c=K("div",{className:"outline-drawer"},[u,w]),this.$el=c,document.body.appendChild(c),l(t)&&t.call(this),this}erase(){return this.$main.innerHTML="",this}_paint(t){let e=null;return l(t)?e=t():Q(t)?e=t:nt(t)&&(e=((t,e)=>{const r=document.createDocumentFragment();if(!t||!nt(t)&&!u(t)&&!p(t))return null;if(nt(t)){const e=K("div");let o=[];return e.innerHTML=lt(t),o=i(s,e.childNodes),o.forEach((t=>{r.appendChild(t)})),r}if(!u(e))return t.innerHTML;t.innerHTML=lt(e)})(t)),e&&this.$main.appendChild(e),this}_remove(){return document.body.removeChild(this.$el),this}refresh(t){return this.erase()._paint(t),this}open(){const t=this.attr("afterOpened"),e=this.$modal;return g(this.$el,"outline-drawer_opened"),et(e,"outline-drawer_closed"),g(e,"outline-drawer_opened"),a((()=>{this.closed=!1,l(t)&&t.call(this)})),this}close(){const t=this.attr("afterClosed"),e=this.$modal;return et(e,"outline-drawer_opened"),g(e,"outline-drawer_closed"),a((()=>{et(this.$el,"outline-drawer_opened"),this.closed=!0,l(t)&&t.call(this)})),this}toggle(){const t=this.attr("afterToggle"),e=this.isClosed();return e?this.open():this.close(),l(t)&&a((()=>{t.call(this,e)})),this}destroy(){const t=this.attr("afterDestroy"),e=this.attr("beforeDestroy");let i=this.zIndex;return l(e)&&e.call(this),this.removeListeners()._remove()._default(),i-=1,dt(i),this.zIndex=0,l(t)&&t.call(this),this}onClose(){return this.close(),this}addListeners(){const t=this.attr("hasClose"),e=this.attr("hasOverlay"),i=this.attr("closeOnClickModal"),r=this.$el;return t&&B(r,".outline-drawer__close","click",this.onClose,this,!0),e&&i&&B(r,".outline-drawer__overlay","click",this.onClose,this,!0),this}removeListeners(){const t=this.attr("hasClose"),e=this.attr("hasOverlay"),i=this.$el;return t||e?(P(i,"click",this.onClose),this):this}}ct.DEFAULTS=c({placement:"rtl",title:"标题",size:"regular",hasClose:!0,hasOverlay:!0,hasOffset:!1,hasPadding:!0,autoHeight:!0,closeOnClickModal:!0,overflow:"auto",created:null,mounted:null,afterClosed:null,afterOpened:null,afterScroll:null,beforeDestroy:null,afterDestroy:null,afterToggle:null});const ut=(t,e,i,r,o,s=!1)=>{const n=I.indexOf(e)>-1,a=function(n){let l=o||t;!0===o&&(l=r),!0===s&&P(t,e,a),i.call(l,n,r)};if(!l(i))return!1;t._listeners||(t._listeners=[]),t._listeners.push({el:t,type:e,fn:a,data:r,context:o,capture:n}),i._delegateListener=a,t.addEventListener(e,a,n)},pt=(t,e)=>getComputedStyle(t)[e];rt(":root{--outline-zIndex:2000;--outline-sticky-height:100%;--outline-navigator-width:100%}.outline-navigator{margin:0;overflow:auto;position:relative;width:var(--outline-navigator-width);z-index:1}.outline-navigator-parent{transition:.3s ease-in-out}.outline-navigator__title{border-bottom:1px solid #dcdfe6;font-size:16px;font-weight:400;height:40px;line-height:40px;margin:0 16px;overflow:hidden;padding:0 16px}.outline-navigator__main{margin:0;overflow:hidden;position:relative;z-index:1}.outline-navigator__item,.outline-navigator__list,.outline-navigator__subject{list-style-type:none;margin:0;overflow:hidden;padding:0;position:relative;z-index:2}.outline-navigator__list{padding:.5em 0}.outline-navigator__subject{padding-left:1em}.outline-navigator__item{font-size:13px;line-height:30px;margin:0;overflow:hidden}.outline-navigator__placeholder{background-color:#f7f8f9;border-left:2px solid #058942;box-sizing:border-box;height:30px;left:0;overflow:hidden;position:absolute;top:0;transition-duration:.2s;width:100%;z-index:1}.outline-navigator__anchor{display:block;overflow:hidden;padding:0 1.5em;text-overflow:ellipsis;white-space:nowrap}.outline-navigator__anchor:hover,.outline-navigator__anchor:link,.outline-navigator__anchor:visited{color:#555;text-decoration:none}.outline-navigator__anchor:hover{color:#058942}.outline-navigator__code{padding-right:.5em}.outline-navigator_highlight.outline-navigator__anchor:hover,.outline-navigator_highlight.outline-navigator__anchor:link,.outline-navigator_highlight.outline-navigator__anchor:visited{color:#058942;font-weight:700}.outline-navigator_fixed,.outline-navigator_sticky{display:flex;flex-direction:column;flex-wrap:nowrap;overflow:hidden;top:0;z-index:var(--outline-zIndex)}.outline-navigator_fixed .outline-navigator__main,.outline-navigator_fixed .outline-navigator__title,.outline-navigator_sticky .outline-navigator__main,.outline-navigator_sticky .outline-navigator__title{box-sizing:border-box}.outline-navigator_fixed .outline-navigator__title,.outline-navigator_sticky .outline-navigator__title{flex-shrink:0}.outline-navigator_fixed .outline-navigator__main,.outline-navigator_sticky .outline-navigator__main{flex:1;overflow:auto}.outline-navigator_sticky{max-height:var(--outline-sticky-height);position:sticky}.outline-navigator_fixed{max-height:100%;position:fixed}.outline-navigator_hidden{display:none}.outline-navigator_folded{overflow:hidden;width:0}");const mt="outline-navigator_hidden",gt="outline-navigator_expanded",_t="outline-navigator_folded";class ft extends M{constructor(t){super(),this._default(),this.scrollTimer=null,this.resizeTimer=null,this.observerTimer=null,this.Observer=null,t&&this.initialize(t)}_default(){return this.attrs=c(ft.DEFAULTS),this.$el=null,this.$title=null,this.$main=null,this.$list=null,this.$placeholder=null,this.$parentElement=null,this.$scrollElement=null,this.$active=null,this.chapters=[],this.active=0,this.offsetWidth=0,this.offsetTop=0,this.playing=!1,this.closed=!1,this}initialize(t){let e,i,r,o;return this.attr(t),e=this.attr("created"),i=this.attr("parentElement"),r=this.attr("scrollElement"),u(i)?o=document.querySelector(i):p(i)&&(o=i),this.$parentElement=o,this.$scrollElement=b(r),this.chapters=this.attr("chapters"),this.closed=this.attr("closed"),this.active=this.attr("active"),l(e)&&e.call(this),this.chapters.length<1||(this.render().addListeners(),this.$active=document.querySelector(`#chapter-${this.active}`)),this}isClosed(){return this.closed}isSticky(){return"sticky"===this.attr("position")}isFixed(){return"fixed"===this.attr("position")}isInside(){return this.isFixed()||this.isSticky()}isOutside(){return!this.isInside()}count(){return this.chapters.length}_paintEdge(){const t=document.createDocumentFragment(),e=this.attr("title"),i=this.attr("animationCurrent"),r=this.attr("customClass"),o=this.$parentElement,s=[],n=[];let l,a,h,d,c=null;return o?(this.isInside()&&e&&(c=K("h2",{className:"outline-navigator__title"},e),this.$title=c,n.push(c)),h=K("ul",{className:"outline-navigator__list"}),this.$list=h,s.push(h),i&&(d=K("div",{className:"outline-navigator__placeholder"}),this.$placeholder=d,s.push(d)),a=K("div",{className:"outline-navigator__main"},s),this.$main=a,n.push(a),l=K("nav",{id:"outline-navigator",className:`outline-navigator ${mt}`},n),this.$el=l,this.isSticky()&&(this.calculateStickyHeight(),g(l,"outline-navigator_sticky")),r&&g(l,r),t.appendChild(l),o.appendChild(t),this):this}render(){const t=this.attr("mounted"),e=this.$parentElement,i=this.chapters,r=this.count();let o;return!e||i.length<1||(this.isInside()&&g(e,"outline-navigator-parent"),this._paintEdge(),o=this.$el,this._paint(i),a((()=>{this.highlight(this.active)}),60),this.offsetTop=D(o),this.offsetWidth=o.offsetWidth,this.isFixed()&&(this.sticky(),at("--outline-navigator-width",`${this.offsetWidth}px`)),l(t)&&t.call(this),r<400&&this.onObserver()),this}erase(){return this.$list.innerHTML="",this}_paint(t){const e=this.attr("showCode"),r=this.$el;return((t,e,r=!1)=>{const o=e.length,n=i(s,e),l=e=>{const i=e=>t.querySelector(`#${e}`);e.forEach((e=>{const o=e.pid,s=e.id,n=e.code,l=e.rel,a=[],h=K("span",{className:"outline-navigator__text"},e.text);let d,c,u,p,m;r&&(c=K("span",{className:"outline-navigator__code","data-id":s},e.code),a.push(c)),a.push(h),d=K("a",{id:`chapter__anchor-${s}`,className:"outline-navigator__anchor",href:"#"+l,rel:l,"data-id":s,"data-code":n},a),u=K("li",{id:`chapter-${s}`,className:"outline-navigator__item","data-id":s,"data-code":n},d),-1===o?t.appendChild(u):(m=i(`chapter-${o}`),p=i(`subject-${o}`),p?p.appendChild(u):(p=K("ul",{id:"subject-"+o,className:"outline-navigator__subject"},u),m.appendChild(p)))}))};if(o>400)for(l(n.splice(0,400));n.length>0;){const t=n.splice(0,400);j((()=>{l(t)}))}else l(n)})(this.$list,t,e),et(r,mt),g(r,gt),this}_remove(){return this.$parentElement.removeChild(this.$el),this}refresh(t){const e=this.$el;return et(e,mt),this.erase()._paint(t),this}_getPlaceholderOffset(t){const e=this.$main,i=this.$list,r=i.querySelector(".outline-navigator__anchor"),o=parseInt(pt(e,"padding-top"),10),s=parseInt(pt(e,"border-top-width"),10),n=parseInt(pt(i,"padding-top"),10),l=parseInt(pt(i,"margin-top"),10),a=parseInt(pt(i,"border-top-width"),10);let h,d=0;return o&&(d+=o),n&&(d+=n),l&&(d+=l),s&&(d+=s),a&&(d+=a),h=r.offsetHeight*t,d+h}positionPlaceholder(t){const e=this.$list,i=this.$placeholder,r=e.querySelector(".outline-navigator__anchor"),o=this.attr("animationCurrent"),s=r.offsetHeight;let n=0;return o?(n=this._getPlaceholderOffset(t),i.style.cssText=`transform: translateY(${n}px);height:${s}px;`,this):this}highlight(t){const e=this.$el,i=this.attr("animationCurrent"),r="outline-navigator_active",o="outline-navigator_highlight";let s="relative"===this.attr("position")?this.$parentElement:this.$main,n=null,l=0;return e?(n=e.querySelector(`#chapter__anchor-${t}`),n?(this.active=parseInt(n.getAttribute("data-id"),10),this.$active&&(et(this.$active,o),et(this.$active,r)),this.$active=n,g(this.$active,r),i?this.positionPlaceholder(this.active):g(this.$active,o),a((()=>{((t,e)=>{let i,r,o=!1;return p(t)&&p(e)?(i=e.getBoundingClientRect(),r=t.getBoundingClientRect(),o=!!(r.top>=i.top&&r.right<=i.right&&r.bottom<=i.bottom&&r.left>=i.left),o):o})(this.$active,s)||(l=this._getPlaceholderOffset(this.active),f(s,l))})),this):this):this}sticky(){const t=this.attr("afterSticky"),e="outline-navigator_fixed",i=this.$el,r=this.offsetTop,o=this.$scrollElement.scrollTop;let s;return this.isFixed()?(s=o>=r,s?g(i,e):et(i,e),l(t)&&t.call(this,this.isClosed(),s),this):this}calculateStickyHeight(){const t=document.documentElement,e=Math.max(t.clientHeight||0,window.innerHeight||0);return at("--outline-sticky-height",`${e}px`),this}scrollTo(t,e){const i=this.$scrollElement;return f(i,t,e),this}show(){const t=this.attr("afterOpened"),e=this.count(),i=this.$el,r=this.$parentElement;return this.isInside()?e>800?et(r,mt):(et(r,mt),a((()=>{et(r,_t),g(r,gt)}),30)):et(i,mt),this.closed=!1,l(t)&&t.call(this),this}hide(){const t=this.attr("afterClosed"),e=this.count(),i=this.$el,r=this.$parentElement;return this.isInside()?e>800?g(r,mt):(g(r,_t),et(r,gt),a((()=>{g(r,mt)}))):g(i,mt),this.closed=!0,l(t)&&t.call(this),this}toggle(){const t=this.attr("afterToggle"),e=this.offsetTop,i=this.$scrollElement.scrollTop;let r;return this.isClosed()?this.show():this.hide(),l(t)&&a((()=>{r=i>=e,t.call(this,this.isClosed(),r)})),this}destroy(){const t=this.attr("beforeDestroy"),e=this.attr("afterDestroy");return l(t)&&t.call(this),this.removeListeners()._remove()._default(),this.scrollTimer&&(clearTimeout(this.scrollTimer),this.scrollTimer=null),this.resizeTimer&&(clearTimeout(this.resizeTimer),this.resizeTimer=null),this.observerTimer&&(clearTimeout(this.observerTimer),this.observerTimer=null),this.Observer&&(this.Observer=null),l(e)&&e.call(this),this}onObserver(){const t=this.attr("selector");return this.Observer=((t,e={})=>{const i=e.root||null,r=e.selector||".outline-heading",o=e.context||null,s={rootMargin:e.rootMargin||"0px 0px -90% 0px"},n=new IntersectionObserver((e=>{e.forEach((e=>{e.intersectionRatio>0&&l(t)&&t.call(o||e.target,e.target)}))}),s),a=p(i)?i:document;return i&&(s.root=i),a.querySelectorAll(r).forEach((t=>{n.observe(t)})),n})((t=>{const e=t.getAttribute("data-id");if(this.playing)return!1;this.observerTimer&&clearTimeout(this.observerTimer),this.observerTimer=a((()=>{this.highlight(e)}),100)}),{selector:t,context:this}),this}onSelect(t){const e=this.attr("stickyHeight"),i=t.delegateTarget,r=i.getAttribute("data-id"),o=i.href.split("#")[1],s=document.querySelector(`#${o}`),n=D(s)-(e+10),h=this.$scrollElement.scrollHeight,d=this.attr("afterScroll"),c=()=>{l(d)&&d.call(this,"chapter"),a((()=>{this.playing=!1,this.$emit("toolbar:update",{top:n,min:0,max:h})}))};return this.playing=!0,this.isFixed()?(this.sticky(),a((()=>{this.scrollTo(n,c),this.highlight(r)}),10)):(this.scrollTo(n,c),this.highlight(r)),V(t),this}onScroll(){const t=this.$scrollElement;return this.scrollTimer&&clearTimeout(this.scrollTimer),this.scrollTimer=a((()=>{const e=t.scrollTop,i=t.scrollHeight-t.clientHeight;this.isFixed()&&this.sticky(),this.$emit("toolbar:update",{top:e,min:0,max:i})}),100),this}onResize(){return this.isSticky()?(this.resizeTimer&&clearTimeout(this.resizeTimer),this.resizeTimer=a((()=>{this.calculateStickyHeight()})),this):this}onRefresh(t){return this.refresh(t),this}addListeners(){const t=this.$el,e=this.$scrollElement,i=e.tagName.toLowerCase();let r=e;return this.count()<1||("html"!==i&&"body"!==i||(r=window),B(t,".outline-navigator__anchor","click",this.onSelect,this,!0),ut(r,"scroll",this.onScroll,this,!0),this.isSticky()&&ut(window,"resize",this.onResize,this,!0),this.$on("anchors:all:paint",this.onObserver,this),this.$on("navigator:refresh",this.onRefresh,this)),this}removeListeners(){const t=this.attr("selector"),e=this.$el,i=this.$scrollElement,r=i.tagName.toLowerCase();let o=i;return this.count()<1||("html"!==r&&"body"!==r||(o=window),P(e,"click",this.onSelect),P(o,"scroll",this.onScroll),this.isSticky()&&P(window,"resize",this.onResize),this.$off("anchors:all:paint"),this.$off("navigator:refresh"),this.Observer&&document.querySelectorAll(t).forEach((t=>{this.Observer.unobserve(t)}))),this}}ft.DEFAULTS=c({parentElement:"",scrollElement:"",selector:".outline-heading",active:0,closed:!1,showCode:!0,animationCurrent:!0,position:"relative",stickyHeight:0,chapters:[],created:null,mounted:null,afterClosed:null,afterOpened:null,afterScroll:null,beforeDestroy:null,afterDestroy:null,afterSticky:null});const bt=()=>{const t=navigator.userAgent;return/Mobile|mini|Fennec|Android|iP(ad|od|hone)|NokiaN[^/]*/.test(t)},wt=t=>{const e=Object.getPrototypeOf;let i;if(!(t=>h(t)&&null!==t)(t))return!1;if(i=t.prototype,!i)return!0;for(i=t;null!==e(i);)i=e(i);return e(t)===i},vt=t=>{const e={"&":"&","<":"<",">":">","'":"'",'"':"""};return t.replace(/[&<>'"]/g,(t=>e[t]||t))};rt(".outline-icon{display:inline-block;position:relative;vertical-align:middle;z-index:1}.outline-icon,.outline-icon__svg{height:1em;overflow:hidden;width:1em}.outline-icon__svg{left:50%;position:absolute;top:50%;z-index:2;fill:currentcolor;transform:translate(-50%,-50%)}.outline-icon_hidden{display:none}.outline-message{background-color:#fff;border-radius:3px;box-shadow:0 0 6px 1px #dcdfe6;left:50%;opacity:.1;padding:0 50px;position:fixed;top:-50px;transform:translateX(-50%);transition:all .5s ease-in-out;z-index:9999}.outline-message,.outline-message__content{color:#666;font-size:13px;height:40px;line-height:40px;margin:0;overflow:hidden}.outline-message__content{max-width:700px;text-overflow:ellipsis;white-space:nowrap}.outline-message__close,.outline-message__icon{height:40px;line-height:40px;overflow:hidden;position:absolute;text-align:center;top:0;width:40px;z-index:2}.outline-message__icon{color:#fff;left:0}.outline-message__icon .outline-icon{left:50%;position:absolute;top:50%;transform:translate(-50%,-50%);z-index:2}.outline-message__close{color:#999;cursor:pointer;right:0}.outline-message__close .outline-icon{left:50%;position:absolute;top:50%;transform:translate(-50%,-50%);z-index:2}.outline-message__close:hover{color:#666}.outline-message_info .outline-message__icon{background-color:#507afe}.outline-message_warning .outline-message__icon{background-color:#ff9901}.outline-message_success .outline-message__icon{background-color:#058942}.outline-message_error .outline-message__icon{background-color:#ff5d5d}.outline-message_plain{min-width:190px;padding:0 50px 0 15px}.outline-message_plain.outline-message_info{background-color:#ecf8ff;border-left:5px solid #507afe}.outline-message_plain.outline-message_warning{background-color:#fffbe6;border-left:5px solid #ff9901}.outline-message_plain.outline-message_success{background-color:#e1f6eb;border-left:5px solid #058942}.outline-message_plain.outline-message_error{background-color:#fff1f0;border-left:5px solid #ff5d5d}.outline-message_plain .outline-message__icon{display:none;width:0}.outline-message_plain .outline-message__icon .outline-icon{display:none}.outline-message_light{min-width:180px;padding:0 40px}.outline-message_light.outline-message_info .outline-message__icon{color:#507afe}.outline-message_light.outline-message_warning .outline-message__icon{color:#ff9901}.outline-message_light.outline-message_success .outline-message__icon{color:#058942}.outline-message_light.outline-message_error .outline-message__icon{color:#ff5d5d}.outline-message_light .outline-message__icon{background-color:#fff}.outline-message_round{border-radius:20px}.outline-message_round.outline-message_default{min-width:180px;padding:0 40px}.outline-message_round.outline-message_default .outline-message__icon{border-radius:10px;height:20px;left:10px;line-height:20px;top:10px;width:20px}.outline-message_round.outline-message_default.outline-message_full-width{min-width:200px;padding:0 20px 0 40px}.outline-message_round.outline-message_plain{min-width:195px;padding:0 40px 0 20px}.outline-message_round.outline-message_plain.outline-message_full-width{min-width:215px;padding:0 20px}.outline-message_full-width{min-width:200px;padding:0 10px 0 50px}.outline-message_full-width.outline-message_plain{min-width:230px;padding:0 10px 0 15px}.outline-message_full-width.outline-message_light{min-width:210px;padding:0 10px 0 40px}.outline-message_visible{opacity:1}.outline-message_hidden{display:none}");const xt=[];let yt;X();class $t extends M{constructor(t){super(),this._default(),t&&this.initialize(t)}_default(){return this.attrs=c($t.DEFAULTS),this.$el=null,this.id="",this.closed=!1,this.visible=!1,this.offset=-50,this.timer=null,this.destroyed=!1,this}initialize(t){return this.attr(t),this.id=this.attr("id"),this.offset=this.attr("offset")||-50,this.$emit("created",o({},this.attr())),this.render().addListeners(),this.attr("visible")&&this.open(),this}isClosed(){return this.closed}isDestroyed(){return this.destroyed}_getClassName(){const t=this.attr("type"),e=this.attr("effect"),i=this.attr("round"),r=this.attr("closable"),o=this.attr("visible"),s=this.attr("customClass"),n=["outline-message",`outline-message_${t}`,`outline-message_${e}`];return i&&n.push("outline-message_round"),r||n.push("outline-message_full-width"),o&&n.push("outline-message_visible"),s&&n.push(s),n}render(){const t=this.attr("type"),e=this.attr("message"),i=this.attr("effect"),r=this.attr("round"),o=this.attr("closable"),s=this.attr("dangerouslyUseHTMLString"),n=this._getClassName(),l=[];let a,h,d,c,u,p=20;return r&&"default"===i&&(p=12),"plain"!==i&&(a=tt("light"===i?`circle-${t}`:t,{iconSet:"outline",size:p}),g(a,"outline-message__icon"),l.push(a)),s?(d=document.createDocumentFragment(),d.innerHTML=e):d=document.createTextNode(vt(lt(e))),h=K("p",{className:"outline-message__content"},[d]),l.push(h),o&&(c=tt("close",{iconSet:"outline",size:18}),g(c,"outline-message__close"),l.push(c)),u=K("div",{className:n.join(" ")},l),u.style.cssText="top:-50px;",this.$el=u,document.body.appendChild(this.$el),this.$emit("mounted"),this}_refreshIcon(){const t=".outline-message_hidden",e=this.$el;let i,r,o,s,n,l,a,h=20;return this.isDestroyed()?this:(n=e.querySelector(".outline-icon"),n?(i=this.attr("type"),r=this.attr("effect"),o=this.attr("round"),"plain"===r?g(n,t):(et(n,t),o&&"default"===r&&(h=12)),l=n.querySelector(".outline-icon__svg"),J(l,{style:`width:${h}px;height:${h}px;`}),a=l.querySelector("use"),s="light"===r?`circle-${i}`:i,G(a,"xlink:href",`#outline-icon-${s}`),this):this)}_refreshMessage(){const t=this.$el;let e,i,r,o;return this.isDestroyed()||(e=t.querySelector(".outline-message__content"),i=this.attr("dangerouslyUseHTMLString"),r=this.attr("message"),o=i?r:vt(lt(r)),e.innerHTML=o),this}_refreshClose(){const t=".outline-message_hidden",e=this.$el;let i,r;return this.isDestroyed()||(i=e.querySelector(".outline-message__close"),r=this.attr("closable"),i&&(r?g(i,t):et(i,t))),this}_refreshEl(){const t=this.$el;let e;return this.isDestroyed()||(e=this._getClassName(),G(t,"className",e.join(" "))),this}refresh(t){return wt(t)?(this.attr(t)._refreshIcon()._refreshMessage()._refreshClose()._refreshEl(),this):this}clearTimer(){return this.isDestroyed()||this.timer&&(clearTimeout(this.timer),this.timer=null),this}startTimer(t){return this.isDestroyed()||(this.timer=a((()=>{this.$emit("opened"),this.close()}),1e3*t)),this}open(t){const e=this.$el;let i,r,o,s;return this.isDestroyed()||(this.isClosed()&&this.refresh(t),i=this.attr("offset"),r=this.attr("duration"),o=i&&i>=this.offset?i:this.offset,s=`top:${o}px;`,this.clearTimer(),this.$emit("beforeOpen"),a((()=>{this.visible=!0,g(e,"outline-message_visible"),e.style.cssText=s,r>0&&this.startTimer(r)}),100)),this}close(){const t=this.$el;let e,i;return this.isDestroyed()||(e=this.attr("destroyAfterClosed"),i=this.attr("beforeClose"),l(i)&&i.call(this),t.style.cssText="top:-50px;",et(t,"outline-message_visible"),this.visible=!1,this.closed=!0,a((()=>{this.$emit("closed"),e&&this.destroy()}),500)),this}destroy(){return this.$emit("beforeDestroy"),this.isDestroyed()||(this.removeListeners(),document.body.removeChild(this.$el),clearTimeout(this.timer),this._default(),this.$emit("afterDestroy")),this}onMouseEnter(){return this.clearTimer(),this}onMouseLeave(){const t=this.attr("duration"),e=this.attr("delay");return t<=0||this.startTimer(e),this}onClose(){return this.clearTimer(),this.close(),this}addListeners(){const t=this.$el;return B(t,".outline-message__content","mouseenter",this.onMouseEnter,this,!0),B(t,".outline-message__content","mouseleave",this.onMouseLeave,this,!0),B(t,".outline-message__close","click",this.onClose,this,!0),this}removeListeners(){const t=this.$el;return P(t,"mouseenter",this.onMouseEnter),P(t,"mouseleave",this.onMouseLeave),P(t,"click",this.onClose),this}}$t.DEFAULTS=c({id:"",type:"info",effect:"default",round:!1,offset:30,duration:3,delay:2,message:"",customClass:"",closable:!0,visible:!0,dangerouslyUseHTMLString:!1,destroyAfterClosed:!0,beforeClose:null}),["info","success","warning","error"].forEach((t=>{$t[t]=e=>{const i={},r=E("outline-message-"),o=e.beforeClose||null;let s=e.offset||30;return u(e)?i.message=e:wt(e)&&$(i,e),i.id=r,i.type=t,i.offset=s,i.visible=!1,i.beforeClose=()=>{$t.close(r,o)},yt=new $t(i),xt.forEach((t=>{s+=t.$el.offsetHeight+16})),yt.offset=s,yt.open(),xt.push(yt),yt}})),$t.close=(t,e)=>{const i=xt.length;let r,o,s=-1;if(xt.forEach(((i,r)=>{t===i.id&&(o=i.$el.offsetHeight,s=r,l(e)&&e.call(i),xt.splice(r,1))})),i<=1||-1===s||s>xt.length-1)return!1;for(r=s;r{let t=xt.length-1;for(;t>=0;t-=1)xt[t].close()};class Tt{constructor(t,e){this.name=t,l(e)&&(this.action=e)}execute(){return this.action(),this}}class kt{constructor(){this.commands=[]}get(t){return this.commands.find((e=>e.name===t))}add(t){return this.commands.push(t),this}del(t){const e=this.commands,i=e.find((e=>e.name===t)),r=i?e.indexOf(i):-1;return r>-1&&e.splice(r,1),this}clear(){return this.commands=[],this}execute(t){const e=this.commands.find((e=>e.name===t));return l(null==e?void 0:e.execute)&&e.execute(),this}}const zt=(t,e=!0)=>{const i=tt(t.icon,{iconSet:t.iconSet||"outline",color:t.color||"",size:t.size}),r=K("a",{className:"outline-toolbar__anchor",href:t.link},i),o=K("div",{className:`outline-toolbar__button ${t.name}`,"data-cmd":t.name},[t.link?r:i]);return g(i,"outline-toolbar__icon"),e&&g(o,"outline-toolbar_rounded"),t.disabled&&g(o,"outline-toolbar_disabled"),o};rt(".outline-toolbar{margin:0;overflow:hidden;position:fixed;transition-duration:.3s;z-index:99999}.outline-toolbar__button{background-color:#fff;border:1px solid #dcdfe6;border-radius:3px;box-shadow:0 0 6px 1px #dcdfe6;box-sizing:border-box;color:#999;cursor:pointer;height:36px;margin:10px;overflow:hidden;position:relative;text-align:center;transition:all .3s ease-in-out .1s;width:36px;z-index:1}.outline-toolbar__button:hover{border-color:#058942;color:#058942;transform:scale(1.35)}.outline-toolbar__button.hide{display:none}.outline-toolbar__anchor:hover,.outline-toolbar__anchor:link,.outline-toolbar__anchor:visited{color:#999;text-decoration:none}.outline-toolbar__anchor:hover{color:#058942}.outline-toolbar__icon{height:20px;left:50%;position:absolute;top:50%;transform:translate(-50%,-50%);width:20px;z-index:2;fill:currentcolor;overflow:hidden}.outline-toolbar_active.outline-toolbar__button{background-color:#058942;border-color:#058942;color:#fff}.outline-toolbar_active.outline-toolbar__button:hover{color:#fff}.outline-toolbar_active .outline-toolbar__anchor:hover,.outline-toolbar_active .outline-toolbar__anchor:link,.outline-toolbar_active .outline-toolbar__anchor:visited{color:#fff}.outline-toolbar_rounded.outline-toolbar__button{border-radius:18px}.outline-toolbar_disabled .outline-toolbar__anchor:hover,.outline-toolbar_disabled .outline-toolbar__anchor:link,.outline-toolbar_disabled .outline-toolbar__anchor:visited,.outline-toolbar_disabled .outline-toolbar__button,.outline-toolbar_disabled.outline-toolbar__anchor:hover,.outline-toolbar_disabled.outline-toolbar__anchor:link,.outline-toolbar_disabled.outline-toolbar__anchor:visited,.outline-toolbar_disabled.outline-toolbar__button{border-color:#999;color:#999;cursor:not-allowed}.outline-toolbar_disabled .outline-toolbar__anchor:hover:hover,.outline-toolbar_disabled .outline-toolbar__anchor:link:hover,.outline-toolbar_disabled .outline-toolbar__anchor:visited:hover,.outline-toolbar_disabled .outline-toolbar__button:hover,.outline-toolbar_disabled.outline-toolbar__anchor:hover:hover,.outline-toolbar_disabled.outline-toolbar__anchor:link:hover,.outline-toolbar_disabled.outline-toolbar__anchor:visited:hover,.outline-toolbar_disabled.outline-toolbar__button:hover{border-color:#999;color:#999}.outline-toolbar_disabled .outline-toolbar__button,.outline-toolbar_disabled.outline-toolbar__button{background-color:#f5f5f5}.outline-toolbar_btt,.outline-toolbar_ttb{left:50%;transform:translateX(-50%)}.outline-toolbar_btt .outline-toolbar__button,.outline-toolbar_ttb .outline-toolbar__button{display:inline-block}.outline-toolbar_ttb{top:12px}.outline-toolbar_ttb.outline-toolbar_hidden{top:-56px}.outline-toolbar_btt{bottom:12px}.outline-toolbar_btt.outline-toolbar_hidden{bottom:-56px}.outline-toolbar_ltr,.outline-toolbar_rtl{transform:translateY(-50%);width:56px}.outline-toolbar_rtl{right:12px;top:50%}.outline-toolbar_rtl.outline-toolbar_hidden{right:-86px}.outline-toolbar_ltr{left:12px;top:50%}.outline-toolbar_ltr.outline-toolbar_hidden{left:-86px}.outline-toolbar_btt .outline-toolbar__button.outline-toolbar_hidden,.outline-toolbar_ltr .outline-toolbar__button.outline-toolbar_hidden,.outline-toolbar_rtl .outline-toolbar__button.outline-toolbar_hidden,.outline-toolbar_ttb .outline-toolbar__button.outline-toolbar_hidden{display:none}");const St="outline-toolbar_disabled",Et="outline-toolbar_hidden",Ct="outline-toolbar_active";class Lt extends M{constructor(t){super(),this._default(),t&&this.initialize(t)}_default(){return this.attrs=c(Lt.DEFAULTS),this.disabled=!1,this.closed=!1,this.$el=null,this.buttons=[],this.commands=null,this}initialize(t){let e;return this.attr(t),this.disabled=this.attr("disabled"),this.closed=this.attr("closed"),this.commands=new kt,e=this.attr("created"),l(e)&&e.call(this),this.render().addListeners(),this}isHighlight(t){const e=this.get(t);return!!e&&m(e.$el,Ct)}isDisabled(t){let e;return t?(e=this.get(t),e.disabled):this.disabled}isExist(t){return!!this.get(t)}isClosed(){return this.closed}_getCommand(t){const e=this,{action:i,name:r}=t;let o,s,n=null,a=null;return i?(a=i.handler,o=i.context||this,l(a)?s=a:u(a)&&(s=function(){e.$emit(a,r)}),l(s)&&(n=new Tt(r,s.bind(o))),n):n}get(t){return this.buttons.find((e=>e.name===t))}render(){const t=this.attr("mounted"),e=this.attr("buttons")||[],i=this.attr("placement");return X(),this.$el=K("div",{id:E("outline-toolbar"),className:`outline-toolbar outline-toolbar_${i}`}),this._paint(e),document.body.appendChild(this.$el),this.closed&&this.hide(),this.disabled&&this.disable(),l(t)&&t.call(this),this}erase(){return this.$el.innerHTML="",this}_paint(t){const e=this.attr("rounded"),i=document.createDocumentFragment();return t.forEach((t=>{const r=zt(t,e),o=this._getCommand(t),{name:s,disabled:n,context:l}=t;i.appendChild(r),this.isExist(s)||(this.buttons.push({$el:r,name:s,disabled:n||!1,context:l||this}),o&&this.commands.add(o))})),this.$el.appendChild(i),this}_remove(){return document.body.removeChild(this.$el),this}refresh(t){return this.attr({buttons:t}),this.erase()._paint(t),this}add(t){const e=this.$el,i=document.createDocumentFragment(),r=this.attr("buttons")||[],{name:o,disabled:s,context:n}=t,l=this._getCommand(t),a=t=>{const e=zt(t);i.appendChild(e),r.push(t),this.buttons.push({$el:e,name:o,disabled:s||!1,context:n||this,command:l}),l&&this.commands.add(l)};return h(t)?a(t):d(t)&&t.forEach((t=>{h(t)&&a(t)})),e.appendChild(i),this}remove(t){const e=this.$el,i=this.buttons,r=this.get(t);let o=-1;return r?(o=i.indexOf(r),o>-1&&(i.splice(o,1),this.attr("buttons").splice(o,1)),this._disable(t),e.removeChild(r.$el),this):this}_disable(t){const e=this.get(t),i=this.commands.get(t);return!e||e.disabled||(e.disabled=!0,i&&this.commands.del(i),g(e.$el,St)),this}_enable(t){const e=this.get(t),i=this.commands.get(t);return e&&e.disabled?(e.disabled=!1,i&&this.commands.add(i),et(e.$el,St),this):this}disable(t){const e=this.attr("afterDisabled");return t?this._disable(t):(g(this.$el,St),this.removeListeners(),this.disabled=!0,l(e)&&e.call(this)),this}enable(t){const e=this.attr("afterEnabled");return t?this._enable(t):(this.disabled=!1,et(this.$el,St),this.addListeners(),l(e)&&e.call(this)),this}show(t){const e=this.attr("afterOpened"),i=this.get(t),r=this.$el;if(t){if(!i)return this;et(i.$el,Et)}else et(r,Et),this.closed=!1,l(e)&&a((()=>{e.call(this)}),310);return this}hide(t){const e=this.attr("afterClosed"),i=this.get(t),r=this.$el;if(t){if(!i)return this;g(i.$el,Et)}else g(r,Et),this.closed=!0,l(e)&&a((()=>{e.call(this)}),310);return this}toggle(t){return this.isClosed()?this.show(t):this.hide(t),this}highlight(t){const e=this.get(t);let i;return e?(i=e.$el,m(i,Ct)?et(i,Ct):g(i,Ct),this):this}destroy(){const t=this.attr("beforeDestroy"),e=this.attr("afterDestroy");return l(t)&&t.call(this),this.commands.clear(),this.removeListeners()._remove()._default(),l(e)&&e.call(this),this}execute(t){return this.isDisabled(t)||this.commands.execute(t),this}onExecute(t){const e=t.delegateTarget;let i="";return e&&(i=e.getAttribute("data-cmd"),i&&this.execute(i)),this}_updateToolbar({top:t,min:e,max:i}){const r=Math.ceil(t);return r<=e?(this.hide("up"),this.show("down")):r>=i?(this.hide("down"),this.show("up")):r>e&&r{t[`on${i}`]=t=>{S(i,{event:t,speech:e})}})),speechSynthesis.onvoiceschanged=t=>{S("voiceschanged",{event:t,speech:e})},this}}Mt.isSupport="speechSynthesis"in window;const At=(t,e)=>{let i,r=t;for(;r;)i=r.tagName.toLowerCase(),"script"!==i&&"style"!==i&&g(r,"outline-reader_sibling"),r=e?r.previousElementSibling:r.nextElementSibling};rt(".outline-reader__progress{animation:outline-reader-progress linear;background-color:#507afe;height:4px;left:0;position:fixed;scale:0 1;top:0;transform-origin:left;width:100%;z-index:3;animation-timeline:--ProgressTimeline}.outline-reader__paper{background-color:#fff;box-shadow:0 0 6px 1px #ddd;box-sizing:border-box;margin:2em auto;max-width:1200px;overflow:hidden;padding:3.2em}.outline-reader__title{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Helvetica Neue,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Helvetica,Arial,sans-serif;font-size:4.2em;font-weight:400;line-height:1.3em;margin:.67em 0;overflow:hidden;text-align:center}.outline-reader__article .outline-reader__progress,.outline-reader_hidden{display:none}.outline-reader_hidden.outline-reader_sibling{display:none!important}.outline-reader_hidden.outline-reader_sibling.wrapper.post{display:none}.outline-reader--reading{background-color:#fafafa;box-sizing:border-box;display:block;height:100%;left:0;margin:0;padding:3em 4em;position:fixed;top:0;width:100%;z-index:2;scroll-timeline-name:--ProgressTimeline;overflow:scroll}@keyframes outline-reader-progress{to{scale:1 1}}@media (max-width:500px){.outline-reader{overflow:hidden}.outline-reader .outline-toolbar{align-items:center;align-self:auto;background-color:#fff;border-top:1px solid #ddd;box-sizing:border-box;display:flex;flex-direction:row;flex-wrap:nowrap;height:48px;padding:0 16px;right:0;top:100%;transform:translateY(-48px);width:100%}.outline-reader .outline-toolbar__button{border:none;border-radius:0;box-shadow:none;flex:1}.outline-reader--reading{background-color:#fff;box-sizing:border-box;padding:0}.outline-reader__paper{box-shadow:none;height:100%;margin:0;overflow:hidden;padding:0;position:relative;z-index:1}.outline-reader__title{background-color:#fff;border-bottom:1px solid #ddd;font-size:1.8em;font-weight:400;height:48px;left:0;line-height:48px;margin:0;overflow:hidden;position:absolute;text-overflow:ellipsis;top:0;white-space:nowrap;width:100%;z-index:3}.outline-reader__article{height:calc(100% - 96px);margin:48px 0;padding:0 1.25em;scroll-timeline-name:--MobileProgressTimeline;overflow-x:hidden;overflow-y:scroll}.outline-reader__article .outline-reader__progress{animation:outline-reader-progress linear;z-index:4;animation-timeline:--MobileProgressTimeline;display:block}}@media print{body,html{background-color:#fff;color:#333;font-size:12pt;height:auto!important}a:hover,a:link,a:visited{color:#507afe;text-decoration:underline!important}audio,video{display:none!important}table{border-collapse:collapse;width:100%}td,th{border:1px solid #dcdfe6;padding:8px 20px}.outline-message,.outline-toolbar{display:none!important}.outline-reader{display:block!important;overflow:hidden}.outline-reader__title{font-size:32pt!important;margin:13.4pt 0 28pt!important;text-align:center!important}.outline-reader--reading{background-color:#fff;height:auto!important;overflow:hidden!important;padding:0!important;position:relative!important}.outline-reader__progress{display:none!important}.outline-reader__paper{box-shadow:none}.outline-reader pre{border:1px solid #ddd!important;border-radius:4px!important;padding:1em!important}.outline-reader code,.outline-reader pre{background-color:#fff!important}.outline-reader img,.outline-reader svg,.outline-reader table{break-inside:avoid}.outline-reader_sibling{display:none!important}}");const Nt="进入阅读模式,按 ESC 键可退出阅读模式";class Ot extends M{constructor(t){super(),this._default(),t&&this.initialize(t)}_default(){return this.attrs=c(Ot.DEFAULTS),this.reading=!1,this.$target=null,this.$el=null,this.$paper=null,this.$title=null,this.$article=null,this.$progress=null,this.toolbar=null,this.speech=null,this}initialize(t){let e;return this.attr(t),e=this.attr("target"),u(e)?this.$target=document.querySelector(e):p(e)&&(this.$target=e),this.$target?(Mt.isSupport&&(this.speech=new Mt),this.render().addListeners(),this):this}isSpeaking(){var t;return null==this||null===(t=this.speech)||void 0===t?void 0:t.isSpeaking()}render(){return this._renderEdge()._paint(this.$target),this}erase(){return this.$article.innerHTML="",this}_paint(t){const e=document.createDocumentFragment(),r=i(s,t.cloneNode(!0).children);return a((()=>{r.forEach((t=>{e.appendChild(t)})),this.$article.appendChild(e)})),this}_remove(){const t=this.$el,e=this.toolbar;return t&&document.body.removeChild(t),e&&e.destroy(),this}refresh(){return this.erase()._paint(this.$target),this}_animateTimeline(){return window.ScrollTimeline&&bt()?(this.$progress.animate({scale:["0 1","1 1"]},{timeline:new ScrollTimeline({source:this.$article,axis:"block"})}),this):this}_renderEdge(){const t=this.$target,e=bt()?26:20;let i,r,o,s,n,l,h=this.attr("title");n=K("div",{className:"outline-reader__progress"}),this.$progress=n,o=t.querySelector("h1"),p(h)&&(o=h),p(o)&&(h=o.innerText),o=K("h1",{className:"outline-reader__title"},h),this.$title=o,s=K("article",{id:"outline-reader__article",className:"outline-reader__article"},bt()?[]:[n.cloneNode()]),this.$article=s,r=K("div",{id:"outline-reader__paper",className:"outline-reader__paper"},[o,s]),this.$paper=r;const d=[];return d.push({name:"print",icon:"print",size:e,action:{context:this,handler:this.print}}),Mt.isSupport&&this.attr("allowSpeak")&&d.push({name:"speak",icon:"sound",size:e,action:{context:this,handler:this.speak}}),d.push({name:"exit",icon:"close",size:e,action:{context:this,handler:this.exit}}),this.toolbar=new Lt({placement:"rtl",buttons:d}),i=K("section",{id:"outline-reader",className:"outline-reader outline-reader_hidden"},[n,r,this.toolbar.$el]),this.$el=i,document.body.appendChild(i),this._animateTimeline(),a((()=>{l=i.previousElementSibling,At(l,!0),l=i.nextElementSibling,At(l)})),this}enter(){const t="outline-reader",e=`${t}--reading`,i=`${t}_hidden`,r=this.$el,o=document.querySelectorAll(".outline-reader_sibling"),s=this.attr("enterReadingTip")||Nt;return this.reading||!r||(o.forEach((t=>{g(t,i)})),g(r,e),et(r,i),this.toolbar.show(),this.reading=!0,$t.info({round:!0,message:s}),this.$emit("reader:enter")),this}exit(){const t="speak",e="outline-reader",i=`${e}--reading`,r=`${e}_hidden`,o=this.$el,s=document.querySelectorAll(".outline-reader_sibling"),n=this.speech,l=this.toolbar;return this.reading&&o?(g(o,r),et(o,i),s.forEach((t=>{et(t,r)})),l.hide(),this.reading=!1,n&&(l.isHighlight(t)&&l.highlight(t),n.cancel()),this.$emit("reader:exit"),this):this}toggle(){return this.reading?this.exit():this.enter(),this}speak(){const t=this.$article.innerText,e=this.speech;return Mt.isSupport&&e?(this.toolbar.highlight("speak"),this.isSpeaking()?e.cancel():e.speak(t),this):this}print(){return l(print)?(print(),this):this}destroy(){return this.$el?(this.removeListeners()._remove()._default(),this):this}onPrint(){return this.print(),this}onEnterReading(){return this.toggle(),this}onExitReading(t){return 27===t.keyCode&&this.reading&&(this.toggle(),V(t)),this}onRefresh(){return this.refresh(),this}addListeners(){return this.$el?(ut(document,"keyup",this.onExitReading,this,!0),this.$on("toolbar:action:print",this.onPrint),this.$on("toolbar:action:reading",this.onEnterReading),this.$on("reader:print",this.onPrint),this.$on("reader:refresh",this.onRefresh),this.$on("reader:enter",this.enter),this.$on("reader:exit",this.exit),this.$on("reader:toggle",this.toggle),this):this}removeListeners(){return this.$el?(P(document,"keyup",this.onExitReading),this.$off("toolbar:action:print"),this.$off("toolbar:action:reading"),this.$off("reader:refresh"),this.$off("reader:toggle"),this):this}}var Ht;Ot.DEFAULTS=c({target:"",title:"",enterReadingTip:Nt,allowSpeak:!1});class jt extends M{constructor(t){super(),this.version="3.39.0",this._default(),t&&this.initialize(t)}_default(){const t=jt.DEFAULTS;return this.attrs=c(t),this.$article=null,this.$scrollElement=null,this.buttons=[],this.anchors=null,this.drawer=null,this.navigator=null,this.reader=null,this.toolbar=null,this}initialize(t){let e="",i="",r=null;return this.attr(t),e=this.attr("articleElement"),i=this.attr("scrollElement"),u(e)?r=document.querySelector(e):p(e)&&(r=e),this.$article=r,this.$scrollElement=b(i),this.$emit("created",o({},this.attr())),this.render().addListeners(),this}isExpanded(){const t=this.attr("position"),e=this.drawer,i=this.navigator;return!(this.count()<0)&&("relative"===t?!e.isClosed():!i.isClosed())}getChapters(t=!1){const e=this.$article,i=this.attr("selector"),r=this.attr("showCode"),o=this.attr("chapterTextFilter");return x({articleElement:e,selector:i,showCode:r,chapterTextFilter:o,isTreeStructured:t})}count(){return this.getChapters().length}render(){const t=this.attr("hasToolbar"),e=this.$scrollElement;return this._renderReader()._renderAnchors()._renderNavigator()._renderToolbar(),e&&t&&this.$emit("toolbar:update",{top:e.scrollTop,min:0,max:e.scrollHeight}),this.$emit("mounted"),this}_renderReader(){const t=this.attr("reader");return t.target?(g(this.$article,"outline-article"),this.reader=new Ot(t),this):this}_renderAnchors(){const t=this.attr("articleElement"),e=this.attr("selector"),i=this.attr("stickyHeight"),r=this.attr("scrollElement"),o=this.attr("showCode"),s=this.attr("anchorURL"),n=this.attr("afterScroll"),l=this.attr("chapterTextFilter"),a=this.attr("anchorLinkFilter");return this.anchors=new ot({articleElement:t,stickyHeight:i,scrollElement:r,selector:e,showCode:o,anchorURL:s,afterScroll:n,chapterTextFilter:l,anchorLinkFilter:a}),this}_renderNavigator(){const t=this.attr("title"),e=this.attr("stickyHeight"),i=this.attr("scrollElement"),r=this.attr("customClass"),o=this.attr("showCode"),s=this.attr("animationCurrent"),n=this.attr("closeOnClickModal"),l=this.attr("showNavModalFirst"),a=this.attr("position"),h=this.attr("placement"),d=this.attr("afterSticky"),c=this.attr("afterToggle"),u=this.attr("afterScroll"),p=this.count();let m,g=this.attr("parentElement");return p<1||(m={scrollElement:i,showCode:o,animationCurrent:s,position:a,title:t,stickyHeight:e,chapters:this.getChapters(),afterSticky:d,afterToggle:c,afterScroll:u},"relative"===a?(this.drawer=new ct({placement:h,title:t,size:"tiny",hasOffset:!0,hasPadding:!1,closeOnClickModal:n,customClass:r,afterClosed:()=>{this.toolbar.toggle()}}),g=this.drawer.$main,l&&this.drawer.open()):m.customClass=r,m.parentElement=g,this.navigator=new ft(m)),this}_renderToolbar(){const t=this.attr("position"),e=this.attr("hasToolbar"),r=this.attr("showNavModalFirst"),o=this.attr("placement"),n=this.attr("homepage"),a=this.attr("git"),h=this.attr("tags"),d=this.attr("issues"),c=this.attr("tools"),u=this.attr("reader"),p=this.count(),m={name:"up",icon:"up",size:20,action:{context:this,handler:this.toTop}},g={name:"homepage",icon:"homepage",size:20,link:n},_={name:"github",icon:"github",size:20,link:a},f={name:"tags",icon:"tags",size:20,link:h},b={name:"issues",icon:"issues",size:20,link:d},w={name:"toggle",icon:"menu",size:18,action:{context:this,handler:this.toggle}},v={name:"reading",icon:"file",size:18,action:{context:this,handler:"toolbar:action:reading"}},x={name:"print",icon:"print",size:20,action:{handler:"toolbar:action:print"}},y={name:"down",icon:"down",size:20,action:{context:this,handler:this.toBottom}},$=[];return e?($.push(m),p>0&&$.push(w),n&&$.push(g),a&&$.push(_),h&&$.push(f),d&&$.push(b),u.target&&($.push(v),l(print)&&$.push(x)),(null==c?void 0:c.length)>0&&$.push.apply($,i(s,c)),$.push(y),this.buttons=[].concat($),this.toolbar=new Lt({placement:o,buttons:$}),"relative"===t&&r&&this.toolbar.hide(),this):this}refresh(){const t=this.getChapters();return this.$emit("anchors:refresh",t),this.$emit("navigator:refresh",t),this.$emit("reader:refresh"),this.$emit("refresh",t),this}addButton(t){const e=this.buttons;return e.splice(-1,0,t),this.$emit("toolbar:add:button",e),this}removeButton(t){return this.$emit("toolbar:remove:button",t),this}toTop(){const t=this.attr("afterScroll"),e=this.toolbar,i=this.navigator,r=this.count();return r>0&&(i.playing=!0),this.scrollTo(0,(()=>{e.hide("up"),e.show("down"),r>0&&(i.highlight(0),i.playing=!1,f(i.$main,0)),l(t)&&t.call(e,"up")})),this}toBottom(){const t=this.attr("afterScroll"),e=this.$scrollElement,i=this.toolbar,r=this.navigator,o=this.count(),s=Math.floor(e.scrollHeight-e.clientHeight);return o>0&&(r.playing=!0),this.scrollTo(s,(()=>{const e=r.$main;i.hide("down"),i.show("up"),o>0&&(r.highlight(o-1),f(e,e.scrollHeight),r.playing=!1),l(t)&&t.call(i,"bottom")})),this}scrollTo(t,e){return f(this.$scrollElement,t,e),this}enterReading(){return this.$emit("toolbar:toggle"),this.$emit("reader:enter"),this}exitReading(){return this.$emit("toolbar:toggle"),this.$emit("reader:exit"),this}switchReading(){return this.$emit("toolbar:toggle"),this.$emit("reader:toggle"),this}expand(){const t=this.attr("position"),e=this.toolbar,i=this.drawer,r=this.navigator;return this.count()<1||("relative"!==t?(r.show(),e.highlight("toggle")):(e.hide(),a((()=>{i.open()})))),this}collapses(){const t=this.attr("position"),e=this.toolbar,i=this.drawer,r=this.navigator;return this.count()<1||("relative"!==t?(r.hide(),e.highlight("toggle")):(e.show(),a((()=>{i.close()})))),this}toggle(){return this.isExpanded()?this.collapses():this.expand(),this}print(){return this.$emit("reader:print"),this}_destroy(){const t=this.count();let e=this.anchors,i=this.navigator,r=this.drawer,o=this.reader,s=this.toolbar,n=!1;return this.removeListeners(),o&&o.destroy(),t>0&&i&&(n=i.isOutside(),i.destroy(),n&&r&&r.destroy()),e&&e.destroy(),s&&s.destroy(),this}destroy(){return this.$emit("beforeDestroy"),this._destroy()._default(),this.$emit("destroyed"),this}addListeners(){return this.attr("hasToolbar")?(this.$on("toolbar:update",this.onToolbarUpdate),this):this}removeListeners(){return this.attr("hasToolbar")?(this.$off("toolbar:update"),this):this}}if(jt.DEFAULTS=c({articleElement:"#article",selector:"h2,h3,h4,h5,h6",parentElement:"#aside",scrollElement:"html,body",title:"目录",position:"relative",placement:"rtl",animationCurrent:!0,showCode:!1,hasToolbar:!0,closeOnClickModal:!0,showNavModalFirst:!1,anchorURL:"",stickyHeight:0,homepage:"",git:"",tags:"",issues:"",tools:[],reader:{target:"",title:"",enterReadingTip:"进入阅读模式,按 ESC 键可退出阅读模式",allowSpeak:!1},customClass:"",afterSticky:null,afterToggle:null,afterScroll:null,chapterTextFilter:null,anchorLinkFilter:null}),null!==(Ht=window)&&void 0!==Ht&&Ht.jQuery){const t=window.jQuery;t.extend(t.fn,{outline:function(e){let i=t(this);return new jt(t.extend({},e,{articleElement:i}))}})}const Dt=(t,e=300)=>{let i;return function(...r){i&&clearTimeout(i),i=setTimeout((()=>{t.apply(this,r)}),e)}},Ft=()=>Math.max(document.documentElement.clientWidth,window.innerWidth),qt=jt.DEFAULTS;qt.articleElement=document.querySelector("#article"),qt.parentElement=document.querySelector("#aside"),qt.scrollElement=document.querySelector("#main"),qt.selector="h2,h3",qt.title=!1,qt.showCode=!1,qt.position="sticky",qt.git="https://github.com/yaohaixiao/outline.js",qt.tags="https://github.com/yaohaixiao/outline.js/tags",qt.issues="https://github.com/yaohaixiao/outline.js/issues",qt.reader={target:"#article",title:document.querySelector(".main__h1"),allowSpeak:!0},qt.chapterTextFilter=!0,qt.anchorLinkFilter=(t,e,i)=>`${t}-${e}-${i}`,qt.customClass="aside-navigator",qt.afterScroll=t=>{Ft()<=500&&"chapter"===t&&It.toggle()};const It=new jt(qt);return((t,e,i=300)=>{let r,o;!(!p(t)||!l(e))&&(o=Dt(e,i),r=new ResizeObserver((t=>{for(const e of t)o(e)})),r.observe(t))})(document.querySelector("#docs"),(()=>{Ft()<=500&&It.isExpanded()&&It.toggle()})),It})); //# sourceMappingURL=docs.min.js.map diff --git a/docs/js/docs.min.js.map b/docs/js/docs.min.js.map index 336e55db..bbe73708 100644 --- a/docs/js/docs.min.js.map +++ b/docs/js/docs.min.js.map @@ -1 +1 @@ -{"version":3,"file":"docs.min.js","sources":["../../utils/lang/toString.js","../../utils/types/isFunction.js","../../utils/lang/later.js","../../utils/types/isObject.js","../../utils/types/isArray.js","../../utils/lang/cloneDeep.js","../../utils/types/isString.js","../../utils/types/isElement.js","../../utils/dom/hasClass.js","../../utils/dom/addClass.js","../../utils/lang/easeInQuad.js","../../utils/dom/_getScrollElement.js","../../utils/dom/scrollTo.js","../../utils/lang/trim.js","../../getChaptersByHeadings.js","../../utils/lang/stripTags.js","../../_getChapterParentIdByDiffer.js","../../_getChaptersWithCode.js","../../getChapters.js","../../utils/lang/toTree.js","../../utils/lang/hasOwn.js","../../utils/lang/extend.js","../../utils/observer/_subscribers.js","../../utils/observer/_hasDirectSubscribersFor.js","../../utils/observer/has.js","../../utils/observer/_hasSubscribers.js","../../utils/observer/emit.js","../../utils/types/isTypedArray.js","../../utils/lang/guid.js","../../utils/observer/_removeSubscriber.js","../../utils/observer/off.js","../../utils/observer/_removeSubscriberByToken.js","../../base.js","../../utils/observer/on.js","../../utils/lang/timeSlice.js","../../utils/dom/offsetTop.js","../../utils/dom/matches.js","../../utils/dom/getParentOrHost.js","../../utils/event/enum.js","../../utils/event/_off.js","../../utils/event/_delete.js","../../utils/event/purgeElement.js","../../utils/event/getListeners.js","../../utils/event/off.js","../../utils/event/on.js","../../utils/event/getTarget.js","../../utils/dom/resolveTextNode.js","../../utils/dom/closest.js","../../utils/event/stop.js","../../utils/icons/symbols.js","../../utils/icons/defaults.js","../../utils/icons/getSymbols.js","../../utils/icons/getSymbol.js","../../utils/icons/paint.js","../../utils/icons/add.js","../../utils/types/isDOM.js","../../utils/types/isHTMLCollection.js","../../utils/types/isFragment.js","../../utils/types/isTextNode.js","../../utils/dom/setAttribute.js","../../utils/dom/setAttributes.js","../../utils/dom/createElement.js","../../utils/icons/createElement.js","../../utils/types/isSVG.js","../../utils/icons/icon.js","../../utils/dom/removeClass.js","../../_removeHeading.js","../../utils/types/isEmpty.js","../../anchors.js","../../_updateHeading.js","../../utils/types/tags.js","../../utils/types/isHTML.js","../../utils/lang/stripScripts.js","../../utils/dom/setProperty.js","../../zIndex.js","../../drawer.js","../../utils/dom/html.js","../../utils/event/at.js","../../utils/dom/getStyle.js","../../navigator.js","../../_paintChapters.js","../../utils/dom/inBounding.js","../../utils/dom/intersection.js","../../utils/types/isObjectLike.js","../../utils/types/isPlainObject.js","../../utils/lang/encodeHTML.js","../../message.js","../../command.js","../../commands.js","../../_createButton.js","../../toolbar.js","../../speech.js","../../_updateSiblingElements.js","../../utils/dom/isMobile.js","../../reader.js","../../outline.js","../../api/js/debounce.js","../../api/js/getViewportWidth.js","../../api/js/main.js","../../api/js/observeResize.js"],"sourcesContent":["/**\r\n * Object 对象原型上的 toString 方法\r\n * ========================================================================\r\n * @method toString\r\n * @param {*} val\r\n * @returns {string}\r\n */\r\nconst toString = (val) => {\r\n return Object.prototype.toString.apply(val)\r\n}\r\n\r\nexport default toString\r\n","import toString from '../lang/toString'\r\n\r\n/**\r\n * 检测测试数据是否为 Function 类型\r\n * ========================================================================\r\n * @method isFunction\r\n * @param {*} val - (必须)待检测的数据\r\n * @returns {boolean} 'val' 是 Function 类型返回 true,否则返回 false\r\n */\r\nconst isFunction = (val) => {\r\n return typeof val === 'function' || toString(val) === '[object Function]'\r\n}\r\n\r\nexport default isFunction\r\n","import isFunction from '../types/isFunction'\r\n\r\n/**\r\n * later - 延迟执行方法\r\n * ========================================================================\r\n * @method later\r\n * @param {Function} fn\r\n * @param {Number} [delay]\r\n * @returns {number|boolean}\r\n */\r\nconst later = (fn, delay = 300) => {\r\n if (!isFunction(fn)) {\r\n return false\r\n }\r\n\r\n return setTimeout(() => {\r\n fn()\r\n }, delay)\r\n}\r\n\r\nexport default later\r\n","import toString from '../lang/toString'\r\nimport isFunction from './isFunction'\r\n\r\n/**\r\n * 检测数据是否为 Object 类型\r\n * ========================================================================\r\n * @method isObject\r\n * @param {*} o\r\n * @returns {boolean}\r\n */\r\nconst isObject = (o) => {\r\n return (\r\n (toString(o) === '[object Object]' ||\r\n typeof o === 'object' ||\r\n isFunction(o)) &&\r\n o !== null\r\n )\r\n}\r\n\r\nexport default isObject\r\n","import toString from '../lang/toString'\r\n\r\n/**\r\n * 检测数据是否为 Array 类型\r\n * ========================================================================\r\n * @method isArray\r\n * @param {*} o\r\n * @returns {boolean}\r\n */\r\nconst isArray = (o) => {\r\n if (Array.isArray) {\r\n return Array.isArray(o)\r\n } else {\r\n return toString(o) === '[object Array]'\r\n }\r\n}\r\n\r\nexport default isArray\r\n","import isObject from '../types/isObject'\r\nimport isArray from '../types/isArray'\r\n\r\n/**\r\n * 深拷贝对象函数\r\n * ========================================================================\r\n * @methods cloneDeep\r\n * @param {Object} obj - 深拷贝的对象\r\n * @returns {Array|Object|*}\r\n *\r\n * @example\r\n * const arr = cloneDeep([2,3,4,6])\r\n * => [2,3,4,6]\r\n */\r\nconst cloneDeep = (obj) => {\r\n let clone = {}\r\n\r\n if (obj === null) {\r\n return null\r\n }\r\n\r\n if (isArray(obj)) {\r\n clone = Array.from(obj)\r\n } else {\r\n clone = Object.assign({}, obj)\r\n Object.keys(clone).forEach((key) => {\r\n return (clone[key] = isObject(obj[key]) ? cloneDeep(obj[key]) : obj[key])\r\n })\r\n }\r\n\r\n return clone\r\n}\r\n\r\nexport default cloneDeep\r\n","/**\r\n * 检测数据是否为 String 类型\r\n * ========================================================================\r\n * @method isArray\r\n * @param {*} str\r\n * @returns {boolean}\r\n */\r\nconst isString = (str) => {\r\n return typeof str === 'string'\r\n}\r\n\r\nexport default isString\r\n","import isObject from './isObject'\r\n\r\n/**\r\n * 检测数据是否为 HTMLElement DOM 节点\r\n * ========================================================================\r\n * @method isElement\r\n * @param {*} o\r\n * @returns {boolean}\r\n */\r\nconst isElement = (o) => {\r\n return !!(isObject(o) && o.nodeName && o.tagName && o.nodeType === 1)\r\n}\r\n\r\nexport default isElement\r\n","import isElement from '../types/isElement'\r\n/**\r\n * 检测 DOM 节点是否包含名为 className 的样式\r\n * ========================================================================\r\n * @method hasClass\r\n * @param {HTMLElement} el - DOM 节点\r\n * @param {String} className - 样式名称\r\n * @returns {Boolean}\r\n */\r\nconst hasClass = (el, className) => {\r\n const pattern = new RegExp('(\\\\s|^)' + className + '(\\\\s|$)')\r\n let allClass\r\n let classList\r\n\r\n if (!isElement(el)) {\r\n return false\r\n }\r\n\r\n allClass = el.className\r\n\r\n if (!allClass) {\r\n return false\r\n }\r\n\r\n classList = el.classList\r\n\r\n if (classList && classList.contains) {\r\n return el.classList.contains(className)\r\n }\r\n\r\n return !!pattern.exec(allClass)\r\n}\r\n\r\nexport default hasClass\r\n","import hasClass from './hasClass'\r\n\r\n/**\r\n * 给 DOM 节点添加名为 className 的样式\r\n * ========================================================================\r\n * @method addClass\r\n * @param {HTMLElement} el - DOM 节点\r\n * @param {String} className - 样式名称\r\n * @returns {Boolean}\r\n */\r\nconst addClass = (el, className) => {\r\n let classList\r\n let allClass\r\n\r\n if (hasClass(el, className)) {\r\n return false\r\n }\r\n\r\n classList = el.classList\r\n\r\n if (classList?.add) {\r\n if (className.indexOf(' ') > -1) {\r\n className.split(' ').forEach((name) => {\r\n classList.add(name)\r\n })\r\n } else {\r\n classList.add(className)\r\n }\r\n } else {\r\n allClass = el.className\r\n allClass += allClass.length > 0 ? ' ' + className : className\r\n el.className = allClass\r\n }\r\n}\r\n\r\nexport default addClass\r\n","/**\r\n * 返回给定值的平方值\r\n * ========================================================================\r\n * @method easeInQuad\r\n * @param {Number} x\r\n * @returns {number}\r\n */\r\nconst easeInQuad = (x) => {\r\n return x * x\r\n}\r\n\r\nexport default easeInQuad\r\n","import isString from '../types/isString'\r\nimport isElement from '../types/isElement'\r\n\r\n/**\r\n * 通过给的 scrollElement 参数,获取滚动 DOM 元素\r\n * ========================================================================\r\n * @method _getScrollElement\r\n * @param {String|HTMLElement} scrollElement\r\n * @returns {Element}\r\n * @private\r\n */\r\nconst _getScrollElement = (scrollElement = null) => {\r\n let $rootElements\r\n let $scrollElement\r\n\r\n if (!scrollElement) {\r\n $rootElements = document.querySelectorAll('html,body')\r\n $scrollElement =\r\n $rootElements[0].scrollTop - $rootElements[1].scrollTop >= 0\r\n ? $rootElements[0]\r\n : $rootElements[1]\r\n } else {\r\n if (isString(scrollElement)) {\r\n $scrollElement = document.querySelector(scrollElement)\r\n } else if (isElement(scrollElement)) {\r\n $scrollElement = scrollElement\r\n }\r\n }\r\n\r\n return $scrollElement\r\n}\r\n\r\nexport default _getScrollElement\r\n","import easeInQuad from '../lang/easeInQuad'\r\nimport isFunction from '../types/isFunction'\r\nimport _getScrollElement from './_getScrollElement'\r\n\r\n/**\r\n * 指定 rootElement DOM 节点滚动到指定 top 位置\r\n * ========================================================================\r\n * @method scrollTo\r\n * @param {HTMLElement|Object} [scrollElement] - (必须)要滚动的 DOM 节点\r\n * @param {Number} top - (必须)滚动的 scrollTop 数值\r\n * @param {Function} [afterStop] - (可选)滚动完成的回调函数\r\n */\r\nconst scrollTo = (scrollElement, top, afterStop) => {\r\n const $scrollElement = _getScrollElement(scrollElement)\r\n let scrollTop = $scrollElement.scrollTop\r\n let step = 0\r\n const distance = top - scrollTop\r\n const MAX_HEIGHT = $scrollElement.scrollHeight\r\n const MAX_TOP = top - MAX_HEIGHT <= 0 ? top : MAX_HEIGHT\r\n const stop = (top) => {\r\n if (isFunction(afterStop)) {\r\n afterStop(top)\r\n }\r\n\r\n return false\r\n }\r\n const play = () => {\r\n step += 1\r\n\r\n // 向上滚动\r\n if (distance < 0) {\r\n scrollTop -= easeInQuad(step)\r\n $scrollElement.scrollTop = scrollTop\r\n\r\n console.log(\r\n '$scrollElement up',\r\n scrollElement,\r\n $scrollElement,\r\n scrollTop,\r\n $scrollElement.scrollTop\r\n )\r\n\r\n if (scrollTop <= top) {\r\n $scrollElement.scrollTop = top\r\n return stop(top)\r\n }\r\n } else {\r\n scrollTop += easeInQuad(step)\r\n $scrollElement.scrollTop = scrollTop\r\n\r\n console.log(\r\n '$scrollElement down',\r\n scrollElement,\r\n $scrollElement,\r\n scrollTop,\r\n $scrollElement.scrollTop\r\n )\r\n\r\n if (scrollTop >= MAX_TOP) {\r\n $scrollElement.scrollTop = MAX_TOP\r\n return stop(MAX_TOP)\r\n }\r\n }\r\n\r\n // eslint-disable-next-line compat/compat\r\n requestAnimationFrame(play)\r\n }\r\n\r\n // eslint-disable-next-line compat/compat\r\n requestAnimationFrame(play)\r\n}\r\n\r\nexport default scrollTo\r\n","import isString from '../types/isString'\r\n\r\n/**\r\n * 清楚字符串起始位置所有的空格\r\n * ========================================================================\r\n * @method trim\r\n * @param {string} str\r\n * @returns {string|Boolean}\r\n */\r\nconst trim = (str) => {\r\n if (!isString(str)) {\r\n return false\r\n }\r\n return str.replace(/(^\\s+)|(\\s+$)/g, '')\r\n}\r\n\r\nexport default trim\r\n","import trim from './utils/lang/trim'\r\nimport stripTags from './utils/lang/stripTags'\r\nimport isFunction from './utils/types/isFunction'\r\n\r\nimport _getChapterParentIdByDiffer from './_getChapterParentIdByDiffer'\r\nimport _getChaptersWithCode from './_getChaptersWithCode'\r\n\r\n/**\r\n * 根据文章中的 h1~h6 标签,自动分析返回文章章节数据\r\n * ========================================================================\r\n * @method getChaptersByHeadings\r\n * @param {Array} headings\r\n * @param {Boolean} [showCode]\r\n * @param {Function} [chapterTextFilter]\r\n * @return {*|*[]}\r\n */\r\nconst getChaptersByHeadings = (\r\n headings,\r\n showCode = false,\r\n chapterTextFilter = null\r\n) => {\r\n const pattern = /^\\d(\\.|(\\.\\d+)*)\\s?/gi\r\n const chapters = []\r\n let previous = 1\r\n let level = 0\r\n let text = ''\r\n\r\n headings.forEach((heading, i) => {\r\n const tagName = heading.tagName\r\n const headingLevel = tagName.replace(/h/i, '')\r\n let current = parseInt(headingLevel, 10)\r\n let pid = -1\r\n\r\n // 场景1:当前标题是前一个标题的子标题\r\n // 当前标题的(标题标签)序号 > 前一个标题的序号:两个相连的标题是父标题 -> 子标题关系;\r\n // h2 (前一个标题)\r\n // h3 (当前标题)\r\n if (current > previous) {\r\n level += 1\r\n\r\n // 第一层级的 pid 是 -1\r\n if (level === 1) {\r\n pid = -1\r\n } else {\r\n pid = i - 1\r\n }\r\n }\r\n // 场景2:当前标题和前一个标题层级相同\r\n // 当前标题的(标题标签)序号 = 前一个标题的序号\r\n // h2 (前一个标题)\r\n // h2 (当前标题)\r\n // 当前标题的(标题标签)序号 < 前一个标题的序号,并且当前标题序号 > 当前的级别\r\n // h2\r\n // h4 (前一个标题)\r\n // h3 (当前标题:这种情况我们还是任务 h3 是 h2 的下一级章节)\r\n else if (current === previous || (current < previous && current > level)) {\r\n // H1 的层级肯定是 1\r\n if (current === 1) {\r\n level = 1\r\n pid = -1\r\n } else {\r\n pid = chapters[i - 1].pid\r\n }\r\n }\r\n // 场景3:当前标题比前一个标题层级高\r\n else if (current <= level) {\r\n // H1 的层级肯定是 1\r\n if (current === 1) {\r\n level = 1\r\n } else {\r\n level = level - (previous - current)\r\n\r\n if (level <= 1) {\r\n level = 1\r\n }\r\n }\r\n\r\n // 第一级的标题\r\n if (level === 1) {\r\n pid = -1\r\n } else {\r\n // 通过当前标题和前一个标题之间的等级差,获得当前标题的父标题ID\r\n pid = _getChapterParentIdByDiffer(chapters, previous - current, i)\r\n }\r\n }\r\n\r\n previous = current\r\n\r\n text = trim(stripTags(heading.innerHTML))\r\n\r\n // 如果自动生成章节编号,则去掉标题中自带的编号文本\r\n if (showCode) {\r\n text = trim(text.replace(pattern, ''))\r\n }\r\n\r\n if (isFunction(chapterTextFilter)) {\r\n text = chapterTextFilter(text)\r\n }\r\n\r\n chapters.push({\r\n id: i,\r\n pid: pid,\r\n level: level,\r\n rel: `heading-${i}`,\r\n text,\r\n tagName\r\n })\r\n })\r\n\r\n return showCode ? _getChaptersWithCode(chapters) : chapters\r\n}\r\n\r\nexport default getChaptersByHeadings\r\n","import isString from '../types/isString'\r\n\r\n/**\r\n * 过滤所有 HTML 标签\r\n * ========================================================================\r\n * @method stripTags\r\n * @param {string} str\r\n * @returns {string}\r\n */\r\nconst stripTags = (str) => {\r\n if (!isString(str)) {\r\n return ''\r\n }\r\n return str.replace(/<\\/?[^>]+(>|$)/g, '')\r\n}\r\n\r\nexport default stripTags\r\n","const _getChapterParentIdByDiffer = (chapters, differ, index) => {\r\n let previous = chapters[index - 1]\r\n let pid\r\n let i\r\n\r\n for (i = 0; i < differ; i += 1) {\r\n pid = previous.pid\r\n previous = chapters[pid]\r\n }\r\n\r\n pid = previous.pid\r\n\r\n return pid\r\n}\r\n\r\nexport default _getChapterParentIdByDiffer\r\n","import isArray from './utils/types/isArray'\r\n\r\nconst _getChaptersWithCode = (chapters) => {\r\n const groups = {}\r\n const cb = (o) => {\r\n return [o.pid]\r\n }\r\n\r\n chapters.forEach((o) => {\r\n const group = JSON.stringify(cb(o))\r\n\r\n groups[group] = groups[group] || []\r\n groups[group].push(o)\r\n\r\n o.index = groups[group].length\r\n\r\n if (o.pid === -1) {\r\n o.code = String(o.index)\r\n }\r\n })\r\n\r\n Object.keys(groups).forEach((group) => {\r\n groups[group].forEach((c) => {\r\n const subjects = groups[`[${c.id}]`]\r\n\r\n if (!subjects || !isArray(subjects)) {\r\n return false\r\n }\r\n\r\n subjects.forEach((o) => {\r\n o.code = c.code + '.' + o.index\r\n })\r\n })\r\n })\r\n\r\n return chapters\r\n}\r\n\r\nexport default _getChaptersWithCode\r\n","import isString from './utils/types/isString'\r\nimport isFunction from './utils/types/isFunction'\r\nimport isElement from './utils/types/isElement'\r\nimport toTree from './utils/lang/toTree'\r\n\r\nimport getChaptersByHeadings from './getChaptersByHeadings'\r\n\r\n/**\r\n *\r\n * @param {Object} [options]\r\n * @param {String|HTMLElement} [options.articleElement]\r\n * @param {String} [options.selector]\r\n * @param {Boolean} [options.showCode]\r\n * @param {Function} [options.chapterTextFilter]\r\n * @param {Boolean} [options.isTreeStructured]\r\n * @returns {Array}\r\n */\r\nconst getChapters = (options) => {\r\n const {\r\n articleElement,\r\n selector,\r\n showCode,\r\n chapterTextFilter,\r\n isTreeStructured\r\n } = options\r\n let $article = document.querySelector('#article')\r\n let $headings = []\r\n let chapters = []\r\n let filter = null\r\n\r\n if (isString(articleElement)) {\r\n $article = document.querySelector(articleElement)\r\n } else if (isElement(articleElement)) {\r\n $article = articleElement\r\n }\r\n\r\n if (!$article) {\r\n return chapters\r\n }\r\n\r\n if (isFunction(chapterTextFilter)) {\r\n filter = chapterTextFilter\r\n } else {\r\n if (chapterTextFilter === true) {\r\n filter = (text) => {\r\n return text.replace(/\\(.*?\\)/, '()')\r\n }\r\n }\r\n }\r\n\r\n $headings = [...$article.querySelectorAll(selector || 'h1,h2,h3,h4,h5,h6')]\r\n chapters = getChaptersByHeadings($headings, showCode, filter)\r\n\r\n return isTreeStructured === true ? toTree(chapters, 'id', 'pid') : chapters\r\n}\r\n\r\nexport default getChapters\r\n","const toTree = (list, nodeKey, parentKey) => {\r\n const map = {}\r\n const roots = []\r\n\r\n list.forEach((item, i) => {\r\n // initialize the map\r\n map[item[nodeKey]] = i\r\n // initialize the children\r\n item.children = []\r\n })\r\n\r\n list.forEach((item) => {\r\n const node = list[map[item[parentKey]]]\r\n\r\n if (item[parentKey] !== -1) {\r\n // if you have dangling branches check that map[node.parentId] exists\r\n node.children.push(item)\r\n } else {\r\n roots.push(item)\r\n }\r\n })\r\n\r\n return roots\r\n}\r\n\r\nexport default toTree\r\n","/**\r\n * 检测对象自身属性中是否具有指定的属性。\r\n * ========================================================================\r\n * @method hasOwn\r\n * @param {Object} obj - (必须)检测的目标对象\r\n * @param {String} prop - (必须)属性名\r\n * @returns {Boolean}\r\n */\r\nconst hasOwn = (obj, prop) => {\r\n const hasOwnProperty = Object.prototype.hasOwnProperty\r\n return obj && hasOwnProperty.call(obj, prop)\r\n}\r\n\r\nexport default hasOwn\r\n","import hasOwn from './hasOwn'\r\n\r\n/**\r\n * 扩展对象\r\n * ========================================================================\r\n * @method extend\r\n * @param {Object} origin\r\n * @param {Object} source\r\n */\r\nconst extend = (origin, source) => {\r\n const keys = Object.keys(source)\r\n\r\n keys.forEach((prop) => {\r\n if (hasOwn(source, prop)) {\r\n origin[prop] = source[prop]\r\n }\r\n })\r\n}\r\n\r\nexport default extend\r\n","/**\r\n * 存储订阅者(主题和处理器的)私有对象\r\n * ========================================================================\r\n * @type {{}}\r\n * @private\r\n */\r\nconst _subscribers = {}\r\n\r\nexport default _subscribers\r\n","import _subscribers from './_subscribers'\r\nimport hasOwn from '../lang/hasOwn'\r\n\r\n/**\r\n * 判断是否存在与给定 topic 完全匹配的订阅者信息\r\n * ========================================================================\r\n * @method _hasDirectSubscribersFor\r\n * @param {String} topic - (必须)订阅主题字符串\r\n * @returns {Boolean}\r\n */\r\nconst _hasDirectSubscribersFor = (topic) => {\r\n return hasOwn(_subscribers, topic) && _subscribers[topic].length > 0\r\n}\r\n\r\nexport default _hasDirectSubscribersFor\r\n","import _hasDirectSubscribersFor from './_hasDirectSubscribersFor'\r\nimport _hasSubscribers from './_hasSubscribers'\r\n\r\n/**\r\n * 判断是否存在包含 topic 指定的订阅者信息\r\n * ========================================================================\r\n * @method has\r\n * @param {String} topic - (必须)主题名称\r\n * @param {Boolean} [isDirect] - (可选)是否为直接的主题,默认值:true\r\n * @returns {Boolean}\r\n */\r\nconst has = (topic, isDirect = true) => {\r\n return isDirect ? _hasDirectSubscribersFor(topic) : _hasSubscribers(topic)\r\n}\r\n\r\nexport default has\r\n","import _hasDirectSubscribersFor from './_hasDirectSubscribersFor'\r\n\r\n/**\r\n * 判断是否存在包含给定 topic 相关的订阅者信息\r\n * ========================================================================\r\n * @method _hasSubscribers\r\n * @param {String} topic - (必须)订阅主题字符串\r\n * @returns {Boolean}\r\n */\r\nconst _hasSubscribers = (topic) => {\r\n let found = _hasDirectSubscribersFor(topic)\r\n let position = topic.lastIndexOf('.')\r\n\r\n while (!found && position !== -1) {\r\n topic = topic.substring(0, position)\r\n position = topic.lastIndexOf('.')\r\n found = _hasDirectSubscribersFor(topic)\r\n }\r\n\r\n return found\r\n}\r\n\r\nexport default _hasSubscribers\r\n","import isTypedArray from '../types/isTypedArray'\r\nimport _subscribers from './_subscribers'\r\nimport has from './has'\r\nimport _hasDirectSubscribersFor from './_hasDirectSubscribersFor'\r\n\r\n/**\r\n * (异步)发布订阅主题信息\r\n * ========================================================================\r\n * 主题默认是异步发布的。确保在消费者处理主题时,主题的发起者不会被阻止。\r\n * ========================================================================\r\n * @method emit\r\n * @param {String} topic - (必须)主题名称\r\n * @param {Object} [data] - (可选)数据对象\r\n * @param {Boolean} [async] - (可选) 是否异步发布\r\n */\r\nconst emit = (topic, data, async = true) => {\r\n const execute = (topic) => {\r\n if (!_hasDirectSubscribersFor(topic)) {\r\n return false\r\n }\r\n\r\n _subscribers[topic].forEach((subscriber) => {\r\n // 针对 mqtt 消息服务返回的 Uint8Array 类似的 typed arrays 格式的数据\r\n // 采用 toString() 方法转化为普通(JSON)字符串\r\n const message = isTypedArray(data) ? data.toString() : data\r\n\r\n subscriber.callback.call(subscriber.context || subscriber, message)\r\n })\r\n }\r\n const deliver = () => {\r\n let subscriber = topic\r\n let position = topic.lastIndexOf('.')\r\n\r\n while (position !== -1) {\r\n subscriber = subscriber.substring(0, position)\r\n position = subscriber.lastIndexOf('.')\r\n\r\n execute(subscriber)\r\n }\r\n\r\n // 执行 topic 对应的处理器\r\n execute(topic)\r\n // 执行特殊 topic:'*'(监听全部消息的发布)\r\n execute('*')\r\n }\r\n\r\n if (!has(topic)) {\r\n return false\r\n }\r\n\r\n if (async) {\r\n setTimeout(deliver, 10)\r\n } else {\r\n deliver()\r\n }\r\n}\r\n\r\nexport default emit\r\n","import toString from '../lang/toString'\r\n/**\r\n * 判断检测数据是否为 Typed Arrays 类型的数据\r\n * ========================================================================\r\n * @param {*} val\r\n * @returns {boolean}\r\n */\r\nconst isTypedArray = (val) => {\r\n const TYPES = [\r\n '[object Int8Array]',\r\n '[object Uint8Array]',\r\n '[object Uint8ClampedArray]',\r\n '[object Int16Array]',\r\n '[object Uint16Array]',\r\n '[object Int32Array]',\r\n '[object Uint32Array]',\r\n '[object Float32Array]',\r\n '[object Float64Array]',\r\n '[object BigInt64Array]',\r\n '[object BigUint64Array]'\r\n ]\r\n\r\n return TYPES.indexOf(toString(val)) > -1\r\n}\r\n\r\nexport default isTypedArray\r\n","/**\r\n * 生成唯一 id 字符串的函数\r\n * ========================================================================\r\n * @method guid\r\n * @param {String} [prefix] - 生成 id 的前缀字符串\r\n * @return {String} 返回一个表示唯一 id 的字符串\r\n */\r\nconst guid = (() => {\r\n let uuid = 0\r\n\r\n return (prefix) => {\r\n uuid += 1\r\n\r\n return prefix ? prefix + '-' + uuid : 'guid-' + uuid\r\n }\r\n})()\r\n\r\nexport default guid\r\n","import _subscribers from './_subscribers'\r\nimport hasOwn from '../lang/hasOwn'\r\n\r\n/**\r\n * 删除与给定 topic 相同的订阅者信息\r\n * ========================================================================\r\n * @method _removeSubscriber\r\n * @param {String} topic - (必须)订阅主题字符串\r\n * @returns {Boolean}\r\n */\r\nconst _removeSubscriber = (topic) => {\r\n if (!hasOwn(_subscribers, topic)) {\r\n return false\r\n }\r\n\r\n delete _subscribers[topic]\r\n}\r\n\r\nexport default _removeSubscriber\r\n","import has from './has'\r\nimport _removeSubscriber from './_removeSubscriber'\r\nimport _removeSubscriberByToken from './_removeSubscriberByToken'\r\n\r\n/**\r\n * 取消订阅主题\r\n * ========================================================================\r\n * @method off\r\n * @param {String} topic - (必须)订阅的主题\r\n * @param {Function|String} [token] - (可选)订阅主题的处理器函数或者唯一 Id 值\r\n */\r\nconst off = (topic, token) => {\r\n if (!has(topic)) {\r\n return false\r\n }\r\n\r\n if (token) {\r\n _removeSubscriberByToken(token)\r\n } else {\r\n _removeSubscriber(topic)\r\n }\r\n}\r\n\r\nexport default off\r\n","import _subscribers from './_subscribers'\r\nimport _removeSubscriber from './_removeSubscriber'\r\n\r\n/**\r\n * 通过订阅者 token 值删除订阅者信息\r\n * ========================================================================\r\n * @method _removeSubscriberByToken\r\n * @param {String} token - 订阅者 token 字符串\r\n * @returns {boolean}\r\n * @private\r\n */\r\nconst _removeSubscriberByToken = (token) => {\r\n const keys = Object.keys(_subscribers)\r\n let index = -1\r\n\r\n if (!token || keys.length < 1) {\r\n return false\r\n }\r\n\r\n keys.forEach((subject) => {\r\n const subscriber = _subscribers[subject]\r\n let topic\r\n\r\n subscriber.forEach((execution, j) => {\r\n if (execution.callback === token || execution.token === token) {\r\n topic = execution.topic\r\n subscriber.splice(index, j)\r\n }\r\n })\r\n\r\n /* istanbul ignore else */\r\n if (subscriber.length < 1) {\r\n _removeSubscriber(topic)\r\n }\r\n })\r\n}\r\n\r\nexport default _removeSubscriberByToken\r\n","import isString from './utils/types/isString'\r\nimport hasOwn from './utils/lang/hasOwn'\r\nimport isObject from './utils/types/isObject'\r\nimport extend from './utils/lang/extend'\r\nimport publish from './utils/observer/emit'\r\nimport subscribe from './utils/observer/on'\r\nimport unsubscribe from './utils/observer/off'\r\n\r\nclass Base {\r\n constructor(options) {\r\n this.attrs = {}\r\n\r\n if (options) {\r\n this.initialize(options)\r\n }\r\n }\r\n\r\n initialize(options) {\r\n this.attr(options).render().addListeners()\r\n return this\r\n }\r\n\r\n attr(prop, value) {\r\n const attrs = this.attrs\r\n\r\n if (isString(prop)) {\r\n // 只能扩展 attrs 中已有的属性\r\n if (value && hasOwn(attrs, prop)) {\r\n // 更新单个配置信息\r\n attrs[prop] = value\r\n return this\r\n }\r\n\r\n // 只传递 prop 参数,则返回对应的属性值\r\n return attrs[prop]\r\n } else if (isObject(prop)) {\r\n // 批量更新配置信息\r\n extend(attrs, prop)\r\n\r\n return this\r\n } else if (arguments.length === 0) {\r\n // 不传递参数,直接返回整个\r\n return attrs\r\n }\r\n\r\n return this\r\n }\r\n\r\n render() {\r\n return this\r\n }\r\n\r\n refresh() {\r\n return this\r\n }\r\n\r\n destroy() {\r\n this.removeListeners()\r\n return this\r\n }\r\n\r\n reload(options) {\r\n let attrs = this.attr()\r\n\r\n if (options) {\r\n attrs = this.attr(options)\r\n }\r\n\r\n this.destroy().initialize(attrs)\r\n\r\n return this\r\n }\r\n\r\n $emit(event, data) {\r\n publish(event, data)\r\n return this\r\n }\r\n\r\n $on(event, callback) {\r\n subscribe(event, callback, this)\r\n return this\r\n }\r\n\r\n $off(event, callback) {\r\n unsubscribe(event, callback)\r\n return this\r\n }\r\n\r\n addListeners() {\r\n return this\r\n }\r\n\r\n removeListeners() {\r\n return this\r\n }\r\n}\r\n\r\nexport default Base\r\n","import _subscribers from './_subscribers'\r\nimport isFunction from '../types/isFunction'\r\nimport guid from '../lang/guid'\r\n\r\n/**\r\n * 订阅主题,并给出处理器函数\r\n * ========================================================================\r\n * @method on\r\n * @param {String} topic - (必须)主题名称\r\n * @param {Function} handler - (必须)主题的处理器函数\r\n * @param {Object} [context] - (可选)指定 this 执行上下文\r\n * @return {String} - 唯一的 token 字符串,例如:'guid-1'。\r\n */\r\nconst on = (topic, handler, context = null) => {\r\n const token = guid()\r\n let subject = typeof topic === 'symbol' ? topic.toString() : topic\r\n\r\n if (!isFunction(handler)) {\r\n return ''\r\n }\r\n\r\n /* istanbul ignore else */\r\n if (!_subscribers[subject]) {\r\n _subscribers[subject] = []\r\n }\r\n\r\n _subscribers[subject].push({\r\n topic: subject,\r\n callback: handler,\r\n context,\r\n token\r\n })\r\n\r\n return token\r\n}\r\n\r\nexport default on\r\n","/**\r\n * timeSlice.js 时间切片功能函数\r\n * ====================================================\r\n * Created By: Yaohaixiao\r\n * Update: 2023.09.04\r\n */\r\nimport isFunction from '../types/isFunction'\r\nimport later from './later'\r\n\r\nconst queue = []\r\nlet isHandling\r\nlet done\r\n\r\n// Shim from https://developers.google.com/web/updates/2015/08/using-requestidlecallback\r\nif (typeof window.requestIdleCallback === 'undefined') {\r\n window.requestIdleCallback = function (cb) {\r\n const start = Date.now()\r\n return later(function () {\r\n cb({\r\n didTimeout: false,\r\n timeRemaining: function () {\r\n return Math.max(0, 50 - (Date.now() - start))\r\n }\r\n })\r\n }, 10)\r\n }\r\n\r\n window.cancelIdleCallback = function (id) {\r\n clearTimeout(id)\r\n }\r\n}\r\n\r\nfunction runIdle(idleDeadline) {\r\n while (idleDeadline.timeRemaining() > 0 && queue.length) {\r\n const fn = queue.shift()\r\n\r\n if (!isFunction(fn)) {\r\n return false\r\n }\r\n\r\n fn()\r\n }\r\n\r\n if (queue.length) {\r\n isHandling = requestIdleCallback(runIdle)\r\n } else {\r\n isHandling = 0\r\n\r\n if (isFunction(done)) {\r\n done()\r\n done = null\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * 时间切片功能函数:主要用于优化长时任务的性能,将长时任务分解成\r\n * 多个短时间任务\r\n * ====================================================\r\n * @param {Function} fn - 需要在空闲时执行的回调函数\r\n * @param {Function} afterComplete - queen 的\r\n * @return {(function(): (boolean|undefined))|*|boolean}\r\n */\r\nconst timeSlice = (fn, afterComplete = null) => {\r\n queue.push(fn)\r\n\r\n if (isFunction(afterComplete)) {\r\n done = afterComplete\r\n }\r\n\r\n if (!isHandling) {\r\n requestIdleCallback(runIdle)\r\n }\r\n}\r\n\r\nexport default timeSlice\r\n","/**\r\n * 获取 DOM 节点相对于窗口的 left (纵坐标)值\r\n * ========================================================================\r\n * @method offsetTop\r\n * @param {HTMLElement} el - DOM 节点\r\n * @returns {Number}\r\n */\r\nconst offsetTop = (el) => {\r\n let top = el.offsetTop\r\n\r\n if (el.offsetParent !== null) {\r\n top += offsetTop(el.offsetParent)\r\n }\r\n\r\n return top\r\n}\r\n\r\nexport default offsetTop\r\n","/**\r\n * 获取 options 节点下匹配 selector 选择器的 DOM 节点\r\n * ========================================================================\r\n * Element.matches() 方法可以用来判断 DOM 元素是否与给定的选择器匹配,事件代理判断是\r\n * 否触发绑定的代理事件回调函数,关键就是使用 Element.matches() 辨别当前事件触发的目\r\n * 标 DOM 元素是否为事件代理所期望触发的目标。\r\n * ========================================================================\r\n * @method matches\r\n * @see https://developer.mozilla.org/en-US/docs/web/api/element/matches\r\n * @param {HTMLElement} el - (必须)DOM 元素\r\n * @param {String} selector - (必须)匹配 DOM 元素的选择器\r\n * @returns {Boolean}\r\n */\r\nconst matches = (el, selector = '') => {\r\n const sel = selector.replace(/^>/i, '')\r\n\r\n if (!selector || !sel || !el) {\r\n return false\r\n }\r\n\r\n /* istanbul ignore else */\r\n if (el.matches) {\r\n return el.matches(sel)\r\n } else if (el.msMatchesSelector) {\r\n return el.msMatchesSelector(sel)\r\n } else {\r\n return false\r\n }\r\n}\r\n\r\nexport default matches\r\n","/**\r\n * 获取 DOM 元素的父节点\r\n * ========================================================================\r\n * @method getParentOrHost\r\n * @param {*|HTMLElement} el - (必须)要获取父节点的 DOM 元素\r\n * @returns {*|HTMLElement}\r\n */\r\nconst getParentOrHost = (el) => {\r\n return el.host && el !== document && el.host.nodeType\r\n ? el.host\r\n : el.parentNode\r\n}\r\n\r\nexport default getParentOrHost\r\n","export const CAPTURE_EVENTS = [\r\n 'focusout',\r\n 'blur',\r\n 'focusin',\r\n 'focus',\r\n 'load',\r\n 'unload',\r\n 'mouseenter',\r\n 'mouseleave'\r\n]\r\n","import { CAPTURE_EVENTS } from './enum'\r\nimport _delete from './_delete'\r\n\r\n/**\r\n * (私有方法)取消 type 类型的代理事件绑定\r\n * ========================================================================\r\n * 如果没有设置 handler,则销毁 this.$options 绑定的所有符合 type 事件类型的事件绑定\r\n * ========================================================================\r\n * @method _off\r\n * @param {HTMLElement} el - (必须)取消事件绑定的 DOM 元素\r\n * @param {String} type - (必须)事件类型\r\n * @param {Function} fn - (必须)事件处理器回调函数\r\n * @private\r\n */\r\nconst _off = (el, type, fn) => {\r\n const capture = CAPTURE_EVENTS.indexOf(type) > -1\r\n\r\n /* istanbul ignore else */\r\n if (fn._delegateListener) {\r\n fn = fn._delegateListener\r\n delete fn._delegateListener\r\n }\r\n\r\n // 移除缓存的 _listeners 数据\r\n _delete(el, type, fn)\r\n\r\n el.removeEventListener(type, fn, capture)\r\n}\r\n\r\nexport default _off\r\n","/**\r\n * 删除 DOM 元素缓存的 _listeners 数据\r\n * ========================================================================\r\n * @method _delete\r\n * @param {HTMLElement} el - 要删除 listener 的 DOM 元素\r\n * @param {String} type - 事件类型(名称)\r\n * @param {Function} [fn] - 事件处理器回调函数\r\n */\r\nconst _delete = function (el, type, fn) {\r\n const listeners = el._listeners\r\n let index = -1\r\n\r\n if (listeners.length < 1) {\r\n return false\r\n }\r\n\r\n // 移除缓存的 _listeners 数据\r\n listeners.forEach((listener, i) => {\r\n const handler = listener.fn\r\n\r\n if (type === listener.type) {\r\n index = i\r\n\r\n if (handler === fn) {\r\n index = i\r\n }\r\n }\r\n })\r\n\r\n /* istanbul ignore else */\r\n if (index > -1) {\r\n listeners.splice(index, 1)\r\n }\r\n}\r\n\r\nexport default _delete\r\n","import isString from '../types/isString'\r\nimport isElement from '../types/isElement'\r\nimport getListeners from './getListeners'\r\nimport _off from './_off'\r\n\r\n/**\r\n * 销毁(type 类型的)代理事件绑定\r\n * ========================================================================\r\n * 1. 设置了事件类型 type,则销毁指定类型的事件绑定,否则清除所有代理事件绑定\r\n * 2. recurse 设置为 true,递归销毁子节点全部事件绑定\r\n * ========================================================================\r\n * @method purgeElement\r\n * @param {HTMLElement|String} el - (必须)DOM 元素或者其选择器\r\n * @param {String|Boolean} type - (必须)事件类型\r\n * @param {Boolean} [recurse] - (可选)是否递归销毁子节点所有事件绑定\r\n */\r\nconst purgeElement = function (el, type, recurse = false) {\r\n const $element = isString(el) ? document.querySelector(el) : el\r\n const $children = $element.childNodes\r\n const listeners = getListeners($element, type)\r\n\r\n listeners.forEach((listener) => {\r\n _off($element, listener.type, listener.fn)\r\n })\r\n\r\n if (\r\n (recurse || type === true || arguments.length === 1) &&\r\n $element &&\r\n $children\r\n ) {\r\n $children.forEach(($child) => {\r\n if (isElement($child)) {\r\n purgeElement($child, type, recurse)\r\n }\r\n })\r\n }\r\n}\r\n\r\nexport default purgeElement\r\n","import isString from '../types/isString'\r\n\r\n/**\r\n * 获取 DOM 元素(type 事件类型)事件绑定信息\r\n * ========================================================================\r\n * 如果设置了事件类型 type, 则返回指定类型的事件绑定信息,否则返回所有事件绑定信息\r\n * ========================================================================\r\n * @methods getListeners\r\n * @param {HTMLElement} el - (必须)要获取事件绑定信息的 DOM 元素\r\n * @param {String} [type] - (可选)事件类型\r\n * @returns {Array} - 已绑定的事件信息\r\n */\r\nconst getListeners = (el, type) => {\r\n let listeners = el._listeners || []\r\n\r\n if (isString(type) && type) {\r\n listeners = listeners.filter((listener) => {\r\n return listener.type === type\r\n })\r\n }\r\n\r\n return listeners\r\n}\r\n\r\nexport default getListeners\r\n","import purgeElement from './purgeElement'\r\nimport isFunction from '../types/isFunction'\r\nimport _off from './_off'\r\n\r\n/**\r\n * 取消 type 类型的代理事件绑定\r\n * ========================================================================\r\n * 如果没有设置 handler,则销毁 this.$options 绑定的所有符合 type 事件类型的事件绑定\r\n * ========================================================================\r\n * @method off\r\n * @param {HTMLElement|Object} el - (必须)取消事件绑定的 DOM 元素\r\n * @param {String} type - (必须)事件类型\r\n * @param {Function} [fn] - (可选)事件处理器回调函数\r\n */\r\nconst off = (el, type, fn) => {\r\n // 如果不设置 fn 参数,默认清除 el 元素上绑定的所有事件处理器\r\n if (!isFunction(fn)) {\r\n purgeElement(el, type)\r\n return false\r\n }\r\n\r\n _off(el, type, fn)\r\n}\r\n\r\nexport default off\r\n","import closest from '../dom/closest'\r\nimport off from './off'\r\nimport getTarget from './getTarget'\r\n\r\nimport { CAPTURE_EVENTS } from './enum'\r\n\r\n/**\r\n * 绑定代理事件\r\n * ========================================================================\r\n * @method on\r\n * @param {HTMLElement|String|Object} el - (必须)绑定代理事件的 DOM 节点\r\n * @param {String} selector - (必须)事件代理目标 DOM 元素的选择器\r\n * @param {String|Function} type - (必须)事件类型或者事件处理器回调函数\r\n * @param {Function|Object} fn - (可选) 事件处理器回调函数或者传递给事件处理器回调函数的数据对象\r\n * @param {Object|Boolean} [data] - (可选)传递给事件处理器回调函数的数据对象或者事件处理器回调函数的 this 上下文指向,\r\n * @param {Object|Boolean} [context] - (可选)事件处理器回调函数的 this 上下文指向,或者是否仅触发一次\r\n * 当设置为 true 时,则事件处理器回调函数的 this 上下文指向为 data 对象\r\n * @param {Boolean} once - (可选)是否仅触发一次\r\n */\r\nconst on = (el, selector, type, fn, data, context, once = false) => {\r\n // CAPTURE_EVENTS 中的特殊事件,采用事件捕获模型\r\n const capture = CAPTURE_EVENTS.indexOf(type) > -1\r\n\r\n const listener = function (evt) {\r\n const target = getTarget(evt)\r\n // 通过 Element.matches 方法获得点击的目标元素\r\n const delegateTarget = closest(target, selector, el)\r\n let overrideContext = context || el\r\n\r\n evt.delegateTarget = delegateTarget\r\n\r\n // 当设置为 true 时,则事件处理器回调函数的\r\n // this 上下文指向为 data 对象\r\n if (context === true) {\r\n overrideContext = data\r\n }\r\n\r\n /* istanbul ignore else */\r\n if (delegateTarget) {\r\n // 仅触发一次\r\n /* istanbul ignore else */\r\n if (once === true) {\r\n off(el, type, listener)\r\n }\r\n\r\n fn.call(overrideContext, evt, data)\r\n }\r\n }\r\n\r\n if (!el) {\r\n return false\r\n }\r\n\r\n if (!el._listeners) {\r\n el._listeners = []\r\n }\r\n\r\n // 缓存 options 元素绑定的事件处理器\r\n el._listeners.push({\r\n el,\r\n selector,\r\n type,\r\n fn: listener,\r\n data,\r\n context,\r\n capture\r\n })\r\n\r\n // 缓存包装后的事件处理器\r\n fn._delegateListener = listener\r\n\r\n el.addEventListener(type, listener, capture)\r\n}\r\n\r\nexport default on\r\n","import resolveTextNode from '../dom/resolveTextNode'\r\n\r\n/**\r\n * 返回触发事件的 target DOM 元素\r\n * ========================================================================\r\n * @method getTarget\r\n * @param {Event} evt - Event 对象\r\n * @return {HTMLElement} - Event 对象的 target DOM 元素\r\n */\r\nconst getTarget = function (evt) {\r\n const target = evt.target\r\n\r\n return resolveTextNode(target)\r\n}\r\n\r\nexport default getTarget\r\n","/**\r\n * 在某些情况下,某些浏览器(例如:Safari 浏览器)会返回实际的目标元素内部的文本节点。\r\n * resolveTextNode() 方法则会返回实际的目标节点。\r\n * ========================================================================\r\n * @method resolveTextNode\r\n * @param {HTMLElement|Text} el - 要解析的节点\r\n * @return {*|HTMLElement} - 实际的目标 DOM 节点\r\n */\r\nconst resolveTextNode = function (el) {\r\n if (el && el.nodeType === 3) {\r\n return el.parentNode\r\n }\r\n\r\n return el\r\n}\r\n\r\nexport default resolveTextNode\r\n","import matches from './matches'\r\nimport getParentOrHost from './getParentOrHost'\r\n\r\n/**\r\n * 获取 options 元素父元素最近的包含 selector 选择器的元素\r\n * ========================================================================\r\n * @method closest\r\n * @param {HTMLElement} el - (必须)DOM 元素\r\n * @param {String} selector - (必须)DOM 元素的选择其\r\n * @param {HTMLElement} [ctx] - (必须)比对的 DOM 元素\r\n * @param {Boolean} [includeCTX] - (必须)是否包含 context DOM 元素\r\n * @returns {null|HTMLElement} - 返回最接近的 DOM 元素\r\n */\r\nconst closest = (el, selector, ctx, includeCTX) => {\r\n const context = ctx || document\r\n\r\n if (!el) {\r\n return null\r\n }\r\n\r\n do {\r\n /* istanbul ignore else */\r\n if (\r\n (selector != null &&\r\n (selector.startsWith('>')\r\n ? el.parentNode === context && matches(el, selector)\r\n : matches(el, selector))) ||\r\n (includeCTX && el === context)\r\n ) {\r\n return el\r\n }\r\n\r\n /* istanbul ignore else */\r\n if (el === context) {\r\n break\r\n }\r\n\r\n /* jshint boss:true */\r\n } while ((el = getParentOrHost(el)))\r\n}\r\n\r\nexport default closest\r\n","/**\r\n * 停止事件(阻止默认行为和阻止事件的捕获或冒泡)\r\n * ========================================================================\r\n * @method stop\r\n * @param {Event} evt - 事件对象\r\n *\r\n * @example\r\n *
\r\n * Service\r\n * Help\r\n *
\r\n *\r\n * const $nav = document.querySelector('#nav')\r\n * const $service = document.querySelector('.anchor')\r\n *\r\n * on($nav, 'click', function(evt) {\r\n * console.log('你点击了导航栏')\r\n * })\r\n *\r\n * on($anchor, 'click', function(evt) {\r\n * console.log('tagName', this.tagName)\r\n *\r\n * // 工作台输出:'a'\r\n * // 不会触发事件冒泡,输出:'你点击了导航栏'\r\n * // 也不会切换到 href 属性的页面,阻止了点击链接的默认行为\r\n * stopEvent(evt)\r\n * })\r\n */\r\nconst stop = function (evt) {\r\n evt.stopPropagation()\r\n evt.preventDefault()\r\n}\r\n\r\nexport default stop\r\n","import DEFAULTS from './defaults'\r\n\r\nconst SYMBOLS = [...DEFAULTS]\r\n\r\nexport default SYMBOLS\r\n","const DEFAULTS = [\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n ''\r\n]\r\n\r\nexport default DEFAULTS\r\n","import isString from '../types/isString'\r\nimport getSymbol from './getSymbol'\r\nimport SYMBOLS from './symbols'\r\n\r\n/**\r\n *\r\n * @method getSymbols\r\n * @param {String} [name]\r\n * @param {String} [iconSet]\r\n * @returns {string[]|*}\r\n */\r\nconst getSymbols = (name, iconSet = 'icon') => {\r\n if (isString(name)) {\r\n return getSymbol(name, iconSet)\r\n }\r\n\r\n return [...SYMBOLS]\r\n}\r\n\r\nexport default getSymbols\r\n","import SYMBOLS from './symbols'\r\n\r\n/**\r\n * @method getSymbol\r\n * @param {String} name\r\n * @param {String} [iconSet]\r\n * @returns {String}\r\n */\r\nconst getSymbol = (name, iconSet = 'icon') => {\r\n const patternName = /id=\"(.*?)\"/\r\n const patternSet = /^(\\w+)-/\r\n const symbols = SYMBOLS\r\n\r\n return symbols.find((symbol) => {\r\n const names = patternName.exec(symbol)\r\n const fullName = names[1]\r\n const sets = patternSet.exec(fullName)\r\n const setName = sets[1]\r\n const iconName =\r\n iconSet === 'icon' ? `${iconSet}-${name}` : `${iconSet}-icon-${name}`\r\n\r\n return setName === iconSet && fullName === iconName\r\n })\r\n}\r\n\r\nexport default getSymbol\r\n","import add from './add'\r\nimport getSymbols from './getSymbols'\r\n\r\n/**\r\n * 绘制 SVG 图标集\r\n * ========================================================================\r\n * @method paint\r\n * @param {String|Array} symbol\r\n */\r\nconst paint = (symbol = '') => {\r\n const $body = document.body\r\n let $icons = document.querySelector('#outline-icons')\r\n let symbols = []\r\n\r\n add(symbol)\r\n symbols = getSymbols()\r\n\r\n if ($icons) {\r\n $icons.innerHTML = symbols.join('')\r\n } else {\r\n $icons = document.createElement('div')\r\n $icons.innerHTML =\r\n ``\r\n $body.insertBefore($icons.firstChild, $body.firstChild)\r\n }\r\n}\r\n\r\nexport default paint\r\n","import isArray from '../types/isArray'\r\nimport isString from '../types/isString'\r\nimport SYMBOLS from './symbols'\r\n\r\n/**\r\n * @method add\r\n * @param {Array|String} symbols\r\n * @return {Boolean}\r\n */\r\nconst add = (symbols) => {\r\n if (!symbols) {\r\n return false\r\n }\r\n\r\n if (isArray(symbols) && symbols.length > 0) {\r\n symbols.forEach((symbol) => {\r\n /* istanbul ignore else */\r\n if (SYMBOLS.indexOf(symbol) === -1 && isString(symbol)) {\r\n SYMBOLS.push(symbol)\r\n }\r\n })\r\n } else {\r\n /* istanbul ignore else */\r\n if (isString(symbols)) {\r\n SYMBOLS.push(symbols)\r\n }\r\n }\r\n}\r\n\r\nexport default add\r\n","import isObject from './isObject'\r\nimport isElement from './isElement'\r\nimport isHTMLCollection from './isHTMLCollection'\r\nimport isFragment from './isFragment'\r\nimport isTextNode from './isTextNode'\r\n\r\nconst isDOM = (el) => {\r\n return !!(\r\n isObject(el) &&\r\n (isElement(el) || isHTMLCollection(el) || isFragment(el) || isTextNode(el))\r\n )\r\n}\r\n\r\nexport default isDOM\r\n","import toString from '../lang/toString'\r\nimport isObject from './isObject'\r\n\r\nconst isHTMLCollection = (el) => {\r\n return !!(isObject(el) && toString(el) === '[object NodeList]')\r\n}\r\n\r\nexport default isHTMLCollection\r\n","import toString from '../lang/toString'\r\nimport isObject from './isObject'\r\n\r\nconst isFragment = (fragment) => {\r\n return !!(\r\n isObject(fragment) && toString(fragment) === '[object DocumentFragment]'\r\n )\r\n}\r\n\r\nexport default isFragment\r\n","import toString from '../lang/toString'\r\nimport isObject from './isObject'\r\n\r\nconst isTextNode = (el) => {\r\n return !!(\r\n isObject(el) &&\r\n (toString(el) === '[object Text]' || (el.tagName && el.nodeType === 3))\r\n )\r\n}\r\n\r\nexport default isTextNode\r\n","import addClass from './addClass.js'\r\n\r\n/**\r\n * 给 DOM 节点设置属性/值\r\n * ========================================================================\r\n * @method setAttribute\r\n * @param {HTMLElement} el - DOM 节点\r\n * @param {String} attr - 属性名称\r\n * @param {String|Number|Boolean} value - 属性值\r\n */\r\nconst setAttribute = (el, attr, value) => {\r\n let tagName = el.tagName.toLowerCase()\r\n\r\n switch (attr) {\r\n case 'style':\r\n el.style.cssText = value\r\n break\r\n case 'value':\r\n if (tagName === 'input' || tagName === 'textarea') {\r\n el.value = value\r\n } else {\r\n el.setAttribute(attr, value)\r\n }\r\n break\r\n case 'htmlFor':\r\n el.setAttribute('for', value)\r\n break\r\n case 'className':\r\n addClass(el, value)\r\n break\r\n case 'innerHTML':\r\n el.innerHTML = value\r\n break\r\n case 'innerText':\r\n el.innerText = value\r\n break\r\n default:\r\n el.setAttribute(attr, value)\r\n break\r\n }\r\n}\r\n\r\nexport default setAttribute\r\n","import isObject from '../types/isObject'\r\nimport hasOwn from '../lang/hasOwn'\r\nimport setAttribute from './setAttribute'\r\n\r\nconst setAttributes = (el, attrs) => {\r\n if (!el || !isObject(attrs)) {\r\n return false\r\n }\r\n\r\n Object.keys(attrs).forEach((attr) => {\r\n const value = attrs[attr]\r\n if (hasOwn(attrs, attr)) {\r\n setAttribute(el, attr, value)\r\n }\r\n })\r\n}\r\n\r\nexport default setAttributes\r\n","import isObject from '../types/isObject'\r\nimport isString from '../types/isString'\r\nimport isArray from '../types/isArray'\r\nimport isDOM from '../types/isDOM'\r\nimport setAttributes from './setAttributes'\r\n\r\n/**\r\n * 创建 DOM 节点,并添加属性和子节点\r\n * ========================================================================\r\n * @method createElement\r\n * @param {String} tagName - 标签名称\r\n * @param {Object|Array|HTMLElement|DocumentFragment|String} attrs - 属性对象或者子节点\r\n * @param {Array|HTMLElement|DocumentFragment|String} [children] - 子节点数组\r\n * @returns {HTMLElement}\r\n */\r\nconst createElement = (tagName, attrs, children) => {\r\n const $fragment = document.createDocumentFragment()\r\n const $el = document.createElement(tagName)\r\n const isValidChild = (child) => {\r\n return isDOM(child) || isString(child)\r\n }\r\n const append = (child) => {\r\n let $child\r\n\r\n if (!isValidChild(child)) {\r\n return false\r\n }\r\n\r\n if (isDOM(child)) {\r\n $child = child\r\n } else if (isString(child)) {\r\n $child = document.createTextNode(child)\r\n }\r\n\r\n $fragment.appendChild($child)\r\n }\r\n\r\n if (isObject(attrs)) {\r\n setAttributes($el, attrs)\r\n } else if (isArray(attrs) && attrs.every((attr) => isValidChild(attr))) {\r\n attrs.forEach((child) => {\r\n append(child)\r\n })\r\n } else if (isDOM(attrs)) {\r\n append(attrs)\r\n } else if (isString(attrs)) {\r\n append(document.createTextNode(attrs))\r\n }\r\n\r\n if (isArray(children)) {\r\n children.forEach((child) => {\r\n append(child)\r\n })\r\n } else {\r\n append(children)\r\n }\r\n\r\n $el.appendChild($fragment)\r\n\r\n return $el\r\n}\r\n\r\nexport default createElement\r\n","import isArray from '../types/isArray'\r\nimport isString from '../types/isString'\r\nimport isSVG from '../types/isSVG'\r\nimport setAttributes from '../dom/setAttributes'\r\n\r\n/**\r\n * 创建 SVG 图标 DOM 元素\r\n * ========================================================================\r\n * @method createElement\r\n * @param {String} name\r\n * @param {Object} [options]\r\n * @param {Number|Array} [options.size]\r\n * @param {String} [options.color]\r\n * @param {String} [options.iconSet]\r\n * @param {Object} [options.attrs]\r\n * @returns {HTMLElement}\r\n */\r\nconst createElement = (name, options = {}) => {\r\n const ICON = 'outline-icon'\r\n const size = options.size || 0\r\n const color = options.color || ''\r\n const iconSet = options.iconSet || ''\r\n const width = isArray(size) ? size[0] : size\r\n const height = isArray(size) ? size[1] : size\r\n const defaultRules = size ? `width:${width}px;height:${height}px;` : ''\r\n const cssRules = color ? defaultRules + `color:${color}` : defaultRules\r\n const attrs = options.attrs || {}\r\n const $icon = document.createElement('i')\r\n let binds = ''\r\n let svg = ''\r\n let $svg\r\n\r\n if (!isString(name)) {\r\n return null\r\n }\r\n\r\n if (isSVG(name)) {\r\n svg = name\r\n } else {\r\n binds =\r\n iconSet && iconSet !== 'icon'\r\n ? `xlink:href=\"#${iconSet}-icon-${name}\"`\r\n : `xlink:href=\"#icon-${name}\"`\r\n svg = ``\r\n }\r\n\r\n $icon.innerHTML = svg\r\n\r\n if (attrs.className) {\r\n attrs.className = `${ICON} ${attrs.className}`\r\n } else {\r\n attrs.className = ICON\r\n }\r\n\r\n setAttributes($icon, attrs)\r\n\r\n $svg = $icon.querySelector('svg')\r\n setAttributes($svg, {\r\n 'aria-hidden': true,\r\n xmlns: 'http://www.w3.org/2000/svg',\r\n class: 'outline-icon__svg',\r\n width: 200,\r\n height: 200,\r\n style: cssRules\r\n })\r\n\r\n return $icon\r\n}\r\n\r\nexport default createElement\r\n","import isString from './isString'\r\n\r\nconst isSVG = (str) => {\r\n const declaration = '(?:<\\\\?xml[^>]*>\\\\s*)?'\r\n const doctype =\r\n '(?:<\\\\!doctype svg[^>]*\\\\s*(?:\\\\[?(?:\\\\s*]*>\\\\s*)*\\\\]?)*[^>]*>\\\\s*)?'\r\n const content = ']*>[^]*<\\\\/svg>\\\\s*$'\r\n const svg = `^\\\\s*${declaration}${doctype}${content}\\\\s*$`\r\n const pattern = new RegExp(svg, 'i')\r\n\r\n return isString(str) && pattern.test(str)\r\n}\r\n\r\nexport default isSVG\r\n","import createElement from './createElement'\r\n\r\n/**\r\n * 创建 SVG 图标 DOM 元素\r\n * ========================================================================\r\n * @method icon\r\n * @alias createElement\r\n * @see createElement\r\n * @param {String} name\r\n * @param {Object} [options]\r\n * @param {Number|Array} [options.size]\r\n * @param {String} [options.color]\r\n * @param {String} [options.iconSet]\r\n * @returns {HTMLElement}\r\n */\r\nconst icon = (name, options = {}) => {\r\n return createElement(name, options)\r\n}\r\n\r\nexport default icon\r\n","import trim from '../lang/trim'\r\nimport hasClass from './hasClass'\r\n\r\n/**\r\n * 移除 DOM 节点的 className 样式\r\n * ========================================================================\r\n * @method removeClass\r\n * @param {HTMLElement} el - DOM 节点\r\n * @param {String} className - 样式名称\r\n * @returns {Boolean}\r\n */\r\nconst removeClass = (el, className) => {\r\n let allClass = el.className\r\n let classList\r\n\r\n if (!allClass || !hasClass(el, className)) {\r\n return false\r\n }\r\n\r\n classList = el.classList\r\n\r\n if (classList?.remove) {\r\n classList.remove(className)\r\n } else {\r\n allClass = trim(allClass.replace(className, ''))\r\n el.className = allClass\r\n }\r\n}\r\n\r\nexport default removeClass\r\n","import removeClass from './utils/dom/removeClass'\r\nimport isEmpty from './utils/types/isEmpty'\r\nimport trim from './utils/lang/trim'\r\n\r\nconst _removeHeading = ($heading, hasAnchor = true, isAtStart = true) => {\r\n const CLS_HEADING = 'outline-heading'\r\n const text = $heading.innerHTML\r\n const pattern = /^\\d+(\\.?\\d+)*\\s?/gi\r\n let $anchor\r\n\r\n $heading.innerHTML = text.replace(pattern, '')\r\n $heading.removeAttribute('id')\r\n $heading.removeAttribute('data-id')\r\n\r\n removeClass($heading, CLS_HEADING)\r\n\r\n if (!hasAnchor) {\r\n return false\r\n }\r\n\r\n $anchor = $heading.querySelector(`.${CLS_HEADING}__anchor`)\r\n\r\n if (isAtStart) {\r\n removeClass($heading, `${CLS_HEADING}_start`)\r\n }\r\n\r\n if (isEmpty(trim($heading.className))) {\r\n $heading.removeAttribute('class')\r\n }\r\n\r\n // 存在锚点才移除\r\n if ($anchor) {\r\n $heading.removeChild($anchor)\r\n }\r\n}\r\n\r\nexport default _removeHeading\r\n","import isString from './isString'\r\n/**\r\n * 检测数据是否为空字符串\r\n * ========================================================================\r\n * @method isEmpty\r\n * @param {String} str\r\n * @returns {boolean}\r\n */\r\nconst isEmpty = (str) => {\r\n return isString(str) && str === ''\r\n}\r\n\r\nexport default isEmpty\r\n","import isString from './utils/types/isString'\r\nimport isFunction from './utils/types/isFunction'\r\nimport isElement from './utils/types/isElement'\r\nimport cloneDeep from './utils/lang/cloneDeep'\r\nimport timeSlice from './utils/lang/timeSlice'\r\nimport later from './utils/lang/later'\r\nimport scrollTo from './utils/dom/scrollTo'\r\nimport _getScrollElement from './utils/dom/_getScrollElement'\r\nimport offsetTop from './utils/dom/offsetTop'\r\nimport on from './utils/event/on'\r\nimport off from './utils/event/off'\r\nimport stop from './utils/event/stop'\r\nimport paint from './utils/icons/paint'\r\n\r\nimport _updateHeading from './_updateHeading'\r\nimport _removeHeading from './_removeHeading'\r\nimport getChapters from './getChapters'\r\n\r\nimport Base from './base'\r\n\r\nclass Anchors extends Base {\r\n constructor(options) {\r\n super()\r\n\r\n this._default()\r\n\r\n if (options) {\r\n this.initialize(options)\r\n }\r\n }\r\n\r\n _default() {\r\n this.attrs = cloneDeep(Anchors.DEFAULTS)\r\n\r\n this.$articleElement = null\r\n this.$scrollElement = null\r\n this.$headings = []\r\n\r\n return this\r\n }\r\n\r\n initialize(options) {\r\n let created\r\n let scrollElement\r\n let $articleElement\r\n let articleElement\r\n\r\n this.attr(options)\r\n\r\n articleElement = this.attr('articleElement')\r\n scrollElement = this.attr('scrollElement')\r\n created = this.attr('created')\r\n\r\n if (isString(articleElement)) {\r\n $articleElement = document.querySelector(articleElement)\r\n } else if (isElement(articleElement)) {\r\n $articleElement = articleElement\r\n }\r\n\r\n if (!$articleElement) {\r\n return this\r\n }\r\n\r\n this.$articleElement = $articleElement\r\n this.$scrollElement = _getScrollElement(scrollElement)\r\n this.$headings = this.getHeadings()\r\n\r\n if (this.$headings.length < 1) {\r\n return this\r\n }\r\n\r\n if (isFunction(created)) {\r\n created.call(this)\r\n }\r\n\r\n this.render().addListeners()\r\n\r\n return this\r\n }\r\n\r\n getHeadings() {\r\n const $articleElement = this.$articleElement\r\n const selector = this.attr('selector')\r\n\r\n return [...$articleElement.querySelectorAll(selector)]\r\n }\r\n\r\n count() {\r\n return this.getHeadings().length\r\n }\r\n\r\n render() {\r\n const articleElement = this.attr('articleElement')\r\n const selector = this.attr('selector')\r\n const showCode = this.attr('showCode')\r\n const chapterTextFilter = this.attr('chapterTextFilter')\r\n const mounted = this.attr('mounted')\r\n const chapters = getChapters({\r\n articleElement,\r\n selector,\r\n showCode,\r\n chapterTextFilter\r\n })\r\n\r\n paint()\r\n\r\n this._paint(chapters)\r\n\r\n if (isFunction(mounted)) {\r\n mounted.call(this)\r\n }\r\n\r\n return this\r\n }\r\n\r\n erase() {\r\n this._remove()\r\n\r\n return this\r\n }\r\n\r\n _paint(chapters) {\r\n const LIMIT = 400\r\n const hasAnchor = this.attr('hasAnchor')\r\n const isAtStart = this.attr('isAtStart')\r\n const showCode = this.attr('showCode')\r\n const anchorURL = this.attr('anchorURL')\r\n const anchorLinkFilter = this.attr('anchorLinkFilter')\r\n const count = this.count()\r\n const $headings = [...this.$headings]\r\n const update = (headings, group) => {\r\n headings.forEach(($heading, i) => {\r\n const id = i + group * LIMIT\r\n const chapterCode = chapters[id].code\r\n _updateHeading($heading, id, {\r\n hasAnchor,\r\n isAtStart,\r\n showCode,\r\n chapterCode,\r\n anchorURL,\r\n anchorLinkFilter\r\n })\r\n })\r\n }\r\n let groupIndex = -1\r\n\r\n // 针对超长的文章,进行 timeSlice 处理\r\n if (count > LIMIT) {\r\n groupIndex += 1\r\n // 同步绘制 Limit 以内的标题链接(可以确保 50ms 完成绘制)\r\n update($headings.splice(0, LIMIT), 0)\r\n // 采用 timeSlice 处理机制绘制剩余的标题\r\n while ($headings.length > 0) {\r\n const once = $headings.splice(0, LIMIT)\r\n timeSlice(\r\n () => {\r\n update(once, (groupIndex += 1))\r\n },\r\n () => {\r\n this.$emit('anchors:all:paint')\r\n }\r\n )\r\n }\r\n } else {\r\n update($headings, 0)\r\n }\r\n\r\n return this\r\n }\r\n\r\n _remove() {\r\n const hasAnchor = this.attr('hasAnchor')\r\n const isAtStart = this.attr('isAtStart')\r\n const $headings = this.$headings\r\n\r\n $headings.forEach(($heading) => {\r\n _removeHeading($heading, hasAnchor, isAtStart)\r\n })\r\n\r\n return this\r\n }\r\n\r\n refresh(chapters) {\r\n const articleElement = this.attr('articleElement')\r\n const selector = this.attr('selector')\r\n const showCode = this.attr('showCode')\r\n const chapterTextFilter = this.attr('chapterTextFilter')\r\n\r\n this.$headings = this.getHeadings()\r\n\r\n this.erase()._paint(\r\n chapters ||\r\n getChapters({\r\n articleElement,\r\n selector,\r\n showCode,\r\n chapterTextFilter\r\n })\r\n )\r\n\r\n return this\r\n }\r\n\r\n scrollTo(top, after) {\r\n const el = this.$scrollElement\r\n\r\n scrollTo(el, top, after)\r\n\r\n return this\r\n }\r\n\r\n destroy() {\r\n const beforeDestroy = this.attr('beforeDestroy')\r\n const afterDestroy = this.attr('afterDestroy')\r\n\r\n if (isFunction(beforeDestroy)) {\r\n beforeDestroy.call(this)\r\n }\r\n\r\n this.removeListeners()._remove()._default()\r\n\r\n if (isFunction(afterDestroy)) {\r\n afterDestroy.call(this)\r\n }\r\n\r\n return this\r\n }\r\n\r\n onAnchorTrigger(evt) {\r\n const anchorURL = this.attr('anchorURL')\r\n const afterScroll = this.attr('afterScroll')\r\n const stickyHeight = this.attr('stickyHeight')\r\n const $anchor = evt.delegateTarget\r\n const $heading = $anchor.parentNode\r\n const top = offsetTop($heading) - (stickyHeight + 10)\r\n const $scrollElement = this.$scrollElement\r\n const min = 0\r\n const max = $scrollElement.scrollHeight - $scrollElement.clientHeight\r\n const after = () => {\r\n if (isFunction(afterScroll)) {\r\n afterScroll.call(this, 'anchor')\r\n }\r\n\r\n later(() => {\r\n this.$emit('toolbar:update', {\r\n top,\r\n min,\r\n max\r\n })\r\n })\r\n }\r\n\r\n this.scrollTo(top, after)\r\n\r\n if (!anchorURL) {\r\n stop(evt)\r\n }\r\n\r\n return this\r\n }\r\n\r\n onRefresh(chapters) {\r\n this.refresh(chapters)\r\n\r\n return this\r\n }\r\n\r\n addListeners() {\r\n const $articleElement = this.$articleElement\r\n\r\n if (this.count() < 1) {\r\n return this\r\n }\r\n\r\n on(\r\n $articleElement,\r\n '.outline-heading__anchor',\r\n 'click',\r\n this.onAnchorTrigger,\r\n this,\r\n true\r\n )\r\n\r\n this.$on('anchors:refresh', this.onRefresh)\r\n\r\n return this\r\n }\r\n\r\n removeListeners() {\r\n const $articleElement = this.$articleElement\r\n\r\n if (this.count() < 1) {\r\n return this\r\n }\r\n\r\n off($articleElement, 'click', this.onAnchorTrigger)\r\n this.$off('anchors:refresh', this.onRefresh)\r\n\r\n return this\r\n }\r\n}\r\n\r\nAnchors.DEFAULTS = (() => {\r\n const OPTIONS = {\r\n scrollElement: 'html,body',\r\n articleElement: '#article',\r\n selector: 'h1,h2,h3,h4,h5,h6',\r\n stickyHeight: 0,\r\n anchorURL: '',\r\n hasAnchor: true,\r\n isAtStart: true,\r\n showCode: false,\r\n created: null,\r\n mounted: null,\r\n afterScroll: null,\r\n beforeDestroy: null,\r\n afterDestroy: null,\r\n chapterTextFilter: null,\r\n anchorLinkFilter: null\r\n }\r\n\r\n return cloneDeep(OPTIONS)\r\n})()\r\n\r\nexport default Anchors\r\n","import isFunction from './utils/types/isFunction'\r\nimport trim from './utils/lang/trim'\r\nimport createElement from './utils/dom/createElement'\r\nimport setAttributes from './utils/dom/setAttributes'\r\n\r\nimport icon from './utils/icons/icon'\r\n\r\nconst _updateHeading = ($heading, i, options) => {\r\n const CLS_HEADING = 'outline-heading'\r\n const hasAnchor = options.hasAnchor || true\r\n const isAtStart = options.isAtStart || true\r\n const showCode = options.showCode || false\r\n const chapterCode = options.chapterCode || ''\r\n const anchorURL = options.anchorURL || ''\r\n const anchorLinkFilter = options.anchorLinkFilter || null\r\n const headingId = `heading-${i}`\r\n const attrs = {\r\n id: headingId,\r\n className: isAtStart ? `${CLS_HEADING} ${CLS_HEADING}_start` : CLS_HEADING,\r\n 'data-id': i\r\n }\r\n const text = trim($heading.innerHTML)\r\n let url\r\n let $anchor\r\n let $icon\r\n\r\n if (showCode) {\r\n attrs.innerHTML = chapterCode + ' ' + text\r\n attrs['data-code'] = chapterCode\r\n }\r\n setAttributes($heading, attrs)\r\n\r\n if (!hasAnchor) {\r\n return false\r\n }\r\n\r\n if (anchorURL) {\r\n url = anchorURL\r\n } else {\r\n if (isFunction(anchorLinkFilter)) {\r\n url = anchorLinkFilter($heading.tagName.toLowerCase(), text, i)\r\n } else {\r\n url = `#${headingId}`\r\n }\r\n }\r\n\r\n $icon = icon('hash', { iconSet: 'outline' })\r\n $anchor = createElement(\r\n 'a',\r\n {\r\n id: `anchor-${i}`,\r\n className: `${CLS_HEADING}__anchor anchor-${i}`,\r\n href: url,\r\n target: anchorURL ? '_blank' : 'self',\r\n 'data-id': i\r\n },\r\n $icon\r\n )\r\n $heading.appendChild($anchor)\r\n}\r\n\r\nexport default _updateHeading\r\n","// HTML 合法的标签\r\nconst TAGS = [\r\n 'a',\r\n 'abbr',\r\n 'address',\r\n 'area',\r\n 'article',\r\n 'aside',\r\n 'audio',\r\n 'b',\r\n 'base',\r\n 'bdi',\r\n 'bdo',\r\n 'blockquote',\r\n 'body',\r\n 'br',\r\n 'button',\r\n 'canvas',\r\n 'caption',\r\n 'cite',\r\n 'code',\r\n 'col',\r\n 'colgroup',\r\n 'data',\r\n 'datalist',\r\n 'dd',\r\n 'del',\r\n 'details',\r\n 'dfn',\r\n 'dialog',\r\n 'div',\r\n 'dl',\r\n 'dt',\r\n 'em',\r\n 'embed',\r\n 'fieldset',\r\n 'figcaption',\r\n 'figure',\r\n 'footer',\r\n 'form',\r\n 'h1',\r\n 'h2',\r\n 'h3',\r\n 'h4',\r\n 'h5',\r\n 'h6',\r\n 'head',\r\n 'header',\r\n 'hgroup',\r\n 'hr',\r\n 'html',\r\n 'i',\r\n 'iframe',\r\n 'img',\r\n 'input',\r\n 'ins',\r\n 'kbd',\r\n 'label',\r\n 'legend',\r\n 'li',\r\n 'link',\r\n 'main',\r\n 'map',\r\n 'mark',\r\n 'math',\r\n 'menu',\r\n 'menuitem',\r\n 'meta',\r\n 'meter',\r\n 'nav',\r\n 'noscript',\r\n 'object',\r\n 'ol',\r\n 'optgroup',\r\n 'option',\r\n 'output',\r\n 'p',\r\n 'param',\r\n 'picture',\r\n 'pre',\r\n 'progress',\r\n 'q',\r\n 'rb',\r\n 'rp',\r\n 'rt',\r\n 'rtc',\r\n 'ruby',\r\n 's',\r\n 'samp',\r\n 'script',\r\n 'search',\r\n 'section',\r\n 'select',\r\n 'slot',\r\n 'small',\r\n 'source',\r\n 'span',\r\n 'strong',\r\n 'style',\r\n 'sub',\r\n 'summary',\r\n 'sup',\r\n 'svg',\r\n 'table',\r\n 'tbody',\r\n 'td',\r\n 'template',\r\n 'textarea',\r\n 'tfoot',\r\n 'th',\r\n 'thead',\r\n 'time',\r\n 'title',\r\n 'tr',\r\n 'track',\r\n 'u',\r\n 'ul',\r\n 'var',\r\n 'video',\r\n 'wbr'\r\n]\r\n\r\nexport default TAGS\r\n","import isString from './isString'\r\nimport trim from '../lang/trim'\r\nimport TAGS from './tags'\r\n\r\n/**\r\n * 检测测试数据是否为合法的 HTML 代码\r\n * ========================================================================\r\n * @method isHTML\r\n * @category Lang\r\n * @see https://github.com/sindresorhus/html-tags\r\n * @see https://github.com/sindresorhus/is-html\r\n * @param {String} str - 要检测的数据\r\n * @returns {Boolean} 'val' 为合法的 HTML 代码,返回 true,否则返回 false\r\n */\r\nconst isHTML = (str) => {\r\n let html\r\n let basic\r\n let full\r\n\r\n if (!isString(str)) {\r\n return false\r\n }\r\n\r\n // 为了提高性能,我们将其限制在合理的长度内。\r\n html = trim(str).slice(0, 1000)\r\n basic = /\\s*|]*>|]*>|]+>/i\r\n full = new RegExp(TAGS.map((tag) => `<${tag}\\\\b[^>]*>`).join('|'), 'i')\r\n\r\n return basic.test(html) || full.test(html)\r\n}\r\n\r\nexport default isHTML\r\n","/**\r\n * 移除字符串中的 JavaScript 代码\r\n * ====================================================\r\n * @param {String} str\r\n * @returns {String}\r\n */\r\nconst stripScripts = (str) => {\r\n return str.replace(/]*>.*?<\\/script>/gi, '')\r\n}\r\n\r\nexport default stripScripts\r\n","const setProperty = (prop, value) => {\r\n const documentElement = document.documentElement\r\n documentElement.style.setProperty(prop, value)\r\n}\r\n\r\nexport default setProperty\r\n","import setProperty from './utils/dom/setProperty'\r\n\r\nlet index = 2000\r\n\r\nconst zIndex = (idx) => {\r\n if (idx) {\r\n index = idx\r\n } else {\r\n index += 1\r\n }\r\n\r\n setProperty('--outline-zIndex', `${index}`)\r\n\r\n return index\r\n}\r\n\r\nexport default zIndex\r\n","import Base from './base'\r\n\r\nimport later from './utils/lang/later'\r\nimport cloneDeep from './utils/lang/cloneDeep'\r\nimport isFunction from './utils/types/isFunction'\r\nimport isDOM from './utils/types/isDOM'\r\nimport isHTML from './utils/types/isHTML'\r\nimport addClass from './utils/dom/addClass'\r\nimport removeClass from './utils/dom/removeClass'\r\nimport html from './utils/dom/html'\r\nimport createElement from './utils/dom/createElement'\r\nimport on from './utils/event/on'\r\nimport off from './utils/event/off'\r\n\r\nimport paint from './utils/icons/paint'\r\nimport icon from './utils/icons/icon'\r\nimport zIndex from './zIndex'\r\n\r\nclass Drawer extends Base {\r\n constructor(options) {\r\n super()\r\n\r\n this._default()\r\n\r\n this.zIndex = 0\r\n\r\n if (options) {\r\n this.initialize(options)\r\n }\r\n }\r\n\r\n _default() {\r\n this.attrs = cloneDeep(Drawer.DEFAULTS)\r\n this.title = ''\r\n this.closed = false\r\n\r\n this.$el = null\r\n this.$modal = null\r\n this.$header = null\r\n this.$title = null\r\n this.$close = null\r\n this.$main = null\r\n this.$footer = null\r\n this.$overlay = null\r\n\r\n return this\r\n }\r\n\r\n initialize(options) {\r\n let created\r\n\r\n this.attr(options)\r\n\r\n this.title = this.attr('title')\r\n created = this.attr('created')\r\n\r\n if (isFunction(created)) {\r\n created.call(this)\r\n }\r\n\r\n this.render().addListeners()\r\n return this\r\n }\r\n\r\n setTitle(title) {\r\n this.attr('title', title)\r\n this.title = title\r\n this.$title.innerHTML = title\r\n\r\n return this\r\n }\r\n\r\n isClosed() {\r\n return this.closed\r\n }\r\n\r\n render() {\r\n const mounted = this.attr('mounted')\r\n const size = this.attr('size')\r\n const placement = this.attr('placement')\r\n const hasClose = this.attr('hasClose')\r\n const hasOverlay = this.attr('hasOverlay')\r\n const hasOffset = this.attr('hasOffset')\r\n const hasPadding = this.attr('hasPadding')\r\n const autoHeight = this.attr('autoHeight')\r\n const overflow = this.attr('overflow')\r\n const customClass = this.attr('customClass')\r\n let mainClassName = 'outline-drawer__main'\r\n let $el\r\n let $modal\r\n let $header\r\n let $title\r\n let $close\r\n let $main\r\n let $footer\r\n let $overlay\r\n\r\n paint()\r\n this.zIndex = zIndex()\r\n\r\n $title = createElement(\r\n 'h2',\r\n {\r\n className: 'outline-drawer__title'\r\n },\r\n this.title\r\n )\r\n this.$title = $title\r\n\r\n if (hasClose) {\r\n $close = createElement(\r\n 'div',\r\n {\r\n className: 'outline-drawer__close'\r\n },\r\n icon('close', { iconSet: 'outline', size: 20 })\r\n )\r\n this.$close = $close\r\n }\r\n\r\n $header = createElement(\r\n 'header',\r\n {\r\n className: 'outline-drawer__header'\r\n },\r\n [$title, $close]\r\n )\r\n this.$header = $header\r\n\r\n if (overflow === 'hidden') {\r\n mainClassName += ' overflow-hidden'\r\n }\r\n\r\n $main = createElement('div', {\r\n className: mainClassName\r\n })\r\n this.$main = $main\r\n\r\n if (!hasPadding) {\r\n addClass($main, 'outline-drawer_full')\r\n }\r\n\r\n $footer = createElement('footer', {\r\n className: 'outline-drawer__footer'\r\n })\r\n this.$footer = $footer\r\n\r\n $modal = createElement(\r\n 'div',\r\n {\r\n className: `outline-drawer__modal outline-drawer_${placement} outline-drawer_${size} outline-drawer_closed`\r\n },\r\n [$header, $main, $footer]\r\n )\r\n this.$modal = $modal\r\n\r\n if (hasOffset) {\r\n addClass($modal, 'outline-drawer_offset')\r\n }\r\n\r\n if (autoHeight) {\r\n addClass($modal, 'outline-drawer_auto')\r\n }\r\n\r\n if (customClass) {\r\n addClass($modal, customClass)\r\n }\r\n\r\n if (hasOverlay) {\r\n $overlay = createElement('div', {\r\n className: 'outline-drawer__overlay'\r\n })\r\n this.$overlay = $overlay\r\n }\r\n\r\n $el = createElement(\r\n 'div',\r\n {\r\n className: `outline-drawer`\r\n },\r\n [$modal, $overlay]\r\n )\r\n this.$el = $el\r\n document.body.appendChild($el)\r\n\r\n if (isFunction(mounted)) {\r\n mounted.call(this)\r\n }\r\n\r\n return this\r\n }\r\n\r\n erase() {\r\n this.$main.innerHTML = ''\r\n return this\r\n }\r\n\r\n _paint(content) {\r\n let $content = null\r\n\r\n if (isFunction(content)) {\r\n $content = content()\r\n } else if (isDOM(content)) {\r\n $content = content\r\n } else if (isHTML(content)) {\r\n $content = html(content)\r\n }\r\n\r\n if ($content) {\r\n this.$main.appendChild($content)\r\n }\r\n\r\n return this\r\n }\r\n\r\n _remove() {\r\n document.body.removeChild(this.$el)\r\n return this\r\n }\r\n\r\n refresh(content) {\r\n this.erase()._paint(content)\r\n return this\r\n }\r\n\r\n open() {\r\n const opened = this.attr('afterOpened')\r\n const $modal = this.$modal\r\n\r\n addClass(this.$el, 'outline-drawer_opened')\r\n removeClass($modal, 'outline-drawer_closed')\r\n addClass($modal, 'outline-drawer_opened')\r\n\r\n later(() => {\r\n this.closed = false\r\n\r\n if (isFunction(opened)) {\r\n opened.call(this)\r\n }\r\n })\r\n\r\n return this\r\n }\r\n\r\n close() {\r\n const closed = this.attr('afterClosed')\r\n const $modal = this.$modal\r\n\r\n removeClass($modal, 'outline-drawer_opened')\r\n addClass($modal, 'outline-drawer_closed')\r\n\r\n later(() => {\r\n removeClass(this.$el, 'outline-drawer_opened')\r\n this.closed = true\r\n\r\n if (isFunction(closed)) {\r\n closed.call(this)\r\n }\r\n })\r\n\r\n return this\r\n }\r\n\r\n toggle() {\r\n const afterToggle = this.attr('afterToggle')\r\n const closed = this.isClosed()\r\n\r\n if (closed) {\r\n this.open()\r\n } else {\r\n this.close()\r\n }\r\n\r\n if (isFunction(afterToggle)) {\r\n later(() => {\r\n afterToggle.call(this, closed)\r\n })\r\n }\r\n\r\n return this\r\n }\r\n\r\n destroy() {\r\n const afterDestroy = this.attr('afterDestroy')\r\n const beforeDestroy = this.attr('beforeDestroy')\r\n let index = this.zIndex\r\n\r\n if (isFunction(beforeDestroy)) {\r\n beforeDestroy.call(this)\r\n }\r\n\r\n this.removeListeners()._remove()._default()\r\n\r\n index -= 1\r\n zIndex(index)\r\n this.zIndex = 0\r\n\r\n if (isFunction(afterDestroy)) {\r\n afterDestroy.call(this)\r\n }\r\n\r\n return this\r\n }\r\n\r\n onClose() {\r\n this.close()\r\n return this\r\n }\r\n\r\n addListeners() {\r\n const hasClose = this.attr('hasClose')\r\n const hasOverlay = this.attr('hasOverlay')\r\n const closeOnClickModal = this.attr('closeOnClickModal')\r\n const $el = this.$el\r\n\r\n if (hasClose) {\r\n on($el, '.outline-drawer__close', 'click', this.onClose, this, true)\r\n }\r\n\r\n if (hasOverlay && closeOnClickModal) {\r\n on($el, '.outline-drawer__overlay', 'click', this.onClose, this, true)\r\n }\r\n\r\n return this\r\n }\r\n\r\n removeListeners() {\r\n const hasClose = this.attr('hasClose')\r\n const hasOverlay = this.attr('hasOverlay')\r\n const $el = this.$el\r\n\r\n if (!hasClose && !hasOverlay) {\r\n return this\r\n }\r\n\r\n off($el, 'click', this.onClose)\r\n\r\n return this\r\n }\r\n}\r\n\r\nDrawer.DEFAULTS = (() => {\r\n const OPTIONS = {\r\n placement: 'rtl',\r\n title: '标题',\r\n size: 'regular',\r\n hasClose: true,\r\n hasOverlay: true,\r\n hasOffset: false,\r\n hasPadding: true,\r\n autoHeight: true,\r\n closeOnClickModal: true,\r\n overflow: 'auto',\r\n created: null,\r\n mounted: null,\r\n afterClosed: null,\r\n afterOpened: null,\r\n afterScroll: null,\r\n beforeDestroy: null,\r\n afterDestroy: null,\r\n afterToggle: null\r\n }\r\n\r\n return cloneDeep(OPTIONS)\r\n})()\r\n\r\nexport default Drawer\r\n","import isHTML from '../types/isHTML'\r\nimport isString from '../types/isString'\r\nimport isElement from '../types/isElement'\r\nimport stripScripts from '../lang/stripScripts'\r\nimport createElement from './createElement'\r\n\r\n/**\r\n * 获取或者设置 DOM 元素的 innerHTML 属性值,或者通过 HTML 字符串,创建 DOM 元素\r\n * ========================================================================\r\n * @method html\r\n * @param {HTMLElement|String} el\r\n * @param {String} [strHTML]\r\n * @return {DocumentFragment|null|*}\r\n */\r\nconst html = (el, strHTML) => {\r\n const $fragment = document.createDocumentFragment()\r\n\r\n if (!el || (!isHTML(el) && !isString(el) && !isElement(el))) {\r\n return null\r\n }\r\n\r\n if (isHTML(el)) {\r\n const template = createElement('div')\r\n let children = []\r\n\r\n template.innerHTML = stripScripts(el)\r\n children = [...template.childNodes]\r\n children.forEach((child) => {\r\n $fragment.appendChild(child)\r\n })\r\n\r\n return $fragment\r\n } else if (isString(strHTML)) {\r\n el.innerHTML = stripScripts(strHTML)\r\n } else {\r\n return el.innerHTML\r\n }\r\n}\r\n\r\nexport default html\r\n","import isFunction from '../types/isFunction'\r\nimport off from './off'\r\n\r\nimport { CAPTURE_EVENTS } from './enum'\r\n\r\n/**\r\n * 绑定事件\r\n * ========================================================================\r\n * @method at\r\n * @param {HTMLElement|String|Object} el - (必须)绑定代理事件的 DOM 节点\r\n * @param {String|Function} type - (必须)事件类型或者事件处理器回调函数\r\n * @param {Function|Object} fn - (必须) 事件处理器回调函数或者传递给事件处理器回调函数的数据对象\r\n * @param {Object|Boolean} [data] - (可选)传递给事件处理器回调函数的数据对象或者事件处理器回调函数的 this 上下文指向,\r\n * @param {Object|Boolean} [context] - (可选)事件处理器回调函数的 this 上下文指向,或者是否仅触发一次\r\n * 当设置为 true 时,则事件处理器回调函数的 this 上下文指向为 data 对象\r\n * @param {Boolean} once - (可选)是否仅触发一次\r\n */\r\nconst at = (el, type, fn, data, context, once = false) => {\r\n // CAPTURE_EVENTS 中的特殊事件,采用事件捕获模型\r\n const capture = CAPTURE_EVENTS.indexOf(type) > -1\r\n const listener = function (evt) {\r\n let overrideContext = context || el\r\n\r\n // 当设置为 true 时,则事件处理器回调函数的\r\n // this 上下文指向为 data 对象\r\n if (context === true) {\r\n overrideContext = data\r\n }\r\n\r\n // 仅触发一次\r\n /* istanbul ignore else */\r\n if (once === true) {\r\n off(el, type, listener)\r\n }\r\n\r\n fn.call(overrideContext, evt, data)\r\n }\r\n\r\n if (!isFunction(fn)) {\r\n return false\r\n }\r\n\r\n if (!el._listeners) {\r\n el._listeners = []\r\n }\r\n\r\n // 缓存 options 元素绑定的事件处理器\r\n el._listeners.push({\r\n el,\r\n type,\r\n fn: listener,\r\n data,\r\n context,\r\n capture\r\n })\r\n\r\n // 缓存包装后的事件处理器\r\n fn._delegateListener = listener\r\n\r\n el.addEventListener(type, listener, capture)\r\n}\r\n\r\nexport default at\r\n","/**\r\n * 获取HTML元素的某个CSS样式值\r\n * ====================================================\r\n * @param el\r\n * @param ruleName\r\n * @returns {*}\r\n */\r\nconst getStyle = (el, ruleName) => {\r\n return getComputedStyle(el)[ruleName]\r\n}\r\n\r\nexport default getStyle\r\n","import isString from './utils/types/isString'\r\nimport isFunction from './utils/types/isFunction'\r\nimport isElement from './utils/types/isElement'\r\nimport later from './utils/lang/later'\r\nimport at from './utils/event/at'\r\nimport on from './utils/event/on'\r\nimport off from './utils/event/off'\r\nimport stop from './utils/event/stop'\r\nimport createElement from './utils/dom/createElement'\r\nimport scrollTo from './utils/dom/scrollTo'\r\nimport addClass from './utils/dom/addClass'\r\nimport intersection from './utils/dom/intersection'\r\nimport removeClass from './utils/dom/removeClass'\r\nimport offsetTop from './utils/dom/offsetTop'\r\nimport getStyle from './utils/dom/getStyle'\r\nimport setProperty from './utils/dom/setProperty'\r\nimport _getScrollElement from './utils/dom/_getScrollElement'\r\nimport cloneDeep from './utils/lang/cloneDeep'\r\n\r\nimport _paintChapters from './_paintChapters'\r\nimport inBounding from './utils/dom/inBounding'\r\n\r\nimport Base from './base'\r\n\r\nconst HIDDEN = 'outline-navigator_hidden'\r\nconst EXPANDED = 'outline-navigator_expanded'\r\nconst FOLDED = 'outline-navigator_folded'\r\n\r\nclass Navigator extends Base {\r\n constructor(options) {\r\n super()\r\n\r\n this._default()\r\n\r\n this.scrollTimer = null\r\n this.resizeTimer = null\r\n this.observerTimer = null\r\n this.Observer = null\r\n\r\n if (options) {\r\n this.initialize(options)\r\n }\r\n }\r\n\r\n _default() {\r\n this.attrs = cloneDeep(Navigator.DEFAULTS)\r\n\r\n this.$el = null\r\n this.$title = null\r\n this.$main = null\r\n this.$list = null\r\n this.$placeholder = null\r\n this.$parentElement = null\r\n this.$scrollElement = null\r\n this.$active = null\r\n\r\n this.chapters = []\r\n this.active = 0\r\n this.offsetWidth = 0\r\n this.offsetTop = 0\r\n this.playing = false\r\n this.closed = false\r\n\r\n return this\r\n }\r\n\r\n initialize(options) {\r\n let created\r\n let parentElement\r\n let scrollElement\r\n let $parent\r\n\r\n this.attr(options)\r\n\r\n created = this.attr('created')\r\n parentElement = this.attr('parentElement')\r\n scrollElement = this.attr('scrollElement')\r\n\r\n if (isString(parentElement)) {\r\n $parent = document.querySelector(parentElement)\r\n } else if (isElement(parentElement)) {\r\n $parent = parentElement\r\n }\r\n this.$parentElement = $parent\r\n this.$scrollElement = _getScrollElement(scrollElement)\r\n\r\n this.chapters = this.attr('chapters')\r\n this.closed = this.attr('closed')\r\n this.active = this.attr('active')\r\n\r\n if (isFunction(created)) {\r\n created.call(this)\r\n }\r\n\r\n if (this.chapters.length < 1) {\r\n return this\r\n }\r\n\r\n this.render().addListeners()\r\n\r\n this.$active = document.querySelector(`#chapter-${this.active}`)\r\n\r\n return this\r\n }\r\n\r\n isClosed() {\r\n return this.closed\r\n }\r\n\r\n isSticky() {\r\n const position = this.attr('position')\r\n return position === 'sticky'\r\n }\r\n\r\n isFixed() {\r\n const position = this.attr('position')\r\n return position === 'fixed'\r\n }\r\n\r\n isInside() {\r\n return this.isFixed() || this.isSticky()\r\n }\r\n\r\n isOutside() {\r\n return !this.isInside()\r\n }\r\n\r\n count() {\r\n return this.chapters.length\r\n }\r\n\r\n _paintEdge() {\r\n const $fragment = document.createDocumentFragment()\r\n const STICKY = 'outline-navigator_sticky'\r\n const title = this.attr('title')\r\n const animationCurrent = this.attr('animationCurrent')\r\n const customClass = this.attr('customClass')\r\n const $parentElement = this.$parentElement\r\n const children = []\r\n const contents = []\r\n let $title = null\r\n let $el\r\n let $main\r\n let $list\r\n let $placeholder\r\n\r\n if (!$parentElement) {\r\n return this\r\n }\r\n\r\n if (this.isInside() && title) {\r\n $title = createElement(\r\n 'h2',\r\n {\r\n className: 'outline-navigator__title'\r\n },\r\n title\r\n )\r\n this.$title = $title\r\n contents.push($title)\r\n }\r\n\r\n $list = createElement('ul', {\r\n // 为优化性能,添加了 _fixed 和 _hidden\r\n // fixed 为了让 $list 脱离流布局\r\n // hidden 让 $list 不可见\r\n className: `outline-navigator__list`\r\n })\r\n this.$list = $list\r\n children.push($list)\r\n\r\n if (animationCurrent) {\r\n $placeholder = createElement('div', {\r\n className: 'outline-navigator__placeholder'\r\n })\r\n this.$placeholder = $placeholder\r\n children.push($placeholder)\r\n }\r\n\r\n $main = createElement(\r\n 'div',\r\n {\r\n className: 'outline-navigator__main'\r\n },\r\n children\r\n )\r\n this.$main = $main\r\n contents.push($main)\r\n\r\n $el = createElement(\r\n 'nav',\r\n {\r\n id: 'outline-navigator',\r\n className: `outline-navigator ${HIDDEN}`\r\n },\r\n contents\r\n )\r\n this.$el = $el\r\n\r\n if (this.isSticky()) {\r\n this.calculateStickyHeight()\r\n addClass($el, STICKY)\r\n }\r\n\r\n if (customClass) {\r\n addClass($el, customClass)\r\n }\r\n $fragment.appendChild($el)\r\n $parentElement.appendChild($fragment)\r\n\r\n return this\r\n }\r\n\r\n render() {\r\n const mounted = this.attr('mounted')\r\n const $parentElement = this.$parentElement\r\n const chapters = this.chapters\r\n const count = this.count()\r\n let $el\r\n\r\n if (!$parentElement || chapters.length < 1) {\r\n return this\r\n }\r\n\r\n if (this.isInside()) {\r\n addClass($parentElement, 'outline-navigator-parent')\r\n }\r\n\r\n this._paintEdge()\r\n $el = this.$el\r\n\r\n this._paint(chapters)\r\n\r\n later(() => {\r\n this.highlight(this.active)\r\n }, 60)\r\n\r\n this.offsetTop = offsetTop($el)\r\n this.offsetWidth = $el.offsetWidth\r\n\r\n if (this.isFixed()) {\r\n this.sticky()\r\n setProperty('--outline-navigator-width', `${this.offsetWidth}px`)\r\n }\r\n\r\n if (isFunction(mounted)) {\r\n mounted.call(this)\r\n }\r\n\r\n if (count < 400) {\r\n this.onObserver()\r\n }\r\n\r\n return this\r\n }\r\n\r\n erase() {\r\n this.$list.innerHTML = ''\r\n\r\n return this\r\n }\r\n\r\n _paint(chapters) {\r\n const showCode = this.attr('showCode')\r\n const $el = this.$el\r\n const $list = this.$list\r\n\r\n _paintChapters($list, chapters, showCode)\r\n removeClass($el, HIDDEN)\r\n addClass($el, EXPANDED)\r\n\r\n return this\r\n }\r\n\r\n _remove() {\r\n this.$parentElement.removeChild(this.$el)\r\n return this\r\n }\r\n\r\n refresh(chapters) {\r\n const $el = this.$el\r\n\r\n removeClass($el, HIDDEN)\r\n this.erase()._paint(chapters)\r\n\r\n return this\r\n }\r\n\r\n _getPlaceholderOffset(index) {\r\n const $main = this.$main\r\n const $list = this.$list\r\n const $anchor = $list.querySelector('.outline-navigator__anchor')\r\n const mainPaddingTop = parseInt(getStyle($main, 'padding-top'), 10)\r\n const mainBorderTop = parseInt(getStyle($main, 'border-top-width'), 10)\r\n const placeholderPaddingTop = parseInt(getStyle($list, 'padding-top'), 10)\r\n const placeholderMarginTop = parseInt(getStyle($list, 'margin-top'), 10)\r\n const placeholderBorderTop = parseInt(\r\n getStyle($list, 'border-top-width'),\r\n 10\r\n )\r\n let height = $anchor.offsetHeight\r\n let offsetTop = 0\r\n let top\r\n\r\n if (mainPaddingTop) {\r\n offsetTop += mainPaddingTop\r\n }\r\n\r\n if (placeholderPaddingTop) {\r\n offsetTop += placeholderPaddingTop\r\n }\r\n\r\n if (placeholderMarginTop) {\r\n offsetTop += placeholderMarginTop\r\n }\r\n\r\n if (mainBorderTop) {\r\n offsetTop += mainBorderTop\r\n }\r\n\r\n if (placeholderBorderTop) {\r\n offsetTop += placeholderBorderTop\r\n }\r\n\r\n top = height * index\r\n\r\n return offsetTop + top\r\n }\r\n\r\n positionPlaceholder(index) {\r\n const $list = this.$list\r\n const $placeholder = this.$placeholder\r\n const $anchor = $list.querySelector('.outline-navigator__anchor')\r\n const animationCurrent = this.attr('animationCurrent')\r\n const height = $anchor.offsetHeight\r\n let offsetTop = 0\r\n\r\n if (!animationCurrent) {\r\n return this\r\n }\r\n\r\n offsetTop = this._getPlaceholderOffset(index)\r\n\r\n $placeholder.style.cssText = `transform: translateY(${offsetTop}px);height:${height}px;`\r\n\r\n return this\r\n }\r\n\r\n highlight(id) {\r\n const $el = this.$el\r\n const animationCurrent = this.attr('animationCurrent')\r\n const position = this.attr('position')\r\n const ACTIVE = 'outline-navigator_active'\r\n const HIGHLIGHT = 'outline-navigator_highlight'\r\n let $parent = position === 'relative' ? this.$parentElement : this.$main\r\n let $anchor = null\r\n let placeholderOffsetTop = 0\r\n\r\n if (!$el) {\r\n return this\r\n }\r\n\r\n $anchor = $el.querySelector(`#chapter__anchor-${id}`)\r\n\r\n if (!$anchor) {\r\n return this\r\n }\r\n\r\n this.active = parseInt($anchor.getAttribute('data-id'), 10)\r\n\r\n if (this.$active) {\r\n removeClass(this.$active, HIGHLIGHT)\r\n removeClass(this.$active, ACTIVE)\r\n }\r\n\r\n this.$active = $anchor\r\n addClass(this.$active, ACTIVE)\r\n\r\n if (animationCurrent) {\r\n this.positionPlaceholder(this.active)\r\n } else {\r\n addClass(this.$active, HIGHLIGHT)\r\n }\r\n\r\n later(() => {\r\n if (!inBounding(this.$active, $parent)) {\r\n placeholderOffsetTop = this._getPlaceholderOffset(this.active)\r\n scrollTo($parent, placeholderOffsetTop)\r\n }\r\n })\r\n\r\n return this\r\n }\r\n\r\n sticky() {\r\n const afterSticky = this.attr('afterSticky')\r\n const FIXED = 'outline-navigator_fixed'\r\n const $el = this.$el\r\n const top = this.offsetTop\r\n const scrollTop = this.$scrollElement.scrollTop\r\n let isStickying\r\n\r\n if (!this.isFixed()) {\r\n return this\r\n }\r\n\r\n isStickying = scrollTop >= top\r\n\r\n if (isStickying) {\r\n addClass($el, FIXED)\r\n } else {\r\n removeClass($el, FIXED)\r\n }\r\n\r\n if (isFunction(afterSticky)) {\r\n afterSticky.call(this, this.isClosed(), isStickying)\r\n }\r\n\r\n return this\r\n }\r\n\r\n calculateStickyHeight() {\r\n const documentElement = document.documentElement\r\n const height = Math.max(\r\n documentElement.clientHeight || 0,\r\n window.innerHeight || 0\r\n )\r\n setProperty('--outline-sticky-height', `${height}px`)\r\n return this\r\n }\r\n\r\n scrollTo(top, after) {\r\n const el = this.$scrollElement\r\n\r\n scrollTo(el, top, after)\r\n\r\n return this\r\n }\r\n\r\n show() {\r\n const opened = this.attr('afterOpened')\r\n const count = this.count()\r\n const $el = this.$el\r\n const $parent = this.$parentElement\r\n\r\n if (this.isInside()) {\r\n if (count > 800) {\r\n removeClass($parent, HIDDEN)\r\n } else {\r\n removeClass($parent, HIDDEN)\r\n later(() => {\r\n removeClass($parent, FOLDED)\r\n addClass($parent, EXPANDED)\r\n }, 30)\r\n }\r\n } else {\r\n removeClass($el, HIDDEN)\r\n }\r\n this.closed = false\r\n\r\n if (isFunction(opened)) {\r\n opened.call(this)\r\n }\r\n\r\n return this\r\n }\r\n\r\n hide() {\r\n const closed = this.attr('afterClosed')\r\n const count = this.count()\r\n const $el = this.$el\r\n const $parent = this.$parentElement\r\n\r\n if (this.isInside()) {\r\n if (count > 800) {\r\n addClass($parent, HIDDEN)\r\n } else {\r\n addClass($parent, FOLDED)\r\n removeClass($parent, EXPANDED)\r\n later(() => {\r\n addClass($parent, HIDDEN)\r\n })\r\n }\r\n } else {\r\n addClass($el, HIDDEN)\r\n }\r\n this.closed = true\r\n\r\n if (isFunction(closed)) {\r\n closed.call(this)\r\n }\r\n\r\n return this\r\n }\r\n\r\n toggle() {\r\n const afterToggle = this.attr('afterToggle')\r\n const top = this.offsetTop\r\n const scrollTop = this.$scrollElement.scrollTop\r\n let isStickying\r\n\r\n if (this.isClosed()) {\r\n this.show()\r\n } else {\r\n this.hide()\r\n }\r\n\r\n if (isFunction(afterToggle)) {\r\n later(() => {\r\n isStickying = scrollTop >= top\r\n afterToggle.call(this, this.isClosed(), isStickying)\r\n })\r\n }\r\n\r\n return this\r\n }\r\n\r\n destroy() {\r\n const beforeDestroy = this.attr('beforeDestroy')\r\n const afterDestroy = this.attr('afterDestroy')\r\n\r\n if (isFunction(beforeDestroy)) {\r\n beforeDestroy.call(this)\r\n }\r\n\r\n this.removeListeners()._remove()._default()\r\n\r\n if (this.scrollTimer) {\r\n clearTimeout(this.scrollTimer)\r\n this.scrollTimer = null\r\n }\r\n\r\n if (this.resizeTimer) {\r\n clearTimeout(this.resizeTimer)\r\n this.resizeTimer = null\r\n }\r\n\r\n if (this.observerTimer) {\r\n clearTimeout(this.observerTimer)\r\n this.observerTimer = null\r\n }\r\n\r\n if (this.Observer) {\r\n this.Observer = null\r\n }\r\n\r\n if (isFunction(afterDestroy)) {\r\n afterDestroy.call(this)\r\n }\r\n\r\n return this\r\n }\r\n\r\n onObserver() {\r\n const selector = this.attr('selector')\r\n\r\n this.Observer = intersection(\r\n ($heading) => {\r\n const id = $heading.getAttribute('data-id')\r\n\r\n if (this.playing) {\r\n return false\r\n }\r\n\r\n if (this.observerTimer) {\r\n clearTimeout(this.observerTimer)\r\n }\r\n\r\n this.observerTimer = later(() => {\r\n this.highlight(id)\r\n }, 100)\r\n },\r\n {\r\n selector,\r\n context: this\r\n }\r\n )\r\n\r\n return this\r\n }\r\n\r\n onSelect(evt) {\r\n const stickyHeight = this.attr('stickyHeight')\r\n const $anchor = evt.delegateTarget\r\n const id = $anchor.getAttribute('data-id')\r\n const headingId = $anchor.href.split('#')[1]\r\n const $heading = document.querySelector(`#${headingId}`)\r\n const top = offsetTop($heading) - (stickyHeight + 10)\r\n const min = 0\r\n const max = this.$scrollElement.scrollHeight\r\n const afterScroll = this.attr('afterScroll')\r\n const after = () => {\r\n if (isFunction(afterScroll)) {\r\n afterScroll.call(this, 'chapter')\r\n }\r\n\r\n later(() => {\r\n this.playing = false\r\n this.$emit('toolbar:update', {\r\n top,\r\n min,\r\n max\r\n })\r\n })\r\n }\r\n\r\n this.playing = true\r\n if (this.isFixed()) {\r\n this.sticky()\r\n later(() => {\r\n this.scrollTo(top, after)\r\n this.highlight(id)\r\n }, 10)\r\n } else {\r\n this.scrollTo(top, after)\r\n this.highlight(id)\r\n }\r\n\r\n stop(evt)\r\n\r\n return this\r\n }\r\n\r\n onScroll() {\r\n const $scrollElement = this.$scrollElement\r\n\r\n if (this.scrollTimer) {\r\n clearTimeout(this.scrollTimer)\r\n }\r\n\r\n this.scrollTimer = later(() => {\r\n const top = $scrollElement.scrollTop\r\n const min = 0\r\n const max = $scrollElement.scrollHeight - $scrollElement.clientHeight\r\n\r\n if (this.isFixed()) {\r\n this.sticky()\r\n }\r\n\r\n this.$emit('toolbar:update', {\r\n top,\r\n min,\r\n max\r\n })\r\n }, 100)\r\n\r\n return this\r\n }\r\n\r\n onResize() {\r\n // 添加判断\r\n if (!this.isSticky()) {\r\n return this\r\n }\r\n\r\n if (this.resizeTimer) {\r\n clearTimeout(this.resizeTimer)\r\n }\r\n\r\n this.resizeTimer = later(() => {\r\n this.calculateStickyHeight()\r\n })\r\n\r\n return this\r\n }\r\n\r\n onRefresh(chapters) {\r\n this.refresh(chapters)\r\n\r\n return this\r\n }\r\n\r\n addListeners() {\r\n const $el = this.$el\r\n const $scrollElement = this.$scrollElement\r\n const tagName = $scrollElement.tagName.toLowerCase()\r\n let $element = $scrollElement\r\n\r\n if (this.count() < 1) {\r\n return this\r\n }\r\n\r\n if (tagName === 'html' || tagName === 'body') {\r\n $element = window\r\n }\r\n\r\n on($el, '.outline-navigator__anchor', 'click', this.onSelect, this, true)\r\n at($element, 'scroll', this.onScroll, this, true)\r\n if (this.isSticky()) {\r\n at(window, 'resize', this.onResize, this, true)\r\n }\r\n\r\n this.$on('anchors:all:paint', this.onObserver, this)\r\n this.$on('navigator:refresh', this.onRefresh, this)\r\n\r\n return this\r\n }\r\n\r\n removeListeners() {\r\n const selector = this.attr('selector')\r\n const $el = this.$el\r\n const $scrollElement = this.$scrollElement\r\n const tagName = $scrollElement.tagName.toLowerCase()\r\n let $element = $scrollElement\r\n\r\n if (this.count() < 1) {\r\n return this\r\n }\r\n\r\n if (tagName === 'html' || tagName === 'body') {\r\n $element = window\r\n }\r\n\r\n off($el, 'click', this.onSelect)\r\n off($element, 'scroll', this.onScroll)\r\n if (this.isSticky()) {\r\n off(window, 'resize', this.onResize)\r\n }\r\n this.$off('anchors:all:paint')\r\n this.$off('navigator:refresh')\r\n\r\n if (this.Observer) {\r\n document.querySelectorAll(selector).forEach((section) => {\r\n this.Observer.unobserve(section)\r\n })\r\n }\r\n\r\n return this\r\n }\r\n}\r\n\r\nNavigator.DEFAULTS = (() => {\r\n const OPTIONS = {\r\n parentElement: '',\r\n scrollElement: '',\r\n selector: '.outline-heading',\r\n active: 0,\r\n closed: false,\r\n showCode: true,\r\n animationCurrent: true,\r\n position: 'relative',\r\n stickyHeight: 0,\r\n chapters: [],\r\n created: null,\r\n mounted: null,\r\n afterClosed: null,\r\n afterOpened: null,\r\n afterScroll: null,\r\n beforeDestroy: null,\r\n afterDestroy: null,\r\n afterSticky: null\r\n }\r\n\r\n return cloneDeep(OPTIONS)\r\n})()\r\n\r\nexport default Navigator\r\n","import createElement from './utils/dom/createElement'\r\nimport timeSlice from './utils/lang/timeSlice'\r\n\r\nconst _paintChapters = ($list, chapters, showCode = false) => {\r\n const LIMIT = 400\r\n const count = chapters.length\r\n const clones = [...chapters]\r\n const paint = (parts) => {\r\n const byId = (id) => $list.querySelector(`#${id}`)\r\n parts.forEach((chapter) => {\r\n const pid = chapter.pid\r\n const id = chapter.id\r\n const code = chapter.code\r\n const rel = chapter.rel\r\n const children = []\r\n const $text = createElement(\r\n 'span',\r\n {\r\n className: 'outline-navigator__text'\r\n },\r\n chapter.text\r\n )\r\n let $link\r\n let $code\r\n let $li\r\n let $subject\r\n let $chapter\r\n\r\n if (showCode) {\r\n $code = createElement(\r\n 'span',\r\n {\r\n className: 'outline-navigator__code',\r\n 'data-id': id\r\n },\r\n chapter.code\r\n )\r\n\r\n children.push($code)\r\n }\r\n\r\n children.push($text)\r\n\r\n $link = createElement(\r\n 'a',\r\n {\r\n id: `chapter__anchor-${id}`,\r\n className: 'outline-navigator__anchor',\r\n href: '#' + rel,\r\n rel: rel,\r\n 'data-id': id,\r\n 'data-code': code\r\n },\r\n children\r\n )\r\n\r\n $li = createElement(\r\n 'li',\r\n {\r\n id: `chapter-${id}`,\r\n className: 'outline-navigator__item',\r\n 'data-id': id,\r\n 'data-code': code\r\n },\r\n $link\r\n )\r\n\r\n if (pid === -1) {\r\n $list.appendChild($li)\r\n } else {\r\n $chapter = byId(`chapter-${pid}`)\r\n $subject = byId(`subject-${pid}`)\r\n\r\n if (!$subject) {\r\n $subject = createElement(\r\n 'ul',\r\n {\r\n id: 'subject-' + pid,\r\n className: 'outline-navigator__subject'\r\n },\r\n $li\r\n )\r\n\r\n $chapter.appendChild($subject)\r\n } else {\r\n $subject.appendChild($li)\r\n }\r\n }\r\n })\r\n }\r\n\r\n // 在大量 DOM 菜单绘制的时候,使用 TIME SLICE 拆分绘制任务\r\n // 以避免一次绘制大量 DOM 导致占用资源过高,导致卡死\r\n if (count > LIMIT) {\r\n // 同步绘制\r\n paint(clones.splice(0, LIMIT))\r\n\r\n // 剩余的采用 timeSlice 机制绘制\r\n while (clones.length > 0) {\r\n const once = clones.splice(0, LIMIT)\r\n timeSlice(() => {\r\n paint(once)\r\n })\r\n }\r\n } else {\r\n paint(clones)\r\n }\r\n}\r\n\r\nexport default _paintChapters\r\n","import isElement from '../types/isElement'\r\n\r\n/**\r\n * 检测某个 DOM 节点的位置是否在另个一个 DOM 节点范围内\r\n * ========================================================================\r\n * @method inBounding\r\n * @param {HTMLElement} child\r\n * @param {HTMLElement} parent\r\n * @return {Boolean}\r\n */\r\nconst inBounding = (child, parent) => {\r\n let isInBounding = false\r\n let parentRect\r\n let childRect\r\n\r\n if (!isElement(child) || !isElement(parent)) {\r\n return isInBounding\r\n }\r\n\r\n parentRect = parent.getBoundingClientRect()\r\n childRect = child.getBoundingClientRect()\r\n\r\n isInBounding = !!(\r\n childRect.top >= parentRect.top &&\r\n childRect.right <= parentRect.right &&\r\n childRect.bottom <= parentRect.bottom &&\r\n childRect.left >= parentRect.left\r\n )\r\n\r\n return isInBounding\r\n}\r\n\r\nexport default inBounding\r\n","import isFunction from '../types/isFunction'\r\nimport isElement from '../types/isElement'\r\n\r\n/**\r\n * 通用的 IntersectionObserver 观察者处理器\r\n * ========================================================================\r\n * @method intersection\r\n * @param {Function} fn\r\n * @param {Object} [props]\r\n * @param {Object|HTMLElement} [props.root]\r\n * @param {String} [props.selector]\r\n * @param {Object} [props.context]\r\n * @param {String} [props.attr]\r\n * @param {String} [props.rootMargin]\r\n */\r\nconst intersection = (fn, props = {}) => {\r\n const root = props.root || null\r\n const selector = props.selector || '.outline-heading'\r\n const context = props.context || null\r\n const rootMargin = props.rootMargin || '0px 0px -90% 0px'\r\n const options = {\r\n rootMargin: rootMargin\r\n }\r\n // eslint-disable-next-line compat/compat\r\n const Observer = new IntersectionObserver((entries) => {\r\n entries.forEach((entry) => {\r\n if (entry.intersectionRatio > 0) {\r\n if (isFunction(fn)) {\r\n fn.call(context || entry.target, entry.target)\r\n }\r\n }\r\n })\r\n }, options)\r\n const $root = isElement(root) ? root : document\r\n\r\n if (root) {\r\n options.root = root\r\n }\r\n\r\n $root.querySelectorAll(selector).forEach((section) => {\r\n Observer.observe(section)\r\n })\r\n\r\n return Observer\r\n}\r\n\r\nexport default intersection\r\n","import isObject from './isObject'\r\n\r\n/**\r\n * 检测测试数据是否为类似 Object 类型\r\n * ========================================================================\r\n * @method isObjectLike\r\n * @param {Object} val - 要检测的数据\r\n * @returns {Boolean} 'val' 是类似 Object 类型,返回 true,否则返回 false\r\n */\r\nconst isObjectLike = (val) => {\r\n return isObject(val) && val !== null\r\n}\r\n\r\nexport default isObjectLike\r\n","import isObjectLike from './isObjectLike'\r\n\r\n/**\r\n * 检测测试数据是否为普通对象\r\n * ========================================================================\r\n * @method isPlainObject\r\n * @param {Object} val - 要检测的数据\r\n * @returns {Boolean} 'val' 是普通对象,返回 true,否则返回 false\r\n */\r\nconst isPlainObject = (val) => {\r\n const getPrototypeOf = Object.getPrototypeOf\r\n let proto\r\n\r\n // Detect obvious negatives\r\n if (!isObjectLike(val)) {\r\n return false\r\n }\r\n\r\n proto = val.prototype\r\n\r\n // JavaScript 对象分为两种:普通对象和函数对象\r\n // 普通对象:原型是 __proto__,没有 prototype 原型(属性)\r\n // 函数对象:原型是 prototype ,prototype 只存在于函数对象上\r\n if (!proto) {\r\n return true\r\n }\r\n\r\n proto = val\r\n\r\n while (getPrototypeOf(proto) !== null) {\r\n proto = getPrototypeOf(proto)\r\n }\r\n\r\n return getPrototypeOf(val) === proto\r\n}\r\n\r\nexport default isPlainObject\r\n","/**\r\n * 转义字符串中的 HTML 标签\r\n * ========================================================================\r\n * @param {String} str - 需要转义的字符串\r\n * @returns {String}\r\n */\r\nconst encodeHTML = (str) => {\r\n const CHARTS = {\r\n '&': '&',\r\n '<': '<',\r\n '>': '>',\r\n \"'\": ''',\r\n '\"': '"'\r\n }\r\n\r\n return str.replace(/[&<>'\"]/g, (tag) => {\r\n return CHARTS[tag] || tag\r\n })\r\n}\r\n\r\nexport default encodeHTML\r\n","import isString from './utils/types/isString'\r\nimport isPlainObject from './utils/types/isPlainObject'\r\nimport isFunction from './utils/types/isFunction'\r\n\r\nimport extend from './utils/lang/extend'\r\nimport later from './utils/lang/later'\r\nimport stripScripts from './utils/lang/stripScripts'\r\nimport encodeHTML from './utils/lang/encodeHTML'\r\nimport cloneDeep from './utils/lang/cloneDeep'\r\nimport guid from './utils/lang/guid'\r\n\r\nimport createElement from './utils/dom/createElement'\r\nimport addClass from './utils/dom/addClass'\r\nimport removeClass from './utils/dom/removeClass'\r\nimport setAttribute from './utils/dom/setAttribute'\r\nimport setAttributes from './utils/dom/setAttributes'\r\n\r\nimport icon from './utils/icons/icon'\r\nimport paint from './utils/icons/paint'\r\nimport on from './utils/event/on'\r\nimport off from './utils/event/off'\r\n\r\nimport Base from './base'\r\n\r\nconst TYPES = ['info', 'success', 'warning', 'error']\r\nconst instances = []\r\nlet instance\r\n\r\npaint()\r\n\r\nclass Message extends Base {\r\n constructor(options) {\r\n super()\r\n\r\n this._default()\r\n\r\n if (options) {\r\n this.initialize(options)\r\n }\r\n }\r\n\r\n _default() {\r\n this.attrs = cloneDeep(Message.DEFAULTS)\r\n\r\n this.$el = null\r\n this.id = ''\r\n this.closed = false\r\n this.visible = false\r\n this.offset = -50\r\n this.timer = null\r\n this.destroyed = false\r\n\r\n return this\r\n }\r\n\r\n initialize(options) {\r\n this.attr(options)\r\n this.id = this.attr('id')\r\n this.offset = this.attr('offset') || -50\r\n\r\n this.$emit('created', { ...this.attr() })\r\n\r\n this.render().addListeners()\r\n\r\n if (this.attr('visible')) {\r\n this.open()\r\n }\r\n\r\n return this\r\n }\r\n\r\n isClosed() {\r\n return this.closed\r\n }\r\n\r\n isDestroyed() {\r\n return this.destroyed\r\n }\r\n\r\n _getClassName() {\r\n const type = this.attr('type')\r\n const effect = this.attr('effect')\r\n const round = this.attr('round')\r\n const closable = this.attr('closable')\r\n const visible = this.attr('visible')\r\n const customClass = this.attr('customClass')\r\n const className = [\r\n 'outline-message',\r\n `outline-message_${type}`,\r\n `outline-message_${effect}`\r\n ]\r\n\r\n if (round) {\r\n className.push('outline-message_round')\r\n }\r\n\r\n if (!closable) {\r\n className.push('outline-message_full-width')\r\n }\r\n\r\n if (visible) {\r\n className.push('outline-message_visible')\r\n }\r\n\r\n if (customClass) {\r\n className.push(customClass)\r\n }\r\n\r\n return className\r\n }\r\n\r\n render() {\r\n const type = this.attr('type')\r\n const message = this.attr('message')\r\n const effect = this.attr('effect')\r\n const round = this.attr('round')\r\n const closable = this.attr('closable')\r\n const dangerouslyUseHTMLString = this.attr('dangerouslyUseHTMLString')\r\n const className = this._getClassName()\r\n const iconName = effect === 'light' ? `circle-${type}` : type\r\n const children = []\r\n let iconSize = 20\r\n let $type\r\n let $message\r\n let $text\r\n let $close\r\n let $el\r\n\r\n if (round && effect === 'default') {\r\n iconSize = 12\r\n }\r\n\r\n if (effect !== 'plain') {\r\n $type = icon(iconName, {\r\n iconSet: 'outline',\r\n size: iconSize\r\n })\r\n addClass($type, 'outline-message__icon')\r\n children.push($type)\r\n }\r\n\r\n if (!dangerouslyUseHTMLString) {\r\n $text = document.createTextNode(encodeHTML(stripScripts(message)))\r\n } else {\r\n $text = document.createDocumentFragment()\r\n $text.innerHTML = message\r\n }\r\n $message = createElement(\r\n 'p',\r\n {\r\n className: 'outline-message__content'\r\n },\r\n [$text]\r\n )\r\n children.push($message)\r\n\r\n if (closable) {\r\n $close = icon('close', {\r\n iconSet: 'outline',\r\n size: 18\r\n })\r\n addClass($close, 'outline-message__close')\r\n children.push($close)\r\n }\r\n\r\n $el = createElement(\r\n 'div',\r\n {\r\n className: className.join(' ')\r\n },\r\n children\r\n )\r\n $el.style.cssText = `top:-50px;`\r\n this.$el = $el\r\n document.body.appendChild(this.$el)\r\n\r\n this.$emit('mounted')\r\n\r\n return this\r\n }\r\n\r\n _refreshIcon() {\r\n const HIDDEN = '.outline-message_hidden'\r\n const $el = this.$el\r\n let iconSize = 20\r\n let type\r\n let effect\r\n let round\r\n let iconName\r\n let $icon\r\n let $svg\r\n let $use\r\n\r\n if (this.isDestroyed()) {\r\n return this\r\n }\r\n\r\n $icon = $el.querySelector('.outline-icon')\r\n\r\n if (!$icon) {\r\n return this\r\n }\r\n\r\n type = this.attr('type')\r\n effect = this.attr('effect')\r\n round = this.attr('round')\r\n\r\n if (effect === 'plain') {\r\n addClass($icon, HIDDEN)\r\n } else {\r\n removeClass($icon, HIDDEN)\r\n\r\n if (round && effect === 'default') {\r\n iconSize = 12\r\n }\r\n }\r\n\r\n $svg = $icon.querySelector('.outline-icon__svg')\r\n setAttributes($svg, {\r\n style: `width:${iconSize}px;height:${iconSize}px;`\r\n })\r\n\r\n $use = $svg.querySelector('use')\r\n iconName = effect === 'light' ? `circle-${type}` : type\r\n setAttribute($use, 'xlink:href', `#outline-icon-${iconName}`)\r\n\r\n return this\r\n }\r\n\r\n _refreshMessage() {\r\n const $el = this.$el\r\n let $message\r\n let dangerouslyUseHTMLString\r\n let message\r\n let text\r\n\r\n if (this.isDestroyed()) {\r\n return this\r\n }\r\n\r\n $message = $el.querySelector('.outline-message__content')\r\n dangerouslyUseHTMLString = this.attr('dangerouslyUseHTMLString')\r\n message = this.attr('message')\r\n\r\n if (!dangerouslyUseHTMLString) {\r\n text = encodeHTML(stripScripts(message))\r\n } else {\r\n text = message\r\n }\r\n\r\n $message.innerHTML = text\r\n\r\n return this\r\n }\r\n\r\n _refreshClose() {\r\n const HIDDEN = '.outline-message_hidden'\r\n const $el = this.$el\r\n let $close\r\n let closable\r\n\r\n if (this.isDestroyed()) {\r\n return this\r\n }\r\n\r\n $close = $el.querySelector('.outline-message__close')\r\n closable = this.attr('closable')\r\n\r\n if ($close) {\r\n if (closable) {\r\n addClass($close, HIDDEN)\r\n } else {\r\n removeClass($close, HIDDEN)\r\n }\r\n }\r\n\r\n return this\r\n }\r\n\r\n _refreshEl() {\r\n const $el = this.$el\r\n let className\r\n\r\n if (this.isDestroyed()) {\r\n return this\r\n }\r\n\r\n className = this._getClassName()\r\n setAttribute($el, 'className', className.join(' '))\r\n\r\n return this\r\n }\r\n\r\n refresh(options) {\r\n if (!isPlainObject(options)) {\r\n return this\r\n }\r\n\r\n this.attr(options)\r\n ._refreshIcon()\r\n ._refreshMessage()\r\n ._refreshClose()\r\n ._refreshEl()\r\n\r\n return this\r\n }\r\n\r\n clearTimer() {\r\n if (this.isDestroyed()) {\r\n return this\r\n }\r\n\r\n if (this.timer) {\r\n clearTimeout(this.timer)\r\n this.timer = null\r\n }\r\n\r\n return this\r\n }\r\n\r\n startTimer(duration) {\r\n if (this.isDestroyed()) {\r\n return this\r\n }\r\n\r\n this.timer = later(() => {\r\n this.$emit('opened')\r\n this.close()\r\n }, duration * 1000)\r\n\r\n return this\r\n }\r\n\r\n open(options) {\r\n const $el = this.$el\r\n let offset\r\n let duration\r\n let top\r\n let cssRules\r\n\r\n if (this.isDestroyed()) {\r\n return this\r\n }\r\n\r\n if (this.isClosed()) {\r\n this.refresh(options)\r\n }\r\n\r\n offset = this.attr('offset')\r\n duration = this.attr('duration')\r\n top = offset && offset >= this.offset ? offset : this.offset\r\n cssRules = `top:${top}px;`\r\n\r\n this.clearTimer()\r\n\r\n this.$emit('beforeOpen')\r\n\r\n later(() => {\r\n this.visible = true\r\n\r\n addClass($el, 'outline-message_visible')\r\n $el.style.cssText = cssRules\r\n\r\n if (duration > 0) {\r\n this.startTimer(duration)\r\n }\r\n }, 100)\r\n\r\n return this\r\n }\r\n\r\n close() {\r\n const $el = this.$el\r\n const cssRules = `top:-50px;`\r\n let destroyAfterClosed\r\n let beforeClose\r\n\r\n if (this.isDestroyed()) {\r\n return this\r\n }\r\n\r\n destroyAfterClosed = this.attr('destroyAfterClosed')\r\n beforeClose = this.attr('beforeClose')\r\n\r\n if (isFunction(beforeClose)) {\r\n beforeClose.call(this)\r\n }\r\n\r\n $el.style.cssText = cssRules\r\n removeClass($el, 'outline-message_visible')\r\n\r\n this.visible = false\r\n this.closed = true\r\n\r\n later(() => {\r\n this.$emit('closed')\r\n\r\n if (destroyAfterClosed) {\r\n this.destroy()\r\n }\r\n }, 500)\r\n\r\n return this\r\n }\r\n\r\n destroy() {\r\n this.$emit('beforeDestroy')\r\n\r\n if (this.isDestroyed()) {\r\n return this\r\n }\r\n\r\n this.removeListeners()\r\n\r\n document.body.removeChild(this.$el)\r\n\r\n clearTimeout(this.timer)\r\n this._default()\r\n\r\n this.$emit('afterDestroy')\r\n\r\n return this\r\n }\r\n\r\n onMouseEnter() {\r\n this.clearTimer()\r\n return this\r\n }\r\n\r\n onMouseLeave() {\r\n const duration = this.attr('duration')\r\n const delay = this.attr('delay')\r\n\r\n if (duration <= 0) {\r\n return this\r\n }\r\n\r\n this.startTimer(delay)\r\n\r\n return this\r\n }\r\n\r\n onClose() {\r\n this.clearTimer()\r\n this.close()\r\n return this\r\n }\r\n\r\n addListeners() {\r\n const $el = this.$el\r\n\r\n on(\r\n $el,\r\n '.outline-message__content',\r\n 'mouseenter',\r\n this.onMouseEnter,\r\n this,\r\n true\r\n )\r\n on(\r\n $el,\r\n '.outline-message__content',\r\n 'mouseleave',\r\n this.onMouseLeave,\r\n this,\r\n true\r\n )\r\n on($el, '.outline-message__close', 'click', this.onClose, this, true)\r\n\r\n return this\r\n }\r\n\r\n removeListeners() {\r\n const $el = this.$el\r\n\r\n off($el, 'mouseenter', this.onMouseEnter)\r\n off($el, 'mouseleave', this.onMouseLeave)\r\n off($el, 'click', this.onClose)\r\n\r\n return this\r\n }\r\n}\r\n\r\nMessage.DEFAULTS = (() => {\r\n const OPTIONS = {\r\n id: '',\r\n type: 'info',\r\n effect: 'default',\r\n round: false,\r\n offset: 30,\r\n duration: 3,\r\n delay: 2,\r\n message: '',\r\n customClass: '',\r\n closable: true,\r\n visible: true,\r\n dangerouslyUseHTMLString: false,\r\n destroyAfterClosed: true,\r\n beforeClose: null\r\n }\r\n\r\n return cloneDeep(OPTIONS)\r\n})()\r\n\r\nTYPES.forEach((type) => {\r\n Message[type] = (options) => {\r\n const config = {}\r\n const id = guid(`outline-message-`)\r\n const beforeClose = options.beforeClose || null\r\n let offset = options.offset || 30\r\n\r\n if (isString(options)) {\r\n config.message = options\r\n } else {\r\n if (isPlainObject(options)) {\r\n extend(config, options)\r\n }\r\n }\r\n config.id = id\r\n config.type = type\r\n config.offset = offset\r\n config.visible = false\r\n config.beforeClose = () => {\r\n Message.close(id, beforeClose)\r\n }\r\n\r\n instance = new Message(config)\r\n instances.forEach((item) => {\r\n offset += item.$el.offsetHeight + 16\r\n })\r\n instance.offset = offset\r\n instance.open()\r\n instances.push(instance)\r\n\r\n return instance\r\n }\r\n})\r\n\r\n// 关闭指定 id 消息的静态方法\r\nMessage.close = (id, beforeClose) => {\r\n const len = instances.length\r\n let index = -1\r\n let i\r\n let offsetHeight\r\n\r\n instances.forEach((instance, i) => {\r\n // 在 instances 中通过 id 找到要关闭的消息\r\n if (id === instance.id) {\r\n offsetHeight = instance.$el.offsetHeight\r\n index = i\r\n\r\n // 关闭消息\r\n if (isFunction(beforeClose)) {\r\n beforeClose.call(instance)\r\n }\r\n\r\n instances.splice(i, 1)\r\n }\r\n })\r\n\r\n if (len <= 1 || index === -1 || index > instances.length - 1) {\r\n return false\r\n }\r\n\r\n i = index\r\n\r\n // 界面中的消息逐个向上收起\r\n for (; i < len - 1; i += 1) {\r\n const dom = instances[i].$el\r\n\r\n dom.style['top'] = parseInt(dom.style['top'], 10) - offsetHeight - 16 + 'px'\r\n }\r\n}\r\n\r\n// 关闭所有消息的静态方法\r\nMessage.clear = () => {\r\n let i = instances.length - 1\r\n for (; i >= 0; i -= 1) {\r\n instances[i].close()\r\n }\r\n}\r\n\r\nexport default Message\r\n","import isFunction from './utils/types/isFunction'\r\n\r\nclass Command {\r\n constructor(name, action) {\r\n this.name = name\r\n\r\n if (isFunction(action)) {\r\n this.action = action\r\n }\r\n }\r\n\r\n execute() {\r\n this.action()\r\n\r\n return this\r\n }\r\n}\r\n\r\nexport default Command\r\n","import isFunction from './utils/types/isFunction'\r\n\r\nclass Commands {\r\n constructor() {\r\n this.commands = []\r\n }\r\n\r\n get(name) {\r\n return this.commands.find((cmd) => cmd.name === name)\r\n }\r\n\r\n add(command) {\r\n this.commands.push(command)\r\n\r\n return this\r\n }\r\n\r\n del(name) {\r\n const commands = this.commands\r\n const command = commands.find((cmd) => cmd.name === name)\r\n const index = command ? commands.indexOf(command) : -1\r\n\r\n if (index > -1) {\r\n commands.splice(index, 1)\r\n }\r\n\r\n return this\r\n }\r\n\r\n clear() {\r\n this.commands = []\r\n\r\n return this\r\n }\r\n\r\n execute(name) {\r\n const command = this.commands.find((cmd) => cmd.name === name)\r\n\r\n if (isFunction(command?.execute)) {\r\n command.execute()\r\n }\r\n\r\n return this\r\n }\r\n}\r\n\r\nexport default Commands\r\n","import icon from './utils/icons/icon'\r\nimport createElement from './utils/dom/createElement'\r\nimport addClass from './utils/dom/addClass'\r\n\r\nconst _createButton = (button, rounded = true) => {\r\n const $icon = icon(button.icon, {\r\n iconSet: button.iconSet || 'outline',\r\n color: button.color || '',\r\n size: button.size\r\n })\r\n const $anchor = createElement(\r\n 'a',\r\n {\r\n className: `outline-toolbar__anchor`,\r\n href: button.link\r\n },\r\n $icon\r\n )\r\n const $button = createElement(\r\n 'div',\r\n {\r\n className: `outline-toolbar__button ${button.name}`,\r\n 'data-cmd': button.name\r\n },\r\n [button.link ? $anchor : $icon]\r\n )\r\n\r\n addClass($icon, 'outline-toolbar__icon')\r\n\r\n if (rounded) {\r\n addClass($button, 'outline-toolbar_rounded')\r\n }\r\n\r\n if (button.disabled) {\r\n addClass($button, 'outline-toolbar_disabled')\r\n }\r\n\r\n return $button\r\n}\r\n\r\nexport default _createButton\r\n","import isString from './utils/types/isString'\r\nimport isFunction from './utils/types/isFunction'\r\nimport isObject from './utils/types/isObject'\r\nimport isArray from './utils/types/isArray'\r\nimport later from './utils/lang/later'\r\nimport guid from './utils/lang/guid'\r\nimport cloneDeep from './utils/lang/cloneDeep'\r\nimport createElement from './utils/dom/createElement'\r\nimport addClass from './utils/dom/addClass'\r\nimport hasClass from './utils/dom/hasClass'\r\nimport removeClass from './utils/dom/removeClass'\r\nimport on from './utils/event/on'\r\nimport off from './utils/event/off'\r\nimport paint from './utils/icons/paint'\r\n\r\nimport Base from './base'\r\nimport Command from './command'\r\nimport Commands from './commands'\r\n\r\nimport _createButton from './_createButton'\r\n\r\nconst DISABLED = 'outline-toolbar_disabled'\r\nconst HIDDEN = 'outline-toolbar_hidden'\r\nconst ACTIVE = 'outline-toolbar_active'\r\n\r\nclass Toolbar extends Base {\r\n constructor(options) {\r\n super()\r\n\r\n this._default()\r\n\r\n if (options) {\r\n this.initialize(options)\r\n }\r\n }\r\n\r\n _default() {\r\n this.attrs = cloneDeep(Toolbar.DEFAULTS)\r\n\r\n this.disabled = false\r\n this.closed = false\r\n\r\n this.$el = null\r\n this.buttons = []\r\n this.commands = null\r\n\r\n return this\r\n }\r\n\r\n initialize(options) {\r\n let created\r\n\r\n this.attr(options)\r\n\r\n this.disabled = this.attr('disabled')\r\n this.closed = this.attr('closed')\r\n this.commands = new Commands()\r\n\r\n created = this.attr('created')\r\n\r\n if (isFunction(created)) {\r\n created.call(this)\r\n }\r\n\r\n this.render().addListeners()\r\n\r\n return this\r\n }\r\n\r\n isHighlight(name) {\r\n const button = this.get(name)\r\n\r\n if (!button) {\r\n return false\r\n }\r\n\r\n return hasClass(button.$el, ACTIVE)\r\n }\r\n\r\n isDisabled(name) {\r\n let button\r\n\r\n if (name) {\r\n button = this.get(name)\r\n\r\n return button.disabled\r\n }\r\n\r\n return this.disabled\r\n }\r\n\r\n isExist(name) {\r\n const button = this.get(name)\r\n return !!button\r\n }\r\n\r\n isClosed() {\r\n return this.closed\r\n }\r\n\r\n _getCommand(button) {\r\n const _self = this\r\n const { action, name } = button\r\n let command = null\r\n let handler = null\r\n let context\r\n let listener\r\n\r\n if (!action) {\r\n return command\r\n }\r\n\r\n handler = action.handler\r\n context = action.context || this\r\n\r\n if (isFunction(handler)) {\r\n listener = handler\r\n } else if (isString(handler)) {\r\n listener = function () {\r\n _self.$emit(handler, name)\r\n }\r\n }\r\n\r\n if (isFunction(listener)) {\r\n command = new Command(name, listener.bind(context))\r\n }\r\n\r\n return command\r\n }\r\n\r\n get(name) {\r\n return this.buttons.find((button) => button.name === name)\r\n }\r\n\r\n render() {\r\n const mounted = this.attr('mounted')\r\n const buttons = this.attr('buttons') || []\r\n const placement = this.attr('placement')\r\n\r\n paint()\r\n\r\n this.$el = createElement('div', {\r\n id: guid('outline-toolbar'),\r\n className: `outline-toolbar outline-toolbar_${placement}`\r\n })\r\n this._paint(buttons)\r\n document.body.appendChild(this.$el)\r\n\r\n if (this.closed) {\r\n this.hide()\r\n }\r\n\r\n if (this.disabled) {\r\n this.disable()\r\n }\r\n\r\n if (isFunction(mounted)) {\r\n mounted.call(this)\r\n }\r\n\r\n return this\r\n }\r\n\r\n erase() {\r\n this.$el.innerHTML = ''\r\n return this\r\n }\r\n\r\n _paint(buttons) {\r\n const rounded = this.attr('rounded')\r\n const $fragment = document.createDocumentFragment()\r\n\r\n buttons.forEach((button) => {\r\n const $button = _createButton(button, rounded)\r\n const command = this._getCommand(button)\r\n const { name, disabled, context } = button\r\n\r\n $fragment.appendChild($button)\r\n\r\n if (!this.isExist(name)) {\r\n this.buttons.push({\r\n $el: $button,\r\n name,\r\n disabled: disabled || false,\r\n context: context || this\r\n })\r\n\r\n if (command) {\r\n this.commands.add(command)\r\n }\r\n }\r\n })\r\n\r\n this.$el.appendChild($fragment)\r\n\r\n return this\r\n }\r\n\r\n _remove() {\r\n document.body.removeChild(this.$el)\r\n return this\r\n }\r\n\r\n refresh(buttons) {\r\n this.attr({ buttons })\r\n this.erase()._paint(buttons)\r\n return this\r\n }\r\n\r\n add(button) {\r\n const $el = this.$el\r\n const $fragment = document.createDocumentFragment()\r\n const buttons = this.attr('buttons') || []\r\n const { name, disabled, context } = button\r\n const command = this._getCommand(button)\r\n const _add = (button) => {\r\n const $button = _createButton(button)\r\n\r\n $fragment.appendChild($button)\r\n\r\n buttons.push(button)\r\n this.buttons.push({\r\n $el: $button,\r\n name,\r\n disabled: disabled || false,\r\n context: context || this,\r\n command\r\n })\r\n\r\n if (command) {\r\n this.commands.add(command)\r\n }\r\n }\r\n\r\n if (isObject(button)) {\r\n _add(button)\r\n } else if (isArray(button)) {\r\n button.forEach((item) => {\r\n if (isObject(item)) {\r\n _add(item)\r\n }\r\n })\r\n }\r\n $el.appendChild($fragment)\r\n\r\n return this\r\n }\r\n\r\n remove(name) {\r\n const $el = this.$el\r\n const buttons = this.buttons\r\n const button = this.get(name)\r\n let index = -1\r\n\r\n if (!button) {\r\n return this\r\n }\r\n\r\n index = buttons.indexOf(button)\r\n\r\n if (index > -1) {\r\n buttons.splice(index, 1)\r\n this.attr('buttons').splice(index, 1)\r\n }\r\n\r\n this._disable(name)\r\n $el.removeChild(button.$el)\r\n\r\n return this\r\n }\r\n\r\n _disable(name) {\r\n const button = this.get(name)\r\n const command = this.commands.get(name)\r\n\r\n if (!button || button.disabled) {\r\n return this\r\n }\r\n\r\n button.disabled = true\r\n\r\n if (command) {\r\n this.commands.del(command)\r\n }\r\n\r\n addClass(button.$el, DISABLED)\r\n\r\n return this\r\n }\r\n\r\n _enable(name) {\r\n const button = this.get(name)\r\n const command = this.commands.get(name)\r\n\r\n if (!button || !button.disabled) {\r\n return this\r\n }\r\n\r\n button.disabled = false\r\n\r\n if (command) {\r\n this.commands.add(command)\r\n }\r\n\r\n removeClass(button.$el, DISABLED)\r\n\r\n return this\r\n }\r\n\r\n disable(name) {\r\n const disabled = this.attr('afterDisabled')\r\n\r\n if (name) {\r\n this._disable(name)\r\n } else {\r\n addClass(this.$el, DISABLED)\r\n this.removeListeners()\r\n this.disabled = true\r\n\r\n if (isFunction(disabled)) {\r\n disabled.call(this)\r\n }\r\n }\r\n\r\n return this\r\n }\r\n\r\n enable(name) {\r\n const enabled = this.attr('afterEnabled')\r\n\r\n if (name) {\r\n this._enable(name)\r\n } else {\r\n this.disabled = false\r\n removeClass(this.$el, DISABLED)\r\n this.addListeners()\r\n\r\n if (isFunction(enabled)) {\r\n enabled.call(this)\r\n }\r\n }\r\n\r\n return this\r\n }\r\n\r\n show(name) {\r\n const opened = this.attr('afterOpened')\r\n const button = this.get(name)\r\n const $el = this.$el\r\n\r\n if (name) {\r\n if (!button) {\r\n return this\r\n }\r\n\r\n removeClass(button.$el, HIDDEN)\r\n } else {\r\n removeClass($el, HIDDEN)\r\n this.closed = false\r\n\r\n if (isFunction(opened)) {\r\n later(() => {\r\n opened.call(this)\r\n }, 310)\r\n }\r\n }\r\n\r\n return this\r\n }\r\n\r\n hide(name) {\r\n const closed = this.attr('afterClosed')\r\n const button = this.get(name)\r\n const $el = this.$el\r\n\r\n if (name) {\r\n if (!button) {\r\n return this\r\n }\r\n\r\n addClass(button.$el, HIDDEN)\r\n } else {\r\n addClass($el, HIDDEN)\r\n this.closed = true\r\n\r\n if (isFunction(closed)) {\r\n later(() => {\r\n closed.call(this)\r\n }, 310)\r\n }\r\n }\r\n\r\n return this\r\n }\r\n\r\n toggle(name) {\r\n if (this.isClosed()) {\r\n this.show(name)\r\n } else {\r\n this.hide(name)\r\n }\r\n\r\n return this\r\n }\r\n\r\n highlight(name) {\r\n const button = this.get(name)\r\n let $button\r\n\r\n if (!button) {\r\n return this\r\n }\r\n\r\n $button = button.$el\r\n\r\n if (hasClass($button, ACTIVE)) {\r\n removeClass($button, ACTIVE)\r\n } else {\r\n addClass($button, ACTIVE)\r\n }\r\n\r\n return this\r\n }\r\n\r\n destroy() {\r\n const beforeDestroy = this.attr('beforeDestroy')\r\n const afterDestroy = this.attr('afterDestroy')\r\n\r\n if (isFunction(beforeDestroy)) {\r\n beforeDestroy.call(this)\r\n }\r\n\r\n this.commands.clear()\r\n this.removeListeners()._remove()._default()\r\n\r\n if (isFunction(afterDestroy)) {\r\n afterDestroy.call(this)\r\n }\r\n\r\n return this\r\n }\r\n\r\n execute(name) {\r\n if (this.isDisabled(name)) {\r\n return this\r\n }\r\n\r\n this.commands.execute(name)\r\n\r\n return this\r\n }\r\n\r\n onExecute(evt) {\r\n const $button = evt.delegateTarget\r\n let cmd = ''\r\n\r\n if ($button) {\r\n cmd = $button.getAttribute('data-cmd')\r\n\r\n if (cmd) {\r\n this.execute(cmd)\r\n }\r\n }\r\n\r\n return this\r\n }\r\n\r\n _updateToolbar({ top, min, max }) {\r\n const current = Math.ceil(top)\r\n\r\n if (current <= min) {\r\n this.hide('up')\r\n this.show('down')\r\n } else if (current >= max) {\r\n this.hide('down')\r\n this.show('up')\r\n } else if (current > min && current < max) {\r\n this.show('up')\r\n this.show('down')\r\n }\r\n\r\n return this\r\n }\r\n\r\n onToolbarUpdate({ top, min, max }) {\r\n this._updateToolbar({ top, min, max })\r\n return this\r\n }\r\n\r\n onAddButton(buttons) {\r\n this.attr({\r\n buttons\r\n })\r\n this.refresh(buttons)\r\n\r\n return this\r\n }\r\n\r\n onRemoveButton(name) {\r\n this.remove(name)\r\n return this\r\n }\r\n\r\n addListeners() {\r\n const buttons = this.attr('buttons') || []\r\n const $el = this.$el\r\n\r\n if (!buttons || buttons.length < 1) {\r\n return this\r\n }\r\n\r\n on($el, `.outline-toolbar__button`, 'click', this.onExecute, this, true)\r\n\r\n this.$on('toolbar:update', this.onToolbarUpdate)\r\n this.$on('toolbar:add:button', this.onAddButton)\r\n this.$on('toolbar:remove:button', this.onRemoveButton)\r\n this.$on('toolbar:toggle', this.toggle)\r\n\r\n return this\r\n }\r\n\r\n removeListeners() {\r\n const buttons = this.attr('buttons') || []\r\n const $el = this.$el\r\n\r\n if (!buttons || buttons.length < 1) {\r\n return this\r\n }\r\n\r\n off($el, '.outline-toolbar__button', this.onExecute)\r\n\r\n this.$off('toolbar:update')\r\n this.$off('toolbar:add:button')\r\n this.$off('toolbar:remove:button')\r\n this.$off('toolbar:toggle')\r\n\r\n return this\r\n }\r\n}\r\n\r\nToolbar.DEFAULTS = (() => {\r\n const OPTIONS = {\r\n placement: 'ltr',\r\n closed: false,\r\n disabled: false,\r\n rounded: true,\r\n buttons: [],\r\n created: null,\r\n mounted: null,\r\n afterClosed: null,\r\n afterOpened: null,\r\n afterDisabled: null,\r\n afterEnabled: null,\r\n beforeDestroy: null,\r\n afterDestroy: null\r\n }\r\n\r\n return cloneDeep(OPTIONS)\r\n})()\r\n\r\nexport default Toolbar\r\n","import publish from './utils/observer/emit'\r\n\r\nclass Speech {\r\n constructor(options) {\r\n this.utterance = new SpeechSynthesisUtterance()\r\n\r\n if (options) {\r\n this.initialize(options)\r\n }\r\n }\r\n\r\n _initialize(options) {\r\n if (options.lang) {\r\n this.setLang(options.lang)\r\n }\r\n\r\n if (options.pitch) {\r\n this.setPitch(options.pitch)\r\n }\r\n\r\n if (options.rate) {\r\n this.setRate(options.rate)\r\n }\r\n\r\n if (options.text) {\r\n this.setText(options.text)\r\n }\r\n\r\n if (options.voice) {\r\n this.setVoice(options.voice)\r\n }\r\n\r\n if (options.volume) {\r\n this.setVolume(options.volume)\r\n }\r\n\r\n return this\r\n }\r\n\r\n initialize(options) {\r\n this._initialize(options)._addListeners()\r\n return this\r\n }\r\n\r\n isSpeaking() {\r\n return speechSynthesis.speaking\r\n }\r\n\r\n isPending() {\r\n return speechSynthesis.pending\r\n }\r\n\r\n isPaused() {\r\n return speechSynthesis.paused\r\n }\r\n\r\n getVoices() {\r\n return speechSynthesis.getVoices()\r\n }\r\n\r\n setLang(lang) {\r\n this.utterance.lang = lang\r\n return this\r\n }\r\n\r\n setPitch(pitch) {\r\n this.utterance.pitch = pitch\r\n return this\r\n }\r\n\r\n setRate(rate) {\r\n this.utterance.rate = rate\r\n return this\r\n }\r\n\r\n setText(text) {\r\n this.utterance.text = text\r\n return this\r\n }\r\n\r\n setVoice(voice) {\r\n this.utterance.voice = voice\r\n return this\r\n }\r\n\r\n setVolume(volume) {\r\n this.utterance.volume = volume\r\n return this\r\n }\r\n\r\n speak(text) {\r\n if (text) {\r\n this.setText(text)\r\n }\r\n\r\n speechSynthesis.speak(this.utterance)\r\n\r\n return this\r\n }\r\n\r\n pause() {\r\n speechSynthesis.pause()\r\n return this\r\n }\r\n\r\n resume() {\r\n speechSynthesis.resume()\r\n return this\r\n }\r\n\r\n cancel() {\r\n speechSynthesis.cancel()\r\n this.setText('')\r\n return this\r\n }\r\n\r\n _addListeners() {\r\n const UTTERANCE_EVENTS = [\r\n 'boundary',\r\n 'end',\r\n 'error',\r\n 'start',\r\n 'mark',\r\n 'pause',\r\n 'resume'\r\n ]\r\n const utterance = this.utterance\r\n const speech = this\r\n\r\n UTTERANCE_EVENTS.forEach((name) => {\r\n utterance[`on${name}`] = (event) => {\r\n publish(name, {\r\n event,\r\n speech\r\n })\r\n }\r\n })\r\n\r\n speechSynthesis.onvoiceschanged = (event) => {\r\n publish('voiceschanged', {\r\n event,\r\n speech\r\n })\r\n }\r\n\r\n return this\r\n }\r\n}\r\n\r\nSpeech.isSupport = (() => {\r\n return 'speechSynthesis' in window\r\n})()\r\n\r\nexport default Speech\r\n","import addClass from './utils/dom/addClass'\r\n\r\nconst _updateSiblingElements = (siblingElement, isPrev) => {\r\n let tagName\r\n let $sibling = siblingElement\r\n\r\n while ($sibling) {\r\n tagName = $sibling.tagName.toLowerCase()\r\n\r\n if (tagName !== 'script' && tagName !== 'style') {\r\n addClass($sibling, 'outline-reader_sibling')\r\n }\r\n\r\n if (isPrev) {\r\n $sibling = $sibling.previousElementSibling\r\n } else {\r\n $sibling = $sibling.nextElementSibling\r\n }\r\n }\r\n}\r\n\r\nexport default _updateSiblingElements\r\n","/**\r\n * 检测当前设备是否为移动设备\r\n * ========================================================================\r\n * @method isMobile\r\n * @return {boolean}\r\n */\r\nconst isMobile = () => {\r\n const ua = navigator.userAgent\r\n\r\n return /Mobile|mini|Fennec|Android|iP(ad|od|hone)|NokiaN[^/]*/.test(ua)\r\n}\r\n\r\nexport default isMobile\r\n","import cloneDeep from './utils/lang/cloneDeep'\r\nimport later from './utils/lang/later'\r\nimport isString from './utils/types/isString'\r\nimport isElement from './utils/types/isElement'\r\nimport isFunction from './utils/types/isFunction'\r\nimport createElement from './utils/dom/createElement'\r\nimport addClass from './utils/dom/addClass'\r\nimport removeClass from './utils/dom/removeClass'\r\nimport at from './utils/event/at'\r\nimport stop from './utils/event/stop'\r\nimport off from './utils/event/off'\r\n\r\nimport Base from './base'\r\nimport Message from './message'\r\nimport Toolbar from './toolbar'\r\nimport Speech from './speech'\r\n\r\nimport _updateSiblingElements from './_updateSiblingElements'\r\nimport isMobile from './utils/dom/isMobile'\r\n\r\nconst ENTER_READING_TIP = '进入阅读模式,按 ESC 键可退出阅读模式'\r\n\r\nclass Reader extends Base {\r\n constructor(options) {\r\n super()\r\n\r\n this._default()\r\n\r\n if (options) {\r\n this.initialize(options)\r\n }\r\n }\r\n\r\n _default() {\r\n this.attrs = cloneDeep(Reader.DEFAULTS)\r\n this.reading = false\r\n\r\n this.$target = null\r\n this.$el = null\r\n this.$paper = null\r\n this.$title = null\r\n this.$article = null\r\n this.$progress = null\r\n\r\n this.toolbar = null\r\n this.speech = null\r\n\r\n return this\r\n }\r\n\r\n initialize(options) {\r\n let target\r\n\r\n this.attr(options)\r\n\r\n target = this.attr('target')\r\n\r\n if (isString(target)) {\r\n this.$target = document.querySelector(target)\r\n } else if (isElement(target)) {\r\n this.$target = target\r\n }\r\n\r\n if (!this.$target) {\r\n return this\r\n }\r\n\r\n if (Speech.isSupport) {\r\n this.speech = new Speech()\r\n }\r\n\r\n this.render().addListeners()\r\n\r\n return this\r\n }\r\n\r\n isSpeaking() {\r\n return this?.speech?.isSpeaking()\r\n }\r\n\r\n render() {\r\n this._renderEdge()._paint(this.$target)\r\n return this\r\n }\r\n\r\n erase() {\r\n this.$article.innerHTML = ''\r\n return this\r\n }\r\n\r\n _paint($content) {\r\n const $fragment = document.createDocumentFragment()\r\n const $children = [...$content.cloneNode(true).children]\r\n\r\n later(() => {\r\n $children.forEach(($child) => {\r\n $fragment.appendChild($child)\r\n })\r\n\r\n this.$article.appendChild($fragment)\r\n })\r\n\r\n return this\r\n }\r\n\r\n _remove() {\r\n const $el = this.$el\r\n const toolbar = this.toolbar\r\n\r\n if ($el) {\r\n document.body.removeChild($el)\r\n }\r\n\r\n if (toolbar) {\r\n toolbar.destroy()\r\n }\r\n\r\n return this\r\n }\r\n\r\n refresh() {\r\n this.erase()._paint(this.$target)\r\n return this\r\n }\r\n\r\n _animateTimeline() {\r\n // eslint-disable-next-line\r\n if (!window.ScrollTimeline || !isMobile()) {\r\n return this\r\n }\r\n\r\n this.$progress.animate(\r\n {\r\n // from\r\n scale: ['0 1', '1 1']\r\n },\r\n {\r\n // eslint-disable-next-line\r\n timeline: new ScrollTimeline({\r\n source: this.$article,\r\n axis: 'block'\r\n })\r\n }\r\n )\r\n\r\n return this\r\n }\r\n\r\n _renderEdge() {\r\n const $target = this.$target\r\n const mobile = isMobile()\r\n const size = mobile ? 26 : 20\r\n let title = this.attr('title')\r\n let $el\r\n let $paper\r\n let $title\r\n let $article\r\n let $progress\r\n let $sibling\r\n\r\n $progress = createElement('div', {\r\n className: 'outline-reader__progress'\r\n })\r\n this.$progress = $progress\r\n\r\n $title = $target.querySelector('h1')\r\n\r\n if (isElement(title)) {\r\n $title = title\r\n }\r\n\r\n if (isElement($title)) {\r\n title = $title.innerText\r\n }\r\n\r\n $title = createElement(\r\n 'h1',\r\n {\r\n className: 'outline-reader__title'\r\n },\r\n title\r\n )\r\n this.$title = $title\r\n\r\n $article = createElement(\r\n 'article',\r\n {\r\n id: 'outline-reader__article',\r\n className: 'outline-reader__article'\r\n },\r\n isMobile() ? [] : [$progress.cloneNode()]\r\n )\r\n this.$article = $article\r\n\r\n $paper = createElement(\r\n 'div',\r\n {\r\n id: 'outline-reader__paper',\r\n className: 'outline-reader__paper'\r\n },\r\n [$title, $article]\r\n )\r\n this.$paper = $paper\r\n\r\n const buttons = []\r\n\r\n buttons.push({\r\n name: 'print',\r\n icon: 'print',\r\n size,\r\n action: {\r\n context: this,\r\n handler: this.print\r\n }\r\n })\r\n\r\n if (Speech.isSupport && this.attr('allowSpeak')) {\r\n buttons.push({\r\n name: 'speak',\r\n icon: 'sound',\r\n size,\r\n action: {\r\n context: this,\r\n handler: this.speak\r\n }\r\n })\r\n }\r\n\r\n buttons.push({\r\n name: 'exit',\r\n icon: 'close',\r\n size,\r\n action: {\r\n context: this,\r\n handler: this.exit\r\n }\r\n })\r\n\r\n this.toolbar = new Toolbar({\r\n placement: 'rtl',\r\n buttons\r\n })\r\n\r\n $el = createElement(\r\n 'section',\r\n {\r\n id: 'outline-reader',\r\n className: 'outline-reader outline-reader_hidden'\r\n },\r\n [$progress, $paper, this.toolbar.$el]\r\n )\r\n this.$el = $el\r\n\r\n document.body.appendChild($el)\r\n\r\n this._animateTimeline()\r\n\r\n later(() => {\r\n // 设置邻居节点的打印样式\r\n $sibling = $el.previousElementSibling\r\n _updateSiblingElements($sibling, true)\r\n\r\n $sibling = $el.nextElementSibling\r\n _updateSiblingElements($sibling)\r\n })\r\n\r\n return this\r\n }\r\n\r\n enter() {\r\n const READER = 'outline-reader'\r\n const READING = `${READER}--reading`\r\n const HIDDEN = `${READER}_hidden`\r\n const $el = this.$el\r\n const $siblings = document.querySelectorAll('.outline-reader_sibling')\r\n const enterReadingTip = this.attr('enterReadingTip') || ENTER_READING_TIP\r\n\r\n if (this.reading || !$el) {\r\n return this\r\n }\r\n\r\n $siblings.forEach(($sibling) => {\r\n addClass($sibling, HIDDEN)\r\n })\r\n addClass($el, READING)\r\n removeClass($el, HIDDEN)\r\n this.toolbar.show()\r\n this.reading = true\r\n\r\n Message.info({\r\n round: true,\r\n message: enterReadingTip\r\n })\r\n\r\n this.$emit('reader:enter')\r\n\r\n return this\r\n }\r\n\r\n exit() {\r\n const SPEAK = 'speak'\r\n const READER = 'outline-reader'\r\n const READING = `${READER}--reading`\r\n const HIDDEN = `${READER}_hidden`\r\n const $el = this.$el\r\n const $siblings = document.querySelectorAll('.outline-reader_sibling')\r\n const speech = this.speech\r\n const toolbar = this.toolbar\r\n\r\n if (!this.reading || !$el) {\r\n return this\r\n }\r\n\r\n addClass($el, HIDDEN)\r\n removeClass($el, READING)\r\n $siblings.forEach(($sibling) => {\r\n removeClass($sibling, HIDDEN)\r\n })\r\n toolbar.hide()\r\n this.reading = false\r\n\r\n if (speech) {\r\n if (toolbar.isHighlight(SPEAK)) {\r\n toolbar.highlight(SPEAK)\r\n }\r\n\r\n speech.cancel()\r\n }\r\n\r\n this.$emit('reader:exit')\r\n\r\n return this\r\n }\r\n\r\n toggle() {\r\n if (this.reading) {\r\n this.exit()\r\n } else {\r\n this.enter()\r\n }\r\n\r\n return this\r\n }\r\n\r\n speak() {\r\n const text = this.$article.innerText\r\n const speech = this.speech\r\n\r\n if (!Speech.isSupport || !speech) {\r\n return this\r\n }\r\n\r\n this.toolbar.highlight('speak')\r\n\r\n if (this.isSpeaking()) {\r\n speech.cancel()\r\n } else {\r\n speech.speak(text)\r\n }\r\n\r\n return this\r\n }\r\n\r\n print() {\r\n if (!isFunction(print)) {\r\n return this\r\n }\r\n\r\n print()\r\n\r\n return this\r\n }\r\n\r\n destroy() {\r\n const $el = this.$el\r\n\r\n if (!$el) {\r\n return this\r\n }\r\n\r\n this.removeListeners()._remove()._default()\r\n\r\n return this\r\n }\r\n\r\n onPrint() {\r\n this.print()\r\n return this\r\n }\r\n\r\n onEnterReading() {\r\n this.toggle()\r\n return this\r\n }\r\n\r\n onExitReading(evt) {\r\n const keyCode = evt.keyCode\r\n\r\n if (keyCode === 27 && this.reading) {\r\n this.toggle()\r\n stop(evt)\r\n }\r\n\r\n return this\r\n }\r\n\r\n onRefresh() {\r\n this.refresh()\r\n\r\n return this\r\n }\r\n\r\n addListeners() {\r\n const $el = this.$el\r\n\r\n if (!$el) {\r\n return this\r\n }\r\n\r\n at(document, 'keyup', this.onExitReading, this, true)\r\n\r\n this.$on('toolbar:action:print', this.onPrint)\r\n this.$on('toolbar:action:reading', this.onEnterReading)\r\n this.$on('reader:print', this.onPrint)\r\n this.$on('reader:refresh', this.onRefresh)\r\n this.$on('reader:enter', this.enter)\r\n this.$on('reader:exit', this.exit)\r\n this.$on('reader:toggle', this.toggle)\r\n\r\n return this\r\n }\r\n\r\n removeListeners() {\r\n const $el = this.$el\r\n\r\n if (!$el) {\r\n return this\r\n }\r\n\r\n off(document, 'keyup', this.onExitReading)\r\n\r\n this.$off('toolbar:action:print')\r\n this.$off('toolbar:action:reading')\r\n this.$off('reader:refresh')\r\n this.$off('reader:toggle')\r\n\r\n return this\r\n }\r\n}\r\n\r\nReader.DEFAULTS = (() => {\r\n const OPTIONS = {\r\n target: '',\r\n title: '',\r\n enterReadingTip: ENTER_READING_TIP,\r\n allowSpeak: false\r\n }\r\n\r\n return cloneDeep(OPTIONS)\r\n})()\r\n\r\nexport default Reader\r\n","import later from './utils/lang/later'\r\nimport cloneDeep from './utils/lang/cloneDeep'\r\nimport isFunction from './utils/types/isFunction'\r\nimport isString from './utils/types/isString'\r\nimport isElement from './utils/types/isElement'\r\nimport addClass from './utils/dom/addClass'\r\nimport scrollTo from './utils/dom/scrollTo'\r\nimport _getScrollElement from './utils/dom/_getScrollElement'\r\n\r\nimport getChapters from './getChapters'\r\n\r\nimport Base from './base'\r\nimport Anchors from './anchors'\r\nimport Drawer from './drawer'\r\nimport Navigator from './navigator'\r\nimport Reader from './reader'\r\nimport Toolbar from './toolbar'\r\n\r\nclass Outline extends Base {\r\n constructor(options) {\r\n super()\r\n\r\n this.version = '3.39.0'\r\n this._default()\r\n\r\n if (options) {\r\n this.initialize(options)\r\n }\r\n }\r\n\r\n _default() {\r\n const options = Outline.DEFAULTS\r\n\r\n this.attrs = cloneDeep(options)\r\n this.$article = null\r\n this.$scrollElement = null\r\n this.buttons = []\r\n\r\n this.anchors = null\r\n this.drawer = null\r\n this.navigator = null\r\n this.reader = null\r\n this.toolbar = null\r\n\r\n return this\r\n }\r\n\r\n initialize(options) {\r\n let articleElement = ''\r\n let scrollElement = ''\r\n let $article = null\r\n\r\n this.attr(options)\r\n\r\n articleElement = this.attr('articleElement')\r\n scrollElement = this.attr('scrollElement')\r\n\r\n if (isString(articleElement)) {\r\n $article = document.querySelector(articleElement)\r\n } else if (isElement(articleElement)) {\r\n $article = articleElement\r\n }\r\n this.$article = $article\r\n this.$scrollElement = _getScrollElement(scrollElement)\r\n\r\n this.$emit('created', { ...this.attr() })\r\n this.render().addListeners()\r\n\r\n return this\r\n }\r\n\r\n isExpanded() {\r\n const position = this.attr('position')\r\n const drawer = this.drawer\r\n const navigator = this.navigator\r\n const count = this.count()\r\n\r\n if (count < 0) {\r\n return false\r\n }\r\n\r\n if (position === 'relative') {\r\n return !drawer.isClosed()\r\n } else {\r\n return !navigator.isClosed()\r\n }\r\n }\r\n\r\n getChapters(isTreeStructured = false) {\r\n const articleElement = this.$article\r\n const selector = this.attr('selector')\r\n const showCode = this.attr('showCode')\r\n const chapterTextFilter = this.attr('chapterTextFilter')\r\n\r\n return getChapters({\r\n articleElement,\r\n selector,\r\n showCode,\r\n chapterTextFilter,\r\n isTreeStructured\r\n })\r\n }\r\n\r\n count() {\r\n return this.getChapters().length\r\n }\r\n\r\n render() {\r\n const hasToolbar = this.attr('hasToolbar')\r\n const $scrollElement = this.$scrollElement\r\n\r\n this._renderReader()._renderAnchors()._renderNavigator()._renderToolbar()\r\n\r\n if ($scrollElement && hasToolbar) {\r\n this.$emit('toolbar:update', {\r\n top: $scrollElement.scrollTop,\r\n min: 0,\r\n max: $scrollElement.scrollHeight\r\n })\r\n }\r\n\r\n this.$emit('mounted')\r\n\r\n return this\r\n }\r\n\r\n _renderReader() {\r\n const option = this.attr('reader')\r\n\r\n if (!option.target) {\r\n return this\r\n }\r\n\r\n addClass(this.$article, 'outline-article')\r\n\r\n this.reader = new Reader(option)\r\n\r\n return this\r\n }\r\n\r\n _renderAnchors() {\r\n const articleElement = this.attr('articleElement')\r\n const selector = this.attr('selector')\r\n const stickyHeight = this.attr('stickyHeight')\r\n const scrollElement = this.attr('scrollElement')\r\n const showCode = this.attr('showCode')\r\n const anchorURL = this.attr('anchorURL')\r\n const afterScroll = this.attr('afterScroll')\r\n const chapterTextFilter = this.attr('chapterTextFilter')\r\n const anchorLinkFilter = this.attr('anchorLinkFilter')\r\n\r\n this.anchors = new Anchors({\r\n articleElement,\r\n stickyHeight,\r\n scrollElement,\r\n selector,\r\n showCode,\r\n anchorURL,\r\n afterScroll,\r\n chapterTextFilter,\r\n anchorLinkFilter\r\n })\r\n\r\n return this\r\n }\r\n\r\n _renderNavigator() {\r\n const title = this.attr('title')\r\n const stickyHeight = this.attr('stickyHeight')\r\n const scrollElement = this.attr('scrollElement')\r\n const customClass = this.attr('customClass')\r\n const showCode = this.attr('showCode')\r\n const animationCurrent = this.attr('animationCurrent')\r\n const closeOnClickModal = this.attr('closeOnClickModal')\r\n const showNavModalFirst = this.attr('showNavModalFirst')\r\n const position = this.attr('position')\r\n const placement = this.attr('placement')\r\n const afterSticky = this.attr('afterSticky')\r\n const afterToggle = this.attr('afterToggle')\r\n const afterScroll = this.attr('afterScroll')\r\n const count = this.count()\r\n let parentElement = this.attr('parentElement')\r\n let OPTIONS\r\n\r\n if (count < 1) {\r\n return this\r\n }\r\n\r\n OPTIONS = {\r\n scrollElement,\r\n showCode,\r\n animationCurrent,\r\n position,\r\n title,\r\n stickyHeight,\r\n chapters: this.getChapters(),\r\n afterSticky,\r\n afterToggle,\r\n afterScroll\r\n }\r\n\r\n if (position === 'relative') {\r\n this.drawer = new Drawer({\r\n placement,\r\n title,\r\n size: 'tiny',\r\n hasOffset: true,\r\n hasPadding: false,\r\n closeOnClickModal,\r\n customClass,\r\n afterClosed: () => {\r\n const toolbar = this.toolbar\r\n toolbar.toggle()\r\n }\r\n })\r\n parentElement = this.drawer.$main\r\n\r\n if (showNavModalFirst) {\r\n this.drawer.open()\r\n }\r\n } else {\r\n OPTIONS.customClass = customClass\r\n }\r\n\r\n OPTIONS.parentElement = parentElement\r\n this.navigator = new Navigator(OPTIONS)\r\n\r\n return this\r\n }\r\n\r\n _renderToolbar() {\r\n const position = this.attr('position')\r\n const hasToolbar = this.attr('hasToolbar')\r\n const showNavModalFirst = this.attr('showNavModalFirst')\r\n const placement = this.attr('placement')\r\n const homepage = this.attr('homepage')\r\n const git = this.attr('git')\r\n const tags = this.attr('tags')\r\n const issues = this.attr('issues')\r\n const tools = this.attr('tools')\r\n const option = this.attr('reader')\r\n const count = this.count()\r\n const UP = {\r\n name: 'up',\r\n icon: 'up',\r\n size: 20,\r\n action: {\r\n context: this,\r\n handler: this.toTop\r\n }\r\n }\r\n const HOME = {\r\n name: 'homepage',\r\n icon: 'homepage',\r\n size: 20,\r\n link: homepage\r\n }\r\n const GIT = {\r\n name: 'github',\r\n icon: 'github',\r\n size: 20,\r\n link: git\r\n }\r\n const TAGS = {\r\n name: 'tags',\r\n icon: 'tags',\r\n size: 20,\r\n link: tags\r\n }\r\n const ISSUES = {\r\n name: 'issues',\r\n icon: 'issues',\r\n size: 20,\r\n link: issues\r\n }\r\n const MENU = {\r\n name: 'toggle',\r\n icon: 'menu',\r\n size: 18,\r\n action: {\r\n context: this,\r\n handler: this.toggle\r\n }\r\n }\r\n const READING = {\r\n name: 'reading',\r\n icon: 'file',\r\n size: 18,\r\n action: {\r\n context: this,\r\n handler: 'toolbar:action:reading'\r\n }\r\n }\r\n const PRINT = {\r\n name: 'print',\r\n icon: 'print',\r\n size: 20,\r\n action: {\r\n handler: 'toolbar:action:print'\r\n }\r\n }\r\n const DOWN = {\r\n name: 'down',\r\n icon: 'down',\r\n size: 20,\r\n action: {\r\n context: this,\r\n handler: this.toBottom\r\n }\r\n }\r\n const buttons = []\r\n\r\n if (!hasToolbar) {\r\n return this\r\n }\r\n\r\n buttons.push(UP)\r\n if (count > 0) {\r\n buttons.push(MENU)\r\n }\r\n if (homepage) {\r\n buttons.push(HOME)\r\n }\r\n if (git) {\r\n buttons.push(GIT)\r\n }\r\n if (tags) {\r\n buttons.push(TAGS)\r\n }\r\n if (issues) {\r\n buttons.push(ISSUES)\r\n }\r\n if (option.target) {\r\n buttons.push(READING)\r\n if (isFunction(print)) {\r\n buttons.push(PRINT)\r\n }\r\n }\r\n if (tools?.length > 0) {\r\n buttons.push(...tools)\r\n }\r\n buttons.push(DOWN)\r\n this.buttons = [...buttons]\r\n\r\n this.toolbar = new Toolbar({\r\n placement,\r\n buttons\r\n })\r\n\r\n if (position === 'relative' && showNavModalFirst) {\r\n this.toolbar.hide()\r\n }\r\n\r\n return this\r\n }\r\n\r\n refresh() {\r\n const chapters = this.getChapters()\r\n\r\n this.$emit('anchors:refresh', chapters)\r\n this.$emit('navigator:refresh', chapters)\r\n this.$emit('reader:refresh')\r\n\r\n this.$emit('refresh', chapters)\r\n\r\n return this\r\n }\r\n\r\n addButton(button) {\r\n const buttons = this.buttons\r\n\r\n buttons.splice(-1, 0, button)\r\n this.$emit('toolbar:add:button', buttons)\r\n\r\n return this\r\n }\r\n\r\n removeButton(name) {\r\n this.$emit('toolbar:remove:button', name)\r\n return this\r\n }\r\n\r\n toTop() {\r\n const afterScroll = this.attr('afterScroll')\r\n const toolbar = this.toolbar\r\n const navigator = this.navigator\r\n const count = this.count()\r\n const afterTop = () => {\r\n toolbar.hide('up')\r\n toolbar.show('down')\r\n\r\n if (count > 0) {\r\n navigator.highlight(0)\r\n navigator.playing = false\r\n scrollTo(navigator.$main, 0)\r\n }\r\n\r\n if (isFunction(afterScroll)) {\r\n afterScroll.call(toolbar, 'up')\r\n }\r\n }\r\n\r\n if (count > 0) {\r\n navigator.playing = true\r\n }\r\n this.scrollTo(0, afterTop)\r\n\r\n return this\r\n }\r\n\r\n toBottom() {\r\n const afterScroll = this.attr('afterScroll')\r\n const $scrollElement = this.$scrollElement\r\n const toolbar = this.toolbar\r\n const navigator = this.navigator\r\n const count = this.count()\r\n const top = Math.floor(\r\n $scrollElement.scrollHeight - $scrollElement.clientHeight\r\n )\r\n const afterDown = () => {\r\n const $main = navigator.$main\r\n toolbar.hide('down')\r\n toolbar.show('up')\r\n\r\n if (count > 0) {\r\n navigator.highlight(count - 1)\r\n scrollTo($main, $main.scrollHeight)\r\n navigator.playing = false\r\n }\r\n\r\n if (isFunction(afterScroll)) {\r\n afterScroll.call(toolbar, 'bottom')\r\n }\r\n }\r\n\r\n if (count > 0) {\r\n navigator.playing = true\r\n }\r\n\r\n this.scrollTo(top, afterDown)\r\n\r\n return this\r\n }\r\n\r\n scrollTo(top, afterScroll) {\r\n scrollTo(this.$scrollElement, top, afterScroll)\r\n return this\r\n }\r\n\r\n enterReading() {\r\n this.$emit('toolbar:toggle')\r\n this.$emit('reader:enter')\r\n\r\n return this\r\n }\r\n\r\n exitReading() {\r\n this.$emit('toolbar:toggle')\r\n this.$emit('reader:exit')\r\n\r\n return this\r\n }\r\n\r\n switchReading() {\r\n this.$emit('toolbar:toggle')\r\n this.$emit('reader:toggle')\r\n\r\n return this\r\n }\r\n\r\n expand() {\r\n const position = this.attr('position')\r\n const toolbar = this.toolbar\r\n const drawer = this.drawer\r\n const navigator = this.navigator\r\n const count = this.count()\r\n\r\n if (count < 1) {\r\n return this\r\n }\r\n\r\n if (position !== 'relative') {\r\n navigator.show()\r\n toolbar.highlight('toggle')\r\n } else {\r\n toolbar.hide()\r\n\r\n later(() => {\r\n drawer.open()\r\n })\r\n }\r\n\r\n return this\r\n }\r\n\r\n collapses() {\r\n const position = this.attr('position')\r\n const toolbar = this.toolbar\r\n const drawer = this.drawer\r\n const navigator = this.navigator\r\n const count = this.count()\r\n\r\n if (count < 1) {\r\n return this\r\n }\r\n\r\n if (position !== 'relative') {\r\n navigator.hide()\r\n toolbar.highlight('toggle')\r\n } else {\r\n toolbar.show()\r\n\r\n later(() => {\r\n drawer.close()\r\n })\r\n }\r\n\r\n return this\r\n }\r\n\r\n toggle() {\r\n if (this.isExpanded()) {\r\n this.collapses()\r\n } else {\r\n this.expand()\r\n }\r\n\r\n return this\r\n }\r\n\r\n print() {\r\n this.$emit('reader:print')\r\n\r\n return this\r\n }\r\n\r\n _destroy() {\r\n const count = this.count()\r\n let anchors = this.anchors\r\n let navigator = this.navigator\r\n let drawer = this.drawer\r\n let reader = this.reader\r\n let toolbar = this.toolbar\r\n let isOutside = false\r\n\r\n this.removeListeners()\r\n\r\n if (reader) {\r\n reader.destroy()\r\n }\r\n\r\n if (count > 0 && navigator) {\r\n isOutside = navigator.isOutside()\r\n\r\n navigator.destroy()\r\n\r\n if (isOutside && drawer) {\r\n drawer.destroy()\r\n }\r\n }\r\n\r\n if (anchors) {\r\n anchors.destroy()\r\n }\r\n\r\n if (toolbar) {\r\n toolbar.destroy()\r\n }\r\n\r\n return this\r\n }\r\n\r\n destroy() {\r\n this.$emit('beforeDestroy')\r\n\r\n this._destroy()._default()\r\n\r\n this.$emit('destroyed')\r\n\r\n return this\r\n }\r\n\r\n addListeners() {\r\n const hasToolbar = this.attr('hasToolbar')\r\n\r\n if (!hasToolbar) {\r\n return this\r\n }\r\n\r\n this.$on('toolbar:update', this.onToolbarUpdate)\r\n\r\n return this\r\n }\r\n\r\n removeListeners() {\r\n const hasToolbar = this.attr('hasToolbar')\r\n\r\n if (!hasToolbar) {\r\n return this\r\n }\r\n\r\n this.$off('toolbar:update')\r\n\r\n return this\r\n }\r\n}\r\n\r\nOutline.DEFAULTS = (() => {\r\n const OPTIONS = {\r\n articleElement: '#article',\r\n selector: 'h2,h3,h4,h5,h6',\r\n parentElement: '#aside',\r\n scrollElement: 'html,body',\r\n title: '目录',\r\n position: 'relative',\r\n placement: 'rtl',\r\n animationCurrent: true,\r\n showCode: false,\r\n hasToolbar: true,\r\n closeOnClickModal: true,\r\n showNavModalFirst: false,\r\n anchorURL: '',\r\n stickyHeight: 0,\r\n homepage: '',\r\n git: '',\r\n tags: '',\r\n issues: '',\r\n tools: [],\r\n reader: {\r\n target: '',\r\n title: '',\r\n enterReadingTip: '进入阅读模式,按 ESC 键可退出阅读模式',\r\n allowSpeak: false\r\n },\r\n customClass: '',\r\n afterSticky: null,\r\n afterToggle: null,\r\n afterScroll: null,\r\n chapterTextFilter: null,\r\n anchorLinkFilter: null\r\n }\r\n\r\n return cloneDeep(OPTIONS)\r\n})()\r\n\r\nif (window?.jQuery) {\r\n const $ = window.jQuery\r\n\r\n // 将 Outline 扩展为一个 jquery 插件\r\n // eslint-disable-next-line no-undef\r\n $.extend($.fn, {\r\n outline: function (options) {\r\n // eslint-disable-next-line no-undef\r\n let $article = $(this)\r\n\r\n return new Outline(\r\n // eslint-disable-next-line no-undef\r\n $.extend({}, options, {\r\n articleElement: $article\r\n })\r\n )\r\n }\r\n })\r\n}\r\n\r\nexport default Outline\r\n","/**\r\n * 函数防抖:当持续触发事件时,一定时间段内没有再触发事件,事件处理函数才会执行一次,如果设\r\n * 定的时间到来之前,又一次触发了事件,就重新开始延时。\r\n * ========================================================================\r\n * @method debounce\r\n * @param {Function} fn - 要采用防抖技术执行的函数\r\n * @param {Number} ms - 等待时间(单位:毫秒)\r\n * @returns {Function}\r\n *\r\n * @example\r\n * window.addEventListener(\r\n * 'resize',\r\n * debounce(() => {\r\n * console.log(window.innerWidth);\r\n * console.log(window.innerHeight);\r\n * }, 250)\r\n * );\r\n * // => Will log the window dimensions at most every 250ms\r\n */\r\nconst debounce = (fn, ms = 300) => {\r\n let timer\r\n\r\n return function (...args) {\r\n if (timer) {\r\n clearTimeout(timer)\r\n }\r\n\r\n timer = setTimeout(() => {\r\n fn.apply(this, args)\r\n }, ms)\r\n }\r\n}\r\n\r\nexport default debounce\r\n","/**\r\n * ========================================================================\r\n * @method getViewportWidth\r\n * @return {Number}\r\n */\r\nconst getViewportWidth = () => {\r\n return Math.max(document.documentElement.clientWidth, window.innerWidth)\r\n}\r\n\r\nexport default getViewportWidth\r\n","import Outline from '../../outline'\r\nimport observeResize from './observeResize'\r\nimport getViewportWidth from './getViewportWidth'\r\n\r\nconst defaults = Outline.DEFAULTS\r\n\r\ndefaults.articleElement = document.querySelector('#article')\r\ndefaults.parentElement = document.querySelector('#aside')\r\ndefaults.scrollElement = document.querySelector('#main')\r\ndefaults.selector = 'h2,h3'\r\ndefaults.title = false\r\ndefaults.showCode = false\r\ndefaults.position = 'sticky'\r\ndefaults.git = 'https://github.com/yaohaixiao/outline.js'\r\ndefaults.tags = 'https://github.com/yaohaixiao/outline.js/tags'\r\ndefaults.issues = 'https://github.com/yaohaixiao/outline.js/issues'\r\ndefaults.reader = {\r\n target: '#article',\r\n title: document.querySelector('.main__h1'),\r\n allowSpeak: true\r\n}\r\ndefaults.chapterTextFilter = true\r\ndefaults.anchorLinkFilter = (tag, title, id) => {\r\n return `${tag}-${title}-${id}`\r\n}\r\ndefaults.customClass = 'aside-navigator'\r\ndefaults.afterScroll = (type) => {\r\n const viewportWidth = getViewportWidth()\r\n if (viewportWidth <= 500 && type === 'chapter') {\r\n outline.toggle()\r\n }\r\n}\r\n\r\nconst outline = new Outline(defaults)\r\n\r\nobserveResize(document.querySelector('#docs'), () => {\r\n const viewportWidth = getViewportWidth()\r\n if (viewportWidth <= 500 && outline.isExpanded()) {\r\n outline.toggle()\r\n }\r\n})\r\n\r\nexport default outline\r\n","import debounce from './debounce'\r\nimport isFunction from '../../utils/types/isFunction'\r\nimport isElement from '../../utils/types/isElement'\r\n\r\n/**\r\n * 通用的 ResizeObserver 观察者处理器\r\n * ========================================================================\r\n * @method observeResize\r\n * @since 1.8.0\r\n * @see https://developer.mozilla.org/en-US/docs/Web/API/ResizeObserver\r\n * @see https://developer.mozilla.org/zh-CN/docs/Web/API/ResizeObserverEntry/contentBoxSize\r\n * @see https://developer.mozilla.org/zh-CN/docs/Web/CSS/writing-mode\r\n * @param {HTMLElement} el\r\n * @param {Function} callback\r\n * @param {Number} [delay]\r\n * @return {ResizeObserver|boolean}\r\n */\r\nconst observeResize = (el, callback, delay = 300) => {\r\n let observer\r\n let fn\r\n\r\n if (!isElement(el) || !isFunction(callback)) {\r\n return false\r\n }\r\n\r\n fn = debounce(callback, delay)\r\n observer = new ResizeObserver((entries) => {\r\n for (const entry of entries) {\r\n fn(entry)\r\n }\r\n })\r\n\r\n observer.observe(el)\r\n\r\n return observer\r\n}\r\n\r\nexport default observeResize\r\n"],"names":["toString","val","Object","prototype","apply","isFunction","later","fn","delay","setTimeout","isObject","o","isArray","Array","cloneDeep","obj","clone","from","assign","keys","forEach","key","isString","str","isElement","nodeName","tagName","nodeType","hasClass","el","className","pattern","RegExp","allClass","classList","contains","exec","addClass","_classList","add","indexOf","split","name","length","easeInQuad","x","_getScrollElement","scrollElement","$rootElements","$scrollElement","document","querySelector","querySelectorAll","scrollTop","scrollTo","top","afterStop","step","distance","MAX_HEIGHT","scrollHeight","MAX_TOP","stop","play","console","log","requestAnimationFrame","trim","replace","getChaptersByHeadings","headings","showCode","chapterTextFilter","chapters","previous","level","text","heading","i","headingLevel","current","parseInt","pid","_getChapterParentIdByDiffer","differ","index","innerHTML","push","id","rel","groups","group","JSON","stringify","cb","code","String","c","subjects","_getChaptersWithCode","getChapters","options","articleElement","selector","isTreeStructured","$article","$headings","filter","_maybeArrayLike","_toConsumableArray","toTree","list","nodeKey","parentKey","map","roots","item","children","node","hasOwn","prop","hasOwnProperty","call","extend","origin","source","_subscribers","_hasDirectSubscribersFor","topic","has","isDirect","found","position","lastIndexOf","substring","_hasSubscribers","emit","data","async","execute","subscriber","message","callback","context","deliver","guid","uuid","prefix","_removeSubscriber","off","token","subject","execution","j","splice","_removeSubscriberByToken","Base","constructor","this","attrs","initialize","attr","render","addListeners","value","arguments","refresh","destroy","removeListeners","reload","$emit","event","publish","$on","on","handler","subscribe","$off","unsubscribe","queue","isHandling","done","runIdle","idleDeadline","timeRemaining","shift","requestIdleCallback","window","start","Date","now","didTimeout","Math","max","cancelIdleCallback","clearTimeout","timeSlice","afterComplete","offsetTop","offsetParent","matches","sel","msMatchesSelector","getParentOrHost","host","parentNode","CAPTURE_EVENTS","_off","type","capture","_delegateListener","listeners","_listeners","listener","_delete","removeEventListener","purgeElement","recurse","$element","$children","childNodes","getListeners","$child","once","evt","target","getTarget","delegateTarget","closest","ctx","includeCTX","startsWith","overrideContext","addEventListener","stopPropagation","preventDefault","SYMBOLS","getSymbols","iconSet","getSymbol","patternName","patternSet","find","symbol","fullName","paint","$body","body","$icons","symbols","join","createElement","insertBefore","firstChild","isDOM","isHTMLCollection","fragment","isTextNode","setAttribute","toLowerCase","style","cssText","innerText","setAttributes","$fragment","createDocumentFragment","$el","isValidChild","child","append","createTextNode","appendChild","every","ICON","size","color","width","height","defaultRules","cssRules","$icon","$svg","binds","svg","test","isSVG","xmlns","class","icon","removeClass","remove","_removeHeading","$heading","hasAnchor","isAtStart","CLS_HEADING","$anchor","removeAttribute","removeChild","Anchors","super","_default","DEFAULTS","$articleElement","created","getHeadings","count","mounted","_paint","erase","_remove","LIMIT","anchorURL","anchorLinkFilter","update","chapterCode","_updateHeading","headingId","url","href","groupIndex","after","beforeDestroy","afterDestroy","onAnchorTrigger","afterScroll","stickyHeight","clientHeight","min","onRefresh","TAGS","isHTML","html","basic","full","slice","tag","stripScripts","setProperty","documentElement","zIndex","idx","Drawer","title","closed","$modal","$header","$title","$close","$main","$footer","$overlay","setTitle","isClosed","placement","hasClose","hasOverlay","hasOffset","hasPadding","autoHeight","overflow","customClass","mainClassName","content","$content","strHTML","template","open","opened","close","toggle","afterToggle","onClose","closeOnClickModal","afterClosed","afterOpened","at","getStyle","ruleName","getComputedStyle","HIDDEN","EXPANDED","FOLDED","Navigator","scrollTimer","resizeTimer","observerTimer","Observer","$list","$placeholder","$parentElement","$active","active","offsetWidth","playing","parentElement","$parent","isSticky","isFixed","isInside","isOutside","_paintEdge","animationCurrent","contents","calculateStickyHeight","highlight","sticky","onObserver","_paintChapters","clones","parts","byId","chapter","$text","$link","$code","$li","$subject","$chapter","_getPlaceholderOffset","mainPaddingTop","mainBorderTop","placeholderPaddingTop","placeholderMarginTop","placeholderBorderTop","offsetHeight","positionPlaceholder","ACTIVE","HIGHLIGHT","placeholderOffsetTop","getAttribute","inBounding","parent","parentRect","childRect","isInBounding","getBoundingClientRect","right","bottom","left","afterSticky","FIXED","isStickying","innerHeight","show","hide","intersection","props","root","rootMargin","IntersectionObserver","entries","entry","intersectionRatio","$root","section","observe","onSelect","onScroll","onResize","unobserve","isPlainObject","getPrototypeOf","proto","isObjectLike","encodeHTML","CHARTS","instances","instance","Message","visible","offset","timer","destroyed","_objectSpread","isDestroyed","_getClassName","effect","round","closable","dangerouslyUseHTMLString","$type","$message","iconSize","_refreshIcon","iconName","$use","_refreshMessage","_refreshClose","_refreshEl","clearTimer","startTimer","duration","destroyAfterClosed","beforeClose","onMouseEnter","onMouseLeave","config","len","dom","clear","Command","action","Commands","commands","get","cmd","command","del","_createButton","button","rounded","link","$button","disabled","DISABLED","Toolbar","buttons","isHighlight","isDisabled","isExist","_getCommand","_self","bind","disable","_add","_disable","_enable","enable","enabled","onExecute","_updateToolbar","ceil","onToolbarUpdate","onAddButton","onRemoveButton","afterDisabled","afterEnabled","Speech","utterance","SpeechSynthesisUtterance","_initialize","lang","setLang","pitch","setPitch","rate","setRate","setText","voice","setVoice","volume","setVolume","_addListeners","isSpeaking","speechSynthesis","speaking","isPending","pending","isPaused","paused","getVoices","speak","pause","resume","cancel","speech","onvoiceschanged","isSupport","_updateSiblingElements","siblingElement","isPrev","$sibling","previousElementSibling","nextElementSibling","isMobile","ua","navigator","userAgent","ENTER_READING_TIP","Reader","reading","$target","$paper","$progress","toolbar","_this$speech","_renderEdge","cloneNode","_animateTimeline","ScrollTimeline","animate","scale","timeline","axis","print","exit","enter","READER","READING","$siblings","enterReadingTip","info","SPEAK","onPrint","onEnterReading","onExitReading","keyCode","allowSpeak","Outline","version","anchors","drawer","reader","isExpanded","hasToolbar","_renderReader","_renderAnchors","_renderNavigator","_renderToolbar","option","showNavModalFirst","OPTIONS","homepage","git","tags","issues","tools","UP","toTop","HOME","GIT","ISSUES","MENU","PRINT","DOWN","toBottom","concat","addButton","removeButton","afterTop","floor","afterDown","enterReading","exitReading","switchReading","expand","collapses","_destroy","_window","jQuery","$","outline","debounce","ms","args","getViewportWidth","clientWidth","innerWidth","defaults","observeResize","observer","ResizeObserver"],"mappings":"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kB,YAAa,KACbH,cAAe,KACfC,aAAc,KACd3P,kBAAmB,KACnBiP,iBAAkB,OE7TtB,MAAMiB,GAAO,CACX,IACA,OACA,UACA,OACA,UACA,QACA,QACA,IACA,OACA,MACA,MACA,aACA,OACA,KACA,SACA,SACA,UACA,OACA,OACA,MACA,WACA,OACA,WACA,KACA,MACA,UACA,MACA,SACA,MACA,KACA,KACA,KACA,QACA,WACA,aACA,SACA,SACA,OACA,KACA,KACA,KACA,KACA,KACA,KACA,OACA,SACA,SACA,KACA,OACA,IACA,SACA,MACA,QACA,MACA,MACA,QACA,SACA,KACA,OACA,OACA,MACA,OACA,OACA,OACA,WACA,OACA,QACA,MACA,WACA,SACA,KACA,WACA,SACA,SACA,IACA,QACA,UACA,MACA,WACA,IACA,KACA,KACA,KACA,MACA,OACA,IACA,OACA,SACA,SACA,UACA,SACA,OACA,QACA,SACA,OACA,SACA,QACA,MACA,UACA,MACA,MACA,QACA,QACA,KACA,WACA,WACA,QACA,KACA,QACA,OACA,QACA,KACA,QACA,IACA,KACA,MACA,QACA,OCzGIC,GAAUpT,IACd,IAAIqT,EACAC,EACAC,EAEJ,QAAKxT,EAASC,KAKdqT,EAAOzQ,EAAK5C,GAAKwT,MAAM,EAAG,KAC1BF,EAAQ,4DACRC,EAAO,IAAI9S,OAAO0S,GAAKxN,KAAK8N,GAAQ,IAAIA,eAAgBtF,KAAK,KAAM,KAE5DmF,EAAMjD,KAAKgD,IAASE,EAAKlD,KAAKgD,GAAK,ECtBtCK,GAAgB1T,GACbA,EAAI6C,QAAQ,+BAAgC,ICP/C8Q,GAAcA,CAAC1N,EAAM4C,KACDlH,SAASiS,gBACjB/E,MAAM8E,YAAY1N,EAAM4C,EAAM,ECAhD,IAAI/E,GAAQ,IAEZ,MAAM+P,GAAUC,IACVA,EACFhQ,GAAQgQ,EAERhQ,IAAS,EAGX6P,GAAY,mBAAoB,GAAG7P,MAE5BA,ICKT,MAAMiQ,WAAe1L,EACnBC,WAAAA,CAAYxD,GACVuM,QAEA9I,KAAK+I,WAEL/I,KAAKsL,OAAS,EAEV/O,GACFy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"} \ No newline at end of file +{"version":3,"file":"docs.min.js","sources":["../../utils/lang/toString.js","../../utils/types/isFunction.js","../../utils/lang/later.js","../../utils/types/isObject.js","../../utils/types/isArray.js","../../utils/lang/cloneDeep.js","../../utils/types/isString.js","../../utils/types/isElement.js","../../utils/dom/hasClass.js","../../utils/dom/addClass.js","../../utils/lang/easeInQuad.js","../../utils/dom/scrollTo.js","../../navigator/utils/_getScrollElement.js","../../utils/dom/getScrollElement.js","../../utils/lang/trim.js","../../chapters/getChaptersByHeadings.js","../../utils/lang/stripTags.js","../../chapters/_getChapterParentIdByDiffer.js","../../chapters/_getChaptersWithCode.js","../../chapters/getChapters.js","../../utils/lang/toTree.js","../../utils/lang/hasOwn.js","../../utils/lang/extend.js","../../utils/observer/_subscribers.js","../../utils/observer/_hasDirectSubscribersFor.js","../../utils/observer/has.js","../../utils/observer/_hasSubscribers.js","../../utils/observer/emit.js","../../utils/types/isTypedArray.js","../../utils/lang/guid.js","../../utils/observer/_removeSubscriber.js","../../utils/observer/off.js","../../utils/observer/_removeSubscriberByToken.js","../../component.js","../../utils/observer/on.js","../../utils/lang/timeSlice.js","../../utils/dom/offsetTop.js","../../utils/dom/matches.js","../../utils/dom/getParentOrHost.js","../../utils/event/enum.js","../../utils/event/_off.js","../../utils/event/_delete.js","../../utils/event/purgeElement.js","../../utils/event/getListeners.js","../../utils/event/off.js","../../utils/event/on.js","../../utils/event/getTarget.js","../../utils/dom/resolveTextNode.js","../../utils/dom/closest.js","../../utils/event/stop.js","../../utils/icons/symbols.js","../../utils/icons/defaults.js","../../utils/icons/getSymbols.js","../../utils/icons/getSymbol.js","../../utils/icons/paint.js","../../utils/icons/add.js","../../utils/types/isDOM.js","../../utils/types/isHTMLCollection.js","../../utils/types/isFragment.js","../../utils/types/isTextNode.js","../../utils/dom/setAttribute.js","../../utils/dom/setAttributes.js","../../utils/dom/createElement.js","../../utils/icons/createElement.js","../../utils/types/isSVG.js","../../utils/icons/icon.js","../../utils/dom/removeClass.js","../../anchors/utils/_removeHeading.js","../../utils/types/isEmpty.js","../../node_modules/style-inject/dist/style-inject.es.js","../../anchors/anchors.js","../../anchors/utils/_updateHeading.js","../../utils/types/tags.js","../../utils/types/isHTML.js","../../utils/lang/stripScripts.js","../../utils/dom/setProperty.js","../../utils/dom/zIndex.js","../../drawer/drawer.js","../../utils/dom/html.js","../../utils/event/at.js","../../utils/dom/getStyle.js","../../navigator/navigator.js","../../navigator/utils/_paintChapters.js","../../utils/dom/inBounding.js","../../utils/dom/intersection.js","../../utils/dom/isMobile.js","../../utils/types/isPlainObject.js","../../utils/types/isObjectLike.js","../../utils/lang/encodeHTML.js","../../message/message.js","../../command.js","../../commands.js","../../toolbar/utils/_createButton.js","../../toolbar/toolbar.js","../../speech.js","../../reader/utils/_updateSiblingElements.js","../../reader/reader.js","../../outline.js","../../api/js/debounce.js","../../api/js/getViewportWidth.js","../../api/js/main.js","../../api/js/observeResize.js"],"sourcesContent":["/**\r\n * Object 对象原型上的 toString 方法\r\n * ========================================================================\r\n * @method toString\r\n * @param {*} val\r\n * @returns {string}\r\n */\r\nconst toString = (val) => {\r\n return Object.prototype.toString.apply(val)\r\n}\r\n\r\nexport default toString\r\n","import toString from '@/utils/lang/toString'\r\n\r\n/**\r\n * 检测测试数据是否为 Function 类型\r\n * ========================================================================\r\n * @method isFunction\r\n * @param {*} val - (必须)待检测的数据\r\n * @returns {boolean} 'val' 是 Function 类型返回 true,否则返回 false\r\n */\r\nconst isFunction = (val) => {\r\n return typeof val === 'function' || toString(val) === '[object Function]'\r\n}\r\n\r\nexport default isFunction\r\n","import isFunction from '@/utils/types/isFunction'\r\n\r\n/**\r\n * later - 延迟执行方法\r\n * ========================================================================\r\n * @method later\r\n * @param {Function} fn\r\n * @param {Number} [delay]\r\n * @returns {number|boolean}\r\n */\r\nconst later = (fn, delay = 300) => {\r\n if (!isFunction(fn)) {\r\n return false\r\n }\r\n\r\n return setTimeout(() => {\r\n fn()\r\n }, delay)\r\n}\r\n\r\nexport default later\r\n","import toString from '../lang/toString'\r\nimport isFunction from './isFunction'\r\n\r\n/**\r\n * 检测数据是否为 Object 类型\r\n * ========================================================================\r\n * @method isObject\r\n * @param {*} o\r\n * @returns {boolean}\r\n */\r\nconst isObject = (o) => {\r\n return (\r\n (toString(o) === '[object Object]' ||\r\n typeof o === 'object' ||\r\n isFunction(o)) &&\r\n o !== null\r\n )\r\n}\r\n\r\nexport default isObject\r\n","import toString from '@/utils/lang/toString'\r\n\r\n/**\r\n * 检测数据是否为 Array 类型\r\n * ========================================================================\r\n * @method isArray\r\n * @param {*} o\r\n * @returns {boolean}\r\n */\r\nconst isArray = (o) => {\r\n if (Array.isArray) {\r\n return Array.isArray(o)\r\n } else {\r\n return toString(o) === '[object Array]'\r\n }\r\n}\r\n\r\nexport default isArray\r\n","import isObject from '@/utils/types/isObject'\r\nimport isArray from '@/utils/types/isArray'\r\n\r\n/**\r\n * 深拷贝对象函数\r\n * ========================================================================\r\n * @methods cloneDeep\r\n * @param {Object} obj - 深拷贝的对象\r\n * @returns {Array|Object|*}\r\n *\r\n * @example\r\n * const arr = cloneDeep([2,3,4,6])\r\n * => [2,3,4,6]\r\n */\r\nconst cloneDeep = (obj) => {\r\n let clone = {}\r\n\r\n if (obj === null) {\r\n return null\r\n }\r\n\r\n if (isArray(obj)) {\r\n clone = Array.from(obj)\r\n } else {\r\n clone = Object.assign({}, obj)\r\n Object.keys(clone).forEach((key) => {\r\n return (clone[key] = isObject(obj[key]) ? cloneDeep(obj[key]) : obj[key])\r\n })\r\n }\r\n\r\n return clone\r\n}\r\n\r\nexport default cloneDeep\r\n","/**\r\n * 检测数据是否为 String 类型\r\n * ========================================================================\r\n * @method isArray\r\n * @param {*} str\r\n * @returns {boolean}\r\n */\r\nconst isString = (str) => {\r\n return typeof str === 'string'\r\n}\r\n\r\nexport default isString\r\n","import isObject from './isObject'\r\n\r\n/**\r\n * 检测数据是否为 HTMLElement DOM 节点\r\n * ========================================================================\r\n * @method isElement\r\n * @param {*} o\r\n * @returns {boolean}\r\n */\r\nconst isElement = (o) => {\r\n return !!(isObject(o) && o.nodeName && o.tagName && o.nodeType === 1)\r\n}\r\n\r\nexport default isElement\r\n","import isElement from '../types/isElement'\r\n/**\r\n * 检测 DOM 节点是否包含名为 className 的样式\r\n * ========================================================================\r\n * @method hasClass\r\n * @param {HTMLElement} el - DOM 节点\r\n * @param {String} className - 样式名称\r\n * @returns {Boolean}\r\n */\r\nconst hasClass = (el, className) => {\r\n const pattern = new RegExp('(\\\\s|^)' + className + '(\\\\s|$)')\r\n let allClass\r\n let classList\r\n\r\n if (!isElement(el)) {\r\n return false\r\n }\r\n\r\n allClass = el.className\r\n\r\n if (!allClass) {\r\n return false\r\n }\r\n\r\n classList = el.classList\r\n\r\n if (classList && classList.contains) {\r\n return el.classList.contains(className)\r\n }\r\n\r\n return !!pattern.exec(allClass)\r\n}\r\n\r\nexport default hasClass\r\n","import hasClass from './hasClass'\r\n\r\n/**\r\n * 给 DOM 节点添加名为 className 的样式\r\n * ========================================================================\r\n * @method addClass\r\n * @param {HTMLElement} el - DOM 节点\r\n * @param {String} className - 样式名称\r\n * @returns {Boolean}\r\n */\r\nconst addClass = (el, className) => {\r\n let classList\r\n let allClass\r\n\r\n if (hasClass(el, className)) {\r\n return false\r\n }\r\n\r\n classList = el.classList\r\n\r\n if (classList?.add) {\r\n if (className.indexOf(' ') > -1) {\r\n className.split(' ').forEach((name) => {\r\n classList.add(name)\r\n })\r\n } else {\r\n classList.add(className)\r\n }\r\n } else {\r\n allClass = el.className\r\n allClass += allClass.length > 0 ? ' ' + className : className\r\n el.className = allClass\r\n }\r\n}\r\n\r\nexport default addClass\r\n","/**\r\n * 返回给定值的平方值\r\n * ========================================================================\r\n * @method easeInQuad\r\n * @param {Number} x\r\n * @returns {number}\r\n */\r\nconst easeInQuad = (x) => {\r\n return x * x\r\n}\r\n\r\nexport default easeInQuad\r\n","import easeInQuad from '../lang/easeInQuad'\r\nimport isFunction from '../types/isFunction'\r\nimport _getScrollElement from '../../navigator/utils/_getScrollElement'\r\n\r\n/**\r\n * 指定 rootElement DOM 节点滚动到指定 top 位置\r\n * ========================================================================\r\n * @method scrollTo\r\n * @param {HTMLElement|Object} [scrollElement] - (必须)要滚动的 DOM 节点\r\n * @param {Number} top - (必须)滚动的 scrollTop 数值\r\n * @param {Function} [afterStop] - (可选)滚动完成的回调函数\r\n */\r\nconst scrollTo = (scrollElement, top, afterStop) => {\r\n const $scrollElement = _getScrollElement(scrollElement)\r\n let scrollTop = $scrollElement.scrollTop\r\n let step = 0\r\n const distance = top - scrollTop\r\n const MAX_HEIGHT = $scrollElement.scrollHeight\r\n const MAX_TOP = top - MAX_HEIGHT <= 0 ? top : MAX_HEIGHT\r\n const stop = (top) => {\r\n if (isFunction(afterStop)) {\r\n afterStop(top)\r\n }\r\n\r\n return false\r\n }\r\n const play = () => {\r\n step += 1\r\n\r\n // 向上滚动\r\n if (distance < 0) {\r\n scrollTop -= easeInQuad(step)\r\n $scrollElement.scrollTop = scrollTop\r\n\r\n if (scrollTop <= top) {\r\n $scrollElement.scrollTop = top\r\n return stop(top)\r\n }\r\n } else {\r\n scrollTop += easeInQuad(step)\r\n $scrollElement.scrollTop = scrollTop\r\n\r\n if (scrollTop >= MAX_TOP) {\r\n $scrollElement.scrollTop = MAX_TOP\r\n return stop(MAX_TOP)\r\n }\r\n }\r\n\r\n // eslint-disable-next-line compat/compat\r\n requestAnimationFrame(play)\r\n }\r\n\r\n // eslint-disable-next-line compat/compat\r\n requestAnimationFrame(play)\r\n}\r\n\r\nexport default scrollTo\r\n","import isString from '../../utils/types/isString'\r\nimport isElement from '../../utils/types/isElement'\r\n\r\n/**\r\n * 通过给的 scrollElement 参数,获取滚动 DOM 元素\r\n * ========================================================================\r\n * @method _getScrollElement\r\n * @param {String|HTMLElement} scrollElement\r\n * @returns {Element}\r\n * @private\r\n */\r\nconst _getScrollElement = (scrollElement = null) => {\r\n let $rootElements\r\n let $scrollElement\r\n\r\n if (!scrollElement) {\r\n $rootElements = document.querySelectorAll('html,body')\r\n $scrollElement =\r\n $rootElements[0].scrollTop - $rootElements[1].scrollTop >= 0\r\n ? $rootElements[0]\r\n : $rootElements[1]\r\n } else {\r\n if (isString(scrollElement)) {\r\n $scrollElement = document.querySelector(scrollElement)\r\n } else if (isElement(scrollElement)) {\r\n $scrollElement = scrollElement\r\n }\r\n }\r\n\r\n return $scrollElement\r\n}\r\n\r\nexport default _getScrollElement\r\n","import isString from '../types/isString'\r\nimport isElement from '../types/isElement'\r\n\r\n/**\r\n * 通过给的 scrollElement 参数,获取滚动 DOM 元素\r\n * ========================================================================\r\n * @method getScrollElement\r\n * @param {String|HTMLElement} scrollElement\r\n * @returns {Element}\r\n * @private\r\n */\r\nconst getScrollElement = (scrollElement = null) => {\r\n let $rootElements\r\n let $scrollElement\r\n\r\n if (!scrollElement) {\r\n $rootElements = document.querySelectorAll('html,body')\r\n $scrollElement =\r\n $rootElements[0].scrollTop - $rootElements[1].scrollTop >= 0\r\n ? $rootElements[0]\r\n : $rootElements[1]\r\n } else {\r\n if (isString(scrollElement)) {\r\n $scrollElement = document.querySelector(scrollElement)\r\n } else if (isElement(scrollElement)) {\r\n $scrollElement = scrollElement\r\n }\r\n }\r\n\r\n return $scrollElement\r\n}\r\n\r\nexport default getScrollElement\r\n","import isString from '@/utils/types/isString'\r\n\r\n/**\r\n * 清楚字符串起始位置所有的空格\r\n * ========================================================================\r\n * @method trim\r\n * @param {string} str\r\n * @returns {string|Boolean}\r\n */\r\nconst trim = (str) => {\r\n if (!isString(str)) {\r\n return false\r\n }\r\n return str.replace(/(^\\s+)|(\\s+$)/g, '')\r\n}\r\n\r\nexport default trim\r\n","import trim from '../utils/lang/trim'\r\nimport stripTags from '../utils/lang/stripTags'\r\nimport isFunction from '../utils/types/isFunction'\r\n\r\nimport _getChapterParentIdByDiffer from './_getChapterParentIdByDiffer'\r\nimport _getChaptersWithCode from './_getChaptersWithCode'\r\n\r\n/**\r\n * 根据文章中的 h1~h6 标签,自动分析返回文章章节数据\r\n * ========================================================================\r\n * @method getChaptersByHeadings\r\n * @param {Array} headings\r\n * @param {Boolean} [showCode]\r\n * @param {Function} [chapterTextFilter]\r\n * @return {*|*[]}\r\n */\r\nconst getChaptersByHeadings = (\r\n headings,\r\n showCode = false,\r\n chapterTextFilter = null\r\n) => {\r\n const pattern = /^\\d(\\.|(\\.\\d+)*)\\s?/gi\r\n const chapters = []\r\n let previous = 1\r\n let level = 0\r\n let text = ''\r\n\r\n headings.forEach((heading, i) => {\r\n const tagName = heading.tagName\r\n const headingLevel = tagName.replace(/h/i, '')\r\n let current = parseInt(headingLevel, 10)\r\n let pid = -1\r\n\r\n // 场景1:当前标题是前一个标题的子标题\r\n // 当前标题的(标题标签)序号 > 前一个标题的序号:两个相连的标题是父标题 -> 子标题关系;\r\n // h2 (前一个标题)\r\n // h3 (当前标题)\r\n if (current > previous) {\r\n level += 1\r\n\r\n // 第一层级的 pid 是 -1\r\n if (level === 1) {\r\n pid = -1\r\n } else {\r\n pid = i - 1\r\n }\r\n }\r\n // 场景2:当前标题和前一个标题层级相同\r\n // 当前标题的(标题标签)序号 = 前一个标题的序号\r\n // h2 (前一个标题)\r\n // h2 (当前标题)\r\n // 当前标题的(标题标签)序号 < 前一个标题的序号,并且当前标题序号 > 当前的级别\r\n // h2\r\n // h4 (前一个标题)\r\n // h3 (当前标题:这种情况我们还是任务 h3 是 h2 的下一级章节)\r\n else if (current === previous || (current < previous && current > level)) {\r\n // H1 的层级肯定是 1\r\n if (current === 1) {\r\n level = 1\r\n pid = -1\r\n } else {\r\n pid = chapters[i - 1].pid\r\n }\r\n }\r\n // 场景3:当前标题比前一个标题层级高\r\n else if (current <= level) {\r\n // H1 的层级肯定是 1\r\n if (current === 1) {\r\n level = 1\r\n } else {\r\n level = level - (previous - current)\r\n\r\n if (level <= 1) {\r\n level = 1\r\n }\r\n }\r\n\r\n // 第一级的标题\r\n if (level === 1) {\r\n pid = -1\r\n } else {\r\n // 通过当前标题和前一个标题之间的等级差,获得当前标题的父标题ID\r\n pid = _getChapterParentIdByDiffer(chapters, previous - current, i)\r\n }\r\n }\r\n\r\n previous = current\r\n\r\n text = trim(stripTags(heading.innerHTML))\r\n\r\n // 如果自动生成章节编号,则去掉标题中自带的编号文本\r\n if (showCode) {\r\n text = trim(text.replace(pattern, ''))\r\n }\r\n\r\n if (isFunction(chapterTextFilter)) {\r\n text = chapterTextFilter(text)\r\n }\r\n\r\n chapters.push({\r\n id: i,\r\n pid: pid,\r\n level: level,\r\n rel: `heading-${i}`,\r\n text,\r\n tagName\r\n })\r\n })\r\n\r\n return showCode ? _getChaptersWithCode(chapters) : chapters\r\n}\r\n\r\nexport default getChaptersByHeadings\r\n","import isString from '@/utils/types/isString'\r\n\r\n/**\r\n * 过滤所有 HTML 标签\r\n * ========================================================================\r\n * @method stripTags\r\n * @param {string} str\r\n * @returns {string}\r\n */\r\nconst stripTags = (str) => {\r\n if (!isString(str)) {\r\n return ''\r\n }\r\n return str.replace(/<\\/?[^>]+(>|$)/g, '')\r\n}\r\n\r\nexport default stripTags\r\n","const _getChapterParentIdByDiffer = (chapters, differ, index) => {\r\n let previous = chapters[index - 1]\r\n let pid\r\n let i\r\n\r\n for (i = 0; i < differ; i += 1) {\r\n pid = previous.pid\r\n previous = chapters[pid]\r\n }\r\n\r\n pid = previous.pid\r\n\r\n return pid\r\n}\r\n\r\nexport default _getChapterParentIdByDiffer\r\n","import isArray from '../utils/types/isArray'\r\n\r\nconst _getChaptersWithCode = (chapters) => {\r\n const groups = {}\r\n const cb = (o) => {\r\n return [o.pid]\r\n }\r\n\r\n chapters.forEach((o) => {\r\n const group = JSON.stringify(cb(o))\r\n\r\n groups[group] = groups[group] || []\r\n groups[group].push(o)\r\n\r\n o.index = groups[group].length\r\n\r\n if (o.pid === -1) {\r\n o.code = String(o.index)\r\n }\r\n })\r\n\r\n Object.keys(groups).forEach((group) => {\r\n groups[group].forEach((c) => {\r\n const subjects = groups[`[${c.id}]`]\r\n\r\n if (!subjects || !isArray(subjects)) {\r\n return false\r\n }\r\n\r\n subjects.forEach((o) => {\r\n o.code = c.code + '.' + o.index\r\n })\r\n })\r\n })\r\n\r\n return chapters\r\n}\r\n\r\nexport default _getChaptersWithCode\r\n","import isString from '../utils/types/isString'\r\nimport isFunction from '../utils/types/isFunction'\r\nimport isElement from '../utils/types/isElement'\r\nimport toTree from '../utils/lang/toTree'\r\n\r\nimport getChaptersByHeadings from './getChaptersByHeadings'\r\n\r\n/**\r\n *\r\n * @param {Object} [options]\r\n * @param {String|HTMLElement} [options.articleElement]\r\n * @param {String} [options.selector]\r\n * @param {Boolean} [options.showCode]\r\n * @param {Function} [options.chapterTextFilter]\r\n * @param {Boolean} [options.isTreeStructured]\r\n * @returns {Array}\r\n */\r\nconst getChapters = (options) => {\r\n const {\r\n articleElement,\r\n selector,\r\n showCode,\r\n chapterTextFilter,\r\n isTreeStructured\r\n } = options\r\n let $article = document.querySelector('#article')\r\n let $headings = []\r\n let chapters = []\r\n let filter = null\r\n\r\n if (isString(articleElement)) {\r\n $article = document.querySelector(articleElement)\r\n } else if (isElement(articleElement)) {\r\n $article = articleElement\r\n }\r\n\r\n if (!$article) {\r\n return chapters\r\n }\r\n\r\n if (isFunction(chapterTextFilter)) {\r\n filter = chapterTextFilter\r\n } else {\r\n if (chapterTextFilter === true) {\r\n filter = (text) => {\r\n return text.replace(/\\(.*?\\)/, '()')\r\n }\r\n }\r\n }\r\n\r\n $headings = [...$article.querySelectorAll(selector || 'h1,h2,h3,h4,h5,h6')]\r\n chapters = getChaptersByHeadings($headings, showCode, filter)\r\n\r\n return isTreeStructured === true ? toTree(chapters, 'id', 'pid') : chapters\r\n}\r\n\r\nexport default getChapters\r\n","const toTree = (list, nodeKey, parentKey) => {\r\n const map = {}\r\n const roots = []\r\n\r\n list.forEach((item, i) => {\r\n // initialize the map\r\n map[item[nodeKey]] = i\r\n // initialize the children\r\n item.children = []\r\n })\r\n\r\n list.forEach((item) => {\r\n const node = list[map[item[parentKey]]]\r\n\r\n if (item[parentKey] !== -1) {\r\n // if you have dangling branches check that map[node.parentId] exists\r\n node.children.push(item)\r\n } else {\r\n roots.push(item)\r\n }\r\n })\r\n\r\n return roots\r\n}\r\n\r\nexport default toTree\r\n","/**\r\n * 检测对象自身属性中是否具有指定的属性。\r\n * ========================================================================\r\n * @method hasOwn\r\n * @param {Object} obj - (必须)检测的目标对象\r\n * @param {String} prop - (必须)属性名\r\n * @returns {Boolean}\r\n */\r\nconst hasOwn = (obj, prop) => {\r\n const hasOwnProperty = Object.prototype.hasOwnProperty\r\n return obj && hasOwnProperty.call(obj, prop)\r\n}\r\n\r\nexport default hasOwn\r\n","import hasOwn from './hasOwn'\r\n\r\n/**\r\n * 扩展对象\r\n * ========================================================================\r\n * @method extend\r\n * @param {Object} origin\r\n * @param {Object} source\r\n */\r\nconst extend = (origin, source) => {\r\n const keys = Object.keys(source)\r\n\r\n keys.forEach((prop) => {\r\n if (hasOwn(source, prop)) {\r\n origin[prop] = source[prop]\r\n }\r\n })\r\n}\r\n\r\nexport default extend\r\n","/**\r\n * 存储订阅者(主题和处理器的)私有对象\r\n * ========================================================================\r\n * @type {{}}\r\n * @private\r\n */\r\nconst _subscribers = {}\r\n\r\nexport default _subscribers\r\n","import hasOwn from '@/utils/lang/hasOwn'\r\nimport _subscribers from './_subscribers'\r\n\r\n/**\r\n * 判断是否存在与给定 topic 完全匹配的订阅者信息\r\n * ========================================================================\r\n * @method _hasDirectSubscribersFor\r\n * @param {String} topic - (必须)订阅主题字符串\r\n * @returns {Boolean}\r\n */\r\nconst _hasDirectSubscribersFor = (topic) => {\r\n return hasOwn(_subscribers, topic) && _subscribers[topic].length > 0\r\n}\r\n\r\nexport default _hasDirectSubscribersFor\r\n","import _hasDirectSubscribersFor from './_hasDirectSubscribersFor'\r\nimport _hasSubscribers from './_hasSubscribers'\r\n\r\n/**\r\n * 判断是否存在包含 topic 指定的订阅者信息\r\n * ========================================================================\r\n * @method has\r\n * @param {String} topic - (必须)主题名称\r\n * @param {Boolean} [isDirect] - (可选)是否为直接的主题,默认值:true\r\n * @returns {Boolean}\r\n */\r\nconst has = (topic, isDirect = true) => {\r\n return isDirect ? _hasDirectSubscribersFor(topic) : _hasSubscribers(topic)\r\n}\r\n\r\nexport default has\r\n","import _hasDirectSubscribersFor from './_hasDirectSubscribersFor'\r\n\r\n/**\r\n * 判断是否存在包含给定 topic 相关的订阅者信息\r\n * ========================================================================\r\n * @method _hasSubscribers\r\n * @param {String} topic - (必须)订阅主题字符串\r\n * @returns {Boolean}\r\n */\r\nconst _hasSubscribers = (topic) => {\r\n let found = _hasDirectSubscribersFor(topic)\r\n let position = topic.lastIndexOf('.')\r\n\r\n while (!found && position !== -1) {\r\n topic = topic.substring(0, position)\r\n position = topic.lastIndexOf('.')\r\n found = _hasDirectSubscribersFor(topic)\r\n }\r\n\r\n return found\r\n}\r\n\r\nexport default _hasSubscribers\r\n","import isTypedArray from '@/utils/types/isTypedArray'\r\nimport has from './has'\r\nimport _hasDirectSubscribersFor from './_hasDirectSubscribersFor'\r\nimport _subscribers from './_subscribers'\r\n\r\n/**\r\n * (异步)发布订阅主题信息\r\n * ========================================================================\r\n * 主题默认是异步发布的。确保在消费者处理主题时,主题的发起者不会被阻止。\r\n * ========================================================================\r\n * @method emit\r\n * @param {String} topic - (必须)主题名称\r\n * @param {Object} [data] - (可选)数据对象\r\n * @param {Boolean} [async] - (可选) 是否异步发布\r\n */\r\nconst emit = (topic, data, async = true) => {\r\n const execute = (topic) => {\r\n if (!_hasDirectSubscribersFor(topic)) {\r\n return false\r\n }\r\n\r\n _subscribers[topic].forEach((subscriber) => {\r\n // 针对 mqtt 消息服务返回的 Uint8Array 类似的 typed arrays 格式的数据\r\n // 采用 toString() 方法转化为普通(JSON)字符串\r\n const message = isTypedArray(data) ? data.toString() : data\r\n\r\n subscriber.callback.call(subscriber.context || subscriber, message)\r\n })\r\n }\r\n const deliver = () => {\r\n let subscriber = topic\r\n let position = topic.lastIndexOf('.')\r\n\r\n while (position !== -1) {\r\n subscriber = subscriber.substring(0, position)\r\n position = subscriber.lastIndexOf('.')\r\n\r\n execute(subscriber)\r\n }\r\n\r\n // 执行 topic 对应的处理器\r\n execute(topic)\r\n // 执行特殊 topic:'*'(监听全部消息的发布)\r\n execute('*')\r\n }\r\n\r\n if (!has(topic)) {\r\n return false\r\n }\r\n\r\n if (async) {\r\n setTimeout(deliver, 10)\r\n } else {\r\n deliver()\r\n }\r\n}\r\n\r\nexport default emit\r\n","import toString from '@/utils/lang/toString'\r\n/**\r\n * 判断检测数据是否为 Typed Arrays 类型的数据\r\n * ========================================================================\r\n * @param {*} val\r\n * @returns {boolean}\r\n */\r\nconst isTypedArray = (val) => {\r\n const TYPES = [\r\n '[object Int8Array]',\r\n '[object Uint8Array]',\r\n '[object Uint8ClampedArray]',\r\n '[object Int16Array]',\r\n '[object Uint16Array]',\r\n '[object Int32Array]',\r\n '[object Uint32Array]',\r\n '[object Float32Array]',\r\n '[object Float64Array]',\r\n '[object BigInt64Array]',\r\n '[object BigUint64Array]'\r\n ]\r\n\r\n return TYPES.indexOf(toString(val)) > -1\r\n}\r\n\r\nexport default isTypedArray\r\n","/**\r\n * 生成唯一 id 字符串的函数\r\n * ========================================================================\r\n * @method guid\r\n * @param {String} [prefix] - 生成 id 的前缀字符串\r\n * @return {String} 返回一个表示唯一 id 的字符串\r\n */\r\nconst guid = (() => {\r\n let uuid = 0\r\n\r\n return (prefix) => {\r\n uuid += 1\r\n\r\n return prefix ? prefix + '-' + uuid : 'guid-' + uuid\r\n }\r\n})()\r\n\r\nexport default guid\r\n","import hasOwn from '@/utils/lang/hasOwn'\r\nimport _subscribers from './_subscribers'\r\n\r\n/**\r\n * 删除与给定 topic 相同的订阅者信息\r\n * ========================================================================\r\n * @method _removeSubscriber\r\n * @param {String} topic - (必须)订阅主题字符串\r\n * @returns {Boolean}\r\n */\r\nconst _removeSubscriber = (topic) => {\r\n if (!hasOwn(_subscribers, topic)) {\r\n return false\r\n }\r\n\r\n delete _subscribers[topic]\r\n}\r\n\r\nexport default _removeSubscriber\r\n","import has from './has'\r\nimport _removeSubscriber from './_removeSubscriber'\r\nimport _removeSubscriberByToken from './_removeSubscriberByToken'\r\n\r\n/**\r\n * 取消订阅主题\r\n * ========================================================================\r\n * @method off\r\n * @param {String} topic - (必须)订阅的主题\r\n * @param {Function|String} [token] - (可选)订阅主题的处理器函数或者唯一 Id 值\r\n */\r\nconst off = (topic, token) => {\r\n if (!has(topic)) {\r\n return false\r\n }\r\n\r\n if (token) {\r\n _removeSubscriberByToken(token)\r\n } else {\r\n _removeSubscriber(topic)\r\n }\r\n}\r\n\r\nexport default off\r\n","import _subscribers from './_subscribers'\r\nimport _removeSubscriber from './_removeSubscriber'\r\n\r\n/**\r\n * 通过订阅者 token 值删除订阅者信息\r\n * ========================================================================\r\n * @method _removeSubscriberByToken\r\n * @param {String} token - 订阅者 token 字符串\r\n * @returns {boolean}\r\n * @private\r\n */\r\nconst _removeSubscriberByToken = (token) => {\r\n const keys = Object.keys(_subscribers)\r\n let index = -1\r\n\r\n if (!token || keys.length < 1) {\r\n return false\r\n }\r\n\r\n keys.forEach((subject) => {\r\n const subscriber = _subscribers[subject]\r\n let topic\r\n\r\n subscriber.forEach((execution, j) => {\r\n if (execution.callback === token || execution.token === token) {\r\n topic = execution.topic\r\n subscriber.splice(index, j)\r\n }\r\n })\r\n\r\n /* istanbul ignore else */\r\n if (subscriber.length < 1) {\r\n _removeSubscriber(topic)\r\n }\r\n })\r\n}\r\n\r\nexport default _removeSubscriberByToken\r\n","import isString from './utils/types/isString'\r\n\r\nimport extend from './utils/lang/extend'\r\nimport hasOwn from './utils/lang/hasOwn'\r\n\r\nimport isObject from './utils/types/isObject'\r\n\r\nimport publish from './utils/observer/emit'\r\nimport subscribe from './utils/observer/on'\r\nimport unsubscribe from './utils/observer/off'\r\n\r\nclass Component {\r\n constructor(options) {\r\n this.attrs = {}\r\n this.name = 'component'\r\n\r\n if (options) {\r\n this.initialize(options)\r\n }\r\n }\r\n\r\n initialize(options) {\r\n this.attr(options).render().addListeners()\r\n return this\r\n }\r\n\r\n attr(prop, value) {\r\n const attrs = this.attrs\r\n\r\n if (isString(prop)) {\r\n // 只能扩展 attrs 中已有的属性\r\n if (value && hasOwn(attrs, prop)) {\r\n // 更新单个配置信息\r\n attrs[prop] = value\r\n return this\r\n }\r\n\r\n // 只传递 prop 参数,则返回对应的属性值\r\n return attrs[prop]\r\n } else if (isObject(prop)) {\r\n // 批量更新配置信息\r\n extend(attrs, prop)\r\n\r\n return this\r\n } else if (arguments.length === 0) {\r\n // 不传递参数,直接返回整个\r\n return attrs\r\n }\r\n\r\n return this\r\n }\r\n\r\n render() {\r\n return this\r\n }\r\n\r\n refresh() {\r\n return this\r\n }\r\n\r\n destroy() {\r\n this.removeListeners()\r\n return this\r\n }\r\n\r\n reload(options) {\r\n let attrs = this.attr()\r\n\r\n if (options) {\r\n attrs = this.attr(options)\r\n }\r\n\r\n this.destroy().initialize(attrs)\r\n\r\n return this\r\n }\r\n\r\n $emit(event, data) {\r\n publish(event, data)\r\n return this\r\n }\r\n\r\n $on(event, callback) {\r\n subscribe(event, callback, this)\r\n return this\r\n }\r\n\r\n $off(event, callback) {\r\n unsubscribe(event, callback)\r\n return this\r\n }\r\n\r\n addListeners() {\r\n return this\r\n }\r\n\r\n removeListeners() {\r\n return this\r\n }\r\n}\r\n\r\nexport default Component\r\n","import isFunction from '@/utils/types/isFunction'\r\nimport guid from '@/utils/lang/guid'\r\n\r\nimport _subscribers from './_subscribers'\r\n\r\n/**\r\n * 订阅主题,并给出处理器函数\r\n * ========================================================================\r\n * @method on\r\n * @param {String} topic - (必须)主题名称\r\n * @param {Function} handler - (必须)主题的处理器函数\r\n * @param {Object} [context] - (可选)指定 this 执行上下文\r\n * @return {String} - 唯一的 token 字符串,例如:'guid-1'。\r\n */\r\nconst on = (topic, handler, context = null) => {\r\n const token = guid()\r\n let subject = typeof topic === 'symbol' ? topic.toString() : topic\r\n\r\n if (!isFunction(handler)) {\r\n return ''\r\n }\r\n\r\n /* istanbul ignore else */\r\n if (!_subscribers[subject]) {\r\n _subscribers[subject] = []\r\n }\r\n\r\n _subscribers[subject].push({\r\n topic: subject,\r\n callback: handler,\r\n context,\r\n token\r\n })\r\n\r\n return token\r\n}\r\n\r\nexport default on\r\n","/**\r\n * timeSlice.js 时间切片功能函数\r\n * ====================================================\r\n * Created By: Yaohaixiao\r\n * Update: 2023.09.04\r\n */\r\nimport isFunction from '@/utils/types/isFunction'\r\nimport later from './later'\r\n\r\nconst queue = []\r\nlet isHandling\r\nlet done\r\n\r\n// Shim from https://developers.google.com/web/updates/2015/08/using-requestidlecallback\r\nif (typeof window.requestIdleCallback === 'undefined') {\r\n window.requestIdleCallback = function (cb) {\r\n const start = Date.now()\r\n return later(function () {\r\n cb({\r\n didTimeout: false,\r\n timeRemaining: function () {\r\n return Math.max(0, 50 - (Date.now() - start))\r\n }\r\n })\r\n }, 10)\r\n }\r\n\r\n window.cancelIdleCallback = function (id) {\r\n clearTimeout(id)\r\n }\r\n}\r\n\r\nfunction runIdle(idleDeadline) {\r\n while (idleDeadline.timeRemaining() > 0 && queue.length) {\r\n const fn = queue.shift()\r\n\r\n if (!isFunction(fn)) {\r\n return false\r\n }\r\n\r\n fn()\r\n }\r\n\r\n if (queue.length) {\r\n isHandling = requestIdleCallback(runIdle)\r\n } else {\r\n isHandling = 0\r\n\r\n if (isFunction(done)) {\r\n done()\r\n done = null\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * 时间切片功能函数:主要用于优化长时任务的性能,将长时任务分解成\r\n * 多个短时间任务\r\n * ====================================================\r\n * @param {Function} fn - 需要在空闲时执行的回调函数\r\n * @param {Function} afterComplete - queen 的\r\n * @return {(function(): (boolean|undefined))|*|boolean}\r\n */\r\nconst timeSlice = (fn, afterComplete = null) => {\r\n queue.push(fn)\r\n\r\n if (isFunction(afterComplete)) {\r\n done = afterComplete\r\n }\r\n\r\n if (!isHandling) {\r\n requestIdleCallback(runIdle)\r\n }\r\n}\r\n\r\nexport default timeSlice\r\n","/**\r\n * 获取 DOM 节点相对于窗口的 left (纵坐标)值\r\n * ========================================================================\r\n * @method offsetTop\r\n * @param {HTMLElement} el - DOM 节点\r\n * @returns {Number}\r\n */\r\nconst offsetTop = (el) => {\r\n let top = el.offsetTop\r\n\r\n if (el.offsetParent !== null) {\r\n top += offsetTop(el.offsetParent)\r\n }\r\n\r\n return top\r\n}\r\n\r\nexport default offsetTop\r\n","/**\r\n * 获取 options 节点下匹配 selector 选择器的 DOM 节点\r\n * ========================================================================\r\n * Element.matches() 方法可以用来判断 DOM 元素是否与给定的选择器匹配,事件代理判断是\r\n * 否触发绑定的代理事件回调函数,关键就是使用 Element.matches() 辨别当前事件触发的目\r\n * 标 DOM 元素是否为事件代理所期望触发的目标。\r\n * ========================================================================\r\n * @method matches\r\n * @see https://developer.mozilla.org/en-US/docs/web/api/element/matches\r\n * @param {HTMLElement} el - (必须)DOM 元素\r\n * @param {String} selector - (必须)匹配 DOM 元素的选择器\r\n * @returns {Boolean}\r\n */\r\nconst matches = (el, selector = '') => {\r\n const sel = selector.replace(/^>/i, '')\r\n\r\n if (!selector || !sel || !el) {\r\n return false\r\n }\r\n\r\n /* istanbul ignore else */\r\n if (el.matches) {\r\n return el.matches(sel)\r\n } else if (el.msMatchesSelector) {\r\n return el.msMatchesSelector(sel)\r\n } else {\r\n return false\r\n }\r\n}\r\n\r\nexport default matches\r\n","/**\r\n * 获取 DOM 元素的父节点\r\n * ========================================================================\r\n * @method getParentOrHost\r\n * @param {*|HTMLElement} el - (必须)要获取父节点的 DOM 元素\r\n * @returns {*|HTMLElement}\r\n */\r\nconst getParentOrHost = (el) => {\r\n return el.host && el !== document && el.host.nodeType\r\n ? el.host\r\n : el.parentNode\r\n}\r\n\r\nexport default getParentOrHost\r\n","export const CAPTURE_EVENTS = [\r\n 'focusout',\r\n 'blur',\r\n 'focusin',\r\n 'focus',\r\n 'load',\r\n 'unload',\r\n 'mouseenter',\r\n 'mouseleave'\r\n]\r\n","import { CAPTURE_EVENTS } from './enum'\r\nimport _delete from './_delete'\r\n\r\n/**\r\n * (私有方法)取消 type 类型的代理事件绑定\r\n * ========================================================================\r\n * 如果没有设置 handler,则销毁 this.$options 绑定的所有符合 type 事件类型的事件绑定\r\n * ========================================================================\r\n * @method _off\r\n * @param {HTMLElement} el - (必须)取消事件绑定的 DOM 元素\r\n * @param {String} type - (必须)事件类型\r\n * @param {Function} fn - (必须)事件处理器回调函数\r\n * @private\r\n */\r\nconst _off = (el, type, fn) => {\r\n const capture = CAPTURE_EVENTS.indexOf(type) > -1\r\n\r\n /* istanbul ignore else */\r\n if (fn._delegateListener) {\r\n fn = fn._delegateListener\r\n delete fn._delegateListener\r\n }\r\n\r\n // 移除缓存的 _listeners 数据\r\n _delete(el, type, fn)\r\n\r\n el.removeEventListener(type, fn, capture)\r\n}\r\n\r\nexport default _off\r\n","/**\r\n * 删除 DOM 元素缓存的 _listeners 数据\r\n * ========================================================================\r\n * @method _delete\r\n * @param {HTMLElement} el - 要删除 listener 的 DOM 元素\r\n * @param {String} type - 事件类型(名称)\r\n * @param {Function} [fn] - 事件处理器回调函数\r\n */\r\nconst _delete = function (el, type, fn) {\r\n const listeners = el._listeners\r\n let index = -1\r\n\r\n if (listeners.length < 1) {\r\n return false\r\n }\r\n\r\n // 移除缓存的 _listeners 数据\r\n listeners.forEach((listener, i) => {\r\n const handler = listener.fn\r\n\r\n if (type === listener.type) {\r\n index = i\r\n\r\n if (handler === fn) {\r\n index = i\r\n }\r\n }\r\n })\r\n\r\n /* istanbul ignore else */\r\n if (index > -1) {\r\n listeners.splice(index, 1)\r\n }\r\n}\r\n\r\nexport default _delete\r\n","import isString from '@/utils/types/isString'\r\nimport isElement from '@/utils/types/isElement'\r\nimport getListeners from './getListeners'\r\nimport _off from './_off'\r\n\r\n/**\r\n * 销毁(type 类型的)代理事件绑定\r\n * ========================================================================\r\n * 1. 设置了事件类型 type,则销毁指定类型的事件绑定,否则清除所有代理事件绑定\r\n * 2. recurse 设置为 true,递归销毁子节点全部事件绑定\r\n * ========================================================================\r\n * @method purgeElement\r\n * @param {HTMLElement|String} el - (必须)DOM 元素或者其选择器\r\n * @param {String|Boolean} type - (必须)事件类型\r\n * @param {Boolean} [recurse] - (可选)是否递归销毁子节点所有事件绑定\r\n */\r\nconst purgeElement = function (el, type, recurse = false) {\r\n const $element = isString(el) ? document.querySelector(el) : el\r\n const $children = $element.childNodes\r\n const listeners = getListeners($element, type)\r\n\r\n listeners.forEach((listener) => {\r\n _off($element, listener.type, listener.fn)\r\n })\r\n\r\n if (\r\n (recurse || type === true || arguments.length === 1) &&\r\n $element &&\r\n $children\r\n ) {\r\n $children.forEach(($child) => {\r\n if (isElement($child)) {\r\n purgeElement($child, type, recurse)\r\n }\r\n })\r\n }\r\n}\r\n\r\nexport default purgeElement\r\n","import isString from '@/utils/types/isString'\r\n\r\n/**\r\n * 获取 DOM 元素(type 事件类型)事件绑定信息\r\n * ========================================================================\r\n * 如果设置了事件类型 type, 则返回指定类型的事件绑定信息,否则返回所有事件绑定信息\r\n * ========================================================================\r\n * @methods getListeners\r\n * @param {HTMLElement} el - (必须)要获取事件绑定信息的 DOM 元素\r\n * @param {String} [type] - (可选)事件类型\r\n * @returns {Array} - 已绑定的事件信息\r\n */\r\nconst getListeners = (el, type) => {\r\n let listeners = el._listeners || []\r\n\r\n if (isString(type) && type) {\r\n listeners = listeners.filter((listener) => {\r\n return listener.type === type\r\n })\r\n }\r\n\r\n return listeners\r\n}\r\n\r\nexport default getListeners\r\n","import purgeElement from './purgeElement'\r\nimport isFunction from '../types/isFunction'\r\nimport _off from './_off'\r\n\r\n/**\r\n * 取消 type 类型的代理事件绑定\r\n * ========================================================================\r\n * 如果没有设置 handler,则销毁 this.$options 绑定的所有符合 type 事件类型的事件绑定\r\n * ========================================================================\r\n * @method off\r\n * @param {HTMLElement|Object} el - (必须)取消事件绑定的 DOM 元素\r\n * @param {String} type - (必须)事件类型\r\n * @param {Function} [fn] - (可选)事件处理器回调函数\r\n */\r\nconst off = (el, type, fn) => {\r\n // 如果不设置 fn 参数,默认清除 el 元素上绑定的所有事件处理器\r\n if (!isFunction(fn)) {\r\n purgeElement(el, type)\r\n return false\r\n }\r\n\r\n _off(el, type, fn)\r\n}\r\n\r\nexport default off\r\n","import closest from '@/utils/dom/closest'\r\nimport off from './off'\r\nimport getTarget from './getTarget'\r\n\r\nimport { CAPTURE_EVENTS } from './enum'\r\n\r\n/**\r\n * 绑定代理事件\r\n * ========================================================================\r\n * @method on\r\n * @param {HTMLElement|String|Object} el - (必须)绑定代理事件的 DOM 节点\r\n * @param {String} selector - (必须)事件代理目标 DOM 元素的选择器\r\n * @param {String|Function} type - (必须)事件类型或者事件处理器回调函数\r\n * @param {Function|Object} fn - (可选) 事件处理器回调函数或者传递给事件处理器回调函数的数据对象\r\n * @param {Object|Boolean} [data] - (可选)传递给事件处理器回调函数的数据对象或者事件处理器回调函数的 this 上下文指向,\r\n * @param {Object|Boolean} [context] - (可选)事件处理器回调函数的 this 上下文指向,或者是否仅触发一次\r\n * 当设置为 true 时,则事件处理器回调函数的 this 上下文指向为 data 对象\r\n * @param {Boolean} once - (可选)是否仅触发一次\r\n */\r\nconst on = (el, selector, type, fn, data, context, once = false) => {\r\n // CAPTURE_EVENTS 中的特殊事件,采用事件捕获模型\r\n const capture = CAPTURE_EVENTS.indexOf(type) > -1\r\n\r\n const listener = function (evt) {\r\n const target = getTarget(evt)\r\n // 通过 Element.matches 方法获得点击的目标元素\r\n const delegateTarget = closest(target, selector, el)\r\n let overrideContext = context || el\r\n\r\n evt.delegateTarget = delegateTarget\r\n\r\n // 当设置为 true 时,则事件处理器回调函数的\r\n // this 上下文指向为 data 对象\r\n if (context === true) {\r\n overrideContext = data\r\n }\r\n\r\n /* istanbul ignore else */\r\n if (delegateTarget) {\r\n // 仅触发一次\r\n /* istanbul ignore else */\r\n if (once === true) {\r\n off(el, type, listener)\r\n }\r\n\r\n fn.call(overrideContext, evt, data)\r\n }\r\n }\r\n\r\n if (!el) {\r\n return false\r\n }\r\n\r\n if (!el._listeners) {\r\n el._listeners = []\r\n }\r\n\r\n // 缓存 options 元素绑定的事件处理器\r\n el._listeners.push({\r\n el,\r\n selector,\r\n type,\r\n fn: listener,\r\n data,\r\n context,\r\n capture\r\n })\r\n\r\n // 缓存包装后的事件处理器\r\n fn._delegateListener = listener\r\n\r\n el.addEventListener(type, listener, capture)\r\n}\r\n\r\nexport default on\r\n","import resolveTextNode from '@/utils/dom/resolveTextNode'\r\n\r\n/**\r\n * 返回触发事件的 target DOM 元素\r\n * ========================================================================\r\n * @method getTarget\r\n * @param {Event} evt - Event 对象\r\n * @return {HTMLElement} - Event 对象的 target DOM 元素\r\n */\r\nconst getTarget = function (evt) {\r\n const target = evt.target\r\n\r\n return resolveTextNode(target)\r\n}\r\n\r\nexport default getTarget\r\n","/**\r\n * 在某些情况下,某些浏览器(例如:Safari 浏览器)会返回实际的目标元素内部的文本节点。\r\n * resolveTextNode() 方法则会返回实际的目标节点。\r\n * ========================================================================\r\n * @method resolveTextNode\r\n * @param {HTMLElement|Text} el - 要解析的节点\r\n * @return {*|HTMLElement} - 实际的目标 DOM 节点\r\n */\r\nconst resolveTextNode = function (el) {\r\n if (el && el.nodeType === 3) {\r\n return el.parentNode\r\n }\r\n\r\n return el\r\n}\r\n\r\nexport default resolveTextNode\r\n","import matches from './matches'\r\nimport getParentOrHost from './getParentOrHost'\r\n\r\n/**\r\n * 获取 options 元素父元素最近的包含 selector 选择器的元素\r\n * ========================================================================\r\n * @method closest\r\n * @param {HTMLElement} el - (必须)DOM 元素\r\n * @param {String} selector - (必须)DOM 元素的选择其\r\n * @param {HTMLElement} [ctx] - (必须)比对的 DOM 元素\r\n * @param {Boolean} [includeCTX] - (必须)是否包含 context DOM 元素\r\n * @returns {null|HTMLElement} - 返回最接近的 DOM 元素\r\n */\r\nconst closest = (el, selector, ctx, includeCTX) => {\r\n const context = ctx || document\r\n\r\n if (!el) {\r\n return null\r\n }\r\n\r\n do {\r\n /* istanbul ignore else */\r\n if (\r\n (selector != null &&\r\n (selector.startsWith('>')\r\n ? el.parentNode === context && matches(el, selector)\r\n : matches(el, selector))) ||\r\n (includeCTX && el === context)\r\n ) {\r\n return el\r\n }\r\n\r\n /* istanbul ignore else */\r\n if (el === context) {\r\n break\r\n }\r\n\r\n /* jshint boss:true */\r\n } while ((el = getParentOrHost(el)))\r\n}\r\n\r\nexport default closest\r\n","/**\r\n * 停止事件(阻止默认行为和阻止事件的捕获或冒泡)\r\n * ========================================================================\r\n * @method stop\r\n * @param {Event} evt - 事件对象\r\n *\r\n * @example\r\n *
\r\n * Service\r\n * Help\r\n *
\r\n *\r\n * const $nav = document.querySelector('#nav')\r\n * const $service = document.querySelector('.anchor')\r\n *\r\n * on($nav, 'click', function(evt) {\r\n * console.log('你点击了导航栏')\r\n * })\r\n *\r\n * on($anchor, 'click', function(evt) {\r\n * console.log('tagName', this.tagName)\r\n *\r\n * // 工作台输出:'a'\r\n * // 不会触发事件冒泡,输出:'你点击了导航栏'\r\n * // 也不会切换到 href 属性的页面,阻止了点击链接的默认行为\r\n * stopEvent(evt)\r\n * })\r\n */\r\nconst stop = function (evt) {\r\n evt.stopPropagation()\r\n evt.preventDefault()\r\n}\r\n\r\nexport default stop\r\n","import DEFAULTS from './defaults'\r\n\r\nconst SYMBOLS = [...DEFAULTS]\r\n\r\nexport default SYMBOLS\r\n","const DEFAULTS = [\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n ''\r\n]\r\n\r\nexport default DEFAULTS\r\n","import isString from '@/utils/types/isString'\r\nimport getSymbol from './getSymbol'\r\nimport SYMBOLS from './symbols'\r\n\r\n/**\r\n *\r\n * @method getSymbols\r\n * @param {String} [name]\r\n * @param {String} [iconSet]\r\n * @returns {string[]|*}\r\n */\r\nconst getSymbols = (name, iconSet = 'icon') => {\r\n if (isString(name)) {\r\n return getSymbol(name, iconSet)\r\n }\r\n\r\n return [...SYMBOLS]\r\n}\r\n\r\nexport default getSymbols\r\n","import SYMBOLS from './symbols'\r\n\r\n/**\r\n * @method getSymbol\r\n * @param {String} name\r\n * @param {String} [iconSet]\r\n * @returns {String}\r\n */\r\nconst getSymbol = (name, iconSet = 'icon') => {\r\n const patternName = /id=\"(.*?)\"/\r\n const patternSet = /^(\\w+)-/\r\n const symbols = SYMBOLS\r\n\r\n return symbols.find((symbol) => {\r\n const names = patternName.exec(symbol)\r\n const fullName = names[1]\r\n const sets = patternSet.exec(fullName)\r\n const setName = sets[1]\r\n const iconName =\r\n iconSet === 'icon' ? `${iconSet}-${name}` : `${iconSet}-icon-${name}`\r\n\r\n return setName === iconSet && fullName === iconName\r\n })\r\n}\r\n\r\nexport default getSymbol\r\n","import add from './add'\r\nimport getSymbols from './getSymbols'\r\n\r\n/**\r\n * 绘制 SVG 图标集\r\n * ========================================================================\r\n * @method paint\r\n * @param {String|Array} symbol\r\n */\r\nconst paint = (symbol = '') => {\r\n const $body = document.body\r\n let $icons = document.querySelector('#outline-icons')\r\n let symbols = []\r\n\r\n add(symbol)\r\n symbols = getSymbols()\r\n\r\n if ($icons) {\r\n $icons.innerHTML = symbols.join('')\r\n } else {\r\n $icons = document.createElement('div')\r\n $icons.innerHTML =\r\n ``\r\n $body.insertBefore($icons.firstChild, $body.firstChild)\r\n }\r\n}\r\n\r\nexport default paint\r\n","import isArray from '@/utils/types/isArray'\r\nimport isString from '@/utils/types/isString'\r\nimport SYMBOLS from './symbols'\r\n\r\n/**\r\n * @method add\r\n * @param {Array|String} symbols\r\n * @return {Boolean}\r\n */\r\nconst add = (symbols) => {\r\n if (!symbols) {\r\n return false\r\n }\r\n\r\n if (isArray(symbols) && symbols.length > 0) {\r\n symbols.forEach((symbol) => {\r\n /* istanbul ignore else */\r\n if (SYMBOLS.indexOf(symbol) === -1 && isString(symbol)) {\r\n SYMBOLS.push(symbol)\r\n }\r\n })\r\n } else {\r\n /* istanbul ignore else */\r\n if (isString(symbols)) {\r\n SYMBOLS.push(symbols)\r\n }\r\n }\r\n}\r\n\r\nexport default add\r\n","import isObject from './isObject'\r\nimport isElement from './isElement'\r\nimport isHTMLCollection from './isHTMLCollection'\r\nimport isFragment from './isFragment'\r\nimport isTextNode from './isTextNode'\r\n\r\nconst isDOM = (el) => {\r\n return !!(\r\n isObject(el) &&\r\n (isElement(el) || isHTMLCollection(el) || isFragment(el) || isTextNode(el))\r\n )\r\n}\r\n\r\nexport default isDOM\r\n","import toString from '@/utils/lang/toString'\r\nimport isObject from './isObject'\r\n\r\nconst isHTMLCollection = (el) => {\r\n return !!(isObject(el) && toString(el) === '[object NodeList]')\r\n}\r\n\r\nexport default isHTMLCollection\r\n","import toString from '@/utils/lang/toString'\r\nimport isObject from './isObject'\r\n\r\nconst isFragment = (fragment) => {\r\n return !!(\r\n isObject(fragment) && toString(fragment) === '[object DocumentFragment]'\r\n )\r\n}\r\n\r\nexport default isFragment\r\n","import toString from '@/utils/lang/toString'\r\nimport isObject from './isObject'\r\n\r\nconst isTextNode = (el) => {\r\n return !!(\r\n isObject(el) &&\r\n (toString(el) === '[object Text]' || (el.tagName && el.nodeType === 3))\r\n )\r\n}\r\n\r\nexport default isTextNode\r\n","import addClass from './addClass.js'\r\n\r\n/**\r\n * 给 DOM 节点设置属性/值\r\n * ========================================================================\r\n * @method setAttribute\r\n * @param {HTMLElement} el - DOM 节点\r\n * @param {String} attr - 属性名称\r\n * @param {String|Number|Boolean} value - 属性值\r\n */\r\nconst setAttribute = (el, attr, value) => {\r\n let tagName = el.tagName.toLowerCase()\r\n\r\n switch (attr) {\r\n case 'style':\r\n el.style.cssText = value\r\n break\r\n case 'value':\r\n if (tagName === 'input' || tagName === 'textarea') {\r\n el.value = value\r\n } else {\r\n el.setAttribute(attr, value)\r\n }\r\n break\r\n case 'htmlFor':\r\n el.setAttribute('for', value)\r\n break\r\n case 'className':\r\n addClass(el, value)\r\n break\r\n case 'innerHTML':\r\n el.innerHTML = value\r\n break\r\n case 'innerText':\r\n el.innerText = value\r\n break\r\n default:\r\n el.setAttribute(attr, value)\r\n break\r\n }\r\n}\r\n\r\nexport default setAttribute\r\n","import isObject from '../types/isObject'\r\nimport hasOwn from '../lang/hasOwn'\r\nimport setAttribute from './setAttribute'\r\n\r\nconst setAttributes = (el, attrs) => {\r\n if (!el || !isObject(attrs)) {\r\n return false\r\n }\r\n\r\n Object.keys(attrs).forEach((attr) => {\r\n const value = attrs[attr]\r\n if (hasOwn(attrs, attr)) {\r\n setAttribute(el, attr, value)\r\n }\r\n })\r\n}\r\n\r\nexport default setAttributes\r\n","import isObject from '../types/isObject'\r\nimport isString from '../types/isString'\r\nimport isArray from '../types/isArray'\r\nimport isDOM from '../types/isDOM'\r\nimport setAttributes from './setAttributes'\r\n\r\n/**\r\n * 创建 DOM 节点,并添加属性和子节点\r\n * ========================================================================\r\n * @method createElement\r\n * @param {String} tagName - 标签名称\r\n * @param {Object|Array|HTMLElement|DocumentFragment|String} attrs - 属性对象或者子节点\r\n * @param {Array|HTMLElement|DocumentFragment|String} [children] - 子节点数组\r\n * @returns {HTMLElement}\r\n */\r\nconst createElement = (tagName, attrs, children) => {\r\n const $fragment = document.createDocumentFragment()\r\n const $el = document.createElement(tagName)\r\n const isValidChild = (child) => {\r\n return isDOM(child) || isString(child)\r\n }\r\n const append = (child) => {\r\n let $child\r\n\r\n if (!isValidChild(child)) {\r\n return false\r\n }\r\n\r\n if (isDOM(child)) {\r\n $child = child\r\n } else if (isString(child)) {\r\n $child = document.createTextNode(child)\r\n }\r\n\r\n $fragment.appendChild($child)\r\n }\r\n\r\n if (isObject(attrs)) {\r\n setAttributes($el, attrs)\r\n } else if (isArray(attrs) && attrs.every((attr) => isValidChild(attr))) {\r\n attrs.forEach((child) => {\r\n append(child)\r\n })\r\n } else if (isDOM(attrs)) {\r\n append(attrs)\r\n } else if (isString(attrs)) {\r\n append(document.createTextNode(attrs))\r\n }\r\n\r\n if (isArray(children)) {\r\n children.forEach((child) => {\r\n append(child)\r\n })\r\n } else {\r\n append(children)\r\n }\r\n\r\n $el.appendChild($fragment)\r\n\r\n return $el\r\n}\r\n\r\nexport default createElement\r\n","import isArray from '@/utils/types/isArray'\r\nimport isString from '@/utils/types/isString'\r\nimport isSVG from '@/utils/types/isSVG'\r\nimport setAttributes from '@/utils/dom/setAttributes'\r\n\r\n/**\r\n * 创建 SVG 图标 DOM 元素\r\n * ========================================================================\r\n * @method createElement\r\n * @param {String} name\r\n * @param {Object} [options]\r\n * @param {Number|Array} [options.size]\r\n * @param {String} [options.color]\r\n * @param {String} [options.iconSet]\r\n * @param {Object} [options.attrs]\r\n * @returns {HTMLElement}\r\n */\r\nconst createElement = (name, options = {}) => {\r\n const ICON = 'outline-icon'\r\n const size = options.size || 0\r\n const color = options.color || ''\r\n const iconSet = options.iconSet || ''\r\n const width = isArray(size) ? size[0] : size\r\n const height = isArray(size) ? size[1] : size\r\n const defaultRules = size ? `width:${width}px;height:${height}px;` : ''\r\n const cssRules = color ? defaultRules + `color:${color}` : defaultRules\r\n const attrs = options.attrs || {}\r\n const $icon = document.createElement('i')\r\n let binds = ''\r\n let svg = ''\r\n let $svg\r\n\r\n if (!isString(name)) {\r\n return null\r\n }\r\n\r\n if (isSVG(name)) {\r\n svg = name\r\n } else {\r\n binds =\r\n iconSet && iconSet !== 'icon'\r\n ? `xlink:href=\"#${iconSet}-icon-${name}\"`\r\n : `xlink:href=\"#icon-${name}\"`\r\n svg = ``\r\n }\r\n\r\n $icon.innerHTML = svg\r\n\r\n if (attrs.className) {\r\n attrs.className = `${ICON} ${attrs.className}`\r\n } else {\r\n attrs.className = ICON\r\n }\r\n\r\n setAttributes($icon, attrs)\r\n\r\n $svg = $icon.querySelector('svg')\r\n setAttributes($svg, {\r\n 'aria-hidden': true,\r\n xmlns: 'http://www.w3.org/2000/svg',\r\n class: 'outline-icon__svg',\r\n width: 200,\r\n height: 200,\r\n style: cssRules\r\n })\r\n\r\n return $icon\r\n}\r\n\r\nexport default createElement\r\n","import isString from './isString'\r\n\r\nconst isSVG = (str) => {\r\n const declaration = '(?:<\\\\?xml[^>]*>\\\\s*)?'\r\n const doctype =\r\n '(?:<\\\\!doctype svg[^>]*\\\\s*(?:\\\\[?(?:\\\\s*]*>\\\\s*)*\\\\]?)*[^>]*>\\\\s*)?'\r\n const content = ']*>[^]*<\\\\/svg>\\\\s*$'\r\n const svg = `^\\\\s*${declaration}${doctype}${content}\\\\s*$`\r\n const pattern = new RegExp(svg, 'i')\r\n\r\n return isString(str) && pattern.test(str)\r\n}\r\n\r\nexport default isSVG\r\n","import createElement from './createElement'\r\n\r\n/**\r\n * 创建 SVG 图标 DOM 元素\r\n * ========================================================================\r\n * @method icon\r\n * @alias createElement\r\n * @see createElement\r\n * @param {String} name\r\n * @param {Object} [options]\r\n * @param {Number|Array} [options.size]\r\n * @param {String} [options.color]\r\n * @param {String} [options.iconSet]\r\n * @returns {HTMLElement}\r\n */\r\nconst icon = (name, options = {}) => {\r\n return createElement(name, options)\r\n}\r\n\r\nexport default icon\r\n","import trim from '../lang/trim'\r\nimport hasClass from './hasClass'\r\n\r\n/**\r\n * 移除 DOM 节点的 className 样式\r\n * ========================================================================\r\n * @method removeClass\r\n * @param {HTMLElement} el - DOM 节点\r\n * @param {String} className - 样式名称\r\n * @returns {Boolean}\r\n */\r\nconst removeClass = (el, className) => {\r\n let allClass = el.className\r\n let classList\r\n\r\n if (!allClass || !hasClass(el, className)) {\r\n return false\r\n }\r\n\r\n classList = el.classList\r\n\r\n if (classList?.remove) {\r\n classList.remove(className)\r\n } else {\r\n allClass = trim(allClass.replace(className, ''))\r\n el.className = allClass\r\n }\r\n}\r\n\r\nexport default removeClass\r\n","import removeClass from '@/utils/dom/removeClass'\r\nimport isEmpty from '@/utils/types/isEmpty'\r\nimport trim from '@/utils/lang/trim'\r\n\r\nconst _removeHeading = ($heading, hasAnchor = true, isAtStart = true) => {\r\n const CLS_HEADING = 'outline-heading'\r\n const text = $heading.innerHTML\r\n const pattern = /^\\d+(\\.?\\d+)*\\s?/gi\r\n let $anchor\r\n\r\n $heading.innerHTML = text.replace(pattern, '')\r\n $heading.removeAttribute('id')\r\n $heading.removeAttribute('data-id')\r\n\r\n removeClass($heading, CLS_HEADING)\r\n\r\n if (!hasAnchor) {\r\n return false\r\n }\r\n\r\n $anchor = $heading.querySelector(`.${CLS_HEADING}__anchor`)\r\n\r\n if (isAtStart) {\r\n removeClass($heading, `${CLS_HEADING}_start`)\r\n }\r\n\r\n if (isEmpty(trim($heading.className))) {\r\n $heading.removeAttribute('class')\r\n }\r\n\r\n // 存在锚点才移除\r\n if ($anchor) {\r\n $heading.removeChild($anchor)\r\n }\r\n}\r\n\r\nexport default _removeHeading\r\n","import isString from './isString'\r\n/**\r\n * 检测数据是否为空字符串\r\n * ========================================================================\r\n * @method isEmpty\r\n * @param {String} str\r\n * @returns {boolean}\r\n */\r\nconst isEmpty = (str) => {\r\n return isString(str) && str === ''\r\n}\r\n\r\nexport default isEmpty\r\n","function styleInject(css, ref) {\n if ( ref === void 0 ) ref = {};\n var insertAt = ref.insertAt;\n\n if (!css || typeof document === 'undefined') { return; }\n\n var head = document.head || document.getElementsByTagName('head')[0];\n var style = document.createElement('style');\n style.type = 'text/css';\n\n if (insertAt === 'top') {\n if (head.firstChild) {\n head.insertBefore(style, head.firstChild);\n } else {\n head.appendChild(style);\n }\n } else {\n head.appendChild(style);\n }\n\n if (style.styleSheet) {\n style.styleSheet.cssText = css;\n } else {\n style.appendChild(document.createTextNode(css));\n }\n}\n\nexport default styleInject;\n","import isString from '@/utils/types/isString'\r\nimport isFunction from '@/utils/types/isFunction'\r\nimport isElement from '@/utils/types/isElement'\r\n\r\nimport cloneDeep from '@/utils/lang/cloneDeep'\r\nimport timeSlice from '@/utils/lang/timeSlice'\r\nimport later from '@/utils/lang/later'\r\n\r\nimport scrollTo from '@/utils/dom/scrollTo'\r\nimport getScrollElement from '@/utils/dom/getScrollElement'\r\nimport offsetTop from '@/utils/dom/offsetTop'\r\n\r\nimport on from '@/utils/event/on'\r\nimport off from '@/utils/event/off'\r\nimport stop from '@/utils/event/stop'\r\n\r\nimport paint from '@/utils/icons/paint'\r\n\r\nimport getChapters from '@/chapters/getChapters'\r\n\r\nimport Component from '@/component'\r\n\r\nimport _updateHeading from './utils/_updateHeading'\r\nimport _removeHeading from './utils/_removeHeading'\r\n\r\nimport './anchors.less'\r\n\r\nclass Anchors extends Component {\r\n constructor(options) {\r\n super()\r\n\r\n this._default()\r\n\r\n if (options) {\r\n this.initialize(options)\r\n }\r\n }\r\n\r\n _default() {\r\n this.attrs = cloneDeep(Anchors.DEFAULTS)\r\n\r\n this.$articleElement = null\r\n this.$scrollElement = null\r\n this.$headings = []\r\n\r\n return this\r\n }\r\n\r\n initialize(options) {\r\n let created\r\n let scrollElement\r\n let $articleElement\r\n let articleElement\r\n\r\n this.attr(options)\r\n\r\n articleElement = this.attr('articleElement')\r\n scrollElement = this.attr('scrollElement')\r\n created = this.attr('created')\r\n\r\n if (isString(articleElement)) {\r\n $articleElement = document.querySelector(articleElement)\r\n } else if (isElement(articleElement)) {\r\n $articleElement = articleElement\r\n }\r\n\r\n if (!$articleElement) {\r\n return this\r\n }\r\n\r\n this.$articleElement = $articleElement\r\n this.$scrollElement = getScrollElement(scrollElement)\r\n this.$headings = this.getHeadings()\r\n\r\n if (this.$headings.length < 1) {\r\n return this\r\n }\r\n\r\n if (isFunction(created)) {\r\n created.call(this)\r\n }\r\n\r\n this.render().addListeners()\r\n\r\n return this\r\n }\r\n\r\n getHeadings() {\r\n const $articleElement = this.$articleElement\r\n const selector = this.attr('selector')\r\n\r\n return [...$articleElement.querySelectorAll(selector)]\r\n }\r\n\r\n count() {\r\n return this.getHeadings().length\r\n }\r\n\r\n render() {\r\n const articleElement = this.attr('articleElement')\r\n const selector = this.attr('selector')\r\n const showCode = this.attr('showCode')\r\n const chapterTextFilter = this.attr('chapterTextFilter')\r\n const mounted = this.attr('mounted')\r\n const chapters = getChapters({\r\n articleElement,\r\n selector,\r\n showCode,\r\n chapterTextFilter\r\n })\r\n\r\n paint()\r\n\r\n this._paint(chapters)\r\n\r\n if (isFunction(mounted)) {\r\n mounted.call(this)\r\n }\r\n\r\n return this\r\n }\r\n\r\n erase() {\r\n this._remove()\r\n\r\n return this\r\n }\r\n\r\n _paint(chapters) {\r\n const LIMIT = 400\r\n const hasAnchor = this.attr('hasAnchor')\r\n const isAtStart = this.attr('isAtStart')\r\n const showCode = this.attr('showCode')\r\n const anchorURL = this.attr('anchorURL')\r\n const anchorLinkFilter = this.attr('anchorLinkFilter')\r\n const count = this.count()\r\n const $headings = [...this.$headings]\r\n const update = (headings, group) => {\r\n headings.forEach(($heading, i) => {\r\n const id = i + group * LIMIT\r\n const chapterCode = chapters[id].code\r\n _updateHeading($heading, id, {\r\n hasAnchor,\r\n isAtStart,\r\n showCode,\r\n chapterCode,\r\n anchorURL,\r\n anchorLinkFilter\r\n })\r\n })\r\n }\r\n let groupIndex = -1\r\n\r\n // 针对超长的文章,进行 timeSlice 处理\r\n if (count > LIMIT) {\r\n groupIndex += 1\r\n // 同步绘制 Limit 以内的标题链接(可以确保 50ms 完成绘制)\r\n update($headings.splice(0, LIMIT), 0)\r\n // 采用 timeSlice 处理机制绘制剩余的标题\r\n while ($headings.length > 0) {\r\n const once = $headings.splice(0, LIMIT)\r\n timeSlice(\r\n () => {\r\n update(once, (groupIndex += 1))\r\n },\r\n () => {\r\n this.$emit('anchors:all:paint')\r\n }\r\n )\r\n }\r\n } else {\r\n update($headings, 0)\r\n }\r\n\r\n return this\r\n }\r\n\r\n _remove() {\r\n const hasAnchor = this.attr('hasAnchor')\r\n const isAtStart = this.attr('isAtStart')\r\n const $headings = this.$headings\r\n\r\n $headings.forEach(($heading) => {\r\n _removeHeading($heading, hasAnchor, isAtStart)\r\n })\r\n\r\n return this\r\n }\r\n\r\n refresh(chapters) {\r\n const articleElement = this.attr('articleElement')\r\n const selector = this.attr('selector')\r\n const showCode = this.attr('showCode')\r\n const chapterTextFilter = this.attr('chapterTextFilter')\r\n\r\n this.$headings = this.getHeadings()\r\n\r\n this.erase()._paint(\r\n chapters ||\r\n getChapters({\r\n articleElement,\r\n selector,\r\n showCode,\r\n chapterTextFilter\r\n })\r\n )\r\n\r\n return this\r\n }\r\n\r\n scrollTo(top, after) {\r\n const el = this.$scrollElement\r\n\r\n scrollTo(el, top, after)\r\n\r\n return this\r\n }\r\n\r\n destroy() {\r\n const beforeDestroy = this.attr('beforeDestroy')\r\n const afterDestroy = this.attr('afterDestroy')\r\n\r\n if (isFunction(beforeDestroy)) {\r\n beforeDestroy.call(this)\r\n }\r\n\r\n this.removeListeners()._remove()._default()\r\n\r\n if (isFunction(afterDestroy)) {\r\n afterDestroy.call(this)\r\n }\r\n\r\n return this\r\n }\r\n\r\n onAnchorTrigger(evt) {\r\n const anchorURL = this.attr('anchorURL')\r\n const afterScroll = this.attr('afterScroll')\r\n const stickyHeight = this.attr('stickyHeight')\r\n const $anchor = evt.delegateTarget\r\n const $heading = $anchor.parentNode\r\n const top = offsetTop($heading) - (stickyHeight + 10)\r\n const $scrollElement = this.$scrollElement\r\n const min = 0\r\n const max = $scrollElement.scrollHeight - $scrollElement.clientHeight\r\n const after = () => {\r\n if (isFunction(afterScroll)) {\r\n afterScroll.call(this, 'anchor')\r\n }\r\n\r\n later(() => {\r\n this.$emit('toolbar:update', {\r\n top,\r\n min,\r\n max\r\n })\r\n })\r\n }\r\n\r\n this.scrollTo(top, after)\r\n\r\n if (!anchorURL) {\r\n stop(evt)\r\n }\r\n\r\n return this\r\n }\r\n\r\n onRefresh(chapters) {\r\n this.refresh(chapters)\r\n\r\n return this\r\n }\r\n\r\n addListeners() {\r\n const $articleElement = this.$articleElement\r\n\r\n if (this.count() < 1) {\r\n return this\r\n }\r\n\r\n on(\r\n $articleElement,\r\n '.outline-heading__anchor',\r\n 'click',\r\n this.onAnchorTrigger,\r\n this,\r\n true\r\n )\r\n\r\n this.$on('anchors:refresh', this.onRefresh)\r\n\r\n return this\r\n }\r\n\r\n removeListeners() {\r\n const $articleElement = this.$articleElement\r\n\r\n if (this.count() < 1) {\r\n return this\r\n }\r\n\r\n off($articleElement, 'click', this.onAnchorTrigger)\r\n this.$off('anchors:refresh', this.onRefresh)\r\n\r\n return this\r\n }\r\n}\r\n\r\nAnchors.DEFAULTS = (() => {\r\n const OPTIONS = {\r\n scrollElement: 'html,body',\r\n articleElement: '#article',\r\n selector: 'h1,h2,h3,h4,h5,h6',\r\n stickyHeight: 0,\r\n anchorURL: '',\r\n hasAnchor: true,\r\n isAtStart: true,\r\n showCode: false,\r\n created: null,\r\n mounted: null,\r\n afterScroll: null,\r\n beforeDestroy: null,\r\n afterDestroy: null,\r\n chapterTextFilter: null,\r\n anchorLinkFilter: null\r\n }\r\n\r\n return cloneDeep(OPTIONS)\r\n})()\r\n\r\nexport default Anchors\r\n","import isFunction from '@/utils/types/isFunction'\r\nimport trim from '@/utils/lang/trim'\r\nimport createElement from '@/utils/dom/createElement'\r\nimport setAttributes from '@/utils/dom/setAttributes'\r\n\r\nimport icon from '@/utils/icons/icon'\r\n\r\nconst _updateHeading = ($heading, i, options) => {\r\n const CLS_HEADING = 'outline-heading'\r\n const hasAnchor = options.hasAnchor || true\r\n const isAtStart = options.isAtStart || true\r\n const showCode = options.showCode || false\r\n const chapterCode = options.chapterCode || ''\r\n const anchorURL = options.anchorURL || ''\r\n const anchorLinkFilter = options.anchorLinkFilter || null\r\n const headingId = `heading-${i}`\r\n const attrs = {\r\n id: headingId,\r\n className: isAtStart ? `${CLS_HEADING} ${CLS_HEADING}_start` : CLS_HEADING,\r\n 'data-id': i\r\n }\r\n const text = trim($heading.innerHTML)\r\n let url\r\n let $anchor\r\n let $icon\r\n\r\n if (showCode) {\r\n attrs.innerHTML = chapterCode + ' ' + text\r\n attrs['data-code'] = chapterCode\r\n }\r\n setAttributes($heading, attrs)\r\n\r\n if (!hasAnchor) {\r\n return false\r\n }\r\n\r\n if (anchorURL) {\r\n url = anchorURL\r\n } else {\r\n if (isFunction(anchorLinkFilter)) {\r\n url = anchorLinkFilter($heading.tagName.toLowerCase(), text, i)\r\n } else {\r\n url = `#${headingId}`\r\n }\r\n }\r\n\r\n $icon = icon('hash', { iconSet: 'outline' })\r\n $anchor = createElement(\r\n 'a',\r\n {\r\n id: `anchor-${i}`,\r\n className: `${CLS_HEADING}__anchor anchor-${i}`,\r\n href: url,\r\n target: anchorURL ? '_blank' : 'self',\r\n 'data-id': i\r\n },\r\n $icon\r\n )\r\n $heading.appendChild($anchor)\r\n}\r\n\r\nexport default _updateHeading\r\n","// HTML 合法的标签\r\nconst TAGS = [\r\n 'a',\r\n 'abbr',\r\n 'address',\r\n 'area',\r\n 'article',\r\n 'aside',\r\n 'audio',\r\n 'b',\r\n 'base',\r\n 'bdi',\r\n 'bdo',\r\n 'blockquote',\r\n 'body',\r\n 'br',\r\n 'button',\r\n 'canvas',\r\n 'caption',\r\n 'cite',\r\n 'code',\r\n 'col',\r\n 'colgroup',\r\n 'data',\r\n 'datalist',\r\n 'dd',\r\n 'del',\r\n 'details',\r\n 'dfn',\r\n 'dialog',\r\n 'div',\r\n 'dl',\r\n 'dt',\r\n 'em',\r\n 'embed',\r\n 'fieldset',\r\n 'figcaption',\r\n 'figure',\r\n 'footer',\r\n 'form',\r\n 'h1',\r\n 'h2',\r\n 'h3',\r\n 'h4',\r\n 'h5',\r\n 'h6',\r\n 'head',\r\n 'header',\r\n 'hgroup',\r\n 'hr',\r\n 'html',\r\n 'i',\r\n 'iframe',\r\n 'img',\r\n 'input',\r\n 'ins',\r\n 'kbd',\r\n 'label',\r\n 'legend',\r\n 'li',\r\n 'link',\r\n 'main',\r\n 'map',\r\n 'mark',\r\n 'math',\r\n 'menu',\r\n 'menuitem',\r\n 'meta',\r\n 'meter',\r\n 'nav',\r\n 'noscript',\r\n 'object',\r\n 'ol',\r\n 'optgroup',\r\n 'option',\r\n 'output',\r\n 'p',\r\n 'param',\r\n 'picture',\r\n 'pre',\r\n 'progress',\r\n 'q',\r\n 'rb',\r\n 'rp',\r\n 'rt',\r\n 'rtc',\r\n 'ruby',\r\n 's',\r\n 'samp',\r\n 'script',\r\n 'search',\r\n 'section',\r\n 'select',\r\n 'slot',\r\n 'small',\r\n 'source',\r\n 'span',\r\n 'strong',\r\n 'style',\r\n 'sub',\r\n 'summary',\r\n 'sup',\r\n 'svg',\r\n 'table',\r\n 'tbody',\r\n 'td',\r\n 'template',\r\n 'textarea',\r\n 'tfoot',\r\n 'th',\r\n 'thead',\r\n 'time',\r\n 'title',\r\n 'tr',\r\n 'track',\r\n 'u',\r\n 'ul',\r\n 'var',\r\n 'video',\r\n 'wbr'\r\n]\r\n\r\nexport default TAGS\r\n","import trim from '@/utils/lang/trim'\r\nimport isString from './isString'\r\nimport TAGS from './tags'\r\n\r\n/**\r\n * 检测测试数据是否为合法的 HTML 代码\r\n * ========================================================================\r\n * @method isHTML\r\n * @category Lang\r\n * @see https://github.com/sindresorhus/html-tags\r\n * @see https://github.com/sindresorhus/is-html\r\n * @param {String} str - 要检测的数据\r\n * @returns {Boolean} 'val' 为合法的 HTML 代码,返回 true,否则返回 false\r\n */\r\nconst isHTML = (str) => {\r\n let html\r\n let basic\r\n let full\r\n\r\n if (!isString(str)) {\r\n return false\r\n }\r\n\r\n // 为了提高性能,我们将其限制在合理的长度内。\r\n html = trim(str).slice(0, 1000)\r\n basic = /\\s*|]*>|]*>|]+>/i\r\n full = new RegExp(TAGS.map((tag) => `<${tag}\\\\b[^>]*>`).join('|'), 'i')\r\n\r\n return basic.test(html) || full.test(html)\r\n}\r\n\r\nexport default isHTML\r\n","/**\r\n * 移除字符串中的 JavaScript 代码\r\n * ====================================================\r\n * @param {String} str\r\n * @returns {String}\r\n */\r\nconst stripScripts = (str) => {\r\n return str.replace(/]*>.*?<\\/script>/gi, '')\r\n}\r\n\r\nexport default stripScripts\r\n","const setProperty = (prop, value) => {\r\n const documentElement = document.documentElement\r\n documentElement.style.setProperty(prop, value)\r\n}\r\n\r\nexport default setProperty\r\n","import setProperty from './setProperty'\r\n\r\nlet index = 2000\r\n\r\nconst zIndex = (idx) => {\r\n if (idx) {\r\n index = idx\r\n } else {\r\n index += 1\r\n }\r\n\r\n setProperty('--outline-zIndex', `${index}`)\r\n\r\n return index\r\n}\r\n\r\nexport default zIndex\r\n","import later from '@/utils/lang/later'\r\nimport cloneDeep from '@/utils/lang/cloneDeep'\r\nimport isFunction from '@/utils/types/isFunction'\r\nimport isDOM from '@/utils/types/isDOM'\r\nimport isHTML from '@/utils/types/isHTML'\r\nimport addClass from '@/utils/dom/addClass'\r\nimport removeClass from '@/utils/dom/removeClass'\r\nimport html from '@/utils/dom/html'\r\nimport createElement from '@/utils/dom/createElement'\r\nimport zIndex from '@/utils/dom/zIndex'\r\nimport on from '@/utils/event/on'\r\nimport off from '@/utils/event/off'\r\n\r\nimport paint from '@/utils/icons/paint'\r\nimport icon from '@/utils/icons/icon'\r\n\r\nimport Component from '@/component'\r\n\r\nimport './drawer.less'\r\n\r\nclass Drawer extends Component {\r\n constructor(options) {\r\n super()\r\n\r\n this._default()\r\n\r\n this.zIndex = 0\r\n\r\n if (options) {\r\n this.initialize(options)\r\n }\r\n }\r\n\r\n _default() {\r\n this.attrs = cloneDeep(Drawer.DEFAULTS)\r\n this.title = ''\r\n this.closed = false\r\n\r\n this.$el = null\r\n this.$modal = null\r\n this.$header = null\r\n this.$title = null\r\n this.$close = null\r\n this.$main = null\r\n this.$footer = null\r\n this.$overlay = null\r\n\r\n return this\r\n }\r\n\r\n initialize(options) {\r\n let created\r\n\r\n this.attr(options)\r\n\r\n this.title = this.attr('title')\r\n created = this.attr('created')\r\n\r\n if (isFunction(created)) {\r\n created.call(this)\r\n }\r\n\r\n this.render().addListeners()\r\n return this\r\n }\r\n\r\n setTitle(title) {\r\n this.attr('title', title)\r\n this.title = title\r\n this.$title.innerHTML = title\r\n\r\n return this\r\n }\r\n\r\n isClosed() {\r\n return this.closed\r\n }\r\n\r\n render() {\r\n const mounted = this.attr('mounted')\r\n const size = this.attr('size')\r\n const placement = this.attr('placement')\r\n const hasClose = this.attr('hasClose')\r\n const hasOverlay = this.attr('hasOverlay')\r\n const hasOffset = this.attr('hasOffset')\r\n const hasPadding = this.attr('hasPadding')\r\n const autoHeight = this.attr('autoHeight')\r\n const overflow = this.attr('overflow')\r\n const customClass = this.attr('customClass')\r\n let mainClassName = 'outline-drawer__main'\r\n let $el\r\n let $modal\r\n let $header\r\n let $title\r\n let $close\r\n let $main\r\n let $footer\r\n let $overlay\r\n\r\n paint()\r\n this.zIndex = zIndex()\r\n\r\n $title = createElement(\r\n 'h2',\r\n {\r\n className: 'outline-drawer__title'\r\n },\r\n this.title\r\n )\r\n this.$title = $title\r\n\r\n if (hasClose) {\r\n $close = createElement(\r\n 'div',\r\n {\r\n className: 'outline-drawer__close'\r\n },\r\n icon('close', { iconSet: 'outline', size: 20 })\r\n )\r\n this.$close = $close\r\n }\r\n\r\n $header = createElement(\r\n 'header',\r\n {\r\n className: 'outline-drawer__header'\r\n },\r\n [$title, $close]\r\n )\r\n this.$header = $header\r\n\r\n if (overflow === 'hidden') {\r\n mainClassName += ' overflow-hidden'\r\n }\r\n\r\n $main = createElement('div', {\r\n className: mainClassName\r\n })\r\n this.$main = $main\r\n\r\n if (!hasPadding) {\r\n addClass($main, 'outline-drawer_full')\r\n }\r\n\r\n $footer = createElement('footer', {\r\n className: 'outline-drawer__footer'\r\n })\r\n this.$footer = $footer\r\n\r\n $modal = createElement(\r\n 'div',\r\n {\r\n className: `outline-drawer__modal outline-drawer_${placement} outline-drawer_${size} outline-drawer_closed`\r\n },\r\n [$header, $main, $footer]\r\n )\r\n this.$modal = $modal\r\n\r\n if (hasOffset) {\r\n addClass($modal, 'outline-drawer_offset')\r\n }\r\n\r\n if (autoHeight) {\r\n addClass($modal, 'outline-drawer_auto')\r\n }\r\n\r\n if (customClass) {\r\n addClass($modal, customClass)\r\n }\r\n\r\n if (hasOverlay) {\r\n $overlay = createElement('div', {\r\n className: 'outline-drawer__overlay'\r\n })\r\n this.$overlay = $overlay\r\n }\r\n\r\n $el = createElement(\r\n 'div',\r\n {\r\n className: `outline-drawer`\r\n },\r\n [$modal, $overlay]\r\n )\r\n this.$el = $el\r\n document.body.appendChild($el)\r\n\r\n if (isFunction(mounted)) {\r\n mounted.call(this)\r\n }\r\n\r\n return this\r\n }\r\n\r\n erase() {\r\n this.$main.innerHTML = ''\r\n return this\r\n }\r\n\r\n _paint(content) {\r\n let $content = null\r\n\r\n if (isFunction(content)) {\r\n $content = content()\r\n } else if (isDOM(content)) {\r\n $content = content\r\n } else if (isHTML(content)) {\r\n $content = html(content)\r\n }\r\n\r\n if ($content) {\r\n this.$main.appendChild($content)\r\n }\r\n\r\n return this\r\n }\r\n\r\n _remove() {\r\n document.body.removeChild(this.$el)\r\n return this\r\n }\r\n\r\n refresh(content) {\r\n this.erase()._paint(content)\r\n return this\r\n }\r\n\r\n open() {\r\n const opened = this.attr('afterOpened')\r\n const $modal = this.$modal\r\n\r\n addClass(this.$el, 'outline-drawer_opened')\r\n removeClass($modal, 'outline-drawer_closed')\r\n addClass($modal, 'outline-drawer_opened')\r\n\r\n later(() => {\r\n this.closed = false\r\n\r\n if (isFunction(opened)) {\r\n opened.call(this)\r\n }\r\n })\r\n\r\n return this\r\n }\r\n\r\n close() {\r\n const closed = this.attr('afterClosed')\r\n const $modal = this.$modal\r\n\r\n removeClass($modal, 'outline-drawer_opened')\r\n addClass($modal, 'outline-drawer_closed')\r\n\r\n later(() => {\r\n removeClass(this.$el, 'outline-drawer_opened')\r\n this.closed = true\r\n\r\n if (isFunction(closed)) {\r\n closed.call(this)\r\n }\r\n })\r\n\r\n return this\r\n }\r\n\r\n toggle() {\r\n const afterToggle = this.attr('afterToggle')\r\n const closed = this.isClosed()\r\n\r\n if (closed) {\r\n this.open()\r\n } else {\r\n this.close()\r\n }\r\n\r\n if (isFunction(afterToggle)) {\r\n later(() => {\r\n afterToggle.call(this, closed)\r\n })\r\n }\r\n\r\n return this\r\n }\r\n\r\n destroy() {\r\n const afterDestroy = this.attr('afterDestroy')\r\n const beforeDestroy = this.attr('beforeDestroy')\r\n let index = this.zIndex\r\n\r\n if (isFunction(beforeDestroy)) {\r\n beforeDestroy.call(this)\r\n }\r\n\r\n this.removeListeners()._remove()._default()\r\n\r\n index -= 1\r\n zIndex(index)\r\n this.zIndex = 0\r\n\r\n if (isFunction(afterDestroy)) {\r\n afterDestroy.call(this)\r\n }\r\n\r\n return this\r\n }\r\n\r\n onClose() {\r\n this.close()\r\n return this\r\n }\r\n\r\n addListeners() {\r\n const hasClose = this.attr('hasClose')\r\n const hasOverlay = this.attr('hasOverlay')\r\n const closeOnClickModal = this.attr('closeOnClickModal')\r\n const $el = this.$el\r\n\r\n if (hasClose) {\r\n on($el, '.outline-drawer__close', 'click', this.onClose, this, true)\r\n }\r\n\r\n if (hasOverlay && closeOnClickModal) {\r\n on($el, '.outline-drawer__overlay', 'click', this.onClose, this, true)\r\n }\r\n\r\n return this\r\n }\r\n\r\n removeListeners() {\r\n const hasClose = this.attr('hasClose')\r\n const hasOverlay = this.attr('hasOverlay')\r\n const $el = this.$el\r\n\r\n if (!hasClose && !hasOverlay) {\r\n return this\r\n }\r\n\r\n off($el, 'click', this.onClose)\r\n\r\n return this\r\n }\r\n}\r\n\r\nDrawer.DEFAULTS = (() => {\r\n const OPTIONS = {\r\n placement: 'rtl',\r\n title: '标题',\r\n size: 'regular',\r\n hasClose: true,\r\n hasOverlay: true,\r\n hasOffset: false,\r\n hasPadding: true,\r\n autoHeight: true,\r\n closeOnClickModal: true,\r\n overflow: 'auto',\r\n created: null,\r\n mounted: null,\r\n afterClosed: null,\r\n afterOpened: null,\r\n afterScroll: null,\r\n beforeDestroy: null,\r\n afterDestroy: null,\r\n afterToggle: null\r\n }\r\n\r\n return cloneDeep(OPTIONS)\r\n})()\r\n\r\nexport default Drawer\r\n","import isHTML from '../types/isHTML'\r\nimport isString from '../types/isString'\r\nimport isElement from '../types/isElement'\r\nimport stripScripts from '../lang/stripScripts'\r\nimport createElement from './createElement'\r\n\r\n/**\r\n * 获取或者设置 DOM 元素的 innerHTML 属性值,或者通过 HTML 字符串,创建 DOM 元素\r\n * ========================================================================\r\n * @method html\r\n * @param {HTMLElement|String} el\r\n * @param {String} [strHTML]\r\n * @return {DocumentFragment|null|*}\r\n */\r\nconst html = (el, strHTML) => {\r\n const $fragment = document.createDocumentFragment()\r\n\r\n if (!el || (!isHTML(el) && !isString(el) && !isElement(el))) {\r\n return null\r\n }\r\n\r\n if (isHTML(el)) {\r\n const template = createElement('div')\r\n let children = []\r\n\r\n template.innerHTML = stripScripts(el)\r\n children = [...template.childNodes]\r\n children.forEach((child) => {\r\n $fragment.appendChild(child)\r\n })\r\n\r\n return $fragment\r\n } else if (isString(strHTML)) {\r\n el.innerHTML = stripScripts(strHTML)\r\n } else {\r\n return el.innerHTML\r\n }\r\n}\r\n\r\nexport default html\r\n","import isFunction from '@/utils/types/isFunction'\r\nimport off from './off'\r\n\r\nimport { CAPTURE_EVENTS } from './enum'\r\n\r\n/**\r\n * 绑定事件\r\n * ========================================================================\r\n * @method at\r\n * @param {HTMLElement|String|Object} el - (必须)绑定代理事件的 DOM 节点\r\n * @param {String|Function} type - (必须)事件类型或者事件处理器回调函数\r\n * @param {Function|Object} fn - (必须) 事件处理器回调函数或者传递给事件处理器回调函数的数据对象\r\n * @param {Object|Boolean} [data] - (可选)传递给事件处理器回调函数的数据对象或者事件处理器回调函数的 this 上下文指向,\r\n * @param {Object|Boolean} [context] - (可选)事件处理器回调函数的 this 上下文指向,或者是否仅触发一次\r\n * 当设置为 true 时,则事件处理器回调函数的 this 上下文指向为 data 对象\r\n * @param {Boolean} once - (可选)是否仅触发一次\r\n */\r\nconst at = (el, type, fn, data, context, once = false) => {\r\n // CAPTURE_EVENTS 中的特殊事件,采用事件捕获模型\r\n const capture = CAPTURE_EVENTS.indexOf(type) > -1\r\n const listener = function (evt) {\r\n let overrideContext = context || el\r\n\r\n // 当设置为 true 时,则事件处理器回调函数的\r\n // this 上下文指向为 data 对象\r\n if (context === true) {\r\n overrideContext = data\r\n }\r\n\r\n // 仅触发一次\r\n /* istanbul ignore else */\r\n if (once === true) {\r\n off(el, type, listener)\r\n }\r\n\r\n fn.call(overrideContext, evt, data)\r\n }\r\n\r\n if (!isFunction(fn)) {\r\n return false\r\n }\r\n\r\n if (!el._listeners) {\r\n el._listeners = []\r\n }\r\n\r\n // 缓存 options 元素绑定的事件处理器\r\n el._listeners.push({\r\n el,\r\n type,\r\n fn: listener,\r\n data,\r\n context,\r\n capture\r\n })\r\n\r\n // 缓存包装后的事件处理器\r\n fn._delegateListener = listener\r\n\r\n el.addEventListener(type, listener, capture)\r\n}\r\n\r\nexport default at\r\n","/**\r\n * 获取HTML元素的某个CSS样式值\r\n * ====================================================\r\n * @param el\r\n * @param ruleName\r\n * @returns {*}\r\n */\r\nconst getStyle = (el, ruleName) => {\r\n return getComputedStyle(el)[ruleName]\r\n}\r\n\r\nexport default getStyle\r\n","import isString from '@/utils/types/isString'\r\nimport isFunction from '@/utils/types/isFunction'\r\nimport isElement from '@/utils/types/isElement'\r\nimport later from '@/utils/lang/later'\r\nimport cloneDeep from '@/utils/lang/cloneDeep'\r\n\r\nimport at from '@/utils/event/at'\r\nimport on from '@/utils/event/on'\r\nimport off from '@/utils/event/off'\r\nimport stop from '@/utils/event/stop'\r\n\r\nimport createElement from '@/utils/dom/createElement'\r\nimport scrollTo from '@/utils/dom/scrollTo'\r\nimport addClass from '@/utils/dom/addClass'\r\nimport intersection from '@/utils/dom/intersection'\r\nimport removeClass from '@/utils/dom/removeClass'\r\nimport offsetTop from '@/utils/dom/offsetTop'\r\nimport getStyle from '@/utils/dom/getStyle'\r\nimport setProperty from '@/utils/dom/setProperty'\r\nimport inBounding from '@/utils/dom/inBounding'\r\nimport getScrollElement from '@/utils/dom/getScrollElement'\r\n\r\nimport Component from '@/component'\r\n\r\nimport _paintChapters from './utils/_paintChapters'\r\n\r\nimport './navigator.less'\r\n\r\nconst HIDDEN = 'outline-navigator_hidden'\r\nconst EXPANDED = 'outline-navigator_expanded'\r\nconst FOLDED = 'outline-navigator_folded'\r\n\r\nclass Navigator extends Component {\r\n constructor(options) {\r\n super()\r\n\r\n this._default()\r\n\r\n this.scrollTimer = null\r\n this.resizeTimer = null\r\n this.observerTimer = null\r\n this.Observer = null\r\n\r\n if (options) {\r\n this.initialize(options)\r\n }\r\n }\r\n\r\n _default() {\r\n this.attrs = cloneDeep(Navigator.DEFAULTS)\r\n\r\n this.$el = null\r\n this.$title = null\r\n this.$main = null\r\n this.$list = null\r\n this.$placeholder = null\r\n this.$parentElement = null\r\n this.$scrollElement = null\r\n this.$active = null\r\n\r\n this.chapters = []\r\n this.active = 0\r\n this.offsetWidth = 0\r\n this.offsetTop = 0\r\n this.playing = false\r\n this.closed = false\r\n\r\n return this\r\n }\r\n\r\n initialize(options) {\r\n let created\r\n let parentElement\r\n let scrollElement\r\n let $parent\r\n\r\n this.attr(options)\r\n\r\n created = this.attr('created')\r\n parentElement = this.attr('parentElement')\r\n scrollElement = this.attr('scrollElement')\r\n\r\n if (isString(parentElement)) {\r\n $parent = document.querySelector(parentElement)\r\n } else if (isElement(parentElement)) {\r\n $parent = parentElement\r\n }\r\n this.$parentElement = $parent\r\n this.$scrollElement = getScrollElement(scrollElement)\r\n\r\n this.chapters = this.attr('chapters')\r\n this.closed = this.attr('closed')\r\n this.active = this.attr('active')\r\n\r\n if (isFunction(created)) {\r\n created.call(this)\r\n }\r\n\r\n if (this.chapters.length < 1) {\r\n return this\r\n }\r\n\r\n this.render().addListeners()\r\n\r\n this.$active = document.querySelector(`#chapter-${this.active}`)\r\n\r\n return this\r\n }\r\n\r\n isClosed() {\r\n return this.closed\r\n }\r\n\r\n isSticky() {\r\n const position = this.attr('position')\r\n return position === 'sticky'\r\n }\r\n\r\n isFixed() {\r\n const position = this.attr('position')\r\n return position === 'fixed'\r\n }\r\n\r\n isInside() {\r\n return this.isFixed() || this.isSticky()\r\n }\r\n\r\n isOutside() {\r\n return !this.isInside()\r\n }\r\n\r\n count() {\r\n return this.chapters.length\r\n }\r\n\r\n _paintEdge() {\r\n const $fragment = document.createDocumentFragment()\r\n const STICKY = 'outline-navigator_sticky'\r\n const title = this.attr('title')\r\n const animationCurrent = this.attr('animationCurrent')\r\n const customClass = this.attr('customClass')\r\n const $parentElement = this.$parentElement\r\n const children = []\r\n const contents = []\r\n let $title = null\r\n let $el\r\n let $main\r\n let $list\r\n let $placeholder\r\n\r\n if (!$parentElement) {\r\n return this\r\n }\r\n\r\n if (this.isInside() && title) {\r\n $title = createElement(\r\n 'h2',\r\n {\r\n className: 'outline-navigator__title'\r\n },\r\n title\r\n )\r\n this.$title = $title\r\n contents.push($title)\r\n }\r\n\r\n $list = createElement('ul', {\r\n // 为优化性能,添加了 _fixed 和 _hidden\r\n // fixed 为了让 $list 脱离流布局\r\n // hidden 让 $list 不可见\r\n className: `outline-navigator__list`\r\n })\r\n this.$list = $list\r\n children.push($list)\r\n\r\n if (animationCurrent) {\r\n $placeholder = createElement('div', {\r\n className: 'outline-navigator__placeholder'\r\n })\r\n this.$placeholder = $placeholder\r\n children.push($placeholder)\r\n }\r\n\r\n $main = createElement(\r\n 'div',\r\n {\r\n className: 'outline-navigator__main'\r\n },\r\n children\r\n )\r\n this.$main = $main\r\n contents.push($main)\r\n\r\n $el = createElement(\r\n 'nav',\r\n {\r\n id: 'outline-navigator',\r\n className: `outline-navigator ${HIDDEN}`\r\n },\r\n contents\r\n )\r\n this.$el = $el\r\n\r\n if (this.isSticky()) {\r\n this.calculateStickyHeight()\r\n addClass($el, STICKY)\r\n }\r\n\r\n if (customClass) {\r\n addClass($el, customClass)\r\n }\r\n $fragment.appendChild($el)\r\n $parentElement.appendChild($fragment)\r\n\r\n return this\r\n }\r\n\r\n render() {\r\n const mounted = this.attr('mounted')\r\n const $parentElement = this.$parentElement\r\n const chapters = this.chapters\r\n const count = this.count()\r\n let $el\r\n\r\n if (!$parentElement || chapters.length < 1) {\r\n return this\r\n }\r\n\r\n if (this.isInside()) {\r\n addClass($parentElement, 'outline-navigator-parent')\r\n }\r\n\r\n this._paintEdge()\r\n $el = this.$el\r\n\r\n this._paint(chapters)\r\n\r\n later(() => {\r\n this.highlight(this.active)\r\n }, 60)\r\n\r\n this.offsetTop = offsetTop($el)\r\n this.offsetWidth = $el.offsetWidth\r\n\r\n if (this.isFixed()) {\r\n this.sticky()\r\n setProperty('--outline-navigator-width', `${this.offsetWidth}px`)\r\n }\r\n\r\n if (isFunction(mounted)) {\r\n mounted.call(this)\r\n }\r\n\r\n if (count < 400) {\r\n this.onObserver()\r\n }\r\n\r\n return this\r\n }\r\n\r\n erase() {\r\n this.$list.innerHTML = ''\r\n\r\n return this\r\n }\r\n\r\n _paint(chapters) {\r\n const showCode = this.attr('showCode')\r\n const $el = this.$el\r\n const $list = this.$list\r\n\r\n _paintChapters($list, chapters, showCode)\r\n removeClass($el, HIDDEN)\r\n addClass($el, EXPANDED)\r\n\r\n return this\r\n }\r\n\r\n _remove() {\r\n this.$parentElement.removeChild(this.$el)\r\n return this\r\n }\r\n\r\n refresh(chapters) {\r\n const $el = this.$el\r\n\r\n removeClass($el, HIDDEN)\r\n this.erase()._paint(chapters)\r\n\r\n return this\r\n }\r\n\r\n _getPlaceholderOffset(index) {\r\n const $main = this.$main\r\n const $list = this.$list\r\n const $anchor = $list.querySelector('.outline-navigator__anchor')\r\n const mainPaddingTop = parseInt(getStyle($main, 'padding-top'), 10)\r\n const mainBorderTop = parseInt(getStyle($main, 'border-top-width'), 10)\r\n const placeholderPaddingTop = parseInt(getStyle($list, 'padding-top'), 10)\r\n const placeholderMarginTop = parseInt(getStyle($list, 'margin-top'), 10)\r\n const placeholderBorderTop = parseInt(\r\n getStyle($list, 'border-top-width'),\r\n 10\r\n )\r\n let height = $anchor.offsetHeight\r\n let offsetTop = 0\r\n let top\r\n\r\n if (mainPaddingTop) {\r\n offsetTop += mainPaddingTop\r\n }\r\n\r\n if (placeholderPaddingTop) {\r\n offsetTop += placeholderPaddingTop\r\n }\r\n\r\n if (placeholderMarginTop) {\r\n offsetTop += placeholderMarginTop\r\n }\r\n\r\n if (mainBorderTop) {\r\n offsetTop += mainBorderTop\r\n }\r\n\r\n if (placeholderBorderTop) {\r\n offsetTop += placeholderBorderTop\r\n }\r\n\r\n top = height * index\r\n\r\n return offsetTop + top\r\n }\r\n\r\n positionPlaceholder(index) {\r\n const $list = this.$list\r\n const $placeholder = this.$placeholder\r\n const $anchor = $list.querySelector('.outline-navigator__anchor')\r\n const animationCurrent = this.attr('animationCurrent')\r\n const height = $anchor.offsetHeight\r\n let offsetTop = 0\r\n\r\n if (!animationCurrent) {\r\n return this\r\n }\r\n\r\n offsetTop = this._getPlaceholderOffset(index)\r\n\r\n $placeholder.style.cssText = `transform: translateY(${offsetTop}px);height:${height}px;`\r\n\r\n return this\r\n }\r\n\r\n highlight(id) {\r\n const $el = this.$el\r\n const animationCurrent = this.attr('animationCurrent')\r\n const position = this.attr('position')\r\n const ACTIVE = 'outline-navigator_active'\r\n const HIGHLIGHT = 'outline-navigator_highlight'\r\n let $parent = position === 'relative' ? this.$parentElement : this.$main\r\n let $anchor = null\r\n let placeholderOffsetTop = 0\r\n\r\n if (!$el) {\r\n return this\r\n }\r\n\r\n $anchor = $el.querySelector(`#chapter__anchor-${id}`)\r\n\r\n if (!$anchor) {\r\n return this\r\n }\r\n\r\n this.active = parseInt($anchor.getAttribute('data-id'), 10)\r\n\r\n if (this.$active) {\r\n removeClass(this.$active, HIGHLIGHT)\r\n removeClass(this.$active, ACTIVE)\r\n }\r\n\r\n this.$active = $anchor\r\n addClass(this.$active, ACTIVE)\r\n\r\n if (animationCurrent) {\r\n this.positionPlaceholder(this.active)\r\n } else {\r\n addClass(this.$active, HIGHLIGHT)\r\n }\r\n\r\n later(() => {\r\n if (!inBounding(this.$active, $parent)) {\r\n placeholderOffsetTop = this._getPlaceholderOffset(this.active)\r\n scrollTo($parent, placeholderOffsetTop)\r\n }\r\n })\r\n\r\n return this\r\n }\r\n\r\n sticky() {\r\n const afterSticky = this.attr('afterSticky')\r\n const FIXED = 'outline-navigator_fixed'\r\n const $el = this.$el\r\n const top = this.offsetTop\r\n const scrollTop = this.$scrollElement.scrollTop\r\n let isStickying\r\n\r\n if (!this.isFixed()) {\r\n return this\r\n }\r\n\r\n isStickying = scrollTop >= top\r\n\r\n if (isStickying) {\r\n addClass($el, FIXED)\r\n } else {\r\n removeClass($el, FIXED)\r\n }\r\n\r\n if (isFunction(afterSticky)) {\r\n afterSticky.call(this, this.isClosed(), isStickying)\r\n }\r\n\r\n return this\r\n }\r\n\r\n calculateStickyHeight() {\r\n const documentElement = document.documentElement\r\n const height = Math.max(\r\n documentElement.clientHeight || 0,\r\n window.innerHeight || 0\r\n )\r\n setProperty('--outline-sticky-height', `${height}px`)\r\n return this\r\n }\r\n\r\n scrollTo(top, after) {\r\n const el = this.$scrollElement\r\n\r\n scrollTo(el, top, after)\r\n\r\n return this\r\n }\r\n\r\n show() {\r\n const opened = this.attr('afterOpened')\r\n const count = this.count()\r\n const $el = this.$el\r\n const $parent = this.$parentElement\r\n\r\n if (this.isInside()) {\r\n if (count > 800) {\r\n removeClass($parent, HIDDEN)\r\n } else {\r\n removeClass($parent, HIDDEN)\r\n later(() => {\r\n removeClass($parent, FOLDED)\r\n addClass($parent, EXPANDED)\r\n }, 30)\r\n }\r\n } else {\r\n removeClass($el, HIDDEN)\r\n }\r\n this.closed = false\r\n\r\n if (isFunction(opened)) {\r\n opened.call(this)\r\n }\r\n\r\n return this\r\n }\r\n\r\n hide() {\r\n const closed = this.attr('afterClosed')\r\n const count = this.count()\r\n const $el = this.$el\r\n const $parent = this.$parentElement\r\n\r\n if (this.isInside()) {\r\n if (count > 800) {\r\n addClass($parent, HIDDEN)\r\n } else {\r\n addClass($parent, FOLDED)\r\n removeClass($parent, EXPANDED)\r\n later(() => {\r\n addClass($parent, HIDDEN)\r\n })\r\n }\r\n } else {\r\n addClass($el, HIDDEN)\r\n }\r\n this.closed = true\r\n\r\n if (isFunction(closed)) {\r\n closed.call(this)\r\n }\r\n\r\n return this\r\n }\r\n\r\n toggle() {\r\n const afterToggle = this.attr('afterToggle')\r\n const top = this.offsetTop\r\n const scrollTop = this.$scrollElement.scrollTop\r\n let isStickying\r\n\r\n if (this.isClosed()) {\r\n this.show()\r\n } else {\r\n this.hide()\r\n }\r\n\r\n if (isFunction(afterToggle)) {\r\n later(() => {\r\n isStickying = scrollTop >= top\r\n afterToggle.call(this, this.isClosed(), isStickying)\r\n })\r\n }\r\n\r\n return this\r\n }\r\n\r\n destroy() {\r\n const beforeDestroy = this.attr('beforeDestroy')\r\n const afterDestroy = this.attr('afterDestroy')\r\n\r\n if (isFunction(beforeDestroy)) {\r\n beforeDestroy.call(this)\r\n }\r\n\r\n this.removeListeners()._remove()._default()\r\n\r\n if (this.scrollTimer) {\r\n clearTimeout(this.scrollTimer)\r\n this.scrollTimer = null\r\n }\r\n\r\n if (this.resizeTimer) {\r\n clearTimeout(this.resizeTimer)\r\n this.resizeTimer = null\r\n }\r\n\r\n if (this.observerTimer) {\r\n clearTimeout(this.observerTimer)\r\n this.observerTimer = null\r\n }\r\n\r\n if (this.Observer) {\r\n this.Observer = null\r\n }\r\n\r\n if (isFunction(afterDestroy)) {\r\n afterDestroy.call(this)\r\n }\r\n\r\n return this\r\n }\r\n\r\n onObserver() {\r\n const selector = this.attr('selector')\r\n\r\n this.Observer = intersection(\r\n ($heading) => {\r\n const id = $heading.getAttribute('data-id')\r\n\r\n if (this.playing) {\r\n return false\r\n }\r\n\r\n if (this.observerTimer) {\r\n clearTimeout(this.observerTimer)\r\n }\r\n\r\n this.observerTimer = later(() => {\r\n this.highlight(id)\r\n }, 100)\r\n },\r\n {\r\n selector,\r\n context: this\r\n }\r\n )\r\n\r\n return this\r\n }\r\n\r\n onSelect(evt) {\r\n const stickyHeight = this.attr('stickyHeight')\r\n const $anchor = evt.delegateTarget\r\n const id = $anchor.getAttribute('data-id')\r\n const headingId = $anchor.href.split('#')[1]\r\n const $heading = document.querySelector(`#${headingId}`)\r\n const top = offsetTop($heading) - (stickyHeight + 10)\r\n const min = 0\r\n const max = this.$scrollElement.scrollHeight\r\n const afterScroll = this.attr('afterScroll')\r\n const after = () => {\r\n if (isFunction(afterScroll)) {\r\n afterScroll.call(this, 'chapter')\r\n }\r\n\r\n later(() => {\r\n this.playing = false\r\n this.$emit('toolbar:update', {\r\n top,\r\n min,\r\n max\r\n })\r\n })\r\n }\r\n\r\n this.playing = true\r\n if (this.isFixed()) {\r\n this.sticky()\r\n later(() => {\r\n this.scrollTo(top, after)\r\n this.highlight(id)\r\n }, 10)\r\n } else {\r\n this.scrollTo(top, after)\r\n this.highlight(id)\r\n }\r\n\r\n stop(evt)\r\n\r\n return this\r\n }\r\n\r\n onScroll() {\r\n const $scrollElement = this.$scrollElement\r\n\r\n if (this.scrollTimer) {\r\n clearTimeout(this.scrollTimer)\r\n }\r\n\r\n this.scrollTimer = later(() => {\r\n const top = $scrollElement.scrollTop\r\n const min = 0\r\n const max = $scrollElement.scrollHeight - $scrollElement.clientHeight\r\n\r\n if (this.isFixed()) {\r\n this.sticky()\r\n }\r\n\r\n this.$emit('toolbar:update', {\r\n top,\r\n min,\r\n max\r\n })\r\n }, 100)\r\n\r\n return this\r\n }\r\n\r\n onResize() {\r\n // 添加判断\r\n if (!this.isSticky()) {\r\n return this\r\n }\r\n\r\n if (this.resizeTimer) {\r\n clearTimeout(this.resizeTimer)\r\n }\r\n\r\n this.resizeTimer = later(() => {\r\n this.calculateStickyHeight()\r\n })\r\n\r\n return this\r\n }\r\n\r\n onRefresh(chapters) {\r\n this.refresh(chapters)\r\n\r\n return this\r\n }\r\n\r\n addListeners() {\r\n const $el = this.$el\r\n const $scrollElement = this.$scrollElement\r\n const tagName = $scrollElement.tagName.toLowerCase()\r\n let $element = $scrollElement\r\n\r\n if (this.count() < 1) {\r\n return this\r\n }\r\n\r\n if (tagName === 'html' || tagName === 'body') {\r\n $element = window\r\n }\r\n\r\n on($el, '.outline-navigator__anchor', 'click', this.onSelect, this, true)\r\n at($element, 'scroll', this.onScroll, this, true)\r\n if (this.isSticky()) {\r\n at(window, 'resize', this.onResize, this, true)\r\n }\r\n\r\n this.$on('anchors:all:paint', this.onObserver, this)\r\n this.$on('navigator:refresh', this.onRefresh, this)\r\n\r\n return this\r\n }\r\n\r\n removeListeners() {\r\n const selector = this.attr('selector')\r\n const $el = this.$el\r\n const $scrollElement = this.$scrollElement\r\n const tagName = $scrollElement.tagName.toLowerCase()\r\n let $element = $scrollElement\r\n\r\n if (this.count() < 1) {\r\n return this\r\n }\r\n\r\n if (tagName === 'html' || tagName === 'body') {\r\n $element = window\r\n }\r\n\r\n off($el, 'click', this.onSelect)\r\n off($element, 'scroll', this.onScroll)\r\n if (this.isSticky()) {\r\n off(window, 'resize', this.onResize)\r\n }\r\n this.$off('anchors:all:paint')\r\n this.$off('navigator:refresh')\r\n\r\n if (this.Observer) {\r\n document.querySelectorAll(selector).forEach((section) => {\r\n this.Observer.unobserve(section)\r\n })\r\n }\r\n\r\n return this\r\n }\r\n}\r\n\r\nNavigator.DEFAULTS = (() => {\r\n const OPTIONS = {\r\n parentElement: '',\r\n scrollElement: '',\r\n selector: '.outline-heading',\r\n active: 0,\r\n closed: false,\r\n showCode: true,\r\n animationCurrent: true,\r\n position: 'relative',\r\n stickyHeight: 0,\r\n chapters: [],\r\n created: null,\r\n mounted: null,\r\n afterClosed: null,\r\n afterOpened: null,\r\n afterScroll: null,\r\n beforeDestroy: null,\r\n afterDestroy: null,\r\n afterSticky: null\r\n }\r\n\r\n return cloneDeep(OPTIONS)\r\n})()\r\n\r\nexport default Navigator\r\n","import createElement from '@/utils/dom/createElement'\r\nimport timeSlice from '@/utils/lang/timeSlice'\r\n\r\nconst _paintChapters = ($list, chapters, showCode = false) => {\r\n const LIMIT = 400\r\n const count = chapters.length\r\n const clones = [...chapters]\r\n const paint = (parts) => {\r\n const byId = (id) => $list.querySelector(`#${id}`)\r\n parts.forEach((chapter) => {\r\n const pid = chapter.pid\r\n const id = chapter.id\r\n const code = chapter.code\r\n const rel = chapter.rel\r\n const children = []\r\n const $text = createElement(\r\n 'span',\r\n {\r\n className: 'outline-navigator__text'\r\n },\r\n chapter.text\r\n )\r\n let $link\r\n let $code\r\n let $li\r\n let $subject\r\n let $chapter\r\n\r\n if (showCode) {\r\n $code = createElement(\r\n 'span',\r\n {\r\n className: 'outline-navigator__code',\r\n 'data-id': id\r\n },\r\n chapter.code\r\n )\r\n\r\n children.push($code)\r\n }\r\n\r\n children.push($text)\r\n\r\n $link = createElement(\r\n 'a',\r\n {\r\n id: `chapter__anchor-${id}`,\r\n className: 'outline-navigator__anchor',\r\n href: '#' + rel,\r\n rel: rel,\r\n 'data-id': id,\r\n 'data-code': code\r\n },\r\n children\r\n )\r\n\r\n $li = createElement(\r\n 'li',\r\n {\r\n id: `chapter-${id}`,\r\n className: 'outline-navigator__item',\r\n 'data-id': id,\r\n 'data-code': code\r\n },\r\n $link\r\n )\r\n\r\n if (pid === -1) {\r\n $list.appendChild($li)\r\n } else {\r\n $chapter = byId(`chapter-${pid}`)\r\n $subject = byId(`subject-${pid}`)\r\n\r\n if (!$subject) {\r\n $subject = createElement(\r\n 'ul',\r\n {\r\n id: 'subject-' + pid,\r\n className: 'outline-navigator__subject'\r\n },\r\n $li\r\n )\r\n\r\n $chapter.appendChild($subject)\r\n } else {\r\n $subject.appendChild($li)\r\n }\r\n }\r\n })\r\n }\r\n\r\n // 在大量 DOM 菜单绘制的时候,使用 TIME SLICE 拆分绘制任务\r\n // 以避免一次绘制大量 DOM 导致占用资源过高,导致卡死\r\n if (count > LIMIT) {\r\n // 同步绘制\r\n paint(clones.splice(0, LIMIT))\r\n\r\n // 剩余的采用 timeSlice 机制绘制\r\n while (clones.length > 0) {\r\n const once = clones.splice(0, LIMIT)\r\n timeSlice(() => {\r\n paint(once)\r\n })\r\n }\r\n } else {\r\n paint(clones)\r\n }\r\n}\r\n\r\nexport default _paintChapters\r\n","import isElement from '../types/isElement'\r\n\r\n/**\r\n * 检测某个 DOM 节点的位置是否在另个一个 DOM 节点范围内\r\n * ========================================================================\r\n * @method inBounding\r\n * @param {HTMLElement} child\r\n * @param {HTMLElement} parent\r\n * @return {Boolean}\r\n */\r\nconst inBounding = (child, parent) => {\r\n let isInBounding = false\r\n let parentRect\r\n let childRect\r\n\r\n if (!isElement(child) || !isElement(parent)) {\r\n return isInBounding\r\n }\r\n\r\n parentRect = parent.getBoundingClientRect()\r\n childRect = child.getBoundingClientRect()\r\n\r\n isInBounding = !!(\r\n childRect.top >= parentRect.top &&\r\n childRect.right <= parentRect.right &&\r\n childRect.bottom <= parentRect.bottom &&\r\n childRect.left >= parentRect.left\r\n )\r\n\r\n return isInBounding\r\n}\r\n\r\nexport default inBounding\r\n","import isFunction from '../types/isFunction'\r\nimport isElement from '../types/isElement'\r\n\r\n/**\r\n * 通用的 IntersectionObserver 观察者处理器\r\n * ========================================================================\r\n * @method intersection\r\n * @param {Function} fn\r\n * @param {Object} [props]\r\n * @param {Object|HTMLElement} [props.root]\r\n * @param {String} [props.selector]\r\n * @param {Object} [props.context]\r\n * @param {String} [props.attr]\r\n * @param {String} [props.rootMargin]\r\n */\r\nconst intersection = (fn, props = {}) => {\r\n const root = props.root || null\r\n const selector = props.selector || '.outline-heading'\r\n const context = props.context || null\r\n const rootMargin = props.rootMargin || '0px 0px -90% 0px'\r\n const options = {\r\n rootMargin: rootMargin\r\n }\r\n // eslint-disable-next-line compat/compat\r\n const Observer = new IntersectionObserver((entries) => {\r\n entries.forEach((entry) => {\r\n if (entry.intersectionRatio > 0) {\r\n if (isFunction(fn)) {\r\n fn.call(context || entry.target, entry.target)\r\n }\r\n }\r\n })\r\n }, options)\r\n const $root = isElement(root) ? root : document\r\n\r\n if (root) {\r\n options.root = root\r\n }\r\n\r\n $root.querySelectorAll(selector).forEach((section) => {\r\n Observer.observe(section)\r\n })\r\n\r\n return Observer\r\n}\r\n\r\nexport default intersection\r\n","/**\r\n * 检测当前设备是否为移动设备\r\n * ========================================================================\r\n * @method isMobile\r\n * @return {boolean}\r\n */\r\nconst isMobile = () => {\r\n const ua = navigator.userAgent\r\n\r\n return /Mobile|mini|Fennec|Android|iP(ad|od|hone)|NokiaN[^/]*/.test(ua)\r\n}\r\n\r\nexport default isMobile\r\n","import isObjectLike from './isObjectLike'\r\n\r\n/**\r\n * 检测测试数据是否为普通对象\r\n * ========================================================================\r\n * @method isPlainObject\r\n * @param {Object} val - 要检测的数据\r\n * @returns {Boolean} 'val' 是普通对象,返回 true,否则返回 false\r\n */\r\nconst isPlainObject = (val) => {\r\n const getPrototypeOf = Object.getPrototypeOf\r\n let proto\r\n\r\n // Detect obvious negatives\r\n if (!isObjectLike(val)) {\r\n return false\r\n }\r\n\r\n proto = val.prototype\r\n\r\n // JavaScript 对象分为两种:普通对象和函数对象\r\n // 普通对象:原型是 __proto__,没有 prototype 原型(属性)\r\n // 函数对象:原型是 prototype ,prototype 只存在于函数对象上\r\n if (!proto) {\r\n return true\r\n }\r\n\r\n proto = val\r\n\r\n while (getPrototypeOf(proto) !== null) {\r\n proto = getPrototypeOf(proto)\r\n }\r\n\r\n return getPrototypeOf(val) === proto\r\n}\r\n\r\nexport default isPlainObject\r\n","import isObject from './isObject'\r\n\r\n/**\r\n * 检测测试数据是否为类似 Object 类型\r\n * ========================================================================\r\n * @method isObjectLike\r\n * @param {Object} val - 要检测的数据\r\n * @returns {Boolean} 'val' 是类似 Object 类型,返回 true,否则返回 false\r\n */\r\nconst isObjectLike = (val) => {\r\n return isObject(val) && val !== null\r\n}\r\n\r\nexport default isObjectLike\r\n","/**\r\n * 转义字符串中的 HTML 标签\r\n * ========================================================================\r\n * @param {String} str - 需要转义的字符串\r\n * @returns {String}\r\n */\r\nconst encodeHTML = (str) => {\r\n const CHARTS = {\r\n '&': '&',\r\n '<': '<',\r\n '>': '>',\r\n \"'\": ''',\r\n '\"': '"'\r\n }\r\n\r\n return str.replace(/[&<>'\"]/g, (tag) => {\r\n return CHARTS[tag] || tag\r\n })\r\n}\r\n\r\nexport default encodeHTML\r\n","import isString from '@/utils/types/isString'\r\nimport isPlainObject from '@/utils/types/isPlainObject'\r\nimport isFunction from '@/utils/types/isFunction'\r\n\r\nimport extend from '@/utils/lang/extend'\r\nimport later from '@/utils/lang/later'\r\nimport stripScripts from '@/utils/lang/stripScripts'\r\nimport encodeHTML from '@/utils/lang/encodeHTML'\r\nimport cloneDeep from '@/utils/lang/cloneDeep'\r\nimport guid from '@/utils/lang/guid'\r\n\r\nimport createElement from '@/utils/dom/createElement'\r\nimport addClass from '@/utils/dom/addClass'\r\nimport removeClass from '@/utils/dom/removeClass'\r\nimport setAttribute from '@/utils/dom/setAttribute'\r\nimport setAttributes from '@/utils/dom/setAttributes'\r\n\r\nimport icon from '@/utils/icons/icon'\r\nimport paint from '@/utils/icons/paint'\r\n\r\nimport on from '@/utils/event/on'\r\nimport off from '@/utils/event/off'\r\n\r\nimport Component from '@/component'\r\n\r\nimport './message.less'\r\n\r\nconst TYPES = ['info', 'success', 'warning', 'error']\r\nconst instances = []\r\nlet instance\r\n\r\npaint()\r\n\r\nclass Message extends Component {\r\n constructor(options) {\r\n super()\r\n\r\n this._default()\r\n\r\n if (options) {\r\n this.initialize(options)\r\n }\r\n }\r\n\r\n _default() {\r\n this.attrs = cloneDeep(Message.DEFAULTS)\r\n\r\n this.$el = null\r\n this.id = ''\r\n this.closed = false\r\n this.visible = false\r\n this.offset = -50\r\n this.timer = null\r\n this.destroyed = false\r\n\r\n return this\r\n }\r\n\r\n initialize(options) {\r\n this.attr(options)\r\n this.id = this.attr('id')\r\n this.offset = this.attr('offset') || -50\r\n\r\n this.$emit('created', { ...this.attr() })\r\n\r\n this.render().addListeners()\r\n\r\n if (this.attr('visible')) {\r\n this.open()\r\n }\r\n\r\n return this\r\n }\r\n\r\n isClosed() {\r\n return this.closed\r\n }\r\n\r\n isDestroyed() {\r\n return this.destroyed\r\n }\r\n\r\n _getClassName() {\r\n const type = this.attr('type')\r\n const effect = this.attr('effect')\r\n const round = this.attr('round')\r\n const closable = this.attr('closable')\r\n const visible = this.attr('visible')\r\n const customClass = this.attr('customClass')\r\n const className = [\r\n 'outline-message',\r\n `outline-message_${type}`,\r\n `outline-message_${effect}`\r\n ]\r\n\r\n if (round) {\r\n className.push('outline-message_round')\r\n }\r\n\r\n if (!closable) {\r\n className.push('outline-message_full-width')\r\n }\r\n\r\n if (visible) {\r\n className.push('outline-message_visible')\r\n }\r\n\r\n if (customClass) {\r\n className.push(customClass)\r\n }\r\n\r\n return className\r\n }\r\n\r\n render() {\r\n const type = this.attr('type')\r\n const message = this.attr('message')\r\n const effect = this.attr('effect')\r\n const round = this.attr('round')\r\n const closable = this.attr('closable')\r\n const dangerouslyUseHTMLString = this.attr('dangerouslyUseHTMLString')\r\n const className = this._getClassName()\r\n const iconName = effect === 'light' ? `circle-${type}` : type\r\n const children = []\r\n let iconSize = 20\r\n let $type\r\n let $message\r\n let $text\r\n let $close\r\n let $el\r\n\r\n if (round && effect === 'default') {\r\n iconSize = 12\r\n }\r\n\r\n if (effect !== 'plain') {\r\n $type = icon(iconName, {\r\n iconSet: 'outline',\r\n size: iconSize\r\n })\r\n addClass($type, 'outline-message__icon')\r\n children.push($type)\r\n }\r\n\r\n if (!dangerouslyUseHTMLString) {\r\n $text = document.createTextNode(encodeHTML(stripScripts(message)))\r\n } else {\r\n $text = document.createDocumentFragment()\r\n $text.innerHTML = message\r\n }\r\n $message = createElement(\r\n 'p',\r\n {\r\n className: 'outline-message__content'\r\n },\r\n [$text]\r\n )\r\n children.push($message)\r\n\r\n if (closable) {\r\n $close = icon('close', {\r\n iconSet: 'outline',\r\n size: 18\r\n })\r\n addClass($close, 'outline-message__close')\r\n children.push($close)\r\n }\r\n\r\n $el = createElement(\r\n 'div',\r\n {\r\n className: className.join(' ')\r\n },\r\n children\r\n )\r\n $el.style.cssText = `top:-50px;`\r\n this.$el = $el\r\n document.body.appendChild(this.$el)\r\n\r\n this.$emit('mounted')\r\n\r\n return this\r\n }\r\n\r\n _refreshIcon() {\r\n const HIDDEN = '.outline-message_hidden'\r\n const $el = this.$el\r\n let iconSize = 20\r\n let type\r\n let effect\r\n let round\r\n let iconName\r\n let $icon\r\n let $svg\r\n let $use\r\n\r\n if (this.isDestroyed()) {\r\n return this\r\n }\r\n\r\n $icon = $el.querySelector('.outline-icon')\r\n\r\n if (!$icon) {\r\n return this\r\n }\r\n\r\n type = this.attr('type')\r\n effect = this.attr('effect')\r\n round = this.attr('round')\r\n\r\n if (effect === 'plain') {\r\n addClass($icon, HIDDEN)\r\n } else {\r\n removeClass($icon, HIDDEN)\r\n\r\n if (round && effect === 'default') {\r\n iconSize = 12\r\n }\r\n }\r\n\r\n $svg = $icon.querySelector('.outline-icon__svg')\r\n setAttributes($svg, {\r\n style: `width:${iconSize}px;height:${iconSize}px;`\r\n })\r\n\r\n $use = $svg.querySelector('use')\r\n iconName = effect === 'light' ? `circle-${type}` : type\r\n setAttribute($use, 'xlink:href', `#outline-icon-${iconName}`)\r\n\r\n return this\r\n }\r\n\r\n _refreshMessage() {\r\n const $el = this.$el\r\n let $message\r\n let dangerouslyUseHTMLString\r\n let message\r\n let text\r\n\r\n if (this.isDestroyed()) {\r\n return this\r\n }\r\n\r\n $message = $el.querySelector('.outline-message__content')\r\n dangerouslyUseHTMLString = this.attr('dangerouslyUseHTMLString')\r\n message = this.attr('message')\r\n\r\n if (!dangerouslyUseHTMLString) {\r\n text = encodeHTML(stripScripts(message))\r\n } else {\r\n text = message\r\n }\r\n\r\n $message.innerHTML = text\r\n\r\n return this\r\n }\r\n\r\n _refreshClose() {\r\n const HIDDEN = '.outline-message_hidden'\r\n const $el = this.$el\r\n let $close\r\n let closable\r\n\r\n if (this.isDestroyed()) {\r\n return this\r\n }\r\n\r\n $close = $el.querySelector('.outline-message__close')\r\n closable = this.attr('closable')\r\n\r\n if ($close) {\r\n if (closable) {\r\n addClass($close, HIDDEN)\r\n } else {\r\n removeClass($close, HIDDEN)\r\n }\r\n }\r\n\r\n return this\r\n }\r\n\r\n _refreshEl() {\r\n const $el = this.$el\r\n let className\r\n\r\n if (this.isDestroyed()) {\r\n return this\r\n }\r\n\r\n className = this._getClassName()\r\n setAttribute($el, 'className', className.join(' '))\r\n\r\n return this\r\n }\r\n\r\n refresh(options) {\r\n if (!isPlainObject(options)) {\r\n return this\r\n }\r\n\r\n this.attr(options)\r\n ._refreshIcon()\r\n ._refreshMessage()\r\n ._refreshClose()\r\n ._refreshEl()\r\n\r\n return this\r\n }\r\n\r\n clearTimer() {\r\n if (this.isDestroyed()) {\r\n return this\r\n }\r\n\r\n if (this.timer) {\r\n clearTimeout(this.timer)\r\n this.timer = null\r\n }\r\n\r\n return this\r\n }\r\n\r\n startTimer(duration) {\r\n if (this.isDestroyed()) {\r\n return this\r\n }\r\n\r\n this.timer = later(() => {\r\n this.$emit('opened')\r\n this.close()\r\n }, duration * 1000)\r\n\r\n return this\r\n }\r\n\r\n open(options) {\r\n const $el = this.$el\r\n let offset\r\n let duration\r\n let top\r\n let cssRules\r\n\r\n if (this.isDestroyed()) {\r\n return this\r\n }\r\n\r\n if (this.isClosed()) {\r\n this.refresh(options)\r\n }\r\n\r\n offset = this.attr('offset')\r\n duration = this.attr('duration')\r\n top = offset && offset >= this.offset ? offset : this.offset\r\n cssRules = `top:${top}px;`\r\n\r\n this.clearTimer()\r\n\r\n this.$emit('beforeOpen')\r\n\r\n later(() => {\r\n this.visible = true\r\n\r\n addClass($el, 'outline-message_visible')\r\n $el.style.cssText = cssRules\r\n\r\n if (duration > 0) {\r\n this.startTimer(duration)\r\n }\r\n }, 100)\r\n\r\n return this\r\n }\r\n\r\n close() {\r\n const $el = this.$el\r\n const cssRules = `top:-50px;`\r\n let destroyAfterClosed\r\n let beforeClose\r\n\r\n if (this.isDestroyed()) {\r\n return this\r\n }\r\n\r\n destroyAfterClosed = this.attr('destroyAfterClosed')\r\n beforeClose = this.attr('beforeClose')\r\n\r\n if (isFunction(beforeClose)) {\r\n beforeClose.call(this)\r\n }\r\n\r\n $el.style.cssText = cssRules\r\n removeClass($el, 'outline-message_visible')\r\n\r\n this.visible = false\r\n this.closed = true\r\n\r\n later(() => {\r\n this.$emit('closed')\r\n\r\n if (destroyAfterClosed) {\r\n this.destroy()\r\n }\r\n }, 500)\r\n\r\n return this\r\n }\r\n\r\n destroy() {\r\n this.$emit('beforeDestroy')\r\n\r\n if (this.isDestroyed()) {\r\n return this\r\n }\r\n\r\n this.removeListeners()\r\n\r\n document.body.removeChild(this.$el)\r\n\r\n clearTimeout(this.timer)\r\n this._default()\r\n\r\n this.$emit('afterDestroy')\r\n\r\n return this\r\n }\r\n\r\n onMouseEnter() {\r\n this.clearTimer()\r\n return this\r\n }\r\n\r\n onMouseLeave() {\r\n const duration = this.attr('duration')\r\n const delay = this.attr('delay')\r\n\r\n if (duration <= 0) {\r\n return this\r\n }\r\n\r\n this.startTimer(delay)\r\n\r\n return this\r\n }\r\n\r\n onClose() {\r\n this.clearTimer()\r\n this.close()\r\n return this\r\n }\r\n\r\n addListeners() {\r\n const $el = this.$el\r\n\r\n on(\r\n $el,\r\n '.outline-message__content',\r\n 'mouseenter',\r\n this.onMouseEnter,\r\n this,\r\n true\r\n )\r\n on(\r\n $el,\r\n '.outline-message__content',\r\n 'mouseleave',\r\n this.onMouseLeave,\r\n this,\r\n true\r\n )\r\n on($el, '.outline-message__close', 'click', this.onClose, this, true)\r\n\r\n return this\r\n }\r\n\r\n removeListeners() {\r\n const $el = this.$el\r\n\r\n off($el, 'mouseenter', this.onMouseEnter)\r\n off($el, 'mouseleave', this.onMouseLeave)\r\n off($el, 'click', this.onClose)\r\n\r\n return this\r\n }\r\n}\r\n\r\nMessage.DEFAULTS = (() => {\r\n const OPTIONS = {\r\n id: '',\r\n type: 'info',\r\n effect: 'default',\r\n round: false,\r\n offset: 30,\r\n duration: 3,\r\n delay: 2,\r\n message: '',\r\n customClass: '',\r\n closable: true,\r\n visible: true,\r\n dangerouslyUseHTMLString: false,\r\n destroyAfterClosed: true,\r\n beforeClose: null\r\n }\r\n\r\n return cloneDeep(OPTIONS)\r\n})()\r\n\r\nTYPES.forEach((type) => {\r\n Message[type] = (options) => {\r\n const config = {}\r\n const id = guid(`outline-message-`)\r\n const beforeClose = options.beforeClose || null\r\n let offset = options.offset || 30\r\n\r\n if (isString(options)) {\r\n config.message = options\r\n } else {\r\n if (isPlainObject(options)) {\r\n extend(config, options)\r\n }\r\n }\r\n config.id = id\r\n config.type = type\r\n config.offset = offset\r\n config.visible = false\r\n config.beforeClose = () => {\r\n Message.close(id, beforeClose)\r\n }\r\n\r\n instance = new Message(config)\r\n instances.forEach((item) => {\r\n offset += item.$el.offsetHeight + 16\r\n })\r\n instance.offset = offset\r\n instance.open()\r\n instances.push(instance)\r\n\r\n return instance\r\n }\r\n})\r\n\r\n// 关闭指定 id 消息的静态方法\r\nMessage.close = (id, beforeClose) => {\r\n const len = instances.length\r\n let index = -1\r\n let i\r\n let offsetHeight\r\n\r\n instances.forEach((instance, i) => {\r\n // 在 instances 中通过 id 找到要关闭的消息\r\n if (id === instance.id) {\r\n offsetHeight = instance.$el.offsetHeight\r\n index = i\r\n\r\n // 关闭消息\r\n if (isFunction(beforeClose)) {\r\n beforeClose.call(instance)\r\n }\r\n\r\n instances.splice(i, 1)\r\n }\r\n })\r\n\r\n if (len <= 1 || index === -1 || index > instances.length - 1) {\r\n return false\r\n }\r\n\r\n i = index\r\n\r\n // 界面中的消息逐个向上收起\r\n for (; i < len - 1; i += 1) {\r\n const dom = instances[i].$el\r\n\r\n dom.style['top'] = parseInt(dom.style['top'], 10) - offsetHeight - 16 + 'px'\r\n }\r\n}\r\n\r\n// 关闭所有消息的静态方法\r\nMessage.clear = () => {\r\n let i = instances.length - 1\r\n for (; i >= 0; i -= 1) {\r\n instances[i].close()\r\n }\r\n}\r\n\r\nexport default Message\r\n","import isFunction from './utils/types/isFunction'\r\n\r\nclass Command {\r\n constructor(name, action) {\r\n this.name = name\r\n\r\n if (isFunction(action)) {\r\n this.action = action\r\n }\r\n }\r\n\r\n execute() {\r\n this.action()\r\n\r\n return this\r\n }\r\n}\r\n\r\nexport default Command\r\n","import isFunction from './utils/types/isFunction'\r\n\r\nclass Commands {\r\n constructor() {\r\n this.commands = []\r\n }\r\n\r\n get(name) {\r\n return this.commands.find((cmd) => cmd.name === name)\r\n }\r\n\r\n add(command) {\r\n this.commands.push(command)\r\n\r\n return this\r\n }\r\n\r\n del(name) {\r\n const commands = this.commands\r\n const command = commands.find((cmd) => cmd.name === name)\r\n const index = command ? commands.indexOf(command) : -1\r\n\r\n if (index > -1) {\r\n commands.splice(index, 1)\r\n }\r\n\r\n return this\r\n }\r\n\r\n clear() {\r\n this.commands = []\r\n\r\n return this\r\n }\r\n\r\n execute(name) {\r\n const command = this.commands.find((cmd) => cmd.name === name)\r\n\r\n if (isFunction(command?.execute)) {\r\n command.execute()\r\n }\r\n\r\n return this\r\n }\r\n}\r\n\r\nexport default Commands\r\n","import icon from '../../utils/icons/icon'\r\nimport createElement from '../../utils/dom/createElement'\r\nimport addClass from '../../utils/dom/addClass'\r\n\r\nconst _createButton = (button, rounded = true) => {\r\n const $icon = icon(button.icon, {\r\n iconSet: button.iconSet || 'outline',\r\n color: button.color || '',\r\n size: button.size\r\n })\r\n const $anchor = createElement(\r\n 'a',\r\n {\r\n className: `outline-toolbar__anchor`,\r\n href: button.link\r\n },\r\n $icon\r\n )\r\n const $button = createElement(\r\n 'div',\r\n {\r\n className: `outline-toolbar__button ${button.name}`,\r\n 'data-cmd': button.name\r\n },\r\n [button.link ? $anchor : $icon]\r\n )\r\n\r\n addClass($icon, 'outline-toolbar__icon')\r\n\r\n if (rounded) {\r\n addClass($button, 'outline-toolbar_rounded')\r\n }\r\n\r\n if (button.disabled) {\r\n addClass($button, 'outline-toolbar_disabled')\r\n }\r\n\r\n return $button\r\n}\r\n\r\nexport default _createButton\r\n","import isString from '@/utils/types/isString'\r\nimport isFunction from '@/utils/types/isFunction'\r\nimport isObject from '@/utils/types/isObject'\r\nimport isArray from '@/utils/types/isArray'\r\n\r\nimport later from '@/utils/lang/later'\r\nimport guid from '@/utils/lang/guid'\r\nimport cloneDeep from '@/utils/lang/cloneDeep'\r\n\r\nimport createElement from '@/utils/dom/createElement'\r\nimport addClass from '@/utils/dom/addClass'\r\nimport hasClass from '@/utils/dom/hasClass'\r\nimport removeClass from '@/utils/dom/removeClass'\r\n\r\nimport on from '@/utils/event/on'\r\nimport off from '@/utils/event/off'\r\n\r\nimport paint from '@/utils/icons/paint'\r\n\r\nimport Command from '@/command'\r\nimport Commands from '@/commands'\r\nimport Component from '@/component'\r\n\r\nimport _createButton from './utils/_createButton'\r\n\r\nimport './toolbar.less'\r\n\r\nconst DISABLED = 'outline-toolbar_disabled'\r\nconst HIDDEN = 'outline-toolbar_hidden'\r\nconst ACTIVE = 'outline-toolbar_active'\r\n\r\nclass Toolbar extends Component {\r\n constructor(options) {\r\n super()\r\n\r\n this._default()\r\n\r\n if (options) {\r\n this.initialize(options)\r\n }\r\n }\r\n\r\n _default() {\r\n this.attrs = cloneDeep(Toolbar.DEFAULTS)\r\n\r\n this.disabled = false\r\n this.closed = false\r\n\r\n this.$el = null\r\n this.buttons = []\r\n this.commands = null\r\n\r\n return this\r\n }\r\n\r\n initialize(options) {\r\n let created\r\n\r\n this.attr(options)\r\n\r\n this.disabled = this.attr('disabled')\r\n this.closed = this.attr('closed')\r\n this.commands = new Commands()\r\n\r\n created = this.attr('created')\r\n\r\n if (isFunction(created)) {\r\n created.call(this)\r\n }\r\n\r\n this.render().addListeners()\r\n\r\n return this\r\n }\r\n\r\n isHighlight(name) {\r\n const button = this.get(name)\r\n\r\n if (!button) {\r\n return false\r\n }\r\n\r\n return hasClass(button.$el, ACTIVE)\r\n }\r\n\r\n isDisabled(name) {\r\n let button\r\n\r\n if (name) {\r\n button = this.get(name)\r\n\r\n return button.disabled\r\n }\r\n\r\n return this.disabled\r\n }\r\n\r\n isExist(name) {\r\n const button = this.get(name)\r\n return !!button\r\n }\r\n\r\n isClosed() {\r\n return this.closed\r\n }\r\n\r\n _getCommand(button) {\r\n const _self = this\r\n const { action, name } = button\r\n let command = null\r\n let handler = null\r\n let context\r\n let listener\r\n\r\n if (!action) {\r\n return command\r\n }\r\n\r\n handler = action.handler\r\n context = action.context || this\r\n\r\n if (isFunction(handler)) {\r\n listener = handler\r\n } else if (isString(handler)) {\r\n listener = function () {\r\n _self.$emit(handler, name)\r\n }\r\n }\r\n\r\n if (isFunction(listener)) {\r\n command = new Command(name, listener.bind(context))\r\n }\r\n\r\n return command\r\n }\r\n\r\n get(name) {\r\n return this.buttons.find((button) => button.name === name)\r\n }\r\n\r\n render() {\r\n const mounted = this.attr('mounted')\r\n const buttons = this.attr('buttons') || []\r\n const placement = this.attr('placement')\r\n\r\n paint()\r\n\r\n this.$el = createElement('div', {\r\n id: guid('outline-toolbar'),\r\n className: `outline-toolbar outline-toolbar_${placement}`\r\n })\r\n this._paint(buttons)\r\n document.body.appendChild(this.$el)\r\n\r\n if (this.closed) {\r\n this.hide()\r\n }\r\n\r\n if (this.disabled) {\r\n this.disable()\r\n }\r\n\r\n if (isFunction(mounted)) {\r\n mounted.call(this)\r\n }\r\n\r\n return this\r\n }\r\n\r\n erase() {\r\n this.$el.innerHTML = ''\r\n return this\r\n }\r\n\r\n _paint(buttons) {\r\n const rounded = this.attr('rounded')\r\n const $fragment = document.createDocumentFragment()\r\n\r\n buttons.forEach((button) => {\r\n const $button = _createButton(button, rounded)\r\n const command = this._getCommand(button)\r\n const { name, disabled, context } = button\r\n\r\n $fragment.appendChild($button)\r\n\r\n if (!this.isExist(name)) {\r\n this.buttons.push({\r\n $el: $button,\r\n name,\r\n disabled: disabled || false,\r\n context: context || this\r\n })\r\n\r\n if (command) {\r\n this.commands.add(command)\r\n }\r\n }\r\n })\r\n\r\n this.$el.appendChild($fragment)\r\n\r\n return this\r\n }\r\n\r\n _remove() {\r\n document.body.removeChild(this.$el)\r\n return this\r\n }\r\n\r\n refresh(buttons) {\r\n this.attr({ buttons })\r\n this.erase()._paint(buttons)\r\n return this\r\n }\r\n\r\n add(button) {\r\n const $el = this.$el\r\n const $fragment = document.createDocumentFragment()\r\n const buttons = this.attr('buttons') || []\r\n const { name, disabled, context } = button\r\n const command = this._getCommand(button)\r\n const _add = (button) => {\r\n const $button = _createButton(button)\r\n\r\n $fragment.appendChild($button)\r\n\r\n buttons.push(button)\r\n this.buttons.push({\r\n $el: $button,\r\n name,\r\n disabled: disabled || false,\r\n context: context || this,\r\n command\r\n })\r\n\r\n if (command) {\r\n this.commands.add(command)\r\n }\r\n }\r\n\r\n if (isObject(button)) {\r\n _add(button)\r\n } else if (isArray(button)) {\r\n button.forEach((item) => {\r\n if (isObject(item)) {\r\n _add(item)\r\n }\r\n })\r\n }\r\n $el.appendChild($fragment)\r\n\r\n return this\r\n }\r\n\r\n remove(name) {\r\n const $el = this.$el\r\n const buttons = this.buttons\r\n const button = this.get(name)\r\n let index = -1\r\n\r\n if (!button) {\r\n return this\r\n }\r\n\r\n index = buttons.indexOf(button)\r\n\r\n if (index > -1) {\r\n buttons.splice(index, 1)\r\n this.attr('buttons').splice(index, 1)\r\n }\r\n\r\n this._disable(name)\r\n $el.removeChild(button.$el)\r\n\r\n return this\r\n }\r\n\r\n _disable(name) {\r\n const button = this.get(name)\r\n const command = this.commands.get(name)\r\n\r\n if (!button || button.disabled) {\r\n return this\r\n }\r\n\r\n button.disabled = true\r\n\r\n if (command) {\r\n this.commands.del(command)\r\n }\r\n\r\n addClass(button.$el, DISABLED)\r\n\r\n return this\r\n }\r\n\r\n _enable(name) {\r\n const button = this.get(name)\r\n const command = this.commands.get(name)\r\n\r\n if (!button || !button.disabled) {\r\n return this\r\n }\r\n\r\n button.disabled = false\r\n\r\n if (command) {\r\n this.commands.add(command)\r\n }\r\n\r\n removeClass(button.$el, DISABLED)\r\n\r\n return this\r\n }\r\n\r\n disable(name) {\r\n const disabled = this.attr('afterDisabled')\r\n\r\n if (name) {\r\n this._disable(name)\r\n } else {\r\n addClass(this.$el, DISABLED)\r\n this.removeListeners()\r\n this.disabled = true\r\n\r\n if (isFunction(disabled)) {\r\n disabled.call(this)\r\n }\r\n }\r\n\r\n return this\r\n }\r\n\r\n enable(name) {\r\n const enabled = this.attr('afterEnabled')\r\n\r\n if (name) {\r\n this._enable(name)\r\n } else {\r\n this.disabled = false\r\n removeClass(this.$el, DISABLED)\r\n this.addListeners()\r\n\r\n if (isFunction(enabled)) {\r\n enabled.call(this)\r\n }\r\n }\r\n\r\n return this\r\n }\r\n\r\n show(name) {\r\n const opened = this.attr('afterOpened')\r\n const button = this.get(name)\r\n const $el = this.$el\r\n\r\n if (name) {\r\n if (!button) {\r\n return this\r\n }\r\n\r\n removeClass(button.$el, HIDDEN)\r\n } else {\r\n removeClass($el, HIDDEN)\r\n this.closed = false\r\n\r\n if (isFunction(opened)) {\r\n later(() => {\r\n opened.call(this)\r\n }, 310)\r\n }\r\n }\r\n\r\n return this\r\n }\r\n\r\n hide(name) {\r\n const closed = this.attr('afterClosed')\r\n const button = this.get(name)\r\n const $el = this.$el\r\n\r\n if (name) {\r\n if (!button) {\r\n return this\r\n }\r\n\r\n addClass(button.$el, HIDDEN)\r\n } else {\r\n addClass($el, HIDDEN)\r\n this.closed = true\r\n\r\n if (isFunction(closed)) {\r\n later(() => {\r\n closed.call(this)\r\n }, 310)\r\n }\r\n }\r\n\r\n return this\r\n }\r\n\r\n toggle(name) {\r\n if (this.isClosed()) {\r\n this.show(name)\r\n } else {\r\n this.hide(name)\r\n }\r\n\r\n return this\r\n }\r\n\r\n highlight(name) {\r\n const button = this.get(name)\r\n let $button\r\n\r\n if (!button) {\r\n return this\r\n }\r\n\r\n $button = button.$el\r\n\r\n if (hasClass($button, ACTIVE)) {\r\n removeClass($button, ACTIVE)\r\n } else {\r\n addClass($button, ACTIVE)\r\n }\r\n\r\n return this\r\n }\r\n\r\n destroy() {\r\n const beforeDestroy = this.attr('beforeDestroy')\r\n const afterDestroy = this.attr('afterDestroy')\r\n\r\n if (isFunction(beforeDestroy)) {\r\n beforeDestroy.call(this)\r\n }\r\n\r\n this.commands.clear()\r\n this.removeListeners()._remove()._default()\r\n\r\n if (isFunction(afterDestroy)) {\r\n afterDestroy.call(this)\r\n }\r\n\r\n return this\r\n }\r\n\r\n execute(name) {\r\n if (this.isDisabled(name)) {\r\n return this\r\n }\r\n\r\n this.commands.execute(name)\r\n\r\n return this\r\n }\r\n\r\n onExecute(evt) {\r\n const $button = evt.delegateTarget\r\n let cmd = ''\r\n\r\n if ($button) {\r\n cmd = $button.getAttribute('data-cmd')\r\n\r\n if (cmd) {\r\n this.execute(cmd)\r\n }\r\n }\r\n\r\n return this\r\n }\r\n\r\n _updateToolbar({ top, min, max }) {\r\n const current = Math.ceil(top)\r\n\r\n if (current <= min) {\r\n this.hide('up')\r\n this.show('down')\r\n } else if (current >= max) {\r\n this.hide('down')\r\n this.show('up')\r\n } else if (current > min && current < max) {\r\n this.show('up')\r\n this.show('down')\r\n }\r\n\r\n return this\r\n }\r\n\r\n onToolbarUpdate({ top, min, max }) {\r\n this._updateToolbar({ top, min, max })\r\n return this\r\n }\r\n\r\n onAddButton(buttons) {\r\n this.attr({\r\n buttons\r\n })\r\n this.refresh(buttons)\r\n\r\n return this\r\n }\r\n\r\n onRemoveButton(name) {\r\n this.remove(name)\r\n return this\r\n }\r\n\r\n addListeners() {\r\n const buttons = this.attr('buttons') || []\r\n const $el = this.$el\r\n\r\n if (!buttons || buttons.length < 1) {\r\n return this\r\n }\r\n\r\n on($el, `.outline-toolbar__button`, 'click', this.onExecute, this, true)\r\n\r\n this.$on('toolbar:update', this.onToolbarUpdate)\r\n this.$on('toolbar:add:button', this.onAddButton)\r\n this.$on('toolbar:remove:button', this.onRemoveButton)\r\n this.$on('toolbar:toggle', this.toggle)\r\n\r\n return this\r\n }\r\n\r\n removeListeners() {\r\n const buttons = this.attr('buttons') || []\r\n const $el = this.$el\r\n\r\n if (!buttons || buttons.length < 1) {\r\n return this\r\n }\r\n\r\n off($el, '.outline-toolbar__button', this.onExecute)\r\n\r\n this.$off('toolbar:update')\r\n this.$off('toolbar:add:button')\r\n this.$off('toolbar:remove:button')\r\n this.$off('toolbar:toggle')\r\n\r\n return this\r\n }\r\n}\r\n\r\nToolbar.DEFAULTS = (() => {\r\n const OPTIONS = {\r\n placement: 'ltr',\r\n closed: false,\r\n disabled: false,\r\n rounded: true,\r\n buttons: [],\r\n created: null,\r\n mounted: null,\r\n afterClosed: null,\r\n afterOpened: null,\r\n afterDisabled: null,\r\n afterEnabled: null,\r\n beforeDestroy: null,\r\n afterDestroy: null\r\n }\r\n\r\n return cloneDeep(OPTIONS)\r\n})()\r\n\r\nexport default Toolbar\r\n","import publish from './utils/observer/emit'\r\n\r\nclass Speech {\r\n constructor(options) {\r\n this.utterance = new SpeechSynthesisUtterance()\r\n\r\n if (options) {\r\n this.initialize(options)\r\n }\r\n }\r\n\r\n _initialize(options) {\r\n if (options.lang) {\r\n this.setLang(options.lang)\r\n }\r\n\r\n if (options.pitch) {\r\n this.setPitch(options.pitch)\r\n }\r\n\r\n if (options.rate) {\r\n this.setRate(options.rate)\r\n }\r\n\r\n if (options.text) {\r\n this.setText(options.text)\r\n }\r\n\r\n if (options.voice) {\r\n this.setVoice(options.voice)\r\n }\r\n\r\n if (options.volume) {\r\n this.setVolume(options.volume)\r\n }\r\n\r\n return this\r\n }\r\n\r\n initialize(options) {\r\n this._initialize(options)._addListeners()\r\n return this\r\n }\r\n\r\n isSpeaking() {\r\n return speechSynthesis.speaking\r\n }\r\n\r\n isPending() {\r\n return speechSynthesis.pending\r\n }\r\n\r\n isPaused() {\r\n return speechSynthesis.paused\r\n }\r\n\r\n getVoices() {\r\n return speechSynthesis.getVoices()\r\n }\r\n\r\n setLang(lang) {\r\n this.utterance.lang = lang\r\n return this\r\n }\r\n\r\n setPitch(pitch) {\r\n this.utterance.pitch = pitch\r\n return this\r\n }\r\n\r\n setRate(rate) {\r\n this.utterance.rate = rate\r\n return this\r\n }\r\n\r\n setText(text) {\r\n this.utterance.text = text\r\n return this\r\n }\r\n\r\n setVoice(voice) {\r\n this.utterance.voice = voice\r\n return this\r\n }\r\n\r\n setVolume(volume) {\r\n this.utterance.volume = volume\r\n return this\r\n }\r\n\r\n speak(text) {\r\n if (text) {\r\n this.setText(text)\r\n }\r\n\r\n speechSynthesis.speak(this.utterance)\r\n\r\n return this\r\n }\r\n\r\n pause() {\r\n speechSynthesis.pause()\r\n return this\r\n }\r\n\r\n resume() {\r\n speechSynthesis.resume()\r\n return this\r\n }\r\n\r\n cancel() {\r\n speechSynthesis.cancel()\r\n this.setText('')\r\n return this\r\n }\r\n\r\n _addListeners() {\r\n const UTTERANCE_EVENTS = [\r\n 'boundary',\r\n 'end',\r\n 'error',\r\n 'start',\r\n 'mark',\r\n 'pause',\r\n 'resume'\r\n ]\r\n const utterance = this.utterance\r\n const speech = this\r\n\r\n UTTERANCE_EVENTS.forEach((name) => {\r\n utterance[`on${name}`] = (event) => {\r\n publish(name, {\r\n event,\r\n speech\r\n })\r\n }\r\n })\r\n\r\n speechSynthesis.onvoiceschanged = (event) => {\r\n publish('voiceschanged', {\r\n event,\r\n speech\r\n })\r\n }\r\n\r\n return this\r\n }\r\n}\r\n\r\nSpeech.isSupport = (() => {\r\n return 'speechSynthesis' in window\r\n})()\r\n\r\nexport default Speech\r\n","import addClass from '../../utils/dom/addClass'\r\n\r\nconst _updateSiblingElements = (siblingElement, isPrev) => {\r\n let tagName\r\n let $sibling = siblingElement\r\n\r\n while ($sibling) {\r\n tagName = $sibling.tagName.toLowerCase()\r\n\r\n if (tagName !== 'script' && tagName !== 'style') {\r\n addClass($sibling, 'outline-reader_sibling')\r\n }\r\n\r\n if (isPrev) {\r\n $sibling = $sibling.previousElementSibling\r\n } else {\r\n $sibling = $sibling.nextElementSibling\r\n }\r\n }\r\n}\r\n\r\nexport default _updateSiblingElements\r\n","import cloneDeep from '@/utils/lang/cloneDeep'\r\nimport later from '@/utils/lang/later'\r\nimport isString from '@/utils/types/isString'\r\nimport isElement from '@/utils/types/isElement'\r\nimport isFunction from '@/utils/types/isFunction'\r\nimport createElement from '@/utils/dom/createElement'\r\nimport addClass from '@/utils/dom/addClass'\r\nimport removeClass from '@/utils/dom/removeClass'\r\nimport isMobile from '@/utils/dom/isMobile'\r\n\r\nimport at from '@/utils/event/at'\r\nimport stop from '@/utils/event/stop'\r\nimport off from '@/utils/event/off'\r\n\r\nimport Message from '@/message/message'\r\nimport Toolbar from '@/toolbar/toolbar'\r\n\r\nimport Speech from '@/speech'\r\nimport Component from '@/component'\r\n\r\nimport _updateSiblingElements from './utils/_updateSiblingElements'\r\n\r\nimport './reader.less'\r\n\r\nconst ENTER_READING_TIP = '进入阅读模式,按 ESC 键可退出阅读模式'\r\n\r\nclass Reader extends Component {\r\n constructor(options) {\r\n super()\r\n\r\n this._default()\r\n\r\n if (options) {\r\n this.initialize(options)\r\n }\r\n }\r\n\r\n _default() {\r\n this.attrs = cloneDeep(Reader.DEFAULTS)\r\n this.reading = false\r\n\r\n this.$target = null\r\n this.$el = null\r\n this.$paper = null\r\n this.$title = null\r\n this.$article = null\r\n this.$progress = null\r\n\r\n this.toolbar = null\r\n this.speech = null\r\n\r\n return this\r\n }\r\n\r\n initialize(options) {\r\n let target\r\n\r\n this.attr(options)\r\n\r\n target = this.attr('target')\r\n\r\n if (isString(target)) {\r\n this.$target = document.querySelector(target)\r\n } else if (isElement(target)) {\r\n this.$target = target\r\n }\r\n\r\n if (!this.$target) {\r\n return this\r\n }\r\n\r\n if (Speech.isSupport) {\r\n this.speech = new Speech()\r\n }\r\n\r\n this.render().addListeners()\r\n\r\n return this\r\n }\r\n\r\n isSpeaking() {\r\n return this?.speech?.isSpeaking()\r\n }\r\n\r\n render() {\r\n this._renderEdge()._paint(this.$target)\r\n return this\r\n }\r\n\r\n erase() {\r\n this.$article.innerHTML = ''\r\n return this\r\n }\r\n\r\n _paint($content) {\r\n const $fragment = document.createDocumentFragment()\r\n const $children = [...$content.cloneNode(true).children]\r\n\r\n later(() => {\r\n $children.forEach(($child) => {\r\n $fragment.appendChild($child)\r\n })\r\n\r\n this.$article.appendChild($fragment)\r\n })\r\n\r\n return this\r\n }\r\n\r\n _remove() {\r\n const $el = this.$el\r\n const toolbar = this.toolbar\r\n\r\n if ($el) {\r\n document.body.removeChild($el)\r\n }\r\n\r\n if (toolbar) {\r\n toolbar.destroy()\r\n }\r\n\r\n return this\r\n }\r\n\r\n refresh() {\r\n this.erase()._paint(this.$target)\r\n return this\r\n }\r\n\r\n _animateTimeline() {\r\n // eslint-disable-next-line\r\n if (!window.ScrollTimeline || !isMobile()) {\r\n return this\r\n }\r\n\r\n this.$progress.animate(\r\n {\r\n // from\r\n scale: ['0 1', '1 1']\r\n },\r\n {\r\n // eslint-disable-next-line\r\n timeline: new ScrollTimeline({\r\n source: this.$article,\r\n axis: 'block'\r\n })\r\n }\r\n )\r\n\r\n return this\r\n }\r\n\r\n _renderEdge() {\r\n const $target = this.$target\r\n const mobile = isMobile()\r\n const size = mobile ? 26 : 20\r\n let title = this.attr('title')\r\n let $el\r\n let $paper\r\n let $title\r\n let $article\r\n let $progress\r\n let $sibling\r\n\r\n $progress = createElement('div', {\r\n className: 'outline-reader__progress'\r\n })\r\n this.$progress = $progress\r\n\r\n $title = $target.querySelector('h1')\r\n\r\n if (isElement(title)) {\r\n $title = title\r\n }\r\n\r\n if (isElement($title)) {\r\n title = $title.innerText\r\n }\r\n\r\n $title = createElement(\r\n 'h1',\r\n {\r\n className: 'outline-reader__title'\r\n },\r\n title\r\n )\r\n this.$title = $title\r\n\r\n $article = createElement(\r\n 'article',\r\n {\r\n id: 'outline-reader__article',\r\n className: 'outline-reader__article'\r\n },\r\n isMobile() ? [] : [$progress.cloneNode()]\r\n )\r\n this.$article = $article\r\n\r\n $paper = createElement(\r\n 'div',\r\n {\r\n id: 'outline-reader__paper',\r\n className: 'outline-reader__paper'\r\n },\r\n [$title, $article]\r\n )\r\n this.$paper = $paper\r\n\r\n const buttons = []\r\n\r\n buttons.push({\r\n name: 'print',\r\n icon: 'print',\r\n size,\r\n action: {\r\n context: this,\r\n handler: this.print\r\n }\r\n })\r\n\r\n if (Speech.isSupport && this.attr('allowSpeak')) {\r\n buttons.push({\r\n name: 'speak',\r\n icon: 'sound',\r\n size,\r\n action: {\r\n context: this,\r\n handler: this.speak\r\n }\r\n })\r\n }\r\n\r\n buttons.push({\r\n name: 'exit',\r\n icon: 'close',\r\n size,\r\n action: {\r\n context: this,\r\n handler: this.exit\r\n }\r\n })\r\n\r\n this.toolbar = new Toolbar({\r\n placement: 'rtl',\r\n buttons\r\n })\r\n\r\n $el = createElement(\r\n 'section',\r\n {\r\n id: 'outline-reader',\r\n className: 'outline-reader outline-reader_hidden'\r\n },\r\n [$progress, $paper, this.toolbar.$el]\r\n )\r\n this.$el = $el\r\n\r\n document.body.appendChild($el)\r\n\r\n this._animateTimeline()\r\n\r\n later(() => {\r\n // 设置邻居节点的打印样式\r\n $sibling = $el.previousElementSibling\r\n _updateSiblingElements($sibling, true)\r\n\r\n $sibling = $el.nextElementSibling\r\n _updateSiblingElements($sibling)\r\n })\r\n\r\n return this\r\n }\r\n\r\n enter() {\r\n const READER = 'outline-reader'\r\n const READING = `${READER}--reading`\r\n const HIDDEN = `${READER}_hidden`\r\n const $el = this.$el\r\n const $siblings = document.querySelectorAll('.outline-reader_sibling')\r\n const enterReadingTip = this.attr('enterReadingTip') || ENTER_READING_TIP\r\n\r\n if (this.reading || !$el) {\r\n return this\r\n }\r\n\r\n $siblings.forEach(($sibling) => {\r\n addClass($sibling, HIDDEN)\r\n })\r\n addClass($el, READING)\r\n removeClass($el, HIDDEN)\r\n this.toolbar.show()\r\n this.reading = true\r\n\r\n Message.info({\r\n round: true,\r\n message: enterReadingTip\r\n })\r\n\r\n this.$emit('reader:enter')\r\n\r\n return this\r\n }\r\n\r\n exit() {\r\n const SPEAK = 'speak'\r\n const READER = 'outline-reader'\r\n const READING = `${READER}--reading`\r\n const HIDDEN = `${READER}_hidden`\r\n const $el = this.$el\r\n const $siblings = document.querySelectorAll('.outline-reader_sibling')\r\n const speech = this.speech\r\n const toolbar = this.toolbar\r\n\r\n if (!this.reading || !$el) {\r\n return this\r\n }\r\n\r\n addClass($el, HIDDEN)\r\n removeClass($el, READING)\r\n $siblings.forEach(($sibling) => {\r\n removeClass($sibling, HIDDEN)\r\n })\r\n toolbar.hide()\r\n this.reading = false\r\n\r\n if (speech) {\r\n if (toolbar.isHighlight(SPEAK)) {\r\n toolbar.highlight(SPEAK)\r\n }\r\n\r\n speech.cancel()\r\n }\r\n\r\n this.$emit('reader:exit')\r\n\r\n return this\r\n }\r\n\r\n toggle() {\r\n if (this.reading) {\r\n this.exit()\r\n } else {\r\n this.enter()\r\n }\r\n\r\n return this\r\n }\r\n\r\n speak() {\r\n const text = this.$article.innerText\r\n const speech = this.speech\r\n\r\n if (!Speech.isSupport || !speech) {\r\n return this\r\n }\r\n\r\n this.toolbar.highlight('speak')\r\n\r\n if (this.isSpeaking()) {\r\n speech.cancel()\r\n } else {\r\n speech.speak(text)\r\n }\r\n\r\n return this\r\n }\r\n\r\n print() {\r\n if (!isFunction(print)) {\r\n return this\r\n }\r\n\r\n print()\r\n\r\n return this\r\n }\r\n\r\n destroy() {\r\n const $el = this.$el\r\n\r\n if (!$el) {\r\n return this\r\n }\r\n\r\n this.removeListeners()._remove()._default()\r\n\r\n return this\r\n }\r\n\r\n onPrint() {\r\n this.print()\r\n return this\r\n }\r\n\r\n onEnterReading() {\r\n this.toggle()\r\n return this\r\n }\r\n\r\n onExitReading(evt) {\r\n const keyCode = evt.keyCode\r\n\r\n if (keyCode === 27 && this.reading) {\r\n this.toggle()\r\n stop(evt)\r\n }\r\n\r\n return this\r\n }\r\n\r\n onRefresh() {\r\n this.refresh()\r\n\r\n return this\r\n }\r\n\r\n addListeners() {\r\n const $el = this.$el\r\n\r\n if (!$el) {\r\n return this\r\n }\r\n\r\n at(document, 'keyup', this.onExitReading, this, true)\r\n\r\n this.$on('toolbar:action:print', this.onPrint)\r\n this.$on('toolbar:action:reading', this.onEnterReading)\r\n this.$on('reader:print', this.onPrint)\r\n this.$on('reader:refresh', this.onRefresh)\r\n this.$on('reader:enter', this.enter)\r\n this.$on('reader:exit', this.exit)\r\n this.$on('reader:toggle', this.toggle)\r\n\r\n return this\r\n }\r\n\r\n removeListeners() {\r\n const $el = this.$el\r\n\r\n if (!$el) {\r\n return this\r\n }\r\n\r\n off(document, 'keyup', this.onExitReading)\r\n\r\n this.$off('toolbar:action:print')\r\n this.$off('toolbar:action:reading')\r\n this.$off('reader:refresh')\r\n this.$off('reader:toggle')\r\n\r\n return this\r\n }\r\n}\r\n\r\nReader.DEFAULTS = (() => {\r\n const OPTIONS = {\r\n target: '',\r\n title: '',\r\n enterReadingTip: ENTER_READING_TIP,\r\n allowSpeak: false\r\n }\r\n\r\n return cloneDeep(OPTIONS)\r\n})()\r\n\r\nexport default Reader\r\n","import later from './utils/lang/later'\r\nimport cloneDeep from './utils/lang/cloneDeep'\r\n\r\nimport isFunction from './utils/types/isFunction'\r\nimport isString from './utils/types/isString'\r\nimport isElement from './utils/types/isElement'\r\n\r\nimport addClass from './utils/dom/addClass'\r\nimport scrollTo from './utils/dom/scrollTo'\r\nimport getScrollElement from './utils/dom/getScrollElement'\r\n\r\nimport getChapters from './chapters/getChapters'\r\n\r\nimport Component from './component'\r\nimport Anchors from './anchors/anchors'\r\nimport Drawer from './drawer/drawer'\r\nimport Navigator from './navigator/navigator'\r\nimport Reader from './reader/reader'\r\nimport Toolbar from './toolbar/toolbar'\r\n\r\nclass Outline extends Component {\r\n constructor(options) {\r\n super()\r\n\r\n this.version = '3.39.0'\r\n this._default()\r\n\r\n if (options) {\r\n this.initialize(options)\r\n }\r\n }\r\n\r\n _default() {\r\n const options = Outline.DEFAULTS\r\n\r\n this.attrs = cloneDeep(options)\r\n this.$article = null\r\n this.$scrollElement = null\r\n this.buttons = []\r\n\r\n this.anchors = null\r\n this.drawer = null\r\n this.navigator = null\r\n this.reader = null\r\n this.toolbar = null\r\n\r\n return this\r\n }\r\n\r\n initialize(options) {\r\n let articleElement = ''\r\n let scrollElement = ''\r\n let $article = null\r\n\r\n this.attr(options)\r\n\r\n articleElement = this.attr('articleElement')\r\n scrollElement = this.attr('scrollElement')\r\n\r\n if (isString(articleElement)) {\r\n $article = document.querySelector(articleElement)\r\n } else if (isElement(articleElement)) {\r\n $article = articleElement\r\n }\r\n this.$article = $article\r\n this.$scrollElement = getScrollElement(scrollElement)\r\n\r\n this.$emit('created', { ...this.attr() })\r\n this.render().addListeners()\r\n\r\n return this\r\n }\r\n\r\n isExpanded() {\r\n const position = this.attr('position')\r\n const drawer = this.drawer\r\n const navigator = this.navigator\r\n const count = this.count()\r\n\r\n if (count < 0) {\r\n return false\r\n }\r\n\r\n if (position === 'relative') {\r\n return !drawer.isClosed()\r\n } else {\r\n return !navigator.isClosed()\r\n }\r\n }\r\n\r\n getChapters(isTreeStructured = false) {\r\n const articleElement = this.$article\r\n const selector = this.attr('selector')\r\n const showCode = this.attr('showCode')\r\n const chapterTextFilter = this.attr('chapterTextFilter')\r\n\r\n return getChapters({\r\n articleElement,\r\n selector,\r\n showCode,\r\n chapterTextFilter,\r\n isTreeStructured\r\n })\r\n }\r\n\r\n count() {\r\n return this.getChapters().length\r\n }\r\n\r\n render() {\r\n const hasToolbar = this.attr('hasToolbar')\r\n const $scrollElement = this.$scrollElement\r\n\r\n this._renderReader()._renderAnchors()._renderNavigator()._renderToolbar()\r\n\r\n if ($scrollElement && hasToolbar) {\r\n this.$emit('toolbar:update', {\r\n top: $scrollElement.scrollTop,\r\n min: 0,\r\n max: $scrollElement.scrollHeight\r\n })\r\n }\r\n\r\n this.$emit('mounted')\r\n\r\n return this\r\n }\r\n\r\n _renderReader() {\r\n const option = this.attr('reader')\r\n\r\n if (!option.target) {\r\n return this\r\n }\r\n\r\n addClass(this.$article, 'outline-article')\r\n\r\n this.reader = new Reader(option)\r\n\r\n return this\r\n }\r\n\r\n _renderAnchors() {\r\n const articleElement = this.attr('articleElement')\r\n const selector = this.attr('selector')\r\n const stickyHeight = this.attr('stickyHeight')\r\n const scrollElement = this.attr('scrollElement')\r\n const showCode = this.attr('showCode')\r\n const anchorURL = this.attr('anchorURL')\r\n const afterScroll = this.attr('afterScroll')\r\n const chapterTextFilter = this.attr('chapterTextFilter')\r\n const anchorLinkFilter = this.attr('anchorLinkFilter')\r\n\r\n this.anchors = new Anchors({\r\n articleElement,\r\n stickyHeight,\r\n scrollElement,\r\n selector,\r\n showCode,\r\n anchorURL,\r\n afterScroll,\r\n chapterTextFilter,\r\n anchorLinkFilter\r\n })\r\n\r\n return this\r\n }\r\n\r\n _renderNavigator() {\r\n const title = this.attr('title')\r\n const stickyHeight = this.attr('stickyHeight')\r\n const scrollElement = this.attr('scrollElement')\r\n const customClass = this.attr('customClass')\r\n const showCode = this.attr('showCode')\r\n const animationCurrent = this.attr('animationCurrent')\r\n const closeOnClickModal = this.attr('closeOnClickModal')\r\n const showNavModalFirst = this.attr('showNavModalFirst')\r\n const position = this.attr('position')\r\n const placement = this.attr('placement')\r\n const afterSticky = this.attr('afterSticky')\r\n const afterToggle = this.attr('afterToggle')\r\n const afterScroll = this.attr('afterScroll')\r\n const count = this.count()\r\n let parentElement = this.attr('parentElement')\r\n let OPTIONS\r\n\r\n if (count < 1) {\r\n return this\r\n }\r\n\r\n OPTIONS = {\r\n scrollElement,\r\n showCode,\r\n animationCurrent,\r\n position,\r\n title,\r\n stickyHeight,\r\n chapters: this.getChapters(),\r\n afterSticky,\r\n afterToggle,\r\n afterScroll\r\n }\r\n\r\n if (position === 'relative') {\r\n this.drawer = new Drawer({\r\n placement,\r\n title,\r\n size: 'tiny',\r\n hasOffset: true,\r\n hasPadding: false,\r\n closeOnClickModal,\r\n customClass,\r\n afterClosed: () => {\r\n const toolbar = this.toolbar\r\n toolbar.toggle()\r\n }\r\n })\r\n parentElement = this.drawer.$main\r\n\r\n if (showNavModalFirst) {\r\n this.drawer.open()\r\n }\r\n } else {\r\n OPTIONS.customClass = customClass\r\n }\r\n\r\n OPTIONS.parentElement = parentElement\r\n this.navigator = new Navigator(OPTIONS)\r\n\r\n return this\r\n }\r\n\r\n _renderToolbar() {\r\n const position = this.attr('position')\r\n const hasToolbar = this.attr('hasToolbar')\r\n const showNavModalFirst = this.attr('showNavModalFirst')\r\n const placement = this.attr('placement')\r\n const homepage = this.attr('homepage')\r\n const git = this.attr('git')\r\n const tags = this.attr('tags')\r\n const issues = this.attr('issues')\r\n const tools = this.attr('tools')\r\n const option = this.attr('reader')\r\n const count = this.count()\r\n const UP = {\r\n name: 'up',\r\n icon: 'up',\r\n size: 20,\r\n action: {\r\n context: this,\r\n handler: this.toTop\r\n }\r\n }\r\n const HOME = {\r\n name: 'homepage',\r\n icon: 'homepage',\r\n size: 20,\r\n link: homepage\r\n }\r\n const GIT = {\r\n name: 'github',\r\n icon: 'github',\r\n size: 20,\r\n link: git\r\n }\r\n const TAGS = {\r\n name: 'tags',\r\n icon: 'tags',\r\n size: 20,\r\n link: tags\r\n }\r\n const ISSUES = {\r\n name: 'issues',\r\n icon: 'issues',\r\n size: 20,\r\n link: issues\r\n }\r\n const MENU = {\r\n name: 'toggle',\r\n icon: 'menu',\r\n size: 18,\r\n action: {\r\n context: this,\r\n handler: this.toggle\r\n }\r\n }\r\n const READING = {\r\n name: 'reading',\r\n icon: 'file',\r\n size: 18,\r\n action: {\r\n context: this,\r\n handler: 'toolbar:action:reading'\r\n }\r\n }\r\n const PRINT = {\r\n name: 'print',\r\n icon: 'print',\r\n size: 20,\r\n action: {\r\n handler: 'toolbar:action:print'\r\n }\r\n }\r\n const DOWN = {\r\n name: 'down',\r\n icon: 'down',\r\n size: 20,\r\n action: {\r\n context: this,\r\n handler: this.toBottom\r\n }\r\n }\r\n const buttons = []\r\n\r\n if (!hasToolbar) {\r\n return this\r\n }\r\n\r\n buttons.push(UP)\r\n if (count > 0) {\r\n buttons.push(MENU)\r\n }\r\n if (homepage) {\r\n buttons.push(HOME)\r\n }\r\n if (git) {\r\n buttons.push(GIT)\r\n }\r\n if (tags) {\r\n buttons.push(TAGS)\r\n }\r\n if (issues) {\r\n buttons.push(ISSUES)\r\n }\r\n if (option.target) {\r\n buttons.push(READING)\r\n if (isFunction(print)) {\r\n buttons.push(PRINT)\r\n }\r\n }\r\n if (tools?.length > 0) {\r\n buttons.push(...tools)\r\n }\r\n buttons.push(DOWN)\r\n this.buttons = [...buttons]\r\n\r\n this.toolbar = new Toolbar({\r\n placement,\r\n buttons\r\n })\r\n\r\n if (position === 'relative' && showNavModalFirst) {\r\n this.toolbar.hide()\r\n }\r\n\r\n return this\r\n }\r\n\r\n refresh() {\r\n const chapters = this.getChapters()\r\n\r\n this.$emit('anchors:refresh', chapters)\r\n this.$emit('navigator:refresh', chapters)\r\n this.$emit('reader:refresh')\r\n\r\n this.$emit('refresh', chapters)\r\n\r\n return this\r\n }\r\n\r\n addButton(button) {\r\n const buttons = this.buttons\r\n\r\n buttons.splice(-1, 0, button)\r\n this.$emit('toolbar:add:button', buttons)\r\n\r\n return this\r\n }\r\n\r\n removeButton(name) {\r\n this.$emit('toolbar:remove:button', name)\r\n return this\r\n }\r\n\r\n toTop() {\r\n const afterScroll = this.attr('afterScroll')\r\n const toolbar = this.toolbar\r\n const navigator = this.navigator\r\n const count = this.count()\r\n const afterTop = () => {\r\n toolbar.hide('up')\r\n toolbar.show('down')\r\n\r\n if (count > 0) {\r\n navigator.highlight(0)\r\n navigator.playing = false\r\n scrollTo(navigator.$main, 0)\r\n }\r\n\r\n if (isFunction(afterScroll)) {\r\n afterScroll.call(toolbar, 'up')\r\n }\r\n }\r\n\r\n if (count > 0) {\r\n navigator.playing = true\r\n }\r\n this.scrollTo(0, afterTop)\r\n\r\n return this\r\n }\r\n\r\n toBottom() {\r\n const afterScroll = this.attr('afterScroll')\r\n const $scrollElement = this.$scrollElement\r\n const toolbar = this.toolbar\r\n const navigator = this.navigator\r\n const count = this.count()\r\n const top = Math.floor(\r\n $scrollElement.scrollHeight - $scrollElement.clientHeight\r\n )\r\n const afterDown = () => {\r\n const $main = navigator.$main\r\n toolbar.hide('down')\r\n toolbar.show('up')\r\n\r\n if (count > 0) {\r\n navigator.highlight(count - 1)\r\n scrollTo($main, $main.scrollHeight)\r\n navigator.playing = false\r\n }\r\n\r\n if (isFunction(afterScroll)) {\r\n afterScroll.call(toolbar, 'bottom')\r\n }\r\n }\r\n\r\n if (count > 0) {\r\n navigator.playing = true\r\n }\r\n\r\n this.scrollTo(top, afterDown)\r\n\r\n return this\r\n }\r\n\r\n scrollTo(top, afterScroll) {\r\n scrollTo(this.$scrollElement, top, afterScroll)\r\n return this\r\n }\r\n\r\n enterReading() {\r\n this.$emit('toolbar:toggle')\r\n this.$emit('reader:enter')\r\n\r\n return this\r\n }\r\n\r\n exitReading() {\r\n this.$emit('toolbar:toggle')\r\n this.$emit('reader:exit')\r\n\r\n return this\r\n }\r\n\r\n switchReading() {\r\n this.$emit('toolbar:toggle')\r\n this.$emit('reader:toggle')\r\n\r\n return this\r\n }\r\n\r\n expand() {\r\n const position = this.attr('position')\r\n const toolbar = this.toolbar\r\n const drawer = this.drawer\r\n const navigator = this.navigator\r\n const count = this.count()\r\n\r\n if (count < 1) {\r\n return this\r\n }\r\n\r\n if (position !== 'relative') {\r\n navigator.show()\r\n toolbar.highlight('toggle')\r\n } else {\r\n toolbar.hide()\r\n\r\n later(() => {\r\n drawer.open()\r\n })\r\n }\r\n\r\n return this\r\n }\r\n\r\n collapses() {\r\n const position = this.attr('position')\r\n const toolbar = this.toolbar\r\n const drawer = this.drawer\r\n const navigator = this.navigator\r\n const count = this.count()\r\n\r\n if (count < 1) {\r\n return this\r\n }\r\n\r\n if (position !== 'relative') {\r\n navigator.hide()\r\n toolbar.highlight('toggle')\r\n } else {\r\n toolbar.show()\r\n\r\n later(() => {\r\n drawer.close()\r\n })\r\n }\r\n\r\n return this\r\n }\r\n\r\n toggle() {\r\n if (this.isExpanded()) {\r\n this.collapses()\r\n } else {\r\n this.expand()\r\n }\r\n\r\n return this\r\n }\r\n\r\n print() {\r\n this.$emit('reader:print')\r\n\r\n return this\r\n }\r\n\r\n _destroy() {\r\n const count = this.count()\r\n let anchors = this.anchors\r\n let navigator = this.navigator\r\n let drawer = this.drawer\r\n let reader = this.reader\r\n let toolbar = this.toolbar\r\n let isOutside = false\r\n\r\n this.removeListeners()\r\n\r\n if (reader) {\r\n reader.destroy()\r\n }\r\n\r\n if (count > 0 && navigator) {\r\n isOutside = navigator.isOutside()\r\n\r\n navigator.destroy()\r\n\r\n if (isOutside && drawer) {\r\n drawer.destroy()\r\n }\r\n }\r\n\r\n if (anchors) {\r\n anchors.destroy()\r\n }\r\n\r\n if (toolbar) {\r\n toolbar.destroy()\r\n }\r\n\r\n return this\r\n }\r\n\r\n destroy() {\r\n this.$emit('beforeDestroy')\r\n\r\n this._destroy()._default()\r\n\r\n this.$emit('destroyed')\r\n\r\n return this\r\n }\r\n\r\n addListeners() {\r\n const hasToolbar = this.attr('hasToolbar')\r\n\r\n if (!hasToolbar) {\r\n return this\r\n }\r\n\r\n this.$on('toolbar:update', this.onToolbarUpdate)\r\n\r\n return this\r\n }\r\n\r\n removeListeners() {\r\n const hasToolbar = this.attr('hasToolbar')\r\n\r\n if (!hasToolbar) {\r\n return this\r\n }\r\n\r\n this.$off('toolbar:update')\r\n\r\n return this\r\n }\r\n}\r\n\r\nOutline.DEFAULTS = (() => {\r\n const OPTIONS = {\r\n articleElement: '#article',\r\n selector: 'h2,h3,h4,h5,h6',\r\n parentElement: '#aside',\r\n scrollElement: 'html,body',\r\n title: '目录',\r\n position: 'relative',\r\n placement: 'rtl',\r\n animationCurrent: true,\r\n showCode: false,\r\n hasToolbar: true,\r\n closeOnClickModal: true,\r\n showNavModalFirst: false,\r\n anchorURL: '',\r\n stickyHeight: 0,\r\n homepage: '',\r\n git: '',\r\n tags: '',\r\n issues: '',\r\n tools: [],\r\n reader: {\r\n target: '',\r\n title: '',\r\n enterReadingTip: '进入阅读模式,按 ESC 键可退出阅读模式',\r\n allowSpeak: false\r\n },\r\n customClass: '',\r\n afterSticky: null,\r\n afterToggle: null,\r\n afterScroll: null,\r\n chapterTextFilter: null,\r\n anchorLinkFilter: null\r\n }\r\n\r\n return cloneDeep(OPTIONS)\r\n})()\r\n\r\nif (window?.jQuery) {\r\n const $ = window.jQuery\r\n\r\n // 将 Outline 扩展为一个 jquery 插件\r\n // eslint-disable-next-line no-undef\r\n $.extend($.fn, {\r\n outline: function (options) {\r\n // eslint-disable-next-line no-undef\r\n let $article = $(this)\r\n\r\n return new Outline(\r\n // eslint-disable-next-line no-undef\r\n $.extend({}, options, {\r\n articleElement: $article\r\n })\r\n )\r\n }\r\n })\r\n}\r\n\r\nexport default Outline\r\n","/**\r\n * 函数防抖:当持续触发事件时,一定时间段内没有再触发事件,事件处理函数才会执行一次,如果设\r\n * 定的时间到来之前,又一次触发了事件,就重新开始延时。\r\n * ========================================================================\r\n * @method debounce\r\n * @param {Function} fn - 要采用防抖技术执行的函数\r\n * @param {Number} ms - 等待时间(单位:毫秒)\r\n * @returns {Function}\r\n *\r\n * @example\r\n * window.addEventListener(\r\n * 'resize',\r\n * debounce(() => {\r\n * console.log(window.innerWidth);\r\n * console.log(window.innerHeight);\r\n * }, 250)\r\n * );\r\n * // => Will log the window dimensions at most every 250ms\r\n */\r\nconst debounce = (fn, ms = 300) => {\r\n let timer\r\n\r\n return function (...args) {\r\n if (timer) {\r\n clearTimeout(timer)\r\n }\r\n\r\n timer = setTimeout(() => {\r\n fn.apply(this, args)\r\n }, ms)\r\n }\r\n}\r\n\r\nexport default debounce\r\n","/**\r\n * ========================================================================\r\n * @method getViewportWidth\r\n * @return {Number}\r\n */\r\nconst getViewportWidth = () => {\r\n return Math.max(document.documentElement.clientWidth, window.innerWidth)\r\n}\r\n\r\nexport default getViewportWidth\r\n","import Outline from '../../outline'\r\nimport observeResize from './observeResize'\r\nimport getViewportWidth from './getViewportWidth'\r\n\r\nconst defaults = Outline.DEFAULTS\r\n\r\ndefaults.articleElement = document.querySelector('#article')\r\ndefaults.parentElement = document.querySelector('#aside')\r\ndefaults.scrollElement = document.querySelector('#main')\r\ndefaults.selector = 'h2,h3'\r\ndefaults.title = false\r\ndefaults.showCode = false\r\ndefaults.position = 'sticky'\r\ndefaults.git = 'https://github.com/yaohaixiao/outline.js'\r\ndefaults.tags = 'https://github.com/yaohaixiao/outline.js/tags'\r\ndefaults.issues = 'https://github.com/yaohaixiao/outline.js/issues'\r\ndefaults.reader = {\r\n target: '#article',\r\n title: document.querySelector('.main__h1'),\r\n allowSpeak: true\r\n}\r\ndefaults.chapterTextFilter = true\r\ndefaults.anchorLinkFilter = (tag, title, id) => {\r\n return `${tag}-${title}-${id}`\r\n}\r\ndefaults.customClass = 'aside-navigator'\r\ndefaults.afterScroll = (type) => {\r\n const viewportWidth = getViewportWidth()\r\n if (viewportWidth <= 500 && type === 'chapter') {\r\n outline.toggle()\r\n }\r\n}\r\n\r\nconst outline = new Outline(defaults)\r\n\r\nobserveResize(document.querySelector('#docs'), () => {\r\n const viewportWidth = getViewportWidth()\r\n if (viewportWidth <= 500 && outline.isExpanded()) {\r\n outline.toggle()\r\n }\r\n})\r\n\r\nexport default outline\r\n","import debounce from './debounce'\r\nimport isFunction from '@/utils/types/isFunction'\r\nimport isElement from '@/utils/types/isElement'\r\n\r\n/**\r\n * 通用的 ResizeObserver 观察者处理器\r\n * ========================================================================\r\n * @method observeResize\r\n * @since 1.8.0\r\n * @see https://developer.mozilla.org/en-US/docs/Web/API/ResizeObserver\r\n * @see https://developer.mozilla.org/zh-CN/docs/Web/API/ResizeObserverEntry/contentBoxSize\r\n * @see https://developer.mozilla.org/zh-CN/docs/Web/CSS/writing-mode\r\n * @param {HTMLElement} el\r\n * @param {Function} callback\r\n * @param {Number} [delay]\r\n * @return {ResizeObserver|boolean}\r\n */\r\nconst observeResize = (el, callback, delay = 300) => {\r\n let observer\r\n let fn\r\n\r\n if (!isElement(el) || !isFunction(callback)) {\r\n return false\r\n }\r\n\r\n fn = debounce(callback, delay)\r\n observer = new ResizeObserver((entries) => {\r\n for (const entry of entries) {\r\n fn(entry)\r\n }\r\n })\r\n\r\n observer.observe(el)\r\n\r\n return observer\r\n}\r\n\r\nexport default observeResize\r\n"],"names":["toString","val","Object","prototype","apply","isFunction","later","fn","delay","setTimeout","isObject","o","isArray","Array","cloneDeep","obj","clone","from","assign","keys","forEach","key","isString","str","isElement","nodeName","tagName","nodeType","hasClass","el","className","pattern","RegExp","allClass","classList","contains","exec","addClass","_classList","add","indexOf","split","name","length","easeInQuad","x","scrollTo","scrollElement","top","afterStop","$scrollElement","_getScrollElement","$rootElements","document","querySelector","querySelectorAll","scrollTop","step","distance","MAX_HEIGHT","scrollHeight","MAX_TOP","stop","play","requestAnimationFrame","getScrollElement","trim","replace","getChaptersByHeadings","headings","showCode","chapterTextFilter","chapters","previous","level","text","heading","i","headingLevel","current","parseInt","pid","_getChapterParentIdByDiffer","differ","index","innerHTML","push","id","rel","groups","group","JSON","stringify","cb","code","String","c","subjects","_getChaptersWithCode","getChapters","options","articleElement","selector","isTreeStructured","$article","$headings","filter","_maybeArrayLike","_toConsumableArray","toTree","list","nodeKey","parentKey","map","roots","item","children","node","hasOwn","prop","hasOwnProperty","call","extend","origin","source","_subscribers","_hasDirectSubscribersFor","topic","has","isDirect","found","position","lastIndexOf","substring","_hasSubscribers","emit","data","async","execute","subscriber","message","callback","context","deliver","guid","uuid","prefix","_removeSubscriber","off","token","subject","execution","j","splice","_removeSubscriberByToken","Component","constructor","this","attrs","initialize","attr","render","addListeners","value","arguments","refresh","destroy","removeListeners","reload","$emit","event","publish","$on","on","handler","subscribe","$off","unsubscribe","queue","isHandling","done","runIdle","idleDeadline","timeRemaining","shift","requestIdleCallback","window","start","Date","now","didTimeout","Math","max","cancelIdleCallback","clearTimeout","timeSlice","afterComplete","offsetTop","offsetParent","matches","sel","msMatchesSelector","getParentOrHost","host","parentNode","CAPTURE_EVENTS","_off","type","capture","_delegateListener","listeners","_listeners","listener","_delete","removeEventListener","purgeElement","recurse","$element","$children","childNodes","getListeners","$child","once","evt","target","getTarget","delegateTarget","closest","ctx","includeCTX","startsWith","overrideContext","addEventListener","stopPropagation","preventDefault","SYMBOLS","getSymbols","iconSet","getSymbol","patternName","patternSet","find","symbol","fullName","paint","$body","body","$icons","symbols","join","createElement","insertBefore","firstChild","isDOM","isHTMLCollection","fragment","isTextNode","setAttribute","toLowerCase","style","cssText","innerText","setAttributes","$fragment","createDocumentFragment","$el","isValidChild","child","append","createTextNode","appendChild","every","ICON","size","color","width","height","defaultRules","cssRules","$icon","$svg","binds","svg","test","isSVG","xmlns","class","icon","removeClass","remove","_removeHeading","$heading","hasAnchor","isAtStart","CLS_HEADING","$anchor","removeAttribute","removeChild","styleInject","css","ref","insertAt","head","getElementsByTagName","styleSheet","Anchors","super","_default","DEFAULTS","$articleElement","created","getHeadings","count","mounted","_paint","erase","_remove","LIMIT","anchorURL","anchorLinkFilter","update","chapterCode","_updateHeading","headingId","url","href","groupIndex","after","beforeDestroy","afterDestroy","onAnchorTrigger","afterScroll","stickyHeight","clientHeight","min","onRefresh","TAGS","isHTML","html","basic","full","slice","tag","stripScripts","setProperty","documentElement","zIndex","idx","Drawer","title","closed","$modal","$header","$title","$close","$main","$footer","$overlay","setTitle","isClosed","placement","hasClose","hasOverlay","hasOffset","hasPadding","autoHeight","overflow","customClass","mainClassName","content","$content","strHTML","template","open","opened","close","toggle","afterToggle","onClose","closeOnClickModal","afterClosed","afterOpened","at","getStyle","ruleName","getComputedStyle","HIDDEN","EXPANDED","FOLDED","Navigator","scrollTimer","resizeTimer","observerTimer","Observer","$list","$placeholder","$parentElement","$active","active","offsetWidth","playing","parentElement","$parent","isSticky","isFixed","isInside","isOutside","_paintEdge","animationCurrent","contents","calculateStickyHeight","highlight","sticky","onObserver","_paintChapters","clones","parts","byId","chapter","$text","$link","$code","$li","$subject","$chapter","_getPlaceholderOffset","mainPaddingTop","mainBorderTop","placeholderPaddingTop","placeholderMarginTop","placeholderBorderTop","offsetHeight","positionPlaceholder","ACTIVE","HIGHLIGHT","placeholderOffsetTop","getAttribute","inBounding","parent","parentRect","childRect","isInBounding","getBoundingClientRect","right","bottom","left","afterSticky","FIXED","isStickying","innerHeight","show","hide","intersection","props","root","rootMargin","IntersectionObserver","entries","entry","intersectionRatio","$root","section","observe","onSelect","onScroll","onResize","unobserve","isMobile","ua","navigator","userAgent","isPlainObject","getPrototypeOf","proto","isObjectLike","encodeHTML","CHARTS","instances","instance","Message","visible","offset","timer","destroyed","_objectSpread","isDestroyed","_getClassName","effect","round","closable","dangerouslyUseHTMLString","$type","$message","iconSize","_refreshIcon","iconName","$use","_refreshMessage","_refreshClose","_refreshEl","clearTimer","startTimer","duration","destroyAfterClosed","beforeClose","onMouseEnter","onMouseLeave","config","len","dom","clear","Command","action","Commands","commands","get","cmd","command","del","_createButton","button","rounded","link","$button","disabled","DISABLED","Toolbar","buttons","isHighlight","isDisabled","isExist","_getCommand","_self","bind","disable","_add","_disable","_enable","enable","enabled","onExecute","_updateToolbar","ceil","onToolbarUpdate","onAddButton","onRemoveButton","afterDisabled","afterEnabled","Speech","utterance","SpeechSynthesisUtterance","_initialize","lang","setLang","pitch","setPitch","rate","setRate","setText","voice","setVoice","volume","setVolume","_addListeners","isSpeaking","speechSynthesis","speaking","isPending","pending","isPaused","paused","getVoices","speak","pause","resume","cancel","speech","onvoiceschanged","isSupport","_updateSiblingElements","siblingElement","isPrev","$sibling","previousElementSibling","nextElementSibling","ENTER_READING_TIP","Reader","reading","$target","$paper","$progress","toolbar","_this$speech","_renderEdge","cloneNode","_animateTimeline","ScrollTimeline","animate","scale","timeline","axis","print","exit","enter","READER","READING","$siblings","enterReadingTip","info","SPEAK","onPrint","onEnterReading","onExitReading","keyCode","allowSpeak","Outline","version","anchors","drawer","reader","isExpanded","hasToolbar","_renderReader","_renderAnchors","_renderNavigator","_renderToolbar","option","showNavModalFirst","OPTIONS","homepage","git","tags","issues","tools","UP","toTop","HOME","GIT","ISSUES","MENU","PRINT","DOWN","toBottom","concat","addButton","removeButton","afterTop","floor","afterDown","enterReading","exitReading","switchReading","expand","collapses","_destroy","_window","jQuery","$","outline","debounce","ms","args","getViewportWidth","clientWidth","innerWidth","defaults","observeResize","observer","ResizeObserver"],"mappings":"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ACT,CAEAkL,SAAAA,CAAUvQ,GAGR,OAFAqF,KAAKQ,QAAQ7F,GAENqF,IACT,CAEAK,YAAAA,GACE,MAAMmJ,EAAkBxJ,KAAKwJ,gBAE7B,OAAIxJ,KAAK2J,QAAU,IAInB3I,EACEwI,EACA,2BACA,QACAxJ,KAAK6K,gBACL7K,MACA,GAGFA,KAAKe,IAAI,kBAAmBf,KAAKkL,YAZxBlL,IAeX,CAEAU,eAAAA,GACE,MAAM8I,EAAkBxJ,KAAKwJ,gBAE7B,OAAIxJ,KAAK2J,QAAU,IAInBpK,EAAIiK,EAAiB,QAASxJ,KAAK6K,iBACnC7K,KAAKmB,KAAK,kBAAmBnB,KAAKkL,YAJzBlL,IAOX,EAGFoJ,GAAQG,SAmBCtS,EAlBS,CACdiC,cAAe,YACfsD,eAAgB,WAChBC,SAAU,oBACVsO,aAAc,EACdd,UAAW,GACX1B,WAAW,EACXC,WAAW,EACX/N,UAAU,EACVgP,QAAS,KACTG,QAAS,KACTkB,YAAa,KACbH,cAAe,KACfC,aAAc,KACdlQ,kBAAmB,KACnBwP,iBAAkB,OEpUtB,MAAMiB,GAAO,CACX,IACA,OACA,UACA,OACA,UACA,QACA,QACA,IACA,OACA,MACA,MACA,aACA,OACA,KACA,SACA,SACA,UACA,OACA,OACA,MACA,WACA,OACA,WACA,KACA,MACA,UACA,MACA,SACA,MACA,KACA,KACA,KACA,QACA,WACA,aACA,SACA,SACA,OACA,KACA,KACA,KACA,KACA,KACA,KACA,OACA,SACA,SACA,KACA,OACA,IACA,SACA,MACA,QACA,MACA,MACA,QACA,SACA,KACA,OACA,OACA,MACA,OACA,OACA,OACA,WACA,OACA,QACA,MACA,WACA,SACA,KACA,WACA,SACA,SACA,IACA,QACA,UACA,MACA,WACA,IACA,KACA,KACA,KACA,MACA,OACA,IACA,OACA,SACA,SACA,UACA,SACA,OACA,QACA,SACA,OACA,SACA,QACA,MACA,UACA,MACA,MACA,QACA,QACA,KACA,WACA,WACA,QACA,KACA,QACA,OACA,QACA,KACA,QACA,IACA,KACA,MACA,QACA,OCzGIC,G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","x_google_ignoreList":[69]} \ No newline at end of file diff --git a/docs/js/drawer.min.js b/docs/js/drawer.min.js deleted file mode 100644 index 57f7323e..00000000 --- a/docs/js/drawer.min.js +++ /dev/null @@ -1,2 +0,0 @@ -!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(t="undefined"!=typeof globalThis?globalThis:t||self).Drawer=e()}(this,(function(){"use strict";const t=t=>"string"==typeof t,e=(t,e)=>{const s=Object.prototype.hasOwnProperty;return t&&s.call(t,e)},s=t=>Object.prototype.toString.apply(t),r=t=>"function"==typeof t||"[object Function]"===s(t),i=t=>("[object Object]"===s(t)||"object"==typeof t||r(t))&&null!==t,l={},o=t=>e(l,t)&&l[t].length>0,n=(t,e=!0)=>e?o(t):(t=>{let e=o(t),s=t.lastIndexOf(".");for(;!e&&-1!==s;)s=(t=t.substring(0,s)).lastIndexOf("."),e=o(t);return e})(t),a=(t,e,r=!0)=>{const i=t=>{if(!o(t))return!1;l[t].forEach((t=>{const r=["[object Int8Array]","[object Uint8Array]","[object Uint8ClampedArray]","[object Int16Array]","[object Uint16Array]","[object Int32Array]","[object Uint32Array]","[object Float32Array]","[object Float64Array]","[object BigInt64Array]","[object BigUint64Array]"].indexOf(s(e))>-1?e.toString():e;t.callback.call(t.context||t,r)}))},a=()=>{let e=t,s=t.lastIndexOf(".");for(;-1!==s;)e=e.substring(0,s),s=e.lastIndexOf("."),i(e);i(t),i("*")};if(!n(t))return!1;r?setTimeout(a,10):a()},c=(()=>{let t=0;return e=>(t+=1,e?e+"-"+t:"guid-"+t)})(),h=t=>{if(!e(l,t))return!1;delete l[t]},d=(t,e)=>{if(!n(t))return!1;e?(t=>{const e=Object.keys(l);if(!t||e.length<1)return!1;e.forEach((e=>{const s=l[e];let r;s.forEach(((e,i)=>{e.callback!==t&&e.token!==t||(r=e.topic,s.splice(-1,i))})),s.length<1&&h(r)}))})(e):h(t)};class u{constructor(t){this.attrs={},t&&this.initialize(t)}initialize(t){return this.attr(t).render().addListeners(),this}attr(s,r){const l=this.attrs;return t(s)?r&&e(l,s)?(l[s]=r,this):l[s]:i(s)?(o=l,n=s,Object.keys(n).forEach((t=>{e(n,t)&&(o[t]=n[t])})),this):0===arguments.length?l:this;var o,n}render(){return this}refresh(){return this}destroy(){return this.removeListeners(),this}reload(t){let e=this.attr();return t&&(e=this.attr(t)),this.destroy().initialize(e),this}$emit(t,e){return a(t,e),this}$on(t,e){return((t,e,s=null)=>{const i=c();let o="symbol"==typeof t?t.toString():t;r(e)&&(l[o]||(l[o]=[]),l[o].push({topic:o,callback:e,context:s,token:i}))})(t,e,this),this}$off(t,e){return d(t,e),this}addListeners(){return this}removeListeners(){return this}}const m=(t,e=300)=>!!r(t)&&setTimeout((()=>{t()}),e),p=t=>Array.isArray?Array.isArray(t):"[object Array]"===s(t),f=t=>{let e={};return null===t?null:(p(t)?e=Array.from(t):(e=Object.assign({},t),Object.keys(e).forEach((s=>e[s]=i(t[s])?f(t[s]):t[s]))),e)},y=t=>!!(i(t)&&t.nodeName&&t.tagName&&1===t.nodeType),b=t=>{return!(!i(t)||!(y(t)||(t=>!(!i(t)||"[object NodeList]"!==s(t)))(t)||(e=t,i(e)&&"[object DocumentFragment]"===s(e))||(t=>!(!i(t)||!("[object Text]"===s(t)||t.tagName&&3===t.nodeType)))(t)));var e},v=e=>!!t(e)&&e.replace(/(^\s+)|(\s+$)/g,""),g=["a","abbr","address","area","article","aside","audio","b","base","bdi","bdo","blockquote","body","br","button","canvas","caption","cite","code","col","colgroup","data","datalist","dd","del","details","dfn","dialog","div","dl","dt","em","embed","fieldset","figcaption","figure","footer","form","h1","h2","h3","h4","h5","h6","head","header","hgroup","hr","html","i","iframe","img","input","ins","kbd","label","legend","li","link","main","map","mark","math","menu","menuitem","meta","meter","nav","noscript","object","ol","optgroup","option","output","p","param","picture","pre","progress","q","rb","rp","rt","rtc","ruby","s","samp","script","search","section","select","slot","small","source","span","strong","style","sub","summary","sup","svg","table","tbody","td","template","textarea","tfoot","th","thead","time","title","tr","track","u","ul","var","video","wbr"],z=e=>{let s,r,i;return!!t(e)&&(s=v(e).slice(0,1e3),r=/\s*|]*>|]*>|]+>/i,i=new RegExp(g.map((t=>`<${t}\\b[^>]*>`)).join("|"),"i"),r.test(s)||i.test(s))},w=(t,e)=>{const s=new RegExp("(\\s|^)"+e+"(\\s|$)");let r,i;return!!y(t)&&(r=t.className,!!r&&(i=t.classList,i&&i.contains?t.classList.contains(e):!!s.exec(r)))},M=(t,e)=>{var s;let r,i;if(w(t,e))return!1;r=t.classList,null!==(s=r)&&void 0!==s&&s.add?e.indexOf(" ")>-1?e.split(" ").forEach((t=>{r.add(t)})):r.add(e):(i=t.className,i+=i.length>0?" "+e:e,t.className=i)},x=(t,e)=>{var s;let r,i=t.className;if(!i||!w(t,e))return!1;r=t.classList,null!==(s=r)&&void 0!==s&&s.remove?r.remove(e):(i=v(i.replace(e,"")),t.className=i)};function $(t,e){(null==e||e>t.length)&&(e=t.length);for(var s=0,r=Array(e);st.replace(/]*>.*?<\/script>/gi,""),A=(t,s)=>{if(!t||!i(s))return!1;Object.keys(s).forEach((r=>{const i=s[r];e(s,r)&&((t,e,s)=>{let r=t.tagName.toLowerCase();switch(e){case"style":t.style.cssText=s;break;case"value":"input"===r||"textarea"===r?t.value=s:t.setAttribute(e,s);break;case"htmlFor":t.setAttribute("for",s);break;case"className":M(t,s);break;case"innerHTML":t.innerHTML=s;break;case"innerText":t.innerText=s;break;default:t.setAttribute(e,s)}})(t,r,i)}))},j=(e,s,r)=>{const l=document.createDocumentFragment(),o=document.createElement(e),n=e=>b(e)||t(e),a=e=>{let s;if(!n(e))return!1;b(e)?s=e:t(e)&&(s=document.createTextNode(e)),l.appendChild(s)};return i(s)?A(o,s):p(s)&&s.every((t=>n(t)))?s.forEach((t=>{a(t)})):b(s)?a(s):t(s)&&a(document.createTextNode(s)),p(r)?r.forEach((t=>{a(t)})):a(r),o.appendChild(l),o},T=(t,e="")=>{const s=e.replace(/^>/i,"");return!!(e&&s&&t)&&(t.matches?t.matches(s):!!t.msMatchesSelector&&t.msMatchesSelector(s))},N=t=>t.host&&t!==document&&t.host.nodeType?t.host:t.parentNode,O=["focusout","blur","focusin","focus","load","unload","mouseenter","mouseleave"],k=(t,e,s)=>{const r=O.indexOf(e)>-1;s._delegateListener&&delete(s=s._delegateListener)._delegateListener,function(t,e,s){const r=t._listeners;let i=-1;if(r.length<1)return!1;r.forEach(((t,r)=>{const l=t.fn;e===t.type&&(i=r,l===s&&(i=r))})),i>-1&&r.splice(i,1)}(t,e,s),t.removeEventListener(e,s,r)},E=function(e,s,r=!1){const i=t(e)?document.querySelector(e):e,l=i.childNodes,o=((e,s)=>{let r=e._listeners||[];return t(s)&&s&&(r=r.filter((t=>t.type===s))),r})(i,s);o.forEach((t=>{k(i,t.type,t.fn)})),(r||!0===s||1===arguments.length)&&i&&l&&l.forEach((t=>{y(t)&&E(t,s,r)}))},B=(t,e,s)=>{if(!r(s))return E(t,e),!1;k(t,e,s)},H=(t,e,s,r,i,l,o=!1)=>{const n=O.indexOf(s)>-1,a=function(n){const c=function(t){const e=t.target;return(s=e)&&3===s.nodeType?s.parentNode:s;var s}(n),h=((t,e,s,r)=>{const i=s||document;if(!t)return null;do{if(null!=e&&(e.startsWith(">")?t.parentNode===i&&T(t,e):T(t,e))||r&&t===i)return t;if(t===i)break}while(t=N(t))})(c,e,t);let d=l||t;n.delegateTarget=h,!0===l&&(d=i),h&&(!0===o&&B(t,s,a),r.call(d,n,i))};if(!t)return!1;t._listeners||(t._listeners=[]),t._listeners.push({el:t,selector:e,type:s,fn:a,data:i,context:l,capture:n}),r._delegateListener=a,t.addEventListener(s,a,n)},S=_(L,['','','','','','','','','','','','','','','','','','','','']),I=(e,s="icon")=>t(e)?((t,e="icon")=>{const s=/id="(.*?)"/,r=/^(\w+)-/;return S.find((i=>{const l=s.exec(i)[1];return r.exec(l)[1]===e&&l===("icon"===e?`${e}-${t}`:`${e}-icon-${t}`)}))})(e,s):_(L,S),V=(e="")=>{const s=document.body;let r=document.querySelector("#outline-icons"),i=[];(e=>{if(!e)return!1;p(e)&&e.length>0?e.forEach((e=>{-1===S.indexOf(e)&&t(e)&&S.push(e)})):t(e)&&S.push(e)})(e),i=I(),r?r.innerHTML=i.join(""):(r=document.createElement("div"),r.innerHTML=``,s.insertBefore(r.firstChild,s.firstChild))},D=(e,s={})=>{const r="outline-icon",i=s.size||0,l=s.color||"",o=s.iconSet||"",n=p(i)?i[0]:i,a=p(i)?i[1]:i,c=i?`width:${n}px;height:${a}px;`:"",h=l?c+`color:${l}`:c,d=s.attrs||{},u=document.createElement("i");let m,f="",y="";return t(e)?((e=>{const s=new RegExp("^\\s*(?:<\\?xml[^>]*>\\s*)?(?:<\\!doctype svg[^>]*\\s*(?:\\[?(?:\\s*]*>\\s*)*\\]?)*[^>]*>\\s*)?]*>[^]*<\\/svg>\\s*$\\s*$","i");return t(e)&&s.test(e)})(e)?y=e:(f=o&&"icon"!==o?`xlink:href="#${o}-icon-${e}"`:`xlink:href="#icon-${e}"`,y=``),u.innerHTML=y,d.className?d.className=`${r} ${d.className}`:d.className=r,A(u,d),m=u.querySelector("svg"),A(m,{"aria-hidden":!0,xmlns:"http://www.w3.org/2000/svg",class:"outline-icon__svg",width:200,height:200,style:h}),u):null};let F=2e3;const q=t=>{var e,s;return t?F=t:F+=1,e="--outline-zIndex",s=`${F}`,document.documentElement.style.setProperty(e,s),F};class U extends u{constructor(t){super(),this._default(),this.zIndex=0,t&&this.initialize(t)}_default(){return this.attrs=f(U.DEFAULTS),this.title="",this.closed=!1,this.$el=null,this.$modal=null,this.$header=null,this.$title=null,this.$close=null,this.$main=null,this.$footer=null,this.$overlay=null,this}initialize(t){let e;return this.attr(t),this.title=this.attr("title"),e=this.attr("created"),r(e)&&e.call(this),this.render().addListeners(),this}setTitle(t){return this.attr("title",t),this.title=t,this.$title.innerHTML=t,this}isClosed(){return this.closed}render(){const t=this.attr("mounted"),e=this.attr("size"),s=this.attr("placement"),i=this.attr("hasClose"),l=this.attr("hasOverlay"),o=this.attr("hasOffset"),n=this.attr("hasPadding"),a=this.attr("autoHeight"),c=this.attr("overflow"),h=this.attr("customClass");let d,u,m,p,f,y,b,v,g="outline-drawer__main";return V(),this.zIndex=q(),p=j("h2",{className:"outline-drawer__title"},this.title),this.$title=p,i&&(f=j("div",{className:"outline-drawer__close"},((t,e={})=>D(t,e))("close",{iconSet:"outline",size:20})),this.$close=f),m=j("header",{className:"outline-drawer__header"},[p,f]),this.$header=m,"hidden"===c&&(g+=" overflow-hidden"),y=j("div",{className:g}),this.$main=y,n||M(y,"outline-drawer_full"),b=j("footer",{className:"outline-drawer__footer"}),this.$footer=b,u=j("div",{className:`outline-drawer__modal outline-drawer_${s} outline-drawer_${e} outline-drawer_closed`},[m,y,b]),this.$modal=u,o&&M(u,"outline-drawer_offset"),a&&M(u,"outline-drawer_auto"),h&&M(u,h),l&&(v=j("div",{className:"outline-drawer__overlay"}),this.$overlay=v),d=j("div",{className:"outline-drawer"},[u,v]),this.$el=d,document.body.appendChild(d),r(t)&&t.call(this),this}erase(){return this.$main.innerHTML="",this}_paint(e){let s=null;return r(e)?s=e():b(e)?s=e:z(e)&&(s=((e,s)=>{const r=document.createDocumentFragment();if(!e||!z(e)&&!t(e)&&!y(e))return null;if(z(e)){const t=j("div");let s=[];return t.innerHTML=C(e),s=_(L,t.childNodes),s.forEach((t=>{r.appendChild(t)})),r}if(!t(s))return e.innerHTML;e.innerHTML=C(s)})(e)),s&&this.$main.appendChild(s),this}_remove(){return document.body.removeChild(this.$el),this}refresh(t){return this.erase()._paint(t),this}open(){const t=this.attr("afterOpened"),e=this.$modal;return M(this.$el,"outline-drawer_opened"),x(e,"outline-drawer_closed"),M(e,"outline-drawer_opened"),m((()=>{this.closed=!1,r(t)&&t.call(this)})),this}close(){const t=this.attr("afterClosed"),e=this.$modal;return x(e,"outline-drawer_opened"),M(e,"outline-drawer_closed"),m((()=>{x(this.$el,"outline-drawer_opened"),this.closed=!0,r(t)&&t.call(this)})),this}toggle(){const t=this.attr("afterToggle"),e=this.isClosed();return e?this.open():this.close(),r(t)&&m((()=>{t.call(this,e)})),this}destroy(){const t=this.attr("afterDestroy"),e=this.attr("beforeDestroy");let s=this.zIndex;return r(e)&&e.call(this),this.removeListeners()._remove()._default(),s-=1,q(s),this.zIndex=0,r(t)&&t.call(this),this}onClose(){return this.close(),this}addListeners(){const t=this.attr("hasClose"),e=this.attr("hasOverlay"),s=this.attr("closeOnClickModal"),r=this.$el;return t&&H(r,".outline-drawer__close","click",this.onClose,this,!0),e&&s&&H(r,".outline-drawer__overlay","click",this.onClose,this,!0),this}removeListeners(){const t=this.attr("hasClose"),e=this.attr("hasOverlay"),s=this.$el;return t||e?(B(s,"click",this.onClose),this):this}}return U.DEFAULTS=f({placement:"rtl",title:"标题",size:"regular",hasClose:!0,hasOverlay:!0,hasOffset:!1,hasPadding:!0,autoHeight:!0,closeOnClickModal:!0,overflow:"auto",created:null,mounted:null,afterClosed:null,afterOpened:null,afterScroll:null,beforeDestroy:null,afterDestroy:null,afterToggle:null}),U})); -//# sourceMappingURL=drawer.min.js.map diff --git a/docs/js/drawer.min.js.map b/docs/js/drawer.min.js.map deleted file mode 100644 index 072abb22..00000000 --- a/docs/js/drawer.min.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"drawer.min.js","sources":["../../utils/types/isString.js","../../utils/lang/hasOwn.js","../../utils/lang/toString.js","../../utils/types/isFunction.js","../../utils/types/isObject.js","../../utils/observer/_subscribers.js","../../utils/observer/_hasDirectSubscribersFor.js","../../utils/observer/has.js","../../utils/observer/_hasSubscribers.js","../../utils/observer/emit.js","../../utils/types/isTypedArray.js","../../utils/lang/guid.js","../../utils/observer/_removeSubscriber.js","../../utils/observer/off.js","../../utils/observer/_removeSubscriberByToken.js","../../base.js","../../utils/lang/extend.js","../../utils/observer/on.js","../../utils/lang/later.js","../../utils/types/isArray.js","../../utils/lang/cloneDeep.js","../../utils/types/isElement.js","../../utils/types/isDOM.js","../../utils/types/isHTMLCollection.js","../../utils/types/isFragment.js","../../utils/types/isTextNode.js","../../utils/lang/trim.js","../../utils/types/tags.js","../../utils/types/isHTML.js","../../utils/dom/hasClass.js","../../utils/dom/addClass.js","../../utils/dom/removeClass.js","../../utils/lang/stripScripts.js","../../utils/dom/setAttributes.js","../../utils/dom/setAttribute.js","../../utils/dom/createElement.js","../../utils/dom/matches.js","../../utils/dom/getParentOrHost.js","../../utils/event/enum.js","../../utils/event/_off.js","../../utils/event/_delete.js","../../utils/event/purgeElement.js","../../utils/event/getListeners.js","../../utils/event/off.js","../../utils/event/on.js","../../utils/event/getTarget.js","../../utils/dom/resolveTextNode.js","../../utils/dom/closest.js","../../utils/icons/symbols.js","../../utils/icons/defaults.js","../../utils/icons/getSymbols.js","../../utils/icons/getSymbol.js","../../utils/icons/paint.js","../../utils/icons/add.js","../../utils/icons/createElement.js","../../utils/types/isSVG.js","../../zIndex.js","../../utils/dom/setProperty.js","../../drawer.js","../../utils/icons/icon.js","../../utils/dom/html.js"],"sourcesContent":["/**\r\n * 检测数据是否为 String 类型\r\n * ========================================================================\r\n * @method isArray\r\n * @param {*} str\r\n * @returns {boolean}\r\n */\r\nconst isString = (str) => {\r\n return typeof str === 'string'\r\n}\r\n\r\nexport default isString\r\n","/**\r\n * 检测对象自身属性中是否具有指定的属性。\r\n * ========================================================================\r\n * @method hasOwn\r\n * @param {Object} obj - (必须)检测的目标对象\r\n * @param {String} prop - (必须)属性名\r\n * @returns {Boolean}\r\n */\r\nconst hasOwn = (obj, prop) => {\r\n const hasOwnProperty = Object.prototype.hasOwnProperty\r\n return obj && hasOwnProperty.call(obj, prop)\r\n}\r\n\r\nexport default hasOwn\r\n","/**\r\n * Object 对象原型上的 toString 方法\r\n * ========================================================================\r\n * @method toString\r\n * @param {*} val\r\n * @returns {string}\r\n */\r\nconst toString = (val) => {\r\n return Object.prototype.toString.apply(val)\r\n}\r\n\r\nexport default toString\r\n","import toString from '../lang/toString'\r\n\r\n/**\r\n * 检测测试数据是否为 Function 类型\r\n * ========================================================================\r\n * @method isFunction\r\n * @param {*} val - (必须)待检测的数据\r\n * @returns {boolean} 'val' 是 Function 类型返回 true,否则返回 false\r\n */\r\nconst isFunction = (val) => {\r\n return typeof val === 'function' || toString(val) === '[object Function]'\r\n}\r\n\r\nexport default isFunction\r\n","import toString from '../lang/toString'\r\nimport isFunction from './isFunction'\r\n\r\n/**\r\n * 检测数据是否为 Object 类型\r\n * ========================================================================\r\n * @method isObject\r\n * @param {*} o\r\n * @returns {boolean}\r\n */\r\nconst isObject = (o) => {\r\n return (\r\n (toString(o) === '[object Object]' ||\r\n typeof o === 'object' ||\r\n isFunction(o)) &&\r\n o !== null\r\n )\r\n}\r\n\r\nexport default isObject\r\n","/**\r\n * 存储订阅者(主题和处理器的)私有对象\r\n * ========================================================================\r\n * @type {{}}\r\n * @private\r\n */\r\nconst _subscribers = {}\r\n\r\nexport default _subscribers\r\n","import _subscribers from './_subscribers'\r\nimport hasOwn from '../lang/hasOwn'\r\n\r\n/**\r\n * 判断是否存在与给定 topic 完全匹配的订阅者信息\r\n * ========================================================================\r\n * @method _hasDirectSubscribersFor\r\n * @param {String} topic - (必须)订阅主题字符串\r\n * @returns {Boolean}\r\n */\r\nconst _hasDirectSubscribersFor = (topic) => {\r\n return hasOwn(_subscribers, topic) && _subscribers[topic].length > 0\r\n}\r\n\r\nexport default _hasDirectSubscribersFor\r\n","import _hasDirectSubscribersFor from './_hasDirectSubscribersFor'\r\nimport _hasSubscribers from './_hasSubscribers'\r\n\r\n/**\r\n * 判断是否存在包含 topic 指定的订阅者信息\r\n * ========================================================================\r\n * @method has\r\n * @param {String} topic - (必须)主题名称\r\n * @param {Boolean} [isDirect] - (可选)是否为直接的主题,默认值:true\r\n * @returns {Boolean}\r\n */\r\nconst has = (topic, isDirect = true) => {\r\n return isDirect ? _hasDirectSubscribersFor(topic) : _hasSubscribers(topic)\r\n}\r\n\r\nexport default has\r\n","import _hasDirectSubscribersFor from './_hasDirectSubscribersFor'\r\n\r\n/**\r\n * 判断是否存在包含给定 topic 相关的订阅者信息\r\n * ========================================================================\r\n * @method _hasSubscribers\r\n * @param {String} topic - (必须)订阅主题字符串\r\n * @returns {Boolean}\r\n */\r\nconst _hasSubscribers = (topic) => {\r\n let found = _hasDirectSubscribersFor(topic)\r\n let position = topic.lastIndexOf('.')\r\n\r\n while (!found && position !== -1) {\r\n topic = topic.substring(0, position)\r\n position = topic.lastIndexOf('.')\r\n found = _hasDirectSubscribersFor(topic)\r\n }\r\n\r\n return found\r\n}\r\n\r\nexport default _hasSubscribers\r\n","import isTypedArray from '../types/isTypedArray'\r\nimport _subscribers from './_subscribers'\r\nimport has from './has'\r\nimport _hasDirectSubscribersFor from './_hasDirectSubscribersFor'\r\n\r\n/**\r\n * (异步)发布订阅主题信息\r\n * ========================================================================\r\n * 主题默认是异步发布的。确保在消费者处理主题时,主题的发起者不会被阻止。\r\n * ========================================================================\r\n * @method emit\r\n * @param {String} topic - (必须)主题名称\r\n * @param {Object} [data] - (可选)数据对象\r\n * @param {Boolean} [async] - (可选) 是否异步发布\r\n */\r\nconst emit = (topic, data, async = true) => {\r\n const execute = (topic) => {\r\n if (!_hasDirectSubscribersFor(topic)) {\r\n return false\r\n }\r\n\r\n _subscribers[topic].forEach((subscriber) => {\r\n // 针对 mqtt 消息服务返回的 Uint8Array 类似的 typed arrays 格式的数据\r\n // 采用 toString() 方法转化为普通(JSON)字符串\r\n const message = isTypedArray(data) ? data.toString() : data\r\n\r\n subscriber.callback.call(subscriber.context || subscriber, message)\r\n })\r\n }\r\n const deliver = () => {\r\n let subscriber = topic\r\n let position = topic.lastIndexOf('.')\r\n\r\n while (position !== -1) {\r\n subscriber = subscriber.substring(0, position)\r\n position = subscriber.lastIndexOf('.')\r\n\r\n execute(subscriber)\r\n }\r\n\r\n // 执行 topic 对应的处理器\r\n execute(topic)\r\n // 执行特殊 topic:'*'(监听全部消息的发布)\r\n execute('*')\r\n }\r\n\r\n if (!has(topic)) {\r\n return false\r\n }\r\n\r\n if (async) {\r\n setTimeout(deliver, 10)\r\n } else {\r\n deliver()\r\n }\r\n}\r\n\r\nexport default emit\r\n","import toString from '../lang/toString'\r\n/**\r\n * 判断检测数据是否为 Typed Arrays 类型的数据\r\n * ========================================================================\r\n * @param {*} val\r\n * @returns {boolean}\r\n */\r\nconst isTypedArray = (val) => {\r\n const TYPES = [\r\n '[object Int8Array]',\r\n '[object Uint8Array]',\r\n '[object Uint8ClampedArray]',\r\n '[object Int16Array]',\r\n '[object Uint16Array]',\r\n '[object Int32Array]',\r\n '[object Uint32Array]',\r\n '[object Float32Array]',\r\n '[object Float64Array]',\r\n '[object BigInt64Array]',\r\n '[object BigUint64Array]'\r\n ]\r\n\r\n return TYPES.indexOf(toString(val)) > -1\r\n}\r\n\r\nexport default isTypedArray\r\n","/**\r\n * 生成唯一 id 字符串的函数\r\n * ========================================================================\r\n * @method guid\r\n * @param {String} [prefix] - 生成 id 的前缀字符串\r\n * @return {String} 返回一个表示唯一 id 的字符串\r\n */\r\nconst guid = (() => {\r\n let uuid = 0\r\n\r\n return (prefix) => {\r\n uuid += 1\r\n\r\n return prefix ? prefix + '-' + uuid : 'guid-' + uuid\r\n }\r\n})()\r\n\r\nexport default guid\r\n","import _subscribers from './_subscribers'\r\nimport hasOwn from '../lang/hasOwn'\r\n\r\n/**\r\n * 删除与给定 topic 相同的订阅者信息\r\n * ========================================================================\r\n * @method _removeSubscriber\r\n * @param {String} topic - (必须)订阅主题字符串\r\n * @returns {Boolean}\r\n */\r\nconst _removeSubscriber = (topic) => {\r\n if (!hasOwn(_subscribers, topic)) {\r\n return false\r\n }\r\n\r\n delete _subscribers[topic]\r\n}\r\n\r\nexport default _removeSubscriber\r\n","import has from './has'\r\nimport _removeSubscriber from './_removeSubscriber'\r\nimport _removeSubscriberByToken from './_removeSubscriberByToken'\r\n\r\n/**\r\n * 取消订阅主题\r\n * ========================================================================\r\n * @method off\r\n * @param {String} topic - (必须)订阅的主题\r\n * @param {Function|String} [token] - (可选)订阅主题的处理器函数或者唯一 Id 值\r\n */\r\nconst off = (topic, token) => {\r\n if (!has(topic)) {\r\n return false\r\n }\r\n\r\n if (token) {\r\n _removeSubscriberByToken(token)\r\n } else {\r\n _removeSubscriber(topic)\r\n }\r\n}\r\n\r\nexport default off\r\n","import _subscribers from './_subscribers'\r\nimport _removeSubscriber from './_removeSubscriber'\r\n\r\n/**\r\n * 通过订阅者 token 值删除订阅者信息\r\n * ========================================================================\r\n * @method _removeSubscriberByToken\r\n * @param {String} token - 订阅者 token 字符串\r\n * @returns {boolean}\r\n * @private\r\n */\r\nconst _removeSubscriberByToken = (token) => {\r\n const keys = Object.keys(_subscribers)\r\n let index = -1\r\n\r\n if (!token || keys.length < 1) {\r\n return false\r\n }\r\n\r\n keys.forEach((subject) => {\r\n const subscriber = _subscribers[subject]\r\n let topic\r\n\r\n subscriber.forEach((execution, j) => {\r\n if (execution.callback === token || execution.token === token) {\r\n topic = execution.topic\r\n subscriber.splice(index, j)\r\n }\r\n })\r\n\r\n /* istanbul ignore else */\r\n if (subscriber.length < 1) {\r\n _removeSubscriber(topic)\r\n }\r\n })\r\n}\r\n\r\nexport default _removeSubscriberByToken\r\n","import isString from './utils/types/isString'\r\nimport hasOwn from './utils/lang/hasOwn'\r\nimport isObject from './utils/types/isObject'\r\nimport extend from './utils/lang/extend'\r\nimport publish from './utils/observer/emit'\r\nimport subscribe from './utils/observer/on'\r\nimport unsubscribe from './utils/observer/off'\r\n\r\nclass Base {\r\n constructor(options) {\r\n this.attrs = {}\r\n\r\n if (options) {\r\n this.initialize(options)\r\n }\r\n }\r\n\r\n initialize(options) {\r\n this.attr(options).render().addListeners()\r\n return this\r\n }\r\n\r\n attr(prop, value) {\r\n const attrs = this.attrs\r\n\r\n if (isString(prop)) {\r\n // 只能扩展 attrs 中已有的属性\r\n if (value && hasOwn(attrs, prop)) {\r\n // 更新单个配置信息\r\n attrs[prop] = value\r\n return this\r\n }\r\n\r\n // 只传递 prop 参数,则返回对应的属性值\r\n return attrs[prop]\r\n } else if (isObject(prop)) {\r\n // 批量更新配置信息\r\n extend(attrs, prop)\r\n\r\n return this\r\n } else if (arguments.length === 0) {\r\n // 不传递参数,直接返回整个\r\n return attrs\r\n }\r\n\r\n return this\r\n }\r\n\r\n render() {\r\n return this\r\n }\r\n\r\n refresh() {\r\n return this\r\n }\r\n\r\n destroy() {\r\n this.removeListeners()\r\n return this\r\n }\r\n\r\n reload(options) {\r\n let attrs = this.attr()\r\n\r\n if (options) {\r\n attrs = this.attr(options)\r\n }\r\n\r\n this.destroy().initialize(attrs)\r\n\r\n return this\r\n }\r\n\r\n $emit(event, data) {\r\n publish(event, data)\r\n return this\r\n }\r\n\r\n $on(event, callback) {\r\n subscribe(event, callback, this)\r\n return this\r\n }\r\n\r\n $off(event, callback) {\r\n unsubscribe(event, callback)\r\n return this\r\n }\r\n\r\n addListeners() {\r\n return this\r\n }\r\n\r\n removeListeners() {\r\n return this\r\n }\r\n}\r\n\r\nexport default Base\r\n","import hasOwn from './hasOwn'\r\n\r\n/**\r\n * 扩展对象\r\n * ========================================================================\r\n * @method extend\r\n * @param {Object} origin\r\n * @param {Object} source\r\n */\r\nconst extend = (origin, source) => {\r\n const keys = Object.keys(source)\r\n\r\n keys.forEach((prop) => {\r\n if (hasOwn(source, prop)) {\r\n origin[prop] = source[prop]\r\n }\r\n })\r\n}\r\n\r\nexport default extend\r\n","import _subscribers from './_subscribers'\r\nimport isFunction from '../types/isFunction'\r\nimport guid from '../lang/guid'\r\n\r\n/**\r\n * 订阅主题,并给出处理器函数\r\n * ========================================================================\r\n * @method on\r\n * @param {String} topic - (必须)主题名称\r\n * @param {Function} handler - (必须)主题的处理器函数\r\n * @param {Object} [context] - (可选)指定 this 执行上下文\r\n * @return {String} - 唯一的 token 字符串,例如:'guid-1'。\r\n */\r\nconst on = (topic, handler, context = null) => {\r\n const token = guid()\r\n let subject = typeof topic === 'symbol' ? topic.toString() : topic\r\n\r\n if (!isFunction(handler)) {\r\n return ''\r\n }\r\n\r\n /* istanbul ignore else */\r\n if (!_subscribers[subject]) {\r\n _subscribers[subject] = []\r\n }\r\n\r\n _subscribers[subject].push({\r\n topic: subject,\r\n callback: handler,\r\n context,\r\n token\r\n })\r\n\r\n return token\r\n}\r\n\r\nexport default on\r\n","import isFunction from '../types/isFunction'\r\n\r\n/**\r\n * later - 延迟执行方法\r\n * ========================================================================\r\n * @method later\r\n * @param {Function} fn\r\n * @param {Number} [delay]\r\n * @returns {number|boolean}\r\n */\r\nconst later = (fn, delay = 300) => {\r\n if (!isFunction(fn)) {\r\n return false\r\n }\r\n\r\n return setTimeout(() => {\r\n fn()\r\n }, delay)\r\n}\r\n\r\nexport default later\r\n","import toString from '../lang/toString'\r\n\r\n/**\r\n * 检测数据是否为 Array 类型\r\n * ========================================================================\r\n * @method isArray\r\n * @param {*} o\r\n * @returns {boolean}\r\n */\r\nconst isArray = (o) => {\r\n if (Array.isArray) {\r\n return Array.isArray(o)\r\n } else {\r\n return toString(o) === '[object Array]'\r\n }\r\n}\r\n\r\nexport default isArray\r\n","import isObject from '../types/isObject'\r\nimport isArray from '../types/isArray'\r\n\r\n/**\r\n * 深拷贝对象函数\r\n * ========================================================================\r\n * @methods cloneDeep\r\n * @param {Object} obj - 深拷贝的对象\r\n * @returns {Array|Object|*}\r\n *\r\n * @example\r\n * const arr = cloneDeep([2,3,4,6])\r\n * => [2,3,4,6]\r\n */\r\nconst cloneDeep = (obj) => {\r\n let clone = {}\r\n\r\n if (obj === null) {\r\n return null\r\n }\r\n\r\n if (isArray(obj)) {\r\n clone = Array.from(obj)\r\n } else {\r\n clone = Object.assign({}, obj)\r\n Object.keys(clone).forEach((key) => {\r\n return (clone[key] = isObject(obj[key]) ? cloneDeep(obj[key]) : obj[key])\r\n })\r\n }\r\n\r\n return clone\r\n}\r\n\r\nexport default cloneDeep\r\n","import isObject from './isObject'\r\n\r\n/**\r\n * 检测数据是否为 HTMLElement DOM 节点\r\n * ========================================================================\r\n * @method isElement\r\n * @param {*} o\r\n * @returns {boolean}\r\n */\r\nconst isElement = (o) => {\r\n return !!(isObject(o) && o.nodeName && o.tagName && o.nodeType === 1)\r\n}\r\n\r\nexport default isElement\r\n","import isObject from './isObject'\r\nimport isElement from './isElement'\r\nimport isHTMLCollection from './isHTMLCollection'\r\nimport isFragment from './isFragment'\r\nimport isTextNode from './isTextNode'\r\n\r\nconst isDOM = (el) => {\r\n return !!(\r\n isObject(el) &&\r\n (isElement(el) || isHTMLCollection(el) || isFragment(el) || isTextNode(el))\r\n )\r\n}\r\n\r\nexport default isDOM\r\n","import toString from '../lang/toString'\r\nimport isObject from './isObject'\r\n\r\nconst isHTMLCollection = (el) => {\r\n return !!(isObject(el) && toString(el) === '[object NodeList]')\r\n}\r\n\r\nexport default isHTMLCollection\r\n","import toString from '../lang/toString'\r\nimport isObject from './isObject'\r\n\r\nconst isFragment = (fragment) => {\r\n return !!(\r\n isObject(fragment) && toString(fragment) === '[object DocumentFragment]'\r\n )\r\n}\r\n\r\nexport default isFragment\r\n","import toString from '../lang/toString'\r\nimport isObject from './isObject'\r\n\r\nconst isTextNode = (el) => {\r\n return !!(\r\n isObject(el) &&\r\n (toString(el) === '[object Text]' || (el.tagName && el.nodeType === 3))\r\n )\r\n}\r\n\r\nexport default isTextNode\r\n","import isString from '../types/isString'\r\n\r\n/**\r\n * 清楚字符串起始位置所有的空格\r\n * ========================================================================\r\n * @method trim\r\n * @param {string} str\r\n * @returns {string|Boolean}\r\n */\r\nconst trim = (str) => {\r\n if (!isString(str)) {\r\n return false\r\n }\r\n return str.replace(/(^\\s+)|(\\s+$)/g, '')\r\n}\r\n\r\nexport default trim\r\n","// HTML 合法的标签\r\nconst TAGS = [\r\n 'a',\r\n 'abbr',\r\n 'address',\r\n 'area',\r\n 'article',\r\n 'aside',\r\n 'audio',\r\n 'b',\r\n 'base',\r\n 'bdi',\r\n 'bdo',\r\n 'blockquote',\r\n 'body',\r\n 'br',\r\n 'button',\r\n 'canvas',\r\n 'caption',\r\n 'cite',\r\n 'code',\r\n 'col',\r\n 'colgroup',\r\n 'data',\r\n 'datalist',\r\n 'dd',\r\n 'del',\r\n 'details',\r\n 'dfn',\r\n 'dialog',\r\n 'div',\r\n 'dl',\r\n 'dt',\r\n 'em',\r\n 'embed',\r\n 'fieldset',\r\n 'figcaption',\r\n 'figure',\r\n 'footer',\r\n 'form',\r\n 'h1',\r\n 'h2',\r\n 'h3',\r\n 'h4',\r\n 'h5',\r\n 'h6',\r\n 'head',\r\n 'header',\r\n 'hgroup',\r\n 'hr',\r\n 'html',\r\n 'i',\r\n 'iframe',\r\n 'img',\r\n 'input',\r\n 'ins',\r\n 'kbd',\r\n 'label',\r\n 'legend',\r\n 'li',\r\n 'link',\r\n 'main',\r\n 'map',\r\n 'mark',\r\n 'math',\r\n 'menu',\r\n 'menuitem',\r\n 'meta',\r\n 'meter',\r\n 'nav',\r\n 'noscript',\r\n 'object',\r\n 'ol',\r\n 'optgroup',\r\n 'option',\r\n 'output',\r\n 'p',\r\n 'param',\r\n 'picture',\r\n 'pre',\r\n 'progress',\r\n 'q',\r\n 'rb',\r\n 'rp',\r\n 'rt',\r\n 'rtc',\r\n 'ruby',\r\n 's',\r\n 'samp',\r\n 'script',\r\n 'search',\r\n 'section',\r\n 'select',\r\n 'slot',\r\n 'small',\r\n 'source',\r\n 'span',\r\n 'strong',\r\n 'style',\r\n 'sub',\r\n 'summary',\r\n 'sup',\r\n 'svg',\r\n 'table',\r\n 'tbody',\r\n 'td',\r\n 'template',\r\n 'textarea',\r\n 'tfoot',\r\n 'th',\r\n 'thead',\r\n 'time',\r\n 'title',\r\n 'tr',\r\n 'track',\r\n 'u',\r\n 'ul',\r\n 'var',\r\n 'video',\r\n 'wbr'\r\n]\r\n\r\nexport default TAGS\r\n","import isString from './isString'\r\nimport trim from '../lang/trim'\r\nimport TAGS from './tags'\r\n\r\n/**\r\n * 检测测试数据是否为合法的 HTML 代码\r\n * ========================================================================\r\n * @method isHTML\r\n * @category Lang\r\n * @see https://github.com/sindresorhus/html-tags\r\n * @see https://github.com/sindresorhus/is-html\r\n * @param {String} str - 要检测的数据\r\n * @returns {Boolean} 'val' 为合法的 HTML 代码,返回 true,否则返回 false\r\n */\r\nconst isHTML = (str) => {\r\n let html\r\n let basic\r\n let full\r\n\r\n if (!isString(str)) {\r\n return false\r\n }\r\n\r\n // 为了提高性能,我们将其限制在合理的长度内。\r\n html = trim(str).slice(0, 1000)\r\n basic = /\\s*|]*>|]*>|]+>/i\r\n full = new RegExp(TAGS.map((tag) => `<${tag}\\\\b[^>]*>`).join('|'), 'i')\r\n\r\n return basic.test(html) || full.test(html)\r\n}\r\n\r\nexport default isHTML\r\n","import isElement from '../types/isElement'\r\n/**\r\n * 检测 DOM 节点是否包含名为 className 的样式\r\n * ========================================================================\r\n * @method hasClass\r\n * @param {HTMLElement} el - DOM 节点\r\n * @param {String} className - 样式名称\r\n * @returns {Boolean}\r\n */\r\nconst hasClass = (el, className) => {\r\n const pattern = new RegExp('(\\\\s|^)' + className + '(\\\\s|$)')\r\n let allClass\r\n let classList\r\n\r\n if (!isElement(el)) {\r\n return false\r\n }\r\n\r\n allClass = el.className\r\n\r\n if (!allClass) {\r\n return false\r\n }\r\n\r\n classList = el.classList\r\n\r\n if (classList && classList.contains) {\r\n return el.classList.contains(className)\r\n }\r\n\r\n return !!pattern.exec(allClass)\r\n}\r\n\r\nexport default hasClass\r\n","import hasClass from './hasClass'\r\n\r\n/**\r\n * 给 DOM 节点添加名为 className 的样式\r\n * ========================================================================\r\n * @method addClass\r\n * @param {HTMLElement} el - DOM 节点\r\n * @param {String} className - 样式名称\r\n * @returns {Boolean}\r\n */\r\nconst addClass = (el, className) => {\r\n let classList\r\n let allClass\r\n\r\n if (hasClass(el, className)) {\r\n return false\r\n }\r\n\r\n classList = el.classList\r\n\r\n if (classList?.add) {\r\n if (className.indexOf(' ') > -1) {\r\n className.split(' ').forEach((name) => {\r\n classList.add(name)\r\n })\r\n } else {\r\n classList.add(className)\r\n }\r\n } else {\r\n allClass = el.className\r\n allClass += allClass.length > 0 ? ' ' + className : className\r\n el.className = allClass\r\n }\r\n}\r\n\r\nexport default addClass\r\n","import trim from '../lang/trim'\r\nimport hasClass from './hasClass'\r\n\r\n/**\r\n * 移除 DOM 节点的 className 样式\r\n * ========================================================================\r\n * @method removeClass\r\n * @param {HTMLElement} el - DOM 节点\r\n * @param {String} className - 样式名称\r\n * @returns {Boolean}\r\n */\r\nconst removeClass = (el, className) => {\r\n let allClass = el.className\r\n let classList\r\n\r\n if (!allClass || !hasClass(el, className)) {\r\n return false\r\n }\r\n\r\n classList = el.classList\r\n\r\n if (classList?.remove) {\r\n classList.remove(className)\r\n } else {\r\n allClass = trim(allClass.replace(className, ''))\r\n el.className = allClass\r\n }\r\n}\r\n\r\nexport default removeClass\r\n","/**\r\n * 移除字符串中的 JavaScript 代码\r\n * ====================================================\r\n * @param {String} str\r\n * @returns {String}\r\n */\r\nconst stripScripts = (str) => {\r\n return str.replace(/]*>.*?<\\/script>/gi, '')\r\n}\r\n\r\nexport default stripScripts\r\n","import isObject from '../types/isObject'\r\nimport hasOwn from '../lang/hasOwn'\r\nimport setAttribute from './setAttribute'\r\n\r\nconst setAttributes = (el, attrs) => {\r\n if (!el || !isObject(attrs)) {\r\n return false\r\n }\r\n\r\n Object.keys(attrs).forEach((attr) => {\r\n const value = attrs[attr]\r\n if (hasOwn(attrs, attr)) {\r\n setAttribute(el, attr, value)\r\n }\r\n })\r\n}\r\n\r\nexport default setAttributes\r\n","import addClass from './addClass.js'\r\n\r\n/**\r\n * 给 DOM 节点设置属性/值\r\n * ========================================================================\r\n * @method setAttribute\r\n * @param {HTMLElement} el - DOM 节点\r\n * @param {String} attr - 属性名称\r\n * @param {String|Number|Boolean} value - 属性值\r\n */\r\nconst setAttribute = (el, attr, value) => {\r\n let tagName = el.tagName.toLowerCase()\r\n\r\n switch (attr) {\r\n case 'style':\r\n el.style.cssText = value\r\n break\r\n case 'value':\r\n if (tagName === 'input' || tagName === 'textarea') {\r\n el.value = value\r\n } else {\r\n el.setAttribute(attr, value)\r\n }\r\n break\r\n case 'htmlFor':\r\n el.setAttribute('for', value)\r\n break\r\n case 'className':\r\n addClass(el, value)\r\n break\r\n case 'innerHTML':\r\n el.innerHTML = value\r\n break\r\n case 'innerText':\r\n el.innerText = value\r\n break\r\n default:\r\n el.setAttribute(attr, value)\r\n break\r\n }\r\n}\r\n\r\nexport default setAttribute\r\n","import isObject from '../types/isObject'\r\nimport isString from '../types/isString'\r\nimport isArray from '../types/isArray'\r\nimport isDOM from '../types/isDOM'\r\nimport setAttributes from './setAttributes'\r\n\r\n/**\r\n * 创建 DOM 节点,并添加属性和子节点\r\n * ========================================================================\r\n * @method createElement\r\n * @param {String} tagName - 标签名称\r\n * @param {Object|Array|HTMLElement|DocumentFragment|String} attrs - 属性对象或者子节点\r\n * @param {Array|HTMLElement|DocumentFragment|String} [children] - 子节点数组\r\n * @returns {HTMLElement}\r\n */\r\nconst createElement = (tagName, attrs, children) => {\r\n const $fragment = document.createDocumentFragment()\r\n const $el = document.createElement(tagName)\r\n const isValidChild = (child) => {\r\n return isDOM(child) || isString(child)\r\n }\r\n const append = (child) => {\r\n let $child\r\n\r\n if (!isValidChild(child)) {\r\n return false\r\n }\r\n\r\n if (isDOM(child)) {\r\n $child = child\r\n } else if (isString(child)) {\r\n $child = document.createTextNode(child)\r\n }\r\n\r\n $fragment.appendChild($child)\r\n }\r\n\r\n if (isObject(attrs)) {\r\n setAttributes($el, attrs)\r\n } else if (isArray(attrs) && attrs.every((attr) => isValidChild(attr))) {\r\n attrs.forEach((child) => {\r\n append(child)\r\n })\r\n } else if (isDOM(attrs)) {\r\n append(attrs)\r\n } else if (isString(attrs)) {\r\n append(document.createTextNode(attrs))\r\n }\r\n\r\n if (isArray(children)) {\r\n children.forEach((child) => {\r\n append(child)\r\n })\r\n } else {\r\n append(children)\r\n }\r\n\r\n $el.appendChild($fragment)\r\n\r\n return $el\r\n}\r\n\r\nexport default createElement\r\n","/**\r\n * 获取 options 节点下匹配 selector 选择器的 DOM 节点\r\n * ========================================================================\r\n * Element.matches() 方法可以用来判断 DOM 元素是否与给定的选择器匹配,事件代理判断是\r\n * 否触发绑定的代理事件回调函数,关键就是使用 Element.matches() 辨别当前事件触发的目\r\n * 标 DOM 元素是否为事件代理所期望触发的目标。\r\n * ========================================================================\r\n * @method matches\r\n * @see https://developer.mozilla.org/en-US/docs/web/api/element/matches\r\n * @param {HTMLElement} el - (必须)DOM 元素\r\n * @param {String} selector - (必须)匹配 DOM 元素的选择器\r\n * @returns {Boolean}\r\n */\r\nconst matches = (el, selector = '') => {\r\n const sel = selector.replace(/^>/i, '')\r\n\r\n if (!selector || !sel || !el) {\r\n return false\r\n }\r\n\r\n /* istanbul ignore else */\r\n if (el.matches) {\r\n return el.matches(sel)\r\n } else if (el.msMatchesSelector) {\r\n return el.msMatchesSelector(sel)\r\n } else {\r\n return false\r\n }\r\n}\r\n\r\nexport default matches\r\n","/**\r\n * 获取 DOM 元素的父节点\r\n * ========================================================================\r\n * @method getParentOrHost\r\n * @param {*|HTMLElement} el - (必须)要获取父节点的 DOM 元素\r\n * @returns {*|HTMLElement}\r\n */\r\nconst getParentOrHost = (el) => {\r\n return el.host && el !== document && el.host.nodeType\r\n ? el.host\r\n : el.parentNode\r\n}\r\n\r\nexport default getParentOrHost\r\n","export const CAPTURE_EVENTS = [\r\n 'focusout',\r\n 'blur',\r\n 'focusin',\r\n 'focus',\r\n 'load',\r\n 'unload',\r\n 'mouseenter',\r\n 'mouseleave'\r\n]\r\n","import { CAPTURE_EVENTS } from './enum'\r\nimport _delete from './_delete'\r\n\r\n/**\r\n * (私有方法)取消 type 类型的代理事件绑定\r\n * ========================================================================\r\n * 如果没有设置 handler,则销毁 this.$options 绑定的所有符合 type 事件类型的事件绑定\r\n * ========================================================================\r\n * @method _off\r\n * @param {HTMLElement} el - (必须)取消事件绑定的 DOM 元素\r\n * @param {String} type - (必须)事件类型\r\n * @param {Function} fn - (必须)事件处理器回调函数\r\n * @private\r\n */\r\nconst _off = (el, type, fn) => {\r\n const capture = CAPTURE_EVENTS.indexOf(type) > -1\r\n\r\n /* istanbul ignore else */\r\n if (fn._delegateListener) {\r\n fn = fn._delegateListener\r\n delete fn._delegateListener\r\n }\r\n\r\n // 移除缓存的 _listeners 数据\r\n _delete(el, type, fn)\r\n\r\n el.removeEventListener(type, fn, capture)\r\n}\r\n\r\nexport default _off\r\n","/**\r\n * 删除 DOM 元素缓存的 _listeners 数据\r\n * ========================================================================\r\n * @method _delete\r\n * @param {HTMLElement} el - 要删除 listener 的 DOM 元素\r\n * @param {String} type - 事件类型(名称)\r\n * @param {Function} [fn] - 事件处理器回调函数\r\n */\r\nconst _delete = function (el, type, fn) {\r\n const listeners = el._listeners\r\n let index = -1\r\n\r\n if (listeners.length < 1) {\r\n return false\r\n }\r\n\r\n // 移除缓存的 _listeners 数据\r\n listeners.forEach((listener, i) => {\r\n const handler = listener.fn\r\n\r\n if (type === listener.type) {\r\n index = i\r\n\r\n if (handler === fn) {\r\n index = i\r\n }\r\n }\r\n })\r\n\r\n /* istanbul ignore else */\r\n if (index > -1) {\r\n listeners.splice(index, 1)\r\n }\r\n}\r\n\r\nexport default _delete\r\n","import isString from '../types/isString'\r\nimport isElement from '../types/isElement'\r\nimport getListeners from './getListeners'\r\nimport _off from './_off'\r\n\r\n/**\r\n * 销毁(type 类型的)代理事件绑定\r\n * ========================================================================\r\n * 1. 设置了事件类型 type,则销毁指定类型的事件绑定,否则清除所有代理事件绑定\r\n * 2. recurse 设置为 true,递归销毁子节点全部事件绑定\r\n * ========================================================================\r\n * @method purgeElement\r\n * @param {HTMLElement|String} el - (必须)DOM 元素或者其选择器\r\n * @param {String|Boolean} type - (必须)事件类型\r\n * @param {Boolean} [recurse] - (可选)是否递归销毁子节点所有事件绑定\r\n */\r\nconst purgeElement = function (el, type, recurse = false) {\r\n const $element = isString(el) ? document.querySelector(el) : el\r\n const $children = $element.childNodes\r\n const listeners = getListeners($element, type)\r\n\r\n listeners.forEach((listener) => {\r\n _off($element, listener.type, listener.fn)\r\n })\r\n\r\n if (\r\n (recurse || type === true || arguments.length === 1) &&\r\n $element &&\r\n $children\r\n ) {\r\n $children.forEach(($child) => {\r\n if (isElement($child)) {\r\n purgeElement($child, type, recurse)\r\n }\r\n })\r\n }\r\n}\r\n\r\nexport default purgeElement\r\n","import isString from '../types/isString'\r\n\r\n/**\r\n * 获取 DOM 元素(type 事件类型)事件绑定信息\r\n * ========================================================================\r\n * 如果设置了事件类型 type, 则返回指定类型的事件绑定信息,否则返回所有事件绑定信息\r\n * ========================================================================\r\n * @methods getListeners\r\n * @param {HTMLElement} el - (必须)要获取事件绑定信息的 DOM 元素\r\n * @param {String} [type] - (可选)事件类型\r\n * @returns {Array} - 已绑定的事件信息\r\n */\r\nconst getListeners = (el, type) => {\r\n let listeners = el._listeners || []\r\n\r\n if (isString(type) && type) {\r\n listeners = listeners.filter((listener) => {\r\n return listener.type === type\r\n })\r\n }\r\n\r\n return listeners\r\n}\r\n\r\nexport default getListeners\r\n","import purgeElement from './purgeElement'\r\nimport isFunction from '../types/isFunction'\r\nimport _off from './_off'\r\n\r\n/**\r\n * 取消 type 类型的代理事件绑定\r\n * ========================================================================\r\n * 如果没有设置 handler,则销毁 this.$options 绑定的所有符合 type 事件类型的事件绑定\r\n * ========================================================================\r\n * @method off\r\n * @param {HTMLElement|Object} el - (必须)取消事件绑定的 DOM 元素\r\n * @param {String} type - (必须)事件类型\r\n * @param {Function} [fn] - (可选)事件处理器回调函数\r\n */\r\nconst off = (el, type, fn) => {\r\n // 如果不设置 fn 参数,默认清除 el 元素上绑定的所有事件处理器\r\n if (!isFunction(fn)) {\r\n purgeElement(el, type)\r\n return false\r\n }\r\n\r\n _off(el, type, fn)\r\n}\r\n\r\nexport default off\r\n","import closest from '../dom/closest'\r\nimport off from './off'\r\nimport getTarget from './getTarget'\r\n\r\nimport { CAPTURE_EVENTS } from './enum'\r\n\r\n/**\r\n * 绑定代理事件\r\n * ========================================================================\r\n * @method on\r\n * @param {HTMLElement|String|Object} el - (必须)绑定代理事件的 DOM 节点\r\n * @param {String} selector - (必须)事件代理目标 DOM 元素的选择器\r\n * @param {String|Function} type - (必须)事件类型或者事件处理器回调函数\r\n * @param {Function|Object} fn - (可选) 事件处理器回调函数或者传递给事件处理器回调函数的数据对象\r\n * @param {Object|Boolean} [data] - (可选)传递给事件处理器回调函数的数据对象或者事件处理器回调函数的 this 上下文指向,\r\n * @param {Object|Boolean} [context] - (可选)事件处理器回调函数的 this 上下文指向,或者是否仅触发一次\r\n * 当设置为 true 时,则事件处理器回调函数的 this 上下文指向为 data 对象\r\n * @param {Boolean} once - (可选)是否仅触发一次\r\n */\r\nconst on = (el, selector, type, fn, data, context, once = false) => {\r\n // CAPTURE_EVENTS 中的特殊事件,采用事件捕获模型\r\n const capture = CAPTURE_EVENTS.indexOf(type) > -1\r\n\r\n const listener = function (evt) {\r\n const target = getTarget(evt)\r\n // 通过 Element.matches 方法获得点击的目标元素\r\n const delegateTarget = closest(target, selector, el)\r\n let overrideContext = context || el\r\n\r\n evt.delegateTarget = delegateTarget\r\n\r\n // 当设置为 true 时,则事件处理器回调函数的\r\n // this 上下文指向为 data 对象\r\n if (context === true) {\r\n overrideContext = data\r\n }\r\n\r\n /* istanbul ignore else */\r\n if (delegateTarget) {\r\n // 仅触发一次\r\n /* istanbul ignore else */\r\n if (once === true) {\r\n off(el, type, listener)\r\n }\r\n\r\n fn.call(overrideContext, evt, data)\r\n }\r\n }\r\n\r\n if (!el) {\r\n return false\r\n }\r\n\r\n if (!el._listeners) {\r\n el._listeners = []\r\n }\r\n\r\n // 缓存 options 元素绑定的事件处理器\r\n el._listeners.push({\r\n el,\r\n selector,\r\n type,\r\n fn: listener,\r\n data,\r\n context,\r\n capture\r\n })\r\n\r\n // 缓存包装后的事件处理器\r\n fn._delegateListener = listener\r\n\r\n el.addEventListener(type, listener, capture)\r\n}\r\n\r\nexport default on\r\n","import resolveTextNode from '../dom/resolveTextNode'\r\n\r\n/**\r\n * 返回触发事件的 target DOM 元素\r\n * ========================================================================\r\n * @method getTarget\r\n * @param {Event} evt - Event 对象\r\n * @return {HTMLElement} - Event 对象的 target DOM 元素\r\n */\r\nconst getTarget = function (evt) {\r\n const target = evt.target\r\n\r\n return resolveTextNode(target)\r\n}\r\n\r\nexport default getTarget\r\n","/**\r\n * 在某些情况下,某些浏览器(例如:Safari 浏览器)会返回实际的目标元素内部的文本节点。\r\n * resolveTextNode() 方法则会返回实际的目标节点。\r\n * ========================================================================\r\n * @method resolveTextNode\r\n * @param {HTMLElement|Text} el - 要解析的节点\r\n * @return {*|HTMLElement} - 实际的目标 DOM 节点\r\n */\r\nconst resolveTextNode = function (el) {\r\n if (el && el.nodeType === 3) {\r\n return el.parentNode\r\n }\r\n\r\n return el\r\n}\r\n\r\nexport default resolveTextNode\r\n","import matches from './matches'\r\nimport getParentOrHost from './getParentOrHost'\r\n\r\n/**\r\n * 获取 options 元素父元素最近的包含 selector 选择器的元素\r\n * ========================================================================\r\n * @method closest\r\n * @param {HTMLElement} el - (必须)DOM 元素\r\n * @param {String} selector - (必须)DOM 元素的选择其\r\n * @param {HTMLElement} [ctx] - (必须)比对的 DOM 元素\r\n * @param {Boolean} [includeCTX] - (必须)是否包含 context DOM 元素\r\n * @returns {null|HTMLElement} - 返回最接近的 DOM 元素\r\n */\r\nconst closest = (el, selector, ctx, includeCTX) => {\r\n const context = ctx || document\r\n\r\n if (!el) {\r\n return null\r\n }\r\n\r\n do {\r\n /* istanbul ignore else */\r\n if (\r\n (selector != null &&\r\n (selector.startsWith('>')\r\n ? el.parentNode === context && matches(el, selector)\r\n : matches(el, selector))) ||\r\n (includeCTX && el === context)\r\n ) {\r\n return el\r\n }\r\n\r\n /* istanbul ignore else */\r\n if (el === context) {\r\n break\r\n }\r\n\r\n /* jshint boss:true */\r\n } while ((el = getParentOrHost(el)))\r\n}\r\n\r\nexport default closest\r\n","import DEFAULTS from './defaults'\r\n\r\nconst SYMBOLS = [...DEFAULTS]\r\n\r\nexport default SYMBOLS\r\n","const DEFAULTS = [\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n ''\r\n]\r\n\r\nexport default DEFAULTS\r\n","import isString from '../types/isString'\r\nimport getSymbol from './getSymbol'\r\nimport SYMBOLS from './symbols'\r\n\r\n/**\r\n *\r\n * @method getSymbols\r\n * @param {String} [name]\r\n * @param {String} [iconSet]\r\n * @returns {string[]|*}\r\n */\r\nconst getSymbols = (name, iconSet = 'icon') => {\r\n if (isString(name)) {\r\n return getSymbol(name, iconSet)\r\n }\r\n\r\n return [...SYMBOLS]\r\n}\r\n\r\nexport default getSymbols\r\n","import SYMBOLS from './symbols'\r\n\r\n/**\r\n * @method getSymbol\r\n * @param {String} name\r\n * @param {String} [iconSet]\r\n * @returns {String}\r\n */\r\nconst getSymbol = (name, iconSet = 'icon') => {\r\n const patternName = /id=\"(.*?)\"/\r\n const patternSet = /^(\\w+)-/\r\n const symbols = SYMBOLS\r\n\r\n return symbols.find((symbol) => {\r\n const names = patternName.exec(symbol)\r\n const fullName = names[1]\r\n const sets = patternSet.exec(fullName)\r\n const setName = sets[1]\r\n const iconName =\r\n iconSet === 'icon' ? `${iconSet}-${name}` : `${iconSet}-icon-${name}`\r\n\r\n return setName === iconSet && fullName === iconName\r\n })\r\n}\r\n\r\nexport default getSymbol\r\n","import add from './add'\r\nimport getSymbols from './getSymbols'\r\n\r\n/**\r\n * 绘制 SVG 图标集\r\n * ========================================================================\r\n * @method paint\r\n * @param {String|Array} symbol\r\n */\r\nconst paint = (symbol = '') => {\r\n const $body = document.body\r\n let $icons = document.querySelector('#outline-icons')\r\n let symbols = []\r\n\r\n add(symbol)\r\n symbols = getSymbols()\r\n\r\n if ($icons) {\r\n $icons.innerHTML = symbols.join('')\r\n } else {\r\n $icons = document.createElement('div')\r\n $icons.innerHTML =\r\n ``\r\n $body.insertBefore($icons.firstChild, $body.firstChild)\r\n }\r\n}\r\n\r\nexport default paint\r\n","import isArray from '../types/isArray'\r\nimport isString from '../types/isString'\r\nimport SYMBOLS from './symbols'\r\n\r\n/**\r\n * @method add\r\n * @param {Array|String} symbols\r\n * @return {Boolean}\r\n */\r\nconst add = (symbols) => {\r\n if (!symbols) {\r\n return false\r\n }\r\n\r\n if (isArray(symbols) && symbols.length > 0) {\r\n symbols.forEach((symbol) => {\r\n /* istanbul ignore else */\r\n if (SYMBOLS.indexOf(symbol) === -1 && isString(symbol)) {\r\n SYMBOLS.push(symbol)\r\n }\r\n })\r\n } else {\r\n /* istanbul ignore else */\r\n if (isString(symbols)) {\r\n SYMBOLS.push(symbols)\r\n }\r\n }\r\n}\r\n\r\nexport default add\r\n","import isArray from '../types/isArray'\r\nimport isString from '../types/isString'\r\nimport isSVG from '../types/isSVG'\r\nimport setAttributes from '../dom/setAttributes'\r\n\r\n/**\r\n * 创建 SVG 图标 DOM 元素\r\n * ========================================================================\r\n * @method createElement\r\n * @param {String} name\r\n * @param {Object} [options]\r\n * @param {Number|Array} [options.size]\r\n * @param {String} [options.color]\r\n * @param {String} [options.iconSet]\r\n * @param {Object} [options.attrs]\r\n * @returns {HTMLElement}\r\n */\r\nconst createElement = (name, options = {}) => {\r\n const ICON = 'outline-icon'\r\n const size = options.size || 0\r\n const color = options.color || ''\r\n const iconSet = options.iconSet || ''\r\n const width = isArray(size) ? size[0] : size\r\n const height = isArray(size) ? size[1] : size\r\n const defaultRules = size ? `width:${width}px;height:${height}px;` : ''\r\n const cssRules = color ? defaultRules + `color:${color}` : defaultRules\r\n const attrs = options.attrs || {}\r\n const $icon = document.createElement('i')\r\n let binds = ''\r\n let svg = ''\r\n let $svg\r\n\r\n if (!isString(name)) {\r\n return null\r\n }\r\n\r\n if (isSVG(name)) {\r\n svg = name\r\n } else {\r\n binds =\r\n iconSet && iconSet !== 'icon'\r\n ? `xlink:href=\"#${iconSet}-icon-${name}\"`\r\n : `xlink:href=\"#icon-${name}\"`\r\n svg = ``\r\n }\r\n\r\n $icon.innerHTML = svg\r\n\r\n if (attrs.className) {\r\n attrs.className = `${ICON} ${attrs.className}`\r\n } else {\r\n attrs.className = ICON\r\n }\r\n\r\n setAttributes($icon, attrs)\r\n\r\n $svg = $icon.querySelector('svg')\r\n setAttributes($svg, {\r\n 'aria-hidden': true,\r\n xmlns: 'http://www.w3.org/2000/svg',\r\n class: 'outline-icon__svg',\r\n width: 200,\r\n height: 200,\r\n style: cssRules\r\n })\r\n\r\n return $icon\r\n}\r\n\r\nexport default createElement\r\n","import isString from './isString'\r\n\r\nconst isSVG = (str) => {\r\n const declaration = '(?:<\\\\?xml[^>]*>\\\\s*)?'\r\n const doctype =\r\n '(?:<\\\\!doctype svg[^>]*\\\\s*(?:\\\\[?(?:\\\\s*]*>\\\\s*)*\\\\]?)*[^>]*>\\\\s*)?'\r\n const content = ']*>[^]*<\\\\/svg>\\\\s*$'\r\n const svg = `^\\\\s*${declaration}${doctype}${content}\\\\s*$`\r\n const pattern = new RegExp(svg, 'i')\r\n\r\n return isString(str) && pattern.test(str)\r\n}\r\n\r\nexport default isSVG\r\n","import setProperty from './utils/dom/setProperty'\r\n\r\nlet index = 2000\r\n\r\nconst zIndex = (idx) => {\r\n if (idx) {\r\n index = idx\r\n } else {\r\n index += 1\r\n }\r\n\r\n setProperty('--outline-zIndex', `${index}`)\r\n\r\n return index\r\n}\r\n\r\nexport default zIndex\r\n","const setProperty = (prop, value) => {\r\n const documentElement = document.documentElement\r\n documentElement.style.setProperty(prop, value)\r\n}\r\n\r\nexport default setProperty\r\n","import Base from './base'\r\n\r\nimport later from './utils/lang/later'\r\nimport cloneDeep from './utils/lang/cloneDeep'\r\nimport isFunction from './utils/types/isFunction'\r\nimport isDOM from './utils/types/isDOM'\r\nimport isHTML from './utils/types/isHTML'\r\nimport addClass from './utils/dom/addClass'\r\nimport removeClass from './utils/dom/removeClass'\r\nimport html from './utils/dom/html'\r\nimport createElement from './utils/dom/createElement'\r\nimport on from './utils/event/on'\r\nimport off from './utils/event/off'\r\n\r\nimport paint from './utils/icons/paint'\r\nimport icon from './utils/icons/icon'\r\nimport zIndex from './zIndex'\r\n\r\nclass Drawer extends Base {\r\n constructor(options) {\r\n super()\r\n\r\n this._default()\r\n\r\n this.zIndex = 0\r\n\r\n if (options) {\r\n this.initialize(options)\r\n }\r\n }\r\n\r\n _default() {\r\n this.attrs = cloneDeep(Drawer.DEFAULTS)\r\n this.title = ''\r\n this.closed = false\r\n\r\n this.$el = null\r\n this.$modal = null\r\n this.$header = null\r\n this.$title = null\r\n this.$close = null\r\n this.$main = null\r\n this.$footer = null\r\n this.$overlay = null\r\n\r\n return this\r\n }\r\n\r\n initialize(options) {\r\n let created\r\n\r\n this.attr(options)\r\n\r\n this.title = this.attr('title')\r\n created = this.attr('created')\r\n\r\n if (isFunction(created)) {\r\n created.call(this)\r\n }\r\n\r\n this.render().addListeners()\r\n return this\r\n }\r\n\r\n setTitle(title) {\r\n this.attr('title', title)\r\n this.title = title\r\n this.$title.innerHTML = title\r\n\r\n return this\r\n }\r\n\r\n isClosed() {\r\n return this.closed\r\n }\r\n\r\n render() {\r\n const mounted = this.attr('mounted')\r\n const size = this.attr('size')\r\n const placement = this.attr('placement')\r\n const hasClose = this.attr('hasClose')\r\n const hasOverlay = this.attr('hasOverlay')\r\n const hasOffset = this.attr('hasOffset')\r\n const hasPadding = this.attr('hasPadding')\r\n const autoHeight = this.attr('autoHeight')\r\n const overflow = this.attr('overflow')\r\n const customClass = this.attr('customClass')\r\n let mainClassName = 'outline-drawer__main'\r\n let $el\r\n let $modal\r\n let $header\r\n let $title\r\n let $close\r\n let $main\r\n let $footer\r\n let $overlay\r\n\r\n paint()\r\n this.zIndex = zIndex()\r\n\r\n $title = createElement(\r\n 'h2',\r\n {\r\n className: 'outline-drawer__title'\r\n },\r\n this.title\r\n )\r\n this.$title = $title\r\n\r\n if (hasClose) {\r\n $close = createElement(\r\n 'div',\r\n {\r\n className: 'outline-drawer__close'\r\n },\r\n icon('close', { iconSet: 'outline', size: 20 })\r\n )\r\n this.$close = $close\r\n }\r\n\r\n $header = createElement(\r\n 'header',\r\n {\r\n className: 'outline-drawer__header'\r\n },\r\n [$title, $close]\r\n )\r\n this.$header = $header\r\n\r\n if (overflow === 'hidden') {\r\n mainClassName += ' overflow-hidden'\r\n }\r\n\r\n $main = createElement('div', {\r\n className: mainClassName\r\n })\r\n this.$main = $main\r\n\r\n if (!hasPadding) {\r\n addClass($main, 'outline-drawer_full')\r\n }\r\n\r\n $footer = createElement('footer', {\r\n className: 'outline-drawer__footer'\r\n })\r\n this.$footer = $footer\r\n\r\n $modal = createElement(\r\n 'div',\r\n {\r\n className: `outline-drawer__modal outline-drawer_${placement} outline-drawer_${size} outline-drawer_closed`\r\n },\r\n [$header, $main, $footer]\r\n )\r\n this.$modal = $modal\r\n\r\n if (hasOffset) {\r\n addClass($modal, 'outline-drawer_offset')\r\n }\r\n\r\n if (autoHeight) {\r\n addClass($modal, 'outline-drawer_auto')\r\n }\r\n\r\n if (customClass) {\r\n addClass($modal, customClass)\r\n }\r\n\r\n if (hasOverlay) {\r\n $overlay = createElement('div', {\r\n className: 'outline-drawer__overlay'\r\n })\r\n this.$overlay = $overlay\r\n }\r\n\r\n $el = createElement(\r\n 'div',\r\n {\r\n className: `outline-drawer`\r\n },\r\n [$modal, $overlay]\r\n )\r\n this.$el = $el\r\n document.body.appendChild($el)\r\n\r\n if (isFunction(mounted)) {\r\n mounted.call(this)\r\n }\r\n\r\n return this\r\n }\r\n\r\n erase() {\r\n this.$main.innerHTML = ''\r\n return this\r\n }\r\n\r\n _paint(content) {\r\n let $content = null\r\n\r\n if (isFunction(content)) {\r\n $content = content()\r\n } else if (isDOM(content)) {\r\n $content = content\r\n } else if (isHTML(content)) {\r\n $content = html(content)\r\n }\r\n\r\n if ($content) {\r\n this.$main.appendChild($content)\r\n }\r\n\r\n return this\r\n }\r\n\r\n _remove() {\r\n document.body.removeChild(this.$el)\r\n return this\r\n }\r\n\r\n refresh(content) {\r\n this.erase()._paint(content)\r\n return this\r\n }\r\n\r\n open() {\r\n const opened = this.attr('afterOpened')\r\n const $modal = this.$modal\r\n\r\n addClass(this.$el, 'outline-drawer_opened')\r\n removeClass($modal, 'outline-drawer_closed')\r\n addClass($modal, 'outline-drawer_opened')\r\n\r\n later(() => {\r\n this.closed = false\r\n\r\n if (isFunction(opened)) {\r\n opened.call(this)\r\n }\r\n })\r\n\r\n return this\r\n }\r\n\r\n close() {\r\n const closed = this.attr('afterClosed')\r\n const $modal = this.$modal\r\n\r\n removeClass($modal, 'outline-drawer_opened')\r\n addClass($modal, 'outline-drawer_closed')\r\n\r\n later(() => {\r\n removeClass(this.$el, 'outline-drawer_opened')\r\n this.closed = true\r\n\r\n if (isFunction(closed)) {\r\n closed.call(this)\r\n }\r\n })\r\n\r\n return this\r\n }\r\n\r\n toggle() {\r\n const afterToggle = this.attr('afterToggle')\r\n const closed = this.isClosed()\r\n\r\n if (closed) {\r\n this.open()\r\n } else {\r\n this.close()\r\n }\r\n\r\n if (isFunction(afterToggle)) {\r\n later(() => {\r\n afterToggle.call(this, closed)\r\n })\r\n }\r\n\r\n return this\r\n }\r\n\r\n destroy() {\r\n const afterDestroy = this.attr('afterDestroy')\r\n const beforeDestroy = this.attr('beforeDestroy')\r\n let index = this.zIndex\r\n\r\n if (isFunction(beforeDestroy)) {\r\n beforeDestroy.call(this)\r\n }\r\n\r\n this.removeListeners()._remove()._default()\r\n\r\n index -= 1\r\n zIndex(index)\r\n this.zIndex = 0\r\n\r\n if (isFunction(afterDestroy)) {\r\n afterDestroy.call(this)\r\n }\r\n\r\n return this\r\n }\r\n\r\n onClose() {\r\n this.close()\r\n return this\r\n }\r\n\r\n addListeners() {\r\n const hasClose = this.attr('hasClose')\r\n const hasOverlay = this.attr('hasOverlay')\r\n const closeOnClickModal = this.attr('closeOnClickModal')\r\n const $el = this.$el\r\n\r\n if (hasClose) {\r\n on($el, '.outline-drawer__close', 'click', this.onClose, this, true)\r\n }\r\n\r\n if (hasOverlay && closeOnClickModal) {\r\n on($el, '.outline-drawer__overlay', 'click', this.onClose, this, true)\r\n }\r\n\r\n return this\r\n }\r\n\r\n removeListeners() {\r\n const hasClose = this.attr('hasClose')\r\n const hasOverlay = this.attr('hasOverlay')\r\n const $el = this.$el\r\n\r\n if (!hasClose && !hasOverlay) {\r\n return this\r\n }\r\n\r\n off($el, 'click', this.onClose)\r\n\r\n return this\r\n }\r\n}\r\n\r\nDrawer.DEFAULTS = (() => {\r\n const OPTIONS = {\r\n placement: 'rtl',\r\n title: '标题',\r\n size: 'regular',\r\n hasClose: true,\r\n hasOverlay: true,\r\n hasOffset: false,\r\n hasPadding: true,\r\n autoHeight: true,\r\n closeOnClickModal: true,\r\n overflow: 'auto',\r\n created: null,\r\n mounted: null,\r\n afterClosed: null,\r\n afterOpened: null,\r\n afterScroll: null,\r\n beforeDestroy: null,\r\n afterDestroy: null,\r\n afterToggle: null\r\n }\r\n\r\n return cloneDeep(OPTIONS)\r\n})()\r\n\r\nexport default Drawer\r\n","import createElement from './createElement'\r\n\r\n/**\r\n * 创建 SVG 图标 DOM 元素\r\n * ========================================================================\r\n * @method icon\r\n * @alias createElement\r\n * @see createElement\r\n * @param {String} name\r\n * @param {Object} [options]\r\n * @param {Number|Array} [options.size]\r\n * @param {String} [options.color]\r\n * @param {String} [options.iconSet]\r\n * @returns {HTMLElement}\r\n */\r\nconst icon = (name, options = {}) => {\r\n return createElement(name, options)\r\n}\r\n\r\nexport default icon\r\n","import isHTML from '../types/isHTML'\r\nimport isString from '../types/isString'\r\nimport isElement from '../types/isElement'\r\nimport stripScripts from '../lang/stripScripts'\r\nimport createElement from './createElement'\r\n\r\n/**\r\n * 获取或者设置 DOM 元素的 innerHTML 属性值,或者通过 HTML 字符串,创建 DOM 元素\r\n * ========================================================================\r\n * @method html\r\n * @param {HTMLElement|String} el\r\n * @param {String} [strHTML]\r\n * @return {DocumentFragment|null|*}\r\n */\r\nconst html = (el, strHTML) => {\r\n const $fragment = document.createDocumentFragment()\r\n\r\n if (!el || (!isHTML(el) && !isString(el) && !isElement(el))) {\r\n return null\r\n }\r\n\r\n if (isHTML(el)) {\r\n const template = createElement('div')\r\n let children = []\r\n\r\n template.innerHTML = stripScripts(el)\r\n children = [...template.childNodes]\r\n children.forEach((child) => {\r\n $fragment.appendChild(child)\r\n })\r\n\r\n return $fragment\r\n } else if (isString(strHTML)) {\r\n el.innerHTML = stripScripts(strHTML)\r\n } else {\r\n return el.innerHTML\r\n }\r\n}\r\n\r\nexport default html\r\n"],"names":["isString","str","hasOwn","obj","prop","hasOwnProperty","Object","prototype","call","toString","val","apply","isFunction","isObject","o","_subscribers","_hasDirectSubscribersFor","topic","length","has","isDirect","found","position","lastIndexOf","substring","_hasSubscribers","emit","data","async","execute","forEach","subscriber","message","indexOf","callback","context","deliver","setTimeout","guid","uuid","prefix","_removeSubscriber","off","token","keys","subject","execution","j","splice","_removeSubscriberByToken","Base","constructor","options","this","attrs","initialize","attr","render","addListeners","value","origin","source","arguments","extend","refresh","destroy","removeListeners","reload","$emit","event","publish","$on","on","handler","push","subscribe","$off","unsubscribe","later","fn","delay","isArray","Array","cloneDeep","clone","from","assign","key","isElement","nodeName","tagName","nodeType","isDOM","el","isHTMLCollection","fragment","isTextNode","trim","replace","TAGS","isHTML","html","basic","full","slice","RegExp","map","tag","join","test","hasClass","className","pattern","allClass","classList","contains","exec","addClass","_classList","add","split","name","removeClass","remove","stripScripts","setAttributes","setAttribute","toLowerCase","style","cssText","innerHTML","innerText","createElement","children","$fragment","document","createDocumentFragment","$el","isValidChild","child","append","$child","createTextNode","appendChild","every","matches","selector","sel","msMatchesSelector","getParentOrHost","host","parentNode","CAPTURE_EVENTS","_off","type","capture","_delegateListener","listeners","_listeners","index","listener","i","_delete","removeEventListener","purgeElement","recurse","$element","querySelector","$children","childNodes","getListeners","filter","once","evt","target","getTarget","delegateTarget","closest","ctx","includeCTX","startsWith","overrideContext","addEventListener","SYMBOLS","_maybeArrayLike","_toConsumableArray","getSymbols","iconSet","getSymbol","patternName","patternSet","find","symbol","fullName","paint","$body","body","$icons","symbols","insertBefore","firstChild","ICON","size","color","width","height","defaultRules","cssRules","$icon","$svg","binds","svg","isSVG","xmlns","class","zIndex","idx","setProperty","documentElement","Drawer","super","_default","DEFAULTS","title","closed","$modal","$header","$title","$close","$main","$footer","$overlay","created","setTitle","isClosed","mounted","placement","hasClose","hasOverlay","hasOffset","hasPadding","autoHeight","overflow","customClass","mainClassName","icon","erase","_paint","content","$content","strHTML","template","_remove","removeChild","open","opened","close","toggle","afterToggle","afterDestroy","beforeDestroy","onClose","closeOnClickModal","afterClosed","afterOpened","afterScroll"],"mappings":"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EAAO,CACX,IACA,OACA,UACA,OACA,UACA,QACA,QACA,IACA,OACA,MACA,MACA,aACA,OACA,KACA,SACA,SACA,UACA,OACA,OACA,MACA,WACA,OACA,WACA,KACA,MACA,UACA,MACA,SACA,MACA,KACA,KACA,KACA,QACA,WACA,aACA,SACA,SACA,OACA,KACA,KACA,KACA,KACA,KACA,KACA,OACA,SACA,SACA,KACA,OACA,IACA,SACA,MACA,QACA,MACA,MACA,QACA,SACA,KACA,OACA,OACA,MACA,OACA,OACA,OACA,WACA,OACA,QACA,MACA,WACA,SACA,KACA,WACA,SACA,SACA,IACA,QACA,UACA,MACA,WACA,IACA,KACA,KACA,KACA,MACA,OACA,IACA,OACA,SACA,SACA,UACA,SACA,OACA,QACA,SACA,OACA,SACA,QACA,MACA,UACA,MACA,MACA,QACA,QACA,KACA,WACA,WACA,QACA,KACA,QACA,OACA,QACA,KACA,QACA,IACA,KACA,MACA,QACA,OCzGIC,EAAUnG,IACd,IAAIoG,EACAC,EACAC,EAEJ,QAAKvG,EAASC,KAKdoG,EAAOJ,EAAKhG,GAAKuG,MAAM,EAAG,KAC1BF,EAAQ,4DACRC,EAAO,IAAIE,OAAON,EAAKO,KAAKC,GAAQ,IAAIA,eAAgBC,KAAK,KAAM,KAE5DN,EAAMO,KAAKR,IAASE,EAAKM,KAAKR,GAAK,ECnBtCS,EAAWA,CAACjB,EAAIkB,KACpB,MAAMC,EAAU,IAAIP,OAAO,UAAYM,EAAY,WACnD,IAAIE,EACAC,EAEJ,QAAK1B,EAAUK,KAIfoB,EAAWpB,EAAGkB,YAETE,IAILC,EAAYrB,EAAGqB,UAEXA,GAAaA,EAAUC,SAClBtB,EAAGqB,UAAUC,SAASJ,KAGtBC,EAAQI,KAAKH,IAAS,ECpB3BI,EAAWA,CAACxB,EAAIkB,KAAc,IAAAO,EAClC,IAAIJ,EACAD,EAEJ,GAAIH,EAASjB,EAAIkB,GACf,OAAO,EAGTG,EAAYrB,EAAGqB,UAEF,QAAbI,EAAIJ,SAAAI,IAASA,GAATA,EAAWC,IACTR,EAAU9E,QAAQ,MAAQ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"} \ No newline at end of file diff --git a/docs/js/message.min.js b/docs/js/message.min.js deleted file mode 100644 index 164f7aff..00000000 --- a/docs/js/message.min.js +++ /dev/null @@ -1,2 +0,0 @@ -!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e="undefined"!=typeof globalThis?globalThis:e||self).Message=t()}(this,(function(){"use strict";function e(e,t){(null==t||t>e.length)&&(t=e.length);for(var s=0,r=Array(t);s"string"==typeof e,n=e=>Object.prototype.toString.apply(e),l=e=>"function"==typeof e||"[object Function]"===n(e),c=e=>("[object Object]"===n(e)||"object"==typeof e||l(e))&&null!==e,a=e=>{const t=Object.getPrototypeOf;let s;if(!(e=>c(e)&&null!==e)(e))return!1;if(s=e.prototype,!s)return!0;for(s=e;null!==t(s);)s=t(s);return t(e)===s},h=(e,t)=>{const s=Object.prototype.hasOwnProperty;return e&&s.call(e,t)},u=(e,t)=>{Object.keys(t).forEach((s=>{h(t,s)&&(e[s]=t[s])}))},d=(e,t=300)=>!!l(e)&&setTimeout((()=>{e()}),t),f=e=>e.replace(/]*>.*?<\/script>/gi,""),m=e=>{const t={"&":"&","<":"<",">":">","'":"'",'"':"""};return e.replace(/[&<>'"]/g,(e=>t[e]||e))},p=e=>Array.isArray?Array.isArray(e):"[object Array]"===n(e),y=e=>{let t={};return null===e?null:(p(e)?t=Array.from(e):(t=Object.assign({},e),Object.keys(t).forEach((s=>t[s]=c(e[s])?y(e[s]):e[s]))),t)},b=(()=>{let e=0;return t=>(e+=1,t?t+"-"+e:"guid-"+e)})(),g=e=>!!(c(e)&&e.nodeName&&e.tagName&&1===e.nodeType),v=e=>{return!(!c(e)||!(g(e)||(e=>!(!c(e)||"[object NodeList]"!==n(e)))(e)||(t=e,c(t)&&"[object DocumentFragment]"===n(t))||(e=>!(!c(e)||!("[object Text]"===n(e)||e.tagName&&3===e.nodeType)))(e)));var t},M=(e,t)=>{const s=new RegExp("(\\s|^)"+t+"(\\s|$)");let r,i;return!!g(e)&&(r=e.className,!!r&&(i=e.classList,i&&i.contains?e.classList.contains(t):!!s.exec(r)))},z=(e,t)=>{var s;let r,i;if(M(e,t))return!1;r=e.classList,null!==(s=r)&&void 0!==s&&s.add?t.indexOf(" ")>-1?t.split(" ").forEach((e=>{r.add(e)})):r.add(t):(i=e.className,i+=i.length>0?" "+t:t,e.className=i)},x=(e,t,s)=>{let r=e.tagName.toLowerCase();switch(t){case"style":e.style.cssText=s;break;case"value":"input"===r||"textarea"===r?e.value=s:e.setAttribute(t,s);break;case"htmlFor":e.setAttribute("for",s);break;case"className":z(e,s);break;case"innerHTML":e.innerHTML=s;break;case"innerText":e.innerText=s;break;default:e.setAttribute(t,s)}},w=(e,t)=>{if(!e||!c(t))return!1;Object.keys(t).forEach((s=>{const r=t[s];h(t,s)&&x(e,s,r)}))},$=(e,t,s)=>{const r=document.createDocumentFragment(),i=document.createElement(e),n=e=>v(e)||o(e),l=e=>{let t;if(!n(e))return!1;v(e)?t=e:o(e)&&(t=document.createTextNode(e)),r.appendChild(t)};return c(t)?w(i,t):p(t)&&t.every((e=>n(e)))?t.forEach((e=>{l(e)})):v(t)?l(t):o(t)&&l(document.createTextNode(t)),p(s)?s.forEach((e=>{l(e)})):l(s),i.appendChild(r),i},_=(e,t)=>{var s;let r,i=e.className;if(!i||!M(e,t))return!1;var n;r=e.classList,null!==(s=r)&&void 0!==s&&s.remove?r.remove(t):(n=i.replace(t,""),i=!!o(n)&&n.replace(/(^\s+)|(\s+$)/g,""),e.className=i)},L=(e,t={})=>{const s="outline-icon",r=t.size||0,i=t.color||"",n=t.iconSet||"",l=p(r)?r[0]:r,c=p(r)?r[1]:r,a=r?`width:${l}px;height:${c}px;`:"",h=i?a+`color:${i}`:a,u=t.attrs||{},d=document.createElement("i");let f,m="",y="";return o(e)?((e=>{const t=new RegExp("^\\s*(?:<\\?xml[^>]*>\\s*)?(?:<\\!doctype svg[^>]*\\s*(?:\\[?(?:\\s*]*>\\s*)*\\]?)*[^>]*>\\s*)?]*>[^]*<\\/svg>\\s*$\\s*$","i");return o(e)&&t.test(e)})(e)?y=e:(m=n&&"icon"!==n?`xlink:href="#${n}-icon-${e}"`:`xlink:href="#icon-${e}"`,y=``),d.innerHTML=y,u.className?u.className=`${s} ${u.className}`:u.className=s,w(d,u),f=d.querySelector("svg"),w(f,{"aria-hidden":!0,xmlns:"http://www.w3.org/2000/svg",class:"outline-icon__svg",width:200,height:200,style:h}),d):null},j=(e,t={})=>L(e,t),T=s(i,['','','','','','','','','','','','','','','','','','','','']),O=(e,t="icon")=>o(e)?((e,t="icon")=>{const s=/id="(.*?)"/,r=/^(\w+)-/;return T.find((i=>{const o=s.exec(i)[1];return r.exec(o)[1]===t&&o===("icon"===t?`${t}-${e}`:`${t}-icon-${e}`)}))})(e,t):s(i,T),A=(e,t="")=>{const s=t.replace(/^>/i,"");return!!(t&&s&&e)&&(e.matches?e.matches(s):!!e.msMatchesSelector&&e.msMatchesSelector(s))},C=e=>e.host&&e!==document&&e.host.nodeType?e.host:e.parentNode,S=["focusout","blur","focusin","focus","load","unload","mouseenter","mouseleave"],E=(e,t,s)=>{const r=S.indexOf(t)>-1;s._delegateListener&&delete(s=s._delegateListener)._delegateListener,function(e,t,s){const r=e._listeners;let i=-1;if(r.length<1)return!1;r.forEach(((e,r)=>{const o=e.fn;t===e.type&&(i=r,o===s&&(i=r))})),i>-1&&r.splice(i,1)}(e,t,s),e.removeEventListener(t,s,r)},N=function(e,t,s=!1){const r=o(e)?document.querySelector(e):e,i=r.childNodes,n=((e,t)=>{let s=e._listeners||[];return o(t)&&t&&(s=s.filter((e=>e.type===t))),s})(r,t);n.forEach((e=>{E(r,e.type,e.fn)})),(s||!0===t||1===arguments.length)&&r&&i&&i.forEach((e=>{g(e)&&N(e,t,s)}))},B=(e,t,s)=>{if(!l(s))return N(e,t),!1;E(e,t,s)},H=(e,t,s,r,i,o,n=!1)=>{const l=S.indexOf(s)>-1,c=function(l){const a=function(e){const t=e.target;return(s=t)&&3===s.nodeType?s.parentNode:s;var s}(l),h=((e,t,s,r)=>{const i=s||document;if(!e)return null;do{if(null!=t&&(t.startsWith(">")?e.parentNode===i&&A(e,t):A(e,t))||r&&e===i)return e;if(e===i)break}while(e=C(e))})(a,t,e);let u=o||e;l.delegateTarget=h,!0===o&&(u=i),h&&(!0===n&&B(e,s,c),r.call(u,l,i))};if(!e)return!1;e._listeners||(e._listeners=[]),e._listeners.push({el:e,selector:t,type:s,fn:c,data:i,context:o,capture:l}),r._delegateListener=c,e.addEventListener(s,c,l)},k={},D=e=>h(k,e)&&k[e].length>0,I=(e,t=!0)=>t?D(e):(e=>{let t=D(e),s=e.lastIndexOf(".");for(;!t&&-1!==s;)s=(e=e.substring(0,s)).lastIndexOf("."),t=D(e);return t})(e),P=(e,t,s=!0)=>{const r=e=>{if(!D(e))return!1;k[e].forEach((e=>{const s=["[object Int8Array]","[object Uint8Array]","[object Uint8ClampedArray]","[object Int16Array]","[object Uint16Array]","[object Int32Array]","[object Uint32Array]","[object Float32Array]","[object Float64Array]","[object BigInt64Array]","[object BigUint64Array]"].indexOf(n(t))>-1?t.toString():t;e.callback.call(e.context||e,s)}))},i=()=>{let t=e,s=e.lastIndexOf(".");for(;-1!==s;)t=t.substring(0,s),s=t.lastIndexOf("."),r(t);r(e),r("*")};if(!I(e))return!1;s?setTimeout(i,10):i()},q=e=>{if(!h(k,e))return!1;delete k[e]},U=(e,t)=>{if(!I(e))return!1;t?(e=>{const t=Object.keys(k);if(!e||t.length<1)return!1;t.forEach((t=>{const s=k[t];let r;s.forEach(((t,i)=>{t.callback!==e&&t.token!==e||(r=t.topic,s.splice(-1,i))})),s.length<1&&q(r)}))})(t):q(e)};class V{constructor(e){this.attrs={},e&&this.initialize(e)}initialize(e){return this.attr(e).render().addListeners(),this}attr(e,t){const s=this.attrs;return o(e)?t&&h(s,e)?(s[e]=t,this):s[e]:c(e)?(u(s,e),this):0===arguments.length?s:this}render(){return this}refresh(){return this}destroy(){return this.removeListeners(),this}reload(e){let t=this.attr();return e&&(t=this.attr(e)),this.destroy().initialize(t),this}$emit(e,t){return P(e,t),this}$on(e,t){return((e,t,s=null)=>{const r=b();let i="symbol"==typeof e?e.toString():e;l(t)&&(k[i]||(k[i]=[]),k[i].push({topic:i,callback:t,context:s,token:r}))})(e,t,this),this}$off(e,t){return U(e,t),this}addListeners(){return this}removeListeners(){return this}}const F=[];let R;((e="")=>{const t=document.body;let s=document.querySelector("#outline-icons"),r=[];(e=>{if(!e)return!1;p(e)&&e.length>0?e.forEach((e=>{-1===T.indexOf(e)&&o(e)&&T.push(e)})):o(e)&&T.push(e)})(e),r=O(),s?s.innerHTML=r.join(""):(s=document.createElement("div"),s.innerHTML=``,t.insertBefore(s.firstChild,t.firstChild))})();class W extends V{constructor(e){super(),this._default(),e&&this.initialize(e)}_default(){return this.attrs=y(W.DEFAULTS),this.$el=null,this.id="",this.closed=!1,this.visible=!1,this.offset=-50,this.timer=null,this.destroyed=!1,this}initialize(e){return this.attr(e),this.id=this.attr("id"),this.offset=this.attr("offset")||-50,this.$emit("created",function(e){for(var s=1;s{this.$emit("opened"),this.close()}),1e3*e)),this}open(e){const t=this.$el;let s,r,i,o;return this.isDestroyed()||(this.isClosed()&&this.refresh(e),s=this.attr("offset"),r=this.attr("duration"),i=s&&s>=this.offset?s:this.offset,o=`top:${i}px;`,this.clearTimer(),this.$emit("beforeOpen"),d((()=>{this.visible=!0,z(t,"outline-message_visible"),t.style.cssText=o,r>0&&this.startTimer(r)}),100)),this}close(){const e=this.$el;let t,s;return this.isDestroyed()||(t=this.attr("destroyAfterClosed"),s=this.attr("beforeClose"),l(s)&&s.call(this),e.style.cssText="top:-50px;",_(e,"outline-message_visible"),this.visible=!1,this.closed=!0,d((()=>{this.$emit("closed"),t&&this.destroy()}),500)),this}destroy(){return this.$emit("beforeDestroy"),this.isDestroyed()||(this.removeListeners(),document.body.removeChild(this.$el),clearTimeout(this.timer),this._default(),this.$emit("afterDestroy")),this}onMouseEnter(){return this.clearTimer(),this}onMouseLeave(){const e=this.attr("duration"),t=this.attr("delay");return e<=0||this.startTimer(t),this}onClose(){return this.clearTimer(),this.close(),this}addListeners(){const e=this.$el;return H(e,".outline-message__content","mouseenter",this.onMouseEnter,this,!0),H(e,".outline-message__content","mouseleave",this.onMouseLeave,this,!0),H(e,".outline-message__close","click",this.onClose,this,!0),this}removeListeners(){const e=this.$el;return B(e,"mouseenter",this.onMouseEnter),B(e,"mouseleave",this.onMouseLeave),B(e,"click",this.onClose),this}}return W.DEFAULTS=y({id:"",type:"info",effect:"default",round:!1,offset:30,duration:3,delay:2,message:"",customClass:"",closable:!0,visible:!0,dangerouslyUseHTMLString:!1,destroyAfterClosed:!0,beforeClose:null}),["info","success","warning","error"].forEach((e=>{W[e]=t=>{const s={},r=b("outline-message-"),i=t.beforeClose||null;let n=t.offset||30;return o(t)?s.message=t:a(t)&&u(s,t),s.id=r,s.type=e,s.offset=n,s.visible=!1,s.beforeClose=()=>{W.close(r,i)},R=new W(s),F.forEach((e=>{n+=e.$el.offsetHeight+16})),R.offset=n,R.open(),F.push(R),R}})),W.close=(e,t)=>{const s=F.length;let r,i,o=-1;if(F.forEach(((s,r)=>{e===s.id&&(i=s.$el.offsetHeight,o=r,l(t)&&t.call(s),F.splice(r,1))})),s<=1||-1===o||o>F.length-1)return!1;for(r=o;r{let e=F.length-1;for(;e>=0;e-=1)F[e].close()},W})); -//# sourceMappingURL=message.min.js.map diff --git a/docs/js/message.min.js.map b/docs/js/message.min.js.map deleted file mode 100644 index 954ad9b7..00000000 --- a/docs/js/message.min.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"message.min.js","sources":["../../utils/types/isString.js","../../utils/lang/toString.js","../../utils/types/isFunction.js","../../utils/types/isObject.js","../../utils/types/isPlainObject.js","../../utils/types/isObjectLike.js","../../utils/lang/hasOwn.js","../../utils/lang/extend.js","../../utils/lang/later.js","../../utils/lang/stripScripts.js","../../utils/lang/encodeHTML.js","../../utils/types/isArray.js","../../utils/lang/cloneDeep.js","../../utils/lang/guid.js","../../utils/types/isElement.js","../../utils/types/isDOM.js","../../utils/types/isHTMLCollection.js","../../utils/types/isFragment.js","../../utils/types/isTextNode.js","../../utils/dom/hasClass.js","../../utils/dom/addClass.js","../../utils/dom/setAttribute.js","../../utils/dom/setAttributes.js","../../utils/dom/createElement.js","../../utils/dom/removeClass.js","../../utils/lang/trim.js","../../utils/icons/createElement.js","../../utils/types/isSVG.js","../../utils/icons/icon.js","../../utils/icons/symbols.js","../../utils/icons/defaults.js","../../utils/icons/getSymbols.js","../../utils/icons/getSymbol.js","../../utils/dom/matches.js","../../utils/dom/getParentOrHost.js","../../utils/event/enum.js","../../utils/event/_off.js","../../utils/event/_delete.js","../../utils/event/purgeElement.js","../../utils/event/getListeners.js","../../utils/event/off.js","../../utils/event/on.js","../../utils/event/getTarget.js","../../utils/dom/resolveTextNode.js","../../utils/dom/closest.js","../../utils/observer/_subscribers.js","../../utils/observer/_hasDirectSubscribersFor.js","../../utils/observer/has.js","../../utils/observer/_hasSubscribers.js","../../utils/observer/emit.js","../../utils/types/isTypedArray.js","../../utils/observer/_removeSubscriber.js","../../utils/observer/off.js","../../utils/observer/_removeSubscriberByToken.js","../../base.js","../../utils/observer/on.js","../../message.js","../../utils/icons/paint.js","../../utils/icons/add.js"],"sourcesContent":["/**\r\n * 检测数据是否为 String 类型\r\n * ========================================================================\r\n * @method isArray\r\n * @param {*} str\r\n * @returns {boolean}\r\n */\r\nconst isString = (str) => {\r\n return typeof str === 'string'\r\n}\r\n\r\nexport default isString\r\n","/**\r\n * Object 对象原型上的 toString 方法\r\n * ========================================================================\r\n * @method toString\r\n * @param {*} val\r\n * @returns {string}\r\n */\r\nconst toString = (val) => {\r\n return Object.prototype.toString.apply(val)\r\n}\r\n\r\nexport default toString\r\n","import toString from '../lang/toString'\r\n\r\n/**\r\n * 检测测试数据是否为 Function 类型\r\n * ========================================================================\r\n * @method isFunction\r\n * @param {*} val - (必须)待检测的数据\r\n * @returns {boolean} 'val' 是 Function 类型返回 true,否则返回 false\r\n */\r\nconst isFunction = (val) => {\r\n return typeof val === 'function' || toString(val) === '[object Function]'\r\n}\r\n\r\nexport default isFunction\r\n","import toString from '../lang/toString'\r\nimport isFunction from './isFunction'\r\n\r\n/**\r\n * 检测数据是否为 Object 类型\r\n * ========================================================================\r\n * @method isObject\r\n * @param {*} o\r\n * @returns {boolean}\r\n */\r\nconst isObject = (o) => {\r\n return (\r\n (toString(o) === '[object Object]' ||\r\n typeof o === 'object' ||\r\n isFunction(o)) &&\r\n o !== null\r\n )\r\n}\r\n\r\nexport default isObject\r\n","import isObjectLike from './isObjectLike'\r\n\r\n/**\r\n * 检测测试数据是否为普通对象\r\n * ========================================================================\r\n * @method isPlainObject\r\n * @param {Object} val - 要检测的数据\r\n * @returns {Boolean} 'val' 是普通对象,返回 true,否则返回 false\r\n */\r\nconst isPlainObject = (val) => {\r\n const getPrototypeOf = Object.getPrototypeOf\r\n let proto\r\n\r\n // Detect obvious negatives\r\n if (!isObjectLike(val)) {\r\n return false\r\n }\r\n\r\n proto = val.prototype\r\n\r\n // JavaScript 对象分为两种:普通对象和函数对象\r\n // 普通对象:原型是 __proto__,没有 prototype 原型(属性)\r\n // 函数对象:原型是 prototype ,prototype 只存在于函数对象上\r\n if (!proto) {\r\n return true\r\n }\r\n\r\n proto = val\r\n\r\n while (getPrototypeOf(proto) !== null) {\r\n proto = getPrototypeOf(proto)\r\n }\r\n\r\n return getPrototypeOf(val) === proto\r\n}\r\n\r\nexport default isPlainObject\r\n","import isObject from './isObject'\r\n\r\n/**\r\n * 检测测试数据是否为类似 Object 类型\r\n * ========================================================================\r\n * @method isObjectLike\r\n * @param {Object} val - 要检测的数据\r\n * @returns {Boolean} 'val' 是类似 Object 类型,返回 true,否则返回 false\r\n */\r\nconst isObjectLike = (val) => {\r\n return isObject(val) && val !== null\r\n}\r\n\r\nexport default isObjectLike\r\n","/**\r\n * 检测对象自身属性中是否具有指定的属性。\r\n * ========================================================================\r\n * @method hasOwn\r\n * @param {Object} obj - (必须)检测的目标对象\r\n * @param {String} prop - (必须)属性名\r\n * @returns {Boolean}\r\n */\r\nconst hasOwn = (obj, prop) => {\r\n const hasOwnProperty = Object.prototype.hasOwnProperty\r\n return obj && hasOwnProperty.call(obj, prop)\r\n}\r\n\r\nexport default hasOwn\r\n","import hasOwn from './hasOwn'\r\n\r\n/**\r\n * 扩展对象\r\n * ========================================================================\r\n * @method extend\r\n * @param {Object} origin\r\n * @param {Object} source\r\n */\r\nconst extend = (origin, source) => {\r\n const keys = Object.keys(source)\r\n\r\n keys.forEach((prop) => {\r\n if (hasOwn(source, prop)) {\r\n origin[prop] = source[prop]\r\n }\r\n })\r\n}\r\n\r\nexport default extend\r\n","import isFunction from '../types/isFunction'\r\n\r\n/**\r\n * later - 延迟执行方法\r\n * ========================================================================\r\n * @method later\r\n * @param {Function} fn\r\n * @param {Number} [delay]\r\n * @returns {number|boolean}\r\n */\r\nconst later = (fn, delay = 300) => {\r\n if (!isFunction(fn)) {\r\n return false\r\n }\r\n\r\n return setTimeout(() => {\r\n fn()\r\n }, delay)\r\n}\r\n\r\nexport default later\r\n","/**\r\n * 移除字符串中的 JavaScript 代码\r\n * ====================================================\r\n * @param {String} str\r\n * @returns {String}\r\n */\r\nconst stripScripts = (str) => {\r\n return str.replace(/]*>.*?<\\/script>/gi, '')\r\n}\r\n\r\nexport default stripScripts\r\n","/**\r\n * 转义字符串中的 HTML 标签\r\n * ========================================================================\r\n * @param {String} str - 需要转义的字符串\r\n * @returns {String}\r\n */\r\nconst encodeHTML = (str) => {\r\n const CHARTS = {\r\n '&': '&',\r\n '<': '<',\r\n '>': '>',\r\n \"'\": ''',\r\n '\"': '"'\r\n }\r\n\r\n return str.replace(/[&<>'\"]/g, (tag) => {\r\n return CHARTS[tag] || tag\r\n })\r\n}\r\n\r\nexport default encodeHTML\r\n","import toString from '../lang/toString'\r\n\r\n/**\r\n * 检测数据是否为 Array 类型\r\n * ========================================================================\r\n * @method isArray\r\n * @param {*} o\r\n * @returns {boolean}\r\n */\r\nconst isArray = (o) => {\r\n if (Array.isArray) {\r\n return Array.isArray(o)\r\n } else {\r\n return toString(o) === '[object Array]'\r\n }\r\n}\r\n\r\nexport default isArray\r\n","import isObject from '../types/isObject'\r\nimport isArray from '../types/isArray'\r\n\r\n/**\r\n * 深拷贝对象函数\r\n * ========================================================================\r\n * @methods cloneDeep\r\n * @param {Object} obj - 深拷贝的对象\r\n * @returns {Array|Object|*}\r\n *\r\n * @example\r\n * const arr = cloneDeep([2,3,4,6])\r\n * => [2,3,4,6]\r\n */\r\nconst cloneDeep = (obj) => {\r\n let clone = {}\r\n\r\n if (obj === null) {\r\n return null\r\n }\r\n\r\n if (isArray(obj)) {\r\n clone = Array.from(obj)\r\n } else {\r\n clone = Object.assign({}, obj)\r\n Object.keys(clone).forEach((key) => {\r\n return (clone[key] = isObject(obj[key]) ? cloneDeep(obj[key]) : obj[key])\r\n })\r\n }\r\n\r\n return clone\r\n}\r\n\r\nexport default cloneDeep\r\n","/**\r\n * 生成唯一 id 字符串的函数\r\n * ========================================================================\r\n * @method guid\r\n * @param {String} [prefix] - 生成 id 的前缀字符串\r\n * @return {String} 返回一个表示唯一 id 的字符串\r\n */\r\nconst guid = (() => {\r\n let uuid = 0\r\n\r\n return (prefix) => {\r\n uuid += 1\r\n\r\n return prefix ? prefix + '-' + uuid : 'guid-' + uuid\r\n }\r\n})()\r\n\r\nexport default guid\r\n","import isObject from './isObject'\r\n\r\n/**\r\n * 检测数据是否为 HTMLElement DOM 节点\r\n * ========================================================================\r\n * @method isElement\r\n * @param {*} o\r\n * @returns {boolean}\r\n */\r\nconst isElement = (o) => {\r\n return !!(isObject(o) && o.nodeName && o.tagName && o.nodeType === 1)\r\n}\r\n\r\nexport default isElement\r\n","import isObject from './isObject'\r\nimport isElement from './isElement'\r\nimport isHTMLCollection from './isHTMLCollection'\r\nimport isFragment from './isFragment'\r\nimport isTextNode from './isTextNode'\r\n\r\nconst isDOM = (el) => {\r\n return !!(\r\n isObject(el) &&\r\n (isElement(el) || isHTMLCollection(el) || isFragment(el) || isTextNode(el))\r\n )\r\n}\r\n\r\nexport default isDOM\r\n","import toString from '../lang/toString'\r\nimport isObject from './isObject'\r\n\r\nconst isHTMLCollection = (el) => {\r\n return !!(isObject(el) && toString(el) === '[object NodeList]')\r\n}\r\n\r\nexport default isHTMLCollection\r\n","import toString from '../lang/toString'\r\nimport isObject from './isObject'\r\n\r\nconst isFragment = (fragment) => {\r\n return !!(\r\n isObject(fragment) && toString(fragment) === '[object DocumentFragment]'\r\n )\r\n}\r\n\r\nexport default isFragment\r\n","import toString from '../lang/toString'\r\nimport isObject from './isObject'\r\n\r\nconst isTextNode = (el) => {\r\n return !!(\r\n isObject(el) &&\r\n (toString(el) === '[object Text]' || (el.tagName && el.nodeType === 3))\r\n )\r\n}\r\n\r\nexport default isTextNode\r\n","import isElement from '../types/isElement'\r\n/**\r\n * 检测 DOM 节点是否包含名为 className 的样式\r\n * ========================================================================\r\n * @method hasClass\r\n * @param {HTMLElement} el - DOM 节点\r\n * @param {String} className - 样式名称\r\n * @returns {Boolean}\r\n */\r\nconst hasClass = (el, className) => {\r\n const pattern = new RegExp('(\\\\s|^)' + className + '(\\\\s|$)')\r\n let allClass\r\n let classList\r\n\r\n if (!isElement(el)) {\r\n return false\r\n }\r\n\r\n allClass = el.className\r\n\r\n if (!allClass) {\r\n return false\r\n }\r\n\r\n classList = el.classList\r\n\r\n if (classList && classList.contains) {\r\n return el.classList.contains(className)\r\n }\r\n\r\n return !!pattern.exec(allClass)\r\n}\r\n\r\nexport default hasClass\r\n","import hasClass from './hasClass'\r\n\r\n/**\r\n * 给 DOM 节点添加名为 className 的样式\r\n * ========================================================================\r\n * @method addClass\r\n * @param {HTMLElement} el - DOM 节点\r\n * @param {String} className - 样式名称\r\n * @returns {Boolean}\r\n */\r\nconst addClass = (el, className) => {\r\n let classList\r\n let allClass\r\n\r\n if (hasClass(el, className)) {\r\n return false\r\n }\r\n\r\n classList = el.classList\r\n\r\n if (classList?.add) {\r\n if (className.indexOf(' ') > -1) {\r\n className.split(' ').forEach((name) => {\r\n classList.add(name)\r\n })\r\n } else {\r\n classList.add(className)\r\n }\r\n } else {\r\n allClass = el.className\r\n allClass += allClass.length > 0 ? ' ' + className : className\r\n el.className = allClass\r\n }\r\n}\r\n\r\nexport default addClass\r\n","import addClass from './addClass.js'\r\n\r\n/**\r\n * 给 DOM 节点设置属性/值\r\n * ========================================================================\r\n * @method setAttribute\r\n * @param {HTMLElement} el - DOM 节点\r\n * @param {String} attr - 属性名称\r\n * @param {String|Number|Boolean} value - 属性值\r\n */\r\nconst setAttribute = (el, attr, value) => {\r\n let tagName = el.tagName.toLowerCase()\r\n\r\n switch (attr) {\r\n case 'style':\r\n el.style.cssText = value\r\n break\r\n case 'value':\r\n if (tagName === 'input' || tagName === 'textarea') {\r\n el.value = value\r\n } else {\r\n el.setAttribute(attr, value)\r\n }\r\n break\r\n case 'htmlFor':\r\n el.setAttribute('for', value)\r\n break\r\n case 'className':\r\n addClass(el, value)\r\n break\r\n case 'innerHTML':\r\n el.innerHTML = value\r\n break\r\n case 'innerText':\r\n el.innerText = value\r\n break\r\n default:\r\n el.setAttribute(attr, value)\r\n break\r\n }\r\n}\r\n\r\nexport default setAttribute\r\n","import isObject from '../types/isObject'\r\nimport hasOwn from '../lang/hasOwn'\r\nimport setAttribute from './setAttribute'\r\n\r\nconst setAttributes = (el, attrs) => {\r\n if (!el || !isObject(attrs)) {\r\n return false\r\n }\r\n\r\n Object.keys(attrs).forEach((attr) => {\r\n const value = attrs[attr]\r\n if (hasOwn(attrs, attr)) {\r\n setAttribute(el, attr, value)\r\n }\r\n })\r\n}\r\n\r\nexport default setAttributes\r\n","import isObject from '../types/isObject'\r\nimport isString from '../types/isString'\r\nimport isArray from '../types/isArray'\r\nimport isDOM from '../types/isDOM'\r\nimport setAttributes from './setAttributes'\r\n\r\n/**\r\n * 创建 DOM 节点,并添加属性和子节点\r\n * ========================================================================\r\n * @method createElement\r\n * @param {String} tagName - 标签名称\r\n * @param {Object|Array|HTMLElement|DocumentFragment|String} attrs - 属性对象或者子节点\r\n * @param {Array|HTMLElement|DocumentFragment|String} [children] - 子节点数组\r\n * @returns {HTMLElement}\r\n */\r\nconst createElement = (tagName, attrs, children) => {\r\n const $fragment = document.createDocumentFragment()\r\n const $el = document.createElement(tagName)\r\n const isValidChild = (child) => {\r\n return isDOM(child) || isString(child)\r\n }\r\n const append = (child) => {\r\n let $child\r\n\r\n if (!isValidChild(child)) {\r\n return false\r\n }\r\n\r\n if (isDOM(child)) {\r\n $child = child\r\n } else if (isString(child)) {\r\n $child = document.createTextNode(child)\r\n }\r\n\r\n $fragment.appendChild($child)\r\n }\r\n\r\n if (isObject(attrs)) {\r\n setAttributes($el, attrs)\r\n } else if (isArray(attrs) && attrs.every((attr) => isValidChild(attr))) {\r\n attrs.forEach((child) => {\r\n append(child)\r\n })\r\n } else if (isDOM(attrs)) {\r\n append(attrs)\r\n } else if (isString(attrs)) {\r\n append(document.createTextNode(attrs))\r\n }\r\n\r\n if (isArray(children)) {\r\n children.forEach((child) => {\r\n append(child)\r\n })\r\n } else {\r\n append(children)\r\n }\r\n\r\n $el.appendChild($fragment)\r\n\r\n return $el\r\n}\r\n\r\nexport default createElement\r\n","import trim from '../lang/trim'\r\nimport hasClass from './hasClass'\r\n\r\n/**\r\n * 移除 DOM 节点的 className 样式\r\n * ========================================================================\r\n * @method removeClass\r\n * @param {HTMLElement} el - DOM 节点\r\n * @param {String} className - 样式名称\r\n * @returns {Boolean}\r\n */\r\nconst removeClass = (el, className) => {\r\n let allClass = el.className\r\n let classList\r\n\r\n if (!allClass || !hasClass(el, className)) {\r\n return false\r\n }\r\n\r\n classList = el.classList\r\n\r\n if (classList?.remove) {\r\n classList.remove(className)\r\n } else {\r\n allClass = trim(allClass.replace(className, ''))\r\n el.className = allClass\r\n }\r\n}\r\n\r\nexport default removeClass\r\n","import isString from '../types/isString'\r\n\r\n/**\r\n * 清楚字符串起始位置所有的空格\r\n * ========================================================================\r\n * @method trim\r\n * @param {string} str\r\n * @returns {string|Boolean}\r\n */\r\nconst trim = (str) => {\r\n if (!isString(str)) {\r\n return false\r\n }\r\n return str.replace(/(^\\s+)|(\\s+$)/g, '')\r\n}\r\n\r\nexport default trim\r\n","import isArray from '../types/isArray'\r\nimport isString from '../types/isString'\r\nimport isSVG from '../types/isSVG'\r\nimport setAttributes from '../dom/setAttributes'\r\n\r\n/**\r\n * 创建 SVG 图标 DOM 元素\r\n * ========================================================================\r\n * @method createElement\r\n * @param {String} name\r\n * @param {Object} [options]\r\n * @param {Number|Array} [options.size]\r\n * @param {String} [options.color]\r\n * @param {String} [options.iconSet]\r\n * @param {Object} [options.attrs]\r\n * @returns {HTMLElement}\r\n */\r\nconst createElement = (name, options = {}) => {\r\n const ICON = 'outline-icon'\r\n const size = options.size || 0\r\n const color = options.color || ''\r\n const iconSet = options.iconSet || ''\r\n const width = isArray(size) ? size[0] : size\r\n const height = isArray(size) ? size[1] : size\r\n const defaultRules = size ? `width:${width}px;height:${height}px;` : ''\r\n const cssRules = color ? defaultRules + `color:${color}` : defaultRules\r\n const attrs = options.attrs || {}\r\n const $icon = document.createElement('i')\r\n let binds = ''\r\n let svg = ''\r\n let $svg\r\n\r\n if (!isString(name)) {\r\n return null\r\n }\r\n\r\n if (isSVG(name)) {\r\n svg = name\r\n } else {\r\n binds =\r\n iconSet && iconSet !== 'icon'\r\n ? `xlink:href=\"#${iconSet}-icon-${name}\"`\r\n : `xlink:href=\"#icon-${name}\"`\r\n svg = ``\r\n }\r\n\r\n $icon.innerHTML = svg\r\n\r\n if (attrs.className) {\r\n attrs.className = `${ICON} ${attrs.className}`\r\n } else {\r\n attrs.className = ICON\r\n }\r\n\r\n setAttributes($icon, attrs)\r\n\r\n $svg = $icon.querySelector('svg')\r\n setAttributes($svg, {\r\n 'aria-hidden': true,\r\n xmlns: 'http://www.w3.org/2000/svg',\r\n class: 'outline-icon__svg',\r\n width: 200,\r\n height: 200,\r\n style: cssRules\r\n })\r\n\r\n return $icon\r\n}\r\n\r\nexport default createElement\r\n","import isString from './isString'\r\n\r\nconst isSVG = (str) => {\r\n const declaration = '(?:<\\\\?xml[^>]*>\\\\s*)?'\r\n const doctype =\r\n '(?:<\\\\!doctype svg[^>]*\\\\s*(?:\\\\[?(?:\\\\s*]*>\\\\s*)*\\\\]?)*[^>]*>\\\\s*)?'\r\n const content = ']*>[^]*<\\\\/svg>\\\\s*$'\r\n const svg = `^\\\\s*${declaration}${doctype}${content}\\\\s*$`\r\n const pattern = new RegExp(svg, 'i')\r\n\r\n return isString(str) && pattern.test(str)\r\n}\r\n\r\nexport default isSVG\r\n","import createElement from './createElement'\r\n\r\n/**\r\n * 创建 SVG 图标 DOM 元素\r\n * ========================================================================\r\n * @method icon\r\n * @alias createElement\r\n * @see createElement\r\n * @param {String} name\r\n * @param {Object} [options]\r\n * @param {Number|Array} [options.size]\r\n * @param {String} [options.color]\r\n * @param {String} [options.iconSet]\r\n * @returns {HTMLElement}\r\n */\r\nconst icon = (name, options = {}) => {\r\n return createElement(name, options)\r\n}\r\n\r\nexport default icon\r\n","import DEFAULTS from './defaults'\r\n\r\nconst SYMBOLS = [...DEFAULTS]\r\n\r\nexport default SYMBOLS\r\n","const DEFAULTS = [\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n ''\r\n]\r\n\r\nexport default DEFAULTS\r\n","import isString from '../types/isString'\r\nimport getSymbol from './getSymbol'\r\nimport SYMBOLS from './symbols'\r\n\r\n/**\r\n *\r\n * @method getSymbols\r\n * @param {String} [name]\r\n * @param {String} [iconSet]\r\n * @returns {string[]|*}\r\n */\r\nconst getSymbols = (name, iconSet = 'icon') => {\r\n if (isString(name)) {\r\n return getSymbol(name, iconSet)\r\n }\r\n\r\n return [...SYMBOLS]\r\n}\r\n\r\nexport default getSymbols\r\n","import SYMBOLS from './symbols'\r\n\r\n/**\r\n * @method getSymbol\r\n * @param {String} name\r\n * @param {String} [iconSet]\r\n * @returns {String}\r\n */\r\nconst getSymbol = (name, iconSet = 'icon') => {\r\n const patternName = /id=\"(.*?)\"/\r\n const patternSet = /^(\\w+)-/\r\n const symbols = SYMBOLS\r\n\r\n return symbols.find((symbol) => {\r\n const names = patternName.exec(symbol)\r\n const fullName = names[1]\r\n const sets = patternSet.exec(fullName)\r\n const setName = sets[1]\r\n const iconName =\r\n iconSet === 'icon' ? `${iconSet}-${name}` : `${iconSet}-icon-${name}`\r\n\r\n return setName === iconSet && fullName === iconName\r\n })\r\n}\r\n\r\nexport default getSymbol\r\n","/**\r\n * 获取 options 节点下匹配 selector 选择器的 DOM 节点\r\n * ========================================================================\r\n * Element.matches() 方法可以用来判断 DOM 元素是否与给定的选择器匹配,事件代理判断是\r\n * 否触发绑定的代理事件回调函数,关键就是使用 Element.matches() 辨别当前事件触发的目\r\n * 标 DOM 元素是否为事件代理所期望触发的目标。\r\n * ========================================================================\r\n * @method matches\r\n * @see https://developer.mozilla.org/en-US/docs/web/api/element/matches\r\n * @param {HTMLElement} el - (必须)DOM 元素\r\n * @param {String} selector - (必须)匹配 DOM 元素的选择器\r\n * @returns {Boolean}\r\n */\r\nconst matches = (el, selector = '') => {\r\n const sel = selector.replace(/^>/i, '')\r\n\r\n if (!selector || !sel || !el) {\r\n return false\r\n }\r\n\r\n /* istanbul ignore else */\r\n if (el.matches) {\r\n return el.matches(sel)\r\n } else if (el.msMatchesSelector) {\r\n return el.msMatchesSelector(sel)\r\n } else {\r\n return false\r\n }\r\n}\r\n\r\nexport default matches\r\n","/**\r\n * 获取 DOM 元素的父节点\r\n * ========================================================================\r\n * @method getParentOrHost\r\n * @param {*|HTMLElement} el - (必须)要获取父节点的 DOM 元素\r\n * @returns {*|HTMLElement}\r\n */\r\nconst getParentOrHost = (el) => {\r\n return el.host && el !== document && el.host.nodeType\r\n ? el.host\r\n : el.parentNode\r\n}\r\n\r\nexport default getParentOrHost\r\n","export const CAPTURE_EVENTS = [\r\n 'focusout',\r\n 'blur',\r\n 'focusin',\r\n 'focus',\r\n 'load',\r\n 'unload',\r\n 'mouseenter',\r\n 'mouseleave'\r\n]\r\n","import { CAPTURE_EVENTS } from './enum'\r\nimport _delete from './_delete'\r\n\r\n/**\r\n * (私有方法)取消 type 类型的代理事件绑定\r\n * ========================================================================\r\n * 如果没有设置 handler,则销毁 this.$options 绑定的所有符合 type 事件类型的事件绑定\r\n * ========================================================================\r\n * @method _off\r\n * @param {HTMLElement} el - (必须)取消事件绑定的 DOM 元素\r\n * @param {String} type - (必须)事件类型\r\n * @param {Function} fn - (必须)事件处理器回调函数\r\n * @private\r\n */\r\nconst _off = (el, type, fn) => {\r\n const capture = CAPTURE_EVENTS.indexOf(type) > -1\r\n\r\n /* istanbul ignore else */\r\n if (fn._delegateListener) {\r\n fn = fn._delegateListener\r\n delete fn._delegateListener\r\n }\r\n\r\n // 移除缓存的 _listeners 数据\r\n _delete(el, type, fn)\r\n\r\n el.removeEventListener(type, fn, capture)\r\n}\r\n\r\nexport default _off\r\n","/**\r\n * 删除 DOM 元素缓存的 _listeners 数据\r\n * ========================================================================\r\n * @method _delete\r\n * @param {HTMLElement} el - 要删除 listener 的 DOM 元素\r\n * @param {String} type - 事件类型(名称)\r\n * @param {Function} [fn] - 事件处理器回调函数\r\n */\r\nconst _delete = function (el, type, fn) {\r\n const listeners = el._listeners\r\n let index = -1\r\n\r\n if (listeners.length < 1) {\r\n return false\r\n }\r\n\r\n // 移除缓存的 _listeners 数据\r\n listeners.forEach((listener, i) => {\r\n const handler = listener.fn\r\n\r\n if (type === listener.type) {\r\n index = i\r\n\r\n if (handler === fn) {\r\n index = i\r\n }\r\n }\r\n })\r\n\r\n /* istanbul ignore else */\r\n if (index > -1) {\r\n listeners.splice(index, 1)\r\n }\r\n}\r\n\r\nexport default _delete\r\n","import isString from '../types/isString'\r\nimport isElement from '../types/isElement'\r\nimport getListeners from './getListeners'\r\nimport _off from './_off'\r\n\r\n/**\r\n * 销毁(type 类型的)代理事件绑定\r\n * ========================================================================\r\n * 1. 设置了事件类型 type,则销毁指定类型的事件绑定,否则清除所有代理事件绑定\r\n * 2. recurse 设置为 true,递归销毁子节点全部事件绑定\r\n * ========================================================================\r\n * @method purgeElement\r\n * @param {HTMLElement|String} el - (必须)DOM 元素或者其选择器\r\n * @param {String|Boolean} type - (必须)事件类型\r\n * @param {Boolean} [recurse] - (可选)是否递归销毁子节点所有事件绑定\r\n */\r\nconst purgeElement = function (el, type, recurse = false) {\r\n const $element = isString(el) ? document.querySelector(el) : el\r\n const $children = $element.childNodes\r\n const listeners = getListeners($element, type)\r\n\r\n listeners.forEach((listener) => {\r\n _off($element, listener.type, listener.fn)\r\n })\r\n\r\n if (\r\n (recurse || type === true || arguments.length === 1) &&\r\n $element &&\r\n $children\r\n ) {\r\n $children.forEach(($child) => {\r\n if (isElement($child)) {\r\n purgeElement($child, type, recurse)\r\n }\r\n })\r\n }\r\n}\r\n\r\nexport default purgeElement\r\n","import isString from '../types/isString'\r\n\r\n/**\r\n * 获取 DOM 元素(type 事件类型)事件绑定信息\r\n * ========================================================================\r\n * 如果设置了事件类型 type, 则返回指定类型的事件绑定信息,否则返回所有事件绑定信息\r\n * ========================================================================\r\n * @methods getListeners\r\n * @param {HTMLElement} el - (必须)要获取事件绑定信息的 DOM 元素\r\n * @param {String} [type] - (可选)事件类型\r\n * @returns {Array} - 已绑定的事件信息\r\n */\r\nconst getListeners = (el, type) => {\r\n let listeners = el._listeners || []\r\n\r\n if (isString(type) && type) {\r\n listeners = listeners.filter((listener) => {\r\n return listener.type === type\r\n })\r\n }\r\n\r\n return listeners\r\n}\r\n\r\nexport default getListeners\r\n","import purgeElement from './purgeElement'\r\nimport isFunction from '../types/isFunction'\r\nimport _off from './_off'\r\n\r\n/**\r\n * 取消 type 类型的代理事件绑定\r\n * ========================================================================\r\n * 如果没有设置 handler,则销毁 this.$options 绑定的所有符合 type 事件类型的事件绑定\r\n * ========================================================================\r\n * @method off\r\n * @param {HTMLElement|Object} el - (必须)取消事件绑定的 DOM 元素\r\n * @param {String} type - (必须)事件类型\r\n * @param {Function} [fn] - (可选)事件处理器回调函数\r\n */\r\nconst off = (el, type, fn) => {\r\n // 如果不设置 fn 参数,默认清除 el 元素上绑定的所有事件处理器\r\n if (!isFunction(fn)) {\r\n purgeElement(el, type)\r\n return false\r\n }\r\n\r\n _off(el, type, fn)\r\n}\r\n\r\nexport default off\r\n","import closest from '../dom/closest'\r\nimport off from './off'\r\nimport getTarget from './getTarget'\r\n\r\nimport { CAPTURE_EVENTS } from './enum'\r\n\r\n/**\r\n * 绑定代理事件\r\n * ========================================================================\r\n * @method on\r\n * @param {HTMLElement|String|Object} el - (必须)绑定代理事件的 DOM 节点\r\n * @param {String} selector - (必须)事件代理目标 DOM 元素的选择器\r\n * @param {String|Function} type - (必须)事件类型或者事件处理器回调函数\r\n * @param {Function|Object} fn - (可选) 事件处理器回调函数或者传递给事件处理器回调函数的数据对象\r\n * @param {Object|Boolean} [data] - (可选)传递给事件处理器回调函数的数据对象或者事件处理器回调函数的 this 上下文指向,\r\n * @param {Object|Boolean} [context] - (可选)事件处理器回调函数的 this 上下文指向,或者是否仅触发一次\r\n * 当设置为 true 时,则事件处理器回调函数的 this 上下文指向为 data 对象\r\n * @param {Boolean} once - (可选)是否仅触发一次\r\n */\r\nconst on = (el, selector, type, fn, data, context, once = false) => {\r\n // CAPTURE_EVENTS 中的特殊事件,采用事件捕获模型\r\n const capture = CAPTURE_EVENTS.indexOf(type) > -1\r\n\r\n const listener = function (evt) {\r\n const target = getTarget(evt)\r\n // 通过 Element.matches 方法获得点击的目标元素\r\n const delegateTarget = closest(target, selector, el)\r\n let overrideContext = context || el\r\n\r\n evt.delegateTarget = delegateTarget\r\n\r\n // 当设置为 true 时,则事件处理器回调函数的\r\n // this 上下文指向为 data 对象\r\n if (context === true) {\r\n overrideContext = data\r\n }\r\n\r\n /* istanbul ignore else */\r\n if (delegateTarget) {\r\n // 仅触发一次\r\n /* istanbul ignore else */\r\n if (once === true) {\r\n off(el, type, listener)\r\n }\r\n\r\n fn.call(overrideContext, evt, data)\r\n }\r\n }\r\n\r\n if (!el) {\r\n return false\r\n }\r\n\r\n if (!el._listeners) {\r\n el._listeners = []\r\n }\r\n\r\n // 缓存 options 元素绑定的事件处理器\r\n el._listeners.push({\r\n el,\r\n selector,\r\n type,\r\n fn: listener,\r\n data,\r\n context,\r\n capture\r\n })\r\n\r\n // 缓存包装后的事件处理器\r\n fn._delegateListener = listener\r\n\r\n el.addEventListener(type, listener, capture)\r\n}\r\n\r\nexport default on\r\n","import resolveTextNode from '../dom/resolveTextNode'\r\n\r\n/**\r\n * 返回触发事件的 target DOM 元素\r\n * ========================================================================\r\n * @method getTarget\r\n * @param {Event} evt - Event 对象\r\n * @return {HTMLElement} - Event 对象的 target DOM 元素\r\n */\r\nconst getTarget = function (evt) {\r\n const target = evt.target\r\n\r\n return resolveTextNode(target)\r\n}\r\n\r\nexport default getTarget\r\n","/**\r\n * 在某些情况下,某些浏览器(例如:Safari 浏览器)会返回实际的目标元素内部的文本节点。\r\n * resolveTextNode() 方法则会返回实际的目标节点。\r\n * ========================================================================\r\n * @method resolveTextNode\r\n * @param {HTMLElement|Text} el - 要解析的节点\r\n * @return {*|HTMLElement} - 实际的目标 DOM 节点\r\n */\r\nconst resolveTextNode = function (el) {\r\n if (el && el.nodeType === 3) {\r\n return el.parentNode\r\n }\r\n\r\n return el\r\n}\r\n\r\nexport default resolveTextNode\r\n","import matches from './matches'\r\nimport getParentOrHost from './getParentOrHost'\r\n\r\n/**\r\n * 获取 options 元素父元素最近的包含 selector 选择器的元素\r\n * ========================================================================\r\n * @method closest\r\n * @param {HTMLElement} el - (必须)DOM 元素\r\n * @param {String} selector - (必须)DOM 元素的选择其\r\n * @param {HTMLElement} [ctx] - (必须)比对的 DOM 元素\r\n * @param {Boolean} [includeCTX] - (必须)是否包含 context DOM 元素\r\n * @returns {null|HTMLElement} - 返回最接近的 DOM 元素\r\n */\r\nconst closest = (el, selector, ctx, includeCTX) => {\r\n const context = ctx || document\r\n\r\n if (!el) {\r\n return null\r\n }\r\n\r\n do {\r\n /* istanbul ignore else */\r\n if (\r\n (selector != null &&\r\n (selector.startsWith('>')\r\n ? el.parentNode === context && matches(el, selector)\r\n : matches(el, selector))) ||\r\n (includeCTX && el === context)\r\n ) {\r\n return el\r\n }\r\n\r\n /* istanbul ignore else */\r\n if (el === context) {\r\n break\r\n }\r\n\r\n /* jshint boss:true */\r\n } while ((el = getParentOrHost(el)))\r\n}\r\n\r\nexport default closest\r\n","/**\r\n * 存储订阅者(主题和处理器的)私有对象\r\n * ========================================================================\r\n * @type {{}}\r\n * @private\r\n */\r\nconst _subscribers = {}\r\n\r\nexport default _subscribers\r\n","import _subscribers from './_subscribers'\r\nimport hasOwn from '../lang/hasOwn'\r\n\r\n/**\r\n * 判断是否存在与给定 topic 完全匹配的订阅者信息\r\n * ========================================================================\r\n * @method _hasDirectSubscribersFor\r\n * @param {String} topic - (必须)订阅主题字符串\r\n * @returns {Boolean}\r\n */\r\nconst _hasDirectSubscribersFor = (topic) => {\r\n return hasOwn(_subscribers, topic) && _subscribers[topic].length > 0\r\n}\r\n\r\nexport default _hasDirectSubscribersFor\r\n","import _hasDirectSubscribersFor from './_hasDirectSubscribersFor'\r\nimport _hasSubscribers from './_hasSubscribers'\r\n\r\n/**\r\n * 判断是否存在包含 topic 指定的订阅者信息\r\n * ========================================================================\r\n * @method has\r\n * @param {String} topic - (必须)主题名称\r\n * @param {Boolean} [isDirect] - (可选)是否为直接的主题,默认值:true\r\n * @returns {Boolean}\r\n */\r\nconst has = (topic, isDirect = true) => {\r\n return isDirect ? _hasDirectSubscribersFor(topic) : _hasSubscribers(topic)\r\n}\r\n\r\nexport default has\r\n","import _hasDirectSubscribersFor from './_hasDirectSubscribersFor'\r\n\r\n/**\r\n * 判断是否存在包含给定 topic 相关的订阅者信息\r\n * ========================================================================\r\n * @method _hasSubscribers\r\n * @param {String} topic - (必须)订阅主题字符串\r\n * @returns {Boolean}\r\n */\r\nconst _hasSubscribers = (topic) => {\r\n let found = _hasDirectSubscribersFor(topic)\r\n let position = topic.lastIndexOf('.')\r\n\r\n while (!found && position !== -1) {\r\n topic = topic.substring(0, position)\r\n position = topic.lastIndexOf('.')\r\n found = _hasDirectSubscribersFor(topic)\r\n }\r\n\r\n return found\r\n}\r\n\r\nexport default _hasSubscribers\r\n","import isTypedArray from '../types/isTypedArray'\r\nimport _subscribers from './_subscribers'\r\nimport has from './has'\r\nimport _hasDirectSubscribersFor from './_hasDirectSubscribersFor'\r\n\r\n/**\r\n * (异步)发布订阅主题信息\r\n * ========================================================================\r\n * 主题默认是异步发布的。确保在消费者处理主题时,主题的发起者不会被阻止。\r\n * ========================================================================\r\n * @method emit\r\n * @param {String} topic - (必须)主题名称\r\n * @param {Object} [data] - (可选)数据对象\r\n * @param {Boolean} [async] - (可选) 是否异步发布\r\n */\r\nconst emit = (topic, data, async = true) => {\r\n const execute = (topic) => {\r\n if (!_hasDirectSubscribersFor(topic)) {\r\n return false\r\n }\r\n\r\n _subscribers[topic].forEach((subscriber) => {\r\n // 针对 mqtt 消息服务返回的 Uint8Array 类似的 typed arrays 格式的数据\r\n // 采用 toString() 方法转化为普通(JSON)字符串\r\n const message = isTypedArray(data) ? data.toString() : data\r\n\r\n subscriber.callback.call(subscriber.context || subscriber, message)\r\n })\r\n }\r\n const deliver = () => {\r\n let subscriber = topic\r\n let position = topic.lastIndexOf('.')\r\n\r\n while (position !== -1) {\r\n subscriber = subscriber.substring(0, position)\r\n position = subscriber.lastIndexOf('.')\r\n\r\n execute(subscriber)\r\n }\r\n\r\n // 执行 topic 对应的处理器\r\n execute(topic)\r\n // 执行特殊 topic:'*'(监听全部消息的发布)\r\n execute('*')\r\n }\r\n\r\n if (!has(topic)) {\r\n return false\r\n }\r\n\r\n if (async) {\r\n setTimeout(deliver, 10)\r\n } else {\r\n deliver()\r\n }\r\n}\r\n\r\nexport default emit\r\n","import toString from '../lang/toString'\r\n/**\r\n * 判断检测数据是否为 Typed Arrays 类型的数据\r\n * ========================================================================\r\n * @param {*} val\r\n * @returns {boolean}\r\n */\r\nconst isTypedArray = (val) => {\r\n const TYPES = [\r\n '[object Int8Array]',\r\n '[object Uint8Array]',\r\n '[object Uint8ClampedArray]',\r\n '[object Int16Array]',\r\n '[object Uint16Array]',\r\n '[object Int32Array]',\r\n '[object Uint32Array]',\r\n '[object Float32Array]',\r\n '[object Float64Array]',\r\n '[object BigInt64Array]',\r\n '[object BigUint64Array]'\r\n ]\r\n\r\n return TYPES.indexOf(toString(val)) > -1\r\n}\r\n\r\nexport default isTypedArray\r\n","import _subscribers from './_subscribers'\r\nimport hasOwn from '../lang/hasOwn'\r\n\r\n/**\r\n * 删除与给定 topic 相同的订阅者信息\r\n * ========================================================================\r\n * @method _removeSubscriber\r\n * @param {String} topic - (必须)订阅主题字符串\r\n * @returns {Boolean}\r\n */\r\nconst _removeSubscriber = (topic) => {\r\n if (!hasOwn(_subscribers, topic)) {\r\n return false\r\n }\r\n\r\n delete _subscribers[topic]\r\n}\r\n\r\nexport default _removeSubscriber\r\n","import has from './has'\r\nimport _removeSubscriber from './_removeSubscriber'\r\nimport _removeSubscriberByToken from './_removeSubscriberByToken'\r\n\r\n/**\r\n * 取消订阅主题\r\n * ========================================================================\r\n * @method off\r\n * @param {String} topic - (必须)订阅的主题\r\n * @param {Function|String} [token] - (可选)订阅主题的处理器函数或者唯一 Id 值\r\n */\r\nconst off = (topic, token) => {\r\n if (!has(topic)) {\r\n return false\r\n }\r\n\r\n if (token) {\r\n _removeSubscriberByToken(token)\r\n } else {\r\n _removeSubscriber(topic)\r\n }\r\n}\r\n\r\nexport default off\r\n","import _subscribers from './_subscribers'\r\nimport _removeSubscriber from './_removeSubscriber'\r\n\r\n/**\r\n * 通过订阅者 token 值删除订阅者信息\r\n * ========================================================================\r\n * @method _removeSubscriberByToken\r\n * @param {String} token - 订阅者 token 字符串\r\n * @returns {boolean}\r\n * @private\r\n */\r\nconst _removeSubscriberByToken = (token) => {\r\n const keys = Object.keys(_subscribers)\r\n let index = -1\r\n\r\n if (!token || keys.length < 1) {\r\n return false\r\n }\r\n\r\n keys.forEach((subject) => {\r\n const subscriber = _subscribers[subject]\r\n let topic\r\n\r\n subscriber.forEach((execution, j) => {\r\n if (execution.callback === token || execution.token === token) {\r\n topic = execution.topic\r\n subscriber.splice(index, j)\r\n }\r\n })\r\n\r\n /* istanbul ignore else */\r\n if (subscriber.length < 1) {\r\n _removeSubscriber(topic)\r\n }\r\n })\r\n}\r\n\r\nexport default _removeSubscriberByToken\r\n","import isString from './utils/types/isString'\r\nimport hasOwn from './utils/lang/hasOwn'\r\nimport isObject from './utils/types/isObject'\r\nimport extend from './utils/lang/extend'\r\nimport publish from './utils/observer/emit'\r\nimport subscribe from './utils/observer/on'\r\nimport unsubscribe from './utils/observer/off'\r\n\r\nclass Base {\r\n constructor(options) {\r\n this.attrs = {}\r\n\r\n if (options) {\r\n this.initialize(options)\r\n }\r\n }\r\n\r\n initialize(options) {\r\n this.attr(options).render().addListeners()\r\n return this\r\n }\r\n\r\n attr(prop, value) {\r\n const attrs = this.attrs\r\n\r\n if (isString(prop)) {\r\n // 只能扩展 attrs 中已有的属性\r\n if (value && hasOwn(attrs, prop)) {\r\n // 更新单个配置信息\r\n attrs[prop] = value\r\n return this\r\n }\r\n\r\n // 只传递 prop 参数,则返回对应的属性值\r\n return attrs[prop]\r\n } else if (isObject(prop)) {\r\n // 批量更新配置信息\r\n extend(attrs, prop)\r\n\r\n return this\r\n } else if (arguments.length === 0) {\r\n // 不传递参数,直接返回整个\r\n return attrs\r\n }\r\n\r\n return this\r\n }\r\n\r\n render() {\r\n return this\r\n }\r\n\r\n refresh() {\r\n return this\r\n }\r\n\r\n destroy() {\r\n this.removeListeners()\r\n return this\r\n }\r\n\r\n reload(options) {\r\n let attrs = this.attr()\r\n\r\n if (options) {\r\n attrs = this.attr(options)\r\n }\r\n\r\n this.destroy().initialize(attrs)\r\n\r\n return this\r\n }\r\n\r\n $emit(event, data) {\r\n publish(event, data)\r\n return this\r\n }\r\n\r\n $on(event, callback) {\r\n subscribe(event, callback, this)\r\n return this\r\n }\r\n\r\n $off(event, callback) {\r\n unsubscribe(event, callback)\r\n return this\r\n }\r\n\r\n addListeners() {\r\n return this\r\n }\r\n\r\n removeListeners() {\r\n return this\r\n }\r\n}\r\n\r\nexport default Base\r\n","import _subscribers from './_subscribers'\r\nimport isFunction from '../types/isFunction'\r\nimport guid from '../lang/guid'\r\n\r\n/**\r\n * 订阅主题,并给出处理器函数\r\n * ========================================================================\r\n * @method on\r\n * @param {String} topic - (必须)主题名称\r\n * @param {Function} handler - (必须)主题的处理器函数\r\n * @param {Object} [context] - (可选)指定 this 执行上下文\r\n * @return {String} - 唯一的 token 字符串,例如:'guid-1'。\r\n */\r\nconst on = (topic, handler, context = null) => {\r\n const token = guid()\r\n let subject = typeof topic === 'symbol' ? topic.toString() : topic\r\n\r\n if (!isFunction(handler)) {\r\n return ''\r\n }\r\n\r\n /* istanbul ignore else */\r\n if (!_subscribers[subject]) {\r\n _subscribers[subject] = []\r\n }\r\n\r\n _subscribers[subject].push({\r\n topic: subject,\r\n callback: handler,\r\n context,\r\n token\r\n })\r\n\r\n return token\r\n}\r\n\r\nexport default on\r\n","import isString from './utils/types/isString'\r\nimport isPlainObject from './utils/types/isPlainObject'\r\nimport isFunction from './utils/types/isFunction'\r\n\r\nimport extend from './utils/lang/extend'\r\nimport later from './utils/lang/later'\r\nimport stripScripts from './utils/lang/stripScripts'\r\nimport encodeHTML from './utils/lang/encodeHTML'\r\nimport cloneDeep from './utils/lang/cloneDeep'\r\nimport guid from './utils/lang/guid'\r\n\r\nimport createElement from './utils/dom/createElement'\r\nimport addClass from './utils/dom/addClass'\r\nimport removeClass from './utils/dom/removeClass'\r\nimport setAttribute from './utils/dom/setAttribute'\r\nimport setAttributes from './utils/dom/setAttributes'\r\n\r\nimport icon from './utils/icons/icon'\r\nimport paint from './utils/icons/paint'\r\nimport on from './utils/event/on'\r\nimport off from './utils/event/off'\r\n\r\nimport Base from './base'\r\n\r\nconst TYPES = ['info', 'success', 'warning', 'error']\r\nconst instances = []\r\nlet instance\r\n\r\npaint()\r\n\r\nclass Message extends Base {\r\n constructor(options) {\r\n super()\r\n\r\n this._default()\r\n\r\n if (options) {\r\n this.initialize(options)\r\n }\r\n }\r\n\r\n _default() {\r\n this.attrs = cloneDeep(Message.DEFAULTS)\r\n\r\n this.$el = null\r\n this.id = ''\r\n this.closed = false\r\n this.visible = false\r\n this.offset = -50\r\n this.timer = null\r\n this.destroyed = false\r\n\r\n return this\r\n }\r\n\r\n initialize(options) {\r\n this.attr(options)\r\n this.id = this.attr('id')\r\n this.offset = this.attr('offset') || -50\r\n\r\n this.$emit('created', { ...this.attr() })\r\n\r\n this.render().addListeners()\r\n\r\n if (this.attr('visible')) {\r\n this.open()\r\n }\r\n\r\n return this\r\n }\r\n\r\n isClosed() {\r\n return this.closed\r\n }\r\n\r\n isDestroyed() {\r\n return this.destroyed\r\n }\r\n\r\n _getClassName() {\r\n const type = this.attr('type')\r\n const effect = this.attr('effect')\r\n const round = this.attr('round')\r\n const closable = this.attr('closable')\r\n const visible = this.attr('visible')\r\n const customClass = this.attr('customClass')\r\n const className = [\r\n 'outline-message',\r\n `outline-message_${type}`,\r\n `outline-message_${effect}`\r\n ]\r\n\r\n if (round) {\r\n className.push('outline-message_round')\r\n }\r\n\r\n if (!closable) {\r\n className.push('outline-message_full-width')\r\n }\r\n\r\n if (visible) {\r\n className.push('outline-message_visible')\r\n }\r\n\r\n if (customClass) {\r\n className.push(customClass)\r\n }\r\n\r\n return className\r\n }\r\n\r\n render() {\r\n const type = this.attr('type')\r\n const message = this.attr('message')\r\n const effect = this.attr('effect')\r\n const round = this.attr('round')\r\n const closable = this.attr('closable')\r\n const dangerouslyUseHTMLString = this.attr('dangerouslyUseHTMLString')\r\n const className = this._getClassName()\r\n const iconName = effect === 'light' ? `circle-${type}` : type\r\n const children = []\r\n let iconSize = 20\r\n let $type\r\n let $message\r\n let $text\r\n let $close\r\n let $el\r\n\r\n if (round && effect === 'default') {\r\n iconSize = 12\r\n }\r\n\r\n if (effect !== 'plain') {\r\n $type = icon(iconName, {\r\n iconSet: 'outline',\r\n size: iconSize\r\n })\r\n addClass($type, 'outline-message__icon')\r\n children.push($type)\r\n }\r\n\r\n if (!dangerouslyUseHTMLString) {\r\n $text = document.createTextNode(encodeHTML(stripScripts(message)))\r\n } else {\r\n $text = document.createDocumentFragment()\r\n $text.innerHTML = message\r\n }\r\n $message = createElement(\r\n 'p',\r\n {\r\n className: 'outline-message__content'\r\n },\r\n [$text]\r\n )\r\n children.push($message)\r\n\r\n if (closable) {\r\n $close = icon('close', {\r\n iconSet: 'outline',\r\n size: 18\r\n })\r\n addClass($close, 'outline-message__close')\r\n children.push($close)\r\n }\r\n\r\n $el = createElement(\r\n 'div',\r\n {\r\n className: className.join(' ')\r\n },\r\n children\r\n )\r\n $el.style.cssText = `top:-50px;`\r\n this.$el = $el\r\n document.body.appendChild(this.$el)\r\n\r\n this.$emit('mounted')\r\n\r\n return this\r\n }\r\n\r\n _refreshIcon() {\r\n const HIDDEN = '.outline-message_hidden'\r\n const $el = this.$el\r\n let iconSize = 20\r\n let type\r\n let effect\r\n let round\r\n let iconName\r\n let $icon\r\n let $svg\r\n let $use\r\n\r\n if (this.isDestroyed()) {\r\n return this\r\n }\r\n\r\n $icon = $el.querySelector('.outline-icon')\r\n\r\n if (!$icon) {\r\n return this\r\n }\r\n\r\n type = this.attr('type')\r\n effect = this.attr('effect')\r\n round = this.attr('round')\r\n\r\n if (effect === 'plain') {\r\n addClass($icon, HIDDEN)\r\n } else {\r\n removeClass($icon, HIDDEN)\r\n\r\n if (round && effect === 'default') {\r\n iconSize = 12\r\n }\r\n }\r\n\r\n $svg = $icon.querySelector('.outline-icon__svg')\r\n setAttributes($svg, {\r\n style: `width:${iconSize}px;height:${iconSize}px;`\r\n })\r\n\r\n $use = $svg.querySelector('use')\r\n iconName = effect === 'light' ? `circle-${type}` : type\r\n setAttribute($use, 'xlink:href', `#outline-icon-${iconName}`)\r\n\r\n return this\r\n }\r\n\r\n _refreshMessage() {\r\n const $el = this.$el\r\n let $message\r\n let dangerouslyUseHTMLString\r\n let message\r\n let text\r\n\r\n if (this.isDestroyed()) {\r\n return this\r\n }\r\n\r\n $message = $el.querySelector('.outline-message__content')\r\n dangerouslyUseHTMLString = this.attr('dangerouslyUseHTMLString')\r\n message = this.attr('message')\r\n\r\n if (!dangerouslyUseHTMLString) {\r\n text = encodeHTML(stripScripts(message))\r\n } else {\r\n text = message\r\n }\r\n\r\n $message.innerHTML = text\r\n\r\n return this\r\n }\r\n\r\n _refreshClose() {\r\n const HIDDEN = '.outline-message_hidden'\r\n const $el = this.$el\r\n let $close\r\n let closable\r\n\r\n if (this.isDestroyed()) {\r\n return this\r\n }\r\n\r\n $close = $el.querySelector('.outline-message__close')\r\n closable = this.attr('closable')\r\n\r\n if ($close) {\r\n if (closable) {\r\n addClass($close, HIDDEN)\r\n } else {\r\n removeClass($close, HIDDEN)\r\n }\r\n }\r\n\r\n return this\r\n }\r\n\r\n _refreshEl() {\r\n const $el = this.$el\r\n let className\r\n\r\n if (this.isDestroyed()) {\r\n return this\r\n }\r\n\r\n className = this._getClassName()\r\n setAttribute($el, 'className', className.join(' '))\r\n\r\n return this\r\n }\r\n\r\n refresh(options) {\r\n if (!isPlainObject(options)) {\r\n return this\r\n }\r\n\r\n this.attr(options)\r\n ._refreshIcon()\r\n ._refreshMessage()\r\n ._refreshClose()\r\n ._refreshEl()\r\n\r\n return this\r\n }\r\n\r\n clearTimer() {\r\n if (this.isDestroyed()) {\r\n return this\r\n }\r\n\r\n if (this.timer) {\r\n clearTimeout(this.timer)\r\n this.timer = null\r\n }\r\n\r\n return this\r\n }\r\n\r\n startTimer(duration) {\r\n if (this.isDestroyed()) {\r\n return this\r\n }\r\n\r\n this.timer = later(() => {\r\n this.$emit('opened')\r\n this.close()\r\n }, duration * 1000)\r\n\r\n return this\r\n }\r\n\r\n open(options) {\r\n const $el = this.$el\r\n let offset\r\n let duration\r\n let top\r\n let cssRules\r\n\r\n if (this.isDestroyed()) {\r\n return this\r\n }\r\n\r\n if (this.isClosed()) {\r\n this.refresh(options)\r\n }\r\n\r\n offset = this.attr('offset')\r\n duration = this.attr('duration')\r\n top = offset && offset >= this.offset ? offset : this.offset\r\n cssRules = `top:${top}px;`\r\n\r\n this.clearTimer()\r\n\r\n this.$emit('beforeOpen')\r\n\r\n later(() => {\r\n this.visible = true\r\n\r\n addClass($el, 'outline-message_visible')\r\n $el.style.cssText = cssRules\r\n\r\n if (duration > 0) {\r\n this.startTimer(duration)\r\n }\r\n }, 100)\r\n\r\n return this\r\n }\r\n\r\n close() {\r\n const $el = this.$el\r\n const cssRules = `top:-50px;`\r\n let destroyAfterClosed\r\n let beforeClose\r\n\r\n if (this.isDestroyed()) {\r\n return this\r\n }\r\n\r\n destroyAfterClosed = this.attr('destroyAfterClosed')\r\n beforeClose = this.attr('beforeClose')\r\n\r\n if (isFunction(beforeClose)) {\r\n beforeClose.call(this)\r\n }\r\n\r\n $el.style.cssText = cssRules\r\n removeClass($el, 'outline-message_visible')\r\n\r\n this.visible = false\r\n this.closed = true\r\n\r\n later(() => {\r\n this.$emit('closed')\r\n\r\n if (destroyAfterClosed) {\r\n this.destroy()\r\n }\r\n }, 500)\r\n\r\n return this\r\n }\r\n\r\n destroy() {\r\n this.$emit('beforeDestroy')\r\n\r\n if (this.isDestroyed()) {\r\n return this\r\n }\r\n\r\n this.removeListeners()\r\n\r\n document.body.removeChild(this.$el)\r\n\r\n clearTimeout(this.timer)\r\n this._default()\r\n\r\n this.$emit('afterDestroy')\r\n\r\n return this\r\n }\r\n\r\n onMouseEnter() {\r\n this.clearTimer()\r\n return this\r\n }\r\n\r\n onMouseLeave() {\r\n const duration = this.attr('duration')\r\n const delay = this.attr('delay')\r\n\r\n if (duration <= 0) {\r\n return this\r\n }\r\n\r\n this.startTimer(delay)\r\n\r\n return this\r\n }\r\n\r\n onClose() {\r\n this.clearTimer()\r\n this.close()\r\n return this\r\n }\r\n\r\n addListeners() {\r\n const $el = this.$el\r\n\r\n on(\r\n $el,\r\n '.outline-message__content',\r\n 'mouseenter',\r\n this.onMouseEnter,\r\n this,\r\n true\r\n )\r\n on(\r\n $el,\r\n '.outline-message__content',\r\n 'mouseleave',\r\n this.onMouseLeave,\r\n this,\r\n true\r\n )\r\n on($el, '.outline-message__close', 'click', this.onClose, this, true)\r\n\r\n return this\r\n }\r\n\r\n removeListeners() {\r\n const $el = this.$el\r\n\r\n off($el, 'mouseenter', this.onMouseEnter)\r\n off($el, 'mouseleave', this.onMouseLeave)\r\n off($el, 'click', this.onClose)\r\n\r\n return this\r\n }\r\n}\r\n\r\nMessage.DEFAULTS = (() => {\r\n const OPTIONS = {\r\n id: '',\r\n type: 'info',\r\n effect: 'default',\r\n round: false,\r\n offset: 30,\r\n duration: 3,\r\n delay: 2,\r\n message: '',\r\n customClass: '',\r\n closable: true,\r\n visible: true,\r\n dangerouslyUseHTMLString: false,\r\n destroyAfterClosed: true,\r\n beforeClose: null\r\n }\r\n\r\n return cloneDeep(OPTIONS)\r\n})()\r\n\r\nTYPES.forEach((type) => {\r\n Message[type] = (options) => {\r\n const config = {}\r\n const id = guid(`outline-message-`)\r\n const beforeClose = options.beforeClose || null\r\n let offset = options.offset || 30\r\n\r\n if (isString(options)) {\r\n config.message = options\r\n } else {\r\n if (isPlainObject(options)) {\r\n extend(config, options)\r\n }\r\n }\r\n config.id = id\r\n config.type = type\r\n config.offset = offset\r\n config.visible = false\r\n config.beforeClose = () => {\r\n Message.close(id, beforeClose)\r\n }\r\n\r\n instance = new Message(config)\r\n instances.forEach((item) => {\r\n offset += item.$el.offsetHeight + 16\r\n })\r\n instance.offset = offset\r\n instance.open()\r\n instances.push(instance)\r\n\r\n return instance\r\n }\r\n})\r\n\r\n// 关闭指定 id 消息的静态方法\r\nMessage.close = (id, beforeClose) => {\r\n const len = instances.length\r\n let index = -1\r\n let i\r\n let offsetHeight\r\n\r\n instances.forEach((instance, i) => {\r\n // 在 instances 中通过 id 找到要关闭的消息\r\n if (id === instance.id) {\r\n offsetHeight = instance.$el.offsetHeight\r\n index = i\r\n\r\n // 关闭消息\r\n if (isFunction(beforeClose)) {\r\n beforeClose.call(instance)\r\n }\r\n\r\n instances.splice(i, 1)\r\n }\r\n })\r\n\r\n if (len <= 1 || index === -1 || index > instances.length - 1) {\r\n return false\r\n }\r\n\r\n i = index\r\n\r\n // 界面中的消息逐个向上收起\r\n for (; i < len - 1; i += 1) {\r\n const dom = instances[i].$el\r\n\r\n dom.style['top'] = parseInt(dom.style['top'], 10) - offsetHeight - 16 + 'px'\r\n }\r\n}\r\n\r\n// 关闭所有消息的静态方法\r\nMessage.clear = () => {\r\n let i = instances.length - 1\r\n for (; i >= 0; i -= 1) {\r\n instances[i].close()\r\n }\r\n}\r\n\r\nexport default Message\r\n","import add from './add'\r\nimport getSymbols from './getSymbols'\r\n\r\n/**\r\n * 绘制 SVG 图标集\r\n * ========================================================================\r\n * @method paint\r\n * @param {String|Array} symbol\r\n */\r\nconst paint = (symbol = '') => {\r\n const $body = document.body\r\n let $icons = document.querySelector('#outline-icons')\r\n let symbols = []\r\n\r\n add(symbol)\r\n symbols = getSymbols()\r\n\r\n if ($icons) {\r\n $icons.innerHTML = symbols.join('')\r\n } else {\r\n $icons = document.createElement('div')\r\n $icons.innerHTML =\r\n ``\r\n $body.insertBefore($icons.firstChild, $body.firstChild)\r\n }\r\n}\r\n\r\nexport default paint\r\n","import isArray from '../types/isArray'\r\nimport isString from '../types/isString'\r\nimport SYMBOLS from './symbols'\r\n\r\n/**\r\n * @method add\r\n * @param {Array|String} symbols\r\n * @return {Boolean}\r\n */\r\nconst add = (symbols) => {\r\n if (!symbols) {\r\n return false\r\n }\r\n\r\n if (isArray(symbols) && symbols.length > 0) {\r\n symbols.forEach((symbol) => {\r\n /* istanbul ignore else */\r\n if (SYMBOLS.indexOf(symbol) === -1 && isString(symbol)) {\r\n SYMBOLS.push(symbol)\r\n }\r\n })\r\n } else {\r\n /* istanbul ignore else */\r\n if (isString(symbols)) {\r\n SYMBOLS.push(symbols)\r\n }\r\n }\r\n}\r\n\r\nexport default add\r\n"],"names":["isString","str","toString","val","Object","prototype","apply","isFunction","isObject","o","isPlainObject","getPrototypeOf","proto","isObjectLike","hasOwn","obj","prop","hasOwnProperty","call","extend","origin","source","keys","forEach","later","fn","delay","setTimeout","stripScripts","replace","encodeHTML","CHARTS","tag","isArray","Array","cloneDeep","clone","from","assign","key","guid","uuid","prefix","isElement","nodeName","tagName","nodeType","isDOM","el","isHTMLCollection","fragment","isTextNode","hasClass","className","pattern","RegExp","allClass","classList","contains","exec","addClass","_classList","add","indexOf","split","name","length","setAttribute","attr","value","toLowerCase","style","cssText","innerHTML","innerText","setAttributes","attrs","createElement","children","$fragment","document","createDocumentFragment","$el","isValidChild","child","append","$child","createTextNode","appendChild","every","removeClass","remove","options","ICON","size","color","iconSet","width","height","defaultRules","cssRules","$icon","$svg","binds","svg","test","isSVG","querySelector","xmlns","class","icon","SYMBOLS","_maybeArrayLike","_toConsumableArray","getSymbols","getSymbol","patternName","patternSet","find","symbol","fullName","matches","selector","sel","msMatchesSelector","getParentOrHost","host","parentNode","CAPTURE_EVENTS","_off","type","capture","_delegateListener","listeners","_listeners","index","listener","i","handler","splice","_delete","removeEventListener","purgeElement","recurse","$element","$children","childNodes","getListeners","filter","arguments","off","on","data","context","once","evt","target","getTarget","delegateTarget","closest","ctx","includeCTX","startsWith","overrideContext","push","addEventListener","_subscribers","_hasDirectSubscribersFor","topic","has","isDirect","found","position","lastIndexOf","substring","_hasSubscribers","emit","async","execute","subscriber","message","callback","deliver","_removeSubscriber","token","subject","execution","j","_removeSubscriberByToken","Base","constructor","this","initialize","render","addListeners","refresh","destroy","removeListeners","reload","$emit","event","publish","$on","subscribe","$off","unsubscribe","instances","instance","paint","$body","body","$icons","symbols","join","insertBefore","firstChild","Message","super","_default","DEFAULTS","id","closed","visible","offset","timer","destroyed","_objectSpread","open","isClosed","isDestroyed","_getClassName","effect","round","closable","customClass","dangerouslyUseHTMLString","$type","$message","$text","$close","iconSize","_refreshIcon","HIDDEN","iconName","$use","_refreshMessage","text","_refreshClose","_refreshEl","clearTimer","clearTimeout","startTimer","duration","close","top","destroyAfterClosed","beforeClose","removeChild","onMouseEnter","onMouseLeave","onClose","config","item","offsetHeight","len","dom","parseInt","clear"],"mappings":"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"} \ No newline at end of file diff --git a/docs/js/navigator.min.js b/docs/js/navigator.min.js deleted file mode 100644 index c2ef0eca..00000000 --- a/docs/js/navigator.min.js +++ /dev/null @@ -1,2 +0,0 @@ -!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(t="undefined"!=typeof globalThis?globalThis:t||self).Navigator=e()}(this,(function(){"use strict";const t=t=>"string"==typeof t,e=t=>Object.prototype.toString.apply(t),i=t=>"function"==typeof t||"[object Function]"===e(t),s=t=>("[object Object]"===e(t)||"object"==typeof t||i(t))&&null!==t,r=t=>!!(s(t)&&t.nodeName&&t.tagName&&1===t.nodeType),n=(t,e=300)=>!!i(t)&&setTimeout((()=>{t()}),e),o=["focusout","blur","focusin","focus","load","unload","mouseenter","mouseleave"],l=(t,e,i)=>{const s=o.indexOf(e)>-1;i._delegateListener&&delete(i=i._delegateListener)._delegateListener,function(t,e,i){const s=t._listeners;let r=-1;if(s.length<1)return!1;s.forEach(((t,s)=>{const n=t.fn;e===t.type&&(r=s,n===i&&(r=s))})),r>-1&&s.splice(r,1)}(t,e,i),t.removeEventListener(e,i,s)},a=function(e,i,s=!1){const n=t(e)?document.querySelector(e):e,o=n.childNodes,h=((e,i)=>{let s=e._listeners||[];return t(i)&&i&&(s=s.filter((t=>t.type===i))),s})(n,i);h.forEach((t=>{l(n,t.type,t.fn)})),(s||!0===i||1===arguments.length)&&n&&o&&o.forEach((t=>{r(t)&&a(t,i,s)}))},h=(t,e,s)=>{if(!i(s))return a(t,e),!1;l(t,e,s)},c=(t,e,s,r,n,l=!1)=>{const a=o.indexOf(e)>-1,c=function(i){let o=n||t;!0===n&&(o=r),!0===l&&h(t,e,c),s.call(o,i,r)};if(!i(s))return!1;t._listeners||(t._listeners=[]),t._listeners.push({el:t,type:e,fn:c,data:r,context:n,capture:a}),s._delegateListener=c,t.addEventListener(e,c,a)},u=(t,e="")=>{const i=e.replace(/^>/i,"");return!!(e&&i&&t)&&(t.matches?t.matches(i):!!t.msMatchesSelector&&t.msMatchesSelector(i))},d=t=>t.host&&t!==document&&t.host.nodeType?t.host:t.parentNode,f=(t,e,i,s,r,n,l=!1)=>{const a=o.indexOf(i)>-1,c=function(o){const a=function(t){const e=t.target;return(i=e)&&3===i.nodeType?i.parentNode:i;var i}(o),f=((t,e,i,s)=>{const r=i||document;if(!t)return null;do{if(null!=e&&(e.startsWith(">")?t.parentNode===r&&u(t,e):u(t,e))||s&&t===r)return t;if(t===r)break}while(t=d(t))})(a,e,t);let p=n||t;o.delegateTarget=f,!0===n&&(p=r),f&&(!0===l&&h(t,i,c),s.call(p,o,r))};if(!t)return!1;t._listeners||(t._listeners=[]),t._listeners.push({el:t,selector:e,type:i,fn:c,data:r,context:n,capture:a}),s._delegateListener=c,t.addEventListener(i,c,a)},p=t=>Array.isArray?Array.isArray(t):"[object Array]"===e(t),m=t=>{return!(!s(t)||!(r(t)||(t=>!(!s(t)||"[object NodeList]"!==e(t)))(t)||(i=t,s(i)&&"[object DocumentFragment]"===e(i))||(t=>!(!s(t)||!("[object Text]"===e(t)||t.tagName&&3===t.nodeType)))(t)));var i},g=(t,e)=>{const i=Object.prototype.hasOwnProperty;return t&&i.call(t,e)},y=(t,e)=>{const i=new RegExp("(\\s|^)"+e+"(\\s|$)");let s,n;return!!r(t)&&(s=t.className,!!s&&(n=t.classList,n&&n.contains?t.classList.contains(e):!!i.exec(s)))},v=(t,e)=>{var i;let s,r;if(y(t,e))return!1;s=t.classList,null!==(i=s)&&void 0!==i&&i.add?e.indexOf(" ")>-1?e.split(" ").forEach((t=>{s.add(t)})):s.add(e):(r=t.className,r+=r.length>0?" "+e:e,t.className=r)},b=(t,e)=>{if(!t||!s(e))return!1;Object.keys(e).forEach((i=>{const s=e[i];g(e,i)&&((t,e,i)=>{let s=t.tagName.toLowerCase();switch(e){case"style":t.style.cssText=i;break;case"value":"input"===s||"textarea"===s?t.value=i:t.setAttribute(e,i);break;case"htmlFor":t.setAttribute("for",i);break;case"className":v(t,i);break;case"innerHTML":t.innerHTML=i;break;case"innerText":t.innerText=i;break;default:t.setAttribute(e,i)}})(t,i,s)}))},$=(e,i,r)=>{const n=document.createDocumentFragment(),o=document.createElement(e),l=e=>m(e)||t(e),a=e=>{let i;if(!l(e))return!1;m(e)?i=e:t(e)&&(i=document.createTextNode(e)),n.appendChild(i)};return s(i)?b(o,i):p(i)&&i.every((t=>l(t)))?i.forEach((t=>{a(t)})):m(i)?a(i):t(i)&&a(document.createTextNode(i)),p(r)?r.forEach((t=>{a(t)})):a(r),o.appendChild(n),o},T=t=>t*t,_=(e=null)=>{let i,s;return e?t(e)?s=document.querySelector(e):r(e)&&(s=e):(i=document.querySelectorAll("html,body"),s=i[0].scrollTop-i[1].scrollTop>=0?i[0]:i[1]),s},E=(t,e,s)=>{const r=_(t);let n=r.scrollTop,o=0;const l=e-n,a=r.scrollHeight,h=e-a<=0?e:a,c=t=>(i(s)&&s(t),!1),u=()=>{if(o+=1,l<0){if(n-=T(o),r.scrollTop=n,console.log("$scrollElement up",t,r,n,r.scrollTop),n<=e)return r.scrollTop=e,c(e)}else if(n+=T(o),r.scrollTop=n,console.log("$scrollElement down",t,r,n,r.scrollTop),n>=h)return r.scrollTop=h,c(h);requestAnimationFrame(u)};requestAnimationFrame(u)},x=(e,i)=>{var s;let r,n=e.className;if(!n||!y(e,i))return!1;var o;r=e.classList,null!==(s=r)&&void 0!==s&&s.remove?r.remove(i):(o=n.replace(i,""),n=!!t(o)&&o.replace(/(^\s+)|(\s+$)/g,""),e.className=n)},S=t=>{let e=t.offsetTop;return null!==t.offsetParent&&(e+=S(t.offsetParent)),e},k=(t,e)=>getComputedStyle(t)[e],A=(t,e)=>{document.documentElement.style.setProperty(t,e)},w=t=>{let e={};return null===t?null:(p(t)?e=Array.from(t):(e=Object.assign({},t),Object.keys(e).forEach((i=>e[i]=s(t[i])?w(t[i]):t[i]))),e)};function O(t,e){(null==e||e>t.length)&&(e=t.length);for(var i=0,s=Array(e);i0&&j.length;){const t=j.shift();if(!i(t))return!1;t()}j.length?N=requestIdleCallback(L):(N=0,i(I)&&(I(),I=null))}void 0===window.requestIdleCallback&&(window.requestIdleCallback=function(t){const e=Date.now();return n((function(){t({didTimeout:!1,timeRemaining:function(){return Math.max(0,50-(Date.now()-e))}})}),10)},window.cancelIdleCallback=function(t){clearTimeout(t)});const q=(t,e=null)=>{j.push(t),i(e)&&(I=e),N||requestIdleCallback(L)},z=(t,e,i=!1)=>{const s=e.length,r=function(t,e,i){if(e&&!Array.isArray(e)&&"number"==typeof e.length){var s=e.length;return O(e,void 0!==i&&i{const s=e=>t.querySelector(`#${e}`);e.forEach((e=>{const r=e.pid,n=e.id,o=e.code,l=e.rel,a=[],h=$("span",{className:"outline-navigator__text"},e.text);let c,u,d,f,p;i&&(u=$("span",{className:"outline-navigator__code","data-id":n},e.code),a.push(u)),a.push(h),c=$("a",{id:`chapter__anchor-${n}`,className:"outline-navigator__anchor",href:"#"+l,rel:l,"data-id":n,"data-code":o},a),d=$("li",{id:`chapter-${n}`,className:"outline-navigator__item","data-id":n,"data-code":o},c),-1===r?t.appendChild(d):(p=s(`chapter-${r}`),f=s(`subject-${r}`),f?f.appendChild(d):(f=$("ul",{id:"subject-"+r,className:"outline-navigator__subject"},d),p.appendChild(f)))}))};if(s>400)for(n(r.splice(0,400));r.length>0;){const t=r.splice(0,400);q((()=>{n(t)}))}else n(r)},F={},H=t=>g(F,t)&&F[t].length>0,D=(t,e=!0)=>e?H(t):(t=>{let e=H(t),i=t.lastIndexOf(".");for(;!e&&-1!==i;)i=(t=t.substring(0,i)).lastIndexOf("."),e=H(t);return e})(t),R=(t,i,s=!0)=>{const r=t=>{if(!H(t))return!1;F[t].forEach((t=>{const s=["[object Int8Array]","[object Uint8Array]","[object Uint8ClampedArray]","[object Int16Array]","[object Uint16Array]","[object Int32Array]","[object Uint32Array]","[object Float32Array]","[object Float64Array]","[object BigInt64Array]","[object BigUint64Array]"].indexOf(e(i))>-1?i.toString():i;t.callback.call(t.context||t,s)}))},n=()=>{let e=t,i=t.lastIndexOf(".");for(;-1!==i;)e=e.substring(0,i),i=e.lastIndexOf("."),r(e);r(t),r("*")};if(!D(t))return!1;s?setTimeout(n,10):n()},M=(()=>{let t=0;return e=>(t+=1,e?e+"-"+t:"guid-"+t)})(),P=t=>{if(!g(F,t))return!1;delete F[t]},U=(t,e)=>{if(!D(t))return!1;e?(t=>{const e=Object.keys(F);if(!t||e.length<1)return!1;e.forEach((e=>{const i=F[e];let s;i.forEach(((e,r)=>{e.callback!==t&&e.token!==t||(s=e.topic,i.splice(-1,r))})),i.length<1&&P(s)}))})(e):P(t)};class W{constructor(t){this.attrs={},t&&this.initialize(t)}initialize(t){return this.attr(t).render().addListeners(),this}attr(e,i){const r=this.attrs;return t(e)?i&&g(r,e)?(r[e]=i,this):r[e]:s(e)?(n=r,o=e,Object.keys(o).forEach((t=>{g(o,t)&&(n[t]=o[t])})),this):0===arguments.length?r:this;var n,o}render(){return this}refresh(){return this}destroy(){return this.removeListeners(),this}reload(t){let e=this.attr();return t&&(e=this.attr(t)),this.destroy().initialize(e),this}$emit(t,e){return R(t,e),this}$on(t,e){return((t,e,s=null)=>{const r=M();let n="symbol"==typeof t?t.toString():t;i(e)&&(F[n]||(F[n]=[]),F[n].push({topic:n,callback:e,context:s,token:r}))})(t,e,this),this}$off(t,e){return U(t,e),this}addListeners(){return this}removeListeners(){return this}}const B="outline-navigator_hidden",Y="outline-navigator_expanded",G="outline-navigator_folded";class J extends W{constructor(t){super(),this._default(),this.scrollTimer=null,this.resizeTimer=null,this.observerTimer=null,this.Observer=null,t&&this.initialize(t)}_default(){return this.attrs=w(J.DEFAULTS),this.$el=null,this.$title=null,this.$main=null,this.$list=null,this.$placeholder=null,this.$parentElement=null,this.$scrollElement=null,this.$active=null,this.chapters=[],this.active=0,this.offsetWidth=0,this.offsetTop=0,this.playing=!1,this.closed=!1,this}initialize(e){let s,n,o,l;return this.attr(e),s=this.attr("created"),n=this.attr("parentElement"),o=this.attr("scrollElement"),t(n)?l=document.querySelector(n):r(n)&&(l=n),this.$parentElement=l,this.$scrollElement=_(o),this.chapters=this.attr("chapters"),this.closed=this.attr("closed"),this.active=this.attr("active"),i(s)&&s.call(this),this.chapters.length<1||(this.render().addListeners(),this.$active=document.querySelector(`#chapter-${this.active}`)),this}isClosed(){return this.closed}isSticky(){return"sticky"===this.attr("position")}isFixed(){return"fixed"===this.attr("position")}isInside(){return this.isFixed()||this.isSticky()}isOutside(){return!this.isInside()}count(){return this.chapters.length}_paintEdge(){const t=document.createDocumentFragment(),e=this.attr("title"),i=this.attr("animationCurrent"),s=this.attr("customClass"),r=this.$parentElement,n=[],o=[];let l,a,h,c,u=null;return r?(this.isInside()&&e&&(u=$("h2",{className:"outline-navigator__title"},e),this.$title=u,o.push(u)),h=$("ul",{className:"outline-navigator__list"}),this.$list=h,n.push(h),i&&(c=$("div",{className:"outline-navigator__placeholder"}),this.$placeholder=c,n.push(c)),a=$("div",{className:"outline-navigator__main"},n),this.$main=a,o.push(a),l=$("nav",{id:"outline-navigator",className:`outline-navigator ${B}`},o),this.$el=l,this.isSticky()&&(this.calculateStickyHeight(),v(l,"outline-navigator_sticky")),s&&v(l,s),t.appendChild(l),r.appendChild(t),this):this}render(){const t=this.attr("mounted"),e=this.$parentElement,s=this.chapters,r=this.count();let o;return!e||s.length<1||(this.isInside()&&v(e,"outline-navigator-parent"),this._paintEdge(),o=this.$el,this._paint(s),n((()=>{this.highlight(this.active)}),60),this.offsetTop=S(o),this.offsetWidth=o.offsetWidth,this.isFixed()&&(this.sticky(),A("--outline-navigator-width",`${this.offsetWidth}px`)),i(t)&&t.call(this),r<400&&this.onObserver()),this}erase(){return this.$list.innerHTML="",this}_paint(t){const e=this.attr("showCode"),i=this.$el,s=this.$list;return z(s,t,e),x(i,B),v(i,Y),this}_remove(){return this.$parentElement.removeChild(this.$el),this}refresh(t){const e=this.$el;return x(e,B),this.erase()._paint(t),this}_getPlaceholderOffset(t){const e=this.$main,i=this.$list,s=i.querySelector(".outline-navigator__anchor"),r=parseInt(k(e,"padding-top"),10),n=parseInt(k(e,"border-top-width"),10),o=parseInt(k(i,"padding-top"),10),l=parseInt(k(i,"margin-top"),10),a=parseInt(k(i,"border-top-width"),10);let h,c=0;return r&&(c+=r),o&&(c+=o),l&&(c+=l),n&&(c+=n),a&&(c+=a),h=s.offsetHeight*t,c+h}positionPlaceholder(t){const e=this.$list,i=this.$placeholder,s=e.querySelector(".outline-navigator__anchor"),r=this.attr("animationCurrent"),n=s.offsetHeight;let o=0;return r?(o=this._getPlaceholderOffset(t),i.style.cssText=`transform: translateY(${o}px);height:${n}px;`,this):this}highlight(t){const e=this.$el,i=this.attr("animationCurrent"),s="outline-navigator_active",o="outline-navigator_highlight";let l="relative"===this.attr("position")?this.$parentElement:this.$main,a=null,h=0;return e?(a=e.querySelector(`#chapter__anchor-${t}`),a?(this.active=parseInt(a.getAttribute("data-id"),10),this.$active&&(x(this.$active,o),x(this.$active,s)),this.$active=a,v(this.$active,s),i?this.positionPlaceholder(this.active):v(this.$active,o),n((()=>{((t,e)=>{let i,s,n=!1;return r(t)&&r(e)?(i=e.getBoundingClientRect(),s=t.getBoundingClientRect(),n=!!(s.top>=i.top&&s.right<=i.right&&s.bottom<=i.bottom&&s.left>=i.left),n):n})(this.$active,l)||(h=this._getPlaceholderOffset(this.active),E(l,h))})),this):this):this}sticky(){const t=this.attr("afterSticky"),e="outline-navigator_fixed",s=this.$el,r=this.offsetTop,n=this.$scrollElement.scrollTop;let o;return this.isFixed()?(o=n>=r,o?v(s,e):x(s,e),i(t)&&t.call(this,this.isClosed(),o),this):this}calculateStickyHeight(){const t=document.documentElement,e=Math.max(t.clientHeight||0,window.innerHeight||0);return A("--outline-sticky-height",`${e}px`),this}scrollTo(t,e){const i=this.$scrollElement;return E(i,t,e),this}show(){const t=this.attr("afterOpened"),e=this.count(),s=this.$el,r=this.$parentElement;return this.isInside()?e>800?x(r,B):(x(r,B),n((()=>{x(r,G),v(r,Y)}),30)):x(s,B),this.closed=!1,i(t)&&t.call(this),this}hide(){const t=this.attr("afterClosed"),e=this.count(),s=this.$el,r=this.$parentElement;return this.isInside()?e>800?v(r,B):(v(r,G),x(r,Y),n((()=>{v(r,B)}))):v(s,B),this.closed=!0,i(t)&&t.call(this),this}toggle(){const t=this.attr("afterToggle"),e=this.offsetTop,s=this.$scrollElement.scrollTop;let r;return this.isClosed()?this.show():this.hide(),i(t)&&n((()=>{r=s>=e,t.call(this,this.isClosed(),r)})),this}destroy(){const t=this.attr("beforeDestroy"),e=this.attr("afterDestroy");return i(t)&&t.call(this),this.removeListeners()._remove()._default(),this.scrollTimer&&(clearTimeout(this.scrollTimer),this.scrollTimer=null),this.resizeTimer&&(clearTimeout(this.resizeTimer),this.resizeTimer=null),this.observerTimer&&(clearTimeout(this.observerTimer),this.observerTimer=null),this.Observer&&(this.Observer=null),i(e)&&e.call(this),this}onObserver(){const t=this.attr("selector");return this.Observer=((t,e={})=>{const s=e.root||null,n=e.selector||".outline-heading",o=e.context||null,l={rootMargin:e.rootMargin||"0px 0px -90% 0px"},a=new IntersectionObserver((e=>{e.forEach((e=>{e.intersectionRatio>0&&i(t)&&t.call(o||e.target,e.target)}))}),l),h=r(s)?s:document;return s&&(l.root=s),h.querySelectorAll(n).forEach((t=>{a.observe(t)})),a})((t=>{const e=t.getAttribute("data-id");if(this.playing)return!1;this.observerTimer&&clearTimeout(this.observerTimer),this.observerTimer=n((()=>{this.highlight(e)}),100)}),{selector:t,context:this}),this}onSelect(t){const e=this.attr("stickyHeight"),s=t.delegateTarget,r=s.getAttribute("data-id"),o=s.href.split("#")[1],l=document.querySelector(`#${o}`),a=S(l)-(e+10),h=this.$scrollElement.scrollHeight,c=this.attr("afterScroll"),u=()=>{i(c)&&c.call(this,"chapter"),n((()=>{this.playing=!1,this.$emit("toolbar:update",{top:a,min:0,max:h})}))};return this.playing=!0,this.isFixed()?(this.sticky(),n((()=>{this.scrollTo(a,u),this.highlight(r)}),10)):(this.scrollTo(a,u),this.highlight(r)),function(t){t.stopPropagation(),t.preventDefault()}(t),this}onScroll(){const t=this.$scrollElement;return this.scrollTimer&&clearTimeout(this.scrollTimer),this.scrollTimer=n((()=>{const e=t.scrollTop,i=t.scrollHeight-t.clientHeight;this.isFixed()&&this.sticky(),this.$emit("toolbar:update",{top:e,min:0,max:i})}),100),this}onResize(){return this.isSticky()?(this.resizeTimer&&clearTimeout(this.resizeTimer),this.resizeTimer=n((()=>{this.calculateStickyHeight()})),this):this}onRefresh(t){return this.refresh(t),this}addListeners(){const t=this.$el,e=this.$scrollElement,i=e.tagName.toLowerCase();let s=e;return this.count()<1||("html"!==i&&"body"!==i||(s=window),f(t,".outline-navigator__anchor","click",this.onSelect,this,!0),c(s,"scroll",this.onScroll,this,!0),this.isSticky()&&c(window,"resize",this.onResize,this,!0),this.$on("anchors:all:paint",this.onObserver,this),this.$on("navigator:refresh",this.onRefresh,this)),this}removeListeners(){const t=this.attr("selector"),e=this.$el,i=this.$scrollElement,s=i.tagName.toLowerCase();let r=i;return this.count()<1||("html"!==s&&"body"!==s||(r=window),h(e,"click",this.onSelect),h(r,"scroll",this.onScroll),this.isSticky()&&h(window,"resize",this.onResize),this.$off("anchors:all:paint"),this.$off("navigator:refresh"),this.Observer&&document.querySelectorAll(t).forEach((t=>{this.Observer.unobserve(t)}))),this}}return J.DEFAULTS=w({parentElement:"",scrollElement:"",selector:".outline-heading",active:0,closed:!1,showCode:!0,animationCurrent:!0,position:"relative",stickyHeight:0,chapters:[],created:null,mounted:null,afterClosed:null,afterOpened:null,afterScroll:null,beforeDestroy:null,afterDestroy:null,afterSticky:null}),J})); -//# sourceMappingURL=navigator.min.js.map diff --git a/docs/js/navigator.min.js.map b/docs/js/navigator.min.js.map deleted file mode 100644 index 741ceaa0..00000000 --- a/docs/js/navigator.min.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"navigator.min.js","sources":["../../utils/types/isString.js","../../utils/lang/toString.js","../../utils/types/isFunction.js","../../utils/types/isObject.js","../../utils/types/isElement.js","../../utils/lang/later.js","../../utils/event/enum.js","../../utils/event/_off.js","../../utils/event/_delete.js","../../utils/event/purgeElement.js","../../utils/event/getListeners.js","../../utils/event/off.js","../../utils/event/at.js","../../utils/dom/matches.js","../../utils/dom/getParentOrHost.js","../../utils/event/on.js","../../utils/event/getTarget.js","../../utils/dom/resolveTextNode.js","../../utils/dom/closest.js","../../utils/types/isArray.js","../../utils/types/isDOM.js","../../utils/types/isHTMLCollection.js","../../utils/types/isFragment.js","../../utils/types/isTextNode.js","../../utils/lang/hasOwn.js","../../utils/dom/hasClass.js","../../utils/dom/addClass.js","../../utils/dom/setAttributes.js","../../utils/dom/setAttribute.js","../../utils/dom/createElement.js","../../utils/lang/easeInQuad.js","../../utils/dom/_getScrollElement.js","../../utils/dom/scrollTo.js","../../utils/dom/removeClass.js","../../utils/lang/trim.js","../../utils/dom/offsetTop.js","../../utils/dom/getStyle.js","../../utils/dom/setProperty.js","../../utils/lang/cloneDeep.js","../../utils/lang/timeSlice.js","../../_paintChapters.js","../../utils/observer/_subscribers.js","../../utils/observer/_hasDirectSubscribersFor.js","../../utils/observer/has.js","../../utils/observer/_hasSubscribers.js","../../utils/observer/emit.js","../../utils/types/isTypedArray.js","../../utils/lang/guid.js","../../utils/observer/_removeSubscriber.js","../../utils/observer/off.js","../../utils/observer/_removeSubscriberByToken.js","../../base.js","../../utils/lang/extend.js","../../utils/observer/on.js","../../navigator.js","../../utils/dom/inBounding.js","../../utils/dom/intersection.js","../../utils/event/stop.js"],"sourcesContent":["/**\r\n * 检测数据是否为 String 类型\r\n * ========================================================================\r\n * @method isArray\r\n * @param {*} str\r\n * @returns {boolean}\r\n */\r\nconst isString = (str) => {\r\n return typeof str === 'string'\r\n}\r\n\r\nexport default isString\r\n","/**\r\n * Object 对象原型上的 toString 方法\r\n * ========================================================================\r\n * @method toString\r\n * @param {*} val\r\n * @returns {string}\r\n */\r\nconst toString = (val) => {\r\n return Object.prototype.toString.apply(val)\r\n}\r\n\r\nexport default toString\r\n","import toString from '../lang/toString'\r\n\r\n/**\r\n * 检测测试数据是否为 Function 类型\r\n * ========================================================================\r\n * @method isFunction\r\n * @param {*} val - (必须)待检测的数据\r\n * @returns {boolean} 'val' 是 Function 类型返回 true,否则返回 false\r\n */\r\nconst isFunction = (val) => {\r\n return typeof val === 'function' || toString(val) === '[object Function]'\r\n}\r\n\r\nexport default isFunction\r\n","import toString from '../lang/toString'\r\nimport isFunction from './isFunction'\r\n\r\n/**\r\n * 检测数据是否为 Object 类型\r\n * ========================================================================\r\n * @method isObject\r\n * @param {*} o\r\n * @returns {boolean}\r\n */\r\nconst isObject = (o) => {\r\n return (\r\n (toString(o) === '[object Object]' ||\r\n typeof o === 'object' ||\r\n isFunction(o)) &&\r\n o !== null\r\n )\r\n}\r\n\r\nexport default isObject\r\n","import isObject from './isObject'\r\n\r\n/**\r\n * 检测数据是否为 HTMLElement DOM 节点\r\n * ========================================================================\r\n * @method isElement\r\n * @param {*} o\r\n * @returns {boolean}\r\n */\r\nconst isElement = (o) => {\r\n return !!(isObject(o) && o.nodeName && o.tagName && o.nodeType === 1)\r\n}\r\n\r\nexport default isElement\r\n","import isFunction from '../types/isFunction'\r\n\r\n/**\r\n * later - 延迟执行方法\r\n * ========================================================================\r\n * @method later\r\n * @param {Function} fn\r\n * @param {Number} [delay]\r\n * @returns {number|boolean}\r\n */\r\nconst later = (fn, delay = 300) => {\r\n if (!isFunction(fn)) {\r\n return false\r\n }\r\n\r\n return setTimeout(() => {\r\n fn()\r\n }, delay)\r\n}\r\n\r\nexport default later\r\n","export const CAPTURE_EVENTS = [\r\n 'focusout',\r\n 'blur',\r\n 'focusin',\r\n 'focus',\r\n 'load',\r\n 'unload',\r\n 'mouseenter',\r\n 'mouseleave'\r\n]\r\n","import { CAPTURE_EVENTS } from './enum'\r\nimport _delete from './_delete'\r\n\r\n/**\r\n * (私有方法)取消 type 类型的代理事件绑定\r\n * ========================================================================\r\n * 如果没有设置 handler,则销毁 this.$options 绑定的所有符合 type 事件类型的事件绑定\r\n * ========================================================================\r\n * @method _off\r\n * @param {HTMLElement} el - (必须)取消事件绑定的 DOM 元素\r\n * @param {String} type - (必须)事件类型\r\n * @param {Function} fn - (必须)事件处理器回调函数\r\n * @private\r\n */\r\nconst _off = (el, type, fn) => {\r\n const capture = CAPTURE_EVENTS.indexOf(type) > -1\r\n\r\n /* istanbul ignore else */\r\n if (fn._delegateListener) {\r\n fn = fn._delegateListener\r\n delete fn._delegateListener\r\n }\r\n\r\n // 移除缓存的 _listeners 数据\r\n _delete(el, type, fn)\r\n\r\n el.removeEventListener(type, fn, capture)\r\n}\r\n\r\nexport default _off\r\n","/**\r\n * 删除 DOM 元素缓存的 _listeners 数据\r\n * ========================================================================\r\n * @method _delete\r\n * @param {HTMLElement} el - 要删除 listener 的 DOM 元素\r\n * @param {String} type - 事件类型(名称)\r\n * @param {Function} [fn] - 事件处理器回调函数\r\n */\r\nconst _delete = function (el, type, fn) {\r\n const listeners = el._listeners\r\n let index = -1\r\n\r\n if (listeners.length < 1) {\r\n return false\r\n }\r\n\r\n // 移除缓存的 _listeners 数据\r\n listeners.forEach((listener, i) => {\r\n const handler = listener.fn\r\n\r\n if (type === listener.type) {\r\n index = i\r\n\r\n if (handler === fn) {\r\n index = i\r\n }\r\n }\r\n })\r\n\r\n /* istanbul ignore else */\r\n if (index > -1) {\r\n listeners.splice(index, 1)\r\n }\r\n}\r\n\r\nexport default _delete\r\n","import isString from '../types/isString'\r\nimport isElement from '../types/isElement'\r\nimport getListeners from './getListeners'\r\nimport _off from './_off'\r\n\r\n/**\r\n * 销毁(type 类型的)代理事件绑定\r\n * ========================================================================\r\n * 1. 设置了事件类型 type,则销毁指定类型的事件绑定,否则清除所有代理事件绑定\r\n * 2. recurse 设置为 true,递归销毁子节点全部事件绑定\r\n * ========================================================================\r\n * @method purgeElement\r\n * @param {HTMLElement|String} el - (必须)DOM 元素或者其选择器\r\n * @param {String|Boolean} type - (必须)事件类型\r\n * @param {Boolean} [recurse] - (可选)是否递归销毁子节点所有事件绑定\r\n */\r\nconst purgeElement = function (el, type, recurse = false) {\r\n const $element = isString(el) ? document.querySelector(el) : el\r\n const $children = $element.childNodes\r\n const listeners = getListeners($element, type)\r\n\r\n listeners.forEach((listener) => {\r\n _off($element, listener.type, listener.fn)\r\n })\r\n\r\n if (\r\n (recurse || type === true || arguments.length === 1) &&\r\n $element &&\r\n $children\r\n ) {\r\n $children.forEach(($child) => {\r\n if (isElement($child)) {\r\n purgeElement($child, type, recurse)\r\n }\r\n })\r\n }\r\n}\r\n\r\nexport default purgeElement\r\n","import isString from '../types/isString'\r\n\r\n/**\r\n * 获取 DOM 元素(type 事件类型)事件绑定信息\r\n * ========================================================================\r\n * 如果设置了事件类型 type, 则返回指定类型的事件绑定信息,否则返回所有事件绑定信息\r\n * ========================================================================\r\n * @methods getListeners\r\n * @param {HTMLElement} el - (必须)要获取事件绑定信息的 DOM 元素\r\n * @param {String} [type] - (可选)事件类型\r\n * @returns {Array} - 已绑定的事件信息\r\n */\r\nconst getListeners = (el, type) => {\r\n let listeners = el._listeners || []\r\n\r\n if (isString(type) && type) {\r\n listeners = listeners.filter((listener) => {\r\n return listener.type === type\r\n })\r\n }\r\n\r\n return listeners\r\n}\r\n\r\nexport default getListeners\r\n","import purgeElement from './purgeElement'\r\nimport isFunction from '../types/isFunction'\r\nimport _off from './_off'\r\n\r\n/**\r\n * 取消 type 类型的代理事件绑定\r\n * ========================================================================\r\n * 如果没有设置 handler,则销毁 this.$options 绑定的所有符合 type 事件类型的事件绑定\r\n * ========================================================================\r\n * @method off\r\n * @param {HTMLElement|Object} el - (必须)取消事件绑定的 DOM 元素\r\n * @param {String} type - (必须)事件类型\r\n * @param {Function} [fn] - (可选)事件处理器回调函数\r\n */\r\nconst off = (el, type, fn) => {\r\n // 如果不设置 fn 参数,默认清除 el 元素上绑定的所有事件处理器\r\n if (!isFunction(fn)) {\r\n purgeElement(el, type)\r\n return false\r\n }\r\n\r\n _off(el, type, fn)\r\n}\r\n\r\nexport default off\r\n","import isFunction from '../types/isFunction'\r\nimport off from './off'\r\n\r\nimport { CAPTURE_EVENTS } from './enum'\r\n\r\n/**\r\n * 绑定事件\r\n * ========================================================================\r\n * @method at\r\n * @param {HTMLElement|String|Object} el - (必须)绑定代理事件的 DOM 节点\r\n * @param {String|Function} type - (必须)事件类型或者事件处理器回调函数\r\n * @param {Function|Object} fn - (必须) 事件处理器回调函数或者传递给事件处理器回调函数的数据对象\r\n * @param {Object|Boolean} [data] - (可选)传递给事件处理器回调函数的数据对象或者事件处理器回调函数的 this 上下文指向,\r\n * @param {Object|Boolean} [context] - (可选)事件处理器回调函数的 this 上下文指向,或者是否仅触发一次\r\n * 当设置为 true 时,则事件处理器回调函数的 this 上下文指向为 data 对象\r\n * @param {Boolean} once - (可选)是否仅触发一次\r\n */\r\nconst at = (el, type, fn, data, context, once = false) => {\r\n // CAPTURE_EVENTS 中的特殊事件,采用事件捕获模型\r\n const capture = CAPTURE_EVENTS.indexOf(type) > -1\r\n const listener = function (evt) {\r\n let overrideContext = context || el\r\n\r\n // 当设置为 true 时,则事件处理器回调函数的\r\n // this 上下文指向为 data 对象\r\n if (context === true) {\r\n overrideContext = data\r\n }\r\n\r\n // 仅触发一次\r\n /* istanbul ignore else */\r\n if (once === true) {\r\n off(el, type, listener)\r\n }\r\n\r\n fn.call(overrideContext, evt, data)\r\n }\r\n\r\n if (!isFunction(fn)) {\r\n return false\r\n }\r\n\r\n if (!el._listeners) {\r\n el._listeners = []\r\n }\r\n\r\n // 缓存 options 元素绑定的事件处理器\r\n el._listeners.push({\r\n el,\r\n type,\r\n fn: listener,\r\n data,\r\n context,\r\n capture\r\n })\r\n\r\n // 缓存包装后的事件处理器\r\n fn._delegateListener = listener\r\n\r\n el.addEventListener(type, listener, capture)\r\n}\r\n\r\nexport default at\r\n","/**\r\n * 获取 options 节点下匹配 selector 选择器的 DOM 节点\r\n * ========================================================================\r\n * Element.matches() 方法可以用来判断 DOM 元素是否与给定的选择器匹配,事件代理判断是\r\n * 否触发绑定的代理事件回调函数,关键就是使用 Element.matches() 辨别当前事件触发的目\r\n * 标 DOM 元素是否为事件代理所期望触发的目标。\r\n * ========================================================================\r\n * @method matches\r\n * @see https://developer.mozilla.org/en-US/docs/web/api/element/matches\r\n * @param {HTMLElement} el - (必须)DOM 元素\r\n * @param {String} selector - (必须)匹配 DOM 元素的选择器\r\n * @returns {Boolean}\r\n */\r\nconst matches = (el, selector = '') => {\r\n const sel = selector.replace(/^>/i, '')\r\n\r\n if (!selector || !sel || !el) {\r\n return false\r\n }\r\n\r\n /* istanbul ignore else */\r\n if (el.matches) {\r\n return el.matches(sel)\r\n } else if (el.msMatchesSelector) {\r\n return el.msMatchesSelector(sel)\r\n } else {\r\n return false\r\n }\r\n}\r\n\r\nexport default matches\r\n","/**\r\n * 获取 DOM 元素的父节点\r\n * ========================================================================\r\n * @method getParentOrHost\r\n * @param {*|HTMLElement} el - (必须)要获取父节点的 DOM 元素\r\n * @returns {*|HTMLElement}\r\n */\r\nconst getParentOrHost = (el) => {\r\n return el.host && el !== document && el.host.nodeType\r\n ? el.host\r\n : el.parentNode\r\n}\r\n\r\nexport default getParentOrHost\r\n","import closest from '../dom/closest'\r\nimport off from './off'\r\nimport getTarget from './getTarget'\r\n\r\nimport { CAPTURE_EVENTS } from './enum'\r\n\r\n/**\r\n * 绑定代理事件\r\n * ========================================================================\r\n * @method on\r\n * @param {HTMLElement|String|Object} el - (必须)绑定代理事件的 DOM 节点\r\n * @param {String} selector - (必须)事件代理目标 DOM 元素的选择器\r\n * @param {String|Function} type - (必须)事件类型或者事件处理器回调函数\r\n * @param {Function|Object} fn - (可选) 事件处理器回调函数或者传递给事件处理器回调函数的数据对象\r\n * @param {Object|Boolean} [data] - (可选)传递给事件处理器回调函数的数据对象或者事件处理器回调函数的 this 上下文指向,\r\n * @param {Object|Boolean} [context] - (可选)事件处理器回调函数的 this 上下文指向,或者是否仅触发一次\r\n * 当设置为 true 时,则事件处理器回调函数的 this 上下文指向为 data 对象\r\n * @param {Boolean} once - (可选)是否仅触发一次\r\n */\r\nconst on = (el, selector, type, fn, data, context, once = false) => {\r\n // CAPTURE_EVENTS 中的特殊事件,采用事件捕获模型\r\n const capture = CAPTURE_EVENTS.indexOf(type) > -1\r\n\r\n const listener = function (evt) {\r\n const target = getTarget(evt)\r\n // 通过 Element.matches 方法获得点击的目标元素\r\n const delegateTarget = closest(target, selector, el)\r\n let overrideContext = context || el\r\n\r\n evt.delegateTarget = delegateTarget\r\n\r\n // 当设置为 true 时,则事件处理器回调函数的\r\n // this 上下文指向为 data 对象\r\n if (context === true) {\r\n overrideContext = data\r\n }\r\n\r\n /* istanbul ignore else */\r\n if (delegateTarget) {\r\n // 仅触发一次\r\n /* istanbul ignore else */\r\n if (once === true) {\r\n off(el, type, listener)\r\n }\r\n\r\n fn.call(overrideContext, evt, data)\r\n }\r\n }\r\n\r\n if (!el) {\r\n return false\r\n }\r\n\r\n if (!el._listeners) {\r\n el._listeners = []\r\n }\r\n\r\n // 缓存 options 元素绑定的事件处理器\r\n el._listeners.push({\r\n el,\r\n selector,\r\n type,\r\n fn: listener,\r\n data,\r\n context,\r\n capture\r\n })\r\n\r\n // 缓存包装后的事件处理器\r\n fn._delegateListener = listener\r\n\r\n el.addEventListener(type, listener, capture)\r\n}\r\n\r\nexport default on\r\n","import resolveTextNode from '../dom/resolveTextNode'\r\n\r\n/**\r\n * 返回触发事件的 target DOM 元素\r\n * ========================================================================\r\n * @method getTarget\r\n * @param {Event} evt - Event 对象\r\n * @return {HTMLElement} - Event 对象的 target DOM 元素\r\n */\r\nconst getTarget = function (evt) {\r\n const target = evt.target\r\n\r\n return resolveTextNode(target)\r\n}\r\n\r\nexport default getTarget\r\n","/**\r\n * 在某些情况下,某些浏览器(例如:Safari 浏览器)会返回实际的目标元素内部的文本节点。\r\n * resolveTextNode() 方法则会返回实际的目标节点。\r\n * ========================================================================\r\n * @method resolveTextNode\r\n * @param {HTMLElement|Text} el - 要解析的节点\r\n * @return {*|HTMLElement} - 实际的目标 DOM 节点\r\n */\r\nconst resolveTextNode = function (el) {\r\n if (el && el.nodeType === 3) {\r\n return el.parentNode\r\n }\r\n\r\n return el\r\n}\r\n\r\nexport default resolveTextNode\r\n","import matches from './matches'\r\nimport getParentOrHost from './getParentOrHost'\r\n\r\n/**\r\n * 获取 options 元素父元素最近的包含 selector 选择器的元素\r\n * ========================================================================\r\n * @method closest\r\n * @param {HTMLElement} el - (必须)DOM 元素\r\n * @param {String} selector - (必须)DOM 元素的选择其\r\n * @param {HTMLElement} [ctx] - (必须)比对的 DOM 元素\r\n * @param {Boolean} [includeCTX] - (必须)是否包含 context DOM 元素\r\n * @returns {null|HTMLElement} - 返回最接近的 DOM 元素\r\n */\r\nconst closest = (el, selector, ctx, includeCTX) => {\r\n const context = ctx || document\r\n\r\n if (!el) {\r\n return null\r\n }\r\n\r\n do {\r\n /* istanbul ignore else */\r\n if (\r\n (selector != null &&\r\n (selector.startsWith('>')\r\n ? el.parentNode === context && matches(el, selector)\r\n : matches(el, selector))) ||\r\n (includeCTX && el === context)\r\n ) {\r\n return el\r\n }\r\n\r\n /* istanbul ignore else */\r\n if (el === context) {\r\n break\r\n }\r\n\r\n /* jshint boss:true */\r\n } while ((el = getParentOrHost(el)))\r\n}\r\n\r\nexport default closest\r\n","import toString from '../lang/toString'\r\n\r\n/**\r\n * 检测数据是否为 Array 类型\r\n * ========================================================================\r\n * @method isArray\r\n * @param {*} o\r\n * @returns {boolean}\r\n */\r\nconst isArray = (o) => {\r\n if (Array.isArray) {\r\n return Array.isArray(o)\r\n } else {\r\n return toString(o) === '[object Array]'\r\n }\r\n}\r\n\r\nexport default isArray\r\n","import isObject from './isObject'\r\nimport isElement from './isElement'\r\nimport isHTMLCollection from './isHTMLCollection'\r\nimport isFragment from './isFragment'\r\nimport isTextNode from './isTextNode'\r\n\r\nconst isDOM = (el) => {\r\n return !!(\r\n isObject(el) &&\r\n (isElement(el) || isHTMLCollection(el) || isFragment(el) || isTextNode(el))\r\n )\r\n}\r\n\r\nexport default isDOM\r\n","import toString from '../lang/toString'\r\nimport isObject from './isObject'\r\n\r\nconst isHTMLCollection = (el) => {\r\n return !!(isObject(el) && toString(el) === '[object NodeList]')\r\n}\r\n\r\nexport default isHTMLCollection\r\n","import toString from '../lang/toString'\r\nimport isObject from './isObject'\r\n\r\nconst isFragment = (fragment) => {\r\n return !!(\r\n isObject(fragment) && toString(fragment) === '[object DocumentFragment]'\r\n )\r\n}\r\n\r\nexport default isFragment\r\n","import toString from '../lang/toString'\r\nimport isObject from './isObject'\r\n\r\nconst isTextNode = (el) => {\r\n return !!(\r\n isObject(el) &&\r\n (toString(el) === '[object Text]' || (el.tagName && el.nodeType === 3))\r\n )\r\n}\r\n\r\nexport default isTextNode\r\n","/**\r\n * 检测对象自身属性中是否具有指定的属性。\r\n * ========================================================================\r\n * @method hasOwn\r\n * @param {Object} obj - (必须)检测的目标对象\r\n * @param {String} prop - (必须)属性名\r\n * @returns {Boolean}\r\n */\r\nconst hasOwn = (obj, prop) => {\r\n const hasOwnProperty = Object.prototype.hasOwnProperty\r\n return obj && hasOwnProperty.call(obj, prop)\r\n}\r\n\r\nexport default hasOwn\r\n","import isElement from '../types/isElement'\r\n/**\r\n * 检测 DOM 节点是否包含名为 className 的样式\r\n * ========================================================================\r\n * @method hasClass\r\n * @param {HTMLElement} el - DOM 节点\r\n * @param {String} className - 样式名称\r\n * @returns {Boolean}\r\n */\r\nconst hasClass = (el, className) => {\r\n const pattern = new RegExp('(\\\\s|^)' + className + '(\\\\s|$)')\r\n let allClass\r\n let classList\r\n\r\n if (!isElement(el)) {\r\n return false\r\n }\r\n\r\n allClass = el.className\r\n\r\n if (!allClass) {\r\n return false\r\n }\r\n\r\n classList = el.classList\r\n\r\n if (classList && classList.contains) {\r\n return el.classList.contains(className)\r\n }\r\n\r\n return !!pattern.exec(allClass)\r\n}\r\n\r\nexport default hasClass\r\n","import hasClass from './hasClass'\r\n\r\n/**\r\n * 给 DOM 节点添加名为 className 的样式\r\n * ========================================================================\r\n * @method addClass\r\n * @param {HTMLElement} el - DOM 节点\r\n * @param {String} className - 样式名称\r\n * @returns {Boolean}\r\n */\r\nconst addClass = (el, className) => {\r\n let classList\r\n let allClass\r\n\r\n if (hasClass(el, className)) {\r\n return false\r\n }\r\n\r\n classList = el.classList\r\n\r\n if (classList?.add) {\r\n if (className.indexOf(' ') > -1) {\r\n className.split(' ').forEach((name) => {\r\n classList.add(name)\r\n })\r\n } else {\r\n classList.add(className)\r\n }\r\n } else {\r\n allClass = el.className\r\n allClass += allClass.length > 0 ? ' ' + className : className\r\n el.className = allClass\r\n }\r\n}\r\n\r\nexport default addClass\r\n","import isObject from '../types/isObject'\r\nimport hasOwn from '../lang/hasOwn'\r\nimport setAttribute from './setAttribute'\r\n\r\nconst setAttributes = (el, attrs) => {\r\n if (!el || !isObject(attrs)) {\r\n return false\r\n }\r\n\r\n Object.keys(attrs).forEach((attr) => {\r\n const value = attrs[attr]\r\n if (hasOwn(attrs, attr)) {\r\n setAttribute(el, attr, value)\r\n }\r\n })\r\n}\r\n\r\nexport default setAttributes\r\n","import addClass from './addClass.js'\r\n\r\n/**\r\n * 给 DOM 节点设置属性/值\r\n * ========================================================================\r\n * @method setAttribute\r\n * @param {HTMLElement} el - DOM 节点\r\n * @param {String} attr - 属性名称\r\n * @param {String|Number|Boolean} value - 属性值\r\n */\r\nconst setAttribute = (el, attr, value) => {\r\n let tagName = el.tagName.toLowerCase()\r\n\r\n switch (attr) {\r\n case 'style':\r\n el.style.cssText = value\r\n break\r\n case 'value':\r\n if (tagName === 'input' || tagName === 'textarea') {\r\n el.value = value\r\n } else {\r\n el.setAttribute(attr, value)\r\n }\r\n break\r\n case 'htmlFor':\r\n el.setAttribute('for', value)\r\n break\r\n case 'className':\r\n addClass(el, value)\r\n break\r\n case 'innerHTML':\r\n el.innerHTML = value\r\n break\r\n case 'innerText':\r\n el.innerText = value\r\n break\r\n default:\r\n el.setAttribute(attr, value)\r\n break\r\n }\r\n}\r\n\r\nexport default setAttribute\r\n","import isObject from '../types/isObject'\r\nimport isString from '../types/isString'\r\nimport isArray from '../types/isArray'\r\nimport isDOM from '../types/isDOM'\r\nimport setAttributes from './setAttributes'\r\n\r\n/**\r\n * 创建 DOM 节点,并添加属性和子节点\r\n * ========================================================================\r\n * @method createElement\r\n * @param {String} tagName - 标签名称\r\n * @param {Object|Array|HTMLElement|DocumentFragment|String} attrs - 属性对象或者子节点\r\n * @param {Array|HTMLElement|DocumentFragment|String} [children] - 子节点数组\r\n * @returns {HTMLElement}\r\n */\r\nconst createElement = (tagName, attrs, children) => {\r\n const $fragment = document.createDocumentFragment()\r\n const $el = document.createElement(tagName)\r\n const isValidChild = (child) => {\r\n return isDOM(child) || isString(child)\r\n }\r\n const append = (child) => {\r\n let $child\r\n\r\n if (!isValidChild(child)) {\r\n return false\r\n }\r\n\r\n if (isDOM(child)) {\r\n $child = child\r\n } else if (isString(child)) {\r\n $child = document.createTextNode(child)\r\n }\r\n\r\n $fragment.appendChild($child)\r\n }\r\n\r\n if (isObject(attrs)) {\r\n setAttributes($el, attrs)\r\n } else if (isArray(attrs) && attrs.every((attr) => isValidChild(attr))) {\r\n attrs.forEach((child) => {\r\n append(child)\r\n })\r\n } else if (isDOM(attrs)) {\r\n append(attrs)\r\n } else if (isString(attrs)) {\r\n append(document.createTextNode(attrs))\r\n }\r\n\r\n if (isArray(children)) {\r\n children.forEach((child) => {\r\n append(child)\r\n })\r\n } else {\r\n append(children)\r\n }\r\n\r\n $el.appendChild($fragment)\r\n\r\n return $el\r\n}\r\n\r\nexport default createElement\r\n","/**\r\n * 返回给定值的平方值\r\n * ========================================================================\r\n * @method easeInQuad\r\n * @param {Number} x\r\n * @returns {number}\r\n */\r\nconst easeInQuad = (x) => {\r\n return x * x\r\n}\r\n\r\nexport default easeInQuad\r\n","import isString from '../types/isString'\r\nimport isElement from '../types/isElement'\r\n\r\n/**\r\n * 通过给的 scrollElement 参数,获取滚动 DOM 元素\r\n * ========================================================================\r\n * @method _getScrollElement\r\n * @param {String|HTMLElement} scrollElement\r\n * @returns {Element}\r\n * @private\r\n */\r\nconst _getScrollElement = (scrollElement = null) => {\r\n let $rootElements\r\n let $scrollElement\r\n\r\n if (!scrollElement) {\r\n $rootElements = document.querySelectorAll('html,body')\r\n $scrollElement =\r\n $rootElements[0].scrollTop - $rootElements[1].scrollTop >= 0\r\n ? $rootElements[0]\r\n : $rootElements[1]\r\n } else {\r\n if (isString(scrollElement)) {\r\n $scrollElement = document.querySelector(scrollElement)\r\n } else if (isElement(scrollElement)) {\r\n $scrollElement = scrollElement\r\n }\r\n }\r\n\r\n return $scrollElement\r\n}\r\n\r\nexport default _getScrollElement\r\n","import easeInQuad from '../lang/easeInQuad'\r\nimport isFunction from '../types/isFunction'\r\nimport _getScrollElement from './_getScrollElement'\r\n\r\n/**\r\n * 指定 rootElement DOM 节点滚动到指定 top 位置\r\n * ========================================================================\r\n * @method scrollTo\r\n * @param {HTMLElement|Object} [scrollElement] - (必须)要滚动的 DOM 节点\r\n * @param {Number} top - (必须)滚动的 scrollTop 数值\r\n * @param {Function} [afterStop] - (可选)滚动完成的回调函数\r\n */\r\nconst scrollTo = (scrollElement, top, afterStop) => {\r\n const $scrollElement = _getScrollElement(scrollElement)\r\n let scrollTop = $scrollElement.scrollTop\r\n let step = 0\r\n const distance = top - scrollTop\r\n const MAX_HEIGHT = $scrollElement.scrollHeight\r\n const MAX_TOP = top - MAX_HEIGHT <= 0 ? top : MAX_HEIGHT\r\n const stop = (top) => {\r\n if (isFunction(afterStop)) {\r\n afterStop(top)\r\n }\r\n\r\n return false\r\n }\r\n const play = () => {\r\n step += 1\r\n\r\n // 向上滚动\r\n if (distance < 0) {\r\n scrollTop -= easeInQuad(step)\r\n $scrollElement.scrollTop = scrollTop\r\n\r\n console.log(\r\n '$scrollElement up',\r\n scrollElement,\r\n $scrollElement,\r\n scrollTop,\r\n $scrollElement.scrollTop\r\n )\r\n\r\n if (scrollTop <= top) {\r\n $scrollElement.scrollTop = top\r\n return stop(top)\r\n }\r\n } else {\r\n scrollTop += easeInQuad(step)\r\n $scrollElement.scrollTop = scrollTop\r\n\r\n console.log(\r\n '$scrollElement down',\r\n scrollElement,\r\n $scrollElement,\r\n scrollTop,\r\n $scrollElement.scrollTop\r\n )\r\n\r\n if (scrollTop >= MAX_TOP) {\r\n $scrollElement.scrollTop = MAX_TOP\r\n return stop(MAX_TOP)\r\n }\r\n }\r\n\r\n // eslint-disable-next-line compat/compat\r\n requestAnimationFrame(play)\r\n }\r\n\r\n // eslint-disable-next-line compat/compat\r\n requestAnimationFrame(play)\r\n}\r\n\r\nexport default scrollTo\r\n","import trim from '../lang/trim'\r\nimport hasClass from './hasClass'\r\n\r\n/**\r\n * 移除 DOM 节点的 className 样式\r\n * ========================================================================\r\n * @method removeClass\r\n * @param {HTMLElement} el - DOM 节点\r\n * @param {String} className - 样式名称\r\n * @returns {Boolean}\r\n */\r\nconst removeClass = (el, className) => {\r\n let allClass = el.className\r\n let classList\r\n\r\n if (!allClass || !hasClass(el, className)) {\r\n return false\r\n }\r\n\r\n classList = el.classList\r\n\r\n if (classList?.remove) {\r\n classList.remove(className)\r\n } else {\r\n allClass = trim(allClass.replace(className, ''))\r\n el.className = allClass\r\n }\r\n}\r\n\r\nexport default removeClass\r\n","import isString from '../types/isString'\r\n\r\n/**\r\n * 清楚字符串起始位置所有的空格\r\n * ========================================================================\r\n * @method trim\r\n * @param {string} str\r\n * @returns {string|Boolean}\r\n */\r\nconst trim = (str) => {\r\n if (!isString(str)) {\r\n return false\r\n }\r\n return str.replace(/(^\\s+)|(\\s+$)/g, '')\r\n}\r\n\r\nexport default trim\r\n","/**\r\n * 获取 DOM 节点相对于窗口的 left (纵坐标)值\r\n * ========================================================================\r\n * @method offsetTop\r\n * @param {HTMLElement} el - DOM 节点\r\n * @returns {Number}\r\n */\r\nconst offsetTop = (el) => {\r\n let top = el.offsetTop\r\n\r\n if (el.offsetParent !== null) {\r\n top += offsetTop(el.offsetParent)\r\n }\r\n\r\n return top\r\n}\r\n\r\nexport default offsetTop\r\n","/**\r\n * 获取HTML元素的某个CSS样式值\r\n * ====================================================\r\n * @param el\r\n * @param ruleName\r\n * @returns {*}\r\n */\r\nconst getStyle = (el, ruleName) => {\r\n return getComputedStyle(el)[ruleName]\r\n}\r\n\r\nexport default getStyle\r\n","const setProperty = (prop, value) => {\r\n const documentElement = document.documentElement\r\n documentElement.style.setProperty(prop, value)\r\n}\r\n\r\nexport default setProperty\r\n","import isObject from '../types/isObject'\r\nimport isArray from '../types/isArray'\r\n\r\n/**\r\n * 深拷贝对象函数\r\n * ========================================================================\r\n * @methods cloneDeep\r\n * @param {Object} obj - 深拷贝的对象\r\n * @returns {Array|Object|*}\r\n *\r\n * @example\r\n * const arr = cloneDeep([2,3,4,6])\r\n * => [2,3,4,6]\r\n */\r\nconst cloneDeep = (obj) => {\r\n let clone = {}\r\n\r\n if (obj === null) {\r\n return null\r\n }\r\n\r\n if (isArray(obj)) {\r\n clone = Array.from(obj)\r\n } else {\r\n clone = Object.assign({}, obj)\r\n Object.keys(clone).forEach((key) => {\r\n return (clone[key] = isObject(obj[key]) ? cloneDeep(obj[key]) : obj[key])\r\n })\r\n }\r\n\r\n return clone\r\n}\r\n\r\nexport default cloneDeep\r\n","/**\r\n * timeSlice.js 时间切片功能函数\r\n * ====================================================\r\n * Created By: Yaohaixiao\r\n * Update: 2023.09.04\r\n */\r\nimport isFunction from '../types/isFunction'\r\nimport later from './later'\r\n\r\nconst queue = []\r\nlet isHandling\r\nlet done\r\n\r\n// Shim from https://developers.google.com/web/updates/2015/08/using-requestidlecallback\r\nif (typeof window.requestIdleCallback === 'undefined') {\r\n window.requestIdleCallback = function (cb) {\r\n const start = Date.now()\r\n return later(function () {\r\n cb({\r\n didTimeout: false,\r\n timeRemaining: function () {\r\n return Math.max(0, 50 - (Date.now() - start))\r\n }\r\n })\r\n }, 10)\r\n }\r\n\r\n window.cancelIdleCallback = function (id) {\r\n clearTimeout(id)\r\n }\r\n}\r\n\r\nfunction runIdle(idleDeadline) {\r\n while (idleDeadline.timeRemaining() > 0 && queue.length) {\r\n const fn = queue.shift()\r\n\r\n if (!isFunction(fn)) {\r\n return false\r\n }\r\n\r\n fn()\r\n }\r\n\r\n if (queue.length) {\r\n isHandling = requestIdleCallback(runIdle)\r\n } else {\r\n isHandling = 0\r\n\r\n if (isFunction(done)) {\r\n done()\r\n done = null\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * 时间切片功能函数:主要用于优化长时任务的性能,将长时任务分解成\r\n * 多个短时间任务\r\n * ====================================================\r\n * @param {Function} fn - 需要在空闲时执行的回调函数\r\n * @param {Function} afterComplete - queen 的\r\n * @return {(function(): (boolean|undefined))|*|boolean}\r\n */\r\nconst timeSlice = (fn, afterComplete = null) => {\r\n queue.push(fn)\r\n\r\n if (isFunction(afterComplete)) {\r\n done = afterComplete\r\n }\r\n\r\n if (!isHandling) {\r\n requestIdleCallback(runIdle)\r\n }\r\n}\r\n\r\nexport default timeSlice\r\n","import createElement from './utils/dom/createElement'\r\nimport timeSlice from './utils/lang/timeSlice'\r\n\r\nconst _paintChapters = ($list, chapters, showCode = false) => {\r\n const LIMIT = 400\r\n const count = chapters.length\r\n const clones = [...chapters]\r\n const paint = (parts) => {\r\n const byId = (id) => $list.querySelector(`#${id}`)\r\n parts.forEach((chapter) => {\r\n const pid = chapter.pid\r\n const id = chapter.id\r\n const code = chapter.code\r\n const rel = chapter.rel\r\n const children = []\r\n const $text = createElement(\r\n 'span',\r\n {\r\n className: 'outline-navigator__text'\r\n },\r\n chapter.text\r\n )\r\n let $link\r\n let $code\r\n let $li\r\n let $subject\r\n let $chapter\r\n\r\n if (showCode) {\r\n $code = createElement(\r\n 'span',\r\n {\r\n className: 'outline-navigator__code',\r\n 'data-id': id\r\n },\r\n chapter.code\r\n )\r\n\r\n children.push($code)\r\n }\r\n\r\n children.push($text)\r\n\r\n $link = createElement(\r\n 'a',\r\n {\r\n id: `chapter__anchor-${id}`,\r\n className: 'outline-navigator__anchor',\r\n href: '#' + rel,\r\n rel: rel,\r\n 'data-id': id,\r\n 'data-code': code\r\n },\r\n children\r\n )\r\n\r\n $li = createElement(\r\n 'li',\r\n {\r\n id: `chapter-${id}`,\r\n className: 'outline-navigator__item',\r\n 'data-id': id,\r\n 'data-code': code\r\n },\r\n $link\r\n )\r\n\r\n if (pid === -1) {\r\n $list.appendChild($li)\r\n } else {\r\n $chapter = byId(`chapter-${pid}`)\r\n $subject = byId(`subject-${pid}`)\r\n\r\n if (!$subject) {\r\n $subject = createElement(\r\n 'ul',\r\n {\r\n id: 'subject-' + pid,\r\n className: 'outline-navigator__subject'\r\n },\r\n $li\r\n )\r\n\r\n $chapter.appendChild($subject)\r\n } else {\r\n $subject.appendChild($li)\r\n }\r\n }\r\n })\r\n }\r\n\r\n // 在大量 DOM 菜单绘制的时候,使用 TIME SLICE 拆分绘制任务\r\n // 以避免一次绘制大量 DOM 导致占用资源过高,导致卡死\r\n if (count > LIMIT) {\r\n // 同步绘制\r\n paint(clones.splice(0, LIMIT))\r\n\r\n // 剩余的采用 timeSlice 机制绘制\r\n while (clones.length > 0) {\r\n const once = clones.splice(0, LIMIT)\r\n timeSlice(() => {\r\n paint(once)\r\n })\r\n }\r\n } else {\r\n paint(clones)\r\n }\r\n}\r\n\r\nexport default _paintChapters\r\n","/**\r\n * 存储订阅者(主题和处理器的)私有对象\r\n * ========================================================================\r\n * @type {{}}\r\n * @private\r\n */\r\nconst _subscribers = {}\r\n\r\nexport default _subscribers\r\n","import _subscribers from './_subscribers'\r\nimport hasOwn from '../lang/hasOwn'\r\n\r\n/**\r\n * 判断是否存在与给定 topic 完全匹配的订阅者信息\r\n * ========================================================================\r\n * @method _hasDirectSubscribersFor\r\n * @param {String} topic - (必须)订阅主题字符串\r\n * @returns {Boolean}\r\n */\r\nconst _hasDirectSubscribersFor = (topic) => {\r\n return hasOwn(_subscribers, topic) && _subscribers[topic].length > 0\r\n}\r\n\r\nexport default _hasDirectSubscribersFor\r\n","import _hasDirectSubscribersFor from './_hasDirectSubscribersFor'\r\nimport _hasSubscribers from './_hasSubscribers'\r\n\r\n/**\r\n * 判断是否存在包含 topic 指定的订阅者信息\r\n * ========================================================================\r\n * @method has\r\n * @param {String} topic - (必须)主题名称\r\n * @param {Boolean} [isDirect] - (可选)是否为直接的主题,默认值:true\r\n * @returns {Boolean}\r\n */\r\nconst has = (topic, isDirect = true) => {\r\n return isDirect ? _hasDirectSubscribersFor(topic) : _hasSubscribers(topic)\r\n}\r\n\r\nexport default has\r\n","import _hasDirectSubscribersFor from './_hasDirectSubscribersFor'\r\n\r\n/**\r\n * 判断是否存在包含给定 topic 相关的订阅者信息\r\n * ========================================================================\r\n * @method _hasSubscribers\r\n * @param {String} topic - (必须)订阅主题字符串\r\n * @returns {Boolean}\r\n */\r\nconst _hasSubscribers = (topic) => {\r\n let found = _hasDirectSubscribersFor(topic)\r\n let position = topic.lastIndexOf('.')\r\n\r\n while (!found && position !== -1) {\r\n topic = topic.substring(0, position)\r\n position = topic.lastIndexOf('.')\r\n found = _hasDirectSubscribersFor(topic)\r\n }\r\n\r\n return found\r\n}\r\n\r\nexport default _hasSubscribers\r\n","import isTypedArray from '../types/isTypedArray'\r\nimport _subscribers from './_subscribers'\r\nimport has from './has'\r\nimport _hasDirectSubscribersFor from './_hasDirectSubscribersFor'\r\n\r\n/**\r\n * (异步)发布订阅主题信息\r\n * ========================================================================\r\n * 主题默认是异步发布的。确保在消费者处理主题时,主题的发起者不会被阻止。\r\n * ========================================================================\r\n * @method emit\r\n * @param {String} topic - (必须)主题名称\r\n * @param {Object} [data] - (可选)数据对象\r\n * @param {Boolean} [async] - (可选) 是否异步发布\r\n */\r\nconst emit = (topic, data, async = true) => {\r\n const execute = (topic) => {\r\n if (!_hasDirectSubscribersFor(topic)) {\r\n return false\r\n }\r\n\r\n _subscribers[topic].forEach((subscriber) => {\r\n // 针对 mqtt 消息服务返回的 Uint8Array 类似的 typed arrays 格式的数据\r\n // 采用 toString() 方法转化为普通(JSON)字符串\r\n const message = isTypedArray(data) ? data.toString() : data\r\n\r\n subscriber.callback.call(subscriber.context || subscriber, message)\r\n })\r\n }\r\n const deliver = () => {\r\n let subscriber = topic\r\n let position = topic.lastIndexOf('.')\r\n\r\n while (position !== -1) {\r\n subscriber = subscriber.substring(0, position)\r\n position = subscriber.lastIndexOf('.')\r\n\r\n execute(subscriber)\r\n }\r\n\r\n // 执行 topic 对应的处理器\r\n execute(topic)\r\n // 执行特殊 topic:'*'(监听全部消息的发布)\r\n execute('*')\r\n }\r\n\r\n if (!has(topic)) {\r\n return false\r\n }\r\n\r\n if (async) {\r\n setTimeout(deliver, 10)\r\n } else {\r\n deliver()\r\n }\r\n}\r\n\r\nexport default emit\r\n","import toString from '../lang/toString'\r\n/**\r\n * 判断检测数据是否为 Typed Arrays 类型的数据\r\n * ========================================================================\r\n * @param {*} val\r\n * @returns {boolean}\r\n */\r\nconst isTypedArray = (val) => {\r\n const TYPES = [\r\n '[object Int8Array]',\r\n '[object Uint8Array]',\r\n '[object Uint8ClampedArray]',\r\n '[object Int16Array]',\r\n '[object Uint16Array]',\r\n '[object Int32Array]',\r\n '[object Uint32Array]',\r\n '[object Float32Array]',\r\n '[object Float64Array]',\r\n '[object BigInt64Array]',\r\n '[object BigUint64Array]'\r\n ]\r\n\r\n return TYPES.indexOf(toString(val)) > -1\r\n}\r\n\r\nexport default isTypedArray\r\n","/**\r\n * 生成唯一 id 字符串的函数\r\n * ========================================================================\r\n * @method guid\r\n * @param {String} [prefix] - 生成 id 的前缀字符串\r\n * @return {String} 返回一个表示唯一 id 的字符串\r\n */\r\nconst guid = (() => {\r\n let uuid = 0\r\n\r\n return (prefix) => {\r\n uuid += 1\r\n\r\n return prefix ? prefix + '-' + uuid : 'guid-' + uuid\r\n }\r\n})()\r\n\r\nexport default guid\r\n","import _subscribers from './_subscribers'\r\nimport hasOwn from '../lang/hasOwn'\r\n\r\n/**\r\n * 删除与给定 topic 相同的订阅者信息\r\n * ========================================================================\r\n * @method _removeSubscriber\r\n * @param {String} topic - (必须)订阅主题字符串\r\n * @returns {Boolean}\r\n */\r\nconst _removeSubscriber = (topic) => {\r\n if (!hasOwn(_subscribers, topic)) {\r\n return false\r\n }\r\n\r\n delete _subscribers[topic]\r\n}\r\n\r\nexport default _removeSubscriber\r\n","import has from './has'\r\nimport _removeSubscriber from './_removeSubscriber'\r\nimport _removeSubscriberByToken from './_removeSubscriberByToken'\r\n\r\n/**\r\n * 取消订阅主题\r\n * ========================================================================\r\n * @method off\r\n * @param {String} topic - (必须)订阅的主题\r\n * @param {Function|String} [token] - (可选)订阅主题的处理器函数或者唯一 Id 值\r\n */\r\nconst off = (topic, token) => {\r\n if (!has(topic)) {\r\n return false\r\n }\r\n\r\n if (token) {\r\n _removeSubscriberByToken(token)\r\n } else {\r\n _removeSubscriber(topic)\r\n }\r\n}\r\n\r\nexport default off\r\n","import _subscribers from './_subscribers'\r\nimport _removeSubscriber from './_removeSubscriber'\r\n\r\n/**\r\n * 通过订阅者 token 值删除订阅者信息\r\n * ========================================================================\r\n * @method _removeSubscriberByToken\r\n * @param {String} token - 订阅者 token 字符串\r\n * @returns {boolean}\r\n * @private\r\n */\r\nconst _removeSubscriberByToken = (token) => {\r\n const keys = Object.keys(_subscribers)\r\n let index = -1\r\n\r\n if (!token || keys.length < 1) {\r\n return false\r\n }\r\n\r\n keys.forEach((subject) => {\r\n const subscriber = _subscribers[subject]\r\n let topic\r\n\r\n subscriber.forEach((execution, j) => {\r\n if (execution.callback === token || execution.token === token) {\r\n topic = execution.topic\r\n subscriber.splice(index, j)\r\n }\r\n })\r\n\r\n /* istanbul ignore else */\r\n if (subscriber.length < 1) {\r\n _removeSubscriber(topic)\r\n }\r\n })\r\n}\r\n\r\nexport default _removeSubscriberByToken\r\n","import isString from './utils/types/isString'\r\nimport hasOwn from './utils/lang/hasOwn'\r\nimport isObject from './utils/types/isObject'\r\nimport extend from './utils/lang/extend'\r\nimport publish from './utils/observer/emit'\r\nimport subscribe from './utils/observer/on'\r\nimport unsubscribe from './utils/observer/off'\r\n\r\nclass Base {\r\n constructor(options) {\r\n this.attrs = {}\r\n\r\n if (options) {\r\n this.initialize(options)\r\n }\r\n }\r\n\r\n initialize(options) {\r\n this.attr(options).render().addListeners()\r\n return this\r\n }\r\n\r\n attr(prop, value) {\r\n const attrs = this.attrs\r\n\r\n if (isString(prop)) {\r\n // 只能扩展 attrs 中已有的属性\r\n if (value && hasOwn(attrs, prop)) {\r\n // 更新单个配置信息\r\n attrs[prop] = value\r\n return this\r\n }\r\n\r\n // 只传递 prop 参数,则返回对应的属性值\r\n return attrs[prop]\r\n } else if (isObject(prop)) {\r\n // 批量更新配置信息\r\n extend(attrs, prop)\r\n\r\n return this\r\n } else if (arguments.length === 0) {\r\n // 不传递参数,直接返回整个\r\n return attrs\r\n }\r\n\r\n return this\r\n }\r\n\r\n render() {\r\n return this\r\n }\r\n\r\n refresh() {\r\n return this\r\n }\r\n\r\n destroy() {\r\n this.removeListeners()\r\n return this\r\n }\r\n\r\n reload(options) {\r\n let attrs = this.attr()\r\n\r\n if (options) {\r\n attrs = this.attr(options)\r\n }\r\n\r\n this.destroy().initialize(attrs)\r\n\r\n return this\r\n }\r\n\r\n $emit(event, data) {\r\n publish(event, data)\r\n return this\r\n }\r\n\r\n $on(event, callback) {\r\n subscribe(event, callback, this)\r\n return this\r\n }\r\n\r\n $off(event, callback) {\r\n unsubscribe(event, callback)\r\n return this\r\n }\r\n\r\n addListeners() {\r\n return this\r\n }\r\n\r\n removeListeners() {\r\n return this\r\n }\r\n}\r\n\r\nexport default Base\r\n","import hasOwn from './hasOwn'\r\n\r\n/**\r\n * 扩展对象\r\n * ========================================================================\r\n * @method extend\r\n * @param {Object} origin\r\n * @param {Object} source\r\n */\r\nconst extend = (origin, source) => {\r\n const keys = Object.keys(source)\r\n\r\n keys.forEach((prop) => {\r\n if (hasOwn(source, prop)) {\r\n origin[prop] = source[prop]\r\n }\r\n })\r\n}\r\n\r\nexport default extend\r\n","import _subscribers from './_subscribers'\r\nimport isFunction from '../types/isFunction'\r\nimport guid from '../lang/guid'\r\n\r\n/**\r\n * 订阅主题,并给出处理器函数\r\n * ========================================================================\r\n * @method on\r\n * @param {String} topic - (必须)主题名称\r\n * @param {Function} handler - (必须)主题的处理器函数\r\n * @param {Object} [context] - (可选)指定 this 执行上下文\r\n * @return {String} - 唯一的 token 字符串,例如:'guid-1'。\r\n */\r\nconst on = (topic, handler, context = null) => {\r\n const token = guid()\r\n let subject = typeof topic === 'symbol' ? topic.toString() : topic\r\n\r\n if (!isFunction(handler)) {\r\n return ''\r\n }\r\n\r\n /* istanbul ignore else */\r\n if (!_subscribers[subject]) {\r\n _subscribers[subject] = []\r\n }\r\n\r\n _subscribers[subject].push({\r\n topic: subject,\r\n callback: handler,\r\n context,\r\n token\r\n })\r\n\r\n return token\r\n}\r\n\r\nexport default on\r\n","import isString from './utils/types/isString'\r\nimport isFunction from './utils/types/isFunction'\r\nimport isElement from './utils/types/isElement'\r\nimport later from './utils/lang/later'\r\nimport at from './utils/event/at'\r\nimport on from './utils/event/on'\r\nimport off from './utils/event/off'\r\nimport stop from './utils/event/stop'\r\nimport createElement from './utils/dom/createElement'\r\nimport scrollTo from './utils/dom/scrollTo'\r\nimport addClass from './utils/dom/addClass'\r\nimport intersection from './utils/dom/intersection'\r\nimport removeClass from './utils/dom/removeClass'\r\nimport offsetTop from './utils/dom/offsetTop'\r\nimport getStyle from './utils/dom/getStyle'\r\nimport setProperty from './utils/dom/setProperty'\r\nimport _getScrollElement from './utils/dom/_getScrollElement'\r\nimport cloneDeep from './utils/lang/cloneDeep'\r\n\r\nimport _paintChapters from './_paintChapters'\r\nimport inBounding from './utils/dom/inBounding'\r\n\r\nimport Base from './base'\r\n\r\nconst HIDDEN = 'outline-navigator_hidden'\r\nconst EXPANDED = 'outline-navigator_expanded'\r\nconst FOLDED = 'outline-navigator_folded'\r\n\r\nclass Navigator extends Base {\r\n constructor(options) {\r\n super()\r\n\r\n this._default()\r\n\r\n this.scrollTimer = null\r\n this.resizeTimer = null\r\n this.observerTimer = null\r\n this.Observer = null\r\n\r\n if (options) {\r\n this.initialize(options)\r\n }\r\n }\r\n\r\n _default() {\r\n this.attrs = cloneDeep(Navigator.DEFAULTS)\r\n\r\n this.$el = null\r\n this.$title = null\r\n this.$main = null\r\n this.$list = null\r\n this.$placeholder = null\r\n this.$parentElement = null\r\n this.$scrollElement = null\r\n this.$active = null\r\n\r\n this.chapters = []\r\n this.active = 0\r\n this.offsetWidth = 0\r\n this.offsetTop = 0\r\n this.playing = false\r\n this.closed = false\r\n\r\n return this\r\n }\r\n\r\n initialize(options) {\r\n let created\r\n let parentElement\r\n let scrollElement\r\n let $parent\r\n\r\n this.attr(options)\r\n\r\n created = this.attr('created')\r\n parentElement = this.attr('parentElement')\r\n scrollElement = this.attr('scrollElement')\r\n\r\n if (isString(parentElement)) {\r\n $parent = document.querySelector(parentElement)\r\n } else if (isElement(parentElement)) {\r\n $parent = parentElement\r\n }\r\n this.$parentElement = $parent\r\n this.$scrollElement = _getScrollElement(scrollElement)\r\n\r\n this.chapters = this.attr('chapters')\r\n this.closed = this.attr('closed')\r\n this.active = this.attr('active')\r\n\r\n if (isFunction(created)) {\r\n created.call(this)\r\n }\r\n\r\n if (this.chapters.length < 1) {\r\n return this\r\n }\r\n\r\n this.render().addListeners()\r\n\r\n this.$active = document.querySelector(`#chapter-${this.active}`)\r\n\r\n return this\r\n }\r\n\r\n isClosed() {\r\n return this.closed\r\n }\r\n\r\n isSticky() {\r\n const position = this.attr('position')\r\n return position === 'sticky'\r\n }\r\n\r\n isFixed() {\r\n const position = this.attr('position')\r\n return position === 'fixed'\r\n }\r\n\r\n isInside() {\r\n return this.isFixed() || this.isSticky()\r\n }\r\n\r\n isOutside() {\r\n return !this.isInside()\r\n }\r\n\r\n count() {\r\n return this.chapters.length\r\n }\r\n\r\n _paintEdge() {\r\n const $fragment = document.createDocumentFragment()\r\n const STICKY = 'outline-navigator_sticky'\r\n const title = this.attr('title')\r\n const animationCurrent = this.attr('animationCurrent')\r\n const customClass = this.attr('customClass')\r\n const $parentElement = this.$parentElement\r\n const children = []\r\n const contents = []\r\n let $title = null\r\n let $el\r\n let $main\r\n let $list\r\n let $placeholder\r\n\r\n if (!$parentElement) {\r\n return this\r\n }\r\n\r\n if (this.isInside() && title) {\r\n $title = createElement(\r\n 'h2',\r\n {\r\n className: 'outline-navigator__title'\r\n },\r\n title\r\n )\r\n this.$title = $title\r\n contents.push($title)\r\n }\r\n\r\n $list = createElement('ul', {\r\n // 为优化性能,添加了 _fixed 和 _hidden\r\n // fixed 为了让 $list 脱离流布局\r\n // hidden 让 $list 不可见\r\n className: `outline-navigator__list`\r\n })\r\n this.$list = $list\r\n children.push($list)\r\n\r\n if (animationCurrent) {\r\n $placeholder = createElement('div', {\r\n className: 'outline-navigator__placeholder'\r\n })\r\n this.$placeholder = $placeholder\r\n children.push($placeholder)\r\n }\r\n\r\n $main = createElement(\r\n 'div',\r\n {\r\n className: 'outline-navigator__main'\r\n },\r\n children\r\n )\r\n this.$main = $main\r\n contents.push($main)\r\n\r\n $el = createElement(\r\n 'nav',\r\n {\r\n id: 'outline-navigator',\r\n className: `outline-navigator ${HIDDEN}`\r\n },\r\n contents\r\n )\r\n this.$el = $el\r\n\r\n if (this.isSticky()) {\r\n this.calculateStickyHeight()\r\n addClass($el, STICKY)\r\n }\r\n\r\n if (customClass) {\r\n addClass($el, customClass)\r\n }\r\n $fragment.appendChild($el)\r\n $parentElement.appendChild($fragment)\r\n\r\n return this\r\n }\r\n\r\n render() {\r\n const mounted = this.attr('mounted')\r\n const $parentElement = this.$parentElement\r\n const chapters = this.chapters\r\n const count = this.count()\r\n let $el\r\n\r\n if (!$parentElement || chapters.length < 1) {\r\n return this\r\n }\r\n\r\n if (this.isInside()) {\r\n addClass($parentElement, 'outline-navigator-parent')\r\n }\r\n\r\n this._paintEdge()\r\n $el = this.$el\r\n\r\n this._paint(chapters)\r\n\r\n later(() => {\r\n this.highlight(this.active)\r\n }, 60)\r\n\r\n this.offsetTop = offsetTop($el)\r\n this.offsetWidth = $el.offsetWidth\r\n\r\n if (this.isFixed()) {\r\n this.sticky()\r\n setProperty('--outline-navigator-width', `${this.offsetWidth}px`)\r\n }\r\n\r\n if (isFunction(mounted)) {\r\n mounted.call(this)\r\n }\r\n\r\n if (count < 400) {\r\n this.onObserver()\r\n }\r\n\r\n return this\r\n }\r\n\r\n erase() {\r\n this.$list.innerHTML = ''\r\n\r\n return this\r\n }\r\n\r\n _paint(chapters) {\r\n const showCode = this.attr('showCode')\r\n const $el = this.$el\r\n const $list = this.$list\r\n\r\n _paintChapters($list, chapters, showCode)\r\n removeClass($el, HIDDEN)\r\n addClass($el, EXPANDED)\r\n\r\n return this\r\n }\r\n\r\n _remove() {\r\n this.$parentElement.removeChild(this.$el)\r\n return this\r\n }\r\n\r\n refresh(chapters) {\r\n const $el = this.$el\r\n\r\n removeClass($el, HIDDEN)\r\n this.erase()._paint(chapters)\r\n\r\n return this\r\n }\r\n\r\n _getPlaceholderOffset(index) {\r\n const $main = this.$main\r\n const $list = this.$list\r\n const $anchor = $list.querySelector('.outline-navigator__anchor')\r\n const mainPaddingTop = parseInt(getStyle($main, 'padding-top'), 10)\r\n const mainBorderTop = parseInt(getStyle($main, 'border-top-width'), 10)\r\n const placeholderPaddingTop = parseInt(getStyle($list, 'padding-top'), 10)\r\n const placeholderMarginTop = parseInt(getStyle($list, 'margin-top'), 10)\r\n const placeholderBorderTop = parseInt(\r\n getStyle($list, 'border-top-width'),\r\n 10\r\n )\r\n let height = $anchor.offsetHeight\r\n let offsetTop = 0\r\n let top\r\n\r\n if (mainPaddingTop) {\r\n offsetTop += mainPaddingTop\r\n }\r\n\r\n if (placeholderPaddingTop) {\r\n offsetTop += placeholderPaddingTop\r\n }\r\n\r\n if (placeholderMarginTop) {\r\n offsetTop += placeholderMarginTop\r\n }\r\n\r\n if (mainBorderTop) {\r\n offsetTop += mainBorderTop\r\n }\r\n\r\n if (placeholderBorderTop) {\r\n offsetTop += placeholderBorderTop\r\n }\r\n\r\n top = height * index\r\n\r\n return offsetTop + top\r\n }\r\n\r\n positionPlaceholder(index) {\r\n const $list = this.$list\r\n const $placeholder = this.$placeholder\r\n const $anchor = $list.querySelector('.outline-navigator__anchor')\r\n const animationCurrent = this.attr('animationCurrent')\r\n const height = $anchor.offsetHeight\r\n let offsetTop = 0\r\n\r\n if (!animationCurrent) {\r\n return this\r\n }\r\n\r\n offsetTop = this._getPlaceholderOffset(index)\r\n\r\n $placeholder.style.cssText = `transform: translateY(${offsetTop}px);height:${height}px;`\r\n\r\n return this\r\n }\r\n\r\n highlight(id) {\r\n const $el = this.$el\r\n const animationCurrent = this.attr('animationCurrent')\r\n const position = this.attr('position')\r\n const ACTIVE = 'outline-navigator_active'\r\n const HIGHLIGHT = 'outline-navigator_highlight'\r\n let $parent = position === 'relative' ? this.$parentElement : this.$main\r\n let $anchor = null\r\n let placeholderOffsetTop = 0\r\n\r\n if (!$el) {\r\n return this\r\n }\r\n\r\n $anchor = $el.querySelector(`#chapter__anchor-${id}`)\r\n\r\n if (!$anchor) {\r\n return this\r\n }\r\n\r\n this.active = parseInt($anchor.getAttribute('data-id'), 10)\r\n\r\n if (this.$active) {\r\n removeClass(this.$active, HIGHLIGHT)\r\n removeClass(this.$active, ACTIVE)\r\n }\r\n\r\n this.$active = $anchor\r\n addClass(this.$active, ACTIVE)\r\n\r\n if (animationCurrent) {\r\n this.positionPlaceholder(this.active)\r\n } else {\r\n addClass(this.$active, HIGHLIGHT)\r\n }\r\n\r\n later(() => {\r\n if (!inBounding(this.$active, $parent)) {\r\n placeholderOffsetTop = this._getPlaceholderOffset(this.active)\r\n scrollTo($parent, placeholderOffsetTop)\r\n }\r\n })\r\n\r\n return this\r\n }\r\n\r\n sticky() {\r\n const afterSticky = this.attr('afterSticky')\r\n const FIXED = 'outline-navigator_fixed'\r\n const $el = this.$el\r\n const top = this.offsetTop\r\n const scrollTop = this.$scrollElement.scrollTop\r\n let isStickying\r\n\r\n if (!this.isFixed()) {\r\n return this\r\n }\r\n\r\n isStickying = scrollTop >= top\r\n\r\n if (isStickying) {\r\n addClass($el, FIXED)\r\n } else {\r\n removeClass($el, FIXED)\r\n }\r\n\r\n if (isFunction(afterSticky)) {\r\n afterSticky.call(this, this.isClosed(), isStickying)\r\n }\r\n\r\n return this\r\n }\r\n\r\n calculateStickyHeight() {\r\n const documentElement = document.documentElement\r\n const height = Math.max(\r\n documentElement.clientHeight || 0,\r\n window.innerHeight || 0\r\n )\r\n setProperty('--outline-sticky-height', `${height}px`)\r\n return this\r\n }\r\n\r\n scrollTo(top, after) {\r\n const el = this.$scrollElement\r\n\r\n scrollTo(el, top, after)\r\n\r\n return this\r\n }\r\n\r\n show() {\r\n const opened = this.attr('afterOpened')\r\n const count = this.count()\r\n const $el = this.$el\r\n const $parent = this.$parentElement\r\n\r\n if (this.isInside()) {\r\n if (count > 800) {\r\n removeClass($parent, HIDDEN)\r\n } else {\r\n removeClass($parent, HIDDEN)\r\n later(() => {\r\n removeClass($parent, FOLDED)\r\n addClass($parent, EXPANDED)\r\n }, 30)\r\n }\r\n } else {\r\n removeClass($el, HIDDEN)\r\n }\r\n this.closed = false\r\n\r\n if (isFunction(opened)) {\r\n opened.call(this)\r\n }\r\n\r\n return this\r\n }\r\n\r\n hide() {\r\n const closed = this.attr('afterClosed')\r\n const count = this.count()\r\n const $el = this.$el\r\n const $parent = this.$parentElement\r\n\r\n if (this.isInside()) {\r\n if (count > 800) {\r\n addClass($parent, HIDDEN)\r\n } else {\r\n addClass($parent, FOLDED)\r\n removeClass($parent, EXPANDED)\r\n later(() => {\r\n addClass($parent, HIDDEN)\r\n })\r\n }\r\n } else {\r\n addClass($el, HIDDEN)\r\n }\r\n this.closed = true\r\n\r\n if (isFunction(closed)) {\r\n closed.call(this)\r\n }\r\n\r\n return this\r\n }\r\n\r\n toggle() {\r\n const afterToggle = this.attr('afterToggle')\r\n const top = this.offsetTop\r\n const scrollTop = this.$scrollElement.scrollTop\r\n let isStickying\r\n\r\n if (this.isClosed()) {\r\n this.show()\r\n } else {\r\n this.hide()\r\n }\r\n\r\n if (isFunction(afterToggle)) {\r\n later(() => {\r\n isStickying = scrollTop >= top\r\n afterToggle.call(this, this.isClosed(), isStickying)\r\n })\r\n }\r\n\r\n return this\r\n }\r\n\r\n destroy() {\r\n const beforeDestroy = this.attr('beforeDestroy')\r\n const afterDestroy = this.attr('afterDestroy')\r\n\r\n if (isFunction(beforeDestroy)) {\r\n beforeDestroy.call(this)\r\n }\r\n\r\n this.removeListeners()._remove()._default()\r\n\r\n if (this.scrollTimer) {\r\n clearTimeout(this.scrollTimer)\r\n this.scrollTimer = null\r\n }\r\n\r\n if (this.resizeTimer) {\r\n clearTimeout(this.resizeTimer)\r\n this.resizeTimer = null\r\n }\r\n\r\n if (this.observerTimer) {\r\n clearTimeout(this.observerTimer)\r\n this.observerTimer = null\r\n }\r\n\r\n if (this.Observer) {\r\n this.Observer = null\r\n }\r\n\r\n if (isFunction(afterDestroy)) {\r\n afterDestroy.call(this)\r\n }\r\n\r\n return this\r\n }\r\n\r\n onObserver() {\r\n const selector = this.attr('selector')\r\n\r\n this.Observer = intersection(\r\n ($heading) => {\r\n const id = $heading.getAttribute('data-id')\r\n\r\n if (this.playing) {\r\n return false\r\n }\r\n\r\n if (this.observerTimer) {\r\n clearTimeout(this.observerTimer)\r\n }\r\n\r\n this.observerTimer = later(() => {\r\n this.highlight(id)\r\n }, 100)\r\n },\r\n {\r\n selector,\r\n context: this\r\n }\r\n )\r\n\r\n return this\r\n }\r\n\r\n onSelect(evt) {\r\n const stickyHeight = this.attr('stickyHeight')\r\n const $anchor = evt.delegateTarget\r\n const id = $anchor.getAttribute('data-id')\r\n const headingId = $anchor.href.split('#')[1]\r\n const $heading = document.querySelector(`#${headingId}`)\r\n const top = offsetTop($heading) - (stickyHeight + 10)\r\n const min = 0\r\n const max = this.$scrollElement.scrollHeight\r\n const afterScroll = this.attr('afterScroll')\r\n const after = () => {\r\n if (isFunction(afterScroll)) {\r\n afterScroll.call(this, 'chapter')\r\n }\r\n\r\n later(() => {\r\n this.playing = false\r\n this.$emit('toolbar:update', {\r\n top,\r\n min,\r\n max\r\n })\r\n })\r\n }\r\n\r\n this.playing = true\r\n if (this.isFixed()) {\r\n this.sticky()\r\n later(() => {\r\n this.scrollTo(top, after)\r\n this.highlight(id)\r\n }, 10)\r\n } else {\r\n this.scrollTo(top, after)\r\n this.highlight(id)\r\n }\r\n\r\n stop(evt)\r\n\r\n return this\r\n }\r\n\r\n onScroll() {\r\n const $scrollElement = this.$scrollElement\r\n\r\n if (this.scrollTimer) {\r\n clearTimeout(this.scrollTimer)\r\n }\r\n\r\n this.scrollTimer = later(() => {\r\n const top = $scrollElement.scrollTop\r\n const min = 0\r\n const max = $scrollElement.scrollHeight - $scrollElement.clientHeight\r\n\r\n if (this.isFixed()) {\r\n this.sticky()\r\n }\r\n\r\n this.$emit('toolbar:update', {\r\n top,\r\n min,\r\n max\r\n })\r\n }, 100)\r\n\r\n return this\r\n }\r\n\r\n onResize() {\r\n // 添加判断\r\n if (!this.isSticky()) {\r\n return this\r\n }\r\n\r\n if (this.resizeTimer) {\r\n clearTimeout(this.resizeTimer)\r\n }\r\n\r\n this.resizeTimer = later(() => {\r\n this.calculateStickyHeight()\r\n })\r\n\r\n return this\r\n }\r\n\r\n onRefresh(chapters) {\r\n this.refresh(chapters)\r\n\r\n return this\r\n }\r\n\r\n addListeners() {\r\n const $el = this.$el\r\n const $scrollElement = this.$scrollElement\r\n const tagName = $scrollElement.tagName.toLowerCase()\r\n let $element = $scrollElement\r\n\r\n if (this.count() < 1) {\r\n return this\r\n }\r\n\r\n if (tagName === 'html' || tagName === 'body') {\r\n $element = window\r\n }\r\n\r\n on($el, '.outline-navigator__anchor', 'click', this.onSelect, this, true)\r\n at($element, 'scroll', this.onScroll, this, true)\r\n if (this.isSticky()) {\r\n at(window, 'resize', this.onResize, this, true)\r\n }\r\n\r\n this.$on('anchors:all:paint', this.onObserver, this)\r\n this.$on('navigator:refresh', this.onRefresh, this)\r\n\r\n return this\r\n }\r\n\r\n removeListeners() {\r\n const selector = this.attr('selector')\r\n const $el = this.$el\r\n const $scrollElement = this.$scrollElement\r\n const tagName = $scrollElement.tagName.toLowerCase()\r\n let $element = $scrollElement\r\n\r\n if (this.count() < 1) {\r\n return this\r\n }\r\n\r\n if (tagName === 'html' || tagName === 'body') {\r\n $element = window\r\n }\r\n\r\n off($el, 'click', this.onSelect)\r\n off($element, 'scroll', this.onScroll)\r\n if (this.isSticky()) {\r\n off(window, 'resize', this.onResize)\r\n }\r\n this.$off('anchors:all:paint')\r\n this.$off('navigator:refresh')\r\n\r\n if (this.Observer) {\r\n document.querySelectorAll(selector).forEach((section) => {\r\n this.Observer.unobserve(section)\r\n })\r\n }\r\n\r\n return this\r\n }\r\n}\r\n\r\nNavigator.DEFAULTS = (() => {\r\n const OPTIONS = {\r\n parentElement: '',\r\n scrollElement: '',\r\n selector: '.outline-heading',\r\n active: 0,\r\n closed: false,\r\n showCode: true,\r\n animationCurrent: true,\r\n position: 'relative',\r\n stickyHeight: 0,\r\n chapters: [],\r\n created: null,\r\n mounted: null,\r\n afterClosed: null,\r\n afterOpened: null,\r\n afterScroll: null,\r\n beforeDestroy: null,\r\n afterDestroy: null,\r\n afterSticky: null\r\n }\r\n\r\n return cloneDeep(OPTIONS)\r\n})()\r\n\r\nexport default Navigator\r\n","import isElement from '../types/isElement'\r\n\r\n/**\r\n * 检测某个 DOM 节点的位置是否在另个一个 DOM 节点范围内\r\n * ========================================================================\r\n * @method inBounding\r\n * @param {HTMLElement} child\r\n * @param {HTMLElement} parent\r\n * @return {Boolean}\r\n */\r\nconst inBounding = (child, parent) => {\r\n let isInBounding = false\r\n let parentRect\r\n let childRect\r\n\r\n if (!isElement(child) || !isElement(parent)) {\r\n return isInBounding\r\n }\r\n\r\n parentRect = parent.getBoundingClientRect()\r\n childRect = child.getBoundingClientRect()\r\n\r\n isInBounding = !!(\r\n childRect.top >= parentRect.top &&\r\n childRect.right <= parentRect.right &&\r\n childRect.bottom <= parentRect.bottom &&\r\n childRect.left >= parentRect.left\r\n )\r\n\r\n return isInBounding\r\n}\r\n\r\nexport default inBounding\r\n","import isFunction from '../types/isFunction'\r\nimport isElement from '../types/isElement'\r\n\r\n/**\r\n * 通用的 IntersectionObserver 观察者处理器\r\n * ========================================================================\r\n * @method intersection\r\n * @param {Function} fn\r\n * @param {Object} [props]\r\n * @param {Object|HTMLElement} [props.root]\r\n * @param {String} [props.selector]\r\n * @param {Object} [props.context]\r\n * @param {String} [props.attr]\r\n * @param {String} [props.rootMargin]\r\n */\r\nconst intersection = (fn, props = {}) => {\r\n const root = props.root || null\r\n const selector = props.selector || '.outline-heading'\r\n const context = props.context || null\r\n const rootMargin = props.rootMargin || '0px 0px -90% 0px'\r\n const options = {\r\n rootMargin: rootMargin\r\n }\r\n // eslint-disable-next-line compat/compat\r\n const Observer = new IntersectionObserver((entries) => {\r\n entries.forEach((entry) => {\r\n if (entry.intersectionRatio > 0) {\r\n if (isFunction(fn)) {\r\n fn.call(context || entry.target, entry.target)\r\n }\r\n }\r\n })\r\n }, options)\r\n const $root = isElement(root) ? root : document\r\n\r\n if (root) {\r\n options.root = root\r\n }\r\n\r\n $root.querySelectorAll(selector).forEach((section) => {\r\n Observer.observe(section)\r\n })\r\n\r\n return Observer\r\n}\r\n\r\nexport default intersection\r\n","/**\r\n * 停止事件(阻止默认行为和阻止事件的捕获或冒泡)\r\n * ========================================================================\r\n * @method stop\r\n * @param {Event} evt - 事件对象\r\n *\r\n * @example\r\n *
\r\n * Service\r\n * Help\r\n *
\r\n *\r\n * const $nav = document.querySelector('#nav')\r\n * const $service = document.querySelector('.anchor')\r\n *\r\n * on($nav, 'click', function(evt) {\r\n * console.log('你点击了导航栏')\r\n * })\r\n *\r\n * on($anchor, 'click', function(evt) {\r\n * console.log('tagName', this.tagName)\r\n *\r\n * // 工作台输出:'a'\r\n * // 不会触发事件冒泡,输出:'你点击了导航栏'\r\n * // 也不会切换到 href 属性的页面,阻止了点击链接的默认行为\r\n * stopEvent(evt)\r\n * })\r\n */\r\nconst stop = function (evt) {\r\n evt.stopPropagation()\r\n evt.preventDefault()\r\n}\r\n\r\nexport default stop\r\n"],"names":["isString","str","toString","val","Object","prototype","apply","isFunction","isObject","o","isElement","nodeName","tagName","nodeType","later","fn","delay","setTimeout","CAPTURE_EVENTS","_off","el","type","capture","indexOf","_delegateListener","listeners","_listeners","index","length","forEach","listener","i","handler","splice","_delete","removeEventListener","purgeElement","recurse","$element","document","querySelector","$children","childNodes","getListeners","filter","arguments","$child","off","at","data","context","once","evt","overrideContext","call","push","addEventListener","matches","selector","sel","replace","msMatchesSelector","getParentOrHost","host","parentNode","on","target","getTarget","delegateTarget","closest","ctx","includeCTX","startsWith","isArray","Array","isDOM","isHTMLCollection","fragment","isTextNode","hasOwn","obj","prop","hasOwnProperty","hasClass","className","pattern","RegExp","allClass","classList","contains","exec","addClass","_classList","add","split","name","setAttributes","attrs","keys","attr","value","setAttribute","toLowerCase","style","cssText","innerHTML","innerText","createElement","children","$fragment","createDocumentFragment","$el","isValidChild","child","append","createTextNode","appendChild","every","easeInQuad","x","_getScrollElement","scrollElement","$rootElements","$scrollElement","querySelectorAll","scrollTop","scrollTo","top","afterStop","step","distance","MAX_HEIGHT","scrollHeight","MAX_TOP","stop","play","console","log","requestAnimationFrame","removeClass","remove","offsetTop","offsetParent","getStyle","ruleName","getComputedStyle","setProperty","documentElement","cloneDeep","clone","from","assign","key","queue","isHandling","done","runIdle","idleDeadline","timeRemaining","shift","requestIdleCallback","window","cb","start","Date","now","didTimeout","Math","max","cancelIdleCallback","id","clearTimeout","timeSlice","afterComplete","_paintChapters","$list","chapters","showCode","count","clones","_maybeArrayLike","_toConsumableArray","paint","parts","byId","chapter","pid","code","rel","$text","text","$link","$code","$li","$subject","$chapter","href","_subscribers","_hasDirectSubscribersFor","topic","has","isDirect","found","position","lastIndexOf","substring","_hasSubscribers","emit","async","execute","subscriber","message","callback","deliver","guid","uuid","prefix","_removeSubscriber","token","subject","execution","j","_removeSubscriberByToken","Base","constructor","options","this","initialize","render","addListeners","origin","source","extend","refresh","destroy","removeListeners","reload","$emit","event","publish","$on","subscribe","$off","unsubscribe","HIDDEN","EXPANDED","FOLDED","Navigator","super","_default","scrollTimer","resizeTimer","observerTimer","Observer","DEFAULTS","$title","$main","$placeholder","$parentElement","$active","active","offsetWidth","playing","closed","created","parentElement","$parent","isClosed","isSticky","isFixed","isInside","isOutside","_paintEdge","title","animationCurrent","customClass","contents","calculateStickyHeight","mounted","_paint","highlight","sticky","onObserver","erase","_remove","removeChild","_getPlaceholderOffset","$anchor","mainPaddingTop","parseInt","mainBorderTop","placeholderPaddingTop","placeholderMarginTop","placeholderBorderTop","offsetHeight","positionPlaceholder","height","ACTIVE","HIGHLIGHT","placeholderOffsetTop","getAttribute","inBounding","parent","parentRect","childRect","isInBounding","getBoundingClientRect","right","bottom","left","afterSticky","FIXED","isStickying","clientHeight","innerHeight","after","show","opened","hide","toggle","afterToggle","beforeDestroy","afterDestroy","intersection","props","root","rootMargin","IntersectionObserver","entries","entry","intersectionRatio","$root","section","observe","$heading","onSelect","stickyHeight","headingId","afterScroll","min","stopPropagation","preventDefault","onScroll","onResize","onRefresh","unobserve","afterClosed","afterOpened"],"mappings":"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"} \ No newline at end of file diff --git a/docs/js/outline.min.js b/docs/js/outline.min.js index bd5dec33..99929a74 100644 --- a/docs/js/outline.min.js +++ b/docs/js/outline.min.js @@ -1,2 +1,2 @@ -!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(t="undefined"!=typeof globalThis?globalThis:t||self).Outline=e()}(this,(function(){"use strict";function t(t,e){(null==e||e>t.length)&&(e=t.length);for(var i=0,s=Array(e);iObject.prototype.toString.apply(t),l=t=>"function"==typeof t||"[object Function]"===o(t),a=(t,e=300)=>!!l(t)&&setTimeout((()=>{t()}),e),h=t=>("[object Object]"===o(t)||"object"==typeof t||l(t))&&null!==t,c=t=>Array.isArray?Array.isArray(t):"[object Array]"===o(t),u=t=>{let e={};return null===t?null:(c(t)?e=Array.from(t):(e=Object.assign({},t),Object.keys(e).forEach((i=>e[i]=h(t[i])?u(t[i]):t[i]))),e)},d=t=>"string"==typeof t,m=t=>!!(h(t)&&t.nodeName&&t.tagName&&1===t.nodeType),p=(t,e)=>{const i=new RegExp("(\\s|^)"+e+"(\\s|$)");let s,r;return!!m(t)&&(s=t.className,!!s&&(r=t.classList,r&&r.contains?t.classList.contains(e):!!i.exec(s)))},g=(t,e)=>{var i;let s,r;if(p(t,e))return!1;s=t.classList,null!==(i=s)&&void 0!==i&&i.add?e.indexOf(" ")>-1?e.split(" ").forEach((t=>{s.add(t)})):s.add(e):(r=t.className,r+=r.length>0?" "+e:e,t.className=r)},f=t=>t*t,b=(t=null)=>{let e,i;return t?d(t)?i=document.querySelector(t):m(t)&&(i=t):(e=document.querySelectorAll("html,body"),i=e[0].scrollTop-e[1].scrollTop>=0?e[0]:e[1]),i},y=(t,e,i)=>{const s=b(t);let r=s.scrollTop,n=0;const o=e-r,a=s.scrollHeight,h=e-a<=0?e:a,c=t=>(l(i)&&i(t),!1),u=()=>{if(n+=1,o<0){if(r-=f(n),s.scrollTop=r,console.log("$scrollElement up",t,s,r,s.scrollTop),r<=e)return s.scrollTop=e,c(e)}else if(r+=f(n),s.scrollTop=r,console.log("$scrollElement down",t,s,r,s.scrollTop),r>=h)return s.scrollTop=h,c(h);requestAnimationFrame(u)};requestAnimationFrame(u)},v=t=>!!d(t)&&t.replace(/(^\s+)|(\s+$)/g,""),$=(t,e=!1,i=null)=>{const s=/^\d(\.|(\.\d+)*)\s?/gi,r=[];let n=1,o=0,a="";return t.forEach(((t,h)=>{const c=t.tagName,u=c.replace(/h/i,"");let m=parseInt(u,10),p=-1;var g;m>n?(o+=1,p=1===o?-1:h-1):m===n||mo?1===m?(o=1,p=-1):p=r[h-1].pid:m<=o&&(1===m?o=1:(o-=n-m,o<=1&&(o=1)),p=1===o?-1:((t,e,i)=>{let s,r,n=t[i-1];for(r=0;r]+(>|$)/g,""):"")),e&&(a=v(a.replace(s,""))),l(i)&&(a=i(a)),r.push({id:h,pid:p,level:o,rel:`heading-${h}`,text:a,tagName:c})})),e?(t=>{const e={};return t.forEach((t=>{const i=JSON.stringify((t=>[t.pid])(t));e[i]=e[i]||[],e[i].push(t),t.index=e[i].length,-1===t.pid&&(t.code=String(t.index))})),Object.keys(e).forEach((t=>{e[t].forEach((t=>{const i=e[`[${t.id}]`];if(!i||!c(i))return!1;i.forEach((e=>{e.code=t.code+"."+e.index}))}))})),t})(r):r},_=t=>{const{articleElement:e,selector:s,showCode:r,chapterTextFilter:o,isTreeStructured:a}=t;let h=document.querySelector("#article"),c=[],u=[],p=null;return d(e)?h=document.querySelector(e):m(e)&&(h=e),h?(l(o)?p=o:!0===o&&(p=t=>t.replace(/\(.*?\)/,"()")),c=i(n,h.querySelectorAll(s||"h1,h2,h3,h4,h5,h6")),u=$(c,r,p),!0===a?((t,e,i)=>{const s={},r=[];return t.forEach(((t,i)=>{s[t[e]]=i,t.children=[]})),t.forEach((e=>{const n=t[s[e[i]]];-1!==e[i]?n.children.push(e):r.push(e)})),r})(u,"id","pid"):u):u},x=(t,e)=>{const i=Object.prototype.hasOwnProperty;return t&&i.call(t,e)},w=(t,e)=>{Object.keys(e).forEach((i=>{x(e,i)&&(t[i]=e[i])}))},T={},E=t=>x(T,t)&&T[t].length>0,S=(t,e=!0)=>e?E(t):(t=>{let e=E(t),i=t.lastIndexOf(".");for(;!e&&-1!==i;)i=(t=t.substring(0,i)).lastIndexOf("."),e=E(t);return e})(t),C=(t,e,i=!0)=>{const s=t=>{if(!E(t))return!1;T[t].forEach((t=>{const i=["[object Int8Array]","[object Uint8Array]","[object Uint8ClampedArray]","[object Int16Array]","[object Uint16Array]","[object Int32Array]","[object Uint32Array]","[object Float32Array]","[object Float64Array]","[object BigInt64Array]","[object BigUint64Array]"].indexOf(o(e))>-1?e.toString():e;t.callback.call(t.context||t,i)}))},r=()=>{let e=t,i=t.lastIndexOf(".");for(;-1!==i;)e=e.substring(0,i),i=e.lastIndexOf("."),s(e);s(t),s("*")};if(!S(t))return!1;i?setTimeout(r,10):r()},L=(()=>{let t=0;return e=>(t+=1,e?e+"-"+t:"guid-"+t)})(),z=t=>{if(!x(T,t))return!1;delete T[t]},k=(t,e)=>{if(!S(t))return!1;e?(t=>{const e=Object.keys(T);if(!t||e.length<1)return!1;e.forEach((e=>{const i=T[e];let s;i.forEach(((e,r)=>{e.callback!==t&&e.token!==t||(s=e.topic,i.splice(-1,r))})),i.length<1&&z(s)}))})(e):z(t)};class M{constructor(t){this.attrs={},t&&this.initialize(t)}initialize(t){return this.attr(t).render().addListeners(),this}attr(t,e){const i=this.attrs;return d(t)?e&&x(i,t)?(i[t]=e,this):i[t]:h(t)?(w(i,t),this):0===arguments.length?i:this}render(){return this}refresh(){return this}destroy(){return this.removeListeners(),this}reload(t){let e=this.attr();return t&&(e=this.attr(t)),this.destroy().initialize(e),this}$emit(t,e){return C(t,e),this}$on(t,e){return((t,e,i=null)=>{const s=L();let r="symbol"==typeof t?t.toString():t;l(e)&&(T[r]||(T[r]=[]),T[r].push({topic:r,callback:e,context:i,token:s}))})(t,e,this),this}$off(t,e){return k(t,e),this}addListeners(){return this}removeListeners(){return this}}const A=[];let O,N;function H(t){for(;t.timeRemaining()>0&&A.length;){const t=A.shift();if(!l(t))return!1;t()}A.length?O=requestIdleCallback(H):(O=0,l(N)&&(N(),N=null))}void 0===window.requestIdleCallback&&(window.requestIdleCallback=function(t){const e=Date.now();return a((function(){t({didTimeout:!1,timeRemaining:function(){return Math.max(0,50-(Date.now()-e))}})}),10)},window.cancelIdleCallback=function(t){clearTimeout(t)});const D=(t,e=null)=>{A.push(t),l(e)&&(N=e),O||requestIdleCallback(H)},j=t=>{let e=t.offsetTop;return null!==t.offsetParent&&(e+=j(t.offsetParent)),e},F=(t,e="")=>{const i=e.replace(/^>/i,"");return!!(e&&i&&t)&&(t.matches?t.matches(i):!!t.msMatchesSelector&&t.msMatchesSelector(i))},R=t=>t.host&&t!==document&&t.host.nodeType?t.host:t.parentNode,q=["focusout","blur","focusin","focus","load","unload","mouseenter","mouseleave"],I=(t,e,i)=>{const s=q.indexOf(e)>-1;i._delegateListener&&delete(i=i._delegateListener)._delegateListener,function(t,e,i){const s=t._listeners;let r=-1;if(s.length<1)return!1;s.forEach(((t,s)=>{const n=t.fn;e===t.type&&(r=s,n===i&&(r=s))})),r>-1&&s.splice(r,1)}(t,e,i),t.removeEventListener(e,i,s)},U=function(t,e,i=!1){const s=d(t)?document.querySelector(t):t,r=s.childNodes,n=((t,e)=>{let i=t._listeners||[];return d(e)&&e&&(i=i.filter((t=>t.type===e))),i})(s,e);n.forEach((t=>{I(s,t.type,t.fn)})),(i||!0===e||1===arguments.length)&&s&&r&&r.forEach((t=>{m(t)&&U(t,e,i)}))},B=(t,e,i)=>{if(!l(i))return U(t,e),!1;I(t,e,i)},P=(t,e,i,s,r,n,o=!1)=>{const l=q.indexOf(i)>-1,a=function(l){const h=function(t){const e=t.target;return(i=e)&&3===i.nodeType?i.parentNode:i;var i}(l),c=((t,e,i,s)=>{const r=i||document;if(!t)return null;do{if(null!=e&&(e.startsWith(">")?t.parentNode===r&&F(t,e):F(t,e))||s&&t===r)return t;if(t===r)break}while(t=R(t))})(h,e,t);let u=n||t;l.delegateTarget=c,!0===n&&(u=r),c&&(!0===o&&B(t,i,a),s.call(u,l,r))};if(!t)return!1;t._listeners||(t._listeners=[]),t._listeners.push({el:t,selector:e,type:i,fn:a,data:r,context:n,capture:l}),s._delegateListener=a,t.addEventListener(i,a,l)},V=function(t){t.stopPropagation(),t.preventDefault()},W=i(n,['','','','','','','','','','','','','','','','','','','','']),Q=(t,e="icon")=>d(t)?((t,e="icon")=>{const i=/id="(.*?)"/,s=/^(\w+)-/;return W.find((r=>{const n=i.exec(r)[1];return s.exec(n)[1]===e&&n===("icon"===e?`${e}-${t}`:`${e}-icon-${t}`)}))})(t,e):i(n,W),J=(t="")=>{const e=document.body;let i=document.querySelector("#outline-icons"),s=[];(t=>{if(!t)return!1;c(t)&&t.length>0?t.forEach((t=>{-1===W.indexOf(t)&&d(t)&&W.push(t)})):d(t)&&W.push(t)})(t),s=Q(),i?i.innerHTML=s.join(""):(i=document.createElement("div"),i.innerHTML=``,e.insertBefore(i.firstChild,e.firstChild))},Y=t=>{return!(!h(t)||!(m(t)||(t=>!(!h(t)||"[object NodeList]"!==o(t)))(t)||(e=t,h(e)&&"[object DocumentFragment]"===o(e))||(t=>!(!h(t)||!("[object Text]"===o(t)||t.tagName&&3===t.nodeType)))(t)));var e},G=(t,e,i)=>{let s=t.tagName.toLowerCase();switch(e){case"style":t.style.cssText=i;break;case"value":"input"===s||"textarea"===s?t.value=i:t.setAttribute(e,i);break;case"htmlFor":t.setAttribute("for",i);break;case"className":g(t,i);break;case"innerHTML":t.innerHTML=i;break;case"innerText":t.innerText=i;break;default:t.setAttribute(e,i)}},K=(t,e)=>{if(!t||!h(e))return!1;Object.keys(e).forEach((i=>{const s=e[i];x(e,i)&&G(t,i,s)}))},X=(t,e,i)=>{const s=document.createDocumentFragment(),r=document.createElement(t),n=t=>Y(t)||d(t),o=t=>{let e;if(!n(t))return!1;Y(t)?e=t:d(t)&&(e=document.createTextNode(t)),s.appendChild(e)};return h(e)?K(r,e):c(e)&&e.every((t=>n(t)))?e.forEach((t=>{o(t)})):Y(e)?o(e):d(e)&&o(document.createTextNode(e)),c(i)?i.forEach((t=>{o(t)})):o(i),r.appendChild(s),r},Z=(t,e={})=>{const i="outline-icon",s=e.size||0,r=e.color||"",n=e.iconSet||"",o=c(s)?s[0]:s,l=c(s)?s[1]:s,a=s?`width:${o}px;height:${l}px;`:"",h=r?a+`color:${r}`:a,u=e.attrs||{},m=document.createElement("i");let p,g="",f="";return d(t)?((t=>{const e=new RegExp("^\\s*(?:<\\?xml[^>]*>\\s*)?(?:<\\!doctype svg[^>]*\\s*(?:\\[?(?:\\s*]*>\\s*)*\\]?)*[^>]*>\\s*)?]*>[^]*<\\/svg>\\s*$\\s*$","i");return d(t)&&e.test(t)})(t)?f=t:(g=n&&"icon"!==n?`xlink:href="#${n}-icon-${t}"`:`xlink:href="#icon-${t}"`,f=``),m.innerHTML=f,u.className?u.className=`${i} ${u.className}`:u.className=i,K(m,u),p=m.querySelector("svg"),K(p,{"aria-hidden":!0,xmlns:"http://www.w3.org/2000/svg",class:"outline-icon__svg",width:200,height:200,style:h}),m):null},tt=(t,e={})=>Z(t,e),et=(t,e)=>{var i;let s,r=t.className;if(!r||!p(t,e))return!1;s=t.classList,null!==(i=s)&&void 0!==i&&i.remove?s.remove(e):(r=v(r.replace(e,"")),t.className=r)},it=(t,e=!0,i=!0)=>{const s="outline-heading",r=t.innerHTML;let n;if(t.innerHTML=r.replace(/^\d+(\.?\d+)*\s?/gi,""),t.removeAttribute("id"),t.removeAttribute("data-id"),et(t,s),!e)return!1;var o;n=t.querySelector(`.${s}__anchor`),i&&et(t,`${s}_start`),o=v(t.className),d(o)&&""===o&&t.removeAttribute("class"),n&&t.removeChild(n)};class st extends M{constructor(t){super(),this._default(),t&&this.initialize(t)}_default(){return this.attrs=u(st.DEFAULTS),this.$articleElement=null,this.$scrollElement=null,this.$headings=[],this}initialize(t){let e,i,s,r;return this.attr(t),r=this.attr("articleElement"),i=this.attr("scrollElement"),e=this.attr("created"),d(r)?s=document.querySelector(r):m(r)&&(s=r),s?(this.$articleElement=s,this.$scrollElement=b(i),this.$headings=this.getHeadings(),this.$headings.length<1||(l(e)&&e.call(this),this.render().addListeners()),this):this}getHeadings(){const t=this.$articleElement,e=this.attr("selector");return i(n,t.querySelectorAll(e))}count(){return this.getHeadings().length}render(){const t=this.attr("articleElement"),e=this.attr("selector"),i=this.attr("showCode"),s=this.attr("chapterTextFilter"),r=this.attr("mounted"),n=_({articleElement:t,selector:e,showCode:i,chapterTextFilter:s});return J(),this._paint(n),l(r)&&r.call(this),this}erase(){return this._remove(),this}_paint(t){const e=400,s=this.attr("hasAnchor"),r=this.attr("isAtStart"),o=this.attr("showCode"),a=this.attr("anchorURL"),h=this.attr("anchorLinkFilter"),c=this.count(),u=i(n,this.$headings),d=(i,n)=>{i.forEach(((i,c)=>{const u=c+n*e,d=t[u].code;((t,e,i)=>{const s="outline-heading",r=i.hasAnchor||!0,n=i.isAtStart||!0,o=i.showCode||!1,a=i.chapterCode||"",h=i.anchorURL||"",c=i.anchorLinkFilter||null,u=`heading-${e}`,d={id:u,className:n?`${s} ${s}_start`:s,"data-id":e},m=v(t.innerHTML);let p,g,f;if(o&&(d.innerHTML=a+" "+m,d["data-code"]=a),K(t,d),!r)return!1;p=h||(l(c)?c(t.tagName.toLowerCase(),m,e):`#${u}`),f=tt("hash",{iconSet:"outline"}),g=X("a",{id:`anchor-${e}`,className:`${s}__anchor anchor-${e}`,href:p,target:h?"_blank":"self","data-id":e},f),t.appendChild(g)})(i,u,{hasAnchor:s,isAtStart:r,showCode:o,chapterCode:d,anchorURL:a,anchorLinkFilter:h})}))};let m=-1;if(c>e)for(m+=1,d(u.splice(0,e),0);u.length>0;){const t=u.splice(0,e);D((()=>{d(t,m+=1)}),(()=>{this.$emit("anchors:all:paint")}))}else d(u,0);return this}_remove(){const t=this.attr("hasAnchor"),e=this.attr("isAtStart");return this.$headings.forEach((i=>{it(i,t,e)})),this}refresh(t){const e=this.attr("articleElement"),i=this.attr("selector"),s=this.attr("showCode"),r=this.attr("chapterTextFilter");return this.$headings=this.getHeadings(),this.erase()._paint(t||_({articleElement:e,selector:i,showCode:s,chapterTextFilter:r})),this}scrollTo(t,e){const i=this.$scrollElement;return y(i,t,e),this}destroy(){const t=this.attr("beforeDestroy"),e=this.attr("afterDestroy");return l(t)&&t.call(this),this.removeListeners()._remove()._default(),l(e)&&e.call(this),this}onAnchorTrigger(t){const e=this.attr("anchorURL"),i=this.attr("afterScroll"),s=this.attr("stickyHeight"),r=t.delegateTarget.parentNode,n=j(r)-(s+10),o=this.$scrollElement,h=o.scrollHeight-o.clientHeight;return this.scrollTo(n,(()=>{l(i)&&i.call(this,"anchor"),a((()=>{this.$emit("toolbar:update",{top:n,min:0,max:h})}))})),e||V(t),this}onRefresh(t){return this.refresh(t),this}addListeners(){const t=this.$articleElement;return this.count()<1||(P(t,".outline-heading__anchor","click",this.onAnchorTrigger,this,!0),this.$on("anchors:refresh",this.onRefresh)),this}removeListeners(){const t=this.$articleElement;return this.count()<1||(B(t,"click",this.onAnchorTrigger),this.$off("anchors:refresh",this.onRefresh)),this}}st.DEFAULTS=u({scrollElement:"html,body",articleElement:"#article",selector:"h1,h2,h3,h4,h5,h6",stickyHeight:0,anchorURL:"",hasAnchor:!0,isAtStart:!0,showCode:!1,created:null,mounted:null,afterScroll:null,beforeDestroy:null,afterDestroy:null,chapterTextFilter:null,anchorLinkFilter:null});const rt=["a","abbr","address","area","article","aside","audio","b","base","bdi","bdo","blockquote","body","br","button","canvas","caption","cite","code","col","colgroup","data","datalist","dd","del","details","dfn","dialog","div","dl","dt","em","embed","fieldset","figcaption","figure","footer","form","h1","h2","h3","h4","h5","h6","head","header","hgroup","hr","html","i","iframe","img","input","ins","kbd","label","legend","li","link","main","map","mark","math","menu","menuitem","meta","meter","nav","noscript","object","ol","optgroup","option","output","p","param","picture","pre","progress","q","rb","rp","rt","rtc","ruby","s","samp","script","search","section","select","slot","small","source","span","strong","style","sub","summary","sup","svg","table","tbody","td","template","textarea","tfoot","th","thead","time","title","tr","track","u","ul","var","video","wbr"],nt=t=>{let e,i,s;return!!d(t)&&(e=v(t).slice(0,1e3),i=/\s*|]*>|]*>|]+>/i,s=new RegExp(rt.map((t=>`<${t}\\b[^>]*>`)).join("|"),"i"),i.test(e)||s.test(e))},ot=t=>t.replace(/]*>.*?<\/script>/gi,""),lt=(t,e)=>{document.documentElement.style.setProperty(t,e)};let at=2e3;const ht=t=>(t?at=t:at+=1,lt("--outline-zIndex",`${at}`),at);class ct extends M{constructor(t){super(),this._default(),this.zIndex=0,t&&this.initialize(t)}_default(){return this.attrs=u(ct.DEFAULTS),this.title="",this.closed=!1,this.$el=null,this.$modal=null,this.$header=null,this.$title=null,this.$close=null,this.$main=null,this.$footer=null,this.$overlay=null,this}initialize(t){let e;return this.attr(t),this.title=this.attr("title"),e=this.attr("created"),l(e)&&e.call(this),this.render().addListeners(),this}setTitle(t){return this.attr("title",t),this.title=t,this.$title.innerHTML=t,this}isClosed(){return this.closed}render(){const t=this.attr("mounted"),e=this.attr("size"),i=this.attr("placement"),s=this.attr("hasClose"),r=this.attr("hasOverlay"),n=this.attr("hasOffset"),o=this.attr("hasPadding"),a=this.attr("autoHeight"),h=this.attr("overflow"),c=this.attr("customClass");let u,d,m,p,f,b,y,v,$="outline-drawer__main";return J(),this.zIndex=ht(),p=X("h2",{className:"outline-drawer__title"},this.title),this.$title=p,s&&(f=X("div",{className:"outline-drawer__close"},tt("close",{iconSet:"outline",size:20})),this.$close=f),m=X("header",{className:"outline-drawer__header"},[p,f]),this.$header=m,"hidden"===h&&($+=" overflow-hidden"),b=X("div",{className:$}),this.$main=b,o||g(b,"outline-drawer_full"),y=X("footer",{className:"outline-drawer__footer"}),this.$footer=y,d=X("div",{className:`outline-drawer__modal outline-drawer_${i} outline-drawer_${e} outline-drawer_closed`},[m,b,y]),this.$modal=d,n&&g(d,"outline-drawer_offset"),a&&g(d,"outline-drawer_auto"),c&&g(d,c),r&&(v=X("div",{className:"outline-drawer__overlay"}),this.$overlay=v),u=X("div",{className:"outline-drawer"},[d,v]),this.$el=u,document.body.appendChild(u),l(t)&&t.call(this),this}erase(){return this.$main.innerHTML="",this}_paint(t){let e=null;return l(t)?e=t():Y(t)?e=t:nt(t)&&(e=((t,e)=>{const s=document.createDocumentFragment();if(!t||!nt(t)&&!d(t)&&!m(t))return null;if(nt(t)){const e=X("div");let r=[];return e.innerHTML=ot(t),r=i(n,e.childNodes),r.forEach((t=>{s.appendChild(t)})),s}if(!d(e))return t.innerHTML;t.innerHTML=ot(e)})(t)),e&&this.$main.appendChild(e),this}_remove(){return document.body.removeChild(this.$el),this}refresh(t){return this.erase()._paint(t),this}open(){const t=this.attr("afterOpened"),e=this.$modal;return g(this.$el,"outline-drawer_opened"),et(e,"outline-drawer_closed"),g(e,"outline-drawer_opened"),a((()=>{this.closed=!1,l(t)&&t.call(this)})),this}close(){const t=this.attr("afterClosed"),e=this.$modal;return et(e,"outline-drawer_opened"),g(e,"outline-drawer_closed"),a((()=>{et(this.$el,"outline-drawer_opened"),this.closed=!0,l(t)&&t.call(this)})),this}toggle(){const t=this.attr("afterToggle"),e=this.isClosed();return e?this.open():this.close(),l(t)&&a((()=>{t.call(this,e)})),this}destroy(){const t=this.attr("afterDestroy"),e=this.attr("beforeDestroy");let i=this.zIndex;return l(e)&&e.call(this),this.removeListeners()._remove()._default(),i-=1,ht(i),this.zIndex=0,l(t)&&t.call(this),this}onClose(){return this.close(),this}addListeners(){const t=this.attr("hasClose"),e=this.attr("hasOverlay"),i=this.attr("closeOnClickModal"),s=this.$el;return t&&P(s,".outline-drawer__close","click",this.onClose,this,!0),e&&i&&P(s,".outline-drawer__overlay","click",this.onClose,this,!0),this}removeListeners(){const t=this.attr("hasClose"),e=this.attr("hasOverlay"),i=this.$el;return t||e?(B(i,"click",this.onClose),this):this}}ct.DEFAULTS=u({placement:"rtl",title:"标题",size:"regular",hasClose:!0,hasOverlay:!0,hasOffset:!1,hasPadding:!0,autoHeight:!0,closeOnClickModal:!0,overflow:"auto",created:null,mounted:null,afterClosed:null,afterOpened:null,afterScroll:null,beforeDestroy:null,afterDestroy:null,afterToggle:null});const ut=(t,e,i,s,r,n=!1)=>{const o=q.indexOf(e)>-1,a=function(o){let l=r||t;!0===r&&(l=s),!0===n&&B(t,e,a),i.call(l,o,s)};if(!l(i))return!1;t._listeners||(t._listeners=[]),t._listeners.push({el:t,type:e,fn:a,data:s,context:r,capture:o}),i._delegateListener=a,t.addEventListener(e,a,o)},dt=(t,e)=>getComputedStyle(t)[e],mt="outline-navigator_hidden",pt="outline-navigator_expanded",gt="outline-navigator_folded";class ft extends M{constructor(t){super(),this._default(),this.scrollTimer=null,this.resizeTimer=null,this.observerTimer=null,this.Observer=null,t&&this.initialize(t)}_default(){return this.attrs=u(ft.DEFAULTS),this.$el=null,this.$title=null,this.$main=null,this.$list=null,this.$placeholder=null,this.$parentElement=null,this.$scrollElement=null,this.$active=null,this.chapters=[],this.active=0,this.offsetWidth=0,this.offsetTop=0,this.playing=!1,this.closed=!1,this}initialize(t){let e,i,s,r;return this.attr(t),e=this.attr("created"),i=this.attr("parentElement"),s=this.attr("scrollElement"),d(i)?r=document.querySelector(i):m(i)&&(r=i),this.$parentElement=r,this.$scrollElement=b(s),this.chapters=this.attr("chapters"),this.closed=this.attr("closed"),this.active=this.attr("active"),l(e)&&e.call(this),this.chapters.length<1||(this.render().addListeners(),this.$active=document.querySelector(`#chapter-${this.active}`)),this}isClosed(){return this.closed}isSticky(){return"sticky"===this.attr("position")}isFixed(){return"fixed"===this.attr("position")}isInside(){return this.isFixed()||this.isSticky()}isOutside(){return!this.isInside()}count(){return this.chapters.length}_paintEdge(){const t=document.createDocumentFragment(),e=this.attr("title"),i=this.attr("animationCurrent"),s=this.attr("customClass"),r=this.$parentElement,n=[],o=[];let l,a,h,c,u=null;return r?(this.isInside()&&e&&(u=X("h2",{className:"outline-navigator__title"},e),this.$title=u,o.push(u)),h=X("ul",{className:"outline-navigator__list"}),this.$list=h,n.push(h),i&&(c=X("div",{className:"outline-navigator__placeholder"}),this.$placeholder=c,n.push(c)),a=X("div",{className:"outline-navigator__main"},n),this.$main=a,o.push(a),l=X("nav",{id:"outline-navigator",className:`outline-navigator ${mt}`},o),this.$el=l,this.isSticky()&&(this.calculateStickyHeight(),g(l,"outline-navigator_sticky")),s&&g(l,s),t.appendChild(l),r.appendChild(t),this):this}render(){const t=this.attr("mounted"),e=this.$parentElement,i=this.chapters,s=this.count();let r;return!e||i.length<1||(this.isInside()&&g(e,"outline-navigator-parent"),this._paintEdge(),r=this.$el,this._paint(i),a((()=>{this.highlight(this.active)}),60),this.offsetTop=j(r),this.offsetWidth=r.offsetWidth,this.isFixed()&&(this.sticky(),lt("--outline-navigator-width",`${this.offsetWidth}px`)),l(t)&&t.call(this),s<400&&this.onObserver()),this}erase(){return this.$list.innerHTML="",this}_paint(t){const e=this.attr("showCode"),s=this.$el;return((t,e,s=!1)=>{const r=e.length,o=i(n,e),l=e=>{const i=e=>t.querySelector(`#${e}`);e.forEach((e=>{const r=e.pid,n=e.id,o=e.code,l=e.rel,a=[],h=X("span",{className:"outline-navigator__text"},e.text);let c,u,d,m,p;s&&(u=X("span",{className:"outline-navigator__code","data-id":n},e.code),a.push(u)),a.push(h),c=X("a",{id:`chapter__anchor-${n}`,className:"outline-navigator__anchor",href:"#"+l,rel:l,"data-id":n,"data-code":o},a),d=X("li",{id:`chapter-${n}`,className:"outline-navigator__item","data-id":n,"data-code":o},c),-1===r?t.appendChild(d):(p=i(`chapter-${r}`),m=i(`subject-${r}`),m?m.appendChild(d):(m=X("ul",{id:"subject-"+r,className:"outline-navigator__subject"},d),p.appendChild(m)))}))};if(r>400)for(l(o.splice(0,400));o.length>0;){const t=o.splice(0,400);D((()=>{l(t)}))}else l(o)})(this.$list,t,e),et(s,mt),g(s,pt),this}_remove(){return this.$parentElement.removeChild(this.$el),this}refresh(t){const e=this.$el;return et(e,mt),this.erase()._paint(t),this}_getPlaceholderOffset(t){const e=this.$main,i=this.$list,s=i.querySelector(".outline-navigator__anchor"),r=parseInt(dt(e,"padding-top"),10),n=parseInt(dt(e,"border-top-width"),10),o=parseInt(dt(i,"padding-top"),10),l=parseInt(dt(i,"margin-top"),10),a=parseInt(dt(i,"border-top-width"),10);let h,c=0;return r&&(c+=r),o&&(c+=o),l&&(c+=l),n&&(c+=n),a&&(c+=a),h=s.offsetHeight*t,c+h}positionPlaceholder(t){const e=this.$list,i=this.$placeholder,s=e.querySelector(".outline-navigator__anchor"),r=this.attr("animationCurrent"),n=s.offsetHeight;let o=0;return r?(o=this._getPlaceholderOffset(t),i.style.cssText=`transform: translateY(${o}px);height:${n}px;`,this):this}highlight(t){const e=this.$el,i=this.attr("animationCurrent"),s="outline-navigator_active",r="outline-navigator_highlight";let n="relative"===this.attr("position")?this.$parentElement:this.$main,o=null,l=0;return e?(o=e.querySelector(`#chapter__anchor-${t}`),o?(this.active=parseInt(o.getAttribute("data-id"),10),this.$active&&(et(this.$active,r),et(this.$active,s)),this.$active=o,g(this.$active,s),i?this.positionPlaceholder(this.active):g(this.$active,r),a((()=>{((t,e)=>{let i,s,r=!1;return m(t)&&m(e)?(i=e.getBoundingClientRect(),s=t.getBoundingClientRect(),r=!!(s.top>=i.top&&s.right<=i.right&&s.bottom<=i.bottom&&s.left>=i.left),r):r})(this.$active,n)||(l=this._getPlaceholderOffset(this.active),y(n,l))})),this):this):this}sticky(){const t=this.attr("afterSticky"),e="outline-navigator_fixed",i=this.$el,s=this.offsetTop,r=this.$scrollElement.scrollTop;let n;return this.isFixed()?(n=r>=s,n?g(i,e):et(i,e),l(t)&&t.call(this,this.isClosed(),n),this):this}calculateStickyHeight(){const t=document.documentElement,e=Math.max(t.clientHeight||0,window.innerHeight||0);return lt("--outline-sticky-height",`${e}px`),this}scrollTo(t,e){const i=this.$scrollElement;return y(i,t,e),this}show(){const t=this.attr("afterOpened"),e=this.count(),i=this.$el,s=this.$parentElement;return this.isInside()?e>800?et(s,mt):(et(s,mt),a((()=>{et(s,gt),g(s,pt)}),30)):et(i,mt),this.closed=!1,l(t)&&t.call(this),this}hide(){const t=this.attr("afterClosed"),e=this.count(),i=this.$el,s=this.$parentElement;return this.isInside()?e>800?g(s,mt):(g(s,gt),et(s,pt),a((()=>{g(s,mt)}))):g(i,mt),this.closed=!0,l(t)&&t.call(this),this}toggle(){const t=this.attr("afterToggle"),e=this.offsetTop,i=this.$scrollElement.scrollTop;let s;return this.isClosed()?this.show():this.hide(),l(t)&&a((()=>{s=i>=e,t.call(this,this.isClosed(),s)})),this}destroy(){const t=this.attr("beforeDestroy"),e=this.attr("afterDestroy");return l(t)&&t.call(this),this.removeListeners()._remove()._default(),this.scrollTimer&&(clearTimeout(this.scrollTimer),this.scrollTimer=null),this.resizeTimer&&(clearTimeout(this.resizeTimer),this.resizeTimer=null),this.observerTimer&&(clearTimeout(this.observerTimer),this.observerTimer=null),this.Observer&&(this.Observer=null),l(e)&&e.call(this),this}onObserver(){const t=this.attr("selector");return this.Observer=((t,e={})=>{const i=e.root||null,s=e.selector||".outline-heading",r=e.context||null,n={rootMargin:e.rootMargin||"0px 0px -90% 0px"},o=new IntersectionObserver((e=>{e.forEach((e=>{e.intersectionRatio>0&&l(t)&&t.call(r||e.target,e.target)}))}),n),a=m(i)?i:document;return i&&(n.root=i),a.querySelectorAll(s).forEach((t=>{o.observe(t)})),o})((t=>{const e=t.getAttribute("data-id");if(this.playing)return!1;this.observerTimer&&clearTimeout(this.observerTimer),this.observerTimer=a((()=>{this.highlight(e)}),100)}),{selector:t,context:this}),this}onSelect(t){const e=this.attr("stickyHeight"),i=t.delegateTarget,s=i.getAttribute("data-id"),r=i.href.split("#")[1],n=document.querySelector(`#${r}`),o=j(n)-(e+10),h=this.$scrollElement.scrollHeight,c=this.attr("afterScroll"),u=()=>{l(c)&&c.call(this,"chapter"),a((()=>{this.playing=!1,this.$emit("toolbar:update",{top:o,min:0,max:h})}))};return this.playing=!0,this.isFixed()?(this.sticky(),a((()=>{this.scrollTo(o,u),this.highlight(s)}),10)):(this.scrollTo(o,u),this.highlight(s)),V(t),this}onScroll(){const t=this.$scrollElement;return this.scrollTimer&&clearTimeout(this.scrollTimer),this.scrollTimer=a((()=>{const e=t.scrollTop,i=t.scrollHeight-t.clientHeight;this.isFixed()&&this.sticky(),this.$emit("toolbar:update",{top:e,min:0,max:i})}),100),this}onResize(){return this.isSticky()?(this.resizeTimer&&clearTimeout(this.resizeTimer),this.resizeTimer=a((()=>{this.calculateStickyHeight()})),this):this}onRefresh(t){return this.refresh(t),this}addListeners(){const t=this.$el,e=this.$scrollElement,i=e.tagName.toLowerCase();let s=e;return this.count()<1||("html"!==i&&"body"!==i||(s=window),P(t,".outline-navigator__anchor","click",this.onSelect,this,!0),ut(s,"scroll",this.onScroll,this,!0),this.isSticky()&&ut(window,"resize",this.onResize,this,!0),this.$on("anchors:all:paint",this.onObserver,this),this.$on("navigator:refresh",this.onRefresh,this)),this}removeListeners(){const t=this.attr("selector"),e=this.$el,i=this.$scrollElement,s=i.tagName.toLowerCase();let r=i;return this.count()<1||("html"!==s&&"body"!==s||(r=window),B(e,"click",this.onSelect),B(r,"scroll",this.onScroll),this.isSticky()&&B(window,"resize",this.onResize),this.$off("anchors:all:paint"),this.$off("navigator:refresh"),this.Observer&&document.querySelectorAll(t).forEach((t=>{this.Observer.unobserve(t)}))),this}}ft.DEFAULTS=u({parentElement:"",scrollElement:"",selector:".outline-heading",active:0,closed:!1,showCode:!0,animationCurrent:!0,position:"relative",stickyHeight:0,chapters:[],created:null,mounted:null,afterClosed:null,afterOpened:null,afterScroll:null,beforeDestroy:null,afterDestroy:null,afterSticky:null});const bt=t=>{const e=Object.getPrototypeOf;let i;if(!(t=>h(t)&&null!==t)(t))return!1;if(i=t.prototype,!i)return!0;for(i=t;null!==e(i);)i=e(i);return e(t)===i},yt=t=>{const e={"&":"&","<":"<",">":">","'":"'",'"':"""};return t.replace(/[&<>'"]/g,(t=>e[t]||t))},vt=[];let $t;J();class _t extends M{constructor(t){super(),this._default(),t&&this.initialize(t)}_default(){return this.attrs=u(_t.DEFAULTS),this.$el=null,this.id="",this.closed=!1,this.visible=!1,this.offset=-50,this.timer=null,this.destroyed=!1,this}initialize(t){return this.attr(t),this.id=this.attr("id"),this.offset=this.attr("offset")||-50,this.$emit("created",r({},this.attr())),this.render().addListeners(),this.attr("visible")&&this.open(),this}isClosed(){return this.closed}isDestroyed(){return this.destroyed}_getClassName(){const t=this.attr("type"),e=this.attr("effect"),i=this.attr("round"),s=this.attr("closable"),r=this.attr("visible"),n=this.attr("customClass"),o=["outline-message",`outline-message_${t}`,`outline-message_${e}`];return i&&o.push("outline-message_round"),s||o.push("outline-message_full-width"),r&&o.push("outline-message_visible"),n&&o.push(n),o}render(){const t=this.attr("type"),e=this.attr("message"),i=this.attr("effect"),s=this.attr("round"),r=this.attr("closable"),n=this.attr("dangerouslyUseHTMLString"),o=this._getClassName(),l=[];let a,h,c,u,d,m=20;return s&&"default"===i&&(m=12),"plain"!==i&&(a=tt("light"===i?`circle-${t}`:t,{iconSet:"outline",size:m}),g(a,"outline-message__icon"),l.push(a)),n?(c=document.createDocumentFragment(),c.innerHTML=e):c=document.createTextNode(yt(ot(e))),h=X("p",{className:"outline-message__content"},[c]),l.push(h),r&&(u=tt("close",{iconSet:"outline",size:18}),g(u,"outline-message__close"),l.push(u)),d=X("div",{className:o.join(" ")},l),d.style.cssText="top:-50px;",this.$el=d,document.body.appendChild(this.$el),this.$emit("mounted"),this}_refreshIcon(){const t=".outline-message_hidden",e=this.$el;let i,s,r,n,o,l,a,h=20;return this.isDestroyed()?this:(o=e.querySelector(".outline-icon"),o?(i=this.attr("type"),s=this.attr("effect"),r=this.attr("round"),"plain"===s?g(o,t):(et(o,t),r&&"default"===s&&(h=12)),l=o.querySelector(".outline-icon__svg"),K(l,{style:`width:${h}px;height:${h}px;`}),a=l.querySelector("use"),n="light"===s?`circle-${i}`:i,G(a,"xlink:href",`#outline-icon-${n}`),this):this)}_refreshMessage(){const t=this.$el;let e,i,s,r;return this.isDestroyed()||(e=t.querySelector(".outline-message__content"),i=this.attr("dangerouslyUseHTMLString"),s=this.attr("message"),r=i?s:yt(ot(s)),e.innerHTML=r),this}_refreshClose(){const t=".outline-message_hidden",e=this.$el;let i,s;return this.isDestroyed()||(i=e.querySelector(".outline-message__close"),s=this.attr("closable"),i&&(s?g(i,t):et(i,t))),this}_refreshEl(){const t=this.$el;let e;return this.isDestroyed()||(e=this._getClassName(),G(t,"className",e.join(" "))),this}refresh(t){return bt(t)?(this.attr(t)._refreshIcon()._refreshMessage()._refreshClose()._refreshEl(),this):this}clearTimer(){return this.isDestroyed()||this.timer&&(clearTimeout(this.timer),this.timer=null),this}startTimer(t){return this.isDestroyed()||(this.timer=a((()=>{this.$emit("opened"),this.close()}),1e3*t)),this}open(t){const e=this.$el;let i,s,r,n;return this.isDestroyed()||(this.isClosed()&&this.refresh(t),i=this.attr("offset"),s=this.attr("duration"),r=i&&i>=this.offset?i:this.offset,n=`top:${r}px;`,this.clearTimer(),this.$emit("beforeOpen"),a((()=>{this.visible=!0,g(e,"outline-message_visible"),e.style.cssText=n,s>0&&this.startTimer(s)}),100)),this}close(){const t=this.$el;let e,i;return this.isDestroyed()||(e=this.attr("destroyAfterClosed"),i=this.attr("beforeClose"),l(i)&&i.call(this),t.style.cssText="top:-50px;",et(t,"outline-message_visible"),this.visible=!1,this.closed=!0,a((()=>{this.$emit("closed"),e&&this.destroy()}),500)),this}destroy(){return this.$emit("beforeDestroy"),this.isDestroyed()||(this.removeListeners(),document.body.removeChild(this.$el),clearTimeout(this.timer),this._default(),this.$emit("afterDestroy")),this}onMouseEnter(){return this.clearTimer(),this}onMouseLeave(){const t=this.attr("duration"),e=this.attr("delay");return t<=0||this.startTimer(e),this}onClose(){return this.clearTimer(),this.close(),this}addListeners(){const t=this.$el;return P(t,".outline-message__content","mouseenter",this.onMouseEnter,this,!0),P(t,".outline-message__content","mouseleave",this.onMouseLeave,this,!0),P(t,".outline-message__close","click",this.onClose,this,!0),this}removeListeners(){const t=this.$el;return B(t,"mouseenter",this.onMouseEnter),B(t,"mouseleave",this.onMouseLeave),B(t,"click",this.onClose),this}}_t.DEFAULTS=u({id:"",type:"info",effect:"default",round:!1,offset:30,duration:3,delay:2,message:"",customClass:"",closable:!0,visible:!0,dangerouslyUseHTMLString:!1,destroyAfterClosed:!0,beforeClose:null}),["info","success","warning","error"].forEach((t=>{_t[t]=e=>{const i={},s=L("outline-message-"),r=e.beforeClose||null;let n=e.offset||30;return d(e)?i.message=e:bt(e)&&w(i,e),i.id=s,i.type=t,i.offset=n,i.visible=!1,i.beforeClose=()=>{_t.close(s,r)},$t=new _t(i),vt.forEach((t=>{n+=t.$el.offsetHeight+16})),$t.offset=n,$t.open(),vt.push($t),$t}})),_t.close=(t,e)=>{const i=vt.length;let s,r,n=-1;if(vt.forEach(((i,s)=>{t===i.id&&(r=i.$el.offsetHeight,n=s,l(e)&&e.call(i),vt.splice(s,1))})),i<=1||-1===n||n>vt.length-1)return!1;for(s=n;s{let t=vt.length-1;for(;t>=0;t-=1)vt[t].close()};class xt{constructor(t,e){this.name=t,l(e)&&(this.action=e)}execute(){return this.action(),this}}class wt{constructor(){this.commands=[]}get(t){return this.commands.find((e=>e.name===t))}add(t){return this.commands.push(t),this}del(t){const e=this.commands,i=e.find((e=>e.name===t)),s=i?e.indexOf(i):-1;return s>-1&&e.splice(s,1),this}clear(){return this.commands=[],this}execute(t){const e=this.commands.find((e=>e.name===t));return l(null==e?void 0:e.execute)&&e.execute(),this}}const Tt=(t,e=!0)=>{const i=tt(t.icon,{iconSet:t.iconSet||"outline",color:t.color||"",size:t.size}),s=X("a",{className:"outline-toolbar__anchor",href:t.link},i),r=X("div",{className:`outline-toolbar__button ${t.name}`,"data-cmd":t.name},[t.link?s:i]);return g(i,"outline-toolbar__icon"),e&&g(r,"outline-toolbar_rounded"),t.disabled&&g(r,"outline-toolbar_disabled"),r},Et="outline-toolbar_disabled",St="outline-toolbar_hidden",Ct="outline-toolbar_active";class Lt extends M{constructor(t){super(),this._default(),t&&this.initialize(t)}_default(){return this.attrs=u(Lt.DEFAULTS),this.disabled=!1,this.closed=!1,this.$el=null,this.buttons=[],this.commands=null,this}initialize(t){let e;return this.attr(t),this.disabled=this.attr("disabled"),this.closed=this.attr("closed"),this.commands=new wt,e=this.attr("created"),l(e)&&e.call(this),this.render().addListeners(),this}isHighlight(t){const e=this.get(t);return!!e&&p(e.$el,Ct)}isDisabled(t){let e;return t?(e=this.get(t),e.disabled):this.disabled}isExist(t){return!!this.get(t)}isClosed(){return this.closed}_getCommand(t){const e=this,{action:i,name:s}=t;let r,n,o=null,a=null;return i?(a=i.handler,r=i.context||this,l(a)?n=a:d(a)&&(n=function(){e.$emit(a,s)}),l(n)&&(o=new xt(s,n.bind(r))),o):o}get(t){return this.buttons.find((e=>e.name===t))}render(){const t=this.attr("mounted"),e=this.attr("buttons")||[],i=this.attr("placement");return J(),this.$el=X("div",{id:L("outline-toolbar"),className:`outline-toolbar outline-toolbar_${i}`}),this._paint(e),document.body.appendChild(this.$el),this.closed&&this.hide(),this.disabled&&this.disable(),l(t)&&t.call(this),this}erase(){return this.$el.innerHTML="",this}_paint(t){const e=this.attr("rounded"),i=document.createDocumentFragment();return t.forEach((t=>{const s=Tt(t,e),r=this._getCommand(t),{name:n,disabled:o,context:l}=t;i.appendChild(s),this.isExist(n)||(this.buttons.push({$el:s,name:n,disabled:o||!1,context:l||this}),r&&this.commands.add(r))})),this.$el.appendChild(i),this}_remove(){return document.body.removeChild(this.$el),this}refresh(t){return this.attr({buttons:t}),this.erase()._paint(t),this}add(t){const e=this.$el,i=document.createDocumentFragment(),s=this.attr("buttons")||[],{name:r,disabled:n,context:o}=t,l=this._getCommand(t),a=t=>{const e=Tt(t);i.appendChild(e),s.push(t),this.buttons.push({$el:e,name:r,disabled:n||!1,context:o||this,command:l}),l&&this.commands.add(l)};return h(t)?a(t):c(t)&&t.forEach((t=>{h(t)&&a(t)})),e.appendChild(i),this}remove(t){const e=this.$el,i=this.buttons,s=this.get(t);let r=-1;return s?(r=i.indexOf(s),r>-1&&(i.splice(r,1),this.attr("buttons").splice(r,1)),this._disable(t),e.removeChild(s.$el),this):this}_disable(t){const e=this.get(t),i=this.commands.get(t);return!e||e.disabled||(e.disabled=!0,i&&this.commands.del(i),g(e.$el,Et)),this}_enable(t){const e=this.get(t),i=this.commands.get(t);return e&&e.disabled?(e.disabled=!1,i&&this.commands.add(i),et(e.$el,Et),this):this}disable(t){const e=this.attr("afterDisabled");return t?this._disable(t):(g(this.$el,Et),this.removeListeners(),this.disabled=!0,l(e)&&e.call(this)),this}enable(t){const e=this.attr("afterEnabled");return t?this._enable(t):(this.disabled=!1,et(this.$el,Et),this.addListeners(),l(e)&&e.call(this)),this}show(t){const e=this.attr("afterOpened"),i=this.get(t),s=this.$el;if(t){if(!i)return this;et(i.$el,St)}else et(s,St),this.closed=!1,l(e)&&a((()=>{e.call(this)}),310);return this}hide(t){const e=this.attr("afterClosed"),i=this.get(t),s=this.$el;if(t){if(!i)return this;g(i.$el,St)}else g(s,St),this.closed=!0,l(e)&&a((()=>{e.call(this)}),310);return this}toggle(t){return this.isClosed()?this.show(t):this.hide(t),this}highlight(t){const e=this.get(t);let i;return e?(i=e.$el,p(i,Ct)?et(i,Ct):g(i,Ct),this):this}destroy(){const t=this.attr("beforeDestroy"),e=this.attr("afterDestroy");return l(t)&&t.call(this),this.commands.clear(),this.removeListeners()._remove()._default(),l(e)&&e.call(this),this}execute(t){return this.isDisabled(t)||this.commands.execute(t),this}onExecute(t){const e=t.delegateTarget;let i="";return e&&(i=e.getAttribute("data-cmd"),i&&this.execute(i)),this}_updateToolbar({top:t,min:e,max:i}){const s=Math.ceil(t);return s<=e?(this.hide("up"),this.show("down")):s>=i?(this.hide("down"),this.show("up")):s>e&&s{t[`on${i}`]=t=>{C(i,{event:t,speech:e})}})),speechSynthesis.onvoiceschanged=t=>{C("voiceschanged",{event:t,speech:e})},this}}zt.isSupport="speechSynthesis"in window;const kt=(t,e)=>{let i,s=t;for(;s;)i=s.tagName.toLowerCase(),"script"!==i&&"style"!==i&&g(s,"outline-reader_sibling"),s=e?s.previousElementSibling:s.nextElementSibling},Mt=()=>{const t=navigator.userAgent;return/Mobile|mini|Fennec|Android|iP(ad|od|hone)|NokiaN[^/]*/.test(t)},At="进入阅读模式,按 ESC 键可退出阅读模式";class Ot extends M{constructor(t){super(),this._default(),t&&this.initialize(t)}_default(){return this.attrs=u(Ot.DEFAULTS),this.reading=!1,this.$target=null,this.$el=null,this.$paper=null,this.$title=null,this.$article=null,this.$progress=null,this.toolbar=null,this.speech=null,this}initialize(t){let e;return this.attr(t),e=this.attr("target"),d(e)?this.$target=document.querySelector(e):m(e)&&(this.$target=e),this.$target?(zt.isSupport&&(this.speech=new zt),this.render().addListeners(),this):this}isSpeaking(){var t;return null==this||null===(t=this.speech)||void 0===t?void 0:t.isSpeaking()}render(){return this._renderEdge()._paint(this.$target),this}erase(){return this.$article.innerHTML="",this}_paint(t){const e=document.createDocumentFragment(),s=i(n,t.cloneNode(!0).children);return a((()=>{s.forEach((t=>{e.appendChild(t)})),this.$article.appendChild(e)})),this}_remove(){const t=this.$el,e=this.toolbar;return t&&document.body.removeChild(t),e&&e.destroy(),this}refresh(){return this.erase()._paint(this.$target),this}_animateTimeline(){return window.ScrollTimeline&&Mt()?(this.$progress.animate({scale:["0 1","1 1"]},{timeline:new ScrollTimeline({source:this.$article,axis:"block"})}),this):this}_renderEdge(){const t=this.$target,e=Mt()?26:20;let i,s,r,n,o,l,h=this.attr("title");o=X("div",{className:"outline-reader__progress"}),this.$progress=o,r=t.querySelector("h1"),m(h)&&(r=h),m(r)&&(h=r.innerText),r=X("h1",{className:"outline-reader__title"},h),this.$title=r,n=X("article",{id:"outline-reader__article",className:"outline-reader__article"},Mt()?[]:[o.cloneNode()]),this.$article=n,s=X("div",{id:"outline-reader__paper",className:"outline-reader__paper"},[r,n]),this.$paper=s;const c=[];return c.push({name:"print",icon:"print",size:e,action:{context:this,handler:this.print}}),zt.isSupport&&this.attr("allowSpeak")&&c.push({name:"speak",icon:"sound",size:e,action:{context:this,handler:this.speak}}),c.push({name:"exit",icon:"close",size:e,action:{context:this,handler:this.exit}}),this.toolbar=new Lt({placement:"rtl",buttons:c}),i=X("section",{id:"outline-reader",className:"outline-reader outline-reader_hidden"},[o,s,this.toolbar.$el]),this.$el=i,document.body.appendChild(i),this._animateTimeline(),a((()=>{l=i.previousElementSibling,kt(l,!0),l=i.nextElementSibling,kt(l)})),this}enter(){const t="outline-reader",e=`${t}--reading`,i=`${t}_hidden`,s=this.$el,r=document.querySelectorAll(".outline-reader_sibling"),n=this.attr("enterReadingTip")||At;return this.reading||!s||(r.forEach((t=>{g(t,i)})),g(s,e),et(s,i),this.toolbar.show(),this.reading=!0,_t.info({round:!0,message:n}),this.$emit("reader:enter")),this}exit(){const t="speak",e="outline-reader",i=`${e}--reading`,s=`${e}_hidden`,r=this.$el,n=document.querySelectorAll(".outline-reader_sibling"),o=this.speech,l=this.toolbar;return this.reading&&r?(g(r,s),et(r,i),n.forEach((t=>{et(t,s)})),l.hide(),this.reading=!1,o&&(l.isHighlight(t)&&l.highlight(t),o.cancel()),this.$emit("reader:exit"),this):this}toggle(){return this.reading?this.exit():this.enter(),this}speak(){const t=this.$article.innerText,e=this.speech;return zt.isSupport&&e?(this.toolbar.highlight("speak"),this.isSpeaking()?e.cancel():e.speak(t),this):this}print(){return l(print)?(print(),this):this}destroy(){return this.$el?(this.removeListeners()._remove()._default(),this):this}onPrint(){return this.print(),this}onEnterReading(){return this.toggle(),this}onExitReading(t){return 27===t.keyCode&&this.reading&&(this.toggle(),V(t)),this}onRefresh(){return this.refresh(),this}addListeners(){return this.$el?(ut(document,"keyup",this.onExitReading,this,!0),this.$on("toolbar:action:print",this.onPrint),this.$on("toolbar:action:reading",this.onEnterReading),this.$on("reader:print",this.onPrint),this.$on("reader:refresh",this.onRefresh),this.$on("reader:enter",this.enter),this.$on("reader:exit",this.exit),this.$on("reader:toggle",this.toggle),this):this}removeListeners(){return this.$el?(B(document,"keyup",this.onExitReading),this.$off("toolbar:action:print"),this.$off("toolbar:action:reading"),this.$off("reader:refresh"),this.$off("reader:toggle"),this):this}}var Nt;Ot.DEFAULTS=u({target:"",title:"",enterReadingTip:At,allowSpeak:!1});class Ht extends M{constructor(t){super(),this.version="3.39.0",this._default(),t&&this.initialize(t)}_default(){const t=Ht.DEFAULTS;return this.attrs=u(t),this.$article=null,this.$scrollElement=null,this.buttons=[],this.anchors=null,this.drawer=null,this.navigator=null,this.reader=null,this.toolbar=null,this}initialize(t){let e="",i="",s=null;return this.attr(t),e=this.attr("articleElement"),i=this.attr("scrollElement"),d(e)?s=document.querySelector(e):m(e)&&(s=e),this.$article=s,this.$scrollElement=b(i),this.$emit("created",r({},this.attr())),this.render().addListeners(),this}isExpanded(){const t=this.attr("position"),e=this.drawer,i=this.navigator;return!(this.count()<0)&&("relative"===t?!e.isClosed():!i.isClosed())}getChapters(t=!1){const e=this.$article,i=this.attr("selector"),s=this.attr("showCode"),r=this.attr("chapterTextFilter");return _({articleElement:e,selector:i,showCode:s,chapterTextFilter:r,isTreeStructured:t})}count(){return this.getChapters().length}render(){const t=this.attr("hasToolbar"),e=this.$scrollElement;return this._renderReader()._renderAnchors()._renderNavigator()._renderToolbar(),e&&t&&this.$emit("toolbar:update",{top:e.scrollTop,min:0,max:e.scrollHeight}),this.$emit("mounted"),this}_renderReader(){const t=this.attr("reader");return t.target?(g(this.$article,"outline-article"),this.reader=new Ot(t),this):this}_renderAnchors(){const t=this.attr("articleElement"),e=this.attr("selector"),i=this.attr("stickyHeight"),s=this.attr("scrollElement"),r=this.attr("showCode"),n=this.attr("anchorURL"),o=this.attr("afterScroll"),l=this.attr("chapterTextFilter"),a=this.attr("anchorLinkFilter");return this.anchors=new st({articleElement:t,stickyHeight:i,scrollElement:s,selector:e,showCode:r,anchorURL:n,afterScroll:o,chapterTextFilter:l,anchorLinkFilter:a}),this}_renderNavigator(){const t=this.attr("title"),e=this.attr("stickyHeight"),i=this.attr("scrollElement"),s=this.attr("customClass"),r=this.attr("showCode"),n=this.attr("animationCurrent"),o=this.attr("closeOnClickModal"),l=this.attr("showNavModalFirst"),a=this.attr("position"),h=this.attr("placement"),c=this.attr("afterSticky"),u=this.attr("afterToggle"),d=this.attr("afterScroll"),m=this.count();let p,g=this.attr("parentElement");return m<1||(p={scrollElement:i,showCode:r,animationCurrent:n,position:a,title:t,stickyHeight:e,chapters:this.getChapters(),afterSticky:c,afterToggle:u,afterScroll:d},"relative"===a?(this.drawer=new ct({placement:h,title:t,size:"tiny",hasOffset:!0,hasPadding:!1,closeOnClickModal:o,customClass:s,afterClosed:()=>{this.toolbar.toggle()}}),g=this.drawer.$main,l&&this.drawer.open()):p.customClass=s,p.parentElement=g,this.navigator=new ft(p)),this}_renderToolbar(){const t=this.attr("position"),e=this.attr("hasToolbar"),s=this.attr("showNavModalFirst"),r=this.attr("placement"),o=this.attr("homepage"),a=this.attr("git"),h=this.attr("tags"),c=this.attr("issues"),u=this.attr("tools"),d=this.attr("reader"),m=this.count(),p={name:"up",icon:"up",size:20,action:{context:this,handler:this.toTop}},g={name:"homepage",icon:"homepage",size:20,link:o},f={name:"github",icon:"github",size:20,link:a},b={name:"tags",icon:"tags",size:20,link:h},y={name:"issues",icon:"issues",size:20,link:c},v={name:"toggle",icon:"menu",size:18,action:{context:this,handler:this.toggle}},$={name:"reading",icon:"file",size:18,action:{context:this,handler:"toolbar:action:reading"}},_={name:"print",icon:"print",size:20,action:{handler:"toolbar:action:print"}},x={name:"down",icon:"down",size:20,action:{context:this,handler:this.toBottom}},w=[];return e?(w.push(p),m>0&&w.push(v),o&&w.push(g),a&&w.push(f),h&&w.push(b),c&&w.push(y),d.target&&(w.push($),l(print)&&w.push(_)),(null==u?void 0:u.length)>0&&w.push.apply(w,i(n,u)),w.push(x),this.buttons=[].concat(w),this.toolbar=new Lt({placement:r,buttons:w}),"relative"===t&&s&&this.toolbar.hide(),this):this}refresh(){const t=this.getChapters();return this.$emit("anchors:refresh",t),this.$emit("navigator:refresh",t),this.$emit("reader:refresh"),this.$emit("refresh",t),this}addButton(t){const e=this.buttons;return e.splice(-1,0,t),this.$emit("toolbar:add:button",e),this}removeButton(t){return this.$emit("toolbar:remove:button",t),this}toTop(){const t=this.attr("afterScroll"),e=this.toolbar,i=this.navigator,s=this.count();return s>0&&(i.playing=!0),this.scrollTo(0,(()=>{e.hide("up"),e.show("down"),s>0&&(i.highlight(0),i.playing=!1,y(i.$main,0)),l(t)&&t.call(e,"up")})),this}toBottom(){const t=this.attr("afterScroll"),e=this.$scrollElement,i=this.toolbar,s=this.navigator,r=this.count(),n=Math.floor(e.scrollHeight-e.clientHeight);return r>0&&(s.playing=!0),this.scrollTo(n,(()=>{const e=s.$main;i.hide("down"),i.show("up"),r>0&&(s.highlight(r-1),y(e,e.scrollHeight),s.playing=!1),l(t)&&t.call(i,"bottom")})),this}scrollTo(t,e){return y(this.$scrollElement,t,e),this}enterReading(){return this.$emit("toolbar:toggle"),this.$emit("reader:enter"),this}exitReading(){return this.$emit("toolbar:toggle"),this.$emit("reader:exit"),this}switchReading(){return this.$emit("toolbar:toggle"),this.$emit("reader:toggle"),this}expand(){const t=this.attr("position"),e=this.toolbar,i=this.drawer,s=this.navigator;return this.count()<1||("relative"!==t?(s.show(),e.highlight("toggle")):(e.hide(),a((()=>{i.open()})))),this}collapses(){const t=this.attr("position"),e=this.toolbar,i=this.drawer,s=this.navigator;return this.count()<1||("relative"!==t?(s.hide(),e.highlight("toggle")):(e.show(),a((()=>{i.close()})))),this}toggle(){return this.isExpanded()?this.collapses():this.expand(),this}print(){return this.$emit("reader:print"),this}_destroy(){const t=this.count();let e=this.anchors,i=this.navigator,s=this.drawer,r=this.reader,n=this.toolbar,o=!1;return this.removeListeners(),r&&r.destroy(),t>0&&i&&(o=i.isOutside(),i.destroy(),o&&s&&s.destroy()),e&&e.destroy(),n&&n.destroy(),this}destroy(){return this.$emit("beforeDestroy"),this._destroy()._default(),this.$emit("destroyed"),this}addListeners(){return this.attr("hasToolbar")?(this.$on("toolbar:update",this.onToolbarUpdate),this):this}removeListeners(){return this.attr("hasToolbar")?(this.$off("toolbar:update"),this):this}}if(Ht.DEFAULTS=u({articleElement:"#article",selector:"h2,h3,h4,h5,h6",parentElement:"#aside",scrollElement:"html,body",title:"目录",position:"relative",placement:"rtl",animationCurrent:!0,showCode:!1,hasToolbar:!0,closeOnClickModal:!0,showNavModalFirst:!1,anchorURL:"",stickyHeight:0,homepage:"",git:"",tags:"",issues:"",tools:[],reader:{target:"",title:"",enterReadingTip:"进入阅读模式,按 ESC 键可退出阅读模式",allowSpeak:!1},customClass:"",afterSticky:null,afterToggle:null,afterScroll:null,chapterTextFilter:null,anchorLinkFilter:null}),null!==(Nt=window)&&void 0!==Nt&&Nt.jQuery){const t=window.jQuery;t.extend(t.fn,{outline:function(e){let i=t(this);return new Ht(t.extend({},e,{articleElement:i}))}})}return Ht})); +!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(t="undefined"!=typeof globalThis?globalThis:t||self).Outline=e()}(this,(function(){"use strict";function t(t,e){(null==e||e>t.length)&&(e=t.length);for(var i=0,r=Array(e);iObject.prototype.toString.apply(t),l=t=>"function"==typeof t||"[object Function]"===n(t),a=(t,e=300)=>!!l(t)&&setTimeout((()=>{t()}),e),h=t=>("[object Object]"===n(t)||"object"==typeof t||l(t))&&null!==t,d=t=>Array.isArray?Array.isArray(t):"[object Array]"===n(t),c=t=>{let e={};return null===t?null:(d(t)?e=Array.from(t):(e=Object.assign({},t),Object.keys(e).forEach((i=>e[i]=h(t[i])?c(t[i]):t[i]))),e)},u=t=>"string"==typeof t,p=t=>!!(h(t)&&t.nodeName&&t.tagName&&1===t.nodeType),m=(t,e)=>{const i=new RegExp("(\\s|^)"+e+"(\\s|$)");let r,o;return!!p(t)&&(r=t.className,!!r&&(o=t.classList,o&&o.contains?t.classList.contains(e):!!i.exec(r)))},g=(t,e)=>{var i;let r,o;if(m(t,e))return!1;r=t.classList,null!==(i=r)&&void 0!==i&&i.add?e.indexOf(" ")>-1?e.split(" ").forEach((t=>{r.add(t)})):r.add(e):(o=t.className,o+=o.length>0?" "+e:e,t.className=o)},_=t=>t*t,f=(t,e,i)=>{const r=((t=null)=>{let e,i;return t?u(t)?i=document.querySelector(t):p(t)&&(i=t):(e=document.querySelectorAll("html,body"),i=e[0].scrollTop-e[1].scrollTop>=0?e[0]:e[1]),i})(t);let o=r.scrollTop,s=0;const n=e-o,a=r.scrollHeight,h=e-a<=0?e:a,d=t=>(l(i)&&i(t),!1),c=()=>{if(s+=1,n<0){if(o-=_(s),r.scrollTop=o,o<=e)return r.scrollTop=e,d(e)}else if(o+=_(s),r.scrollTop=o,o>=h)return r.scrollTop=h,d(h);requestAnimationFrame(c)};requestAnimationFrame(c)},b=(t=null)=>{let e,i;return t?u(t)?i=document.querySelector(t):p(t)&&(i=t):(e=document.querySelectorAll("html,body"),i=e[0].scrollTop-e[1].scrollTop>=0?e[0]:e[1]),i},w=t=>!!u(t)&&t.replace(/(^\s+)|(\s+$)/g,""),v=(t,e=!1,i=null)=>{const r=/^\d(\.|(\.\d+)*)\s?/gi,o=[];let s=1,n=0,a="";return t.forEach(((t,h)=>{const d=t.tagName,c=d.replace(/h/i,"");let p=parseInt(c,10),m=-1;var g;p>s?(n+=1,m=1===n?-1:h-1):p===s||pn?1===p?(n=1,m=-1):m=o[h-1].pid:p<=n&&(1===p?n=1:(n-=s-p,n<=1&&(n=1)),m=1===n?-1:((t,e,i)=>{let r,o,s=t[i-1];for(o=0;o]+(>|$)/g,""):"")),e&&(a=w(a.replace(r,""))),l(i)&&(a=i(a)),o.push({id:h,pid:m,level:n,rel:`heading-${h}`,text:a,tagName:d})})),e?(t=>{const e={};return t.forEach((t=>{const i=JSON.stringify((t=>[t.pid])(t));e[i]=e[i]||[],e[i].push(t),t.index=e[i].length,-1===t.pid&&(t.code=String(t.index))})),Object.keys(e).forEach((t=>{e[t].forEach((t=>{const i=e[`[${t.id}]`];if(!i||!d(i))return!1;i.forEach((e=>{e.code=t.code+"."+e.index}))}))})),t})(o):o},x=t=>{const{articleElement:e,selector:r,showCode:o,chapterTextFilter:n,isTreeStructured:a}=t;let h=document.querySelector("#article"),d=[],c=[],m=null;return u(e)?h=document.querySelector(e):p(e)&&(h=e),h?(l(n)?m=n:!0===n&&(m=t=>t.replace(/\(.*?\)/,"()")),d=i(s,h.querySelectorAll(r||"h1,h2,h3,h4,h5,h6")),c=v(d,o,m),!0===a?((t,e,i)=>{const r={},o=[];return t.forEach(((t,i)=>{r[t[e]]=i,t.children=[]})),t.forEach((e=>{const s=t[r[e[i]]];-1!==e[i]?s.children.push(e):o.push(e)})),o})(c,"id","pid"):c):c},y=(t,e)=>{const i=Object.prototype.hasOwnProperty;return t&&i.call(t,e)},$=(t,e)=>{Object.keys(e).forEach((i=>{y(e,i)&&(t[i]=e[i])}))},T={},z=t=>y(T,t)&&T[t].length>0,k=(t,e=!0)=>e?z(t):(t=>{let e=z(t),i=t.lastIndexOf(".");for(;!e&&-1!==i;)i=(t=t.substring(0,i)).lastIndexOf("."),e=z(t);return e})(t),E=(t,e,i=!0)=>{const r=t=>{if(!z(t))return!1;T[t].forEach((t=>{const i=["[object Int8Array]","[object Uint8Array]","[object Uint8ClampedArray]","[object Int16Array]","[object Uint16Array]","[object Int32Array]","[object Uint32Array]","[object Float32Array]","[object Float64Array]","[object BigInt64Array]","[object BigUint64Array]"].indexOf(n(e))>-1?e.toString():e;t.callback.call(t.context||t,i)}))},o=()=>{let e=t,i=t.lastIndexOf(".");for(;-1!==i;)e=e.substring(0,i),i=e.lastIndexOf("."),r(e);r(t),r("*")};if(!k(t))return!1;i?setTimeout(o,10):o()},S=(()=>{let t=0;return e=>(t+=1,e?e+"-"+t:"guid-"+t)})(),C=t=>{if(!y(T,t))return!1;delete T[t]},L=(t,e)=>{if(!k(t))return!1;e?(t=>{const e=Object.keys(T);if(!t||e.length<1)return!1;e.forEach((e=>{const i=T[e];let r;i.forEach(((e,o)=>{e.callback!==t&&e.token!==t||(r=e.topic,i.splice(-1,o))})),i.length<1&&C(r)}))})(e):C(t)};class M{constructor(t){this.attrs={},this.name="component",t&&this.initialize(t)}initialize(t){return this.attr(t).render().addListeners(),this}attr(t,e){const i=this.attrs;return u(t)?e&&y(i,t)?(i[t]=e,this):i[t]:h(t)?($(i,t),this):0===arguments.length?i:this}render(){return this}refresh(){return this}destroy(){return this.removeListeners(),this}reload(t){let e=this.attr();return t&&(e=this.attr(t)),this.destroy().initialize(e),this}$emit(t,e){return E(t,e),this}$on(t,e){return((t,e,i=null)=>{const r=S();let o="symbol"==typeof t?t.toString():t;l(e)&&(T[o]||(T[o]=[]),T[o].push({topic:o,callback:e,context:i,token:r}))})(t,e,this),this}$off(t,e){return L(t,e),this}addListeners(){return this}removeListeners(){return this}}const A=[];let N,O;function H(t){for(;t.timeRemaining()>0&&A.length;){const t=A.shift();if(!l(t))return!1;t()}A.length?N=requestIdleCallback(H):(N=0,l(O)&&(O(),O=null))}void 0===window.requestIdleCallback&&(window.requestIdleCallback=function(t){const e=Date.now();return a((function(){t({didTimeout:!1,timeRemaining:function(){return Math.max(0,50-(Date.now()-e))}})}),10)},window.cancelIdleCallback=function(t){clearTimeout(t)});const D=(t,e=null)=>{A.push(t),l(e)&&(O=e),N||requestIdleCallback(H)},j=t=>{let e=t.offsetTop;return null!==t.offsetParent&&(e+=j(t.offsetParent)),e},F=(t,e="")=>{const i=e.replace(/^>/i,"");return!!(e&&i&&t)&&(t.matches?t.matches(i):!!t.msMatchesSelector&&t.msMatchesSelector(i))},I=t=>t.host&&t!==document&&t.host.nodeType?t.host:t.parentNode,q=["focusout","blur","focusin","focus","load","unload","mouseenter","mouseleave"],R=(t,e,i)=>{const r=q.indexOf(e)>-1;i._delegateListener&&delete(i=i._delegateListener)._delegateListener,function(t,e,i){const r=t._listeners;let o=-1;if(r.length<1)return!1;r.forEach(((t,r)=>{const s=t.fn;e===t.type&&(o=r,s===i&&(o=r))})),o>-1&&r.splice(o,1)}(t,e,i),t.removeEventListener(e,i,r)},P=function(t,e,i=!1){const r=u(t)?document.querySelector(t):t,o=r.childNodes,s=((t,e)=>{let i=t._listeners||[];return u(e)&&e&&(i=i.filter((t=>t.type===e))),i})(r,e);s.forEach((t=>{R(r,t.type,t.fn)})),(i||!0===e||1===arguments.length)&&r&&o&&o.forEach((t=>{p(t)&&P(t,e,i)}))},U=(t,e,i)=>{if(!l(i))return P(t,e),!1;R(t,e,i)},B=(t,e,i,r,o,s,n=!1)=>{const l=q.indexOf(i)>-1,a=function(l){const h=function(t){const e=t.target;return(i=e)&&3===i.nodeType?i.parentNode:i;var i}(l),d=((t,e,i,r)=>{const o=i||document;if(!t)return null;do{if(null!=e&&(e.startsWith(">")?t.parentNode===o&&F(t,e):F(t,e))||r&&t===o)return t;if(t===o)break}while(t=I(t))})(h,e,t);let c=s||t;l.delegateTarget=d,!0===s&&(c=o),d&&(!0===n&&U(t,i,a),r.call(c,l,o))};if(!t)return!1;t._listeners||(t._listeners=[]),t._listeners.push({el:t,selector:e,type:i,fn:a,data:o,context:s,capture:l}),r._delegateListener=a,t.addEventListener(i,a,l)},V=function(t){t.stopPropagation(),t.preventDefault()},Y=i(s,['','','','','','','','','','','','','','','','','','','','']),W=(t,e="icon")=>u(t)?((t,e="icon")=>{const i=/id="(.*?)"/,r=/^(\w+)-/;return Y.find((o=>{const s=i.exec(o)[1];return r.exec(s)[1]===e&&s===("icon"===e?`${e}-${t}`:`${e}-icon-${t}`)}))})(t,e):i(s,Y),X=(t="")=>{const e=document.body;let i=document.querySelector("#outline-icons"),r=[];(t=>{if(!t)return!1;d(t)&&t.length>0?t.forEach((t=>{-1===Y.indexOf(t)&&u(t)&&Y.push(t)})):u(t)&&Y.push(t)})(t),r=W(),i?i.innerHTML=r.join(""):(i=document.createElement("div"),i.innerHTML=``,e.insertBefore(i.firstChild,e.firstChild))},Q=t=>{return!(!h(t)||!(p(t)||(t=>!(!h(t)||"[object NodeList]"!==n(t)))(t)||(e=t,h(e)&&"[object DocumentFragment]"===n(e))||(t=>!(!h(t)||!("[object Text]"===n(t)||t.tagName&&3===t.nodeType)))(t)));var e},G=(t,e,i)=>{let r=t.tagName.toLowerCase();switch(e){case"style":t.style.cssText=i;break;case"value":"input"===r||"textarea"===r?t.value=i:t.setAttribute(e,i);break;case"htmlFor":t.setAttribute("for",i);break;case"className":g(t,i);break;case"innerHTML":t.innerHTML=i;break;case"innerText":t.innerText=i;break;default:t.setAttribute(e,i)}},J=(t,e)=>{if(!t||!h(e))return!1;Object.keys(e).forEach((i=>{const r=e[i];y(e,i)&&G(t,i,r)}))},K=(t,e,i)=>{const r=document.createDocumentFragment(),o=document.createElement(t),s=t=>Q(t)||u(t),n=t=>{let e;if(!s(t))return!1;Q(t)?e=t:u(t)&&(e=document.createTextNode(t)),r.appendChild(e)};return h(e)?J(o,e):d(e)&&e.every((t=>s(t)))?e.forEach((t=>{n(t)})):Q(e)?n(e):u(e)&&n(document.createTextNode(e)),d(i)?i.forEach((t=>{n(t)})):n(i),o.appendChild(r),o},Z=(t,e={})=>{const i="outline-icon",r=e.size||0,o=e.color||"",s=e.iconSet||"",n=d(r)?r[0]:r,l=d(r)?r[1]:r,a=r?`width:${n}px;height:${l}px;`:"",h=o?a+`color:${o}`:a,c=e.attrs||{},p=document.createElement("i");let m,g="",_="";return u(t)?((t=>{const e=new RegExp("^\\s*(?:<\\?xml[^>]*>\\s*)?(?:<\\!doctype svg[^>]*\\s*(?:\\[?(?:\\s*]*>\\s*)*\\]?)*[^>]*>\\s*)?]*>[^]*<\\/svg>\\s*$\\s*$","i");return u(t)&&e.test(t)})(t)?_=t:(g=s&&"icon"!==s?`xlink:href="#${s}-icon-${t}"`:`xlink:href="#icon-${t}"`,_=``),p.innerHTML=_,c.className?c.className=`${i} ${c.className}`:c.className=i,J(p,c),m=p.querySelector("svg"),J(m,{"aria-hidden":!0,xmlns:"http://www.w3.org/2000/svg",class:"outline-icon__svg",width:200,height:200,style:h}),p):null},tt=(t,e={})=>Z(t,e),et=(t,e)=>{var i;let r,o=t.className;if(!o||!m(t,e))return!1;r=t.classList,null!==(i=r)&&void 0!==i&&i.remove?r.remove(e):(o=w(o.replace(e,"")),t.className=o)},it=(t,e=!0,i=!0)=>{const r="outline-heading",o=t.innerHTML;let s;if(t.innerHTML=o.replace(/^\d+(\.?\d+)*\s?/gi,""),t.removeAttribute("id"),t.removeAttribute("data-id"),et(t,r),!e)return!1;var n;s=t.querySelector(`.${r}__anchor`),i&&et(t,`${r}_start`),n=w(t.className),u(n)&&""===n&&t.removeAttribute("class"),s&&t.removeChild(s)};function rt(t,e){void 0===e&&(e={});var i=e.insertAt;if(t&&"undefined"!=typeof document){var r=document.head||document.getElementsByTagName("head")[0],o=document.createElement("style");o.type="text/css","top"===i&&r.firstChild?r.insertBefore(o,r.firstChild):r.appendChild(o),o.styleSheet?o.styleSheet.cssText=t:o.appendChild(document.createTextNode(t))}}rt(".outline-heading{overflow:hidden;position:relative;z-index:1}.outline-heading__anchor{display:none}.outline-heading__anchor:hover,.outline-heading__anchor:link,.outline-heading__anchor:visited{color:#999;text-decoration:none}.outline-heading__anchor:hover{color:#507afe}.outline-heading:hover .outline-heading__anchor{display:inline-block}.outline-heading_start:hover{overflow:visible}.outline-heading_start .outline-heading__anchor{left:-1em;position:absolute;top:50%;transform:translateY(-50%);z-index:2}");class ot extends M{constructor(t){super(),this._default(),t&&this.initialize(t)}_default(){return this.attrs=c(ot.DEFAULTS),this.$articleElement=null,this.$scrollElement=null,this.$headings=[],this}initialize(t){let e,i,r,o;return this.attr(t),o=this.attr("articleElement"),i=this.attr("scrollElement"),e=this.attr("created"),u(o)?r=document.querySelector(o):p(o)&&(r=o),r?(this.$articleElement=r,this.$scrollElement=b(i),this.$headings=this.getHeadings(),this.$headings.length<1||(l(e)&&e.call(this),this.render().addListeners()),this):this}getHeadings(){const t=this.$articleElement,e=this.attr("selector");return i(s,t.querySelectorAll(e))}count(){return this.getHeadings().length}render(){const t=this.attr("articleElement"),e=this.attr("selector"),i=this.attr("showCode"),r=this.attr("chapterTextFilter"),o=this.attr("mounted"),s=x({articleElement:t,selector:e,showCode:i,chapterTextFilter:r});return X(),this._paint(s),l(o)&&o.call(this),this}erase(){return this._remove(),this}_paint(t){const e=400,r=this.attr("hasAnchor"),o=this.attr("isAtStart"),n=this.attr("showCode"),a=this.attr("anchorURL"),h=this.attr("anchorLinkFilter"),d=this.count(),c=i(s,this.$headings),u=(i,s)=>{i.forEach(((i,d)=>{const c=d+s*e,u=t[c].code;((t,e,i)=>{const r="outline-heading",o=i.hasAnchor||!0,s=i.isAtStart||!0,n=i.showCode||!1,a=i.chapterCode||"",h=i.anchorURL||"",d=i.anchorLinkFilter||null,c=`heading-${e}`,u={id:c,className:s?`${r} ${r}_start`:r,"data-id":e},p=w(t.innerHTML);let m,g,_;if(n&&(u.innerHTML=a+" "+p,u["data-code"]=a),J(t,u),!o)return!1;m=h||(l(d)?d(t.tagName.toLowerCase(),p,e):`#${c}`),_=tt("hash",{iconSet:"outline"}),g=K("a",{id:`anchor-${e}`,className:`${r}__anchor anchor-${e}`,href:m,target:h?"_blank":"self","data-id":e},_),t.appendChild(g)})(i,c,{hasAnchor:r,isAtStart:o,showCode:n,chapterCode:u,anchorURL:a,anchorLinkFilter:h})}))};let p=-1;if(d>e)for(p+=1,u(c.splice(0,e),0);c.length>0;){const t=c.splice(0,e);D((()=>{u(t,p+=1)}),(()=>{this.$emit("anchors:all:paint")}))}else u(c,0);return this}_remove(){const t=this.attr("hasAnchor"),e=this.attr("isAtStart");return this.$headings.forEach((i=>{it(i,t,e)})),this}refresh(t){const e=this.attr("articleElement"),i=this.attr("selector"),r=this.attr("showCode"),o=this.attr("chapterTextFilter");return this.$headings=this.getHeadings(),this.erase()._paint(t||x({articleElement:e,selector:i,showCode:r,chapterTextFilter:o})),this}scrollTo(t,e){const i=this.$scrollElement;return f(i,t,e),this}destroy(){const t=this.attr("beforeDestroy"),e=this.attr("afterDestroy");return l(t)&&t.call(this),this.removeListeners()._remove()._default(),l(e)&&e.call(this),this}onAnchorTrigger(t){const e=this.attr("anchorURL"),i=this.attr("afterScroll"),r=this.attr("stickyHeight"),o=t.delegateTarget.parentNode,s=j(o)-(r+10),n=this.$scrollElement,h=n.scrollHeight-n.clientHeight;return this.scrollTo(s,(()=>{l(i)&&i.call(this,"anchor"),a((()=>{this.$emit("toolbar:update",{top:s,min:0,max:h})}))})),e||V(t),this}onRefresh(t){return this.refresh(t),this}addListeners(){const t=this.$articleElement;return this.count()<1||(B(t,".outline-heading__anchor","click",this.onAnchorTrigger,this,!0),this.$on("anchors:refresh",this.onRefresh)),this}removeListeners(){const t=this.$articleElement;return this.count()<1||(U(t,"click",this.onAnchorTrigger),this.$off("anchors:refresh",this.onRefresh)),this}}ot.DEFAULTS=c({scrollElement:"html,body",articleElement:"#article",selector:"h1,h2,h3,h4,h5,h6",stickyHeight:0,anchorURL:"",hasAnchor:!0,isAtStart:!0,showCode:!1,created:null,mounted:null,afterScroll:null,beforeDestroy:null,afterDestroy:null,chapterTextFilter:null,anchorLinkFilter:null});const st=["a","abbr","address","area","article","aside","audio","b","base","bdi","bdo","blockquote","body","br","button","canvas","caption","cite","code","col","colgroup","data","datalist","dd","del","details","dfn","dialog","div","dl","dt","em","embed","fieldset","figcaption","figure","footer","form","h1","h2","h3","h4","h5","h6","head","header","hgroup","hr","html","i","iframe","img","input","ins","kbd","label","legend","li","link","main","map","mark","math","menu","menuitem","meta","meter","nav","noscript","object","ol","optgroup","option","output","p","param","picture","pre","progress","q","rb","rp","rt","rtc","ruby","s","samp","script","search","section","select","slot","small","source","span","strong","style","sub","summary","sup","svg","table","tbody","td","template","textarea","tfoot","th","thead","time","title","tr","track","u","ul","var","video","wbr"],nt=t=>{let e,i,r;return!!u(t)&&(e=w(t).slice(0,1e3),i=/\s*|]*>|]*>|]+>/i,r=new RegExp(st.map((t=>`<${t}\\b[^>]*>`)).join("|"),"i"),i.test(e)||r.test(e))},lt=t=>t.replace(/]*>.*?<\/script>/gi,""),at=(t,e)=>{document.documentElement.style.setProperty(t,e)};let ht=2e3;const dt=t=>(t?ht=t:ht+=1,at("--outline-zIndex",`${ht}`),ht);rt(':root{--outline-zIndex:2000;--outline-sticky-height:100%;--outline-navigator-width:100%}.outline-drawer{box-sizing:border-box;height:100%;left:0;margin:0;overflow:hidden;position:relative;top:0;visibility:hidden;width:100%;z-index:-1}.outline-drawer__modal{background-color:#fff;box-shadow:0 0 6px 1px #dcdfe6;display:flex;flex-direction:column;flex-wrap:nowrap;height:100%;overflow:hidden;position:absolute;transition-duration:.4s;z-index:21}.outline-drawer__footer,.outline-drawer__header,.outline-drawer__main{box-sizing:border-box;width:100%}.outline-drawer__footer,.outline-drawer__header{flex-shrink:0}.outline-drawer__footer,.outline-drawer__main,.outline-drawer__title{padding:0 16px}.outline-drawer__header,.outline-drawer__title{height:52px;line-height:52px;margin:0 auto;overflow:hidden;position:relative;z-index:1}.outline-drawer__title{border-bottom:1px solid #dcdfe6;box-sizing:border-box;font-size:16px;font-weight:400;margin:0 16px}.outline-drawer__close{color:#999;cursor:pointer;font-size:20px;height:20px;line-height:20px;overflow:hidden;position:absolute;right:12px;text-align:center;top:50%;transform:translateY(-50%);width:20px;z-index:2}.outline-drawer__close .outline-icon{left:0;position:absolute;top:0;z-index:2}.outline-drawer__close:hover{color:#666}.outline-drawer__main{flex:1;overflow:auto}.outline-drawer__main.overflow-hidden{overflow:hidden}.outline-drawer__footer{margin:0 auto;overflow:hidden;text-align:right}.outline-drawer__overlay{background-color:#fff;content:"";height:100%;left:0;opacity:.1;overflow:hidden;position:relative;top:0;width:100%;z-index:1}.outline-drawer_ltr.outline-drawer_tiny,.outline-drawer_rtl.outline-drawer_tiny{width:280px}.outline-drawer_ltr.outline-drawer_mini,.outline-drawer_rtl.outline-drawer_mini{width:480px}.outline-drawer_ltr.outline-drawer_small,.outline-drawer_rtl.outline-drawer_small{width:540px}.outline-drawer_ltr.outline-drawer_regular,.outline-drawer_rtl.outline-drawer_regular{width:680px}.outline-drawer_ltr.outline-drawer_medium,.outline-drawer_rtl.outline-drawer_medium{width:720px}.outline-drawer_ltr.outline-drawer_large,.outline-drawer_rtl.outline-drawer_large{width:960px}.outline-drawer_rtl{border-left:1px solid #dcdfe6}.outline-drawer_rtl.outline-drawer_tiny.outline-drawer_closed{right:-290px}.outline-drawer_rtl.outline-drawer_mini.outline-drawer_closed{right:-490px}.outline-drawer_rtl.outline-drawer_small.outline-drawer_closed{right:-550px}.outline-drawer_rtl.outline-drawer_regular.outline-drawer_closed{right:-690px}.outline-drawer_rtl.outline-drawer_medium.outline-drawer_closed{right:-730px}.outline-drawer_rtl.outline-drawer_large.outline-drawer_closed{right:-970px}.outline-drawer_ltr{border-right:1px solid #dcdfe6}.outline-drawer_ltr.outline-drawer_tiny.outline-drawer_closed{left:-290px}.outline-drawer_ltr.outline-drawer_mini.outline-drawer_closed{left:-490px}.outline-drawer_ltr.outline-drawer_small.outline-drawer_closed{left:-550px}.outline-drawer_ltr.outline-drawer_regular.outline-drawer_closed{left:-690px}.outline-drawer_ltr.outline-drawer_medium.outline-drawer_closed{left:-730px}.outline-drawer_ltr.outline-drawer_large.outline-drawer_closed{left:-970px}.outline-drawer_btt,.outline-drawer_ttb{left:0;width:100%}.outline-drawer_btt.outline-drawer_tiny,.outline-drawer_ttb.outline-drawer_tiny{height:240px}.outline-drawer_btt.outline-drawer_mini,.outline-drawer_ttb.outline-drawer_mini{height:320px}.outline-drawer_btt.outline-drawer_small,.outline-drawer_ttb.outline-drawer_small{height:360px}.outline-drawer_btt.outline-drawer_regular,.outline-drawer_ttb.outline-drawer_regular{height:400px}.outline-drawer_btt.outline-drawer_medium,.outline-drawer_ttb.outline-drawer_medium{height:440px}.outline-drawer_btt.outline-drawer_large,.outline-drawer_ttb.outline-drawer_large{height:480px}.outline-drawer_ttb{border-bottom:1px solid #dcdfe6}.outline-drawer_ttb.outline-drawer_tiny.outline-drawer_closed{top:-250px}.outline-drawer_ttb.outline-drawer_mini.outline-drawer_closed{top:-330px}.outline-drawer_ttb.outline-drawer_small.outline-drawer_closed{top:-370px}.outline-drawer_ttb.outline-drawer_regular.outline-drawer_closed{top:-410px}.outline-drawer_ttb.outline-drawer_medium.outline-drawer_closed{top:-450px}.outline-drawer_ttb.outline-drawer_large.outline-drawer_closed{top:-490px}.outline-drawer_btt{border-top:1px solid #dcdfe6;top:auto}.outline-drawer_btt.outline-drawer_tiny.outline-drawer_closed{bottom:-250px}.outline-drawer_btt.outline-drawer_mini.outline-drawer_closed{bottom:-330px}.outline-drawer_btt.outline-drawer_small.outline-drawer_closed{bottom:-370px}.outline-drawer_btt.outline-drawer_regular.outline-drawer_closed{bottom:-410px}.outline-drawer_btt.outline-drawer_medium.outline-drawer_closed{bottom:-450px}.outline-drawer_btt.outline-drawer_large.outline-drawer_closed{bottom:-490px}.outline-drawer_opened{visibility:visible;z-index:var(--outline-zIndex)}.outline-drawer_opened.outline-drawer{position:fixed}.outline-drawer_opened.outline-drawer_rtl{right:0}.outline-drawer_opened.outline-drawer_ltr{left:0}.outline-drawer_opened.outline-drawer_ttb{top:0}.outline-drawer_opened.outline-drawer_btt{bottom:0}.outline-drawer_offset.outline-drawer_ltr,.outline-drawer_offset.outline-drawer_rtl{height:calc(100% - 4em);top:50%;transform:translateY(-50%)}.outline-drawer_offset.outline-drawer_btt,.outline-drawer_offset.outline-drawer_ttb{left:50%;transform:translateX(-50%);width:calc(100% - 4em)}.outline-drawer_offset.outline-drawer_opened.outline-drawer_rtl{right:2em}.outline-drawer_offset.outline-drawer_opened.outline-drawer_ltr{left:2em}.outline-drawer_offset.outline-drawer_opened.outline-drawer_ttb{top:2em}.outline-drawer_offset.outline-drawer_opened.outline-drawer_btt{bottom:2em}.outline-drawer_auto.outline-drawer_ltr,.outline-drawer_auto.outline-drawer_rtl{height:auto;max-height:calc(100% - 4em)}.outline-drawer_full{padding:0}');class ct extends M{constructor(t){super(),this._default(),this.zIndex=0,t&&this.initialize(t)}_default(){return this.attrs=c(ct.DEFAULTS),this.title="",this.closed=!1,this.$el=null,this.$modal=null,this.$header=null,this.$title=null,this.$close=null,this.$main=null,this.$footer=null,this.$overlay=null,this}initialize(t){let e;return this.attr(t),this.title=this.attr("title"),e=this.attr("created"),l(e)&&e.call(this),this.render().addListeners(),this}setTitle(t){return this.attr("title",t),this.title=t,this.$title.innerHTML=t,this}isClosed(){return this.closed}render(){const t=this.attr("mounted"),e=this.attr("size"),i=this.attr("placement"),r=this.attr("hasClose"),o=this.attr("hasOverlay"),s=this.attr("hasOffset"),n=this.attr("hasPadding"),a=this.attr("autoHeight"),h=this.attr("overflow"),d=this.attr("customClass");let c,u,p,m,_,f,b,w,v="outline-drawer__main";return X(),this.zIndex=dt(),m=K("h2",{className:"outline-drawer__title"},this.title),this.$title=m,r&&(_=K("div",{className:"outline-drawer__close"},tt("close",{iconSet:"outline",size:20})),this.$close=_),p=K("header",{className:"outline-drawer__header"},[m,_]),this.$header=p,"hidden"===h&&(v+=" overflow-hidden"),f=K("div",{className:v}),this.$main=f,n||g(f,"outline-drawer_full"),b=K("footer",{className:"outline-drawer__footer"}),this.$footer=b,u=K("div",{className:`outline-drawer__modal outline-drawer_${i} outline-drawer_${e} outline-drawer_closed`},[p,f,b]),this.$modal=u,s&&g(u,"outline-drawer_offset"),a&&g(u,"outline-drawer_auto"),d&&g(u,d),o&&(w=K("div",{className:"outline-drawer__overlay"}),this.$overlay=w),c=K("div",{className:"outline-drawer"},[u,w]),this.$el=c,document.body.appendChild(c),l(t)&&t.call(this),this}erase(){return this.$main.innerHTML="",this}_paint(t){let e=null;return l(t)?e=t():Q(t)?e=t:nt(t)&&(e=((t,e)=>{const r=document.createDocumentFragment();if(!t||!nt(t)&&!u(t)&&!p(t))return null;if(nt(t)){const e=K("div");let o=[];return e.innerHTML=lt(t),o=i(s,e.childNodes),o.forEach((t=>{r.appendChild(t)})),r}if(!u(e))return t.innerHTML;t.innerHTML=lt(e)})(t)),e&&this.$main.appendChild(e),this}_remove(){return document.body.removeChild(this.$el),this}refresh(t){return this.erase()._paint(t),this}open(){const t=this.attr("afterOpened"),e=this.$modal;return g(this.$el,"outline-drawer_opened"),et(e,"outline-drawer_closed"),g(e,"outline-drawer_opened"),a((()=>{this.closed=!1,l(t)&&t.call(this)})),this}close(){const t=this.attr("afterClosed"),e=this.$modal;return et(e,"outline-drawer_opened"),g(e,"outline-drawer_closed"),a((()=>{et(this.$el,"outline-drawer_opened"),this.closed=!0,l(t)&&t.call(this)})),this}toggle(){const t=this.attr("afterToggle"),e=this.isClosed();return e?this.open():this.close(),l(t)&&a((()=>{t.call(this,e)})),this}destroy(){const t=this.attr("afterDestroy"),e=this.attr("beforeDestroy");let i=this.zIndex;return l(e)&&e.call(this),this.removeListeners()._remove()._default(),i-=1,dt(i),this.zIndex=0,l(t)&&t.call(this),this}onClose(){return this.close(),this}addListeners(){const t=this.attr("hasClose"),e=this.attr("hasOverlay"),i=this.attr("closeOnClickModal"),r=this.$el;return t&&B(r,".outline-drawer__close","click",this.onClose,this,!0),e&&i&&B(r,".outline-drawer__overlay","click",this.onClose,this,!0),this}removeListeners(){const t=this.attr("hasClose"),e=this.attr("hasOverlay"),i=this.$el;return t||e?(U(i,"click",this.onClose),this):this}}ct.DEFAULTS=c({placement:"rtl",title:"标题",size:"regular",hasClose:!0,hasOverlay:!0,hasOffset:!1,hasPadding:!0,autoHeight:!0,closeOnClickModal:!0,overflow:"auto",created:null,mounted:null,afterClosed:null,afterOpened:null,afterScroll:null,beforeDestroy:null,afterDestroy:null,afterToggle:null});const ut=(t,e,i,r,o,s=!1)=>{const n=q.indexOf(e)>-1,a=function(n){let l=o||t;!0===o&&(l=r),!0===s&&U(t,e,a),i.call(l,n,r)};if(!l(i))return!1;t._listeners||(t._listeners=[]),t._listeners.push({el:t,type:e,fn:a,data:r,context:o,capture:n}),i._delegateListener=a,t.addEventListener(e,a,n)},pt=(t,e)=>getComputedStyle(t)[e];rt(":root{--outline-zIndex:2000;--outline-sticky-height:100%;--outline-navigator-width:100%}.outline-navigator{margin:0;overflow:auto;position:relative;width:var(--outline-navigator-width);z-index:1}.outline-navigator-parent{transition:.3s ease-in-out}.outline-navigator__title{border-bottom:1px solid #dcdfe6;font-size:16px;font-weight:400;height:40px;line-height:40px;margin:0 16px;overflow:hidden;padding:0 16px}.outline-navigator__main{margin:0;overflow:hidden;position:relative;z-index:1}.outline-navigator__item,.outline-navigator__list,.outline-navigator__subject{list-style-type:none;margin:0;overflow:hidden;padding:0;position:relative;z-index:2}.outline-navigator__list{padding:.5em 0}.outline-navigator__subject{padding-left:1em}.outline-navigator__item{font-size:13px;line-height:30px;margin:0;overflow:hidden}.outline-navigator__placeholder{background-color:#f7f8f9;border-left:2px solid #058942;box-sizing:border-box;height:30px;left:0;overflow:hidden;position:absolute;top:0;transition-duration:.2s;width:100%;z-index:1}.outline-navigator__anchor{display:block;overflow:hidden;padding:0 1.5em;text-overflow:ellipsis;white-space:nowrap}.outline-navigator__anchor:hover,.outline-navigator__anchor:link,.outline-navigator__anchor:visited{color:#555;text-decoration:none}.outline-navigator__anchor:hover{color:#058942}.outline-navigator__code{padding-right:.5em}.outline-navigator_highlight.outline-navigator__anchor:hover,.outline-navigator_highlight.outline-navigator__anchor:link,.outline-navigator_highlight.outline-navigator__anchor:visited{color:#058942;font-weight:700}.outline-navigator_fixed,.outline-navigator_sticky{display:flex;flex-direction:column;flex-wrap:nowrap;overflow:hidden;top:0;z-index:var(--outline-zIndex)}.outline-navigator_fixed .outline-navigator__main,.outline-navigator_fixed .outline-navigator__title,.outline-navigator_sticky .outline-navigator__main,.outline-navigator_sticky .outline-navigator__title{box-sizing:border-box}.outline-navigator_fixed .outline-navigator__title,.outline-navigator_sticky .outline-navigator__title{flex-shrink:0}.outline-navigator_fixed .outline-navigator__main,.outline-navigator_sticky .outline-navigator__main{flex:1;overflow:auto}.outline-navigator_sticky{max-height:var(--outline-sticky-height);position:sticky}.outline-navigator_fixed{max-height:100%;position:fixed}.outline-navigator_hidden{display:none}.outline-navigator_folded{overflow:hidden;width:0}");const mt="outline-navigator_hidden",gt="outline-navigator_expanded",_t="outline-navigator_folded";class ft extends M{constructor(t){super(),this._default(),this.scrollTimer=null,this.resizeTimer=null,this.observerTimer=null,this.Observer=null,t&&this.initialize(t)}_default(){return this.attrs=c(ft.DEFAULTS),this.$el=null,this.$title=null,this.$main=null,this.$list=null,this.$placeholder=null,this.$parentElement=null,this.$scrollElement=null,this.$active=null,this.chapters=[],this.active=0,this.offsetWidth=0,this.offsetTop=0,this.playing=!1,this.closed=!1,this}initialize(t){let e,i,r,o;return this.attr(t),e=this.attr("created"),i=this.attr("parentElement"),r=this.attr("scrollElement"),u(i)?o=document.querySelector(i):p(i)&&(o=i),this.$parentElement=o,this.$scrollElement=b(r),this.chapters=this.attr("chapters"),this.closed=this.attr("closed"),this.active=this.attr("active"),l(e)&&e.call(this),this.chapters.length<1||(this.render().addListeners(),this.$active=document.querySelector(`#chapter-${this.active}`)),this}isClosed(){return this.closed}isSticky(){return"sticky"===this.attr("position")}isFixed(){return"fixed"===this.attr("position")}isInside(){return this.isFixed()||this.isSticky()}isOutside(){return!this.isInside()}count(){return this.chapters.length}_paintEdge(){const t=document.createDocumentFragment(),e=this.attr("title"),i=this.attr("animationCurrent"),r=this.attr("customClass"),o=this.$parentElement,s=[],n=[];let l,a,h,d,c=null;return o?(this.isInside()&&e&&(c=K("h2",{className:"outline-navigator__title"},e),this.$title=c,n.push(c)),h=K("ul",{className:"outline-navigator__list"}),this.$list=h,s.push(h),i&&(d=K("div",{className:"outline-navigator__placeholder"}),this.$placeholder=d,s.push(d)),a=K("div",{className:"outline-navigator__main"},s),this.$main=a,n.push(a),l=K("nav",{id:"outline-navigator",className:`outline-navigator ${mt}`},n),this.$el=l,this.isSticky()&&(this.calculateStickyHeight(),g(l,"outline-navigator_sticky")),r&&g(l,r),t.appendChild(l),o.appendChild(t),this):this}render(){const t=this.attr("mounted"),e=this.$parentElement,i=this.chapters,r=this.count();let o;return!e||i.length<1||(this.isInside()&&g(e,"outline-navigator-parent"),this._paintEdge(),o=this.$el,this._paint(i),a((()=>{this.highlight(this.active)}),60),this.offsetTop=j(o),this.offsetWidth=o.offsetWidth,this.isFixed()&&(this.sticky(),at("--outline-navigator-width",`${this.offsetWidth}px`)),l(t)&&t.call(this),r<400&&this.onObserver()),this}erase(){return this.$list.innerHTML="",this}_paint(t){const e=this.attr("showCode"),r=this.$el;return((t,e,r=!1)=>{const o=e.length,n=i(s,e),l=e=>{const i=e=>t.querySelector(`#${e}`);e.forEach((e=>{const o=e.pid,s=e.id,n=e.code,l=e.rel,a=[],h=K("span",{className:"outline-navigator__text"},e.text);let d,c,u,p,m;r&&(c=K("span",{className:"outline-navigator__code","data-id":s},e.code),a.push(c)),a.push(h),d=K("a",{id:`chapter__anchor-${s}`,className:"outline-navigator__anchor",href:"#"+l,rel:l,"data-id":s,"data-code":n},a),u=K("li",{id:`chapter-${s}`,className:"outline-navigator__item","data-id":s,"data-code":n},d),-1===o?t.appendChild(u):(m=i(`chapter-${o}`),p=i(`subject-${o}`),p?p.appendChild(u):(p=K("ul",{id:"subject-"+o,className:"outline-navigator__subject"},u),m.appendChild(p)))}))};if(o>400)for(l(n.splice(0,400));n.length>0;){const t=n.splice(0,400);D((()=>{l(t)}))}else l(n)})(this.$list,t,e),et(r,mt),g(r,gt),this}_remove(){return this.$parentElement.removeChild(this.$el),this}refresh(t){const e=this.$el;return et(e,mt),this.erase()._paint(t),this}_getPlaceholderOffset(t){const e=this.$main,i=this.$list,r=i.querySelector(".outline-navigator__anchor"),o=parseInt(pt(e,"padding-top"),10),s=parseInt(pt(e,"border-top-width"),10),n=parseInt(pt(i,"padding-top"),10),l=parseInt(pt(i,"margin-top"),10),a=parseInt(pt(i,"border-top-width"),10);let h,d=0;return o&&(d+=o),n&&(d+=n),l&&(d+=l),s&&(d+=s),a&&(d+=a),h=r.offsetHeight*t,d+h}positionPlaceholder(t){const e=this.$list,i=this.$placeholder,r=e.querySelector(".outline-navigator__anchor"),o=this.attr("animationCurrent"),s=r.offsetHeight;let n=0;return o?(n=this._getPlaceholderOffset(t),i.style.cssText=`transform: translateY(${n}px);height:${s}px;`,this):this}highlight(t){const e=this.$el,i=this.attr("animationCurrent"),r="outline-navigator_active",o="outline-navigator_highlight";let s="relative"===this.attr("position")?this.$parentElement:this.$main,n=null,l=0;return e?(n=e.querySelector(`#chapter__anchor-${t}`),n?(this.active=parseInt(n.getAttribute("data-id"),10),this.$active&&(et(this.$active,o),et(this.$active,r)),this.$active=n,g(this.$active,r),i?this.positionPlaceholder(this.active):g(this.$active,o),a((()=>{((t,e)=>{let i,r,o=!1;return p(t)&&p(e)?(i=e.getBoundingClientRect(),r=t.getBoundingClientRect(),o=!!(r.top>=i.top&&r.right<=i.right&&r.bottom<=i.bottom&&r.left>=i.left),o):o})(this.$active,s)||(l=this._getPlaceholderOffset(this.active),f(s,l))})),this):this):this}sticky(){const t=this.attr("afterSticky"),e="outline-navigator_fixed",i=this.$el,r=this.offsetTop,o=this.$scrollElement.scrollTop;let s;return this.isFixed()?(s=o>=r,s?g(i,e):et(i,e),l(t)&&t.call(this,this.isClosed(),s),this):this}calculateStickyHeight(){const t=document.documentElement,e=Math.max(t.clientHeight||0,window.innerHeight||0);return at("--outline-sticky-height",`${e}px`),this}scrollTo(t,e){const i=this.$scrollElement;return f(i,t,e),this}show(){const t=this.attr("afterOpened"),e=this.count(),i=this.$el,r=this.$parentElement;return this.isInside()?e>800?et(r,mt):(et(r,mt),a((()=>{et(r,_t),g(r,gt)}),30)):et(i,mt),this.closed=!1,l(t)&&t.call(this),this}hide(){const t=this.attr("afterClosed"),e=this.count(),i=this.$el,r=this.$parentElement;return this.isInside()?e>800?g(r,mt):(g(r,_t),et(r,gt),a((()=>{g(r,mt)}))):g(i,mt),this.closed=!0,l(t)&&t.call(this),this}toggle(){const t=this.attr("afterToggle"),e=this.offsetTop,i=this.$scrollElement.scrollTop;let r;return this.isClosed()?this.show():this.hide(),l(t)&&a((()=>{r=i>=e,t.call(this,this.isClosed(),r)})),this}destroy(){const t=this.attr("beforeDestroy"),e=this.attr("afterDestroy");return l(t)&&t.call(this),this.removeListeners()._remove()._default(),this.scrollTimer&&(clearTimeout(this.scrollTimer),this.scrollTimer=null),this.resizeTimer&&(clearTimeout(this.resizeTimer),this.resizeTimer=null),this.observerTimer&&(clearTimeout(this.observerTimer),this.observerTimer=null),this.Observer&&(this.Observer=null),l(e)&&e.call(this),this}onObserver(){const t=this.attr("selector");return this.Observer=((t,e={})=>{const i=e.root||null,r=e.selector||".outline-heading",o=e.context||null,s={rootMargin:e.rootMargin||"0px 0px -90% 0px"},n=new IntersectionObserver((e=>{e.forEach((e=>{e.intersectionRatio>0&&l(t)&&t.call(o||e.target,e.target)}))}),s),a=p(i)?i:document;return i&&(s.root=i),a.querySelectorAll(r).forEach((t=>{n.observe(t)})),n})((t=>{const e=t.getAttribute("data-id");if(this.playing)return!1;this.observerTimer&&clearTimeout(this.observerTimer),this.observerTimer=a((()=>{this.highlight(e)}),100)}),{selector:t,context:this}),this}onSelect(t){const e=this.attr("stickyHeight"),i=t.delegateTarget,r=i.getAttribute("data-id"),o=i.href.split("#")[1],s=document.querySelector(`#${o}`),n=j(s)-(e+10),h=this.$scrollElement.scrollHeight,d=this.attr("afterScroll"),c=()=>{l(d)&&d.call(this,"chapter"),a((()=>{this.playing=!1,this.$emit("toolbar:update",{top:n,min:0,max:h})}))};return this.playing=!0,this.isFixed()?(this.sticky(),a((()=>{this.scrollTo(n,c),this.highlight(r)}),10)):(this.scrollTo(n,c),this.highlight(r)),V(t),this}onScroll(){const t=this.$scrollElement;return this.scrollTimer&&clearTimeout(this.scrollTimer),this.scrollTimer=a((()=>{const e=t.scrollTop,i=t.scrollHeight-t.clientHeight;this.isFixed()&&this.sticky(),this.$emit("toolbar:update",{top:e,min:0,max:i})}),100),this}onResize(){return this.isSticky()?(this.resizeTimer&&clearTimeout(this.resizeTimer),this.resizeTimer=a((()=>{this.calculateStickyHeight()})),this):this}onRefresh(t){return this.refresh(t),this}addListeners(){const t=this.$el,e=this.$scrollElement,i=e.tagName.toLowerCase();let r=e;return this.count()<1||("html"!==i&&"body"!==i||(r=window),B(t,".outline-navigator__anchor","click",this.onSelect,this,!0),ut(r,"scroll",this.onScroll,this,!0),this.isSticky()&&ut(window,"resize",this.onResize,this,!0),this.$on("anchors:all:paint",this.onObserver,this),this.$on("navigator:refresh",this.onRefresh,this)),this}removeListeners(){const t=this.attr("selector"),e=this.$el,i=this.$scrollElement,r=i.tagName.toLowerCase();let o=i;return this.count()<1||("html"!==r&&"body"!==r||(o=window),U(e,"click",this.onSelect),U(o,"scroll",this.onScroll),this.isSticky()&&U(window,"resize",this.onResize),this.$off("anchors:all:paint"),this.$off("navigator:refresh"),this.Observer&&document.querySelectorAll(t).forEach((t=>{this.Observer.unobserve(t)}))),this}}ft.DEFAULTS=c({parentElement:"",scrollElement:"",selector:".outline-heading",active:0,closed:!1,showCode:!0,animationCurrent:!0,position:"relative",stickyHeight:0,chapters:[],created:null,mounted:null,afterClosed:null,afterOpened:null,afterScroll:null,beforeDestroy:null,afterDestroy:null,afterSticky:null});const bt=()=>{const t=navigator.userAgent;return/Mobile|mini|Fennec|Android|iP(ad|od|hone)|NokiaN[^/]*/.test(t)},wt=t=>{const e=Object.getPrototypeOf;let i;if(!(t=>h(t)&&null!==t)(t))return!1;if(i=t.prototype,!i)return!0;for(i=t;null!==e(i);)i=e(i);return e(t)===i},vt=t=>{const e={"&":"&","<":"<",">":">","'":"'",'"':"""};return t.replace(/[&<>'"]/g,(t=>e[t]||t))};rt(".outline-icon{display:inline-block;position:relative;vertical-align:middle;z-index:1}.outline-icon,.outline-icon__svg{height:1em;overflow:hidden;width:1em}.outline-icon__svg{left:50%;position:absolute;top:50%;z-index:2;fill:currentcolor;transform:translate(-50%,-50%)}.outline-icon_hidden{display:none}.outline-message{background-color:#fff;border-radius:3px;box-shadow:0 0 6px 1px #dcdfe6;left:50%;opacity:.1;padding:0 50px;position:fixed;top:-50px;transform:translateX(-50%);transition:all .5s ease-in-out;z-index:9999}.outline-message,.outline-message__content{color:#666;font-size:13px;height:40px;line-height:40px;margin:0;overflow:hidden}.outline-message__content{max-width:700px;text-overflow:ellipsis;white-space:nowrap}.outline-message__close,.outline-message__icon{height:40px;line-height:40px;overflow:hidden;position:absolute;text-align:center;top:0;width:40px;z-index:2}.outline-message__icon{color:#fff;left:0}.outline-message__icon .outline-icon{left:50%;position:absolute;top:50%;transform:translate(-50%,-50%);z-index:2}.outline-message__close{color:#999;cursor:pointer;right:0}.outline-message__close .outline-icon{left:50%;position:absolute;top:50%;transform:translate(-50%,-50%);z-index:2}.outline-message__close:hover{color:#666}.outline-message_info .outline-message__icon{background-color:#507afe}.outline-message_warning .outline-message__icon{background-color:#ff9901}.outline-message_success .outline-message__icon{background-color:#058942}.outline-message_error .outline-message__icon{background-color:#ff5d5d}.outline-message_plain{min-width:190px;padding:0 50px 0 15px}.outline-message_plain.outline-message_info{background-color:#ecf8ff;border-left:5px solid #507afe}.outline-message_plain.outline-message_warning{background-color:#fffbe6;border-left:5px solid #ff9901}.outline-message_plain.outline-message_success{background-color:#e1f6eb;border-left:5px solid #058942}.outline-message_plain.outline-message_error{background-color:#fff1f0;border-left:5px solid #ff5d5d}.outline-message_plain .outline-message__icon{display:none;width:0}.outline-message_plain .outline-message__icon .outline-icon{display:none}.outline-message_light{min-width:180px;padding:0 40px}.outline-message_light.outline-message_info .outline-message__icon{color:#507afe}.outline-message_light.outline-message_warning .outline-message__icon{color:#ff9901}.outline-message_light.outline-message_success .outline-message__icon{color:#058942}.outline-message_light.outline-message_error .outline-message__icon{color:#ff5d5d}.outline-message_light .outline-message__icon{background-color:#fff}.outline-message_round{border-radius:20px}.outline-message_round.outline-message_default{min-width:180px;padding:0 40px}.outline-message_round.outline-message_default .outline-message__icon{border-radius:10px;height:20px;left:10px;line-height:20px;top:10px;width:20px}.outline-message_round.outline-message_default.outline-message_full-width{min-width:200px;padding:0 20px 0 40px}.outline-message_round.outline-message_plain{min-width:195px;padding:0 40px 0 20px}.outline-message_round.outline-message_plain.outline-message_full-width{min-width:215px;padding:0 20px}.outline-message_full-width{min-width:200px;padding:0 10px 0 50px}.outline-message_full-width.outline-message_plain{min-width:230px;padding:0 10px 0 15px}.outline-message_full-width.outline-message_light{min-width:210px;padding:0 10px 0 40px}.outline-message_visible{opacity:1}.outline-message_hidden{display:none}");const xt=[];let yt;X();class $t extends M{constructor(t){super(),this._default(),t&&this.initialize(t)}_default(){return this.attrs=c($t.DEFAULTS),this.$el=null,this.id="",this.closed=!1,this.visible=!1,this.offset=-50,this.timer=null,this.destroyed=!1,this}initialize(t){return this.attr(t),this.id=this.attr("id"),this.offset=this.attr("offset")||-50,this.$emit("created",o({},this.attr())),this.render().addListeners(),this.attr("visible")&&this.open(),this}isClosed(){return this.closed}isDestroyed(){return this.destroyed}_getClassName(){const t=this.attr("type"),e=this.attr("effect"),i=this.attr("round"),r=this.attr("closable"),o=this.attr("visible"),s=this.attr("customClass"),n=["outline-message",`outline-message_${t}`,`outline-message_${e}`];return i&&n.push("outline-message_round"),r||n.push("outline-message_full-width"),o&&n.push("outline-message_visible"),s&&n.push(s),n}render(){const t=this.attr("type"),e=this.attr("message"),i=this.attr("effect"),r=this.attr("round"),o=this.attr("closable"),s=this.attr("dangerouslyUseHTMLString"),n=this._getClassName(),l=[];let a,h,d,c,u,p=20;return r&&"default"===i&&(p=12),"plain"!==i&&(a=tt("light"===i?`circle-${t}`:t,{iconSet:"outline",size:p}),g(a,"outline-message__icon"),l.push(a)),s?(d=document.createDocumentFragment(),d.innerHTML=e):d=document.createTextNode(vt(lt(e))),h=K("p",{className:"outline-message__content"},[d]),l.push(h),o&&(c=tt("close",{iconSet:"outline",size:18}),g(c,"outline-message__close"),l.push(c)),u=K("div",{className:n.join(" ")},l),u.style.cssText="top:-50px;",this.$el=u,document.body.appendChild(this.$el),this.$emit("mounted"),this}_refreshIcon(){const t=".outline-message_hidden",e=this.$el;let i,r,o,s,n,l,a,h=20;return this.isDestroyed()?this:(n=e.querySelector(".outline-icon"),n?(i=this.attr("type"),r=this.attr("effect"),o=this.attr("round"),"plain"===r?g(n,t):(et(n,t),o&&"default"===r&&(h=12)),l=n.querySelector(".outline-icon__svg"),J(l,{style:`width:${h}px;height:${h}px;`}),a=l.querySelector("use"),s="light"===r?`circle-${i}`:i,G(a,"xlink:href",`#outline-icon-${s}`),this):this)}_refreshMessage(){const t=this.$el;let e,i,r,o;return this.isDestroyed()||(e=t.querySelector(".outline-message__content"),i=this.attr("dangerouslyUseHTMLString"),r=this.attr("message"),o=i?r:vt(lt(r)),e.innerHTML=o),this}_refreshClose(){const t=".outline-message_hidden",e=this.$el;let i,r;return this.isDestroyed()||(i=e.querySelector(".outline-message__close"),r=this.attr("closable"),i&&(r?g(i,t):et(i,t))),this}_refreshEl(){const t=this.$el;let e;return this.isDestroyed()||(e=this._getClassName(),G(t,"className",e.join(" "))),this}refresh(t){return wt(t)?(this.attr(t)._refreshIcon()._refreshMessage()._refreshClose()._refreshEl(),this):this}clearTimer(){return this.isDestroyed()||this.timer&&(clearTimeout(this.timer),this.timer=null),this}startTimer(t){return this.isDestroyed()||(this.timer=a((()=>{this.$emit("opened"),this.close()}),1e3*t)),this}open(t){const e=this.$el;let i,r,o,s;return this.isDestroyed()||(this.isClosed()&&this.refresh(t),i=this.attr("offset"),r=this.attr("duration"),o=i&&i>=this.offset?i:this.offset,s=`top:${o}px;`,this.clearTimer(),this.$emit("beforeOpen"),a((()=>{this.visible=!0,g(e,"outline-message_visible"),e.style.cssText=s,r>0&&this.startTimer(r)}),100)),this}close(){const t=this.$el;let e,i;return this.isDestroyed()||(e=this.attr("destroyAfterClosed"),i=this.attr("beforeClose"),l(i)&&i.call(this),t.style.cssText="top:-50px;",et(t,"outline-message_visible"),this.visible=!1,this.closed=!0,a((()=>{this.$emit("closed"),e&&this.destroy()}),500)),this}destroy(){return this.$emit("beforeDestroy"),this.isDestroyed()||(this.removeListeners(),document.body.removeChild(this.$el),clearTimeout(this.timer),this._default(),this.$emit("afterDestroy")),this}onMouseEnter(){return this.clearTimer(),this}onMouseLeave(){const t=this.attr("duration"),e=this.attr("delay");return t<=0||this.startTimer(e),this}onClose(){return this.clearTimer(),this.close(),this}addListeners(){const t=this.$el;return B(t,".outline-message__content","mouseenter",this.onMouseEnter,this,!0),B(t,".outline-message__content","mouseleave",this.onMouseLeave,this,!0),B(t,".outline-message__close","click",this.onClose,this,!0),this}removeListeners(){const t=this.$el;return U(t,"mouseenter",this.onMouseEnter),U(t,"mouseleave",this.onMouseLeave),U(t,"click",this.onClose),this}}$t.DEFAULTS=c({id:"",type:"info",effect:"default",round:!1,offset:30,duration:3,delay:2,message:"",customClass:"",closable:!0,visible:!0,dangerouslyUseHTMLString:!1,destroyAfterClosed:!0,beforeClose:null}),["info","success","warning","error"].forEach((t=>{$t[t]=e=>{const i={},r=S("outline-message-"),o=e.beforeClose||null;let s=e.offset||30;return u(e)?i.message=e:wt(e)&&$(i,e),i.id=r,i.type=t,i.offset=s,i.visible=!1,i.beforeClose=()=>{$t.close(r,o)},yt=new $t(i),xt.forEach((t=>{s+=t.$el.offsetHeight+16})),yt.offset=s,yt.open(),xt.push(yt),yt}})),$t.close=(t,e)=>{const i=xt.length;let r,o,s=-1;if(xt.forEach(((i,r)=>{t===i.id&&(o=i.$el.offsetHeight,s=r,l(e)&&e.call(i),xt.splice(r,1))})),i<=1||-1===s||s>xt.length-1)return!1;for(r=s;r{let t=xt.length-1;for(;t>=0;t-=1)xt[t].close()};class Tt{constructor(t,e){this.name=t,l(e)&&(this.action=e)}execute(){return this.action(),this}}class zt{constructor(){this.commands=[]}get(t){return this.commands.find((e=>e.name===t))}add(t){return this.commands.push(t),this}del(t){const e=this.commands,i=e.find((e=>e.name===t)),r=i?e.indexOf(i):-1;return r>-1&&e.splice(r,1),this}clear(){return this.commands=[],this}execute(t){const e=this.commands.find((e=>e.name===t));return l(null==e?void 0:e.execute)&&e.execute(),this}}const kt=(t,e=!0)=>{const i=tt(t.icon,{iconSet:t.iconSet||"outline",color:t.color||"",size:t.size}),r=K("a",{className:"outline-toolbar__anchor",href:t.link},i),o=K("div",{className:`outline-toolbar__button ${t.name}`,"data-cmd":t.name},[t.link?r:i]);return g(i,"outline-toolbar__icon"),e&&g(o,"outline-toolbar_rounded"),t.disabled&&g(o,"outline-toolbar_disabled"),o};rt(".outline-toolbar{margin:0;overflow:hidden;position:fixed;transition-duration:.3s;z-index:99999}.outline-toolbar__button{background-color:#fff;border:1px solid #dcdfe6;border-radius:3px;box-shadow:0 0 6px 1px #dcdfe6;box-sizing:border-box;color:#999;cursor:pointer;height:36px;margin:10px;overflow:hidden;position:relative;text-align:center;transition:all .3s ease-in-out .1s;width:36px;z-index:1}.outline-toolbar__button:hover{border-color:#058942;color:#058942;transform:scale(1.35)}.outline-toolbar__button.hide{display:none}.outline-toolbar__anchor:hover,.outline-toolbar__anchor:link,.outline-toolbar__anchor:visited{color:#999;text-decoration:none}.outline-toolbar__anchor:hover{color:#058942}.outline-toolbar__icon{height:20px;left:50%;position:absolute;top:50%;transform:translate(-50%,-50%);width:20px;z-index:2;fill:currentcolor;overflow:hidden}.outline-toolbar_active.outline-toolbar__button{background-color:#058942;border-color:#058942;color:#fff}.outline-toolbar_active.outline-toolbar__button:hover{color:#fff}.outline-toolbar_active .outline-toolbar__anchor:hover,.outline-toolbar_active .outline-toolbar__anchor:link,.outline-toolbar_active .outline-toolbar__anchor:visited{color:#fff}.outline-toolbar_rounded.outline-toolbar__button{border-radius:18px}.outline-toolbar_disabled .outline-toolbar__anchor:hover,.outline-toolbar_disabled .outline-toolbar__anchor:link,.outline-toolbar_disabled .outline-toolbar__anchor:visited,.outline-toolbar_disabled .outline-toolbar__button,.outline-toolbar_disabled.outline-toolbar__anchor:hover,.outline-toolbar_disabled.outline-toolbar__anchor:link,.outline-toolbar_disabled.outline-toolbar__anchor:visited,.outline-toolbar_disabled.outline-toolbar__button{border-color:#999;color:#999;cursor:not-allowed}.outline-toolbar_disabled .outline-toolbar__anchor:hover:hover,.outline-toolbar_disabled .outline-toolbar__anchor:link:hover,.outline-toolbar_disabled .outline-toolbar__anchor:visited:hover,.outline-toolbar_disabled .outline-toolbar__button:hover,.outline-toolbar_disabled.outline-toolbar__anchor:hover:hover,.outline-toolbar_disabled.outline-toolbar__anchor:link:hover,.outline-toolbar_disabled.outline-toolbar__anchor:visited:hover,.outline-toolbar_disabled.outline-toolbar__button:hover{border-color:#999;color:#999}.outline-toolbar_disabled .outline-toolbar__button,.outline-toolbar_disabled.outline-toolbar__button{background-color:#f5f5f5}.outline-toolbar_btt,.outline-toolbar_ttb{left:50%;transform:translateX(-50%)}.outline-toolbar_btt .outline-toolbar__button,.outline-toolbar_ttb .outline-toolbar__button{display:inline-block}.outline-toolbar_ttb{top:12px}.outline-toolbar_ttb.outline-toolbar_hidden{top:-56px}.outline-toolbar_btt{bottom:12px}.outline-toolbar_btt.outline-toolbar_hidden{bottom:-56px}.outline-toolbar_ltr,.outline-toolbar_rtl{transform:translateY(-50%);width:56px}.outline-toolbar_rtl{right:12px;top:50%}.outline-toolbar_rtl.outline-toolbar_hidden{right:-86px}.outline-toolbar_ltr{left:12px;top:50%}.outline-toolbar_ltr.outline-toolbar_hidden{left:-86px}.outline-toolbar_btt .outline-toolbar__button.outline-toolbar_hidden,.outline-toolbar_ltr .outline-toolbar__button.outline-toolbar_hidden,.outline-toolbar_rtl .outline-toolbar__button.outline-toolbar_hidden,.outline-toolbar_ttb .outline-toolbar__button.outline-toolbar_hidden{display:none}");const Et="outline-toolbar_disabled",St="outline-toolbar_hidden",Ct="outline-toolbar_active";class Lt extends M{constructor(t){super(),this._default(),t&&this.initialize(t)}_default(){return this.attrs=c(Lt.DEFAULTS),this.disabled=!1,this.closed=!1,this.$el=null,this.buttons=[],this.commands=null,this}initialize(t){let e;return this.attr(t),this.disabled=this.attr("disabled"),this.closed=this.attr("closed"),this.commands=new zt,e=this.attr("created"),l(e)&&e.call(this),this.render().addListeners(),this}isHighlight(t){const e=this.get(t);return!!e&&m(e.$el,Ct)}isDisabled(t){let e;return t?(e=this.get(t),e.disabled):this.disabled}isExist(t){return!!this.get(t)}isClosed(){return this.closed}_getCommand(t){const e=this,{action:i,name:r}=t;let o,s,n=null,a=null;return i?(a=i.handler,o=i.context||this,l(a)?s=a:u(a)&&(s=function(){e.$emit(a,r)}),l(s)&&(n=new Tt(r,s.bind(o))),n):n}get(t){return this.buttons.find((e=>e.name===t))}render(){const t=this.attr("mounted"),e=this.attr("buttons")||[],i=this.attr("placement");return X(),this.$el=K("div",{id:S("outline-toolbar"),className:`outline-toolbar outline-toolbar_${i}`}),this._paint(e),document.body.appendChild(this.$el),this.closed&&this.hide(),this.disabled&&this.disable(),l(t)&&t.call(this),this}erase(){return this.$el.innerHTML="",this}_paint(t){const e=this.attr("rounded"),i=document.createDocumentFragment();return t.forEach((t=>{const r=kt(t,e),o=this._getCommand(t),{name:s,disabled:n,context:l}=t;i.appendChild(r),this.isExist(s)||(this.buttons.push({$el:r,name:s,disabled:n||!1,context:l||this}),o&&this.commands.add(o))})),this.$el.appendChild(i),this}_remove(){return document.body.removeChild(this.$el),this}refresh(t){return this.attr({buttons:t}),this.erase()._paint(t),this}add(t){const e=this.$el,i=document.createDocumentFragment(),r=this.attr("buttons")||[],{name:o,disabled:s,context:n}=t,l=this._getCommand(t),a=t=>{const e=kt(t);i.appendChild(e),r.push(t),this.buttons.push({$el:e,name:o,disabled:s||!1,context:n||this,command:l}),l&&this.commands.add(l)};return h(t)?a(t):d(t)&&t.forEach((t=>{h(t)&&a(t)})),e.appendChild(i),this}remove(t){const e=this.$el,i=this.buttons,r=this.get(t);let o=-1;return r?(o=i.indexOf(r),o>-1&&(i.splice(o,1),this.attr("buttons").splice(o,1)),this._disable(t),e.removeChild(r.$el),this):this}_disable(t){const e=this.get(t),i=this.commands.get(t);return!e||e.disabled||(e.disabled=!0,i&&this.commands.del(i),g(e.$el,Et)),this}_enable(t){const e=this.get(t),i=this.commands.get(t);return e&&e.disabled?(e.disabled=!1,i&&this.commands.add(i),et(e.$el,Et),this):this}disable(t){const e=this.attr("afterDisabled");return t?this._disable(t):(g(this.$el,Et),this.removeListeners(),this.disabled=!0,l(e)&&e.call(this)),this}enable(t){const e=this.attr("afterEnabled");return t?this._enable(t):(this.disabled=!1,et(this.$el,Et),this.addListeners(),l(e)&&e.call(this)),this}show(t){const e=this.attr("afterOpened"),i=this.get(t),r=this.$el;if(t){if(!i)return this;et(i.$el,St)}else et(r,St),this.closed=!1,l(e)&&a((()=>{e.call(this)}),310);return this}hide(t){const e=this.attr("afterClosed"),i=this.get(t),r=this.$el;if(t){if(!i)return this;g(i.$el,St)}else g(r,St),this.closed=!0,l(e)&&a((()=>{e.call(this)}),310);return this}toggle(t){return this.isClosed()?this.show(t):this.hide(t),this}highlight(t){const e=this.get(t);let i;return e?(i=e.$el,m(i,Ct)?et(i,Ct):g(i,Ct),this):this}destroy(){const t=this.attr("beforeDestroy"),e=this.attr("afterDestroy");return l(t)&&t.call(this),this.commands.clear(),this.removeListeners()._remove()._default(),l(e)&&e.call(this),this}execute(t){return this.isDisabled(t)||this.commands.execute(t),this}onExecute(t){const e=t.delegateTarget;let i="";return e&&(i=e.getAttribute("data-cmd"),i&&this.execute(i)),this}_updateToolbar({top:t,min:e,max:i}){const r=Math.ceil(t);return r<=e?(this.hide("up"),this.show("down")):r>=i?(this.hide("down"),this.show("up")):r>e&&r{t[`on${i}`]=t=>{E(i,{event:t,speech:e})}})),speechSynthesis.onvoiceschanged=t=>{E("voiceschanged",{event:t,speech:e})},this}}Mt.isSupport="speechSynthesis"in window;const At=(t,e)=>{let i,r=t;for(;r;)i=r.tagName.toLowerCase(),"script"!==i&&"style"!==i&&g(r,"outline-reader_sibling"),r=e?r.previousElementSibling:r.nextElementSibling};rt(".outline-reader__progress{animation:outline-reader-progress linear;background-color:#507afe;height:4px;left:0;position:fixed;scale:0 1;top:0;transform-origin:left;width:100%;z-index:3;animation-timeline:--ProgressTimeline}.outline-reader__paper{background-color:#fff;box-shadow:0 0 6px 1px #ddd;box-sizing:border-box;margin:2em auto;max-width:1200px;overflow:hidden;padding:3.2em}.outline-reader__title{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Helvetica Neue,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Helvetica,Arial,sans-serif;font-size:4.2em;font-weight:400;line-height:1.3em;margin:.67em 0;overflow:hidden;text-align:center}.outline-reader__article .outline-reader__progress,.outline-reader_hidden{display:none}.outline-reader_hidden.outline-reader_sibling{display:none!important}.outline-reader_hidden.outline-reader_sibling.wrapper.post{display:none}.outline-reader--reading{background-color:#fafafa;box-sizing:border-box;display:block;height:100%;left:0;margin:0;padding:3em 4em;position:fixed;top:0;width:100%;z-index:2;scroll-timeline-name:--ProgressTimeline;overflow:scroll}@keyframes outline-reader-progress{to{scale:1 1}}@media (max-width:500px){.outline-reader{overflow:hidden}.outline-reader .outline-toolbar{align-items:center;align-self:auto;background-color:#fff;border-top:1px solid #ddd;box-sizing:border-box;display:flex;flex-direction:row;flex-wrap:nowrap;height:48px;padding:0 16px;right:0;top:100%;transform:translateY(-48px);width:100%}.outline-reader .outline-toolbar__button{border:none;border-radius:0;box-shadow:none;flex:1}.outline-reader--reading{background-color:#fff;box-sizing:border-box;padding:0}.outline-reader__paper{box-shadow:none;height:100%;margin:0;overflow:hidden;padding:0;position:relative;z-index:1}.outline-reader__title{background-color:#fff;border-bottom:1px solid #ddd;font-size:1.8em;font-weight:400;height:48px;left:0;line-height:48px;margin:0;overflow:hidden;position:absolute;text-overflow:ellipsis;top:0;white-space:nowrap;width:100%;z-index:3}.outline-reader__article{height:calc(100% - 96px);margin:48px 0;padding:0 1.25em;scroll-timeline-name:--MobileProgressTimeline;overflow-x:hidden;overflow-y:scroll}.outline-reader__article .outline-reader__progress{animation:outline-reader-progress linear;z-index:4;animation-timeline:--MobileProgressTimeline;display:block}}@media print{body,html{background-color:#fff;color:#333;font-size:12pt;height:auto!important}a:hover,a:link,a:visited{color:#507afe;text-decoration:underline!important}audio,video{display:none!important}table{border-collapse:collapse;width:100%}td,th{border:1px solid #dcdfe6;padding:8px 20px}.outline-message,.outline-toolbar{display:none!important}.outline-reader{display:block!important;overflow:hidden}.outline-reader__title{font-size:32pt!important;margin:13.4pt 0 28pt!important;text-align:center!important}.outline-reader--reading{background-color:#fff;height:auto!important;overflow:hidden!important;padding:0!important;position:relative!important}.outline-reader__progress{display:none!important}.outline-reader__paper{box-shadow:none}.outline-reader pre{border:1px solid #ddd!important;border-radius:4px!important;padding:1em!important}.outline-reader code,.outline-reader pre{background-color:#fff!important}.outline-reader img,.outline-reader svg,.outline-reader table{break-inside:avoid}.outline-reader_sibling{display:none!important}}");const Nt="进入阅读模式,按 ESC 键可退出阅读模式";class Ot extends M{constructor(t){super(),this._default(),t&&this.initialize(t)}_default(){return this.attrs=c(Ot.DEFAULTS),this.reading=!1,this.$target=null,this.$el=null,this.$paper=null,this.$title=null,this.$article=null,this.$progress=null,this.toolbar=null,this.speech=null,this}initialize(t){let e;return this.attr(t),e=this.attr("target"),u(e)?this.$target=document.querySelector(e):p(e)&&(this.$target=e),this.$target?(Mt.isSupport&&(this.speech=new Mt),this.render().addListeners(),this):this}isSpeaking(){var t;return null==this||null===(t=this.speech)||void 0===t?void 0:t.isSpeaking()}render(){return this._renderEdge()._paint(this.$target),this}erase(){return this.$article.innerHTML="",this}_paint(t){const e=document.createDocumentFragment(),r=i(s,t.cloneNode(!0).children);return a((()=>{r.forEach((t=>{e.appendChild(t)})),this.$article.appendChild(e)})),this}_remove(){const t=this.$el,e=this.toolbar;return t&&document.body.removeChild(t),e&&e.destroy(),this}refresh(){return this.erase()._paint(this.$target),this}_animateTimeline(){return window.ScrollTimeline&&bt()?(this.$progress.animate({scale:["0 1","1 1"]},{timeline:new ScrollTimeline({source:this.$article,axis:"block"})}),this):this}_renderEdge(){const t=this.$target,e=bt()?26:20;let i,r,o,s,n,l,h=this.attr("title");n=K("div",{className:"outline-reader__progress"}),this.$progress=n,o=t.querySelector("h1"),p(h)&&(o=h),p(o)&&(h=o.innerText),o=K("h1",{className:"outline-reader__title"},h),this.$title=o,s=K("article",{id:"outline-reader__article",className:"outline-reader__article"},bt()?[]:[n.cloneNode()]),this.$article=s,r=K("div",{id:"outline-reader__paper",className:"outline-reader__paper"},[o,s]),this.$paper=r;const d=[];return d.push({name:"print",icon:"print",size:e,action:{context:this,handler:this.print}}),Mt.isSupport&&this.attr("allowSpeak")&&d.push({name:"speak",icon:"sound",size:e,action:{context:this,handler:this.speak}}),d.push({name:"exit",icon:"close",size:e,action:{context:this,handler:this.exit}}),this.toolbar=new Lt({placement:"rtl",buttons:d}),i=K("section",{id:"outline-reader",className:"outline-reader outline-reader_hidden"},[n,r,this.toolbar.$el]),this.$el=i,document.body.appendChild(i),this._animateTimeline(),a((()=>{l=i.previousElementSibling,At(l,!0),l=i.nextElementSibling,At(l)})),this}enter(){const t="outline-reader",e=`${t}--reading`,i=`${t}_hidden`,r=this.$el,o=document.querySelectorAll(".outline-reader_sibling"),s=this.attr("enterReadingTip")||Nt;return this.reading||!r||(o.forEach((t=>{g(t,i)})),g(r,e),et(r,i),this.toolbar.show(),this.reading=!0,$t.info({round:!0,message:s}),this.$emit("reader:enter")),this}exit(){const t="speak",e="outline-reader",i=`${e}--reading`,r=`${e}_hidden`,o=this.$el,s=document.querySelectorAll(".outline-reader_sibling"),n=this.speech,l=this.toolbar;return this.reading&&o?(g(o,r),et(o,i),s.forEach((t=>{et(t,r)})),l.hide(),this.reading=!1,n&&(l.isHighlight(t)&&l.highlight(t),n.cancel()),this.$emit("reader:exit"),this):this}toggle(){return this.reading?this.exit():this.enter(),this}speak(){const t=this.$article.innerText,e=this.speech;return Mt.isSupport&&e?(this.toolbar.highlight("speak"),this.isSpeaking()?e.cancel():e.speak(t),this):this}print(){return l(print)?(print(),this):this}destroy(){return this.$el?(this.removeListeners()._remove()._default(),this):this}onPrint(){return this.print(),this}onEnterReading(){return this.toggle(),this}onExitReading(t){return 27===t.keyCode&&this.reading&&(this.toggle(),V(t)),this}onRefresh(){return this.refresh(),this}addListeners(){return this.$el?(ut(document,"keyup",this.onExitReading,this,!0),this.$on("toolbar:action:print",this.onPrint),this.$on("toolbar:action:reading",this.onEnterReading),this.$on("reader:print",this.onPrint),this.$on("reader:refresh",this.onRefresh),this.$on("reader:enter",this.enter),this.$on("reader:exit",this.exit),this.$on("reader:toggle",this.toggle),this):this}removeListeners(){return this.$el?(U(document,"keyup",this.onExitReading),this.$off("toolbar:action:print"),this.$off("toolbar:action:reading"),this.$off("reader:refresh"),this.$off("reader:toggle"),this):this}}var Ht;Ot.DEFAULTS=c({target:"",title:"",enterReadingTip:Nt,allowSpeak:!1});class Dt extends M{constructor(t){super(),this.version="3.39.0",this._default(),t&&this.initialize(t)}_default(){const t=Dt.DEFAULTS;return this.attrs=c(t),this.$article=null,this.$scrollElement=null,this.buttons=[],this.anchors=null,this.drawer=null,this.navigator=null,this.reader=null,this.toolbar=null,this}initialize(t){let e="",i="",r=null;return this.attr(t),e=this.attr("articleElement"),i=this.attr("scrollElement"),u(e)?r=document.querySelector(e):p(e)&&(r=e),this.$article=r,this.$scrollElement=b(i),this.$emit("created",o({},this.attr())),this.render().addListeners(),this}isExpanded(){const t=this.attr("position"),e=this.drawer,i=this.navigator;return!(this.count()<0)&&("relative"===t?!e.isClosed():!i.isClosed())}getChapters(t=!1){const e=this.$article,i=this.attr("selector"),r=this.attr("showCode"),o=this.attr("chapterTextFilter");return x({articleElement:e,selector:i,showCode:r,chapterTextFilter:o,isTreeStructured:t})}count(){return this.getChapters().length}render(){const t=this.attr("hasToolbar"),e=this.$scrollElement;return this._renderReader()._renderAnchors()._renderNavigator()._renderToolbar(),e&&t&&this.$emit("toolbar:update",{top:e.scrollTop,min:0,max:e.scrollHeight}),this.$emit("mounted"),this}_renderReader(){const t=this.attr("reader");return t.target?(g(this.$article,"outline-article"),this.reader=new Ot(t),this):this}_renderAnchors(){const t=this.attr("articleElement"),e=this.attr("selector"),i=this.attr("stickyHeight"),r=this.attr("scrollElement"),o=this.attr("showCode"),s=this.attr("anchorURL"),n=this.attr("afterScroll"),l=this.attr("chapterTextFilter"),a=this.attr("anchorLinkFilter");return this.anchors=new ot({articleElement:t,stickyHeight:i,scrollElement:r,selector:e,showCode:o,anchorURL:s,afterScroll:n,chapterTextFilter:l,anchorLinkFilter:a}),this}_renderNavigator(){const t=this.attr("title"),e=this.attr("stickyHeight"),i=this.attr("scrollElement"),r=this.attr("customClass"),o=this.attr("showCode"),s=this.attr("animationCurrent"),n=this.attr("closeOnClickModal"),l=this.attr("showNavModalFirst"),a=this.attr("position"),h=this.attr("placement"),d=this.attr("afterSticky"),c=this.attr("afterToggle"),u=this.attr("afterScroll"),p=this.count();let m,g=this.attr("parentElement");return p<1||(m={scrollElement:i,showCode:o,animationCurrent:s,position:a,title:t,stickyHeight:e,chapters:this.getChapters(),afterSticky:d,afterToggle:c,afterScroll:u},"relative"===a?(this.drawer=new ct({placement:h,title:t,size:"tiny",hasOffset:!0,hasPadding:!1,closeOnClickModal:n,customClass:r,afterClosed:()=>{this.toolbar.toggle()}}),g=this.drawer.$main,l&&this.drawer.open()):m.customClass=r,m.parentElement=g,this.navigator=new ft(m)),this}_renderToolbar(){const t=this.attr("position"),e=this.attr("hasToolbar"),r=this.attr("showNavModalFirst"),o=this.attr("placement"),n=this.attr("homepage"),a=this.attr("git"),h=this.attr("tags"),d=this.attr("issues"),c=this.attr("tools"),u=this.attr("reader"),p=this.count(),m={name:"up",icon:"up",size:20,action:{context:this,handler:this.toTop}},g={name:"homepage",icon:"homepage",size:20,link:n},_={name:"github",icon:"github",size:20,link:a},f={name:"tags",icon:"tags",size:20,link:h},b={name:"issues",icon:"issues",size:20,link:d},w={name:"toggle",icon:"menu",size:18,action:{context:this,handler:this.toggle}},v={name:"reading",icon:"file",size:18,action:{context:this,handler:"toolbar:action:reading"}},x={name:"print",icon:"print",size:20,action:{handler:"toolbar:action:print"}},y={name:"down",icon:"down",size:20,action:{context:this,handler:this.toBottom}},$=[];return e?($.push(m),p>0&&$.push(w),n&&$.push(g),a&&$.push(_),h&&$.push(f),d&&$.push(b),u.target&&($.push(v),l(print)&&$.push(x)),(null==c?void 0:c.length)>0&&$.push.apply($,i(s,c)),$.push(y),this.buttons=[].concat($),this.toolbar=new Lt({placement:o,buttons:$}),"relative"===t&&r&&this.toolbar.hide(),this):this}refresh(){const t=this.getChapters();return this.$emit("anchors:refresh",t),this.$emit("navigator:refresh",t),this.$emit("reader:refresh"),this.$emit("refresh",t),this}addButton(t){const e=this.buttons;return e.splice(-1,0,t),this.$emit("toolbar:add:button",e),this}removeButton(t){return this.$emit("toolbar:remove:button",t),this}toTop(){const t=this.attr("afterScroll"),e=this.toolbar,i=this.navigator,r=this.count();return r>0&&(i.playing=!0),this.scrollTo(0,(()=>{e.hide("up"),e.show("down"),r>0&&(i.highlight(0),i.playing=!1,f(i.$main,0)),l(t)&&t.call(e,"up")})),this}toBottom(){const t=this.attr("afterScroll"),e=this.$scrollElement,i=this.toolbar,r=this.navigator,o=this.count(),s=Math.floor(e.scrollHeight-e.clientHeight);return o>0&&(r.playing=!0),this.scrollTo(s,(()=>{const e=r.$main;i.hide("down"),i.show("up"),o>0&&(r.highlight(o-1),f(e,e.scrollHeight),r.playing=!1),l(t)&&t.call(i,"bottom")})),this}scrollTo(t,e){return f(this.$scrollElement,t,e),this}enterReading(){return this.$emit("toolbar:toggle"),this.$emit("reader:enter"),this}exitReading(){return this.$emit("toolbar:toggle"),this.$emit("reader:exit"),this}switchReading(){return this.$emit("toolbar:toggle"),this.$emit("reader:toggle"),this}expand(){const t=this.attr("position"),e=this.toolbar,i=this.drawer,r=this.navigator;return this.count()<1||("relative"!==t?(r.show(),e.highlight("toggle")):(e.hide(),a((()=>{i.open()})))),this}collapses(){const t=this.attr("position"),e=this.toolbar,i=this.drawer,r=this.navigator;return this.count()<1||("relative"!==t?(r.hide(),e.highlight("toggle")):(e.show(),a((()=>{i.close()})))),this}toggle(){return this.isExpanded()?this.collapses():this.expand(),this}print(){return this.$emit("reader:print"),this}_destroy(){const t=this.count();let e=this.anchors,i=this.navigator,r=this.drawer,o=this.reader,s=this.toolbar,n=!1;return this.removeListeners(),o&&o.destroy(),t>0&&i&&(n=i.isOutside(),i.destroy(),n&&r&&r.destroy()),e&&e.destroy(),s&&s.destroy(),this}destroy(){return this.$emit("beforeDestroy"),this._destroy()._default(),this.$emit("destroyed"),this}addListeners(){return this.attr("hasToolbar")?(this.$on("toolbar:update",this.onToolbarUpdate),this):this}removeListeners(){return this.attr("hasToolbar")?(this.$off("toolbar:update"),this):this}}if(Dt.DEFAULTS=c({articleElement:"#article",selector:"h2,h3,h4,h5,h6",parentElement:"#aside",scrollElement:"html,body",title:"目录",position:"relative",placement:"rtl",animationCurrent:!0,showCode:!1,hasToolbar:!0,closeOnClickModal:!0,showNavModalFirst:!1,anchorURL:"",stickyHeight:0,homepage:"",git:"",tags:"",issues:"",tools:[],reader:{target:"",title:"",enterReadingTip:"进入阅读模式,按 ESC 键可退出阅读模式",allowSpeak:!1},customClass:"",afterSticky:null,afterToggle:null,afterScroll:null,chapterTextFilter:null,anchorLinkFilter:null}),null!==(Ht=window)&&void 0!==Ht&&Ht.jQuery){const t=window.jQuery;t.extend(t.fn,{outline:function(e){let i=t(this);return new Dt(t.extend({},e,{articleElement:i}))}})}return Dt})); //# sourceMappingURL=outline.min.js.map diff --git a/docs/js/outline.min.js.map b/docs/js/outline.min.js.map index baa9346d..35a7dff1 100644 --- a/docs/js/outline.min.js.map +++ b/docs/js/outline.min.js.map @@ -1 +1 @@ -{"version":3,"file":"outline.min.js","sources":["../../utils/lang/toString.js","../../utils/types/isFunction.js","../../utils/lang/later.js","../../utils/types/isObject.js","../../utils/types/isArray.js","../../utils/lang/cloneDeep.js","../../utils/types/isString.js","../../utils/types/isElement.js","../../utils/dom/hasClass.js","../../utils/dom/addClass.js","../../utils/lang/easeInQuad.js","../../utils/dom/_getScrollElement.js","../../utils/dom/scrollTo.js","../../utils/lang/trim.js","../../getChaptersByHeadings.js","../../utils/lang/stripTags.js","../../_getChapterParentIdByDiffer.js","../../_getChaptersWithCode.js","../../getChapters.js","../../utils/lang/toTree.js","../../utils/lang/hasOwn.js","../../utils/lang/extend.js","../../utils/observer/_subscribers.js","../../utils/observer/_hasDirectSubscribersFor.js","../../utils/observer/has.js","../../utils/observer/_hasSubscribers.js","../../utils/observer/emit.js","../../utils/types/isTypedArray.js","../../utils/lang/guid.js","../../utils/observer/_removeSubscriber.js","../../utils/observer/off.js","../../utils/observer/_removeSubscriberByToken.js","../../base.js","../../utils/observer/on.js","../../utils/lang/timeSlice.js","../../utils/dom/offsetTop.js","../../utils/dom/matches.js","../../utils/dom/getParentOrHost.js","../../utils/event/enum.js","../../utils/event/_off.js","../../utils/event/_delete.js","../../utils/event/purgeElement.js","../../utils/event/getListeners.js","../../utils/event/off.js","../../utils/event/on.js","../../utils/event/getTarget.js","../../utils/dom/resolveTextNode.js","../../utils/dom/closest.js","../../utils/event/stop.js","../../utils/icons/symbols.js","../../utils/icons/defaults.js","../../utils/icons/getSymbols.js","../../utils/icons/getSymbol.js","../../utils/icons/paint.js","../../utils/icons/add.js","../../utils/types/isDOM.js","../../utils/types/isHTMLCollection.js","../../utils/types/isFragment.js","../../utils/types/isTextNode.js","../../utils/dom/setAttribute.js","../../utils/dom/setAttributes.js","../../utils/dom/createElement.js","../../utils/icons/createElement.js","../../utils/types/isSVG.js","../../utils/icons/icon.js","../../utils/dom/removeClass.js","../../_removeHeading.js","../../utils/types/isEmpty.js","../../anchors.js","../../_updateHeading.js","../../utils/types/tags.js","../../utils/types/isHTML.js","../../utils/lang/stripScripts.js","../../utils/dom/setProperty.js","../../zIndex.js","../../drawer.js","../../utils/dom/html.js","../../utils/event/at.js","../../utils/dom/getStyle.js","../../navigator.js","../../_paintChapters.js","../../utils/dom/inBounding.js","../../utils/dom/intersection.js","../../utils/types/isObjectLike.js","../../utils/types/isPlainObject.js","../../utils/lang/encodeHTML.js","../../message.js","../../command.js","../../commands.js","../../_createButton.js","../../toolbar.js","../../speech.js","../../_updateSiblingElements.js","../../utils/dom/isMobile.js","../../reader.js","../../outline.js"],"sourcesContent":["/**\r\n * Object 对象原型上的 toString 方法\r\n * ========================================================================\r\n * @method toString\r\n * @param {*} val\r\n * @returns {string}\r\n */\r\nconst toString = (val) => {\r\n return Object.prototype.toString.apply(val)\r\n}\r\n\r\nexport default toString\r\n","import toString from '../lang/toString'\r\n\r\n/**\r\n * 检测测试数据是否为 Function 类型\r\n * ========================================================================\r\n * @method isFunction\r\n * @param {*} val - (必须)待检测的数据\r\n * @returns {boolean} 'val' 是 Function 类型返回 true,否则返回 false\r\n */\r\nconst isFunction = (val) => {\r\n return typeof val === 'function' || toString(val) === '[object Function]'\r\n}\r\n\r\nexport default isFunction\r\n","import isFunction from '../types/isFunction'\r\n\r\n/**\r\n * later - 延迟执行方法\r\n * ========================================================================\r\n * @method later\r\n * @param {Function} fn\r\n * @param {Number} [delay]\r\n * @returns {number|boolean}\r\n */\r\nconst later = (fn, delay = 300) => {\r\n if (!isFunction(fn)) {\r\n return false\r\n }\r\n\r\n return setTimeout(() => {\r\n fn()\r\n }, delay)\r\n}\r\n\r\nexport default later\r\n","import toString from '../lang/toString'\r\nimport isFunction from './isFunction'\r\n\r\n/**\r\n * 检测数据是否为 Object 类型\r\n * ========================================================================\r\n * @method isObject\r\n * @param {*} o\r\n * @returns {boolean}\r\n */\r\nconst isObject = (o) => {\r\n return (\r\n (toString(o) === '[object Object]' ||\r\n typeof o === 'object' ||\r\n isFunction(o)) &&\r\n o !== null\r\n )\r\n}\r\n\r\nexport default isObject\r\n","import toString from '../lang/toString'\r\n\r\n/**\r\n * 检测数据是否为 Array 类型\r\n * ========================================================================\r\n * @method isArray\r\n * @param {*} o\r\n * @returns {boolean}\r\n */\r\nconst isArray = (o) => {\r\n if (Array.isArray) {\r\n return Array.isArray(o)\r\n } else {\r\n return toString(o) === '[object Array]'\r\n }\r\n}\r\n\r\nexport default isArray\r\n","import isObject from '../types/isObject'\r\nimport isArray from '../types/isArray'\r\n\r\n/**\r\n * 深拷贝对象函数\r\n * ========================================================================\r\n * @methods cloneDeep\r\n * @param {Object} obj - 深拷贝的对象\r\n * @returns {Array|Object|*}\r\n *\r\n * @example\r\n * const arr = cloneDeep([2,3,4,6])\r\n * => [2,3,4,6]\r\n */\r\nconst cloneDeep = (obj) => {\r\n let clone = {}\r\n\r\n if (obj === null) {\r\n return null\r\n }\r\n\r\n if (isArray(obj)) {\r\n clone = Array.from(obj)\r\n } else {\r\n clone = Object.assign({}, obj)\r\n Object.keys(clone).forEach((key) => {\r\n return (clone[key] = isObject(obj[key]) ? cloneDeep(obj[key]) : obj[key])\r\n })\r\n }\r\n\r\n return clone\r\n}\r\n\r\nexport default cloneDeep\r\n","/**\r\n * 检测数据是否为 String 类型\r\n * ========================================================================\r\n * @method isArray\r\n * @param {*} str\r\n * @returns {boolean}\r\n */\r\nconst isString = (str) => {\r\n return typeof str === 'string'\r\n}\r\n\r\nexport default isString\r\n","import isObject from './isObject'\r\n\r\n/**\r\n * 检测数据是否为 HTMLElement DOM 节点\r\n * ========================================================================\r\n * @method isElement\r\n * @param {*} o\r\n * @returns {boolean}\r\n */\r\nconst isElement = (o) => {\r\n return !!(isObject(o) && o.nodeName && o.tagName && o.nodeType === 1)\r\n}\r\n\r\nexport default isElement\r\n","import isElement from '../types/isElement'\r\n/**\r\n * 检测 DOM 节点是否包含名为 className 的样式\r\n * ========================================================================\r\n * @method hasClass\r\n * @param {HTMLElement} el - DOM 节点\r\n * @param {String} className - 样式名称\r\n * @returns {Boolean}\r\n */\r\nconst hasClass = (el, className) => {\r\n const pattern = new RegExp('(\\\\s|^)' + className + '(\\\\s|$)')\r\n let allClass\r\n let classList\r\n\r\n if (!isElement(el)) {\r\n return false\r\n }\r\n\r\n allClass = el.className\r\n\r\n if (!allClass) {\r\n return false\r\n }\r\n\r\n classList = el.classList\r\n\r\n if (classList && classList.contains) {\r\n return el.classList.contains(className)\r\n }\r\n\r\n return !!pattern.exec(allClass)\r\n}\r\n\r\nexport default hasClass\r\n","import hasClass from './hasClass'\r\n\r\n/**\r\n * 给 DOM 节点添加名为 className 的样式\r\n * ========================================================================\r\n * @method addClass\r\n * @param {HTMLElement} el - DOM 节点\r\n * @param {String} className - 样式名称\r\n * @returns {Boolean}\r\n */\r\nconst addClass = (el, className) => {\r\n let classList\r\n let allClass\r\n\r\n if (hasClass(el, className)) {\r\n return false\r\n }\r\n\r\n classList = el.classList\r\n\r\n if (classList?.add) {\r\n if (className.indexOf(' ') > -1) {\r\n className.split(' ').forEach((name) => {\r\n classList.add(name)\r\n })\r\n } else {\r\n classList.add(className)\r\n }\r\n } else {\r\n allClass = el.className\r\n allClass += allClass.length > 0 ? ' ' + className : className\r\n el.className = allClass\r\n }\r\n}\r\n\r\nexport default addClass\r\n","/**\r\n * 返回给定值的平方值\r\n * ========================================================================\r\n * @method easeInQuad\r\n * @param {Number} x\r\n * @returns {number}\r\n */\r\nconst easeInQuad = (x) => {\r\n return x * x\r\n}\r\n\r\nexport default easeInQuad\r\n","import isString from '../types/isString'\r\nimport isElement from '../types/isElement'\r\n\r\n/**\r\n * 通过给的 scrollElement 参数,获取滚动 DOM 元素\r\n * ========================================================================\r\n * @method _getScrollElement\r\n * @param {String|HTMLElement} scrollElement\r\n * @returns {Element}\r\n * @private\r\n */\r\nconst _getScrollElement = (scrollElement = null) => {\r\n let $rootElements\r\n let $scrollElement\r\n\r\n if (!scrollElement) {\r\n $rootElements = document.querySelectorAll('html,body')\r\n $scrollElement =\r\n $rootElements[0].scrollTop - $rootElements[1].scrollTop >= 0\r\n ? $rootElements[0]\r\n : $rootElements[1]\r\n } else {\r\n if (isString(scrollElement)) {\r\n $scrollElement = document.querySelector(scrollElement)\r\n } else if (isElement(scrollElement)) {\r\n $scrollElement = scrollElement\r\n }\r\n }\r\n\r\n return $scrollElement\r\n}\r\n\r\nexport default _getScrollElement\r\n","import easeInQuad from '../lang/easeInQuad'\r\nimport isFunction from '../types/isFunction'\r\nimport _getScrollElement from './_getScrollElement'\r\n\r\n/**\r\n * 指定 rootElement DOM 节点滚动到指定 top 位置\r\n * ========================================================================\r\n * @method scrollTo\r\n * @param {HTMLElement|Object} [scrollElement] - (必须)要滚动的 DOM 节点\r\n * @param {Number} top - (必须)滚动的 scrollTop 数值\r\n * @param {Function} [afterStop] - (可选)滚动完成的回调函数\r\n */\r\nconst scrollTo = (scrollElement, top, afterStop) => {\r\n const $scrollElement = _getScrollElement(scrollElement)\r\n let scrollTop = $scrollElement.scrollTop\r\n let step = 0\r\n const distance = top - scrollTop\r\n const MAX_HEIGHT = $scrollElement.scrollHeight\r\n const MAX_TOP = top - MAX_HEIGHT <= 0 ? top : MAX_HEIGHT\r\n const stop = (top) => {\r\n if (isFunction(afterStop)) {\r\n afterStop(top)\r\n }\r\n\r\n return false\r\n }\r\n const play = () => {\r\n step += 1\r\n\r\n // 向上滚动\r\n if (distance < 0) {\r\n scrollTop -= easeInQuad(step)\r\n $scrollElement.scrollTop = scrollTop\r\n\r\n console.log(\r\n '$scrollElement up',\r\n scrollElement,\r\n $scrollElement,\r\n scrollTop,\r\n $scrollElement.scrollTop\r\n )\r\n\r\n if (scrollTop <= top) {\r\n $scrollElement.scrollTop = top\r\n return stop(top)\r\n }\r\n } else {\r\n scrollTop += easeInQuad(step)\r\n $scrollElement.scrollTop = scrollTop\r\n\r\n console.log(\r\n '$scrollElement down',\r\n scrollElement,\r\n $scrollElement,\r\n scrollTop,\r\n $scrollElement.scrollTop\r\n )\r\n\r\n if (scrollTop >= MAX_TOP) {\r\n $scrollElement.scrollTop = MAX_TOP\r\n return stop(MAX_TOP)\r\n }\r\n }\r\n\r\n // eslint-disable-next-line compat/compat\r\n requestAnimationFrame(play)\r\n }\r\n\r\n // eslint-disable-next-line compat/compat\r\n requestAnimationFrame(play)\r\n}\r\n\r\nexport default scrollTo\r\n","import isString from '../types/isString'\r\n\r\n/**\r\n * 清楚字符串起始位置所有的空格\r\n * ========================================================================\r\n * @method trim\r\n * @param {string} str\r\n * @returns {string|Boolean}\r\n */\r\nconst trim = (str) => {\r\n if (!isString(str)) {\r\n return false\r\n }\r\n return str.replace(/(^\\s+)|(\\s+$)/g, '')\r\n}\r\n\r\nexport default trim\r\n","import trim from './utils/lang/trim'\r\nimport stripTags from './utils/lang/stripTags'\r\nimport isFunction from './utils/types/isFunction'\r\n\r\nimport _getChapterParentIdByDiffer from './_getChapterParentIdByDiffer'\r\nimport _getChaptersWithCode from './_getChaptersWithCode'\r\n\r\n/**\r\n * 根据文章中的 h1~h6 标签,自动分析返回文章章节数据\r\n * ========================================================================\r\n * @method getChaptersByHeadings\r\n * @param {Array} headings\r\n * @param {Boolean} [showCode]\r\n * @param {Function} [chapterTextFilter]\r\n * @return {*|*[]}\r\n */\r\nconst getChaptersByHeadings = (\r\n headings,\r\n showCode = false,\r\n chapterTextFilter = null\r\n) => {\r\n const pattern = /^\\d(\\.|(\\.\\d+)*)\\s?/gi\r\n const chapters = []\r\n let previous = 1\r\n let level = 0\r\n let text = ''\r\n\r\n headings.forEach((heading, i) => {\r\n const tagName = heading.tagName\r\n const headingLevel = tagName.replace(/h/i, '')\r\n let current = parseInt(headingLevel, 10)\r\n let pid = -1\r\n\r\n // 场景1:当前标题是前一个标题的子标题\r\n // 当前标题的(标题标签)序号 > 前一个标题的序号:两个相连的标题是父标题 -> 子标题关系;\r\n // h2 (前一个标题)\r\n // h3 (当前标题)\r\n if (current > previous) {\r\n level += 1\r\n\r\n // 第一层级的 pid 是 -1\r\n if (level === 1) {\r\n pid = -1\r\n } else {\r\n pid = i - 1\r\n }\r\n }\r\n // 场景2:当前标题和前一个标题层级相同\r\n // 当前标题的(标题标签)序号 = 前一个标题的序号\r\n // h2 (前一个标题)\r\n // h2 (当前标题)\r\n // 当前标题的(标题标签)序号 < 前一个标题的序号,并且当前标题序号 > 当前的级别\r\n // h2\r\n // h4 (前一个标题)\r\n // h3 (当前标题:这种情况我们还是任务 h3 是 h2 的下一级章节)\r\n else if (current === previous || (current < previous && current > level)) {\r\n // H1 的层级肯定是 1\r\n if (current === 1) {\r\n level = 1\r\n pid = -1\r\n } else {\r\n pid = chapters[i - 1].pid\r\n }\r\n }\r\n // 场景3:当前标题比前一个标题层级高\r\n else if (current <= level) {\r\n // H1 的层级肯定是 1\r\n if (current === 1) {\r\n level = 1\r\n } else {\r\n level = level - (previous - current)\r\n\r\n if (level <= 1) {\r\n level = 1\r\n }\r\n }\r\n\r\n // 第一级的标题\r\n if (level === 1) {\r\n pid = -1\r\n } else {\r\n // 通过当前标题和前一个标题之间的等级差,获得当前标题的父标题ID\r\n pid = _getChapterParentIdByDiffer(chapters, previous - current, i)\r\n }\r\n }\r\n\r\n previous = current\r\n\r\n text = trim(stripTags(heading.innerHTML))\r\n\r\n // 如果自动生成章节编号,则去掉标题中自带的编号文本\r\n if (showCode) {\r\n text = trim(text.replace(pattern, ''))\r\n }\r\n\r\n if (isFunction(chapterTextFilter)) {\r\n text = chapterTextFilter(text)\r\n }\r\n\r\n chapters.push({\r\n id: i,\r\n pid: pid,\r\n level: level,\r\n rel: `heading-${i}`,\r\n text,\r\n tagName\r\n })\r\n })\r\n\r\n return showCode ? _getChaptersWithCode(chapters) : chapters\r\n}\r\n\r\nexport default getChaptersByHeadings\r\n","import isString from '../types/isString'\r\n\r\n/**\r\n * 过滤所有 HTML 标签\r\n * ========================================================================\r\n * @method stripTags\r\n * @param {string} str\r\n * @returns {string}\r\n */\r\nconst stripTags = (str) => {\r\n if (!isString(str)) {\r\n return ''\r\n }\r\n return str.replace(/<\\/?[^>]+(>|$)/g, '')\r\n}\r\n\r\nexport default stripTags\r\n","const _getChapterParentIdByDiffer = (chapters, differ, index) => {\r\n let previous = chapters[index - 1]\r\n let pid\r\n let i\r\n\r\n for (i = 0; i < differ; i += 1) {\r\n pid = previous.pid\r\n previous = chapters[pid]\r\n }\r\n\r\n pid = previous.pid\r\n\r\n return pid\r\n}\r\n\r\nexport default _getChapterParentIdByDiffer\r\n","import isArray from './utils/types/isArray'\r\n\r\nconst _getChaptersWithCode = (chapters) => {\r\n const groups = {}\r\n const cb = (o) => {\r\n return [o.pid]\r\n }\r\n\r\n chapters.forEach((o) => {\r\n const group = JSON.stringify(cb(o))\r\n\r\n groups[group] = groups[group] || []\r\n groups[group].push(o)\r\n\r\n o.index = groups[group].length\r\n\r\n if (o.pid === -1) {\r\n o.code = String(o.index)\r\n }\r\n })\r\n\r\n Object.keys(groups).forEach((group) => {\r\n groups[group].forEach((c) => {\r\n const subjects = groups[`[${c.id}]`]\r\n\r\n if (!subjects || !isArray(subjects)) {\r\n return false\r\n }\r\n\r\n subjects.forEach((o) => {\r\n o.code = c.code + '.' + o.index\r\n })\r\n })\r\n })\r\n\r\n return chapters\r\n}\r\n\r\nexport default _getChaptersWithCode\r\n","import isString from './utils/types/isString'\r\nimport isFunction from './utils/types/isFunction'\r\nimport isElement from './utils/types/isElement'\r\nimport toTree from './utils/lang/toTree'\r\n\r\nimport getChaptersByHeadings from './getChaptersByHeadings'\r\n\r\n/**\r\n *\r\n * @param {Object} [options]\r\n * @param {String|HTMLElement} [options.articleElement]\r\n * @param {String} [options.selector]\r\n * @param {Boolean} [options.showCode]\r\n * @param {Function} [options.chapterTextFilter]\r\n * @param {Boolean} [options.isTreeStructured]\r\n * @returns {Array}\r\n */\r\nconst getChapters = (options) => {\r\n const {\r\n articleElement,\r\n selector,\r\n showCode,\r\n chapterTextFilter,\r\n isTreeStructured\r\n } = options\r\n let $article = document.querySelector('#article')\r\n let $headings = []\r\n let chapters = []\r\n let filter = null\r\n\r\n if (isString(articleElement)) {\r\n $article = document.querySelector(articleElement)\r\n } else if (isElement(articleElement)) {\r\n $article = articleElement\r\n }\r\n\r\n if (!$article) {\r\n return chapters\r\n }\r\n\r\n if (isFunction(chapterTextFilter)) {\r\n filter = chapterTextFilter\r\n } else {\r\n if (chapterTextFilter === true) {\r\n filter = (text) => {\r\n return text.replace(/\\(.*?\\)/, '()')\r\n }\r\n }\r\n }\r\n\r\n $headings = [...$article.querySelectorAll(selector || 'h1,h2,h3,h4,h5,h6')]\r\n chapters = getChaptersByHeadings($headings, showCode, filter)\r\n\r\n return isTreeStructured === true ? toTree(chapters, 'id', 'pid') : chapters\r\n}\r\n\r\nexport default getChapters\r\n","const toTree = (list, nodeKey, parentKey) => {\r\n const map = {}\r\n const roots = []\r\n\r\n list.forEach((item, i) => {\r\n // initialize the map\r\n map[item[nodeKey]] = i\r\n // initialize the children\r\n item.children = []\r\n })\r\n\r\n list.forEach((item) => {\r\n const node = list[map[item[parentKey]]]\r\n\r\n if (item[parentKey] !== -1) {\r\n // if you have dangling branches check that map[node.parentId] exists\r\n node.children.push(item)\r\n } else {\r\n roots.push(item)\r\n }\r\n })\r\n\r\n return roots\r\n}\r\n\r\nexport default toTree\r\n","/**\r\n * 检测对象自身属性中是否具有指定的属性。\r\n * ========================================================================\r\n * @method hasOwn\r\n * @param {Object} obj - (必须)检测的目标对象\r\n * @param {String} prop - (必须)属性名\r\n * @returns {Boolean}\r\n */\r\nconst hasOwn = (obj, prop) => {\r\n const hasOwnProperty = Object.prototype.hasOwnProperty\r\n return obj && hasOwnProperty.call(obj, prop)\r\n}\r\n\r\nexport default hasOwn\r\n","import hasOwn from './hasOwn'\r\n\r\n/**\r\n * 扩展对象\r\n * ========================================================================\r\n * @method extend\r\n * @param {Object} origin\r\n * @param {Object} source\r\n */\r\nconst extend = (origin, source) => {\r\n const keys = Object.keys(source)\r\n\r\n keys.forEach((prop) => {\r\n if (hasOwn(source, prop)) {\r\n origin[prop] = source[prop]\r\n }\r\n })\r\n}\r\n\r\nexport default extend\r\n","/**\r\n * 存储订阅者(主题和处理器的)私有对象\r\n * ========================================================================\r\n * @type {{}}\r\n * @private\r\n */\r\nconst _subscribers = {}\r\n\r\nexport default _subscribers\r\n","import _subscribers from './_subscribers'\r\nimport hasOwn from '../lang/hasOwn'\r\n\r\n/**\r\n * 判断是否存在与给定 topic 完全匹配的订阅者信息\r\n * ========================================================================\r\n * @method _hasDirectSubscribersFor\r\n * @param {String} topic - (必须)订阅主题字符串\r\n * @returns {Boolean}\r\n */\r\nconst _hasDirectSubscribersFor = (topic) => {\r\n return hasOwn(_subscribers, topic) && _subscribers[topic].length > 0\r\n}\r\n\r\nexport default _hasDirectSubscribersFor\r\n","import _hasDirectSubscribersFor from './_hasDirectSubscribersFor'\r\nimport _hasSubscribers from './_hasSubscribers'\r\n\r\n/**\r\n * 判断是否存在包含 topic 指定的订阅者信息\r\n * ========================================================================\r\n * @method has\r\n * @param {String} topic - (必须)主题名称\r\n * @param {Boolean} [isDirect] - (可选)是否为直接的主题,默认值:true\r\n * @returns {Boolean}\r\n */\r\nconst has = (topic, isDirect = true) => {\r\n return isDirect ? _hasDirectSubscribersFor(topic) : _hasSubscribers(topic)\r\n}\r\n\r\nexport default has\r\n","import _hasDirectSubscribersFor from './_hasDirectSubscribersFor'\r\n\r\n/**\r\n * 判断是否存在包含给定 topic 相关的订阅者信息\r\n * ========================================================================\r\n * @method _hasSubscribers\r\n * @param {String} topic - (必须)订阅主题字符串\r\n * @returns {Boolean}\r\n */\r\nconst _hasSubscribers = (topic) => {\r\n let found = _hasDirectSubscribersFor(topic)\r\n let position = topic.lastIndexOf('.')\r\n\r\n while (!found && position !== -1) {\r\n topic = topic.substring(0, position)\r\n position = topic.lastIndexOf('.')\r\n found = _hasDirectSubscribersFor(topic)\r\n }\r\n\r\n return found\r\n}\r\n\r\nexport default _hasSubscribers\r\n","import isTypedArray from '../types/isTypedArray'\r\nimport _subscribers from './_subscribers'\r\nimport has from './has'\r\nimport _hasDirectSubscribersFor from './_hasDirectSubscribersFor'\r\n\r\n/**\r\n * (异步)发布订阅主题信息\r\n * ========================================================================\r\n * 主题默认是异步发布的。确保在消费者处理主题时,主题的发起者不会被阻止。\r\n * ========================================================================\r\n * @method emit\r\n * @param {String} topic - (必须)主题名称\r\n * @param {Object} [data] - (可选)数据对象\r\n * @param {Boolean} [async] - (可选) 是否异步发布\r\n */\r\nconst emit = (topic, data, async = true) => {\r\n const execute = (topic) => {\r\n if (!_hasDirectSubscribersFor(topic)) {\r\n return false\r\n }\r\n\r\n _subscribers[topic].forEach((subscriber) => {\r\n // 针对 mqtt 消息服务返回的 Uint8Array 类似的 typed arrays 格式的数据\r\n // 采用 toString() 方法转化为普通(JSON)字符串\r\n const message = isTypedArray(data) ? data.toString() : data\r\n\r\n subscriber.callback.call(subscriber.context || subscriber, message)\r\n })\r\n }\r\n const deliver = () => {\r\n let subscriber = topic\r\n let position = topic.lastIndexOf('.')\r\n\r\n while (position !== -1) {\r\n subscriber = subscriber.substring(0, position)\r\n position = subscriber.lastIndexOf('.')\r\n\r\n execute(subscriber)\r\n }\r\n\r\n // 执行 topic 对应的处理器\r\n execute(topic)\r\n // 执行特殊 topic:'*'(监听全部消息的发布)\r\n execute('*')\r\n }\r\n\r\n if (!has(topic)) {\r\n return false\r\n }\r\n\r\n if (async) {\r\n setTimeout(deliver, 10)\r\n } else {\r\n deliver()\r\n }\r\n}\r\n\r\nexport default emit\r\n","import toString from '../lang/toString'\r\n/**\r\n * 判断检测数据是否为 Typed Arrays 类型的数据\r\n * ========================================================================\r\n * @param {*} val\r\n * @returns {boolean}\r\n */\r\nconst isTypedArray = (val) => {\r\n const TYPES = [\r\n '[object Int8Array]',\r\n '[object Uint8Array]',\r\n '[object Uint8ClampedArray]',\r\n '[object Int16Array]',\r\n '[object Uint16Array]',\r\n '[object Int32Array]',\r\n '[object Uint32Array]',\r\n '[object Float32Array]',\r\n '[object Float64Array]',\r\n '[object BigInt64Array]',\r\n '[object BigUint64Array]'\r\n ]\r\n\r\n return TYPES.indexOf(toString(val)) > -1\r\n}\r\n\r\nexport default isTypedArray\r\n","/**\r\n * 生成唯一 id 字符串的函数\r\n * ========================================================================\r\n * @method guid\r\n * @param {String} [prefix] - 生成 id 的前缀字符串\r\n * @return {String} 返回一个表示唯一 id 的字符串\r\n */\r\nconst guid = (() => {\r\n let uuid = 0\r\n\r\n return (prefix) => {\r\n uuid += 1\r\n\r\n return prefix ? prefix + '-' + uuid : 'guid-' + uuid\r\n }\r\n})()\r\n\r\nexport default guid\r\n","import _subscribers from './_subscribers'\r\nimport hasOwn from '../lang/hasOwn'\r\n\r\n/**\r\n * 删除与给定 topic 相同的订阅者信息\r\n * ========================================================================\r\n * @method _removeSubscriber\r\n * @param {String} topic - (必须)订阅主题字符串\r\n * @returns {Boolean}\r\n */\r\nconst _removeSubscriber = (topic) => {\r\n if (!hasOwn(_subscribers, topic)) {\r\n return false\r\n }\r\n\r\n delete _subscribers[topic]\r\n}\r\n\r\nexport default _removeSubscriber\r\n","import has from './has'\r\nimport _removeSubscriber from './_removeSubscriber'\r\nimport _removeSubscriberByToken from './_removeSubscriberByToken'\r\n\r\n/**\r\n * 取消订阅主题\r\n * ========================================================================\r\n * @method off\r\n * @param {String} topic - (必须)订阅的主题\r\n * @param {Function|String} [token] - (可选)订阅主题的处理器函数或者唯一 Id 值\r\n */\r\nconst off = (topic, token) => {\r\n if (!has(topic)) {\r\n return false\r\n }\r\n\r\n if (token) {\r\n _removeSubscriberByToken(token)\r\n } else {\r\n _removeSubscriber(topic)\r\n }\r\n}\r\n\r\nexport default off\r\n","import _subscribers from './_subscribers'\r\nimport _removeSubscriber from './_removeSubscriber'\r\n\r\n/**\r\n * 通过订阅者 token 值删除订阅者信息\r\n * ========================================================================\r\n * @method _removeSubscriberByToken\r\n * @param {String} token - 订阅者 token 字符串\r\n * @returns {boolean}\r\n * @private\r\n */\r\nconst _removeSubscriberByToken = (token) => {\r\n const keys = Object.keys(_subscribers)\r\n let index = -1\r\n\r\n if (!token || keys.length < 1) {\r\n return false\r\n }\r\n\r\n keys.forEach((subject) => {\r\n const subscriber = _subscribers[subject]\r\n let topic\r\n\r\n subscriber.forEach((execution, j) => {\r\n if (execution.callback === token || execution.token === token) {\r\n topic = execution.topic\r\n subscriber.splice(index, j)\r\n }\r\n })\r\n\r\n /* istanbul ignore else */\r\n if (subscriber.length < 1) {\r\n _removeSubscriber(topic)\r\n }\r\n })\r\n}\r\n\r\nexport default _removeSubscriberByToken\r\n","import isString from './utils/types/isString'\r\nimport hasOwn from './utils/lang/hasOwn'\r\nimport isObject from './utils/types/isObject'\r\nimport extend from './utils/lang/extend'\r\nimport publish from './utils/observer/emit'\r\nimport subscribe from './utils/observer/on'\r\nimport unsubscribe from './utils/observer/off'\r\n\r\nclass Base {\r\n constructor(options) {\r\n this.attrs = {}\r\n\r\n if (options) {\r\n this.initialize(options)\r\n }\r\n }\r\n\r\n initialize(options) {\r\n this.attr(options).render().addListeners()\r\n return this\r\n }\r\n\r\n attr(prop, value) {\r\n const attrs = this.attrs\r\n\r\n if (isString(prop)) {\r\n // 只能扩展 attrs 中已有的属性\r\n if (value && hasOwn(attrs, prop)) {\r\n // 更新单个配置信息\r\n attrs[prop] = value\r\n return this\r\n }\r\n\r\n // 只传递 prop 参数,则返回对应的属性值\r\n return attrs[prop]\r\n } else if (isObject(prop)) {\r\n // 批量更新配置信息\r\n extend(attrs, prop)\r\n\r\n return this\r\n } else if (arguments.length === 0) {\r\n // 不传递参数,直接返回整个\r\n return attrs\r\n }\r\n\r\n return this\r\n }\r\n\r\n render() {\r\n return this\r\n }\r\n\r\n refresh() {\r\n return this\r\n }\r\n\r\n destroy() {\r\n this.removeListeners()\r\n return this\r\n }\r\n\r\n reload(options) {\r\n let attrs = this.attr()\r\n\r\n if (options) {\r\n attrs = this.attr(options)\r\n }\r\n\r\n this.destroy().initialize(attrs)\r\n\r\n return this\r\n }\r\n\r\n $emit(event, data) {\r\n publish(event, data)\r\n return this\r\n }\r\n\r\n $on(event, callback) {\r\n subscribe(event, callback, this)\r\n return this\r\n }\r\n\r\n $off(event, callback) {\r\n unsubscribe(event, callback)\r\n return this\r\n }\r\n\r\n addListeners() {\r\n return this\r\n }\r\n\r\n removeListeners() {\r\n return this\r\n }\r\n}\r\n\r\nexport default Base\r\n","import _subscribers from './_subscribers'\r\nimport isFunction from '../types/isFunction'\r\nimport guid from '../lang/guid'\r\n\r\n/**\r\n * 订阅主题,并给出处理器函数\r\n * ========================================================================\r\n * @method on\r\n * @param {String} topic - (必须)主题名称\r\n * @param {Function} handler - (必须)主题的处理器函数\r\n * @param {Object} [context] - (可选)指定 this 执行上下文\r\n * @return {String} - 唯一的 token 字符串,例如:'guid-1'。\r\n */\r\nconst on = (topic, handler, context = null) => {\r\n const token = guid()\r\n let subject = typeof topic === 'symbol' ? topic.toString() : topic\r\n\r\n if (!isFunction(handler)) {\r\n return ''\r\n }\r\n\r\n /* istanbul ignore else */\r\n if (!_subscribers[subject]) {\r\n _subscribers[subject] = []\r\n }\r\n\r\n _subscribers[subject].push({\r\n topic: subject,\r\n callback: handler,\r\n context,\r\n token\r\n })\r\n\r\n return token\r\n}\r\n\r\nexport default on\r\n","/**\r\n * timeSlice.js 时间切片功能函数\r\n * ====================================================\r\n * Created By: Yaohaixiao\r\n * Update: 2023.09.04\r\n */\r\nimport isFunction from '../types/isFunction'\r\nimport later from './later'\r\n\r\nconst queue = []\r\nlet isHandling\r\nlet done\r\n\r\n// Shim from https://developers.google.com/web/updates/2015/08/using-requestidlecallback\r\nif (typeof window.requestIdleCallback === 'undefined') {\r\n window.requestIdleCallback = function (cb) {\r\n const start = Date.now()\r\n return later(function () {\r\n cb({\r\n didTimeout: false,\r\n timeRemaining: function () {\r\n return Math.max(0, 50 - (Date.now() - start))\r\n }\r\n })\r\n }, 10)\r\n }\r\n\r\n window.cancelIdleCallback = function (id) {\r\n clearTimeout(id)\r\n }\r\n}\r\n\r\nfunction runIdle(idleDeadline) {\r\n while (idleDeadline.timeRemaining() > 0 && queue.length) {\r\n const fn = queue.shift()\r\n\r\n if (!isFunction(fn)) {\r\n return false\r\n }\r\n\r\n fn()\r\n }\r\n\r\n if (queue.length) {\r\n isHandling = requestIdleCallback(runIdle)\r\n } else {\r\n isHandling = 0\r\n\r\n if (isFunction(done)) {\r\n done()\r\n done = null\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * 时间切片功能函数:主要用于优化长时任务的性能,将长时任务分解成\r\n * 多个短时间任务\r\n * ====================================================\r\n * @param {Function} fn - 需要在空闲时执行的回调函数\r\n * @param {Function} afterComplete - queen 的\r\n * @return {(function(): (boolean|undefined))|*|boolean}\r\n */\r\nconst timeSlice = (fn, afterComplete = null) => {\r\n queue.push(fn)\r\n\r\n if (isFunction(afterComplete)) {\r\n done = afterComplete\r\n }\r\n\r\n if (!isHandling) {\r\n requestIdleCallback(runIdle)\r\n }\r\n}\r\n\r\nexport default timeSlice\r\n","/**\r\n * 获取 DOM 节点相对于窗口的 left (纵坐标)值\r\n * ========================================================================\r\n * @method offsetTop\r\n * @param {HTMLElement} el - DOM 节点\r\n * @returns {Number}\r\n */\r\nconst offsetTop = (el) => {\r\n let top = el.offsetTop\r\n\r\n if (el.offsetParent !== null) {\r\n top += offsetTop(el.offsetParent)\r\n }\r\n\r\n return top\r\n}\r\n\r\nexport default offsetTop\r\n","/**\r\n * 获取 options 节点下匹配 selector 选择器的 DOM 节点\r\n * ========================================================================\r\n * Element.matches() 方法可以用来判断 DOM 元素是否与给定的选择器匹配,事件代理判断是\r\n * 否触发绑定的代理事件回调函数,关键就是使用 Element.matches() 辨别当前事件触发的目\r\n * 标 DOM 元素是否为事件代理所期望触发的目标。\r\n * ========================================================================\r\n * @method matches\r\n * @see https://developer.mozilla.org/en-US/docs/web/api/element/matches\r\n * @param {HTMLElement} el - (必须)DOM 元素\r\n * @param {String} selector - (必须)匹配 DOM 元素的选择器\r\n * @returns {Boolean}\r\n */\r\nconst matches = (el, selector = '') => {\r\n const sel = selector.replace(/^>/i, '')\r\n\r\n if (!selector || !sel || !el) {\r\n return false\r\n }\r\n\r\n /* istanbul ignore else */\r\n if (el.matches) {\r\n return el.matches(sel)\r\n } else if (el.msMatchesSelector) {\r\n return el.msMatchesSelector(sel)\r\n } else {\r\n return false\r\n }\r\n}\r\n\r\nexport default matches\r\n","/**\r\n * 获取 DOM 元素的父节点\r\n * ========================================================================\r\n * @method getParentOrHost\r\n * @param {*|HTMLElement} el - (必须)要获取父节点的 DOM 元素\r\n * @returns {*|HTMLElement}\r\n */\r\nconst getParentOrHost = (el) => {\r\n return el.host && el !== document && el.host.nodeType\r\n ? el.host\r\n : el.parentNode\r\n}\r\n\r\nexport default getParentOrHost\r\n","export const CAPTURE_EVENTS = [\r\n 'focusout',\r\n 'blur',\r\n 'focusin',\r\n 'focus',\r\n 'load',\r\n 'unload',\r\n 'mouseenter',\r\n 'mouseleave'\r\n]\r\n","import { CAPTURE_EVENTS } from './enum'\r\nimport _delete from './_delete'\r\n\r\n/**\r\n * (私有方法)取消 type 类型的代理事件绑定\r\n * ========================================================================\r\n * 如果没有设置 handler,则销毁 this.$options 绑定的所有符合 type 事件类型的事件绑定\r\n * ========================================================================\r\n * @method _off\r\n * @param {HTMLElement} el - (必须)取消事件绑定的 DOM 元素\r\n * @param {String} type - (必须)事件类型\r\n * @param {Function} fn - (必须)事件处理器回调函数\r\n * @private\r\n */\r\nconst _off = (el, type, fn) => {\r\n const capture = CAPTURE_EVENTS.indexOf(type) > -1\r\n\r\n /* istanbul ignore else */\r\n if (fn._delegateListener) {\r\n fn = fn._delegateListener\r\n delete fn._delegateListener\r\n }\r\n\r\n // 移除缓存的 _listeners 数据\r\n _delete(el, type, fn)\r\n\r\n el.removeEventListener(type, fn, capture)\r\n}\r\n\r\nexport default _off\r\n","/**\r\n * 删除 DOM 元素缓存的 _listeners 数据\r\n * ========================================================================\r\n * @method _delete\r\n * @param {HTMLElement} el - 要删除 listener 的 DOM 元素\r\n * @param {String} type - 事件类型(名称)\r\n * @param {Function} [fn] - 事件处理器回调函数\r\n */\r\nconst _delete = function (el, type, fn) {\r\n const listeners = el._listeners\r\n let index = -1\r\n\r\n if (listeners.length < 1) {\r\n return false\r\n }\r\n\r\n // 移除缓存的 _listeners 数据\r\n listeners.forEach((listener, i) => {\r\n const handler = listener.fn\r\n\r\n if (type === listener.type) {\r\n index = i\r\n\r\n if (handler === fn) {\r\n index = i\r\n }\r\n }\r\n })\r\n\r\n /* istanbul ignore else */\r\n if (index > -1) {\r\n listeners.splice(index, 1)\r\n }\r\n}\r\n\r\nexport default _delete\r\n","import isString from '../types/isString'\r\nimport isElement from '../types/isElement'\r\nimport getListeners from './getListeners'\r\nimport _off from './_off'\r\n\r\n/**\r\n * 销毁(type 类型的)代理事件绑定\r\n * ========================================================================\r\n * 1. 设置了事件类型 type,则销毁指定类型的事件绑定,否则清除所有代理事件绑定\r\n * 2. recurse 设置为 true,递归销毁子节点全部事件绑定\r\n * ========================================================================\r\n * @method purgeElement\r\n * @param {HTMLElement|String} el - (必须)DOM 元素或者其选择器\r\n * @param {String|Boolean} type - (必须)事件类型\r\n * @param {Boolean} [recurse] - (可选)是否递归销毁子节点所有事件绑定\r\n */\r\nconst purgeElement = function (el, type, recurse = false) {\r\n const $element = isString(el) ? document.querySelector(el) : el\r\n const $children = $element.childNodes\r\n const listeners = getListeners($element, type)\r\n\r\n listeners.forEach((listener) => {\r\n _off($element, listener.type, listener.fn)\r\n })\r\n\r\n if (\r\n (recurse || type === true || arguments.length === 1) &&\r\n $element &&\r\n $children\r\n ) {\r\n $children.forEach(($child) => {\r\n if (isElement($child)) {\r\n purgeElement($child, type, recurse)\r\n }\r\n })\r\n }\r\n}\r\n\r\nexport default purgeElement\r\n","import isString from '../types/isString'\r\n\r\n/**\r\n * 获取 DOM 元素(type 事件类型)事件绑定信息\r\n * ========================================================================\r\n * 如果设置了事件类型 type, 则返回指定类型的事件绑定信息,否则返回所有事件绑定信息\r\n * ========================================================================\r\n * @methods getListeners\r\n * @param {HTMLElement} el - (必须)要获取事件绑定信息的 DOM 元素\r\n * @param {String} [type] - (可选)事件类型\r\n * @returns {Array} - 已绑定的事件信息\r\n */\r\nconst getListeners = (el, type) => {\r\n let listeners = el._listeners || []\r\n\r\n if (isString(type) && type) {\r\n listeners = listeners.filter((listener) => {\r\n return listener.type === type\r\n })\r\n }\r\n\r\n return listeners\r\n}\r\n\r\nexport default getListeners\r\n","import purgeElement from './purgeElement'\r\nimport isFunction from '../types/isFunction'\r\nimport _off from './_off'\r\n\r\n/**\r\n * 取消 type 类型的代理事件绑定\r\n * ========================================================================\r\n * 如果没有设置 handler,则销毁 this.$options 绑定的所有符合 type 事件类型的事件绑定\r\n * ========================================================================\r\n * @method off\r\n * @param {HTMLElement|Object} el - (必须)取消事件绑定的 DOM 元素\r\n * @param {String} type - (必须)事件类型\r\n * @param {Function} [fn] - (可选)事件处理器回调函数\r\n */\r\nconst off = (el, type, fn) => {\r\n // 如果不设置 fn 参数,默认清除 el 元素上绑定的所有事件处理器\r\n if (!isFunction(fn)) {\r\n purgeElement(el, type)\r\n return false\r\n }\r\n\r\n _off(el, type, fn)\r\n}\r\n\r\nexport default off\r\n","import closest from '../dom/closest'\r\nimport off from './off'\r\nimport getTarget from './getTarget'\r\n\r\nimport { CAPTURE_EVENTS } from './enum'\r\n\r\n/**\r\n * 绑定代理事件\r\n * ========================================================================\r\n * @method on\r\n * @param {HTMLElement|String|Object} el - (必须)绑定代理事件的 DOM 节点\r\n * @param {String} selector - (必须)事件代理目标 DOM 元素的选择器\r\n * @param {String|Function} type - (必须)事件类型或者事件处理器回调函数\r\n * @param {Function|Object} fn - (可选) 事件处理器回调函数或者传递给事件处理器回调函数的数据对象\r\n * @param {Object|Boolean} [data] - (可选)传递给事件处理器回调函数的数据对象或者事件处理器回调函数的 this 上下文指向,\r\n * @param {Object|Boolean} [context] - (可选)事件处理器回调函数的 this 上下文指向,或者是否仅触发一次\r\n * 当设置为 true 时,则事件处理器回调函数的 this 上下文指向为 data 对象\r\n * @param {Boolean} once - (可选)是否仅触发一次\r\n */\r\nconst on = (el, selector, type, fn, data, context, once = false) => {\r\n // CAPTURE_EVENTS 中的特殊事件,采用事件捕获模型\r\n const capture = CAPTURE_EVENTS.indexOf(type) > -1\r\n\r\n const listener = function (evt) {\r\n const target = getTarget(evt)\r\n // 通过 Element.matches 方法获得点击的目标元素\r\n const delegateTarget = closest(target, selector, el)\r\n let overrideContext = context || el\r\n\r\n evt.delegateTarget = delegateTarget\r\n\r\n // 当设置为 true 时,则事件处理器回调函数的\r\n // this 上下文指向为 data 对象\r\n if (context === true) {\r\n overrideContext = data\r\n }\r\n\r\n /* istanbul ignore else */\r\n if (delegateTarget) {\r\n // 仅触发一次\r\n /* istanbul ignore else */\r\n if (once === true) {\r\n off(el, type, listener)\r\n }\r\n\r\n fn.call(overrideContext, evt, data)\r\n }\r\n }\r\n\r\n if (!el) {\r\n return false\r\n }\r\n\r\n if (!el._listeners) {\r\n el._listeners = []\r\n }\r\n\r\n // 缓存 options 元素绑定的事件处理器\r\n el._listeners.push({\r\n el,\r\n selector,\r\n type,\r\n fn: listener,\r\n data,\r\n context,\r\n capture\r\n })\r\n\r\n // 缓存包装后的事件处理器\r\n fn._delegateListener = listener\r\n\r\n el.addEventListener(type, listener, capture)\r\n}\r\n\r\nexport default on\r\n","import resolveTextNode from '../dom/resolveTextNode'\r\n\r\n/**\r\n * 返回触发事件的 target DOM 元素\r\n * ========================================================================\r\n * @method getTarget\r\n * @param {Event} evt - Event 对象\r\n * @return {HTMLElement} - Event 对象的 target DOM 元素\r\n */\r\nconst getTarget = function (evt) {\r\n const target = evt.target\r\n\r\n return resolveTextNode(target)\r\n}\r\n\r\nexport default getTarget\r\n","/**\r\n * 在某些情况下,某些浏览器(例如:Safari 浏览器)会返回实际的目标元素内部的文本节点。\r\n * resolveTextNode() 方法则会返回实际的目标节点。\r\n * ========================================================================\r\n * @method resolveTextNode\r\n * @param {HTMLElement|Text} el - 要解析的节点\r\n * @return {*|HTMLElement} - 实际的目标 DOM 节点\r\n */\r\nconst resolveTextNode = function (el) {\r\n if (el && el.nodeType === 3) {\r\n return el.parentNode\r\n }\r\n\r\n return el\r\n}\r\n\r\nexport default resolveTextNode\r\n","import matches from './matches'\r\nimport getParentOrHost from './getParentOrHost'\r\n\r\n/**\r\n * 获取 options 元素父元素最近的包含 selector 选择器的元素\r\n * ========================================================================\r\n * @method closest\r\n * @param {HTMLElement} el - (必须)DOM 元素\r\n * @param {String} selector - (必须)DOM 元素的选择其\r\n * @param {HTMLElement} [ctx] - (必须)比对的 DOM 元素\r\n * @param {Boolean} [includeCTX] - (必须)是否包含 context DOM 元素\r\n * @returns {null|HTMLElement} - 返回最接近的 DOM 元素\r\n */\r\nconst closest = (el, selector, ctx, includeCTX) => {\r\n const context = ctx || document\r\n\r\n if (!el) {\r\n return null\r\n }\r\n\r\n do {\r\n /* istanbul ignore else */\r\n if (\r\n (selector != null &&\r\n (selector.startsWith('>')\r\n ? el.parentNode === context && matches(el, selector)\r\n : matches(el, selector))) ||\r\n (includeCTX && el === context)\r\n ) {\r\n return el\r\n }\r\n\r\n /* istanbul ignore else */\r\n if (el === context) {\r\n break\r\n }\r\n\r\n /* jshint boss:true */\r\n } while ((el = getParentOrHost(el)))\r\n}\r\n\r\nexport default closest\r\n","/**\r\n * 停止事件(阻止默认行为和阻止事件的捕获或冒泡)\r\n * ========================================================================\r\n * @method stop\r\n * @param {Event} evt - 事件对象\r\n *\r\n * @example\r\n *
\r\n * Service\r\n * Help\r\n *
\r\n *\r\n * const $nav = document.querySelector('#nav')\r\n * const $service = document.querySelector('.anchor')\r\n *\r\n * on($nav, 'click', function(evt) {\r\n * console.log('你点击了导航栏')\r\n * })\r\n *\r\n * on($anchor, 'click', function(evt) {\r\n * console.log('tagName', this.tagName)\r\n *\r\n * // 工作台输出:'a'\r\n * // 不会触发事件冒泡,输出:'你点击了导航栏'\r\n * // 也不会切换到 href 属性的页面,阻止了点击链接的默认行为\r\n * stopEvent(evt)\r\n * })\r\n */\r\nconst stop = function (evt) {\r\n evt.stopPropagation()\r\n evt.preventDefault()\r\n}\r\n\r\nexport default stop\r\n","import DEFAULTS from './defaults'\r\n\r\nconst SYMBOLS = [...DEFAULTS]\r\n\r\nexport default SYMBOLS\r\n","const DEFAULTS = [\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n ''\r\n]\r\n\r\nexport default DEFAULTS\r\n","import isString from '../types/isString'\r\nimport getSymbol from './getSymbol'\r\nimport SYMBOLS from './symbols'\r\n\r\n/**\r\n *\r\n * @method getSymbols\r\n * @param {String} [name]\r\n * @param {String} [iconSet]\r\n * @returns {string[]|*}\r\n */\r\nconst getSymbols = (name, iconSet = 'icon') => {\r\n if (isString(name)) {\r\n return getSymbol(name, iconSet)\r\n }\r\n\r\n return [...SYMBOLS]\r\n}\r\n\r\nexport default getSymbols\r\n","import SYMBOLS from './symbols'\r\n\r\n/**\r\n * @method getSymbol\r\n * @param {String} name\r\n * @param {String} [iconSet]\r\n * @returns {String}\r\n */\r\nconst getSymbol = (name, iconSet = 'icon') => {\r\n const patternName = /id=\"(.*?)\"/\r\n const patternSet = /^(\\w+)-/\r\n const symbols = SYMBOLS\r\n\r\n return symbols.find((symbol) => {\r\n const names = patternName.exec(symbol)\r\n const fullName = names[1]\r\n const sets = patternSet.exec(fullName)\r\n const setName = sets[1]\r\n const iconName =\r\n iconSet === 'icon' ? `${iconSet}-${name}` : `${iconSet}-icon-${name}`\r\n\r\n return setName === iconSet && fullName === iconName\r\n })\r\n}\r\n\r\nexport default getSymbol\r\n","import add from './add'\r\nimport getSymbols from './getSymbols'\r\n\r\n/**\r\n * 绘制 SVG 图标集\r\n * ========================================================================\r\n * @method paint\r\n * @param {String|Array} symbol\r\n */\r\nconst paint = (symbol = '') => {\r\n const $body = document.body\r\n let $icons = document.querySelector('#outline-icons')\r\n let symbols = []\r\n\r\n add(symbol)\r\n symbols = getSymbols()\r\n\r\n if ($icons) {\r\n $icons.innerHTML = symbols.join('')\r\n } else {\r\n $icons = document.createElement('div')\r\n $icons.innerHTML =\r\n ``\r\n $body.insertBefore($icons.firstChild, $body.firstChild)\r\n }\r\n}\r\n\r\nexport default paint\r\n","import isArray from '../types/isArray'\r\nimport isString from '../types/isString'\r\nimport SYMBOLS from './symbols'\r\n\r\n/**\r\n * @method add\r\n * @param {Array|String} symbols\r\n * @return {Boolean}\r\n */\r\nconst add = (symbols) => {\r\n if (!symbols) {\r\n return false\r\n }\r\n\r\n if (isArray(symbols) && symbols.length > 0) {\r\n symbols.forEach((symbol) => {\r\n /* istanbul ignore else */\r\n if (SYMBOLS.indexOf(symbol) === -1 && isString(symbol)) {\r\n SYMBOLS.push(symbol)\r\n }\r\n })\r\n } else {\r\n /* istanbul ignore else */\r\n if (isString(symbols)) {\r\n SYMBOLS.push(symbols)\r\n }\r\n }\r\n}\r\n\r\nexport default add\r\n","import isObject from './isObject'\r\nimport isElement from './isElement'\r\nimport isHTMLCollection from './isHTMLCollection'\r\nimport isFragment from './isFragment'\r\nimport isTextNode from './isTextNode'\r\n\r\nconst isDOM = (el) => {\r\n return !!(\r\n isObject(el) &&\r\n (isElement(el) || isHTMLCollection(el) || isFragment(el) || isTextNode(el))\r\n )\r\n}\r\n\r\nexport default isDOM\r\n","import toString from '../lang/toString'\r\nimport isObject from './isObject'\r\n\r\nconst isHTMLCollection = (el) => {\r\n return !!(isObject(el) && toString(el) === '[object NodeList]')\r\n}\r\n\r\nexport default isHTMLCollection\r\n","import toString from '../lang/toString'\r\nimport isObject from './isObject'\r\n\r\nconst isFragment = (fragment) => {\r\n return !!(\r\n isObject(fragment) && toString(fragment) === '[object DocumentFragment]'\r\n )\r\n}\r\n\r\nexport default isFragment\r\n","import toString from '../lang/toString'\r\nimport isObject from './isObject'\r\n\r\nconst isTextNode = (el) => {\r\n return !!(\r\n isObject(el) &&\r\n (toString(el) === '[object Text]' || (el.tagName && el.nodeType === 3))\r\n )\r\n}\r\n\r\nexport default isTextNode\r\n","import addClass from './addClass.js'\r\n\r\n/**\r\n * 给 DOM 节点设置属性/值\r\n * ========================================================================\r\n * @method setAttribute\r\n * @param {HTMLElement} el - DOM 节点\r\n * @param {String} attr - 属性名称\r\n * @param {String|Number|Boolean} value - 属性值\r\n */\r\nconst setAttribute = (el, attr, value) => {\r\n let tagName = el.tagName.toLowerCase()\r\n\r\n switch (attr) {\r\n case 'style':\r\n el.style.cssText = value\r\n break\r\n case 'value':\r\n if (tagName === 'input' || tagName === 'textarea') {\r\n el.value = value\r\n } else {\r\n el.setAttribute(attr, value)\r\n }\r\n break\r\n case 'htmlFor':\r\n el.setAttribute('for', value)\r\n break\r\n case 'className':\r\n addClass(el, value)\r\n break\r\n case 'innerHTML':\r\n el.innerHTML = value\r\n break\r\n case 'innerText':\r\n el.innerText = value\r\n break\r\n default:\r\n el.setAttribute(attr, value)\r\n break\r\n }\r\n}\r\n\r\nexport default setAttribute\r\n","import isObject from '../types/isObject'\r\nimport hasOwn from '../lang/hasOwn'\r\nimport setAttribute from './setAttribute'\r\n\r\nconst setAttributes = (el, attrs) => {\r\n if (!el || !isObject(attrs)) {\r\n return false\r\n }\r\n\r\n Object.keys(attrs).forEach((attr) => {\r\n const value = attrs[attr]\r\n if (hasOwn(attrs, attr)) {\r\n setAttribute(el, attr, value)\r\n }\r\n })\r\n}\r\n\r\nexport default setAttributes\r\n","import isObject from '../types/isObject'\r\nimport isString from '../types/isString'\r\nimport isArray from '../types/isArray'\r\nimport isDOM from '../types/isDOM'\r\nimport setAttributes from './setAttributes'\r\n\r\n/**\r\n * 创建 DOM 节点,并添加属性和子节点\r\n * ========================================================================\r\n * @method createElement\r\n * @param {String} tagName - 标签名称\r\n * @param {Object|Array|HTMLElement|DocumentFragment|String} attrs - 属性对象或者子节点\r\n * @param {Array|HTMLElement|DocumentFragment|String} [children] - 子节点数组\r\n * @returns {HTMLElement}\r\n */\r\nconst createElement = (tagName, attrs, children) => {\r\n const $fragment = document.createDocumentFragment()\r\n const $el = document.createElement(tagName)\r\n const isValidChild = (child) => {\r\n return isDOM(child) || isString(child)\r\n }\r\n const append = (child) => {\r\n let $child\r\n\r\n if (!isValidChild(child)) {\r\n return false\r\n }\r\n\r\n if (isDOM(child)) {\r\n $child = child\r\n } else if (isString(child)) {\r\n $child = document.createTextNode(child)\r\n }\r\n\r\n $fragment.appendChild($child)\r\n }\r\n\r\n if (isObject(attrs)) {\r\n setAttributes($el, attrs)\r\n } else if (isArray(attrs) && attrs.every((attr) => isValidChild(attr))) {\r\n attrs.forEach((child) => {\r\n append(child)\r\n })\r\n } else if (isDOM(attrs)) {\r\n append(attrs)\r\n } else if (isString(attrs)) {\r\n append(document.createTextNode(attrs))\r\n }\r\n\r\n if (isArray(children)) {\r\n children.forEach((child) => {\r\n append(child)\r\n })\r\n } else {\r\n append(children)\r\n }\r\n\r\n $el.appendChild($fragment)\r\n\r\n return $el\r\n}\r\n\r\nexport default createElement\r\n","import isArray from '../types/isArray'\r\nimport isString from '../types/isString'\r\nimport isSVG from '../types/isSVG'\r\nimport setAttributes from '../dom/setAttributes'\r\n\r\n/**\r\n * 创建 SVG 图标 DOM 元素\r\n * ========================================================================\r\n * @method createElement\r\n * @param {String} name\r\n * @param {Object} [options]\r\n * @param {Number|Array} [options.size]\r\n * @param {String} [options.color]\r\n * @param {String} [options.iconSet]\r\n * @param {Object} [options.attrs]\r\n * @returns {HTMLElement}\r\n */\r\nconst createElement = (name, options = {}) => {\r\n const ICON = 'outline-icon'\r\n const size = options.size || 0\r\n const color = options.color || ''\r\n const iconSet = options.iconSet || ''\r\n const width = isArray(size) ? size[0] : size\r\n const height = isArray(size) ? size[1] : size\r\n const defaultRules = size ? `width:${width}px;height:${height}px;` : ''\r\n const cssRules = color ? defaultRules + `color:${color}` : defaultRules\r\n const attrs = options.attrs || {}\r\n const $icon = document.createElement('i')\r\n let binds = ''\r\n let svg = ''\r\n let $svg\r\n\r\n if (!isString(name)) {\r\n return null\r\n }\r\n\r\n if (isSVG(name)) {\r\n svg = name\r\n } else {\r\n binds =\r\n iconSet && iconSet !== 'icon'\r\n ? `xlink:href=\"#${iconSet}-icon-${name}\"`\r\n : `xlink:href=\"#icon-${name}\"`\r\n svg = ``\r\n }\r\n\r\n $icon.innerHTML = svg\r\n\r\n if (attrs.className) {\r\n attrs.className = `${ICON} ${attrs.className}`\r\n } else {\r\n attrs.className = ICON\r\n }\r\n\r\n setAttributes($icon, attrs)\r\n\r\n $svg = $icon.querySelector('svg')\r\n setAttributes($svg, {\r\n 'aria-hidden': true,\r\n xmlns: 'http://www.w3.org/2000/svg',\r\n class: 'outline-icon__svg',\r\n width: 200,\r\n height: 200,\r\n style: cssRules\r\n })\r\n\r\n return $icon\r\n}\r\n\r\nexport default createElement\r\n","import isString from './isString'\r\n\r\nconst isSVG = (str) => {\r\n const declaration = '(?:<\\\\?xml[^>]*>\\\\s*)?'\r\n const doctype =\r\n '(?:<\\\\!doctype svg[^>]*\\\\s*(?:\\\\[?(?:\\\\s*]*>\\\\s*)*\\\\]?)*[^>]*>\\\\s*)?'\r\n const content = ']*>[^]*<\\\\/svg>\\\\s*$'\r\n const svg = `^\\\\s*${declaration}${doctype}${content}\\\\s*$`\r\n const pattern = new RegExp(svg, 'i')\r\n\r\n return isString(str) && pattern.test(str)\r\n}\r\n\r\nexport default isSVG\r\n","import createElement from './createElement'\r\n\r\n/**\r\n * 创建 SVG 图标 DOM 元素\r\n * ========================================================================\r\n * @method icon\r\n * @alias createElement\r\n * @see createElement\r\n * @param {String} name\r\n * @param {Object} [options]\r\n * @param {Number|Array} [options.size]\r\n * @param {String} [options.color]\r\n * @param {String} [options.iconSet]\r\n * @returns {HTMLElement}\r\n */\r\nconst icon = (name, options = {}) => {\r\n return createElement(name, options)\r\n}\r\n\r\nexport default icon\r\n","import trim from '../lang/trim'\r\nimport hasClass from './hasClass'\r\n\r\n/**\r\n * 移除 DOM 节点的 className 样式\r\n * ========================================================================\r\n * @method removeClass\r\n * @param {HTMLElement} el - DOM 节点\r\n * @param {String} className - 样式名称\r\n * @returns {Boolean}\r\n */\r\nconst removeClass = (el, className) => {\r\n let allClass = el.className\r\n let classList\r\n\r\n if (!allClass || !hasClass(el, className)) {\r\n return false\r\n }\r\n\r\n classList = el.classList\r\n\r\n if (classList?.remove) {\r\n classList.remove(className)\r\n } else {\r\n allClass = trim(allClass.replace(className, ''))\r\n el.className = allClass\r\n }\r\n}\r\n\r\nexport default removeClass\r\n","import removeClass from './utils/dom/removeClass'\r\nimport isEmpty from './utils/types/isEmpty'\r\nimport trim from './utils/lang/trim'\r\n\r\nconst _removeHeading = ($heading, hasAnchor = true, isAtStart = true) => {\r\n const CLS_HEADING = 'outline-heading'\r\n const text = $heading.innerHTML\r\n const pattern = /^\\d+(\\.?\\d+)*\\s?/gi\r\n let $anchor\r\n\r\n $heading.innerHTML = text.replace(pattern, '')\r\n $heading.removeAttribute('id')\r\n $heading.removeAttribute('data-id')\r\n\r\n removeClass($heading, CLS_HEADING)\r\n\r\n if (!hasAnchor) {\r\n return false\r\n }\r\n\r\n $anchor = $heading.querySelector(`.${CLS_HEADING}__anchor`)\r\n\r\n if (isAtStart) {\r\n removeClass($heading, `${CLS_HEADING}_start`)\r\n }\r\n\r\n if (isEmpty(trim($heading.className))) {\r\n $heading.removeAttribute('class')\r\n }\r\n\r\n // 存在锚点才移除\r\n if ($anchor) {\r\n $heading.removeChild($anchor)\r\n }\r\n}\r\n\r\nexport default _removeHeading\r\n","import isString from './isString'\r\n/**\r\n * 检测数据是否为空字符串\r\n * ========================================================================\r\n * @method isEmpty\r\n * @param {String} str\r\n * @returns {boolean}\r\n */\r\nconst isEmpty = (str) => {\r\n return isString(str) && str === ''\r\n}\r\n\r\nexport default isEmpty\r\n","import isString from './utils/types/isString'\r\nimport isFunction from './utils/types/isFunction'\r\nimport isElement from './utils/types/isElement'\r\nimport cloneDeep from './utils/lang/cloneDeep'\r\nimport timeSlice from './utils/lang/timeSlice'\r\nimport later from './utils/lang/later'\r\nimport scrollTo from './utils/dom/scrollTo'\r\nimport _getScrollElement from './utils/dom/_getScrollElement'\r\nimport offsetTop from './utils/dom/offsetTop'\r\nimport on from './utils/event/on'\r\nimport off from './utils/event/off'\r\nimport stop from './utils/event/stop'\r\nimport paint from './utils/icons/paint'\r\n\r\nimport _updateHeading from './_updateHeading'\r\nimport _removeHeading from './_removeHeading'\r\nimport getChapters from './getChapters'\r\n\r\nimport Base from './base'\r\n\r\nclass Anchors extends Base {\r\n constructor(options) {\r\n super()\r\n\r\n this._default()\r\n\r\n if (options) {\r\n this.initialize(options)\r\n }\r\n }\r\n\r\n _default() {\r\n this.attrs = cloneDeep(Anchors.DEFAULTS)\r\n\r\n this.$articleElement = null\r\n this.$scrollElement = null\r\n this.$headings = []\r\n\r\n return this\r\n }\r\n\r\n initialize(options) {\r\n let created\r\n let scrollElement\r\n let $articleElement\r\n let articleElement\r\n\r\n this.attr(options)\r\n\r\n articleElement = this.attr('articleElement')\r\n scrollElement = this.attr('scrollElement')\r\n created = this.attr('created')\r\n\r\n if (isString(articleElement)) {\r\n $articleElement = document.querySelector(articleElement)\r\n } else if (isElement(articleElement)) {\r\n $articleElement = articleElement\r\n }\r\n\r\n if (!$articleElement) {\r\n return this\r\n }\r\n\r\n this.$articleElement = $articleElement\r\n this.$scrollElement = _getScrollElement(scrollElement)\r\n this.$headings = this.getHeadings()\r\n\r\n if (this.$headings.length < 1) {\r\n return this\r\n }\r\n\r\n if (isFunction(created)) {\r\n created.call(this)\r\n }\r\n\r\n this.render().addListeners()\r\n\r\n return this\r\n }\r\n\r\n getHeadings() {\r\n const $articleElement = this.$articleElement\r\n const selector = this.attr('selector')\r\n\r\n return [...$articleElement.querySelectorAll(selector)]\r\n }\r\n\r\n count() {\r\n return this.getHeadings().length\r\n }\r\n\r\n render() {\r\n const articleElement = this.attr('articleElement')\r\n const selector = this.attr('selector')\r\n const showCode = this.attr('showCode')\r\n const chapterTextFilter = this.attr('chapterTextFilter')\r\n const mounted = this.attr('mounted')\r\n const chapters = getChapters({\r\n articleElement,\r\n selector,\r\n showCode,\r\n chapterTextFilter\r\n })\r\n\r\n paint()\r\n\r\n this._paint(chapters)\r\n\r\n if (isFunction(mounted)) {\r\n mounted.call(this)\r\n }\r\n\r\n return this\r\n }\r\n\r\n erase() {\r\n this._remove()\r\n\r\n return this\r\n }\r\n\r\n _paint(chapters) {\r\n const LIMIT = 400\r\n const hasAnchor = this.attr('hasAnchor')\r\n const isAtStart = this.attr('isAtStart')\r\n const showCode = this.attr('showCode')\r\n const anchorURL = this.attr('anchorURL')\r\n const anchorLinkFilter = this.attr('anchorLinkFilter')\r\n const count = this.count()\r\n const $headings = [...this.$headings]\r\n const update = (headings, group) => {\r\n headings.forEach(($heading, i) => {\r\n const id = i + group * LIMIT\r\n const chapterCode = chapters[id].code\r\n _updateHeading($heading, id, {\r\n hasAnchor,\r\n isAtStart,\r\n showCode,\r\n chapterCode,\r\n anchorURL,\r\n anchorLinkFilter\r\n })\r\n })\r\n }\r\n let groupIndex = -1\r\n\r\n // 针对超长的文章,进行 timeSlice 处理\r\n if (count > LIMIT) {\r\n groupIndex += 1\r\n // 同步绘制 Limit 以内的标题链接(可以确保 50ms 完成绘制)\r\n update($headings.splice(0, LIMIT), 0)\r\n // 采用 timeSlice 处理机制绘制剩余的标题\r\n while ($headings.length > 0) {\r\n const once = $headings.splice(0, LIMIT)\r\n timeSlice(\r\n () => {\r\n update(once, (groupIndex += 1))\r\n },\r\n () => {\r\n this.$emit('anchors:all:paint')\r\n }\r\n )\r\n }\r\n } else {\r\n update($headings, 0)\r\n }\r\n\r\n return this\r\n }\r\n\r\n _remove() {\r\n const hasAnchor = this.attr('hasAnchor')\r\n const isAtStart = this.attr('isAtStart')\r\n const $headings = this.$headings\r\n\r\n $headings.forEach(($heading) => {\r\n _removeHeading($heading, hasAnchor, isAtStart)\r\n })\r\n\r\n return this\r\n }\r\n\r\n refresh(chapters) {\r\n const articleElement = this.attr('articleElement')\r\n const selector = this.attr('selector')\r\n const showCode = this.attr('showCode')\r\n const chapterTextFilter = this.attr('chapterTextFilter')\r\n\r\n this.$headings = this.getHeadings()\r\n\r\n this.erase()._paint(\r\n chapters ||\r\n getChapters({\r\n articleElement,\r\n selector,\r\n showCode,\r\n chapterTextFilter\r\n })\r\n )\r\n\r\n return this\r\n }\r\n\r\n scrollTo(top, after) {\r\n const el = this.$scrollElement\r\n\r\n scrollTo(el, top, after)\r\n\r\n return this\r\n }\r\n\r\n destroy() {\r\n const beforeDestroy = this.attr('beforeDestroy')\r\n const afterDestroy = this.attr('afterDestroy')\r\n\r\n if (isFunction(beforeDestroy)) {\r\n beforeDestroy.call(this)\r\n }\r\n\r\n this.removeListeners()._remove()._default()\r\n\r\n if (isFunction(afterDestroy)) {\r\n afterDestroy.call(this)\r\n }\r\n\r\n return this\r\n }\r\n\r\n onAnchorTrigger(evt) {\r\n const anchorURL = this.attr('anchorURL')\r\n const afterScroll = this.attr('afterScroll')\r\n const stickyHeight = this.attr('stickyHeight')\r\n const $anchor = evt.delegateTarget\r\n const $heading = $anchor.parentNode\r\n const top = offsetTop($heading) - (stickyHeight + 10)\r\n const $scrollElement = this.$scrollElement\r\n const min = 0\r\n const max = $scrollElement.scrollHeight - $scrollElement.clientHeight\r\n const after = () => {\r\n if (isFunction(afterScroll)) {\r\n afterScroll.call(this, 'anchor')\r\n }\r\n\r\n later(() => {\r\n this.$emit('toolbar:update', {\r\n top,\r\n min,\r\n max\r\n })\r\n })\r\n }\r\n\r\n this.scrollTo(top, after)\r\n\r\n if (!anchorURL) {\r\n stop(evt)\r\n }\r\n\r\n return this\r\n }\r\n\r\n onRefresh(chapters) {\r\n this.refresh(chapters)\r\n\r\n return this\r\n }\r\n\r\n addListeners() {\r\n const $articleElement = this.$articleElement\r\n\r\n if (this.count() < 1) {\r\n return this\r\n }\r\n\r\n on(\r\n $articleElement,\r\n '.outline-heading__anchor',\r\n 'click',\r\n this.onAnchorTrigger,\r\n this,\r\n true\r\n )\r\n\r\n this.$on('anchors:refresh', this.onRefresh)\r\n\r\n return this\r\n }\r\n\r\n removeListeners() {\r\n const $articleElement = this.$articleElement\r\n\r\n if (this.count() < 1) {\r\n return this\r\n }\r\n\r\n off($articleElement, 'click', this.onAnchorTrigger)\r\n this.$off('anchors:refresh', this.onRefresh)\r\n\r\n return this\r\n }\r\n}\r\n\r\nAnchors.DEFAULTS = (() => {\r\n const OPTIONS = {\r\n scrollElement: 'html,body',\r\n articleElement: '#article',\r\n selector: 'h1,h2,h3,h4,h5,h6',\r\n stickyHeight: 0,\r\n anchorURL: '',\r\n hasAnchor: true,\r\n isAtStart: true,\r\n showCode: false,\r\n created: null,\r\n mounted: null,\r\n afterScroll: null,\r\n beforeDestroy: null,\r\n afterDestroy: null,\r\n chapterTextFilter: null,\r\n anchorLinkFilter: null\r\n }\r\n\r\n return cloneDeep(OPTIONS)\r\n})()\r\n\r\nexport default Anchors\r\n","import isFunction from './utils/types/isFunction'\r\nimport trim from './utils/lang/trim'\r\nimport createElement from './utils/dom/createElement'\r\nimport setAttributes from './utils/dom/setAttributes'\r\n\r\nimport icon from './utils/icons/icon'\r\n\r\nconst _updateHeading = ($heading, i, options) => {\r\n const CLS_HEADING = 'outline-heading'\r\n const hasAnchor = options.hasAnchor || true\r\n const isAtStart = options.isAtStart || true\r\n const showCode = options.showCode || false\r\n const chapterCode = options.chapterCode || ''\r\n const anchorURL = options.anchorURL || ''\r\n const anchorLinkFilter = options.anchorLinkFilter || null\r\n const headingId = `heading-${i}`\r\n const attrs = {\r\n id: headingId,\r\n className: isAtStart ? `${CLS_HEADING} ${CLS_HEADING}_start` : CLS_HEADING,\r\n 'data-id': i\r\n }\r\n const text = trim($heading.innerHTML)\r\n let url\r\n let $anchor\r\n let $icon\r\n\r\n if (showCode) {\r\n attrs.innerHTML = chapterCode + ' ' + text\r\n attrs['data-code'] = chapterCode\r\n }\r\n setAttributes($heading, attrs)\r\n\r\n if (!hasAnchor) {\r\n return false\r\n }\r\n\r\n if (anchorURL) {\r\n url = anchorURL\r\n } else {\r\n if (isFunction(anchorLinkFilter)) {\r\n url = anchorLinkFilter($heading.tagName.toLowerCase(), text, i)\r\n } else {\r\n url = `#${headingId}`\r\n }\r\n }\r\n\r\n $icon = icon('hash', { iconSet: 'outline' })\r\n $anchor = createElement(\r\n 'a',\r\n {\r\n id: `anchor-${i}`,\r\n className: `${CLS_HEADING}__anchor anchor-${i}`,\r\n href: url,\r\n target: anchorURL ? '_blank' : 'self',\r\n 'data-id': i\r\n },\r\n $icon\r\n )\r\n $heading.appendChild($anchor)\r\n}\r\n\r\nexport default _updateHeading\r\n","// HTML 合法的标签\r\nconst TAGS = [\r\n 'a',\r\n 'abbr',\r\n 'address',\r\n 'area',\r\n 'article',\r\n 'aside',\r\n 'audio',\r\n 'b',\r\n 'base',\r\n 'bdi',\r\n 'bdo',\r\n 'blockquote',\r\n 'body',\r\n 'br',\r\n 'button',\r\n 'canvas',\r\n 'caption',\r\n 'cite',\r\n 'code',\r\n 'col',\r\n 'colgroup',\r\n 'data',\r\n 'datalist',\r\n 'dd',\r\n 'del',\r\n 'details',\r\n 'dfn',\r\n 'dialog',\r\n 'div',\r\n 'dl',\r\n 'dt',\r\n 'em',\r\n 'embed',\r\n 'fieldset',\r\n 'figcaption',\r\n 'figure',\r\n 'footer',\r\n 'form',\r\n 'h1',\r\n 'h2',\r\n 'h3',\r\n 'h4',\r\n 'h5',\r\n 'h6',\r\n 'head',\r\n 'header',\r\n 'hgroup',\r\n 'hr',\r\n 'html',\r\n 'i',\r\n 'iframe',\r\n 'img',\r\n 'input',\r\n 'ins',\r\n 'kbd',\r\n 'label',\r\n 'legend',\r\n 'li',\r\n 'link',\r\n 'main',\r\n 'map',\r\n 'mark',\r\n 'math',\r\n 'menu',\r\n 'menuitem',\r\n 'meta',\r\n 'meter',\r\n 'nav',\r\n 'noscript',\r\n 'object',\r\n 'ol',\r\n 'optgroup',\r\n 'option',\r\n 'output',\r\n 'p',\r\n 'param',\r\n 'picture',\r\n 'pre',\r\n 'progress',\r\n 'q',\r\n 'rb',\r\n 'rp',\r\n 'rt',\r\n 'rtc',\r\n 'ruby',\r\n 's',\r\n 'samp',\r\n 'script',\r\n 'search',\r\n 'section',\r\n 'select',\r\n 'slot',\r\n 'small',\r\n 'source',\r\n 'span',\r\n 'strong',\r\n 'style',\r\n 'sub',\r\n 'summary',\r\n 'sup',\r\n 'svg',\r\n 'table',\r\n 'tbody',\r\n 'td',\r\n 'template',\r\n 'textarea',\r\n 'tfoot',\r\n 'th',\r\n 'thead',\r\n 'time',\r\n 'title',\r\n 'tr',\r\n 'track',\r\n 'u',\r\n 'ul',\r\n 'var',\r\n 'video',\r\n 'wbr'\r\n]\r\n\r\nexport default TAGS\r\n","import isString from './isString'\r\nimport trim from '../lang/trim'\r\nimport TAGS from './tags'\r\n\r\n/**\r\n * 检测测试数据是否为合法的 HTML 代码\r\n * ========================================================================\r\n * @method isHTML\r\n * @category Lang\r\n * @see https://github.com/sindresorhus/html-tags\r\n * @see https://github.com/sindresorhus/is-html\r\n * @param {String} str - 要检测的数据\r\n * @returns {Boolean} 'val' 为合法的 HTML 代码,返回 true,否则返回 false\r\n */\r\nconst isHTML = (str) => {\r\n let html\r\n let basic\r\n let full\r\n\r\n if (!isString(str)) {\r\n return false\r\n }\r\n\r\n // 为了提高性能,我们将其限制在合理的长度内。\r\n html = trim(str).slice(0, 1000)\r\n basic = /\\s*|]*>|]*>|]+>/i\r\n full = new RegExp(TAGS.map((tag) => `<${tag}\\\\b[^>]*>`).join('|'), 'i')\r\n\r\n return basic.test(html) || full.test(html)\r\n}\r\n\r\nexport default isHTML\r\n","/**\r\n * 移除字符串中的 JavaScript 代码\r\n * ====================================================\r\n * @param {String} str\r\n * @returns {String}\r\n */\r\nconst stripScripts = (str) => {\r\n return str.replace(/]*>.*?<\\/script>/gi, '')\r\n}\r\n\r\nexport default stripScripts\r\n","const setProperty = (prop, value) => {\r\n const documentElement = document.documentElement\r\n documentElement.style.setProperty(prop, value)\r\n}\r\n\r\nexport default setProperty\r\n","import setProperty from './utils/dom/setProperty'\r\n\r\nlet index = 2000\r\n\r\nconst zIndex = (idx) => {\r\n if (idx) {\r\n index = idx\r\n } else {\r\n index += 1\r\n }\r\n\r\n setProperty('--outline-zIndex', `${index}`)\r\n\r\n return index\r\n}\r\n\r\nexport default zIndex\r\n","import Base from './base'\r\n\r\nimport later from './utils/lang/later'\r\nimport cloneDeep from './utils/lang/cloneDeep'\r\nimport isFunction from './utils/types/isFunction'\r\nimport isDOM from './utils/types/isDOM'\r\nimport isHTML from './utils/types/isHTML'\r\nimport addClass from './utils/dom/addClass'\r\nimport removeClass from './utils/dom/removeClass'\r\nimport html from './utils/dom/html'\r\nimport createElement from './utils/dom/createElement'\r\nimport on from './utils/event/on'\r\nimport off from './utils/event/off'\r\n\r\nimport paint from './utils/icons/paint'\r\nimport icon from './utils/icons/icon'\r\nimport zIndex from './zIndex'\r\n\r\nclass Drawer extends Base {\r\n constructor(options) {\r\n super()\r\n\r\n this._default()\r\n\r\n this.zIndex = 0\r\n\r\n if (options) {\r\n this.initialize(options)\r\n }\r\n }\r\n\r\n _default() {\r\n this.attrs = cloneDeep(Drawer.DEFAULTS)\r\n this.title = ''\r\n this.closed = false\r\n\r\n this.$el = null\r\n this.$modal = null\r\n this.$header = null\r\n this.$title = null\r\n this.$close = null\r\n this.$main = null\r\n this.$footer = null\r\n this.$overlay = null\r\n\r\n return this\r\n }\r\n\r\n initialize(options) {\r\n let created\r\n\r\n this.attr(options)\r\n\r\n this.title = this.attr('title')\r\n created = this.attr('created')\r\n\r\n if (isFunction(created)) {\r\n created.call(this)\r\n }\r\n\r\n this.render().addListeners()\r\n return this\r\n }\r\n\r\n setTitle(title) {\r\n this.attr('title', title)\r\n this.title = title\r\n this.$title.innerHTML = title\r\n\r\n return this\r\n }\r\n\r\n isClosed() {\r\n return this.closed\r\n }\r\n\r\n render() {\r\n const mounted = this.attr('mounted')\r\n const size = this.attr('size')\r\n const placement = this.attr('placement')\r\n const hasClose = this.attr('hasClose')\r\n const hasOverlay = this.attr('hasOverlay')\r\n const hasOffset = this.attr('hasOffset')\r\n const hasPadding = this.attr('hasPadding')\r\n const autoHeight = this.attr('autoHeight')\r\n const overflow = this.attr('overflow')\r\n const customClass = this.attr('customClass')\r\n let mainClassName = 'outline-drawer__main'\r\n let $el\r\n let $modal\r\n let $header\r\n let $title\r\n let $close\r\n let $main\r\n let $footer\r\n let $overlay\r\n\r\n paint()\r\n this.zIndex = zIndex()\r\n\r\n $title = createElement(\r\n 'h2',\r\n {\r\n className: 'outline-drawer__title'\r\n },\r\n this.title\r\n )\r\n this.$title = $title\r\n\r\n if (hasClose) {\r\n $close = createElement(\r\n 'div',\r\n {\r\n className: 'outline-drawer__close'\r\n },\r\n icon('close', { iconSet: 'outline', size: 20 })\r\n )\r\n this.$close = $close\r\n }\r\n\r\n $header = createElement(\r\n 'header',\r\n {\r\n className: 'outline-drawer__header'\r\n },\r\n [$title, $close]\r\n )\r\n this.$header = $header\r\n\r\n if (overflow === 'hidden') {\r\n mainClassName += ' overflow-hidden'\r\n }\r\n\r\n $main = createElement('div', {\r\n className: mainClassName\r\n })\r\n this.$main = $main\r\n\r\n if (!hasPadding) {\r\n addClass($main, 'outline-drawer_full')\r\n }\r\n\r\n $footer = createElement('footer', {\r\n className: 'outline-drawer__footer'\r\n })\r\n this.$footer = $footer\r\n\r\n $modal = createElement(\r\n 'div',\r\n {\r\n className: `outline-drawer__modal outline-drawer_${placement} outline-drawer_${size} outline-drawer_closed`\r\n },\r\n [$header, $main, $footer]\r\n )\r\n this.$modal = $modal\r\n\r\n if (hasOffset) {\r\n addClass($modal, 'outline-drawer_offset')\r\n }\r\n\r\n if (autoHeight) {\r\n addClass($modal, 'outline-drawer_auto')\r\n }\r\n\r\n if (customClass) {\r\n addClass($modal, customClass)\r\n }\r\n\r\n if (hasOverlay) {\r\n $overlay = createElement('div', {\r\n className: 'outline-drawer__overlay'\r\n })\r\n this.$overlay = $overlay\r\n }\r\n\r\n $el = createElement(\r\n 'div',\r\n {\r\n className: `outline-drawer`\r\n },\r\n [$modal, $overlay]\r\n )\r\n this.$el = $el\r\n document.body.appendChild($el)\r\n\r\n if (isFunction(mounted)) {\r\n mounted.call(this)\r\n }\r\n\r\n return this\r\n }\r\n\r\n erase() {\r\n this.$main.innerHTML = ''\r\n return this\r\n }\r\n\r\n _paint(content) {\r\n let $content = null\r\n\r\n if (isFunction(content)) {\r\n $content = content()\r\n } else if (isDOM(content)) {\r\n $content = content\r\n } else if (isHTML(content)) {\r\n $content = html(content)\r\n }\r\n\r\n if ($content) {\r\n this.$main.appendChild($content)\r\n }\r\n\r\n return this\r\n }\r\n\r\n _remove() {\r\n document.body.removeChild(this.$el)\r\n return this\r\n }\r\n\r\n refresh(content) {\r\n this.erase()._paint(content)\r\n return this\r\n }\r\n\r\n open() {\r\n const opened = this.attr('afterOpened')\r\n const $modal = this.$modal\r\n\r\n addClass(this.$el, 'outline-drawer_opened')\r\n removeClass($modal, 'outline-drawer_closed')\r\n addClass($modal, 'outline-drawer_opened')\r\n\r\n later(() => {\r\n this.closed = false\r\n\r\n if (isFunction(opened)) {\r\n opened.call(this)\r\n }\r\n })\r\n\r\n return this\r\n }\r\n\r\n close() {\r\n const closed = this.attr('afterClosed')\r\n const $modal = this.$modal\r\n\r\n removeClass($modal, 'outline-drawer_opened')\r\n addClass($modal, 'outline-drawer_closed')\r\n\r\n later(() => {\r\n removeClass(this.$el, 'outline-drawer_opened')\r\n this.closed = true\r\n\r\n if (isFunction(closed)) {\r\n closed.call(this)\r\n }\r\n })\r\n\r\n return this\r\n }\r\n\r\n toggle() {\r\n const afterToggle = this.attr('afterToggle')\r\n const closed = this.isClosed()\r\n\r\n if (closed) {\r\n this.open()\r\n } else {\r\n this.close()\r\n }\r\n\r\n if (isFunction(afterToggle)) {\r\n later(() => {\r\n afterToggle.call(this, closed)\r\n })\r\n }\r\n\r\n return this\r\n }\r\n\r\n destroy() {\r\n const afterDestroy = this.attr('afterDestroy')\r\n const beforeDestroy = this.attr('beforeDestroy')\r\n let index = this.zIndex\r\n\r\n if (isFunction(beforeDestroy)) {\r\n beforeDestroy.call(this)\r\n }\r\n\r\n this.removeListeners()._remove()._default()\r\n\r\n index -= 1\r\n zIndex(index)\r\n this.zIndex = 0\r\n\r\n if (isFunction(afterDestroy)) {\r\n afterDestroy.call(this)\r\n }\r\n\r\n return this\r\n }\r\n\r\n onClose() {\r\n this.close()\r\n return this\r\n }\r\n\r\n addListeners() {\r\n const hasClose = this.attr('hasClose')\r\n const hasOverlay = this.attr('hasOverlay')\r\n const closeOnClickModal = this.attr('closeOnClickModal')\r\n const $el = this.$el\r\n\r\n if (hasClose) {\r\n on($el, '.outline-drawer__close', 'click', this.onClose, this, true)\r\n }\r\n\r\n if (hasOverlay && closeOnClickModal) {\r\n on($el, '.outline-drawer__overlay', 'click', this.onClose, this, true)\r\n }\r\n\r\n return this\r\n }\r\n\r\n removeListeners() {\r\n const hasClose = this.attr('hasClose')\r\n const hasOverlay = this.attr('hasOverlay')\r\n const $el = this.$el\r\n\r\n if (!hasClose && !hasOverlay) {\r\n return this\r\n }\r\n\r\n off($el, 'click', this.onClose)\r\n\r\n return this\r\n }\r\n}\r\n\r\nDrawer.DEFAULTS = (() => {\r\n const OPTIONS = {\r\n placement: 'rtl',\r\n title: '标题',\r\n size: 'regular',\r\n hasClose: true,\r\n hasOverlay: true,\r\n hasOffset: false,\r\n hasPadding: true,\r\n autoHeight: true,\r\n closeOnClickModal: true,\r\n overflow: 'auto',\r\n created: null,\r\n mounted: null,\r\n afterClosed: null,\r\n afterOpened: null,\r\n afterScroll: null,\r\n beforeDestroy: null,\r\n afterDestroy: null,\r\n afterToggle: null\r\n }\r\n\r\n return cloneDeep(OPTIONS)\r\n})()\r\n\r\nexport default Drawer\r\n","import isHTML from '../types/isHTML'\r\nimport isString from '../types/isString'\r\nimport isElement from '../types/isElement'\r\nimport stripScripts from '../lang/stripScripts'\r\nimport createElement from './createElement'\r\n\r\n/**\r\n * 获取或者设置 DOM 元素的 innerHTML 属性值,或者通过 HTML 字符串,创建 DOM 元素\r\n * ========================================================================\r\n * @method html\r\n * @param {HTMLElement|String} el\r\n * @param {String} [strHTML]\r\n * @return {DocumentFragment|null|*}\r\n */\r\nconst html = (el, strHTML) => {\r\n const $fragment = document.createDocumentFragment()\r\n\r\n if (!el || (!isHTML(el) && !isString(el) && !isElement(el))) {\r\n return null\r\n }\r\n\r\n if (isHTML(el)) {\r\n const template = createElement('div')\r\n let children = []\r\n\r\n template.innerHTML = stripScripts(el)\r\n children = [...template.childNodes]\r\n children.forEach((child) => {\r\n $fragment.appendChild(child)\r\n })\r\n\r\n return $fragment\r\n } else if (isString(strHTML)) {\r\n el.innerHTML = stripScripts(strHTML)\r\n } else {\r\n return el.innerHTML\r\n }\r\n}\r\n\r\nexport default html\r\n","import isFunction from '../types/isFunction'\r\nimport off from './off'\r\n\r\nimport { CAPTURE_EVENTS } from './enum'\r\n\r\n/**\r\n * 绑定事件\r\n * ========================================================================\r\n * @method at\r\n * @param {HTMLElement|String|Object} el - (必须)绑定代理事件的 DOM 节点\r\n * @param {String|Function} type - (必须)事件类型或者事件处理器回调函数\r\n * @param {Function|Object} fn - (必须) 事件处理器回调函数或者传递给事件处理器回调函数的数据对象\r\n * @param {Object|Boolean} [data] - (可选)传递给事件处理器回调函数的数据对象或者事件处理器回调函数的 this 上下文指向,\r\n * @param {Object|Boolean} [context] - (可选)事件处理器回调函数的 this 上下文指向,或者是否仅触发一次\r\n * 当设置为 true 时,则事件处理器回调函数的 this 上下文指向为 data 对象\r\n * @param {Boolean} once - (可选)是否仅触发一次\r\n */\r\nconst at = (el, type, fn, data, context, once = false) => {\r\n // CAPTURE_EVENTS 中的特殊事件,采用事件捕获模型\r\n const capture = CAPTURE_EVENTS.indexOf(type) > -1\r\n const listener = function (evt) {\r\n let overrideContext = context || el\r\n\r\n // 当设置为 true 时,则事件处理器回调函数的\r\n // this 上下文指向为 data 对象\r\n if (context === true) {\r\n overrideContext = data\r\n }\r\n\r\n // 仅触发一次\r\n /* istanbul ignore else */\r\n if (once === true) {\r\n off(el, type, listener)\r\n }\r\n\r\n fn.call(overrideContext, evt, data)\r\n }\r\n\r\n if (!isFunction(fn)) {\r\n return false\r\n }\r\n\r\n if (!el._listeners) {\r\n el._listeners = []\r\n }\r\n\r\n // 缓存 options 元素绑定的事件处理器\r\n el._listeners.push({\r\n el,\r\n type,\r\n fn: listener,\r\n data,\r\n context,\r\n capture\r\n })\r\n\r\n // 缓存包装后的事件处理器\r\n fn._delegateListener = listener\r\n\r\n el.addEventListener(type, listener, capture)\r\n}\r\n\r\nexport default at\r\n","/**\r\n * 获取HTML元素的某个CSS样式值\r\n * ====================================================\r\n * @param el\r\n * @param ruleName\r\n * @returns {*}\r\n */\r\nconst getStyle = (el, ruleName) => {\r\n return getComputedStyle(el)[ruleName]\r\n}\r\n\r\nexport default getStyle\r\n","import isString from './utils/types/isString'\r\nimport isFunction from './utils/types/isFunction'\r\nimport isElement from './utils/types/isElement'\r\nimport later from './utils/lang/later'\r\nimport at from './utils/event/at'\r\nimport on from './utils/event/on'\r\nimport off from './utils/event/off'\r\nimport stop from './utils/event/stop'\r\nimport createElement from './utils/dom/createElement'\r\nimport scrollTo from './utils/dom/scrollTo'\r\nimport addClass from './utils/dom/addClass'\r\nimport intersection from './utils/dom/intersection'\r\nimport removeClass from './utils/dom/removeClass'\r\nimport offsetTop from './utils/dom/offsetTop'\r\nimport getStyle from './utils/dom/getStyle'\r\nimport setProperty from './utils/dom/setProperty'\r\nimport _getScrollElement from './utils/dom/_getScrollElement'\r\nimport cloneDeep from './utils/lang/cloneDeep'\r\n\r\nimport _paintChapters from './_paintChapters'\r\nimport inBounding from './utils/dom/inBounding'\r\n\r\nimport Base from './base'\r\n\r\nconst HIDDEN = 'outline-navigator_hidden'\r\nconst EXPANDED = 'outline-navigator_expanded'\r\nconst FOLDED = 'outline-navigator_folded'\r\n\r\nclass Navigator extends Base {\r\n constructor(options) {\r\n super()\r\n\r\n this._default()\r\n\r\n this.scrollTimer = null\r\n this.resizeTimer = null\r\n this.observerTimer = null\r\n this.Observer = null\r\n\r\n if (options) {\r\n this.initialize(options)\r\n }\r\n }\r\n\r\n _default() {\r\n this.attrs = cloneDeep(Navigator.DEFAULTS)\r\n\r\n this.$el = null\r\n this.$title = null\r\n this.$main = null\r\n this.$list = null\r\n this.$placeholder = null\r\n this.$parentElement = null\r\n this.$scrollElement = null\r\n this.$active = null\r\n\r\n this.chapters = []\r\n this.active = 0\r\n this.offsetWidth = 0\r\n this.offsetTop = 0\r\n this.playing = false\r\n this.closed = false\r\n\r\n return this\r\n }\r\n\r\n initialize(options) {\r\n let created\r\n let parentElement\r\n let scrollElement\r\n let $parent\r\n\r\n this.attr(options)\r\n\r\n created = this.attr('created')\r\n parentElement = this.attr('parentElement')\r\n scrollElement = this.attr('scrollElement')\r\n\r\n if (isString(parentElement)) {\r\n $parent = document.querySelector(parentElement)\r\n } else if (isElement(parentElement)) {\r\n $parent = parentElement\r\n }\r\n this.$parentElement = $parent\r\n this.$scrollElement = _getScrollElement(scrollElement)\r\n\r\n this.chapters = this.attr('chapters')\r\n this.closed = this.attr('closed')\r\n this.active = this.attr('active')\r\n\r\n if (isFunction(created)) {\r\n created.call(this)\r\n }\r\n\r\n if (this.chapters.length < 1) {\r\n return this\r\n }\r\n\r\n this.render().addListeners()\r\n\r\n this.$active = document.querySelector(`#chapter-${this.active}`)\r\n\r\n return this\r\n }\r\n\r\n isClosed() {\r\n return this.closed\r\n }\r\n\r\n isSticky() {\r\n const position = this.attr('position')\r\n return position === 'sticky'\r\n }\r\n\r\n isFixed() {\r\n const position = this.attr('position')\r\n return position === 'fixed'\r\n }\r\n\r\n isInside() {\r\n return this.isFixed() || this.isSticky()\r\n }\r\n\r\n isOutside() {\r\n return !this.isInside()\r\n }\r\n\r\n count() {\r\n return this.chapters.length\r\n }\r\n\r\n _paintEdge() {\r\n const $fragment = document.createDocumentFragment()\r\n const STICKY = 'outline-navigator_sticky'\r\n const title = this.attr('title')\r\n const animationCurrent = this.attr('animationCurrent')\r\n const customClass = this.attr('customClass')\r\n const $parentElement = this.$parentElement\r\n const children = []\r\n const contents = []\r\n let $title = null\r\n let $el\r\n let $main\r\n let $list\r\n let $placeholder\r\n\r\n if (!$parentElement) {\r\n return this\r\n }\r\n\r\n if (this.isInside() && title) {\r\n $title = createElement(\r\n 'h2',\r\n {\r\n className: 'outline-navigator__title'\r\n },\r\n title\r\n )\r\n this.$title = $title\r\n contents.push($title)\r\n }\r\n\r\n $list = createElement('ul', {\r\n // 为优化性能,添加了 _fixed 和 _hidden\r\n // fixed 为了让 $list 脱离流布局\r\n // hidden 让 $list 不可见\r\n className: `outline-navigator__list`\r\n })\r\n this.$list = $list\r\n children.push($list)\r\n\r\n if (animationCurrent) {\r\n $placeholder = createElement('div', {\r\n className: 'outline-navigator__placeholder'\r\n })\r\n this.$placeholder = $placeholder\r\n children.push($placeholder)\r\n }\r\n\r\n $main = createElement(\r\n 'div',\r\n {\r\n className: 'outline-navigator__main'\r\n },\r\n children\r\n )\r\n this.$main = $main\r\n contents.push($main)\r\n\r\n $el = createElement(\r\n 'nav',\r\n {\r\n id: 'outline-navigator',\r\n className: `outline-navigator ${HIDDEN}`\r\n },\r\n contents\r\n )\r\n this.$el = $el\r\n\r\n if (this.isSticky()) {\r\n this.calculateStickyHeight()\r\n addClass($el, STICKY)\r\n }\r\n\r\n if (customClass) {\r\n addClass($el, customClass)\r\n }\r\n $fragment.appendChild($el)\r\n $parentElement.appendChild($fragment)\r\n\r\n return this\r\n }\r\n\r\n render() {\r\n const mounted = this.attr('mounted')\r\n const $parentElement = this.$parentElement\r\n const chapters = this.chapters\r\n const count = this.count()\r\n let $el\r\n\r\n if (!$parentElement || chapters.length < 1) {\r\n return this\r\n }\r\n\r\n if (this.isInside()) {\r\n addClass($parentElement, 'outline-navigator-parent')\r\n }\r\n\r\n this._paintEdge()\r\n $el = this.$el\r\n\r\n this._paint(chapters)\r\n\r\n later(() => {\r\n this.highlight(this.active)\r\n }, 60)\r\n\r\n this.offsetTop = offsetTop($el)\r\n this.offsetWidth = $el.offsetWidth\r\n\r\n if (this.isFixed()) {\r\n this.sticky()\r\n setProperty('--outline-navigator-width', `${this.offsetWidth}px`)\r\n }\r\n\r\n if (isFunction(mounted)) {\r\n mounted.call(this)\r\n }\r\n\r\n if (count < 400) {\r\n this.onObserver()\r\n }\r\n\r\n return this\r\n }\r\n\r\n erase() {\r\n this.$list.innerHTML = ''\r\n\r\n return this\r\n }\r\n\r\n _paint(chapters) {\r\n const showCode = this.attr('showCode')\r\n const $el = this.$el\r\n const $list = this.$list\r\n\r\n _paintChapters($list, chapters, showCode)\r\n removeClass($el, HIDDEN)\r\n addClass($el, EXPANDED)\r\n\r\n return this\r\n }\r\n\r\n _remove() {\r\n this.$parentElement.removeChild(this.$el)\r\n return this\r\n }\r\n\r\n refresh(chapters) {\r\n const $el = this.$el\r\n\r\n removeClass($el, HIDDEN)\r\n this.erase()._paint(chapters)\r\n\r\n return this\r\n }\r\n\r\n _getPlaceholderOffset(index) {\r\n const $main = this.$main\r\n const $list = this.$list\r\n const $anchor = $list.querySelector('.outline-navigator__anchor')\r\n const mainPaddingTop = parseInt(getStyle($main, 'padding-top'), 10)\r\n const mainBorderTop = parseInt(getStyle($main, 'border-top-width'), 10)\r\n const placeholderPaddingTop = parseInt(getStyle($list, 'padding-top'), 10)\r\n const placeholderMarginTop = parseInt(getStyle($list, 'margin-top'), 10)\r\n const placeholderBorderTop = parseInt(\r\n getStyle($list, 'border-top-width'),\r\n 10\r\n )\r\n let height = $anchor.offsetHeight\r\n let offsetTop = 0\r\n let top\r\n\r\n if (mainPaddingTop) {\r\n offsetTop += mainPaddingTop\r\n }\r\n\r\n if (placeholderPaddingTop) {\r\n offsetTop += placeholderPaddingTop\r\n }\r\n\r\n if (placeholderMarginTop) {\r\n offsetTop += placeholderMarginTop\r\n }\r\n\r\n if (mainBorderTop) {\r\n offsetTop += mainBorderTop\r\n }\r\n\r\n if (placeholderBorderTop) {\r\n offsetTop += placeholderBorderTop\r\n }\r\n\r\n top = height * index\r\n\r\n return offsetTop + top\r\n }\r\n\r\n positionPlaceholder(index) {\r\n const $list = this.$list\r\n const $placeholder = this.$placeholder\r\n const $anchor = $list.querySelector('.outline-navigator__anchor')\r\n const animationCurrent = this.attr('animationCurrent')\r\n const height = $anchor.offsetHeight\r\n let offsetTop = 0\r\n\r\n if (!animationCurrent) {\r\n return this\r\n }\r\n\r\n offsetTop = this._getPlaceholderOffset(index)\r\n\r\n $placeholder.style.cssText = `transform: translateY(${offsetTop}px);height:${height}px;`\r\n\r\n return this\r\n }\r\n\r\n highlight(id) {\r\n const $el = this.$el\r\n const animationCurrent = this.attr('animationCurrent')\r\n const position = this.attr('position')\r\n const ACTIVE = 'outline-navigator_active'\r\n const HIGHLIGHT = 'outline-navigator_highlight'\r\n let $parent = position === 'relative' ? this.$parentElement : this.$main\r\n let $anchor = null\r\n let placeholderOffsetTop = 0\r\n\r\n if (!$el) {\r\n return this\r\n }\r\n\r\n $anchor = $el.querySelector(`#chapter__anchor-${id}`)\r\n\r\n if (!$anchor) {\r\n return this\r\n }\r\n\r\n this.active = parseInt($anchor.getAttribute('data-id'), 10)\r\n\r\n if (this.$active) {\r\n removeClass(this.$active, HIGHLIGHT)\r\n removeClass(this.$active, ACTIVE)\r\n }\r\n\r\n this.$active = $anchor\r\n addClass(this.$active, ACTIVE)\r\n\r\n if (animationCurrent) {\r\n this.positionPlaceholder(this.active)\r\n } else {\r\n addClass(this.$active, HIGHLIGHT)\r\n }\r\n\r\n later(() => {\r\n if (!inBounding(this.$active, $parent)) {\r\n placeholderOffsetTop = this._getPlaceholderOffset(this.active)\r\n scrollTo($parent, placeholderOffsetTop)\r\n }\r\n })\r\n\r\n return this\r\n }\r\n\r\n sticky() {\r\n const afterSticky = this.attr('afterSticky')\r\n const FIXED = 'outline-navigator_fixed'\r\n const $el = this.$el\r\n const top = this.offsetTop\r\n const scrollTop = this.$scrollElement.scrollTop\r\n let isStickying\r\n\r\n if (!this.isFixed()) {\r\n return this\r\n }\r\n\r\n isStickying = scrollTop >= top\r\n\r\n if (isStickying) {\r\n addClass($el, FIXED)\r\n } else {\r\n removeClass($el, FIXED)\r\n }\r\n\r\n if (isFunction(afterSticky)) {\r\n afterSticky.call(this, this.isClosed(), isStickying)\r\n }\r\n\r\n return this\r\n }\r\n\r\n calculateStickyHeight() {\r\n const documentElement = document.documentElement\r\n const height = Math.max(\r\n documentElement.clientHeight || 0,\r\n window.innerHeight || 0\r\n )\r\n setProperty('--outline-sticky-height', `${height}px`)\r\n return this\r\n }\r\n\r\n scrollTo(top, after) {\r\n const el = this.$scrollElement\r\n\r\n scrollTo(el, top, after)\r\n\r\n return this\r\n }\r\n\r\n show() {\r\n const opened = this.attr('afterOpened')\r\n const count = this.count()\r\n const $el = this.$el\r\n const $parent = this.$parentElement\r\n\r\n if (this.isInside()) {\r\n if (count > 800) {\r\n removeClass($parent, HIDDEN)\r\n } else {\r\n removeClass($parent, HIDDEN)\r\n later(() => {\r\n removeClass($parent, FOLDED)\r\n addClass($parent, EXPANDED)\r\n }, 30)\r\n }\r\n } else {\r\n removeClass($el, HIDDEN)\r\n }\r\n this.closed = false\r\n\r\n if (isFunction(opened)) {\r\n opened.call(this)\r\n }\r\n\r\n return this\r\n }\r\n\r\n hide() {\r\n const closed = this.attr('afterClosed')\r\n const count = this.count()\r\n const $el = this.$el\r\n const $parent = this.$parentElement\r\n\r\n if (this.isInside()) {\r\n if (count > 800) {\r\n addClass($parent, HIDDEN)\r\n } else {\r\n addClass($parent, FOLDED)\r\n removeClass($parent, EXPANDED)\r\n later(() => {\r\n addClass($parent, HIDDEN)\r\n })\r\n }\r\n } else {\r\n addClass($el, HIDDEN)\r\n }\r\n this.closed = true\r\n\r\n if (isFunction(closed)) {\r\n closed.call(this)\r\n }\r\n\r\n return this\r\n }\r\n\r\n toggle() {\r\n const afterToggle = this.attr('afterToggle')\r\n const top = this.offsetTop\r\n const scrollTop = this.$scrollElement.scrollTop\r\n let isStickying\r\n\r\n if (this.isClosed()) {\r\n this.show()\r\n } else {\r\n this.hide()\r\n }\r\n\r\n if (isFunction(afterToggle)) {\r\n later(() => {\r\n isStickying = scrollTop >= top\r\n afterToggle.call(this, this.isClosed(), isStickying)\r\n })\r\n }\r\n\r\n return this\r\n }\r\n\r\n destroy() {\r\n const beforeDestroy = this.attr('beforeDestroy')\r\n const afterDestroy = this.attr('afterDestroy')\r\n\r\n if (isFunction(beforeDestroy)) {\r\n beforeDestroy.call(this)\r\n }\r\n\r\n this.removeListeners()._remove()._default()\r\n\r\n if (this.scrollTimer) {\r\n clearTimeout(this.scrollTimer)\r\n this.scrollTimer = null\r\n }\r\n\r\n if (this.resizeTimer) {\r\n clearTimeout(this.resizeTimer)\r\n this.resizeTimer = null\r\n }\r\n\r\n if (this.observerTimer) {\r\n clearTimeout(this.observerTimer)\r\n this.observerTimer = null\r\n }\r\n\r\n if (this.Observer) {\r\n this.Observer = null\r\n }\r\n\r\n if (isFunction(afterDestroy)) {\r\n afterDestroy.call(this)\r\n }\r\n\r\n return this\r\n }\r\n\r\n onObserver() {\r\n const selector = this.attr('selector')\r\n\r\n this.Observer = intersection(\r\n ($heading) => {\r\n const id = $heading.getAttribute('data-id')\r\n\r\n if (this.playing) {\r\n return false\r\n }\r\n\r\n if (this.observerTimer) {\r\n clearTimeout(this.observerTimer)\r\n }\r\n\r\n this.observerTimer = later(() => {\r\n this.highlight(id)\r\n }, 100)\r\n },\r\n {\r\n selector,\r\n context: this\r\n }\r\n )\r\n\r\n return this\r\n }\r\n\r\n onSelect(evt) {\r\n const stickyHeight = this.attr('stickyHeight')\r\n const $anchor = evt.delegateTarget\r\n const id = $anchor.getAttribute('data-id')\r\n const headingId = $anchor.href.split('#')[1]\r\n const $heading = document.querySelector(`#${headingId}`)\r\n const top = offsetTop($heading) - (stickyHeight + 10)\r\n const min = 0\r\n const max = this.$scrollElement.scrollHeight\r\n const afterScroll = this.attr('afterScroll')\r\n const after = () => {\r\n if (isFunction(afterScroll)) {\r\n afterScroll.call(this, 'chapter')\r\n }\r\n\r\n later(() => {\r\n this.playing = false\r\n this.$emit('toolbar:update', {\r\n top,\r\n min,\r\n max\r\n })\r\n })\r\n }\r\n\r\n this.playing = true\r\n if (this.isFixed()) {\r\n this.sticky()\r\n later(() => {\r\n this.scrollTo(top, after)\r\n this.highlight(id)\r\n }, 10)\r\n } else {\r\n this.scrollTo(top, after)\r\n this.highlight(id)\r\n }\r\n\r\n stop(evt)\r\n\r\n return this\r\n }\r\n\r\n onScroll() {\r\n const $scrollElement = this.$scrollElement\r\n\r\n if (this.scrollTimer) {\r\n clearTimeout(this.scrollTimer)\r\n }\r\n\r\n this.scrollTimer = later(() => {\r\n const top = $scrollElement.scrollTop\r\n const min = 0\r\n const max = $scrollElement.scrollHeight - $scrollElement.clientHeight\r\n\r\n if (this.isFixed()) {\r\n this.sticky()\r\n }\r\n\r\n this.$emit('toolbar:update', {\r\n top,\r\n min,\r\n max\r\n })\r\n }, 100)\r\n\r\n return this\r\n }\r\n\r\n onResize() {\r\n // 添加判断\r\n if (!this.isSticky()) {\r\n return this\r\n }\r\n\r\n if (this.resizeTimer) {\r\n clearTimeout(this.resizeTimer)\r\n }\r\n\r\n this.resizeTimer = later(() => {\r\n this.calculateStickyHeight()\r\n })\r\n\r\n return this\r\n }\r\n\r\n onRefresh(chapters) {\r\n this.refresh(chapters)\r\n\r\n return this\r\n }\r\n\r\n addListeners() {\r\n const $el = this.$el\r\n const $scrollElement = this.$scrollElement\r\n const tagName = $scrollElement.tagName.toLowerCase()\r\n let $element = $scrollElement\r\n\r\n if (this.count() < 1) {\r\n return this\r\n }\r\n\r\n if (tagName === 'html' || tagName === 'body') {\r\n $element = window\r\n }\r\n\r\n on($el, '.outline-navigator__anchor', 'click', this.onSelect, this, true)\r\n at($element, 'scroll', this.onScroll, this, true)\r\n if (this.isSticky()) {\r\n at(window, 'resize', this.onResize, this, true)\r\n }\r\n\r\n this.$on('anchors:all:paint', this.onObserver, this)\r\n this.$on('navigator:refresh', this.onRefresh, this)\r\n\r\n return this\r\n }\r\n\r\n removeListeners() {\r\n const selector = this.attr('selector')\r\n const $el = this.$el\r\n const $scrollElement = this.$scrollElement\r\n const tagName = $scrollElement.tagName.toLowerCase()\r\n let $element = $scrollElement\r\n\r\n if (this.count() < 1) {\r\n return this\r\n }\r\n\r\n if (tagName === 'html' || tagName === 'body') {\r\n $element = window\r\n }\r\n\r\n off($el, 'click', this.onSelect)\r\n off($element, 'scroll', this.onScroll)\r\n if (this.isSticky()) {\r\n off(window, 'resize', this.onResize)\r\n }\r\n this.$off('anchors:all:paint')\r\n this.$off('navigator:refresh')\r\n\r\n if (this.Observer) {\r\n document.querySelectorAll(selector).forEach((section) => {\r\n this.Observer.unobserve(section)\r\n })\r\n }\r\n\r\n return this\r\n }\r\n}\r\n\r\nNavigator.DEFAULTS = (() => {\r\n const OPTIONS = {\r\n parentElement: '',\r\n scrollElement: '',\r\n selector: '.outline-heading',\r\n active: 0,\r\n closed: false,\r\n showCode: true,\r\n animationCurrent: true,\r\n position: 'relative',\r\n stickyHeight: 0,\r\n chapters: [],\r\n created: null,\r\n mounted: null,\r\n afterClosed: null,\r\n afterOpened: null,\r\n afterScroll: null,\r\n beforeDestroy: null,\r\n afterDestroy: null,\r\n afterSticky: null\r\n }\r\n\r\n return cloneDeep(OPTIONS)\r\n})()\r\n\r\nexport default Navigator\r\n","import createElement from './utils/dom/createElement'\r\nimport timeSlice from './utils/lang/timeSlice'\r\n\r\nconst _paintChapters = ($list, chapters, showCode = false) => {\r\n const LIMIT = 400\r\n const count = chapters.length\r\n const clones = [...chapters]\r\n const paint = (parts) => {\r\n const byId = (id) => $list.querySelector(`#${id}`)\r\n parts.forEach((chapter) => {\r\n const pid = chapter.pid\r\n const id = chapter.id\r\n const code = chapter.code\r\n const rel = chapter.rel\r\n const children = []\r\n const $text = createElement(\r\n 'span',\r\n {\r\n className: 'outline-navigator__text'\r\n },\r\n chapter.text\r\n )\r\n let $link\r\n let $code\r\n let $li\r\n let $subject\r\n let $chapter\r\n\r\n if (showCode) {\r\n $code = createElement(\r\n 'span',\r\n {\r\n className: 'outline-navigator__code',\r\n 'data-id': id\r\n },\r\n chapter.code\r\n )\r\n\r\n children.push($code)\r\n }\r\n\r\n children.push($text)\r\n\r\n $link = createElement(\r\n 'a',\r\n {\r\n id: `chapter__anchor-${id}`,\r\n className: 'outline-navigator__anchor',\r\n href: '#' + rel,\r\n rel: rel,\r\n 'data-id': id,\r\n 'data-code': code\r\n },\r\n children\r\n )\r\n\r\n $li = createElement(\r\n 'li',\r\n {\r\n id: `chapter-${id}`,\r\n className: 'outline-navigator__item',\r\n 'data-id': id,\r\n 'data-code': code\r\n },\r\n $link\r\n )\r\n\r\n if (pid === -1) {\r\n $list.appendChild($li)\r\n } else {\r\n $chapter = byId(`chapter-${pid}`)\r\n $subject = byId(`subject-${pid}`)\r\n\r\n if (!$subject) {\r\n $subject = createElement(\r\n 'ul',\r\n {\r\n id: 'subject-' + pid,\r\n className: 'outline-navigator__subject'\r\n },\r\n $li\r\n )\r\n\r\n $chapter.appendChild($subject)\r\n } else {\r\n $subject.appendChild($li)\r\n }\r\n }\r\n })\r\n }\r\n\r\n // 在大量 DOM 菜单绘制的时候,使用 TIME SLICE 拆分绘制任务\r\n // 以避免一次绘制大量 DOM 导致占用资源过高,导致卡死\r\n if (count > LIMIT) {\r\n // 同步绘制\r\n paint(clones.splice(0, LIMIT))\r\n\r\n // 剩余的采用 timeSlice 机制绘制\r\n while (clones.length > 0) {\r\n const once = clones.splice(0, LIMIT)\r\n timeSlice(() => {\r\n paint(once)\r\n })\r\n }\r\n } else {\r\n paint(clones)\r\n }\r\n}\r\n\r\nexport default _paintChapters\r\n","import isElement from '../types/isElement'\r\n\r\n/**\r\n * 检测某个 DOM 节点的位置是否在另个一个 DOM 节点范围内\r\n * ========================================================================\r\n * @method inBounding\r\n * @param {HTMLElement} child\r\n * @param {HTMLElement} parent\r\n * @return {Boolean}\r\n */\r\nconst inBounding = (child, parent) => {\r\n let isInBounding = false\r\n let parentRect\r\n let childRect\r\n\r\n if (!isElement(child) || !isElement(parent)) {\r\n return isInBounding\r\n }\r\n\r\n parentRect = parent.getBoundingClientRect()\r\n childRect = child.getBoundingClientRect()\r\n\r\n isInBounding = !!(\r\n childRect.top >= parentRect.top &&\r\n childRect.right <= parentRect.right &&\r\n childRect.bottom <= parentRect.bottom &&\r\n childRect.left >= parentRect.left\r\n )\r\n\r\n return isInBounding\r\n}\r\n\r\nexport default inBounding\r\n","import isFunction from '../types/isFunction'\r\nimport isElement from '../types/isElement'\r\n\r\n/**\r\n * 通用的 IntersectionObserver 观察者处理器\r\n * ========================================================================\r\n * @method intersection\r\n * @param {Function} fn\r\n * @param {Object} [props]\r\n * @param {Object|HTMLElement} [props.root]\r\n * @param {String} [props.selector]\r\n * @param {Object} [props.context]\r\n * @param {String} [props.attr]\r\n * @param {String} [props.rootMargin]\r\n */\r\nconst intersection = (fn, props = {}) => {\r\n const root = props.root || null\r\n const selector = props.selector || '.outline-heading'\r\n const context = props.context || null\r\n const rootMargin = props.rootMargin || '0px 0px -90% 0px'\r\n const options = {\r\n rootMargin: rootMargin\r\n }\r\n // eslint-disable-next-line compat/compat\r\n const Observer = new IntersectionObserver((entries) => {\r\n entries.forEach((entry) => {\r\n if (entry.intersectionRatio > 0) {\r\n if (isFunction(fn)) {\r\n fn.call(context || entry.target, entry.target)\r\n }\r\n }\r\n })\r\n }, options)\r\n const $root = isElement(root) ? root : document\r\n\r\n if (root) {\r\n options.root = root\r\n }\r\n\r\n $root.querySelectorAll(selector).forEach((section) => {\r\n Observer.observe(section)\r\n })\r\n\r\n return Observer\r\n}\r\n\r\nexport default intersection\r\n","import isObject from './isObject'\r\n\r\n/**\r\n * 检测测试数据是否为类似 Object 类型\r\n * ========================================================================\r\n * @method isObjectLike\r\n * @param {Object} val - 要检测的数据\r\n * @returns {Boolean} 'val' 是类似 Object 类型,返回 true,否则返回 false\r\n */\r\nconst isObjectLike = (val) => {\r\n return isObject(val) && val !== null\r\n}\r\n\r\nexport default isObjectLike\r\n","import isObjectLike from './isObjectLike'\r\n\r\n/**\r\n * 检测测试数据是否为普通对象\r\n * ========================================================================\r\n * @method isPlainObject\r\n * @param {Object} val - 要检测的数据\r\n * @returns {Boolean} 'val' 是普通对象,返回 true,否则返回 false\r\n */\r\nconst isPlainObject = (val) => {\r\n const getPrototypeOf = Object.getPrototypeOf\r\n let proto\r\n\r\n // Detect obvious negatives\r\n if (!isObjectLike(val)) {\r\n return false\r\n }\r\n\r\n proto = val.prototype\r\n\r\n // JavaScript 对象分为两种:普通对象和函数对象\r\n // 普通对象:原型是 __proto__,没有 prototype 原型(属性)\r\n // 函数对象:原型是 prototype ,prototype 只存在于函数对象上\r\n if (!proto) {\r\n return true\r\n }\r\n\r\n proto = val\r\n\r\n while (getPrototypeOf(proto) !== null) {\r\n proto = getPrototypeOf(proto)\r\n }\r\n\r\n return getPrototypeOf(val) === proto\r\n}\r\n\r\nexport default isPlainObject\r\n","/**\r\n * 转义字符串中的 HTML 标签\r\n * ========================================================================\r\n * @param {String} str - 需要转义的字符串\r\n * @returns {String}\r\n */\r\nconst encodeHTML = (str) => {\r\n const CHARTS = {\r\n '&': '&',\r\n '<': '<',\r\n '>': '>',\r\n \"'\": ''',\r\n '\"': '"'\r\n }\r\n\r\n return str.replace(/[&<>'\"]/g, (tag) => {\r\n return CHARTS[tag] || tag\r\n })\r\n}\r\n\r\nexport default encodeHTML\r\n","import isString from './utils/types/isString'\r\nimport isPlainObject from './utils/types/isPlainObject'\r\nimport isFunction from './utils/types/isFunction'\r\n\r\nimport extend from './utils/lang/extend'\r\nimport later from './utils/lang/later'\r\nimport stripScripts from './utils/lang/stripScripts'\r\nimport encodeHTML from './utils/lang/encodeHTML'\r\nimport cloneDeep from './utils/lang/cloneDeep'\r\nimport guid from './utils/lang/guid'\r\n\r\nimport createElement from './utils/dom/createElement'\r\nimport addClass from './utils/dom/addClass'\r\nimport removeClass from './utils/dom/removeClass'\r\nimport setAttribute from './utils/dom/setAttribute'\r\nimport setAttributes from './utils/dom/setAttributes'\r\n\r\nimport icon from './utils/icons/icon'\r\nimport paint from './utils/icons/paint'\r\nimport on from './utils/event/on'\r\nimport off from './utils/event/off'\r\n\r\nimport Base from './base'\r\n\r\nconst TYPES = ['info', 'success', 'warning', 'error']\r\nconst instances = []\r\nlet instance\r\n\r\npaint()\r\n\r\nclass Message extends Base {\r\n constructor(options) {\r\n super()\r\n\r\n this._default()\r\n\r\n if (options) {\r\n this.initialize(options)\r\n }\r\n }\r\n\r\n _default() {\r\n this.attrs = cloneDeep(Message.DEFAULTS)\r\n\r\n this.$el = null\r\n this.id = ''\r\n this.closed = false\r\n this.visible = false\r\n this.offset = -50\r\n this.timer = null\r\n this.destroyed = false\r\n\r\n return this\r\n }\r\n\r\n initialize(options) {\r\n this.attr(options)\r\n this.id = this.attr('id')\r\n this.offset = this.attr('offset') || -50\r\n\r\n this.$emit('created', { ...this.attr() })\r\n\r\n this.render().addListeners()\r\n\r\n if (this.attr('visible')) {\r\n this.open()\r\n }\r\n\r\n return this\r\n }\r\n\r\n isClosed() {\r\n return this.closed\r\n }\r\n\r\n isDestroyed() {\r\n return this.destroyed\r\n }\r\n\r\n _getClassName() {\r\n const type = this.attr('type')\r\n const effect = this.attr('effect')\r\n const round = this.attr('round')\r\n const closable = this.attr('closable')\r\n const visible = this.attr('visible')\r\n const customClass = this.attr('customClass')\r\n const className = [\r\n 'outline-message',\r\n `outline-message_${type}`,\r\n `outline-message_${effect}`\r\n ]\r\n\r\n if (round) {\r\n className.push('outline-message_round')\r\n }\r\n\r\n if (!closable) {\r\n className.push('outline-message_full-width')\r\n }\r\n\r\n if (visible) {\r\n className.push('outline-message_visible')\r\n }\r\n\r\n if (customClass) {\r\n className.push(customClass)\r\n }\r\n\r\n return className\r\n }\r\n\r\n render() {\r\n const type = this.attr('type')\r\n const message = this.attr('message')\r\n const effect = this.attr('effect')\r\n const round = this.attr('round')\r\n const closable = this.attr('closable')\r\n const dangerouslyUseHTMLString = this.attr('dangerouslyUseHTMLString')\r\n const className = this._getClassName()\r\n const iconName = effect === 'light' ? `circle-${type}` : type\r\n const children = []\r\n let iconSize = 20\r\n let $type\r\n let $message\r\n let $text\r\n let $close\r\n let $el\r\n\r\n if (round && effect === 'default') {\r\n iconSize = 12\r\n }\r\n\r\n if (effect !== 'plain') {\r\n $type = icon(iconName, {\r\n iconSet: 'outline',\r\n size: iconSize\r\n })\r\n addClass($type, 'outline-message__icon')\r\n children.push($type)\r\n }\r\n\r\n if (!dangerouslyUseHTMLString) {\r\n $text = document.createTextNode(encodeHTML(stripScripts(message)))\r\n } else {\r\n $text = document.createDocumentFragment()\r\n $text.innerHTML = message\r\n }\r\n $message = createElement(\r\n 'p',\r\n {\r\n className: 'outline-message__content'\r\n },\r\n [$text]\r\n )\r\n children.push($message)\r\n\r\n if (closable) {\r\n $close = icon('close', {\r\n iconSet: 'outline',\r\n size: 18\r\n })\r\n addClass($close, 'outline-message__close')\r\n children.push($close)\r\n }\r\n\r\n $el = createElement(\r\n 'div',\r\n {\r\n className: className.join(' ')\r\n },\r\n children\r\n )\r\n $el.style.cssText = `top:-50px;`\r\n this.$el = $el\r\n document.body.appendChild(this.$el)\r\n\r\n this.$emit('mounted')\r\n\r\n return this\r\n }\r\n\r\n _refreshIcon() {\r\n const HIDDEN = '.outline-message_hidden'\r\n const $el = this.$el\r\n let iconSize = 20\r\n let type\r\n let effect\r\n let round\r\n let iconName\r\n let $icon\r\n let $svg\r\n let $use\r\n\r\n if (this.isDestroyed()) {\r\n return this\r\n }\r\n\r\n $icon = $el.querySelector('.outline-icon')\r\n\r\n if (!$icon) {\r\n return this\r\n }\r\n\r\n type = this.attr('type')\r\n effect = this.attr('effect')\r\n round = this.attr('round')\r\n\r\n if (effect === 'plain') {\r\n addClass($icon, HIDDEN)\r\n } else {\r\n removeClass($icon, HIDDEN)\r\n\r\n if (round && effect === 'default') {\r\n iconSize = 12\r\n }\r\n }\r\n\r\n $svg = $icon.querySelector('.outline-icon__svg')\r\n setAttributes($svg, {\r\n style: `width:${iconSize}px;height:${iconSize}px;`\r\n })\r\n\r\n $use = $svg.querySelector('use')\r\n iconName = effect === 'light' ? `circle-${type}` : type\r\n setAttribute($use, 'xlink:href', `#outline-icon-${iconName}`)\r\n\r\n return this\r\n }\r\n\r\n _refreshMessage() {\r\n const $el = this.$el\r\n let $message\r\n let dangerouslyUseHTMLString\r\n let message\r\n let text\r\n\r\n if (this.isDestroyed()) {\r\n return this\r\n }\r\n\r\n $message = $el.querySelector('.outline-message__content')\r\n dangerouslyUseHTMLString = this.attr('dangerouslyUseHTMLString')\r\n message = this.attr('message')\r\n\r\n if (!dangerouslyUseHTMLString) {\r\n text = encodeHTML(stripScripts(message))\r\n } else {\r\n text = message\r\n }\r\n\r\n $message.innerHTML = text\r\n\r\n return this\r\n }\r\n\r\n _refreshClose() {\r\n const HIDDEN = '.outline-message_hidden'\r\n const $el = this.$el\r\n let $close\r\n let closable\r\n\r\n if (this.isDestroyed()) {\r\n return this\r\n }\r\n\r\n $close = $el.querySelector('.outline-message__close')\r\n closable = this.attr('closable')\r\n\r\n if ($close) {\r\n if (closable) {\r\n addClass($close, HIDDEN)\r\n } else {\r\n removeClass($close, HIDDEN)\r\n }\r\n }\r\n\r\n return this\r\n }\r\n\r\n _refreshEl() {\r\n const $el = this.$el\r\n let className\r\n\r\n if (this.isDestroyed()) {\r\n return this\r\n }\r\n\r\n className = this._getClassName()\r\n setAttribute($el, 'className', className.join(' '))\r\n\r\n return this\r\n }\r\n\r\n refresh(options) {\r\n if (!isPlainObject(options)) {\r\n return this\r\n }\r\n\r\n this.attr(options)\r\n ._refreshIcon()\r\n ._refreshMessage()\r\n ._refreshClose()\r\n ._refreshEl()\r\n\r\n return this\r\n }\r\n\r\n clearTimer() {\r\n if (this.isDestroyed()) {\r\n return this\r\n }\r\n\r\n if (this.timer) {\r\n clearTimeout(this.timer)\r\n this.timer = null\r\n }\r\n\r\n return this\r\n }\r\n\r\n startTimer(duration) {\r\n if (this.isDestroyed()) {\r\n return this\r\n }\r\n\r\n this.timer = later(() => {\r\n this.$emit('opened')\r\n this.close()\r\n }, duration * 1000)\r\n\r\n return this\r\n }\r\n\r\n open(options) {\r\n const $el = this.$el\r\n let offset\r\n let duration\r\n let top\r\n let cssRules\r\n\r\n if (this.isDestroyed()) {\r\n return this\r\n }\r\n\r\n if (this.isClosed()) {\r\n this.refresh(options)\r\n }\r\n\r\n offset = this.attr('offset')\r\n duration = this.attr('duration')\r\n top = offset && offset >= this.offset ? offset : this.offset\r\n cssRules = `top:${top}px;`\r\n\r\n this.clearTimer()\r\n\r\n this.$emit('beforeOpen')\r\n\r\n later(() => {\r\n this.visible = true\r\n\r\n addClass($el, 'outline-message_visible')\r\n $el.style.cssText = cssRules\r\n\r\n if (duration > 0) {\r\n this.startTimer(duration)\r\n }\r\n }, 100)\r\n\r\n return this\r\n }\r\n\r\n close() {\r\n const $el = this.$el\r\n const cssRules = `top:-50px;`\r\n let destroyAfterClosed\r\n let beforeClose\r\n\r\n if (this.isDestroyed()) {\r\n return this\r\n }\r\n\r\n destroyAfterClosed = this.attr('destroyAfterClosed')\r\n beforeClose = this.attr('beforeClose')\r\n\r\n if (isFunction(beforeClose)) {\r\n beforeClose.call(this)\r\n }\r\n\r\n $el.style.cssText = cssRules\r\n removeClass($el, 'outline-message_visible')\r\n\r\n this.visible = false\r\n this.closed = true\r\n\r\n later(() => {\r\n this.$emit('closed')\r\n\r\n if (destroyAfterClosed) {\r\n this.destroy()\r\n }\r\n }, 500)\r\n\r\n return this\r\n }\r\n\r\n destroy() {\r\n this.$emit('beforeDestroy')\r\n\r\n if (this.isDestroyed()) {\r\n return this\r\n }\r\n\r\n this.removeListeners()\r\n\r\n document.body.removeChild(this.$el)\r\n\r\n clearTimeout(this.timer)\r\n this._default()\r\n\r\n this.$emit('afterDestroy')\r\n\r\n return this\r\n }\r\n\r\n onMouseEnter() {\r\n this.clearTimer()\r\n return this\r\n }\r\n\r\n onMouseLeave() {\r\n const duration = this.attr('duration')\r\n const delay = this.attr('delay')\r\n\r\n if (duration <= 0) {\r\n return this\r\n }\r\n\r\n this.startTimer(delay)\r\n\r\n return this\r\n }\r\n\r\n onClose() {\r\n this.clearTimer()\r\n this.close()\r\n return this\r\n }\r\n\r\n addListeners() {\r\n const $el = this.$el\r\n\r\n on(\r\n $el,\r\n '.outline-message__content',\r\n 'mouseenter',\r\n this.onMouseEnter,\r\n this,\r\n true\r\n )\r\n on(\r\n $el,\r\n '.outline-message__content',\r\n 'mouseleave',\r\n this.onMouseLeave,\r\n this,\r\n true\r\n )\r\n on($el, '.outline-message__close', 'click', this.onClose, this, true)\r\n\r\n return this\r\n }\r\n\r\n removeListeners() {\r\n const $el = this.$el\r\n\r\n off($el, 'mouseenter', this.onMouseEnter)\r\n off($el, 'mouseleave', this.onMouseLeave)\r\n off($el, 'click', this.onClose)\r\n\r\n return this\r\n }\r\n}\r\n\r\nMessage.DEFAULTS = (() => {\r\n const OPTIONS = {\r\n id: '',\r\n type: 'info',\r\n effect: 'default',\r\n round: false,\r\n offset: 30,\r\n duration: 3,\r\n delay: 2,\r\n message: '',\r\n customClass: '',\r\n closable: true,\r\n visible: true,\r\n dangerouslyUseHTMLString: false,\r\n destroyAfterClosed: true,\r\n beforeClose: null\r\n }\r\n\r\n return cloneDeep(OPTIONS)\r\n})()\r\n\r\nTYPES.forEach((type) => {\r\n Message[type] = (options) => {\r\n const config = {}\r\n const id = guid(`outline-message-`)\r\n const beforeClose = options.beforeClose || null\r\n let offset = options.offset || 30\r\n\r\n if (isString(options)) {\r\n config.message = options\r\n } else {\r\n if (isPlainObject(options)) {\r\n extend(config, options)\r\n }\r\n }\r\n config.id = id\r\n config.type = type\r\n config.offset = offset\r\n config.visible = false\r\n config.beforeClose = () => {\r\n Message.close(id, beforeClose)\r\n }\r\n\r\n instance = new Message(config)\r\n instances.forEach((item) => {\r\n offset += item.$el.offsetHeight + 16\r\n })\r\n instance.offset = offset\r\n instance.open()\r\n instances.push(instance)\r\n\r\n return instance\r\n }\r\n})\r\n\r\n// 关闭指定 id 消息的静态方法\r\nMessage.close = (id, beforeClose) => {\r\n const len = instances.length\r\n let index = -1\r\n let i\r\n let offsetHeight\r\n\r\n instances.forEach((instance, i) => {\r\n // 在 instances 中通过 id 找到要关闭的消息\r\n if (id === instance.id) {\r\n offsetHeight = instance.$el.offsetHeight\r\n index = i\r\n\r\n // 关闭消息\r\n if (isFunction(beforeClose)) {\r\n beforeClose.call(instance)\r\n }\r\n\r\n instances.splice(i, 1)\r\n }\r\n })\r\n\r\n if (len <= 1 || index === -1 || index > instances.length - 1) {\r\n return false\r\n }\r\n\r\n i = index\r\n\r\n // 界面中的消息逐个向上收起\r\n for (; i < len - 1; i += 1) {\r\n const dom = instances[i].$el\r\n\r\n dom.style['top'] = parseInt(dom.style['top'], 10) - offsetHeight - 16 + 'px'\r\n }\r\n}\r\n\r\n// 关闭所有消息的静态方法\r\nMessage.clear = () => {\r\n let i = instances.length - 1\r\n for (; i >= 0; i -= 1) {\r\n instances[i].close()\r\n }\r\n}\r\n\r\nexport default Message\r\n","import isFunction from './utils/types/isFunction'\r\n\r\nclass Command {\r\n constructor(name, action) {\r\n this.name = name\r\n\r\n if (isFunction(action)) {\r\n this.action = action\r\n }\r\n }\r\n\r\n execute() {\r\n this.action()\r\n\r\n return this\r\n }\r\n}\r\n\r\nexport default Command\r\n","import isFunction from './utils/types/isFunction'\r\n\r\nclass Commands {\r\n constructor() {\r\n this.commands = []\r\n }\r\n\r\n get(name) {\r\n return this.commands.find((cmd) => cmd.name === name)\r\n }\r\n\r\n add(command) {\r\n this.commands.push(command)\r\n\r\n return this\r\n }\r\n\r\n del(name) {\r\n const commands = this.commands\r\n const command = commands.find((cmd) => cmd.name === name)\r\n const index = command ? commands.indexOf(command) : -1\r\n\r\n if (index > -1) {\r\n commands.splice(index, 1)\r\n }\r\n\r\n return this\r\n }\r\n\r\n clear() {\r\n this.commands = []\r\n\r\n return this\r\n }\r\n\r\n execute(name) {\r\n const command = this.commands.find((cmd) => cmd.name === name)\r\n\r\n if (isFunction(command?.execute)) {\r\n command.execute()\r\n }\r\n\r\n return this\r\n }\r\n}\r\n\r\nexport default Commands\r\n","import icon from './utils/icons/icon'\r\nimport createElement from './utils/dom/createElement'\r\nimport addClass from './utils/dom/addClass'\r\n\r\nconst _createButton = (button, rounded = true) => {\r\n const $icon = icon(button.icon, {\r\n iconSet: button.iconSet || 'outline',\r\n color: button.color || '',\r\n size: button.size\r\n })\r\n const $anchor = createElement(\r\n 'a',\r\n {\r\n className: `outline-toolbar__anchor`,\r\n href: button.link\r\n },\r\n $icon\r\n )\r\n const $button = createElement(\r\n 'div',\r\n {\r\n className: `outline-toolbar__button ${button.name}`,\r\n 'data-cmd': button.name\r\n },\r\n [button.link ? $anchor : $icon]\r\n )\r\n\r\n addClass($icon, 'outline-toolbar__icon')\r\n\r\n if (rounded) {\r\n addClass($button, 'outline-toolbar_rounded')\r\n }\r\n\r\n if (button.disabled) {\r\n addClass($button, 'outline-toolbar_disabled')\r\n }\r\n\r\n return $button\r\n}\r\n\r\nexport default _createButton\r\n","import isString from './utils/types/isString'\r\nimport isFunction from './utils/types/isFunction'\r\nimport isObject from './utils/types/isObject'\r\nimport isArray from './utils/types/isArray'\r\nimport later from './utils/lang/later'\r\nimport guid from './utils/lang/guid'\r\nimport cloneDeep from './utils/lang/cloneDeep'\r\nimport createElement from './utils/dom/createElement'\r\nimport addClass from './utils/dom/addClass'\r\nimport hasClass from './utils/dom/hasClass'\r\nimport removeClass from './utils/dom/removeClass'\r\nimport on from './utils/event/on'\r\nimport off from './utils/event/off'\r\nimport paint from './utils/icons/paint'\r\n\r\nimport Base from './base'\r\nimport Command from './command'\r\nimport Commands from './commands'\r\n\r\nimport _createButton from './_createButton'\r\n\r\nconst DISABLED = 'outline-toolbar_disabled'\r\nconst HIDDEN = 'outline-toolbar_hidden'\r\nconst ACTIVE = 'outline-toolbar_active'\r\n\r\nclass Toolbar extends Base {\r\n constructor(options) {\r\n super()\r\n\r\n this._default()\r\n\r\n if (options) {\r\n this.initialize(options)\r\n }\r\n }\r\n\r\n _default() {\r\n this.attrs = cloneDeep(Toolbar.DEFAULTS)\r\n\r\n this.disabled = false\r\n this.closed = false\r\n\r\n this.$el = null\r\n this.buttons = []\r\n this.commands = null\r\n\r\n return this\r\n }\r\n\r\n initialize(options) {\r\n let created\r\n\r\n this.attr(options)\r\n\r\n this.disabled = this.attr('disabled')\r\n this.closed = this.attr('closed')\r\n this.commands = new Commands()\r\n\r\n created = this.attr('created')\r\n\r\n if (isFunction(created)) {\r\n created.call(this)\r\n }\r\n\r\n this.render().addListeners()\r\n\r\n return this\r\n }\r\n\r\n isHighlight(name) {\r\n const button = this.get(name)\r\n\r\n if (!button) {\r\n return false\r\n }\r\n\r\n return hasClass(button.$el, ACTIVE)\r\n }\r\n\r\n isDisabled(name) {\r\n let button\r\n\r\n if (name) {\r\n button = this.get(name)\r\n\r\n return button.disabled\r\n }\r\n\r\n return this.disabled\r\n }\r\n\r\n isExist(name) {\r\n const button = this.get(name)\r\n return !!button\r\n }\r\n\r\n isClosed() {\r\n return this.closed\r\n }\r\n\r\n _getCommand(button) {\r\n const _self = this\r\n const { action, name } = button\r\n let command = null\r\n let handler = null\r\n let context\r\n let listener\r\n\r\n if (!action) {\r\n return command\r\n }\r\n\r\n handler = action.handler\r\n context = action.context || this\r\n\r\n if (isFunction(handler)) {\r\n listener = handler\r\n } else if (isString(handler)) {\r\n listener = function () {\r\n _self.$emit(handler, name)\r\n }\r\n }\r\n\r\n if (isFunction(listener)) {\r\n command = new Command(name, listener.bind(context))\r\n }\r\n\r\n return command\r\n }\r\n\r\n get(name) {\r\n return this.buttons.find((button) => button.name === name)\r\n }\r\n\r\n render() {\r\n const mounted = this.attr('mounted')\r\n const buttons = this.attr('buttons') || []\r\n const placement = this.attr('placement')\r\n\r\n paint()\r\n\r\n this.$el = createElement('div', {\r\n id: guid('outline-toolbar'),\r\n className: `outline-toolbar outline-toolbar_${placement}`\r\n })\r\n this._paint(buttons)\r\n document.body.appendChild(this.$el)\r\n\r\n if (this.closed) {\r\n this.hide()\r\n }\r\n\r\n if (this.disabled) {\r\n this.disable()\r\n }\r\n\r\n if (isFunction(mounted)) {\r\n mounted.call(this)\r\n }\r\n\r\n return this\r\n }\r\n\r\n erase() {\r\n this.$el.innerHTML = ''\r\n return this\r\n }\r\n\r\n _paint(buttons) {\r\n const rounded = this.attr('rounded')\r\n const $fragment = document.createDocumentFragment()\r\n\r\n buttons.forEach((button) => {\r\n const $button = _createButton(button, rounded)\r\n const command = this._getCommand(button)\r\n const { name, disabled, context } = button\r\n\r\n $fragment.appendChild($button)\r\n\r\n if (!this.isExist(name)) {\r\n this.buttons.push({\r\n $el: $button,\r\n name,\r\n disabled: disabled || false,\r\n context: context || this\r\n })\r\n\r\n if (command) {\r\n this.commands.add(command)\r\n }\r\n }\r\n })\r\n\r\n this.$el.appendChild($fragment)\r\n\r\n return this\r\n }\r\n\r\n _remove() {\r\n document.body.removeChild(this.$el)\r\n return this\r\n }\r\n\r\n refresh(buttons) {\r\n this.attr({ buttons })\r\n this.erase()._paint(buttons)\r\n return this\r\n }\r\n\r\n add(button) {\r\n const $el = this.$el\r\n const $fragment = document.createDocumentFragment()\r\n const buttons = this.attr('buttons') || []\r\n const { name, disabled, context } = button\r\n const command = this._getCommand(button)\r\n const _add = (button) => {\r\n const $button = _createButton(button)\r\n\r\n $fragment.appendChild($button)\r\n\r\n buttons.push(button)\r\n this.buttons.push({\r\n $el: $button,\r\n name,\r\n disabled: disabled || false,\r\n context: context || this,\r\n command\r\n })\r\n\r\n if (command) {\r\n this.commands.add(command)\r\n }\r\n }\r\n\r\n if (isObject(button)) {\r\n _add(button)\r\n } else if (isArray(button)) {\r\n button.forEach((item) => {\r\n if (isObject(item)) {\r\n _add(item)\r\n }\r\n })\r\n }\r\n $el.appendChild($fragment)\r\n\r\n return this\r\n }\r\n\r\n remove(name) {\r\n const $el = this.$el\r\n const buttons = this.buttons\r\n const button = this.get(name)\r\n let index = -1\r\n\r\n if (!button) {\r\n return this\r\n }\r\n\r\n index = buttons.indexOf(button)\r\n\r\n if (index > -1) {\r\n buttons.splice(index, 1)\r\n this.attr('buttons').splice(index, 1)\r\n }\r\n\r\n this._disable(name)\r\n $el.removeChild(button.$el)\r\n\r\n return this\r\n }\r\n\r\n _disable(name) {\r\n const button = this.get(name)\r\n const command = this.commands.get(name)\r\n\r\n if (!button || button.disabled) {\r\n return this\r\n }\r\n\r\n button.disabled = true\r\n\r\n if (command) {\r\n this.commands.del(command)\r\n }\r\n\r\n addClass(button.$el, DISABLED)\r\n\r\n return this\r\n }\r\n\r\n _enable(name) {\r\n const button = this.get(name)\r\n const command = this.commands.get(name)\r\n\r\n if (!button || !button.disabled) {\r\n return this\r\n }\r\n\r\n button.disabled = false\r\n\r\n if (command) {\r\n this.commands.add(command)\r\n }\r\n\r\n removeClass(button.$el, DISABLED)\r\n\r\n return this\r\n }\r\n\r\n disable(name) {\r\n const disabled = this.attr('afterDisabled')\r\n\r\n if (name) {\r\n this._disable(name)\r\n } else {\r\n addClass(this.$el, DISABLED)\r\n this.removeListeners()\r\n this.disabled = true\r\n\r\n if (isFunction(disabled)) {\r\n disabled.call(this)\r\n }\r\n }\r\n\r\n return this\r\n }\r\n\r\n enable(name) {\r\n const enabled = this.attr('afterEnabled')\r\n\r\n if (name) {\r\n this._enable(name)\r\n } else {\r\n this.disabled = false\r\n removeClass(this.$el, DISABLED)\r\n this.addListeners()\r\n\r\n if (isFunction(enabled)) {\r\n enabled.call(this)\r\n }\r\n }\r\n\r\n return this\r\n }\r\n\r\n show(name) {\r\n const opened = this.attr('afterOpened')\r\n const button = this.get(name)\r\n const $el = this.$el\r\n\r\n if (name) {\r\n if (!button) {\r\n return this\r\n }\r\n\r\n removeClass(button.$el, HIDDEN)\r\n } else {\r\n removeClass($el, HIDDEN)\r\n this.closed = false\r\n\r\n if (isFunction(opened)) {\r\n later(() => {\r\n opened.call(this)\r\n }, 310)\r\n }\r\n }\r\n\r\n return this\r\n }\r\n\r\n hide(name) {\r\n const closed = this.attr('afterClosed')\r\n const button = this.get(name)\r\n const $el = this.$el\r\n\r\n if (name) {\r\n if (!button) {\r\n return this\r\n }\r\n\r\n addClass(button.$el, HIDDEN)\r\n } else {\r\n addClass($el, HIDDEN)\r\n this.closed = true\r\n\r\n if (isFunction(closed)) {\r\n later(() => {\r\n closed.call(this)\r\n }, 310)\r\n }\r\n }\r\n\r\n return this\r\n }\r\n\r\n toggle(name) {\r\n if (this.isClosed()) {\r\n this.show(name)\r\n } else {\r\n this.hide(name)\r\n }\r\n\r\n return this\r\n }\r\n\r\n highlight(name) {\r\n const button = this.get(name)\r\n let $button\r\n\r\n if (!button) {\r\n return this\r\n }\r\n\r\n $button = button.$el\r\n\r\n if (hasClass($button, ACTIVE)) {\r\n removeClass($button, ACTIVE)\r\n } else {\r\n addClass($button, ACTIVE)\r\n }\r\n\r\n return this\r\n }\r\n\r\n destroy() {\r\n const beforeDestroy = this.attr('beforeDestroy')\r\n const afterDestroy = this.attr('afterDestroy')\r\n\r\n if (isFunction(beforeDestroy)) {\r\n beforeDestroy.call(this)\r\n }\r\n\r\n this.commands.clear()\r\n this.removeListeners()._remove()._default()\r\n\r\n if (isFunction(afterDestroy)) {\r\n afterDestroy.call(this)\r\n }\r\n\r\n return this\r\n }\r\n\r\n execute(name) {\r\n if (this.isDisabled(name)) {\r\n return this\r\n }\r\n\r\n this.commands.execute(name)\r\n\r\n return this\r\n }\r\n\r\n onExecute(evt) {\r\n const $button = evt.delegateTarget\r\n let cmd = ''\r\n\r\n if ($button) {\r\n cmd = $button.getAttribute('data-cmd')\r\n\r\n if (cmd) {\r\n this.execute(cmd)\r\n }\r\n }\r\n\r\n return this\r\n }\r\n\r\n _updateToolbar({ top, min, max }) {\r\n const current = Math.ceil(top)\r\n\r\n if (current <= min) {\r\n this.hide('up')\r\n this.show('down')\r\n } else if (current >= max) {\r\n this.hide('down')\r\n this.show('up')\r\n } else if (current > min && current < max) {\r\n this.show('up')\r\n this.show('down')\r\n }\r\n\r\n return this\r\n }\r\n\r\n onToolbarUpdate({ top, min, max }) {\r\n this._updateToolbar({ top, min, max })\r\n return this\r\n }\r\n\r\n onAddButton(buttons) {\r\n this.attr({\r\n buttons\r\n })\r\n this.refresh(buttons)\r\n\r\n return this\r\n }\r\n\r\n onRemoveButton(name) {\r\n this.remove(name)\r\n return this\r\n }\r\n\r\n addListeners() {\r\n const buttons = this.attr('buttons') || []\r\n const $el = this.$el\r\n\r\n if (!buttons || buttons.length < 1) {\r\n return this\r\n }\r\n\r\n on($el, `.outline-toolbar__button`, 'click', this.onExecute, this, true)\r\n\r\n this.$on('toolbar:update', this.onToolbarUpdate)\r\n this.$on('toolbar:add:button', this.onAddButton)\r\n this.$on('toolbar:remove:button', this.onRemoveButton)\r\n this.$on('toolbar:toggle', this.toggle)\r\n\r\n return this\r\n }\r\n\r\n removeListeners() {\r\n const buttons = this.attr('buttons') || []\r\n const $el = this.$el\r\n\r\n if (!buttons || buttons.length < 1) {\r\n return this\r\n }\r\n\r\n off($el, '.outline-toolbar__button', this.onExecute)\r\n\r\n this.$off('toolbar:update')\r\n this.$off('toolbar:add:button')\r\n this.$off('toolbar:remove:button')\r\n this.$off('toolbar:toggle')\r\n\r\n return this\r\n }\r\n}\r\n\r\nToolbar.DEFAULTS = (() => {\r\n const OPTIONS = {\r\n placement: 'ltr',\r\n closed: false,\r\n disabled: false,\r\n rounded: true,\r\n buttons: [],\r\n created: null,\r\n mounted: null,\r\n afterClosed: null,\r\n afterOpened: null,\r\n afterDisabled: null,\r\n afterEnabled: null,\r\n beforeDestroy: null,\r\n afterDestroy: null\r\n }\r\n\r\n return cloneDeep(OPTIONS)\r\n})()\r\n\r\nexport default Toolbar\r\n","import publish from './utils/observer/emit'\r\n\r\nclass Speech {\r\n constructor(options) {\r\n this.utterance = new SpeechSynthesisUtterance()\r\n\r\n if (options) {\r\n this.initialize(options)\r\n }\r\n }\r\n\r\n _initialize(options) {\r\n if (options.lang) {\r\n this.setLang(options.lang)\r\n }\r\n\r\n if (options.pitch) {\r\n this.setPitch(options.pitch)\r\n }\r\n\r\n if (options.rate) {\r\n this.setRate(options.rate)\r\n }\r\n\r\n if (options.text) {\r\n this.setText(options.text)\r\n }\r\n\r\n if (options.voice) {\r\n this.setVoice(options.voice)\r\n }\r\n\r\n if (options.volume) {\r\n this.setVolume(options.volume)\r\n }\r\n\r\n return this\r\n }\r\n\r\n initialize(options) {\r\n this._initialize(options)._addListeners()\r\n return this\r\n }\r\n\r\n isSpeaking() {\r\n return speechSynthesis.speaking\r\n }\r\n\r\n isPending() {\r\n return speechSynthesis.pending\r\n }\r\n\r\n isPaused() {\r\n return speechSynthesis.paused\r\n }\r\n\r\n getVoices() {\r\n return speechSynthesis.getVoices()\r\n }\r\n\r\n setLang(lang) {\r\n this.utterance.lang = lang\r\n return this\r\n }\r\n\r\n setPitch(pitch) {\r\n this.utterance.pitch = pitch\r\n return this\r\n }\r\n\r\n setRate(rate) {\r\n this.utterance.rate = rate\r\n return this\r\n }\r\n\r\n setText(text) {\r\n this.utterance.text = text\r\n return this\r\n }\r\n\r\n setVoice(voice) {\r\n this.utterance.voice = voice\r\n return this\r\n }\r\n\r\n setVolume(volume) {\r\n this.utterance.volume = volume\r\n return this\r\n }\r\n\r\n speak(text) {\r\n if (text) {\r\n this.setText(text)\r\n }\r\n\r\n speechSynthesis.speak(this.utterance)\r\n\r\n return this\r\n }\r\n\r\n pause() {\r\n speechSynthesis.pause()\r\n return this\r\n }\r\n\r\n resume() {\r\n speechSynthesis.resume()\r\n return this\r\n }\r\n\r\n cancel() {\r\n speechSynthesis.cancel()\r\n this.setText('')\r\n return this\r\n }\r\n\r\n _addListeners() {\r\n const UTTERANCE_EVENTS = [\r\n 'boundary',\r\n 'end',\r\n 'error',\r\n 'start',\r\n 'mark',\r\n 'pause',\r\n 'resume'\r\n ]\r\n const utterance = this.utterance\r\n const speech = this\r\n\r\n UTTERANCE_EVENTS.forEach((name) => {\r\n utterance[`on${name}`] = (event) => {\r\n publish(name, {\r\n event,\r\n speech\r\n })\r\n }\r\n })\r\n\r\n speechSynthesis.onvoiceschanged = (event) => {\r\n publish('voiceschanged', {\r\n event,\r\n speech\r\n })\r\n }\r\n\r\n return this\r\n }\r\n}\r\n\r\nSpeech.isSupport = (() => {\r\n return 'speechSynthesis' in window\r\n})()\r\n\r\nexport default Speech\r\n","import addClass from './utils/dom/addClass'\r\n\r\nconst _updateSiblingElements = (siblingElement, isPrev) => {\r\n let tagName\r\n let $sibling = siblingElement\r\n\r\n while ($sibling) {\r\n tagName = $sibling.tagName.toLowerCase()\r\n\r\n if (tagName !== 'script' && tagName !== 'style') {\r\n addClass($sibling, 'outline-reader_sibling')\r\n }\r\n\r\n if (isPrev) {\r\n $sibling = $sibling.previousElementSibling\r\n } else {\r\n $sibling = $sibling.nextElementSibling\r\n }\r\n }\r\n}\r\n\r\nexport default _updateSiblingElements\r\n","/**\r\n * 检测当前设备是否为移动设备\r\n * ========================================================================\r\n * @method isMobile\r\n * @return {boolean}\r\n */\r\nconst isMobile = () => {\r\n const ua = navigator.userAgent\r\n\r\n return /Mobile|mini|Fennec|Android|iP(ad|od|hone)|NokiaN[^/]*/.test(ua)\r\n}\r\n\r\nexport default isMobile\r\n","import cloneDeep from './utils/lang/cloneDeep'\r\nimport later from './utils/lang/later'\r\nimport isString from './utils/types/isString'\r\nimport isElement from './utils/types/isElement'\r\nimport isFunction from './utils/types/isFunction'\r\nimport createElement from './utils/dom/createElement'\r\nimport addClass from './utils/dom/addClass'\r\nimport removeClass from './utils/dom/removeClass'\r\nimport at from './utils/event/at'\r\nimport stop from './utils/event/stop'\r\nimport off from './utils/event/off'\r\n\r\nimport Base from './base'\r\nimport Message from './message'\r\nimport Toolbar from './toolbar'\r\nimport Speech from './speech'\r\n\r\nimport _updateSiblingElements from './_updateSiblingElements'\r\nimport isMobile from './utils/dom/isMobile'\r\n\r\nconst ENTER_READING_TIP = '进入阅读模式,按 ESC 键可退出阅读模式'\r\n\r\nclass Reader extends Base {\r\n constructor(options) {\r\n super()\r\n\r\n this._default()\r\n\r\n if (options) {\r\n this.initialize(options)\r\n }\r\n }\r\n\r\n _default() {\r\n this.attrs = cloneDeep(Reader.DEFAULTS)\r\n this.reading = false\r\n\r\n this.$target = null\r\n this.$el = null\r\n this.$paper = null\r\n this.$title = null\r\n this.$article = null\r\n this.$progress = null\r\n\r\n this.toolbar = null\r\n this.speech = null\r\n\r\n return this\r\n }\r\n\r\n initialize(options) {\r\n let target\r\n\r\n this.attr(options)\r\n\r\n target = this.attr('target')\r\n\r\n if (isString(target)) {\r\n this.$target = document.querySelector(target)\r\n } else if (isElement(target)) {\r\n this.$target = target\r\n }\r\n\r\n if (!this.$target) {\r\n return this\r\n }\r\n\r\n if (Speech.isSupport) {\r\n this.speech = new Speech()\r\n }\r\n\r\n this.render().addListeners()\r\n\r\n return this\r\n }\r\n\r\n isSpeaking() {\r\n return this?.speech?.isSpeaking()\r\n }\r\n\r\n render() {\r\n this._renderEdge()._paint(this.$target)\r\n return this\r\n }\r\n\r\n erase() {\r\n this.$article.innerHTML = ''\r\n return this\r\n }\r\n\r\n _paint($content) {\r\n const $fragment = document.createDocumentFragment()\r\n const $children = [...$content.cloneNode(true).children]\r\n\r\n later(() => {\r\n $children.forEach(($child) => {\r\n $fragment.appendChild($child)\r\n })\r\n\r\n this.$article.appendChild($fragment)\r\n })\r\n\r\n return this\r\n }\r\n\r\n _remove() {\r\n const $el = this.$el\r\n const toolbar = this.toolbar\r\n\r\n if ($el) {\r\n document.body.removeChild($el)\r\n }\r\n\r\n if (toolbar) {\r\n toolbar.destroy()\r\n }\r\n\r\n return this\r\n }\r\n\r\n refresh() {\r\n this.erase()._paint(this.$target)\r\n return this\r\n }\r\n\r\n _animateTimeline() {\r\n // eslint-disable-next-line\r\n if (!window.ScrollTimeline || !isMobile()) {\r\n return this\r\n }\r\n\r\n this.$progress.animate(\r\n {\r\n // from\r\n scale: ['0 1', '1 1']\r\n },\r\n {\r\n // eslint-disable-next-line\r\n timeline: new ScrollTimeline({\r\n source: this.$article,\r\n axis: 'block'\r\n })\r\n }\r\n )\r\n\r\n return this\r\n }\r\n\r\n _renderEdge() {\r\n const $target = this.$target\r\n const mobile = isMobile()\r\n const size = mobile ? 26 : 20\r\n let title = this.attr('title')\r\n let $el\r\n let $paper\r\n let $title\r\n let $article\r\n let $progress\r\n let $sibling\r\n\r\n $progress = createElement('div', {\r\n className: 'outline-reader__progress'\r\n })\r\n this.$progress = $progress\r\n\r\n $title = $target.querySelector('h1')\r\n\r\n if (isElement(title)) {\r\n $title = title\r\n }\r\n\r\n if (isElement($title)) {\r\n title = $title.innerText\r\n }\r\n\r\n $title = createElement(\r\n 'h1',\r\n {\r\n className: 'outline-reader__title'\r\n },\r\n title\r\n )\r\n this.$title = $title\r\n\r\n $article = createElement(\r\n 'article',\r\n {\r\n id: 'outline-reader__article',\r\n className: 'outline-reader__article'\r\n },\r\n isMobile() ? [] : [$progress.cloneNode()]\r\n )\r\n this.$article = $article\r\n\r\n $paper = createElement(\r\n 'div',\r\n {\r\n id: 'outline-reader__paper',\r\n className: 'outline-reader__paper'\r\n },\r\n [$title, $article]\r\n )\r\n this.$paper = $paper\r\n\r\n const buttons = []\r\n\r\n buttons.push({\r\n name: 'print',\r\n icon: 'print',\r\n size,\r\n action: {\r\n context: this,\r\n handler: this.print\r\n }\r\n })\r\n\r\n if (Speech.isSupport && this.attr('allowSpeak')) {\r\n buttons.push({\r\n name: 'speak',\r\n icon: 'sound',\r\n size,\r\n action: {\r\n context: this,\r\n handler: this.speak\r\n }\r\n })\r\n }\r\n\r\n buttons.push({\r\n name: 'exit',\r\n icon: 'close',\r\n size,\r\n action: {\r\n context: this,\r\n handler: this.exit\r\n }\r\n })\r\n\r\n this.toolbar = new Toolbar({\r\n placement: 'rtl',\r\n buttons\r\n })\r\n\r\n $el = createElement(\r\n 'section',\r\n {\r\n id: 'outline-reader',\r\n className: 'outline-reader outline-reader_hidden'\r\n },\r\n [$progress, $paper, this.toolbar.$el]\r\n )\r\n this.$el = $el\r\n\r\n document.body.appendChild($el)\r\n\r\n this._animateTimeline()\r\n\r\n later(() => {\r\n // 设置邻居节点的打印样式\r\n $sibling = $el.previousElementSibling\r\n _updateSiblingElements($sibling, true)\r\n\r\n $sibling = $el.nextElementSibling\r\n _updateSiblingElements($sibling)\r\n })\r\n\r\n return this\r\n }\r\n\r\n enter() {\r\n const READER = 'outline-reader'\r\n const READING = `${READER}--reading`\r\n const HIDDEN = `${READER}_hidden`\r\n const $el = this.$el\r\n const $siblings = document.querySelectorAll('.outline-reader_sibling')\r\n const enterReadingTip = this.attr('enterReadingTip') || ENTER_READING_TIP\r\n\r\n if (this.reading || !$el) {\r\n return this\r\n }\r\n\r\n $siblings.forEach(($sibling) => {\r\n addClass($sibling, HIDDEN)\r\n })\r\n addClass($el, READING)\r\n removeClass($el, HIDDEN)\r\n this.toolbar.show()\r\n this.reading = true\r\n\r\n Message.info({\r\n round: true,\r\n message: enterReadingTip\r\n })\r\n\r\n this.$emit('reader:enter')\r\n\r\n return this\r\n }\r\n\r\n exit() {\r\n const SPEAK = 'speak'\r\n const READER = 'outline-reader'\r\n const READING = `${READER}--reading`\r\n const HIDDEN = `${READER}_hidden`\r\n const $el = this.$el\r\n const $siblings = document.querySelectorAll('.outline-reader_sibling')\r\n const speech = this.speech\r\n const toolbar = this.toolbar\r\n\r\n if (!this.reading || !$el) {\r\n return this\r\n }\r\n\r\n addClass($el, HIDDEN)\r\n removeClass($el, READING)\r\n $siblings.forEach(($sibling) => {\r\n removeClass($sibling, HIDDEN)\r\n })\r\n toolbar.hide()\r\n this.reading = false\r\n\r\n if (speech) {\r\n if (toolbar.isHighlight(SPEAK)) {\r\n toolbar.highlight(SPEAK)\r\n }\r\n\r\n speech.cancel()\r\n }\r\n\r\n this.$emit('reader:exit')\r\n\r\n return this\r\n }\r\n\r\n toggle() {\r\n if (this.reading) {\r\n this.exit()\r\n } else {\r\n this.enter()\r\n }\r\n\r\n return this\r\n }\r\n\r\n speak() {\r\n const text = this.$article.innerText\r\n const speech = this.speech\r\n\r\n if (!Speech.isSupport || !speech) {\r\n return this\r\n }\r\n\r\n this.toolbar.highlight('speak')\r\n\r\n if (this.isSpeaking()) {\r\n speech.cancel()\r\n } else {\r\n speech.speak(text)\r\n }\r\n\r\n return this\r\n }\r\n\r\n print() {\r\n if (!isFunction(print)) {\r\n return this\r\n }\r\n\r\n print()\r\n\r\n return this\r\n }\r\n\r\n destroy() {\r\n const $el = this.$el\r\n\r\n if (!$el) {\r\n return this\r\n }\r\n\r\n this.removeListeners()._remove()._default()\r\n\r\n return this\r\n }\r\n\r\n onPrint() {\r\n this.print()\r\n return this\r\n }\r\n\r\n onEnterReading() {\r\n this.toggle()\r\n return this\r\n }\r\n\r\n onExitReading(evt) {\r\n const keyCode = evt.keyCode\r\n\r\n if (keyCode === 27 && this.reading) {\r\n this.toggle()\r\n stop(evt)\r\n }\r\n\r\n return this\r\n }\r\n\r\n onRefresh() {\r\n this.refresh()\r\n\r\n return this\r\n }\r\n\r\n addListeners() {\r\n const $el = this.$el\r\n\r\n if (!$el) {\r\n return this\r\n }\r\n\r\n at(document, 'keyup', this.onExitReading, this, true)\r\n\r\n this.$on('toolbar:action:print', this.onPrint)\r\n this.$on('toolbar:action:reading', this.onEnterReading)\r\n this.$on('reader:print', this.onPrint)\r\n this.$on('reader:refresh', this.onRefresh)\r\n this.$on('reader:enter', this.enter)\r\n this.$on('reader:exit', this.exit)\r\n this.$on('reader:toggle', this.toggle)\r\n\r\n return this\r\n }\r\n\r\n removeListeners() {\r\n const $el = this.$el\r\n\r\n if (!$el) {\r\n return this\r\n }\r\n\r\n off(document, 'keyup', this.onExitReading)\r\n\r\n this.$off('toolbar:action:print')\r\n this.$off('toolbar:action:reading')\r\n this.$off('reader:refresh')\r\n this.$off('reader:toggle')\r\n\r\n return this\r\n }\r\n}\r\n\r\nReader.DEFAULTS = (() => {\r\n const OPTIONS = {\r\n target: '',\r\n title: '',\r\n enterReadingTip: ENTER_READING_TIP,\r\n allowSpeak: false\r\n }\r\n\r\n return cloneDeep(OPTIONS)\r\n})()\r\n\r\nexport default Reader\r\n","import later from './utils/lang/later'\r\nimport cloneDeep from './utils/lang/cloneDeep'\r\nimport isFunction from './utils/types/isFunction'\r\nimport isString from './utils/types/isString'\r\nimport isElement from './utils/types/isElement'\r\nimport addClass from './utils/dom/addClass'\r\nimport scrollTo from './utils/dom/scrollTo'\r\nimport _getScrollElement from './utils/dom/_getScrollElement'\r\n\r\nimport getChapters from './getChapters'\r\n\r\nimport Base from './base'\r\nimport Anchors from './anchors'\r\nimport Drawer from './drawer'\r\nimport Navigator from './navigator'\r\nimport Reader from './reader'\r\nimport Toolbar from './toolbar'\r\n\r\nclass Outline extends Base {\r\n constructor(options) {\r\n super()\r\n\r\n this.version = '3.39.0'\r\n this._default()\r\n\r\n if (options) {\r\n this.initialize(options)\r\n }\r\n }\r\n\r\n _default() {\r\n const options = Outline.DEFAULTS\r\n\r\n this.attrs = cloneDeep(options)\r\n this.$article = null\r\n this.$scrollElement = null\r\n this.buttons = []\r\n\r\n this.anchors = null\r\n this.drawer = null\r\n this.navigator = null\r\n this.reader = null\r\n this.toolbar = null\r\n\r\n return this\r\n }\r\n\r\n initialize(options) {\r\n let articleElement = ''\r\n let scrollElement = ''\r\n let $article = null\r\n\r\n this.attr(options)\r\n\r\n articleElement = this.attr('articleElement')\r\n scrollElement = this.attr('scrollElement')\r\n\r\n if (isString(articleElement)) {\r\n $article = document.querySelector(articleElement)\r\n } else if (isElement(articleElement)) {\r\n $article = articleElement\r\n }\r\n this.$article = $article\r\n this.$scrollElement = _getScrollElement(scrollElement)\r\n\r\n this.$emit('created', { ...this.attr() })\r\n this.render().addListeners()\r\n\r\n return this\r\n }\r\n\r\n isExpanded() {\r\n const position = this.attr('position')\r\n const drawer = this.drawer\r\n const navigator = this.navigator\r\n const count = this.count()\r\n\r\n if (count < 0) {\r\n return false\r\n }\r\n\r\n if (position === 'relative') {\r\n return !drawer.isClosed()\r\n } else {\r\n return !navigator.isClosed()\r\n }\r\n }\r\n\r\n getChapters(isTreeStructured = false) {\r\n const articleElement = this.$article\r\n const selector = this.attr('selector')\r\n const showCode = this.attr('showCode')\r\n const chapterTextFilter = this.attr('chapterTextFilter')\r\n\r\n return getChapters({\r\n articleElement,\r\n selector,\r\n showCode,\r\n chapterTextFilter,\r\n isTreeStructured\r\n })\r\n }\r\n\r\n count() {\r\n return this.getChapters().length\r\n }\r\n\r\n render() {\r\n const hasToolbar = this.attr('hasToolbar')\r\n const $scrollElement = this.$scrollElement\r\n\r\n this._renderReader()._renderAnchors()._renderNavigator()._renderToolbar()\r\n\r\n if ($scrollElement && hasToolbar) {\r\n this.$emit('toolbar:update', {\r\n top: $scrollElement.scrollTop,\r\n min: 0,\r\n max: $scrollElement.scrollHeight\r\n })\r\n }\r\n\r\n this.$emit('mounted')\r\n\r\n return this\r\n }\r\n\r\n _renderReader() {\r\n const option = this.attr('reader')\r\n\r\n if (!option.target) {\r\n return this\r\n }\r\n\r\n addClass(this.$article, 'outline-article')\r\n\r\n this.reader = new Reader(option)\r\n\r\n return this\r\n }\r\n\r\n _renderAnchors() {\r\n const articleElement = this.attr('articleElement')\r\n const selector = this.attr('selector')\r\n const stickyHeight = this.attr('stickyHeight')\r\n const scrollElement = this.attr('scrollElement')\r\n const showCode = this.attr('showCode')\r\n const anchorURL = this.attr('anchorURL')\r\n const afterScroll = this.attr('afterScroll')\r\n const chapterTextFilter = this.attr('chapterTextFilter')\r\n const anchorLinkFilter = this.attr('anchorLinkFilter')\r\n\r\n this.anchors = new Anchors({\r\n articleElement,\r\n stickyHeight,\r\n scrollElement,\r\n selector,\r\n showCode,\r\n anchorURL,\r\n afterScroll,\r\n chapterTextFilter,\r\n anchorLinkFilter\r\n })\r\n\r\n return this\r\n }\r\n\r\n _renderNavigator() {\r\n const title = this.attr('title')\r\n const stickyHeight = this.attr('stickyHeight')\r\n const scrollElement = this.attr('scrollElement')\r\n const customClass = this.attr('customClass')\r\n const showCode = this.attr('showCode')\r\n const animationCurrent = this.attr('animationCurrent')\r\n const closeOnClickModal = this.attr('closeOnClickModal')\r\n const showNavModalFirst = this.attr('showNavModalFirst')\r\n const position = this.attr('position')\r\n const placement = this.attr('placement')\r\n const afterSticky = this.attr('afterSticky')\r\n const afterToggle = this.attr('afterToggle')\r\n const afterScroll = this.attr('afterScroll')\r\n const count = this.count()\r\n let parentElement = this.attr('parentElement')\r\n let OPTIONS\r\n\r\n if (count < 1) {\r\n return this\r\n }\r\n\r\n OPTIONS = {\r\n scrollElement,\r\n showCode,\r\n animationCurrent,\r\n position,\r\n title,\r\n stickyHeight,\r\n chapters: this.getChapters(),\r\n afterSticky,\r\n afterToggle,\r\n afterScroll\r\n }\r\n\r\n if (position === 'relative') {\r\n this.drawer = new Drawer({\r\n placement,\r\n title,\r\n size: 'tiny',\r\n hasOffset: true,\r\n hasPadding: false,\r\n closeOnClickModal,\r\n customClass,\r\n afterClosed: () => {\r\n const toolbar = this.toolbar\r\n toolbar.toggle()\r\n }\r\n })\r\n parentElement = this.drawer.$main\r\n\r\n if (showNavModalFirst) {\r\n this.drawer.open()\r\n }\r\n } else {\r\n OPTIONS.customClass = customClass\r\n }\r\n\r\n OPTIONS.parentElement = parentElement\r\n this.navigator = new Navigator(OPTIONS)\r\n\r\n return this\r\n }\r\n\r\n _renderToolbar() {\r\n const position = this.attr('position')\r\n const hasToolbar = this.attr('hasToolbar')\r\n const showNavModalFirst = this.attr('showNavModalFirst')\r\n const placement = this.attr('placement')\r\n const homepage = this.attr('homepage')\r\n const git = this.attr('git')\r\n const tags = this.attr('tags')\r\n const issues = this.attr('issues')\r\n const tools = this.attr('tools')\r\n const option = this.attr('reader')\r\n const count = this.count()\r\n const UP = {\r\n name: 'up',\r\n icon: 'up',\r\n size: 20,\r\n action: {\r\n context: this,\r\n handler: this.toTop\r\n }\r\n }\r\n const HOME = {\r\n name: 'homepage',\r\n icon: 'homepage',\r\n size: 20,\r\n link: homepage\r\n }\r\n const GIT = {\r\n name: 'github',\r\n icon: 'github',\r\n size: 20,\r\n link: git\r\n }\r\n const TAGS = {\r\n name: 'tags',\r\n icon: 'tags',\r\n size: 20,\r\n link: tags\r\n }\r\n const ISSUES = {\r\n name: 'issues',\r\n icon: 'issues',\r\n size: 20,\r\n link: issues\r\n }\r\n const MENU = {\r\n name: 'toggle',\r\n icon: 'menu',\r\n size: 18,\r\n action: {\r\n context: this,\r\n handler: this.toggle\r\n }\r\n }\r\n const READING = {\r\n name: 'reading',\r\n icon: 'file',\r\n size: 18,\r\n action: {\r\n context: this,\r\n handler: 'toolbar:action:reading'\r\n }\r\n }\r\n const PRINT = {\r\n name: 'print',\r\n icon: 'print',\r\n size: 20,\r\n action: {\r\n handler: 'toolbar:action:print'\r\n }\r\n }\r\n const DOWN = {\r\n name: 'down',\r\n icon: 'down',\r\n size: 20,\r\n action: {\r\n context: this,\r\n handler: this.toBottom\r\n }\r\n }\r\n const buttons = []\r\n\r\n if (!hasToolbar) {\r\n return this\r\n }\r\n\r\n buttons.push(UP)\r\n if (count > 0) {\r\n buttons.push(MENU)\r\n }\r\n if (homepage) {\r\n buttons.push(HOME)\r\n }\r\n if (git) {\r\n buttons.push(GIT)\r\n }\r\n if (tags) {\r\n buttons.push(TAGS)\r\n }\r\n if (issues) {\r\n buttons.push(ISSUES)\r\n }\r\n if (option.target) {\r\n buttons.push(READING)\r\n if (isFunction(print)) {\r\n buttons.push(PRINT)\r\n }\r\n }\r\n if (tools?.length > 0) {\r\n buttons.push(...tools)\r\n }\r\n buttons.push(DOWN)\r\n this.buttons = [...buttons]\r\n\r\n this.toolbar = new Toolbar({\r\n placement,\r\n buttons\r\n })\r\n\r\n if (position === 'relative' && showNavModalFirst) {\r\n this.toolbar.hide()\r\n }\r\n\r\n return this\r\n }\r\n\r\n refresh() {\r\n const chapters = this.getChapters()\r\n\r\n this.$emit('anchors:refresh', chapters)\r\n this.$emit('navigator:refresh', chapters)\r\n this.$emit('reader:refresh')\r\n\r\n this.$emit('refresh', chapters)\r\n\r\n return this\r\n }\r\n\r\n addButton(button) {\r\n const buttons = this.buttons\r\n\r\n buttons.splice(-1, 0, button)\r\n this.$emit('toolbar:add:button', buttons)\r\n\r\n return this\r\n }\r\n\r\n removeButton(name) {\r\n this.$emit('toolbar:remove:button', name)\r\n return this\r\n }\r\n\r\n toTop() {\r\n const afterScroll = this.attr('afterScroll')\r\n const toolbar = this.toolbar\r\n const navigator = this.navigator\r\n const count = this.count()\r\n const afterTop = () => {\r\n toolbar.hide('up')\r\n toolbar.show('down')\r\n\r\n if (count > 0) {\r\n navigator.highlight(0)\r\n navigator.playing = false\r\n scrollTo(navigator.$main, 0)\r\n }\r\n\r\n if (isFunction(afterScroll)) {\r\n afterScroll.call(toolbar, 'up')\r\n }\r\n }\r\n\r\n if (count > 0) {\r\n navigator.playing = true\r\n }\r\n this.scrollTo(0, afterTop)\r\n\r\n return this\r\n }\r\n\r\n toBottom() {\r\n const afterScroll = this.attr('afterScroll')\r\n const $scrollElement = this.$scrollElement\r\n const toolbar = this.toolbar\r\n const navigator = this.navigator\r\n const count = this.count()\r\n const top = Math.floor(\r\n $scrollElement.scrollHeight - $scrollElement.clientHeight\r\n )\r\n const afterDown = () => {\r\n const $main = navigator.$main\r\n toolbar.hide('down')\r\n toolbar.show('up')\r\n\r\n if (count > 0) {\r\n navigator.highlight(count - 1)\r\n scrollTo($main, $main.scrollHeight)\r\n navigator.playing = false\r\n }\r\n\r\n if (isFunction(afterScroll)) {\r\n afterScroll.call(toolbar, 'bottom')\r\n }\r\n }\r\n\r\n if (count > 0) {\r\n navigator.playing = true\r\n }\r\n\r\n this.scrollTo(top, afterDown)\r\n\r\n return this\r\n }\r\n\r\n scrollTo(top, afterScroll) {\r\n scrollTo(this.$scrollElement, top, afterScroll)\r\n return this\r\n }\r\n\r\n enterReading() {\r\n this.$emit('toolbar:toggle')\r\n this.$emit('reader:enter')\r\n\r\n return this\r\n }\r\n\r\n exitReading() {\r\n this.$emit('toolbar:toggle')\r\n this.$emit('reader:exit')\r\n\r\n return this\r\n }\r\n\r\n switchReading() {\r\n this.$emit('toolbar:toggle')\r\n this.$emit('reader:toggle')\r\n\r\n return this\r\n }\r\n\r\n expand() {\r\n const position = this.attr('position')\r\n const toolbar = this.toolbar\r\n const drawer = this.drawer\r\n const navigator = this.navigator\r\n const count = this.count()\r\n\r\n if (count < 1) {\r\n return this\r\n }\r\n\r\n if (position !== 'relative') {\r\n navigator.show()\r\n toolbar.highlight('toggle')\r\n } else {\r\n toolbar.hide()\r\n\r\n later(() => {\r\n drawer.open()\r\n })\r\n }\r\n\r\n return this\r\n }\r\n\r\n collapses() {\r\n const position = this.attr('position')\r\n const toolbar = this.toolbar\r\n const drawer = this.drawer\r\n const navigator = this.navigator\r\n const count = this.count()\r\n\r\n if (count < 1) {\r\n return this\r\n }\r\n\r\n if (position !== 'relative') {\r\n navigator.hide()\r\n toolbar.highlight('toggle')\r\n } else {\r\n toolbar.show()\r\n\r\n later(() => {\r\n drawer.close()\r\n })\r\n }\r\n\r\n return this\r\n }\r\n\r\n toggle() {\r\n if (this.isExpanded()) {\r\n this.collapses()\r\n } else {\r\n this.expand()\r\n }\r\n\r\n return this\r\n }\r\n\r\n print() {\r\n this.$emit('reader:print')\r\n\r\n return this\r\n }\r\n\r\n _destroy() {\r\n const count = this.count()\r\n let anchors = this.anchors\r\n let navigator = this.navigator\r\n let drawer = this.drawer\r\n let reader = this.reader\r\n let toolbar = this.toolbar\r\n let isOutside = false\r\n\r\n this.removeListeners()\r\n\r\n if (reader) {\r\n reader.destroy()\r\n }\r\n\r\n if (count > 0 && navigator) {\r\n isOutside = navigator.isOutside()\r\n\r\n navigator.destroy()\r\n\r\n if (isOutside && drawer) {\r\n drawer.destroy()\r\n }\r\n }\r\n\r\n if (anchors) {\r\n anchors.destroy()\r\n }\r\n\r\n if (toolbar) {\r\n toolbar.destroy()\r\n }\r\n\r\n return this\r\n }\r\n\r\n destroy() {\r\n this.$emit('beforeDestroy')\r\n\r\n this._destroy()._default()\r\n\r\n this.$emit('destroyed')\r\n\r\n return this\r\n }\r\n\r\n addListeners() {\r\n const hasToolbar = this.attr('hasToolbar')\r\n\r\n if (!hasToolbar) {\r\n return this\r\n }\r\n\r\n this.$on('toolbar:update', this.onToolbarUpdate)\r\n\r\n return this\r\n }\r\n\r\n removeListeners() {\r\n const hasToolbar = this.attr('hasToolbar')\r\n\r\n if (!hasToolbar) {\r\n return this\r\n }\r\n\r\n this.$off('toolbar:update')\r\n\r\n return this\r\n }\r\n}\r\n\r\nOutline.DEFAULTS = (() => {\r\n const OPTIONS = {\r\n articleElement: '#article',\r\n selector: 'h2,h3,h4,h5,h6',\r\n parentElement: '#aside',\r\n scrollElement: 'html,body',\r\n title: '目录',\r\n position: 'relative',\r\n placement: 'rtl',\r\n animationCurrent: true,\r\n showCode: false,\r\n hasToolbar: true,\r\n closeOnClickModal: true,\r\n showNavModalFirst: false,\r\n anchorURL: '',\r\n stickyHeight: 0,\r\n homepage: '',\r\n git: '',\r\n tags: '',\r\n issues: '',\r\n tools: [],\r\n reader: {\r\n target: '',\r\n title: '',\r\n enterReadingTip: '进入阅读模式,按 ESC 键可退出阅读模式',\r\n allowSpeak: false\r\n },\r\n customClass: '',\r\n afterSticky: null,\r\n afterToggle: null,\r\n afterScroll: null,\r\n chapterTextFilter: null,\r\n anchorLinkFilter: null\r\n }\r\n\r\n return cloneDeep(OPTIONS)\r\n})()\r\n\r\nif (window?.jQuery) {\r\n const $ = window.jQuery\r\n\r\n // 将 Outline 扩展为一个 jquery 插件\r\n // eslint-disable-next-line no-undef\r\n $.extend($.fn, {\r\n outline: function (options) {\r\n // eslint-disable-next-line no-undef\r\n let $article = $(this)\r\n\r\n return new Outline(\r\n // eslint-disable-next-line no-undef\r\n $.extend({}, options, {\r\n articleElement: $article\r\n })\r\n )\r\n }\r\n })\r\n}\r\n\r\nexport default Outline\r\n"],"names":["toString","val","Object","prototype","apply","isFunction","later","fn","delay","setTimeout","isObject","o","isArray","Array","cloneDeep","obj","clone","from","assign","keys","forEach","key","isString","str","isElement","nodeName","tagName","nodeType","hasClass","el","className","pattern","RegExp","allClass","classList","contains","exec","addClass","_classList","add","indexOf","split","name","length","easeInQuad","x","_getScrollElement","scrollElement","$rootElements","$scrollElement","document","querySelector","querySelectorAll","scrollTop","scrollTo","top","afterStop","step","distance","MAX_HEIGHT","scrollHeight","MAX_TOP","stop","play","console","log","requestAnimationFrame","trim","replace","getChaptersByHeadings","headings","showCode","chapterTextFilter","chapters","previous","level","text","heading","i","headingLevel","current","parseInt","pid","_getChapterParentIdByDiffer","differ","index","innerHTML","push","id","rel","groups","group","JSON","stringify","cb","code","String","c","subjects","_getChaptersWithCode","getChapters","options","articleElement","selector","isTreeStructured","$article","$headings","filter","_maybeArrayLike","_toConsumableArray","toTree","list","nodeKey","parentKey","map","roots","item","children","node","hasOwn","prop","hasOwnProperty","call","extend","origin","source","_subscribers","_hasDirectSubscribersFor","topic","has","isDirect","found","position","lastIndexOf","substring","_hasSubscribers","emit","data","async","execute","subscriber","message","callback","context","deliver","guid","uuid","prefix","_removeSubscriber","off","token","subject","execution","j","splice","_removeSubscriberByToken","Base","constructor","this","attrs","initialize","attr","render","addListeners","value","arguments","refresh","destroy","removeListeners","reload","$emit","event","publish","$on","on","handler","subscribe","$off","unsubscribe","queue","isHandling","done","runIdle","idleDeadline","timeRemaining","shift","requestIdleCallback","window","start","Date","now","didTimeout","Math","max","cancelIdleCallback","clearTimeout","timeSlice","afterComplete","offsetTop","offsetParent","matches","sel","msMatchesSelector","getParentOrHost","host","parentNode","CAPTURE_EVENTS","_off","type","capture","_delegateListener","listeners","_listeners","listener","_delete","removeEventListener","purgeElement","recurse","$element","$children","childNodes","getListeners","$child","once","evt","target","getTarget","delegateTarget","closest","ctx","includeCTX","startsWith","overrideContext","addEventListener","stopPropagation","preventDefault","SYMBOLS","getSymbols","iconSet","getSymbol","patternName","patternSet","find","symbol","fullName","paint","$body","body","$icons","symbols","join","createElement","insertBefore","firstChild","isDOM","isHTMLCollection","fragment","isTextNode","setAttribute","toLowerCase","style","cssText","innerText","setAttributes","$fragment","createDocumentFragment","$el","isValidChild","child","append","createTextNode","appendChild","every","ICON","size","color","width","height","defaultRules","cssRules","$icon","$svg","binds","svg","test","isSVG","xmlns","class","icon","removeClass","remove","_removeHeading","$heading","hasAnchor","isAtStart","CLS_HEADING","$anchor","removeAttribute","removeChild","Anchors","super","_default","DEFAULTS","$articleElement","created","getHeadings","count","mounted","_paint","erase","_remove","LIMIT","anchorURL","anchorLinkFilter","update","chapterCode","_updateHeading","headingId","url","href","groupIndex","after","beforeDestroy","afterDestroy","onAnchorTrigger","afterScroll","stickyHeight","clientHeight","min","onRefresh","TAGS","isHTML","html","basic","full","slice","tag","stripScripts","setProperty","documentElement","zIndex","idx","Drawer","title","closed","$modal","$header","$title","$close","$main","$footer","$overlay","setTitle","isClosed","placement","hasClose","hasOverlay","hasOffset","hasPadding","autoHeight","overflow","customClass","mainClassName","content","$content","strHTML","template","open","opened","close","toggle","afterToggle","onClose","closeOnClickModal","afterClosed","afterOpened","at","getStyle","ruleName","getComputedStyle","HIDDEN","EXPANDED","FOLDED","Navigator","scrollTimer","resizeTimer","observerTimer","Observer","$list","$placeholder","$parentElement","$active","active","offsetWidth","playing","parentElement","$parent","isSticky","isFixed","isInside","isOutside","_paintEdge","animationCurrent","contents","calculateStickyHeight","highlight","sticky","onObserver","_paintChapters","clones","parts","byId","chapter","$text","$link","$code","$li","$subject","$chapter","_getPlaceholderOffset","mainPaddingTop","mainBorderTop","placeholderPaddingTop","placeholderMarginTop","placeholderBorderTop","offsetHeight","positionPlaceholder","ACTIVE","HIGHLIGHT","placeholderOffsetTop","getAttribute","inBounding","parent","parentRect","childRect","isInBounding","getBoundingClientRect","right","bottom","left","afterSticky","FIXED","isStickying","innerHeight","show","hide","intersection","props","root","rootMargin","IntersectionObserver","entries","entry","intersectionRatio","$root","section","observe","onSelect","onScroll","onResize","unobserve","isPlainObject","getPrototypeOf","proto","isObjectLike","encodeHTML","CHARTS","instances","instance","Message","visible","offset","timer","destroyed","_objectSpread","isDestroyed","_getClassName","effect","round","closable","dangerouslyUseHTMLString","$type","$message","iconSize","_refreshIcon","iconName","$use","_refreshMessage","_refreshClose","_refreshEl","clearTimer","startTimer","duration","destroyAfterClosed","beforeClose","onMouseEnter","onMouseLeave","config","len","dom","clear","Command","action","Commands","commands","get","cmd","command","del","_createButton","button","rounded","link","$button","disabled","DISABLED","Toolbar","buttons","isHighlight","isDisabled","isExist","_getCommand","_self","bind","disable","_add","_disable","_enable","enable","enabled","onExecute","_updateToolbar","ceil","onToolbarUpdate","onAddButton","onRemoveButton","afterDisabled","afterEnabled","Speech","utterance","SpeechSynthesisUtterance","_initialize","lang","setLang","pitch","setPitch","rate","setRate","setText","voice","setVoice","volume","setVolume","_addListeners","isSpeaking","speechSynthesis","speaking","isPending","pending","isPaused","paused","getVoices","speak","pause","resume","cancel","speech","onvoiceschanged","isSupport","_updateSiblingElements","siblingElement","isPrev","$sibling","previousElementSibling","nextElementSibling","isMobile","ua","navigator","userAgent","ENTER_READING_TIP","Reader","reading","$target","$paper","$progress","toolbar","_this$speech","_renderEdge","cloneNode","_animateTimeline","ScrollTimeline","animate","scale","timeline","axis","print","exit","enter","READER","READING","$siblings","enterReadingTip","info","SPEAK","onPrint","onEnterReading","onExitReading","keyCode","allowSpeak","Outline","version","anchors","drawer","reader","isExpanded","hasToolbar","_renderReader","_renderAnchors","_renderNavigator","_renderToolbar","option","showNavModalFirst","OPTIONS","homepage","git","tags","issues","tools","UP","toTop","HOME","GIT","ISSUES","MENU","PRINT","DOWN","toBottom","concat","addButton","removeButton","afterTop","floor","afterDown","enterReading","exitReading","switchReading","expand","collapses","_destroy","_window","jQuery","$","outline"],"mappings":"qkEAOA,MAAMA,EAAYC,GACTC,OAAOC,UAAUH,SAASI,MAAMH,GCCnCI,EAAcJ,GACI,mBAARA,GAAwC,sBAAlBD,EAASC,GCAzCK,EAAQA,CAACC,EAAIC,EAAQ,QACpBH,EAAWE,IAITE,YAAW,KAChBF,GAAI,GACHC,GCPCE,EAAYC,IAEG,oBAAhBX,EAASW,IACK,iBAANA,GACPN,EAAWM,KACP,OAANA,ECNEC,EAAWD,GACXE,MAAMD,QACDC,MAAMD,QAAQD,GAEE,mBAAhBX,EAASW,GCCdG,EAAaC,IACjB,IAAIC,EAAQ,CAAA,EAEZ,OAAY,OAARD,EACK,MAGLH,EAAQG,GACVC,EAAQH,MAAMI,KAAKF,IAEnBC,EAAQd,OAAOgB,OAAO,CAAE,EAAEH,GAC1Bb,OAAOiB,KAAKH,GAAOI,SAASC,GAClBL,EAAMK,GAAOX,EAASK,EAAIM,IAAQP,EAAUC,EAAIM,IAAQN,EAAIM,MAIjEL,EAAK,ECvBRM,EAAYC,GACM,iBAARA,ECCVC,EAAab,MACPD,EAASC,IAAMA,EAAEc,UAAYd,EAAEe,SAA0B,IAAff,EAAEgB,UCDlDC,EAAWA,CAACC,EAAIC,KACpB,MAAMC,EAAU,IAAIC,OAAO,UAAYF,EAAY,WACnD,IAAIG,EACAC,EAEJ,QAAKV,EAAUK,KAIfI,EAAWJ,EAAGC,YAETG,IAILC,EAAYL,EAAGK,UAEXA,GAAaA,EAAUC,SAClBN,EAAGK,UAAUC,SAASL,KAGtBC,EAAQK,KAAKH,IAAS,ECpB3BI,EAAWA,CAACR,EAAIC,KAAc,IAAAQ,EAClC,IAAIJ,EACAD,EAEJ,GAAIL,EAASC,EAAIC,GACf,OAAO,EAGTI,EAAYL,EAAGK,UAEF,QAAbI,EAAIJ,SAAAI,IAASA,GAATA,EAAWC,IACTT,EAAUU,QAAQ,MAAQ,EAC5BV,EAAUW,MAAM,KAAKrB,SAASsB,IAC5BR,EAAUK,IAAIG,EAAK,IAGrBR,EAAUK,IAAIT,IAGhBG,EAAWJ,EAAGC,UACdG,GAAYA,EAASU,OAAS,EAAI,IAAMb,EAAYA,EACpDD,EAAGC,UAAYG,EACjB,ECzBIW,EAAcC,GACXA,EAAIA,ECGPC,EAAoBA,CAACC,EAAgB,QACzC,IAAIC,EACAC,EAgBJ,OAdKF,EAOCzB,EAASyB,GACXE,EAAiBC,SAASC,cAAcJ,GAC/BvB,EAAUuB,KACnBE,EAAiBF,IATnBC,EAAgBE,SAASE,iBAAiB,aAC1CH,EACED,EAAc,GAAGK,UAAYL,EAAc,GAAGK,WAAa,EACvDL,EAAc,GACdA,EAAc,IASfC,CAAc,ECjBjBK,EAAWA,CAACP,EAAeQ,EAAKC,KACpC,MAAMP,EAAiBH,EAAkBC,GACzC,IAAIM,EAAYJ,EAAeI,UAC3BI,EAAO,EACX,MAAMC,EAAWH,EAAMF,EACjBM,EAAaV,EAAeW,aAC5BC,EAAUN,EAAMI,GAAc,EAAIJ,EAAMI,EACxCG,EAAQP,IACRlD,EAAWmD,IACbA,EAAUD,IAGL,GAEHQ,EAAOA,KAIX,GAHAN,GAAQ,EAGJC,EAAW,GAYb,GAXAL,GAAaT,EAAWa,GACxBR,EAAeI,UAAYA,EAE3BW,QAAQC,IACN,oBACAlB,EACAE,EACAI,EACAJ,EAAeI,WAGbA,GAAaE,EAEf,OADAN,EAAeI,UAAYE,EACpBO,EAAKP,QAcd,GAXAF,GAAaT,EAAWa,GACxBR,EAAeI,UAAYA,EAE3BW,QAAQC,IACN,sBACAlB,EACAE,EACAI,EACAJ,EAAeI,WAGbA,GAAaQ,EAEf,OADAZ,EAAeI,UAAYQ,EACpBC,EAAKD,GAKhBK,sBAAsBH,EAAK,EAI7BG,sBAAsBH,EAAK,EC5DvBI,EAAQ5C,KACPD,EAASC,IAGPA,EAAI6C,QAAQ,iBAAkB,ICGjCC,EAAwBA,CAC5BC,EACAC,GAAW,EACXC,EAAoB,QAEpB,MAAMzC,EAAU,wBACV0C,EAAW,GACjB,IAAIC,EAAW,EACXC,EAAQ,EACRC,EAAO,GAoFX,OAlFAN,EAASlD,SAAQ,CAACyD,EAASC,KACzB,MAAMpD,EAAUmD,EAAQnD,QAClBqD,EAAerD,EAAQ0C,QAAQ,KAAM,IAC3C,IAAIY,EAAUC,SAASF,EAAc,IACjCG,GAAO,ECtBI3D,MD4BXyD,EAAUN,GACZC,GAAS,EAIPO,EADY,IAAVP,GACK,EAEDG,EAAI,GAWLE,IAAYN,GAAaM,EAAUN,GAAYM,EAAUL,EAEhD,IAAZK,GACFL,EAAQ,EACRO,GAAO,GAEPA,EAAMT,EAASK,EAAI,GAAGI,IAIjBF,GAAWL,IAEF,IAAZK,EACFL,EAAQ,GAERA,GAAiBD,EAAWM,EAExBL,GAAS,IACXA,EAAQ,IAMVO,EADY,IAAVP,GACK,EE/EqBQ,EAACV,EAAUW,EAAQC,KACrD,IACIH,EACAJ,EAFAJ,EAAWD,EAASY,EAAQ,GAIhC,IAAKP,EAAI,EAAGA,EAAIM,EAAQN,GAAK,EAC3BI,EAAMR,EAASQ,IACfR,EAAWD,EAASS,GAKtB,OAFAA,EAAMR,EAASQ,IAERA,CAAG,EFsEEC,CAA4BV,EAAUC,EAAWM,EAASF,IAIpEJ,EAAWM,EAEXJ,EAAOT,GC/EQ5C,ED+EOsD,EAAQS,UC9E3BhE,EAASC,GAGPA,EAAI6C,QAAQ,kBAAmB,IAF7B,KDgFHG,IACFK,EAAOT,EAAKS,EAAKR,QAAQrC,EAAS,MAGhC1B,EAAWmE,KACbI,EAAOJ,EAAkBI,IAG3BH,EAASc,KAAK,CACZC,GAAIV,EACJI,IAAKA,EACLP,MAAOA,EACPc,IAAK,WAAWX,IAChBF,OACAlD,WACA,IAGG6C,EG3GqBE,KAC5B,MAAMiB,EAAS,CAAA,EAgCf,OA3BAjB,EAASrD,SAAST,IAChB,MAAMgF,EAAQC,KAAKC,UALTlF,IACH,CAACA,EAAEuE,KAImBY,CAAGnF,IAEhC+E,EAAOC,GAASD,EAAOC,IAAU,GACjCD,EAAOC,GAAOJ,KAAK5E,GAEnBA,EAAE0E,MAAQK,EAAOC,GAAOhD,QAET,IAAXhC,EAAEuE,MACJvE,EAAEoF,KAAOC,OAAOrF,EAAE0E,OACpB,IAGFnF,OAAOiB,KAAKuE,GAAQtE,SAASuE,IAC3BD,EAAOC,GAAOvE,SAAS6E,IACrB,MAAMC,EAAWR,EAAO,IAAIO,EAAET,OAE9B,IAAKU,IAAatF,EAAQsF,GACxB,OAAO,EAGTA,EAAS9E,SAAST,IAChBA,EAAEoF,KAAOE,EAAEF,KAAO,IAAMpF,EAAE0E,KAAK,GAC/B,GACF,IAGGZ,CAAQ,EH0EG0B,CAAqB1B,GAAYA,CAAQ,EI5FvD2B,EAAeC,IACnB,MAAMC,eACJA,EAAcC,SACdA,EAAQhC,SACRA,EAAQC,kBACRA,EAAiBgC,iBACjBA,GACEH,EACJ,IAAII,EAAWvD,SAASC,cAAc,YAClCuD,EAAY,GACZjC,EAAW,GACXkC,EAAS,KAQb,OANIrF,EAASgF,GACXG,EAAWvD,SAASC,cAAcmD,GACzB9E,EAAU8E,KACnBG,EAAWH,GAGRG,GAIDpG,EAAWmE,GACbmC,EAASnC,GAEiB,IAAtBA,IACFmC,EAAU/B,GACDA,EAAKR,QAAQ,UAAW,OAKrCsC,EAASE,EAAAC,EAAOJ,EAASrD,iBAAiBmD,GAAY,sBACtD9B,EAAWJ,EAAsBqC,EAAWnC,EAAUoC,IAE1B,IAArBH,ECrDMM,EAACC,EAAMC,EAASC,KAC7B,MAAMC,EAAM,CAAA,EACNC,EAAQ,GAoBd,OAlBAJ,EAAK3F,SAAQ,CAACgG,EAAMtC,KAElBoC,EAAIE,EAAKJ,IAAYlC,EAErBsC,EAAKC,SAAW,EAAE,IAGpBN,EAAK3F,SAASgG,IACZ,MAAME,EAAOP,EAAKG,EAAIE,EAAKH,MAEF,IAArBG,EAAKH,GAEPK,EAAKD,SAAS9B,KAAK6B,GAEnBD,EAAM5B,KAAK6B,EACb,IAGKD,CAAK,ED+BuBL,CAAOrC,EAAU,KAAM,OAASA,GAhB1DA,CAgBkE,EE7CvE8C,EAASA,CAACxG,EAAKyG,KACnB,MAAMC,EAAiBvH,OAAOC,UAAUsH,eACxC,OAAO1G,GAAO0G,EAAeC,KAAK3G,EAAKyG,EAAK,ECDxCG,EAASA,CAACC,EAAQC,KACT3H,OAAOiB,KAAK0G,GAEpBzG,SAASoG,IACRD,EAAOM,EAAQL,KACjBI,EAAOJ,GAAQK,EAAOL,GACxB,GACA,ECVEM,EAAe,CAAE,ECIjBC,EAA4BC,GACzBT,EAAOO,EAAcE,IAAUF,EAAaE,GAAOrF,OAAS,ECA/DsF,EAAMA,CAACD,EAAOE,GAAW,IACtBA,EAAWH,EAAyBC,GCHpBA,KACvB,IAAIG,EAAQJ,EAAyBC,GACjCI,EAAWJ,EAAMK,YAAY,KAEjC,MAAQF,IAAuB,IAAdC,GAEfA,GADAJ,EAAQA,EAAMM,UAAU,EAAGF,IACVC,YAAY,KAC7BF,EAAQJ,EAAyBC,GAGnC,OAAOG,CAAK,EDPwCI,CAAgBP,GEGhEQ,EAAOA,CAACR,EAAOS,EAAMC,GAAQ,KACjC,MAAMC,EAAWX,IACf,IAAKD,EAAyBC,GAC5B,OAAO,EAGTF,EAAaE,GAAO5G,SAASwH,IAG3B,MAAMC,EChBI,CACZ,qBACA,sBACA,6BACA,sBACA,uBACA,sBACA,uBACA,wBACA,wBACA,yBACA,2BAGWrG,QAAQxC,EDEYyI,KCFM,EDEEA,EAAKzI,WAAayI,EAEvDG,EAAWE,SAASpB,KAAKkB,EAAWG,SAAWH,EAAYC,EAAQ,GACnE,EAEEG,EAAUA,KACd,IAAIJ,EAAaZ,EACbI,EAAWJ,EAAMK,YAAY,KAEjC,MAAqB,IAAdD,GACLQ,EAAaA,EAAWN,UAAU,EAAGF,GACrCA,EAAWQ,EAAWP,YAAY,KAElCM,EAAQC,GAIVD,EAAQX,GAERW,EAAQ,IAAI,EAGd,IAAKV,EAAID,GACP,OAAO,EAGLU,EACFjI,WAAWuI,EAAS,IAEpBA,GACF,EE/CIC,EAAO,MACX,IAAIC,EAAO,EAEX,OAAQC,IACND,GAAQ,EAEDC,EAASA,EAAS,IAAMD,EAAO,QAAUA,EAEnD,EARY,GCGPE,EAAqBpB,IACzB,IAAKT,EAAOO,EAAcE,GACxB,OAAO,SAGFF,EAAaE,EAAM,ECJtBqB,EAAMA,CAACrB,EAAOsB,KAClB,IAAKrB,EAAID,GACP,OAAO,EAGLsB,ECL4BA,KAChC,MAAMnI,EAAOjB,OAAOiB,KAAK2G,GAGzB,IAAKwB,GAASnI,EAAKwB,OAAS,EAC1B,OAAO,EAGTxB,EAAKC,SAASmI,IACZ,MAAMX,EAAad,EAAayB,GAChC,IAAIvB,EAEJY,EAAWxH,SAAQ,CAACoI,EAAWC,KACzBD,EAAUV,WAAaQ,GAASE,EAAUF,QAAUA,IACtDtB,EAAQwB,EAAUxB,MAClBY,EAAWc,QAbL,EAamBD,GAC3B,IAIEb,EAAWjG,OAAS,GACtByG,EAAkBpB,EACpB,GACA,EDjBA2B,CAAyBL,GAEzBF,EAAkBpB,EACpB,EEZF,MAAM4B,EACJC,WAAAA,CAAYxD,GACVyD,KAAKC,MAAQ,GAET1D,GACFyD,KAAKE,WAAW3D,EAEpB,CAEA2D,UAAAA,CAAW3D,GAET,OADAyD,KAAKG,KAAK5D,GAAS6D,SAASC,eACrBL,IACT,CAEAG,IAAAA,CAAKzC,EAAM4C,GACT,MAAML,EAAQD,KAAKC,MAEnB,OAAIzI,EAASkG,GAEP4C,GAAS7C,EAAOwC,EAAOvC,IAEzBuC,EAAMvC,GAAQ4C,EACPN,MAIFC,EAAMvC,GACJ9G,EAAS8G,IAElBG,EAAOoC,EAAOvC,GAEPsC,MACuB,IAArBO,UAAU1H,OAEZoH,EAGFD,IACT,CAEAI,MAAAA,GACE,OAAOJ,IACT,CAEAQ,OAAAA,GACE,OAAOR,IACT,CAEAS,OAAAA,GAEE,OADAT,KAAKU,kBACEV,IACT,CAEAW,MAAAA,CAAOpE,GACL,IAAI0D,EAAQD,KAAKG,OAQjB,OANI5D,IACF0D,EAAQD,KAAKG,KAAK5D,IAGpByD,KAAKS,UAAUP,WAAWD,GAEnBD,IACT,CAEAY,KAAAA,CAAMC,EAAOlC,GAEX,OADAmC,EAAQD,EAAOlC,GACRqB,IACT,CAEAe,GAAAA,CAAIF,EAAO7B,GAET,MCnEOgC,EAAC9C,EAAO+C,EAAShC,EAAU,QACpC,MAAMO,EAAQL,IACd,IAAIM,EAA2B,iBAAVvB,EAAqBA,EAAMhI,WAAagI,EAExD3H,EAAW0K,KAKXjD,EAAayB,KAChBzB,EAAayB,GAAW,IAG1BzB,EAAayB,GAAShE,KAAK,CACzByC,MAAOuB,EACPT,SAAUiC,EACVhC,UACAO,UAGU,ED8CV0B,CAAUL,EAAO7B,EAAUgB,MACpBA,IACT,CAEAmB,IAAAA,CAAKN,EAAO7B,GAEV,OADAoC,EAAYP,EAAO7B,GACZgB,IACT,CAEAK,YAAAA,GACE,OAAOL,IACT,CAEAU,eAAAA,GACE,OAAOV,IACT,EErFF,MAAMqB,EAAQ,GACd,IAAIC,EACAC,EAqBJ,SAASC,EAAQC,GACf,KAAOA,EAAaC,gBAAkB,GAAKL,EAAMxI,QAAQ,CACvD,MAAMpC,EAAK4K,EAAMM,QAEjB,IAAKpL,EAAWE,GACd,OAAO,EAGTA,GACF,CAEI4K,EAAMxI,OACRyI,EAAaM,oBAAoBJ,IAEjCF,EAAa,EAET/K,EAAWgL,KACbA,IACAA,EAAO,MAGb,MAvC0C,IAA/BM,OAAOD,sBAChBC,OAAOD,oBAAsB,SAAU5F,GACrC,MAAM8F,EAAQC,KAAKC,MACnB,OAAOxL,GAAM,WACXwF,EAAG,CACDiG,YAAY,EACZP,cAAe,WACb,OAAOQ,KAAKC,IAAI,EAAG,IAAMJ,KAAKC,MAAQF,GACxC,GAEH,GAAE,KAGLD,OAAOO,mBAAqB,SAAU1G,GACpC2G,aAAa3G,KAmCjB,MAAM4G,EAAYA,CAAC7L,EAAI8L,EAAgB,QACrClB,EAAM5F,KAAKhF,GAEPF,EAAWgM,KACbhB,EAAOgB,GAGJjB,GACHM,oBAAoBJ,EACtB,ECjEIgB,EAAazK,IACjB,IAAI0B,EAAM1B,EAAGyK,UAMb,OAJwB,OAApBzK,EAAG0K,eACLhJ,GAAO+I,EAAUzK,EAAG0K,eAGfhJ,CAAG,ECDNiJ,EAAUA,CAAC3K,EAAI0E,EAAW,MAC9B,MAAMkG,EAAMlG,EAASnC,QAAQ,MAAO,IAEpC,SAAKmC,GAAakG,GAAQ5K,KAKtBA,EAAG2K,QACE3K,EAAG2K,QAAQC,KACT5K,EAAG6K,mBACL7K,EAAG6K,kBAAkBD,GAG9B,ECpBIE,EAAmB9K,GAChBA,EAAG+K,MAAQ/K,IAAOqB,UAAYrB,EAAG+K,KAAKjL,SACzCE,EAAG+K,KACH/K,EAAGgL,WCVIC,EAAiB,CAC5B,WACA,OACA,UACA,QACA,OACA,SACA,aACA,cCMIC,EAAOA,CAAClL,EAAImL,EAAMzM,KACtB,MAAM0M,EAAUH,EAAetK,QAAQwK,IAAS,EAG5CzM,EAAG2M,0BACL3M,EAAKA,EAAG2M,mBACEA,kBCZE,SAAUrL,EAAImL,EAAMzM,GAClC,MAAM4M,EAAYtL,EAAGuL,WACrB,IAAI/H,GAAS,EAEb,GAAI8H,EAAUxK,OAAS,EACrB,OAAO,EAITwK,EAAU/L,SAAQ,CAACiM,EAAUvI,KAC3B,MAAMiG,EAAUsC,EAAS9M,GAErByM,IAASK,EAASL,OACpB3H,EAAQP,EAEJiG,IAAYxK,IACd8E,EAAQP,GAEZ,IAIEO,GAAS,GACX8H,EAAUzD,OAAOrE,EAAO,EAE5B,CDTEiI,CAAQzL,EAAImL,EAAMzM,GAElBsB,EAAG0L,oBAAoBP,EAAMzM,EAAI0M,EAAQ,EEVrCO,EAAe,SAAU3L,EAAImL,EAAMS,GAAU,GACjD,MAAMC,EAAWpM,EAASO,GAAMqB,SAASC,cAActB,GAAMA,EACvD8L,EAAYD,EAASE,WACrBT,ECPaU,EAAChM,EAAImL,KACxB,IAAIG,EAAYtL,EAAGuL,YAAc,GAQjC,OANI9L,EAAS0L,IAASA,IACpBG,EAAYA,EAAUxG,QAAQ0G,GACrBA,EAASL,OAASA,KAItBG,CAAS,EDFEU,CAAaH,EAAUV,GAEzCG,EAAU/L,SAASiM,IACjBN,EAAKW,EAAUL,EAASL,KAAMK,EAAS9M,GAAG,KAIzCkN,IAAoB,IAATT,GAAsC,IAArB3C,UAAU1H,SACvC+K,GACAC,GAEAA,EAAUvM,SAAS0M,IACbtM,EAAUsM,IACZN,EAAaM,EAAQd,EAAMS,EAC7B,GAGN,EEtBMpE,EAAMA,CAACxH,EAAImL,EAAMzM,KAErB,IAAKF,EAAWE,GAEd,OADAiN,EAAa3L,EAAImL,IACV,EAGTD,EAAKlL,EAAImL,EAAMzM,EAAG,ECFduK,EAAKA,CAACjJ,EAAI0E,EAAUyG,EAAMzM,EAAIkI,EAAMM,EAASgF,GAAO,KAExD,MAAMd,EAAUH,EAAetK,QAAQwK,IAAS,EAE1CK,EAAW,SAAUW,GACzB,MAAMC,ECfQ,SAAUD,GAC1B,MAAMC,EAASD,EAAIC,OAEnB,OCJgCpM,EDIToM,ICHG,IAAhBpM,EAAGF,SACJE,EAAGgL,WAGLhL,EALe,IAAUA,CDKlC,CDWmBqM,CAAUF,GAEnBG,EGbMC,EAACvM,EAAI0E,EAAU8H,EAAKC,KAClC,MAAMvF,EAAUsF,GAAOnL,SAEvB,IAAKrB,EACH,OAAO,KAGT,EAAG,CAED,GACe,MAAZ0E,IACEA,EAASgI,WAAW,KACjB1M,EAAGgL,aAAe9D,GAAWyD,EAAQ3K,EAAI0E,GACzCiG,EAAQ3K,EAAI0E,KACjB+H,GAAczM,IAAOkH,EAEtB,OAAOlH,EAIT,GAAIA,IAAOkH,EACT,KAIJ,OAAUlH,EAAK8K,EAAgB9K,GAAG,EHZTuM,CAAQH,EAAQ1H,EAAU1E,GACjD,IAAI2M,EAAkBzF,GAAWlH,EAEjCmM,EAAIG,eAAiBA,GAIL,IAAZpF,IACFyF,EAAkB/F,GAIhB0F,KAGW,IAATJ,GACF1E,EAAIxH,EAAImL,EAAMK,GAGhB9M,EAAGmH,KAAK8G,EAAiBR,EAAKvF,KAIlC,IAAK5G,EACH,OAAO,EAGJA,EAAGuL,aACNvL,EAAGuL,WAAa,IAIlBvL,EAAGuL,WAAW7H,KAAK,CACjB1D,KACA0E,WACAyG,OACAzM,GAAI8M,EACJ5E,OACAM,UACAkE,YAIF1M,EAAG2M,kBAAoBG,EAEvBxL,EAAG4M,iBAAiBzB,EAAMK,EAAUJ,EAAQ,EI3CxCnJ,EAAO,SAAUkK,GACrBA,EAAIU,kBACJV,EAAIW,gBACN,EC7BMC,EAAOhI,EAAAC,ECFI,CACf,gbACA,2bACA,+MACA,0UACA,yqBACA,4UACA,kqBACA,q4DACA,0wBACA,uvBACA,iYACA,+SACA,oTACA,4QACA,kNACA,8wBACA,uwBACA,2gBACA,suBACA,kyBCTIgI,EAAaA,CAACnM,EAAMoM,EAAU,SAC9BxN,EAASoB,GCJGqM,EAACrM,EAAMoM,EAAU,UACjC,MAAME,EAAc,aACdC,EAAa,UAGnB,OAFgBL,EAEDM,MAAMC,IACnB,MACMC,EADQJ,EAAY5M,KAAK+M,GACR,GAMvB,OALaF,EAAW7M,KAAKgN,GACR,KAIFN,GAAWM,KAFhB,SAAZN,EAAqB,GAAGA,KAAWpM,IAAS,GAAGoM,UAAgBpM,IAEd,GACnD,EDTOqM,CAAUrM,EAAMoM,GAGzBlI,EAAAC,EAAW+H,GEPPS,EAAQA,CAACF,EAAS,MACtB,MAAMG,EAAQpM,SAASqM,KACvB,IAAIC,EAAStM,SAASC,cAAc,kBAChCsM,EAAU,GCHHA,KACX,IAAKA,EACH,OAAO,EAGL7O,EAAQ6O,IAAYA,EAAQ9M,OAAS,EACvC8M,EAAQrO,SAAS+N,KAEkB,IAA7BP,EAAQpM,QAAQ2M,IAAkB7N,EAAS6N,IAC7CP,EAAQrJ,KAAK4J,EACf,IAIE7N,EAASmO,IACXb,EAAQrJ,KAAKkK,EAEjB,EDZAlN,CAAI4M,GACJM,EAAUZ,IAENW,EACFA,EAAOlK,UAAYmK,EAAQC,KAAK,KAEhCF,EAAStM,SAASyM,cAAc,OAChCH,EAAOlK,UAEL,uHAAGmK,EAAQC,KAAK,YAElBJ,EAAMM,aAAaJ,EAAOK,WAAYP,EAAMO,YAC9C,EEpBIC,EAASjO,IACb,SACEnB,EAASmB,MACRL,EAAUK,ICNWA,OACdnB,EAASmB,IAAwB,sBAAjB7B,EAAS6B,IDKfkO,CAAiBlO,KENnBmO,EFMqCnO,EEJrDnB,EAASsP,IAAoC,8BAAvBhQ,EAASgQ,KCFfnO,OAEhBnB,EAASmB,MACS,kBAAjB7B,EAAS6B,IAA4BA,EAAGH,SAA2B,IAAhBG,EAAGF,WHGKsO,CAAWpO,KENvDmO,KFOjB,EIAGE,EAAeA,CAACrO,EAAIoI,EAAMG,KAC9B,IAAI1I,EAAUG,EAAGH,QAAQyO,cAEzB,OAAQlG,GACN,IAAK,QACHpI,EAAGuO,MAAMC,QAAUjG,EACnB,MACF,IAAK,QACa,UAAZ1I,GAAmC,aAAZA,EACzBG,EAAGuI,MAAQA,EAEXvI,EAAGqO,aAAajG,EAAMG,GAExB,MACF,IAAK,UACHvI,EAAGqO,aAAa,MAAO9F,GACvB,MACF,IAAK,YACH/H,EAASR,EAAIuI,GACb,MACF,IAAK,YACHvI,EAAGyD,UAAY8E,EACf,MACF,IAAK,YACHvI,EAAGyO,UAAYlG,EACf,MACF,QACEvI,EAAGqO,aAAajG,EAAMG,GAE1B,ECnCImG,EAAgBA,CAAC1O,EAAIkI,KACzB,IAAKlI,IAAOnB,EAASqJ,GACnB,OAAO,EAGT7J,OAAOiB,KAAK4I,GAAO3I,SAAS6I,IAC1B,MAAMG,EAAQL,EAAME,GAChB1C,EAAOwC,EAAOE,IAChBiG,EAAarO,EAAIoI,EAAMG,EACzB,GACA,ECCEuF,EAAgBA,CAACjO,EAASqI,EAAO1C,KACrC,MAAMmJ,EAAYtN,SAASuN,yBACrBC,EAAMxN,SAASyM,cAAcjO,GAC7BiP,EAAgBC,GACbd,EAAMc,IAAUtP,EAASsP,GAE5BC,EAAUD,IACd,IAAI9C,EAEJ,IAAK6C,EAAaC,GAChB,OAAO,EAGLd,EAAMc,GACR9C,EAAS8C,EACAtP,EAASsP,KAClB9C,EAAS5K,SAAS4N,eAAeF,IAGnCJ,EAAUO,YAAYjD,EAAO,EAyB/B,OAtBIpN,EAASqJ,GACXwG,EAAcG,EAAK3G,GACVnJ,EAAQmJ,IAAUA,EAAMiH,OAAO/G,GAAS0G,EAAa1G,KAC9DF,EAAM3I,SAASwP,IACbC,EAAOD,EAAM,IAENd,EAAM/F,GACf8G,EAAO9G,GACEzI,EAASyI,IAClB8G,EAAO3N,SAAS4N,eAAe/G,IAG7BnJ,EAAQyG,GACVA,EAASjG,SAASwP,IAChBC,EAAOD,EAAM,IAGfC,EAAOxJ,GAGTqJ,EAAIK,YAAYP,GAETE,CAAG,EC1CNf,EAAgBA,CAACjN,EAAM2D,EAAU,MACrC,MAAM4K,EAAO,eACPC,EAAO7K,EAAQ6K,MAAQ,EACvBC,EAAQ9K,EAAQ8K,OAAS,GACzBrC,EAAUzI,EAAQyI,SAAW,GAC7BsC,EAAQxQ,EAAQsQ,GAAQA,EAAK,GAAKA,EAClCG,EAASzQ,EAAQsQ,GAAQA,EAAK,GAAKA,EACnCI,EAAeJ,EAAO,SAASE,cAAkBC,OAAc,GAC/DE,EAAWJ,EAAQG,EAAe,SAASH,IAAUG,EACrDvH,EAAQ1D,EAAQ0D,OAAS,GACzByH,EAAQtO,SAASyM,cAAc,KACrC,IAEI8B,EAFAC,EAAQ,GACRC,EAAM,GAGV,OAAKrQ,EAASoB,IC9BDnB,KACb,MAKMQ,EAAU,IAAIC,OADR,uIACoB,KAEhC,OAAOV,EAASC,IAAQQ,EAAQ6P,KAAKrQ,EAAI,ED0BrCsQ,CAAMnP,GACRiP,EAAMjP,GAENgP,EACE5C,GAAuB,SAAZA,EACP,gBAAgBA,UAAgBpM,KAChC,qBAAqBA,KAC3BiP,EAAM,aAAaD,kBAGrBF,EAAMlM,UAAYqM,EAEd5H,EAAMjI,UACRiI,EAAMjI,UAAY,GAAGmP,KAAQlH,EAAMjI,YAEnCiI,EAAMjI,UAAYmP,EAGpBV,EAAciB,EAAOzH,GAErB0H,EAAOD,EAAMrO,cAAc,OAC3BoN,EAAckB,EAAM,CAClB,eAAe,EACfK,MAAO,6BACPC,MAAO,oBACPX,MAAO,IACPC,OAAQ,IACRjB,MAAOmB,IAGFC,GAjCE,IAiCG,EEnDRQ,GAAOA,CAACtP,EAAM2D,EAAU,KACrBsJ,EAAcjN,EAAM2D,GCLvB4L,GAAcA,CAACpQ,EAAIC,KAAc,IAAAQ,EACrC,IACIJ,EADAD,EAAWJ,EAAGC,UAGlB,IAAKG,IAAaL,EAASC,EAAIC,GAC7B,OAAO,EAGTI,EAAYL,EAAGK,UAEF,QAAbI,EAAIJ,SAAAI,IAASA,GAATA,EAAW4P,OACbhQ,EAAUgQ,OAAOpQ,IAEjBG,EAAWkC,EAAKlC,EAASmC,QAAQtC,EAAW,KAC5CD,EAAGC,UAAYG,EACjB,ECtBIkQ,GAAiBA,CAACC,EAAUC,GAAY,EAAMC,GAAY,KAC9D,MAAMC,EAAc,kBACd3N,EAAOwN,EAAS9M,UAEtB,IAAIkN,EAQJ,GANAJ,EAAS9M,UAAYV,EAAKR,QAHV,qBAG2B,IAC3CgO,EAASK,gBAAgB,MACzBL,EAASK,gBAAgB,WAEzBR,GAAYG,EAAUG,IAEjBF,EACH,OAAO,ECTM9Q,MDYfiR,EAAUJ,EAASjP,cAAc,IAAIoP,aAEjCD,GACFL,GAAYG,EAAU,GAAGG,WCfZhR,EDkBH4C,EAAKiO,EAAStQ,WCjBnBR,EAASC,IAAgB,KAARA,GDkBtB6Q,EAASK,gBAAgB,SAIvBD,GACFJ,EAASM,YAAYF,EACvB,EEbF,MAAMG,WAAgB/I,EACpBC,WAAAA,CAAYxD,GACVuM,QAEA9I,KAAK+I,WAEDxM,GACFyD,KAAKE,WAAW3D,EAEpB,CAEAwM,QAAAA,GAOE,OANA/I,KAAKC,MAAQjJ,EAAU6R,GAAQG,UAE/BhJ,KAAKiJ,gBAAkB,KACvBjJ,KAAK7G,eAAiB,KACtB6G,KAAKpD,UAAY,GAEVoD,IACT,CAEAE,UAAAA,CAAW3D,GACT,IAAI2M,EACAjQ,EACAgQ,EACAzM,EAcJ,OAZAwD,KAAKG,KAAK5D,GAEVC,EAAiBwD,KAAKG,KAAK,kBAC3BlH,EAAgB+G,KAAKG,KAAK,iBAC1B+I,EAAUlJ,KAAKG,KAAK,WAEhB3I,EAASgF,GACXyM,EAAkB7P,SAASC,cAAcmD,GAChC9E,EAAU8E,KACnByM,EAAkBzM,GAGfyM,GAILjJ,KAAKiJ,gBAAkBA,EACvBjJ,KAAK7G,eAAiBH,EAAkBC,GACxC+G,KAAKpD,UAAYoD,KAAKmJ,cAElBnJ,KAAKpD,UAAU/D,OAAS,IAIxBtC,EAAW2S,IACbA,EAAQtL,KAAKoC,MAGfA,KAAKI,SAASC,gBAPLL,MARAA,IAkBX,CAEAmJ,WAAAA,GACE,MAAMF,EAAkBjJ,KAAKiJ,gBACvBxM,EAAWuD,KAAKG,KAAK,YAE3B,OAAArD,EAAAC,EAAWkM,EAAgB3P,iBAAiBmD,GAC9C,CAEA2M,KAAAA,GACE,OAAOpJ,KAAKmJ,cAActQ,MAC5B,CAEAuH,MAAAA,GACE,MAAM5D,EAAiBwD,KAAKG,KAAK,kBAC3B1D,EAAWuD,KAAKG,KAAK,YACrB1F,EAAWuF,KAAKG,KAAK,YACrBzF,EAAoBsF,KAAKG,KAAK,qBAC9BkJ,EAAUrJ,KAAKG,KAAK,WACpBxF,EAAW2B,EAAY,CAC3BE,iBACAC,WACAhC,WACAC,sBAWF,OARA6K,IAEAvF,KAAKsJ,OAAO3O,GAERpE,EAAW8S,IACbA,EAAQzL,KAAKoC,MAGRA,IACT,CAEAuJ,KAAAA,GAGE,OAFAvJ,KAAKwJ,UAEExJ,IACT,CAEAsJ,MAAAA,CAAO3O,GACL,MAAM8O,EAAQ,IACRlB,EAAYvI,KAAKG,KAAK,aACtBqI,EAAYxI,KAAKG,KAAK,aACtB1F,EAAWuF,KAAKG,KAAK,YACrBuJ,EAAY1J,KAAKG,KAAK,aACtBwJ,EAAmB3J,KAAKG,KAAK,oBAC7BiJ,EAAQpJ,KAAKoJ,QACbxM,EAASE,EAAAC,EAAOiD,KAAKpD,WACrBgN,EAASA,CAACpP,EAAUqB,KACxBrB,EAASlD,SAAQ,CAACgR,EAAUtN,KAC1B,MAAMU,EAAKV,EAAIa,EAAQ4N,EACjBI,EAAclP,EAASe,GAAIO,KC9HlB6N,EAACxB,EAAUtN,EAAGuB,KACnC,MAAMkM,EAAc,kBACdF,EAAYhM,EAAQgM,YAAa,EACjCC,EAAYjM,EAAQiM,YAAa,EACjC/N,EAAW8B,EAAQ9B,WAAY,EAC/BoP,EAActN,EAAQsN,aAAe,GACrCH,EAAYnN,EAAQmN,WAAa,GACjCC,EAAmBpN,EAAQoN,kBAAoB,KAC/CI,EAAY,WAAW/O,IACvBiF,EAAQ,CACZvE,GAAIqO,EACJ/R,UAAWwQ,EAAY,GAAGC,KAAeA,UAAsBA,EAC/D,UAAWzN,GAEPF,EAAOT,EAAKiO,EAAS9M,WAC3B,IAAIwO,EACAtB,EACAhB,EAQJ,GANIjN,IACFwF,EAAMzE,UAAYqO,EAAc,IAAM/O,EACtCmF,EAAM,aAAe4J,GAEvBpD,EAAc6B,EAAUrI,IAEnBsI,EACH,OAAO,EAIPyB,EADEN,IAGEnT,EAAWoT,GACPA,EAAiBrB,EAAS1Q,QAAQyO,cAAevL,EAAME,GAEvD,IAAI+O,KAIdrC,EAAQQ,GAAK,OAAQ,CAAElD,QAAS,YAChC0D,EAAU7C,EACR,IACA,CACEnK,GAAI,UAAUV,IACdhD,UAAW,GAAGyQ,oBAA8BzN,IAC5CiP,KAAMD,EACN7F,OAAQuF,EAAY,SAAW,OAC/B,UAAW1O,GAEb0M,GAEFY,EAASrB,YAAYyB,EAAQ,ED4EvBoB,CAAexB,EAAU5M,EAAI,CAC3B6M,YACAC,YACA/N,WACAoP,cACAH,YACAC,oBACA,GACF,EAEJ,IAAIO,GAAc,EAGlB,GAAId,EAAQK,EAKV,IAJAS,GAAc,EAEdN,EAAOhN,EAAUgD,OAAO,EAAG6J,GAAQ,GAE5B7M,EAAU/D,OAAS,GAAG,CAC3B,MAAMoL,EAAOrH,EAAUgD,OAAO,EAAG6J,GACjCnH,GACE,KACEsH,EAAO3F,EAAOiG,GAAc,EAAG,IAEjC,KACElK,KAAKY,MAAM,oBAAoB,GAGrC,MAEAgJ,EAAOhN,EAAW,GAGpB,OAAOoD,IACT,CAEAwJ,OAAAA,GACE,MAAMjB,EAAYvI,KAAKG,KAAK,aACtBqI,EAAYxI,KAAKG,KAAK,aAO5B,OANkBH,KAAKpD,UAEbtF,SAASgR,IACjBD,GAAeC,EAAUC,EAAWC,EAAU,IAGzCxI,IACT,CAEAQ,OAAAA,CAAQ7F,GACN,MAAM6B,EAAiBwD,KAAKG,KAAK,kBAC3B1D,EAAWuD,KAAKG,KAAK,YACrB1F,EAAWuF,KAAKG,KAAK,YACrBzF,EAAoBsF,KAAKG,KAAK,qBAcpC,OAZAH,KAAKpD,UAAYoD,KAAKmJ,cAEtBnJ,KAAKuJ,QAAQD,OACX3O,GACE2B,EAAY,CACVE,iBACAC,WACAhC,WACAC,uBAICsF,IACT,CAEAxG,QAAAA,CAASC,EAAK0Q,GACZ,MAAMpS,EAAKiI,KAAK7G,eAIhB,OAFAK,EAASzB,EAAI0B,EAAK0Q,GAEXnK,IACT,CAEAS,OAAAA,GACE,MAAM2J,EAAgBpK,KAAKG,KAAK,iBAC1BkK,EAAerK,KAAKG,KAAK,gBAY/B,OAVI5J,EAAW6T,IACbA,EAAcxM,KAAKoC,MAGrBA,KAAKU,kBAAkB8I,UAAUT,WAE7BxS,EAAW8T,IACbA,EAAazM,KAAKoC,MAGbA,IACT,CAEAsK,eAAAA,CAAgBpG,GACd,MAAMwF,EAAY1J,KAAKG,KAAK,aACtBoK,EAAcvK,KAAKG,KAAK,eACxBqK,EAAexK,KAAKG,KAAK,gBAEzBmI,EADUpE,EAAIG,eACKtB,WACnBtJ,EAAM+I,EAAU8F,IAAakC,EAAe,IAC5CrR,EAAiB6G,KAAK7G,eAEtBgJ,EAAMhJ,EAAeW,aAAeX,EAAesR,aAqBzD,OANAzK,KAAKxG,SAASC,GAdA0Q,KACR5T,EAAWgU,IACbA,EAAY3M,KAAKoC,KAAM,UAGzBxJ,GAAM,KACJwJ,KAAKY,MAAM,iBAAkB,CAC3BnH,MACAiR,IAVM,EAWNvI,OACA,GACF,IAKCuH,GACH1P,EAAKkK,GAGAlE,IACT,CAEA2K,SAAAA,CAAUhQ,GAGR,OAFAqF,KAAKQ,QAAQ7F,GAENqF,IACT,CAEAK,YAAAA,GACE,MAAM4I,EAAkBjJ,KAAKiJ,gBAE7B,OAAIjJ,KAAKoJ,QAAU,IAInBpI,EACEiI,EACA,2BACA,QACAjJ,KAAKsK,gBACLtK,MACA,GAGFA,KAAKe,IAAI,kBAAmBf,KAAK2K,YAZxB3K,IAeX,CAEAU,eAAAA,GACE,MAAMuI,EAAkBjJ,KAAKiJ,gBAE7B,OAAIjJ,KAAKoJ,QAAU,IAInB7J,EAAI0J,EAAiB,QAASjJ,KAAKsK,iBACnCtK,KAAKmB,KAAK,kBAAmBnB,KAAK2K,YAJzB3K,IAOX,EAGF6I,GAAQG,SAmBChS,EAlBS,CACdiC,cAAe,YACfuD,eAAgB,WAChBC,SAAU,oBACV+N,aAAc,EACdd,UAAW,GACXnB,WAAW,EACXC,WAAW,EACX/N,UAAU,EACVyO,QAAS,KACTG,QAAS,KACTkB,YAAa,KACbH,cAAe,KACfC,aAAc,KACd3P,kBAAmB,KACnBiP,iBAAkB,OE7TtB,MAAMiB,GAAO,CACX,IACA,OACA,UACA,OACA,UACA,QACA,QACA,IACA,OACA,MACA,MACA,aACA,OACA,KACA,SACA,SACA,UACA,OACA,OACA,MACA,WACA,OACA,WACA,KACA,MACA,UACA,MACA,SACA,MACA,KACA,KACA,KACA,QACA,WACA,aACA,SACA,SACA,OACA,KACA,KACA,KACA,KACA,KACA,KACA,OACA,SACA,SACA,KACA,OACA,IACA,SACA,MACA,QACA,MACA,MACA,QACA,SACA,KACA,OACA,OACA,MACA,OACA,OACA,OACA,WACA,OACA,QACA,MACA,WACA,SACA,KACA,WACA,SACA,SACA,IACA,QACA,UACA,MACA,WACA,IACA,KACA,KACA,KACA,MACA,OACA,IACA,OACA,SACA,SACA,UACA,SACA,OACA,QACA,SACA,OACA,SACA,QACA,MACA,UACA,MACA,MACA,QACA,QACA,KACA,WACA,WACA,QACA,KACA,QACA,OACA,QACA,KACA,QACA,IACA,KACA,MACA,QACA,OCzGIC,GAAUpT,IACd,IAAIqT,EACAC,EACAC,EAEJ,QAAKxT,EAASC,KAKdqT,EAAOzQ,EAAK5C,GAAKwT,MAAM,EAAG,KAC1BF,EAAQ,4DACRC,EAAO,IAAI9S,OAAO0S,GAAKxN,KAAK8N,GAAQ,IAAIA,eAAgBtF,KAAK,KAAM,KAE5DmF,EAAMjD,KAAKgD,IAASE,EAAKlD,KAAKgD,GAAK,ECtBtCK,GAAgB1T,GACbA,EAAI6C,QAAQ,+BAAgC,ICP/C8Q,GAAcA,CAAC1N,EAAM4C,KACDlH,SAASiS,gBACjB/E,MAAM8E,YAAY1N,EAAM4C,EAAM,ECAhD,IAAI/E,GAAQ,IAEZ,MAAM+P,GAAUC,IACVA,EACFhQ,GAAQgQ,EAERhQ,IAAS,EAGX6P,GAAY,mBAAoB,GAAG7P,MAE5BA,ICKT,MAAMiQ,WAAe1L,EACnBC,WAAAA,CAAYxD,GACVuM,QAEA9I,KAAK+I,WAEL/I,KAAKsL,OAAS,EAEV/O,GACFyD,KAAKE,WAAW3D,EAEpB,CAEAwM,QAAAA,GAcE,OAbA/I,KAAKC,MAAQjJ,EAAUwU,GAAOxC,UAC9BhJ,KAAKyL,MAAQ,GACbzL,KAAK0L,QAAS,EAEd1L,KAAK4G,IAAM,KACX5G,KAAK2L,OAAS,KACd3L,KAAK4L,QAAU,KACf5L,KAAK6L,OAAS,KACd7L,KAAK8L,OAAS,KACd9L,KAAK+L,MAAQ,KACb/L,KAAKgM,QAAU,KACfhM,KAAKiM,SAAW,KAETjM,IACT,CAEAE,UAAAA,CAAW3D,GACT,IAAI2M,EAYJ,OAVAlJ,KAAKG,KAAK5D,GAEVyD,KAAKyL,MAAQzL,KAAKG,KAAK,SACvB+I,EAAUlJ,KAAKG,KAAK,WAEhB5J,EAAW2S,IACbA,EAAQtL,KAAKoC,MAGfA,KAAKI,SAASC,eACPL,IACT,CAEAkM,QAAAA,CAAST,GAKP,OAJAzL,KAAKG,KAAK,QAASsL,GACnBzL,KAAKyL,MAAQA,EACbzL,KAAK6L,OAAOrQ,UAAYiQ,EAEjBzL,IACT,CAEAmM,QAAAA,GACE,OAAOnM,KAAK0L,MACd,CAEAtL,MAAAA,GACE,MAAMiJ,EAAUrJ,KAAKG,KAAK,WACpBiH,EAAOpH,KAAKG,KAAK,QACjBiM,EAAYpM,KAAKG,KAAK,aACtBkM,EAAWrM,KAAKG,KAAK,YACrBmM,EAAatM,KAAKG,KAAK,cACvBoM,EAAYvM,KAAKG,KAAK,aACtBqM,EAAaxM,KAAKG,KAAK,cACvBsM,EAAazM,KAAKG,KAAK,cACvBuM,EAAW1M,KAAKG,KAAK,YACrBwM,EAAc3M,KAAKG,KAAK,eAC9B,IACIyG,EACA+E,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EARAW,EAAgB,uBAsGpB,OA5FArH,IACAvF,KAAKsL,OAASA,KAEdO,EAAShG,EACP,KACA,CACE7N,UAAW,yBAEbgI,KAAKyL,OAEPzL,KAAK6L,OAASA,EAEVQ,IACFP,EAASjG,EACP,MACA,CACE7N,UAAW,yBAEbkQ,GAAK,QAAS,CAAElD,QAAS,UAAWoC,KAAM,MAE5CpH,KAAK8L,OAASA,GAGhBF,EAAU/F,EACR,SACA,CACE7N,UAAW,0BAEb,CAAC6T,EAAQC,IAEX9L,KAAK4L,QAAUA,EAEE,WAAbc,IACFE,GAAiB,oBAGnBb,EAAQlG,EAAc,MAAO,CAC3B7N,UAAW4U,IAEb5M,KAAK+L,MAAQA,EAERS,GACHjU,EAASwT,EAAO,uBAGlBC,EAAUnG,EAAc,SAAU,CAChC7N,UAAW,2BAEbgI,KAAKgM,QAAUA,EAEfL,EAAS9F,EACP,MACA,CACE7N,UAAW,wCAAwCoU,oBAA4BhF,2BAEjF,CAACwE,EAASG,EAAOC,IAEnBhM,KAAK2L,OAASA,EAEVY,GACFhU,EAASoT,EAAQ,yBAGfc,GACFlU,EAASoT,EAAQ,uBAGfgB,GACFpU,EAASoT,EAAQgB,GAGfL,IACFL,EAAWpG,EAAc,MAAO,CAC9B7N,UAAW,4BAEbgI,KAAKiM,SAAWA,GAGlBrF,EAAMf,EACJ,MACA,CACE7N,UAAW,kBAEb,CAAC2T,EAAQM,IAEXjM,KAAK4G,IAAMA,EACXxN,SAASqM,KAAKwB,YAAYL,GAEtBrQ,EAAW8S,IACbA,EAAQzL,KAAKoC,MAGRA,IACT,CAEAuJ,KAAAA,GAEE,OADAvJ,KAAK+L,MAAMvQ,UAAY,GAChBwE,IACT,CAEAsJ,MAAAA,CAAOuD,GACL,IAAIC,EAAW,KAcf,OAZIvW,EAAWsW,GACbC,EAAWD,IACF7G,EAAM6G,GACfC,EAAWD,EACFhC,GAAOgC,KAChBC,EC/LOhC,EAAC/S,EAAIgV,KAChB,MAAMrG,EAAYtN,SAASuN,yBAE3B,IAAK5O,IAAQ8S,GAAO9S,KAAQP,EAASO,KAAQL,EAAUK,GACrD,OAAO,KAGT,GAAI8S,GAAO9S,GAAK,CACd,MAAMiV,EAAWnH,EAAc,OAC/B,IAAItI,EAAW,GAQf,OANAyP,EAASxR,UAAY2P,GAAapT,GAClCwF,EAAQT,EAAAC,EAAOiQ,EAASlJ,YACxBvG,EAASjG,SAASwP,IAChBJ,EAAUO,YAAYH,EAAM,IAGvBJ,CACT,CAAO,IAAIlP,EAASuV,GAGlB,OAAOhV,EAAGyD,UAFVzD,EAAGyD,UAAY2P,GAAa4B,EAG9B,EDyKejC,CAAK+B,IAGdC,GACF9M,KAAK+L,MAAM9E,YAAY6F,GAGlB9M,IACT,CAEAwJ,OAAAA,GAEE,OADApQ,SAASqM,KAAKmD,YAAY5I,KAAK4G,KACxB5G,IACT,CAEAQ,OAAAA,CAAQqM,GAEN,OADA7M,KAAKuJ,QAAQD,OAAOuD,GACb7M,IACT,CAEAiN,IAAAA,GACE,MAAMC,EAASlN,KAAKG,KAAK,eACnBwL,EAAS3L,KAAK2L,OAcpB,OAZApT,EAASyH,KAAK4G,IAAK,yBACnBuB,GAAYwD,EAAQ,yBACpBpT,EAASoT,EAAQ,yBAEjBnV,GAAM,KACJwJ,KAAK0L,QAAS,EAEVnV,EAAW2W,IACbA,EAAOtP,KAAKoC,KACd,IAGKA,IACT,CAEAmN,KAAAA,GACE,MAAMzB,EAAS1L,KAAKG,KAAK,eACnBwL,EAAS3L,KAAK2L,OAcpB,OAZAxD,GAAYwD,EAAQ,yBACpBpT,EAASoT,EAAQ,yBAEjBnV,GAAM,KACJ2R,GAAYnI,KAAK4G,IAAK,yBACtB5G,KAAK0L,QAAS,EAEVnV,EAAWmV,IACbA,EAAO9N,KAAKoC,KACd,IAGKA,IACT,CAEAoN,MAAAA,GACE,MAAMC,EAAcrN,KAAKG,KAAK,eACxBuL,EAAS1L,KAAKmM,WAcpB,OAZIT,EACF1L,KAAKiN,OAELjN,KAAKmN,QAGH5W,EAAW8W,IACb7W,GAAM,KACJ6W,EAAYzP,KAAKoC,KAAM0L,EAAO,IAI3B1L,IACT,CAEAS,OAAAA,GACE,MAAM4J,EAAerK,KAAKG,KAAK,gBACzBiK,EAAgBpK,KAAKG,KAAK,iBAChC,IAAI5E,EAAQyE,KAAKsL,OAgBjB,OAdI/U,EAAW6T,IACbA,EAAcxM,KAAKoC,MAGrBA,KAAKU,kBAAkB8I,UAAUT,WAEjCxN,GAAS,EACT+P,GAAO/P,GACPyE,KAAKsL,OAAS,EAEV/U,EAAW8T,IACbA,EAAazM,KAAKoC,MAGbA,IACT,CAEAsN,OAAAA,GAEE,OADAtN,KAAKmN,QACEnN,IACT,CAEAK,YAAAA,GACE,MAAMgM,EAAWrM,KAAKG,KAAK,YACrBmM,EAAatM,KAAKG,KAAK,cACvBoN,EAAoBvN,KAAKG,KAAK,qBAC9ByG,EAAM5G,KAAK4G,IAUjB,OARIyF,GACFrL,EAAG4F,EAAK,yBAA0B,QAAS5G,KAAKsN,QAAStN,MAAM,GAG7DsM,GAAciB,GAChBvM,EAAG4F,EAAK,2BAA4B,QAAS5G,KAAKsN,QAAStN,MAAM,GAG5DA,IACT,CAEAU,eAAAA,GACE,MAAM2L,EAAWrM,KAAKG,KAAK,YACrBmM,EAAatM,KAAKG,KAAK,cACvByG,EAAM5G,KAAK4G,IAEjB,OAAKyF,GAAaC,GAIlB/M,EAAIqH,EAAK,QAAS5G,KAAKsN,SAEhBtN,MALEA,IAMX,EAGFwL,GAAOxC,SAsBEhS,EArBS,CACdoV,UAAW,MACXX,MAAO,KACPrE,KAAM,UACNiF,UAAU,EACVC,YAAY,EACZC,WAAW,EACXC,YAAY,EACZC,YAAY,EACZc,mBAAmB,EACnBb,SAAU,OACVxD,QAAS,KACTG,QAAS,KACTmE,YAAa,KACbC,YAAa,KACblD,YAAa,KACbH,cAAe,KACfC,aAAc,KACdgD,YAAa,OEvVjB,MAAMK,GAAKA,CAAC3V,EAAImL,EAAMzM,EAAIkI,EAAMM,EAASgF,GAAO,KAE9C,MAAMd,EAAUH,EAAetK,QAAQwK,IAAS,EAC1CK,EAAW,SAAUW,GACzB,IAAIQ,EAAkBzF,GAAWlH,GAIjB,IAAZkH,IACFyF,EAAkB/F,IAKP,IAATsF,GACF1E,EAAIxH,EAAImL,EAAMK,GAGhB9M,EAAGmH,KAAK8G,EAAiBR,EAAKvF,IAGhC,IAAKpI,EAAWE,GACd,OAAO,EAGJsB,EAAGuL,aACNvL,EAAGuL,WAAa,IAIlBvL,EAAGuL,WAAW7H,KAAK,CACjB1D,KACAmL,OACAzM,GAAI8M,EACJ5E,OACAM,UACAkE,YAIF1M,EAAG2M,kBAAoBG,EAEvBxL,EAAG4M,iBAAiBzB,EAAMK,EAAUJ,EAAQ,ECpDxCwK,GAAWA,CAAC5V,EAAI6V,IACbC,iBAAiB9V,GAAI6V,GCgBxBE,GAAS,2BACTC,GAAW,6BACXC,GAAS,2BAEf,MAAMC,WAAkBnO,EACtBC,WAAAA,CAAYxD,GACVuM,QAEA9I,KAAK+I,WAEL/I,KAAKkO,YAAc,KACnBlO,KAAKmO,YAAc,KACnBnO,KAAKoO,cAAgB,KACrBpO,KAAKqO,SAAW,KAEZ9R,GACFyD,KAAKE,WAAW3D,EAEpB,CAEAwM,QAAAA,GAmBE,OAlBA/I,KAAKC,MAAQjJ,EAAUiX,GAAUjF,UAEjChJ,KAAK4G,IAAM,KACX5G,KAAK6L,OAAS,KACd7L,KAAK+L,MAAQ,KACb/L,KAAKsO,MAAQ,KACbtO,KAAKuO,aAAe,KACpBvO,KAAKwO,eAAiB,KACtBxO,KAAK7G,eAAiB,KACtB6G,KAAKyO,QAAU,KAEfzO,KAAKrF,SAAW,GAChBqF,KAAK0O,OAAS,EACd1O,KAAK2O,YAAc,EACnB3O,KAAKwC,UAAY,EACjBxC,KAAK4O,SAAU,EACf5O,KAAK0L,QAAS,EAEP1L,IACT,CAEAE,UAAAA,CAAW3D,GACT,IAAI2M,EACA2F,EACA5V,EACA6V,EAwBJ,OAtBA9O,KAAKG,KAAK5D,GAEV2M,EAAUlJ,KAAKG,KAAK,WACpB0O,EAAgB7O,KAAKG,KAAK,iBAC1BlH,EAAgB+G,KAAKG,KAAK,iBAEtB3I,EAASqX,GACXC,EAAU1V,SAASC,cAAcwV,GACxBnX,EAAUmX,KACnBC,EAAUD,GAEZ7O,KAAKwO,eAAiBM,EACtB9O,KAAK7G,eAAiBH,EAAkBC,GAExC+G,KAAKrF,SAAWqF,KAAKG,KAAK,YAC1BH,KAAK0L,OAAS1L,KAAKG,KAAK,UACxBH,KAAK0O,OAAS1O,KAAKG,KAAK,UAEpB5J,EAAW2S,IACbA,EAAQtL,KAAKoC,MAGXA,KAAKrF,SAAS9B,OAAS,IAI3BmH,KAAKI,SAASC,eAEdL,KAAKyO,QAAUrV,SAASC,cAAc,YAAY2G,KAAK0O,WAL9C1O,IAQX,CAEAmM,QAAAA,GACE,OAAOnM,KAAK0L,MACd,CAEAqD,QAAAA,GAEE,MAAoB,WADH/O,KAAKG,KAAK,WAE7B,CAEA6O,OAAAA,GAEE,MAAoB,UADHhP,KAAKG,KAAK,WAE7B,CAEA8O,QAAAA,GACE,OAAOjP,KAAKgP,WAAahP,KAAK+O,UAChC,CAEAG,SAAAA,GACE,OAAQlP,KAAKiP,UACf,CAEA7F,KAAAA,GACE,OAAOpJ,KAAKrF,SAAS9B,MACvB,CAEAsW,UAAAA,GACE,MAAMzI,EAAYtN,SAASuN,yBAErB8E,EAAQzL,KAAKG,KAAK,SAClBiP,EAAmBpP,KAAKG,KAAK,oBAC7BwM,EAAc3M,KAAKG,KAAK,eACxBqO,EAAiBxO,KAAKwO,eACtBjR,EAAW,GACX8R,EAAW,GACjB,IACIzI,EACAmF,EACAuC,EACAC,EAJA1C,EAAS,KAMb,OAAK2C,GAIDxO,KAAKiP,YAAcxD,IACrBI,EAAShG,EACP,KACA,CACE7N,UAAW,4BAEbyT,GAEFzL,KAAK6L,OAASA,EACdwD,EAAS5T,KAAKoQ,IAGhByC,EAAQzI,EAAc,KAAM,CAI1B7N,UAAW,4BAEbgI,KAAKsO,MAAQA,EACb/Q,EAAS9B,KAAK6S,GAEVc,IACFb,EAAe1I,EAAc,MAAO,CAClC7N,UAAW,mCAEbgI,KAAKuO,aAAeA,EACpBhR,EAAS9B,KAAK8S,IAGhBxC,EAAQlG,EACN,MACA,CACE7N,UAAW,2BAEbuF,GAEFyC,KAAK+L,MAAQA,EACbsD,EAAS5T,KAAKsQ,GAEdnF,EAAMf,EACJ,MACA,CACEnK,GAAI,oBACJ1D,UAAW,qBAAqB8V,MAElCuB,GAEFrP,KAAK4G,IAAMA,EAEP5G,KAAK+O,aACP/O,KAAKsP,wBACL/W,EAASqO,EApEI,6BAuEX+F,GACFpU,EAASqO,EAAK+F,GAEhBjG,EAAUO,YAAYL,GACtB4H,EAAevH,YAAYP,GAEpB1G,MA/DEA,IAgEX,CAEAI,MAAAA,GACE,MAAMiJ,EAAUrJ,KAAKG,KAAK,WACpBqO,EAAiBxO,KAAKwO,eACtB7T,EAAWqF,KAAKrF,SAChByO,EAAQpJ,KAAKoJ,QACnB,IAAIxC,EAEJ,OAAK4H,GAAkB7T,EAAS9B,OAAS,IAIrCmH,KAAKiP,YACP1W,EAASiW,EAAgB,4BAG3BxO,KAAKmP,aACLvI,EAAM5G,KAAK4G,IAEX5G,KAAKsJ,OAAO3O,GAEZnE,GAAM,KACJwJ,KAAKuP,UAAUvP,KAAK0O,OAAO,GAC1B,IAEH1O,KAAKwC,UAAYA,EAAUoE,GAC3B5G,KAAK2O,YAAc/H,EAAI+H,YAEnB3O,KAAKgP,YACPhP,KAAKwP,SACLpE,GAAY,4BAA6B,GAAGpL,KAAK2O,kBAG/CpY,EAAW8S,IACbA,EAAQzL,KAAKoC,MAGXoJ,EAAQ,KACVpJ,KAAKyP,cA7BEzP,IAiCX,CAEAuJ,KAAAA,GAGE,OAFAvJ,KAAKsO,MAAM9S,UAAY,GAEhBwE,IACT,CAEAsJ,MAAAA,CAAO3O,GACL,MAAMF,EAAWuF,KAAKG,KAAK,YACrByG,EAAM5G,KAAK4G,IAOjB,MC5QmB8I,EAACpB,EAAO3T,EAAUF,GAAW,KAClD,MACM2O,EAAQzO,EAAS9B,OACjB8W,EAAM7S,EAAAC,EAAOpC,GACb4K,EAASqK,IACb,MAAMC,EAAQnU,GAAO4S,EAAMjV,cAAc,IAAIqC,KAC7CkU,EAAMtY,SAASwY,IACb,MAAM1U,EAAM0U,EAAQ1U,IACdM,EAAKoU,EAAQpU,GACbO,EAAO6T,EAAQ7T,KACfN,EAAMmU,EAAQnU,IACd4B,EAAW,GACXwS,EAAQlK,EACZ,OACA,CACE7N,UAAW,2BAEb8X,EAAQhV,MAEV,IAAIkV,EACAC,EACAC,EACAC,EACAC,EAEA3V,IACFwV,EAAQpK,EACN,OACA,CACE7N,UAAW,0BACX,UAAW0D,GAEboU,EAAQ7T,MAGVsB,EAAS9B,KAAKwU,IAGhB1S,EAAS9B,KAAKsU,GAEdC,EAAQnK,EACN,IACA,CACEnK,GAAI,mBAAmBA,IACvB1D,UAAW,4BACXiS,KAAM,IAAMtO,EACZA,IAAKA,EACL,UAAWD,EACX,YAAaO,GAEfsB,GAGF2S,EAAMrK,EACJ,KACA,CACEnK,GAAI,WAAWA,IACf1D,UAAW,0BACX,UAAW0D,EACX,YAAaO,GAEf+T,IAGW,IAAT5U,EACFkT,EAAMrH,YAAYiJ,IAElBE,EAAWP,EAAK,WAAWzU,KAC3B+U,EAAWN,EAAK,WAAWzU,KAEtB+U,EAYHA,EAASlJ,YAAYiJ,IAXrBC,EAAWtK,EACT,KACA,CACEnK,GAAI,WAAaN,EACjBpD,UAAW,8BAEbkY,GAGFE,EAASnJ,YAAYkJ,IAIzB,GACA,EAKJ,GAAI/G,EAzFU,IA8FZ,IAHA7D,EAAMoK,EAAO/P,OAAO,EA3FR,MA8FL+P,EAAO9W,OAAS,GAAG,CACxB,MAAMoL,EAAO0L,EAAO/P,OAAO,EA/FjB,KAgGV0C,GAAU,KACRiD,EAAMtB,EAAK,GAEf,MAEAsB,EAAMoK,EACR,EDiKED,CAFc1P,KAAKsO,MAEG3T,EAAUF,GAChC0N,GAAYvB,EAAKkH,IACjBvV,EAASqO,EAAKmH,IAEP/N,IACT,CAEAwJ,OAAAA,GAEE,OADAxJ,KAAKwO,eAAe5F,YAAY5I,KAAK4G,KAC9B5G,IACT,CAEAQ,OAAAA,CAAQ7F,GACN,MAAMiM,EAAM5G,KAAK4G,IAKjB,OAHAuB,GAAYvB,EAAKkH,IACjB9N,KAAKuJ,QAAQD,OAAO3O,GAEbqF,IACT,CAEAqQ,qBAAAA,CAAsB9U,GACpB,MAAMwQ,EAAQ/L,KAAK+L,MACbuC,EAAQtO,KAAKsO,MACb5F,EAAU4F,EAAMjV,cAAc,8BAC9BiX,EAAiBnV,SAASwS,GAAS5B,EAAO,eAAgB,IAC1DwE,EAAgBpV,SAASwS,GAAS5B,EAAO,oBAAqB,IAC9DyE,EAAwBrV,SAASwS,GAASW,EAAO,eAAgB,IACjEmC,EAAuBtV,SAASwS,GAASW,EAAO,cAAe,IAC/DoC,EAAuBvV,SAC3BwS,GAASW,EAAO,oBAChB,IAEF,IAEI7U,EADA+I,EAAY,EAyBhB,OAtBI8N,IACF9N,GAAa8N,GAGXE,IACFhO,GAAagO,GAGXC,IACFjO,GAAaiO,GAGXF,IACF/N,GAAa+N,GAGXG,IACFlO,GAAakO,GAGfjX,EAxBaiP,EAAQiI,aAwBNpV,EAERiH,EAAY/I,CACrB,CAEAmX,mBAAAA,CAAoBrV,GAClB,MAAM+S,EAAQtO,KAAKsO,MACbC,EAAevO,KAAKuO,aACpB7F,EAAU4F,EAAMjV,cAAc,8BAC9B+V,EAAmBpP,KAAKG,KAAK,oBAC7BoH,EAASmB,EAAQiI,aACvB,IAAInO,EAAY,EAEhB,OAAK4M,GAIL5M,EAAYxC,KAAKqQ,sBAAsB9U,GAEvCgT,EAAajI,MAAMC,QAAU,yBAAyB/D,eAAuB+E,OAEtEvH,MAPEA,IAQX,CAEAuP,SAAAA,CAAU7T,GACR,MAAMkL,EAAM5G,KAAK4G,IACXwI,EAAmBpP,KAAKG,KAAK,oBAE7B0Q,EAAS,2BACTC,EAAY,8BAClB,IAAIhC,EAAuB,aAHV9O,KAAKG,KAAK,YAGaH,KAAKwO,eAAiBxO,KAAK+L,MAC/DrD,EAAU,KACVqI,EAAuB,EAE3B,OAAKnK,GAIL8B,EAAU9B,EAAIvN,cAAc,oBAAoBqC,KAE3CgN,GAIL1I,KAAK0O,OAASvT,SAASuN,EAAQsI,aAAa,WAAY,IAEpDhR,KAAKyO,UACPtG,GAAYnI,KAAKyO,QAASqC,GAC1B3I,GAAYnI,KAAKyO,QAASoC,IAG5B7Q,KAAKyO,QAAU/F,EACfnQ,EAASyH,KAAKyO,QAASoC,GAEnBzB,EACFpP,KAAK4Q,oBAAoB5Q,KAAK0O,QAE9BnW,EAASyH,KAAKyO,QAASqC,GAGzBta,GAAM,KEtXSya,EAACnK,EAAOoK,KACzB,IACIC,EACAC,EAFAC,GAAe,EAInB,OAAK3Z,EAAUoP,IAAWpP,EAAUwZ,IAIpCC,EAAaD,EAAOI,wBACpBF,EAAYtK,EAAMwK,wBAElBD,KACED,EAAU3X,KAAO0X,EAAW1X,KAC5B2X,EAAUG,OAASJ,EAAWI,OAC9BH,EAAUI,QAAUL,EAAWK,QAC/BJ,EAAUK,MAAQN,EAAWM,MAGxBJ,GAbEA,CAaU,EFoWVJ,CAAWjR,KAAKyO,QAASK,KAC5BiC,EAAuB/Q,KAAKqQ,sBAAsBrQ,KAAK0O,QACvDlV,EAASsV,EAASiC,GACpB,IAGK/Q,MA1BEA,MANAA,IAiCX,CAEAwP,MAAAA,GACE,MAAMkC,EAAc1R,KAAKG,KAAK,eACxBwR,EAAQ,0BACR/K,EAAM5G,KAAK4G,IACXnN,EAAMuG,KAAKwC,UACXjJ,EAAYyG,KAAK7G,eAAeI,UACtC,IAAIqY,EAEJ,OAAK5R,KAAKgP,WAIV4C,EAAcrY,GAAaE,EAEvBmY,EACFrZ,EAASqO,EAAK+K,GAEdxJ,GAAYvB,EAAK+K,GAGfpb,EAAWmb,IACbA,EAAY9T,KAAKoC,KAAMA,KAAKmM,WAAYyF,GAGnC5R,MAfEA,IAgBX,CAEAsP,qBAAAA,GACE,MAAMjE,EAAkBjS,SAASiS,gBAC3B9D,EAASrF,KAAKC,IAClBkJ,EAAgBZ,cAAgB,EAChC5I,OAAOgQ,aAAe,GAGxB,OADAzG,GAAY,0BAA2B,GAAG7D,OACnCvH,IACT,CAEAxG,QAAAA,CAASC,EAAK0Q,GACZ,MAAMpS,EAAKiI,KAAK7G,eAIhB,OAFAK,EAASzB,EAAI0B,EAAK0Q,GAEXnK,IACT,CAEA8R,IAAAA,GACE,MAAM5E,EAASlN,KAAKG,KAAK,eACnBiJ,EAAQpJ,KAAKoJ,QACbxC,EAAM5G,KAAK4G,IACXkI,EAAU9O,KAAKwO,eAqBrB,OAnBIxO,KAAKiP,WACH7F,EAAQ,IACVjB,GAAY2G,EAAShB,KAErB3F,GAAY2G,EAAShB,IACrBtX,GAAM,KACJ2R,GAAY2G,EAASd,IACrBzV,EAASuW,EAASf,GAAS,GAC1B,KAGL5F,GAAYvB,EAAKkH,IAEnB9N,KAAK0L,QAAS,EAEVnV,EAAW2W,IACbA,EAAOtP,KAAKoC,MAGPA,IACT,CAEA+R,IAAAA,GACE,MAAMrG,EAAS1L,KAAKG,KAAK,eACnBiJ,EAAQpJ,KAAKoJ,QACbxC,EAAM5G,KAAK4G,IACXkI,EAAU9O,KAAKwO,eAqBrB,OAnBIxO,KAAKiP,WACH7F,EAAQ,IACV7Q,EAASuW,EAAShB,KAElBvV,EAASuW,EAASd,IAClB7F,GAAY2G,EAASf,IACrBvX,GAAM,KACJ+B,EAASuW,EAAShB,GAAO,KAI7BvV,EAASqO,EAAKkH,IAEhB9N,KAAK0L,QAAS,EAEVnV,EAAWmV,IACbA,EAAO9N,KAAKoC,MAGPA,IACT,CAEAoN,MAAAA,GACE,MAAMC,EAAcrN,KAAKG,KAAK,eACxB1G,EAAMuG,KAAKwC,UACXjJ,EAAYyG,KAAK7G,eAAeI,UACtC,IAAIqY,EAeJ,OAbI5R,KAAKmM,WACPnM,KAAK8R,OAEL9R,KAAK+R,OAGHxb,EAAW8W,IACb7W,GAAM,KACJob,EAAcrY,GAAaE,EAC3B4T,EAAYzP,KAAKoC,KAAMA,KAAKmM,WAAYyF,EAAY,IAIjD5R,IACT,CAEAS,OAAAA,GACE,MAAM2J,EAAgBpK,KAAKG,KAAK,iBAC1BkK,EAAerK,KAAKG,KAAK,gBA+B/B,OA7BI5J,EAAW6T,IACbA,EAAcxM,KAAKoC,MAGrBA,KAAKU,kBAAkB8I,UAAUT,WAE7B/I,KAAKkO,cACP7L,aAAarC,KAAKkO,aAClBlO,KAAKkO,YAAc,MAGjBlO,KAAKmO,cACP9L,aAAarC,KAAKmO,aAClBnO,KAAKmO,YAAc,MAGjBnO,KAAKoO,gBACP/L,aAAarC,KAAKoO,eAClBpO,KAAKoO,cAAgB,MAGnBpO,KAAKqO,WACPrO,KAAKqO,SAAW,MAGd9X,EAAW8T,IACbA,EAAazM,KAAKoC,MAGbA,IACT,CAEAyP,UAAAA,GACE,MAAMhT,EAAWuD,KAAKG,KAAK,YAwB3B,OAtBAH,KAAKqO,SG7hBY2D,EAACvb,EAAIwb,EAAQ,MAChC,MAAMC,EAAOD,EAAMC,MAAQ,KACrBzV,EAAWwV,EAAMxV,UAAY,mBAC7BwC,EAAUgT,EAAMhT,SAAW,KAE3B1C,EAAU,CACd4V,WAFiBF,EAAME,YAAc,oBAKjC9D,EAAW,IAAI+D,sBAAsBC,IACzCA,EAAQ/a,SAASgb,IACXA,EAAMC,kBAAoB,GACxBhc,EAAWE,IACbA,EAAGmH,KAAKqB,GAAWqT,EAAMnO,OAAQmO,EAAMnO,OAE3C,GACA,GACD5H,GACGiW,EAAQ9a,EAAUwa,GAAQA,EAAO9Y,SAUvC,OARI8Y,IACF3V,EAAQ2V,KAAOA,GAGjBM,EAAMlZ,iBAAiBmD,GAAUnF,SAASmb,IACxCpE,EAASqE,QAAQD,EAAQ,IAGpBpE,CAAQ,EHigBG2D,EACb1J,IACC,MAAM5M,EAAK4M,EAAS0I,aAAa,WAEjC,GAAIhR,KAAK4O,QACP,OAAO,EAGL5O,KAAKoO,eACP/L,aAAarC,KAAKoO,eAGpBpO,KAAKoO,cAAgB5X,GAAM,KACzBwJ,KAAKuP,UAAU7T,EAAG,GACjB,IAAI,GAET,CACEe,WACAwC,QAASe,OAINA,IACT,CAEA2S,QAAAA,CAASzO,GACP,MAAMsG,EAAexK,KAAKG,KAAK,gBACzBuI,EAAUxE,EAAIG,eACd3I,EAAKgN,EAAQsI,aAAa,WAC1BjH,EAAYrB,EAAQuB,KAAKtR,MAAM,KAAK,GACpC2P,EAAWlP,SAASC,cAAc,IAAI0Q,KACtCtQ,EAAM+I,EAAU8F,IAAakC,EAAe,IAE5CrI,EAAMnC,KAAK7G,eAAeW,aAC1ByQ,EAAcvK,KAAKG,KAAK,eACxBgK,EAAQA,KACR5T,EAAWgU,IACbA,EAAY3M,KAAKoC,KAAM,WAGzBxJ,GAAM,KACJwJ,KAAK4O,SAAU,EACf5O,KAAKY,MAAM,iBAAkB,CAC3BnH,MACAiR,IAZM,EAaNvI,OACA,GACF,EAiBJ,OAdAnC,KAAK4O,SAAU,EACX5O,KAAKgP,WACPhP,KAAKwP,SACLhZ,GAAM,KACJwJ,KAAKxG,SAASC,EAAK0Q,GACnBnK,KAAKuP,UAAU7T,EAAG,GACjB,MAEHsE,KAAKxG,SAASC,EAAK0Q,GACnBnK,KAAKuP,UAAU7T,IAGjB1B,EAAKkK,GAEElE,IACT,CAEA4S,QAAAA,GACE,MAAMzZ,EAAiB6G,KAAK7G,eAsB5B,OApBI6G,KAAKkO,aACP7L,aAAarC,KAAKkO,aAGpBlO,KAAKkO,YAAc1X,GAAM,KACvB,MAAMiD,EAAMN,EAAeI,UAErB4I,EAAMhJ,EAAeW,aAAeX,EAAesR,aAErDzK,KAAKgP,WACPhP,KAAKwP,SAGPxP,KAAKY,MAAM,iBAAkB,CAC3BnH,MACAiR,IATU,EAUVvI,OACA,GACD,KAEInC,IACT,CAEA6S,QAAAA,GAEE,OAAK7S,KAAK+O,YAIN/O,KAAKmO,aACP9L,aAAarC,KAAKmO,aAGpBnO,KAAKmO,YAAc3X,GAAM,KACvBwJ,KAAKsP,uBAAuB,IAGvBtP,MAXEA,IAYX,CAEA2K,SAAAA,CAAUhQ,GAGR,OAFAqF,KAAKQ,QAAQ7F,GAENqF,IACT,CAEAK,YAAAA,GACE,MAAMuG,EAAM5G,KAAK4G,IACXzN,EAAiB6G,KAAK7G,eACtBvB,EAAUuB,EAAevB,QAAQyO,cACvC,IAAIzC,EAAWzK,EAEf,OAAI6G,KAAKoJ,QAAU,IAIH,SAAZxR,GAAkC,SAAZA,IACxBgM,EAAW/B,QAGbb,EAAG4F,EAAK,6BAA8B,QAAS5G,KAAK2S,SAAU3S,MAAM,GACpE0N,GAAG9J,EAAU,SAAU5D,KAAK4S,SAAU5S,MAAM,GACxCA,KAAK+O,YACPrB,GAAG7L,OAAQ,SAAU7B,KAAK6S,SAAU7S,MAAM,GAG5CA,KAAKe,IAAI,oBAAqBf,KAAKyP,WAAYzP,MAC/CA,KAAKe,IAAI,oBAAqBf,KAAK2K,UAAW3K,OAdrCA,IAiBX,CAEAU,eAAAA,GACE,MAAMjE,EAAWuD,KAAKG,KAAK,YACrByG,EAAM5G,KAAK4G,IACXzN,EAAiB6G,KAAK7G,eACtBvB,EAAUuB,EAAevB,QAAQyO,cACvC,IAAIzC,EAAWzK,EAEf,OAAI6G,KAAKoJ,QAAU,IAIH,SAAZxR,GAAkC,SAAZA,IACxBgM,EAAW/B,QAGbtC,EAAIqH,EAAK,QAAS5G,KAAK2S,UACvBpT,EAAIqE,EAAU,SAAU5D,KAAK4S,UACzB5S,KAAK+O,YACPxP,EAAIsC,OAAQ,SAAU7B,KAAK6S,UAE7B7S,KAAKmB,KAAK,qBACVnB,KAAKmB,KAAK,qBAENnB,KAAKqO,UACPjV,SAASE,iBAAiBmD,GAAUnF,SAASmb,IAC3CzS,KAAKqO,SAASyE,UAAUL,EAAQ,KAjB3BzS,IAsBX,EAGFiO,GAAUjF,SAsBDhS,EArBS,CACd6X,cAAe,GACf5V,cAAe,GACfwD,SAAU,mBACViS,OAAQ,EACRhD,QAAQ,EACRjR,UAAU,EACV2U,kBAAkB,EAClB9Q,SAAU,WACVkM,aAAc,EACd7P,SAAU,GACVuO,QAAS,KACTG,QAAS,KACTmE,YAAa,KACbC,YAAa,KACblD,YAAa,KACbH,cAAe,KACfC,aAAc,KACdqH,YAAa,OIruBjB,MCAMqB,GAAiB5c,IACrB,MAAM6c,EAAiB5c,OAAO4c,eAC9B,IAAIC,EAGJ,IDLoB9c,IACbS,EAAST,IAAgB,OAARA,ECInB+c,CAAa/c,GAChB,OAAO,EAQT,GALA8c,EAAQ9c,EAAIE,WAKP4c,EACH,OAAO,EAKT,IAFAA,EAAQ9c,EAEyB,OAA1B6c,EAAeC,IACpBA,EAAQD,EAAeC,GAGzB,OAAOD,EAAe7c,KAAS8c,CAAK,EC3BhCE,GAAc1b,IAClB,MAAM2b,EAAS,CACb,IAAK,QACL,IAAK,OACL,IAAK,OACL,IAAK,QACL,IAAK,UAGP,OAAO3b,EAAI6C,QAAQ,YAAa4Q,GACvBkI,EAAOlI,IAAQA,GACtB,ECQEmI,GAAY,GAClB,IAAIC,GAEJ/N,IAEA,MAAMgO,WAAgBzT,EACpBC,WAAAA,CAAYxD,GACVuM,QAEA9I,KAAK+I,WAEDxM,GACFyD,KAAKE,WAAW3D,EAEpB,CAEAwM,QAAAA,GAWE,OAVA/I,KAAKC,MAAQjJ,EAAUuc,GAAQvK,UAE/BhJ,KAAK4G,IAAM,KACX5G,KAAKtE,GAAK,GACVsE,KAAK0L,QAAS,EACd1L,KAAKwT,SAAU,EACfxT,KAAKyT,QAAU,GACfzT,KAAK0T,MAAQ,KACb1T,KAAK2T,WAAY,EAEV3T,IACT,CAEAE,UAAAA,CAAW3D,GAaT,OAZAyD,KAAKG,KAAK5D,GACVyD,KAAKtE,GAAKsE,KAAKG,KAAK,MACpBH,KAAKyT,OAASzT,KAAKG,KAAK,YAAc,GAEtCH,KAAKY,MAAM,UAASgT,EAAO,CAAA,EAAA5T,KAAKG,SAEhCH,KAAKI,SAASC,eAEVL,KAAKG,KAAK,YACZH,KAAKiN,OAGAjN,IACT,CAEAmM,QAAAA,GACE,OAAOnM,KAAK0L,MACd,CAEAmI,WAAAA,GACE,OAAO7T,KAAK2T,SACd,CAEAG,aAAAA,GACE,MAAM5Q,EAAOlD,KAAKG,KAAK,QACjB4T,EAAS/T,KAAKG,KAAK,UACnB6T,EAAQhU,KAAKG,KAAK,SAClB8T,EAAWjU,KAAKG,KAAK,YACrBqT,EAAUxT,KAAKG,KAAK,WACpBwM,EAAc3M,KAAKG,KAAK,eACxBnI,EAAY,CAChB,kBACA,mBAAmBkL,IACnB,mBAAmB6Q,KAmBrB,OAhBIC,GACFhc,EAAUyD,KAAK,yBAGZwY,GACHjc,EAAUyD,KAAK,8BAGb+X,GACFxb,EAAUyD,KAAK,2BAGbkR,GACF3U,EAAUyD,KAAKkR,GAGV3U,CACT,CAEAoI,MAAAA,GACE,MAAM8C,EAAOlD,KAAKG,KAAK,QACjBpB,EAAUiB,KAAKG,KAAK,WACpB4T,EAAS/T,KAAKG,KAAK,UACnB6T,EAAQhU,KAAKG,KAAK,SAClB8T,EAAWjU,KAAKG,KAAK,YACrB+T,EAA2BlU,KAAKG,KAAK,4BACrCnI,EAAYgI,KAAK8T,gBAEjBvW,EAAW,GACjB,IACI4W,EACAC,EACArE,EACAjE,EACAlF,EALAyN,EAAW,GAyDf,OAlDIL,GAAoB,YAAXD,IACXM,EAAW,IAGE,UAAXN,IACFI,EAAQjM,GAdkB,UAAX6L,EAAqB,UAAU7Q,IAASA,EAchC,CACrB8B,QAAS,UACToC,KAAMiN,IAER9b,EAAS4b,EAAO,yBAChB5W,EAAS9B,KAAK0Y,IAGXD,GAGHnE,EAAQ3W,SAASuN,yBACjBoJ,EAAMvU,UAAYuD,GAHlBgR,EAAQ3W,SAAS4N,eAAemM,GAAWhI,GAAapM,KAK1DqV,EAAWvO,EACT,IACA,CACE7N,UAAW,4BAEb,CAAC+X,IAEHxS,EAAS9B,KAAK2Y,GAEVH,IACFnI,EAAS5D,GAAK,QAAS,CACrBlD,QAAS,UACToC,KAAM,KAER7O,EAASuT,EAAQ,0BACjBvO,EAAS9B,KAAKqQ,IAGhBlF,EAAMf,EACJ,MACA,CACE7N,UAAWA,EAAU4N,KAAK,MAE5BrI,GAEFqJ,EAAIN,MAAMC,QAAU,aACpBvG,KAAK4G,IAAMA,EACXxN,SAASqM,KAAKwB,YAAYjH,KAAK4G,KAE/B5G,KAAKY,MAAM,WAEJZ,IACT,CAEAsU,YAAAA,GACE,MAAMxG,EAAS,0BACTlH,EAAM5G,KAAK4G,IACjB,IACI1D,EACA6Q,EACAC,EACAO,EACA7M,EACAC,EACA6M,EAPAH,EAAW,GASf,OAAIrU,KAAK6T,cACA7T,MAGT0H,EAAQd,EAAIvN,cAAc,iBAErBqO,GAILxE,EAAOlD,KAAKG,KAAK,QACjB4T,EAAS/T,KAAKG,KAAK,UACnB6T,EAAQhU,KAAKG,KAAK,SAEH,UAAX4T,EACFxb,EAASmP,EAAOoG,IAEhB3F,GAAYT,EAAOoG,GAEfkG,GAAoB,YAAXD,IACXM,EAAW,KAIf1M,EAAOD,EAAMrO,cAAc,sBAC3BoN,EAAckB,EAAM,CAClBrB,MAAO,SAAS+N,cAAqBA,SAGvCG,EAAO7M,EAAKtO,cAAc,OAC1Bkb,EAAsB,UAAXR,EAAqB,UAAU7Q,IAASA,EACnDkD,EAAaoO,EAAM,aAAc,iBAAiBD,KAE3CvU,MA1BEA,KA2BX,CAEAyU,eAAAA,GACE,MAAM7N,EAAM5G,KAAK4G,IACjB,IAAIwN,EACAF,EACAnV,EACAjE,EAEJ,OAAIkF,KAAK6T,gBAITO,EAAWxN,EAAIvN,cAAc,6BAC7B6a,EAA2BlU,KAAKG,KAAK,4BACrCpB,EAAUiB,KAAKG,KAAK,WAKlBrF,EAHGoZ,EAGInV,EAFAoU,GAAWhI,GAAapM,IAKjCqV,EAAS5Y,UAAYV,GAbZkF,IAgBX,CAEA0U,aAAAA,GACE,MAAM5G,EAAS,0BACTlH,EAAM5G,KAAK4G,IACjB,IAAIkF,EACAmI,EAEJ,OAAIjU,KAAK6T,gBAIT/H,EAASlF,EAAIvN,cAAc,2BAC3B4a,EAAWjU,KAAKG,KAAK,YAEjB2L,IACEmI,EACF1b,EAASuT,EAAQgC,GAEjB3F,GAAY2D,EAAQgC,KAVf9N,IAeX,CAEA2U,UAAAA,GACE,MAAM/N,EAAM5G,KAAK4G,IACjB,IAAI5O,EAEJ,OAAIgI,KAAK6T,gBAIT7b,EAAYgI,KAAK8T,gBACjB1N,EAAaQ,EAAK,YAAa5O,EAAU4N,KAAK,OAJrC5F,IAOX,CAEAQ,OAAAA,CAAQjE,GACN,OAAKwW,GAAcxW,IAInByD,KAAKG,KAAK5D,GACP+X,eACAG,kBACAC,gBACAC,aAEI3U,MATEA,IAUX,CAEA4U,UAAAA,GACE,OAAI5U,KAAK6T,eAIL7T,KAAK0T,QACPrR,aAAarC,KAAK0T,OAClB1T,KAAK0T,MAAQ,MALN1T,IASX,CAEA6U,UAAAA,CAAWC,GACT,OAAI9U,KAAK6T,gBAIT7T,KAAK0T,MAAQld,GAAM,KACjBwJ,KAAKY,MAAM,UACXZ,KAAKmN,OAAO,GACA,IAAX2H,IANM9U,IASX,CAEAiN,IAAAA,CAAK1Q,GACH,MAAMqK,EAAM5G,KAAK4G,IACjB,IAAI6M,EACAqB,EACArb,EACAgO,EAEJ,OAAIzH,KAAK6T,gBAIL7T,KAAKmM,YACPnM,KAAKQ,QAAQjE,GAGfkX,EAASzT,KAAKG,KAAK,UACnB2U,EAAW9U,KAAKG,KAAK,YACrB1G,EAAMga,GAAUA,GAAUzT,KAAKyT,OAASA,EAASzT,KAAKyT,OACtDhM,EAAW,OAAOhO,OAElBuG,KAAK4U,aAEL5U,KAAKY,MAAM,cAEXpK,GAAM,KACJwJ,KAAKwT,SAAU,EAEfjb,EAASqO,EAAK,2BACdA,EAAIN,MAAMC,QAAUkB,EAEhBqN,EAAW,GACb9U,KAAK6U,WAAWC,EAClB,GACC,MAzBM9U,IA4BX,CAEAmN,KAAAA,GACE,MAAMvG,EAAM5G,KAAK4G,IAEjB,IAAImO,EACAC,EAEJ,OAAIhV,KAAK6T,gBAITkB,EAAqB/U,KAAKG,KAAK,sBAC/B6U,EAAchV,KAAKG,KAAK,eAEpB5J,EAAWye,IACbA,EAAYpX,KAAKoC,MAGnB4G,EAAIN,MAAMC,QAfO,aAgBjB4B,GAAYvB,EAAK,2BAEjB5G,KAAKwT,SAAU,EACfxT,KAAK0L,QAAS,EAEdlV,GAAM,KACJwJ,KAAKY,MAAM,UAEPmU,GACF/U,KAAKS,SACP,GACC,MAtBMT,IAyBX,CAEAS,OAAAA,GAGE,OAFAT,KAAKY,MAAM,iBAEPZ,KAAK6T,gBAIT7T,KAAKU,kBAELtH,SAASqM,KAAKmD,YAAY5I,KAAK4G,KAE/BvE,aAAarC,KAAK0T,OAClB1T,KAAK+I,WAEL/I,KAAKY,MAAM,iBAVFZ,IAaX,CAEAiV,YAAAA,GAEE,OADAjV,KAAK4U,aACE5U,IACT,CAEAkV,YAAAA,GACE,MAAMJ,EAAW9U,KAAKG,KAAK,YACrBzJ,EAAQsJ,KAAKG,KAAK,SAExB,OAAI2U,GAAY,GAIhB9U,KAAK6U,WAAWne,GAHPsJ,IAMX,CAEAsN,OAAAA,GAGE,OAFAtN,KAAK4U,aACL5U,KAAKmN,QACEnN,IACT,CAEAK,YAAAA,GACE,MAAMuG,EAAM5G,KAAK4G,IAoBjB,OAlBA5F,EACE4F,EACA,4BACA,aACA5G,KAAKiV,aACLjV,MACA,GAEFgB,EACE4F,EACA,4BACA,aACA5G,KAAKkV,aACLlV,MACA,GAEFgB,EAAG4F,EAAK,0BAA2B,QAAS5G,KAAKsN,QAAStN,MAAM,GAEzDA,IACT,CAEAU,eAAAA,GACE,MAAMkG,EAAM5G,KAAK4G,IAMjB,OAJArH,EAAIqH,EAAK,aAAc5G,KAAKiV,cAC5B1V,EAAIqH,EAAK,aAAc5G,KAAKkV,cAC5B3V,EAAIqH,EAAK,QAAS5G,KAAKsN,SAEhBtN,IACT,EAGFuT,GAAQvK,SAkBChS,EAjBS,CACd0E,GAAI,GACJwH,KAAM,OACN6Q,OAAQ,UACRC,OAAO,EACPP,OAAQ,GACRqB,SAAU,EACVpe,MAAO,EACPqI,QAAS,GACT4N,YAAa,GACbsH,UAAU,EACVT,SAAS,EACTU,0BAA0B,EAC1Ba,oBAAoB,EACpBC,YAAa,OA1dH,CAAC,OAAQ,UAAW,UAAW,SAgevC1d,SAAS4L,IACbqQ,GAAQrQ,GAAS3G,IACf,MAAM4Y,EAAS,CAAA,EACTzZ,EAAKyD,EAAK,oBACV6V,EAAczY,EAAQyY,aAAe,KAC3C,IAAIvB,EAASlX,EAAQkX,QAAU,GAyB/B,OAvBIjc,EAAS+E,GACX4Y,EAAOpW,QAAUxC,EAEbwW,GAAcxW,IAChBsB,EAAOsX,EAAQ5Y,GAGnB4Y,EAAOzZ,GAAKA,EACZyZ,EAAOjS,KAAOA,EACdiS,EAAO1B,OAASA,EAChB0B,EAAO3B,SAAU,EACjB2B,EAAOH,YAAc,KACnBzB,GAAQpG,MAAMzR,EAAIsZ,EAAY,EAGhC1B,GAAW,IAAIC,GAAQ4B,GACvB9B,GAAU/b,SAASgG,IACjBmW,GAAUnW,EAAKsJ,IAAI+J,aAAe,EAAE,IAEtC2C,GAASG,OAASA,EAClBH,GAASrG,OACToG,GAAU5X,KAAK6X,IAERA,EAAQ,CAChB,IAIHC,GAAQpG,MAAQ,CAACzR,EAAIsZ,KACnB,MAAMI,EAAM/B,GAAUxa,OACtB,IACImC,EACA2V,EAFApV,GAAS,EAmBb,GAfA8X,GAAU/b,SAAQ,CAACgc,EAAUtY,KAEvBU,IAAO4X,EAAS5X,KAClBiV,EAAe2C,EAAS1M,IAAI+J,aAC5BpV,EAAQP,EAGJzE,EAAWye,IACbA,EAAYpX,KAAK0V,GAGnBD,GAAUzT,OAAO5E,EAAG,GACtB,IAGEoa,GAAO,IAAgB,IAAX7Z,GAAgBA,EAAQ8X,GAAUxa,OAAS,EACzD,OAAO,EAMT,IAHAmC,EAAIO,EAGGP,EAAIoa,EAAM,EAAGpa,GAAK,EAAG,CAC1B,MAAMqa,EAAMhC,GAAUrY,GAAG4L,IAEzByO,EAAI/O,MAAW,IAAInL,SAASka,EAAI/O,MAAW,IAAG,IAAMqK,EAAe,GAAK,IAC1E,GAIF4C,GAAQ+B,MAAQ,KACd,IAAIta,EAAIqY,GAAUxa,OAAS,EAC3B,KAAOmC,GAAK,EAAGA,GAAK,EAClBqY,GAAUrY,GAAGmS,OACf,ECjkBF,MAAMoI,GACJxV,WAAAA,CAAYnH,EAAM4c,GAChBxV,KAAKpH,KAAOA,EAERrC,EAAWif,KACbxV,KAAKwV,OAASA,EAElB,CAEA3W,OAAAA,GAGE,OAFAmB,KAAKwV,SAEExV,IACT,ECbF,MAAMyV,GACJ1V,WAAAA,GACEC,KAAK0V,SAAW,EAClB,CAEAC,GAAAA,CAAI/c,GACF,OAAOoH,KAAK0V,SAAStQ,MAAMwQ,GAAQA,EAAIhd,OAASA,GAClD,CAEAH,GAAAA,CAAIod,GAGF,OAFA7V,KAAK0V,SAASja,KAAKoa,GAEZ7V,IACT,CAEA8V,GAAAA,CAAIld,GACF,MAAM8c,EAAW1V,KAAK0V,SAChBG,EAAUH,EAAStQ,MAAMwQ,GAAQA,EAAIhd,OAASA,IAC9C2C,EAAQsa,EAAUH,EAAShd,QAAQmd,IAAY,EAMrD,OAJIta,GAAS,GACXma,EAAS9V,OAAOrE,EAAO,GAGlByE,IACT,CAEAsV,KAAAA,GAGE,OAFAtV,KAAK0V,SAAW,GAET1V,IACT,CAEAnB,OAAAA,CAAQjG,GACN,MAAMid,EAAU7V,KAAK0V,SAAStQ,MAAMwQ,GAAQA,EAAIhd,OAASA,IAMzD,OAJIrC,EAAWsf,eAAAA,EAAShX,UACtBgX,EAAQhX,UAGHmB,IACT,ECvCF,MAAM+V,GAAgBA,CAACC,EAAQC,GAAU,KACvC,MAAMvO,EAAQQ,GAAK8N,EAAO9N,KAAM,CAC9BlD,QAASgR,EAAOhR,SAAW,UAC3BqC,MAAO2O,EAAO3O,OAAS,GACvBD,KAAM4O,EAAO5O,OAETsB,EAAU7C,EACd,IACA,CACE7N,UAAW,0BACXiS,KAAM+L,EAAOE,MAEfxO,GAEIyO,EAAUtQ,EACd,MACA,CACE7N,UAAW,2BAA2Bge,EAAOpd,OAC7C,WAAYod,EAAOpd,MAErB,CAACod,EAAOE,KAAOxN,EAAUhB,IAa3B,OAVAnP,EAASmP,EAAO,yBAEZuO,GACF1d,EAAS4d,EAAS,2BAGhBH,EAAOI,UACT7d,EAAS4d,EAAS,4BAGbA,CAAO,EChBVE,GAAW,2BACXvI,GAAS,yBACT+C,GAAS,yBAEf,MAAMyF,WAAgBxW,EACpBC,WAAAA,CAAYxD,GACVuM,QAEA9I,KAAK+I,WAEDxM,GACFyD,KAAKE,WAAW3D,EAEpB,CAEAwM,QAAAA,GAUE,OATA/I,KAAKC,MAAQjJ,EAAUsf,GAAQtN,UAE/BhJ,KAAKoW,UAAW,EAChBpW,KAAK0L,QAAS,EAEd1L,KAAK4G,IAAM,KACX5G,KAAKuW,QAAU,GACfvW,KAAK0V,SAAW,KAET1V,IACT,CAEAE,UAAAA,CAAW3D,GACT,IAAI2M,EAgBJ,OAdAlJ,KAAKG,KAAK5D,GAEVyD,KAAKoW,SAAWpW,KAAKG,KAAK,YAC1BH,KAAK0L,OAAS1L,KAAKG,KAAK,UACxBH,KAAK0V,SAAW,IAAID,GAEpBvM,EAAUlJ,KAAKG,KAAK,WAEhB5J,EAAW2S,IACbA,EAAQtL,KAAKoC,MAGfA,KAAKI,SAASC,eAEPL,IACT,CAEAwW,WAAAA,CAAY5d,GACV,MAAMod,EAAShW,KAAK2V,IAAI/c,GAExB,QAAKod,GAIEle,EAASke,EAAOpP,IAAKiK,GAC9B,CAEA4F,UAAAA,CAAW7d,GACT,IAAIod,EAEJ,OAAIpd,GACFod,EAAShW,KAAK2V,IAAI/c,GAEXod,EAAOI,UAGTpW,KAAKoW,QACd,CAEAM,OAAAA,CAAQ9d,GAEN,QADeoH,KAAK2V,IAAI/c,EAE1B,CAEAuT,QAAAA,GACE,OAAOnM,KAAK0L,MACd,CAEAiL,WAAAA,CAAYX,GACV,MAAMY,EAAQ5W,MACRwV,OAAEA,EAAM5c,KAAEA,GAASod,EACzB,IAEI/W,EACAsE,EAHAsS,EAAU,KACV5U,EAAU,KAId,OAAKuU,GAILvU,EAAUuU,EAAOvU,QACjBhC,EAAUuW,EAAOvW,SAAWe,KAExBzJ,EAAW0K,GACbsC,EAAWtC,EACFzJ,EAASyJ,KAClBsC,EAAW,WACTqT,EAAMhW,MAAMK,EAASrI,KAIrBrC,EAAWgN,KACbsS,EAAU,IAAIN,GAAQ3c,EAAM2K,EAASsT,KAAK5X,KAGrC4W,GAlBEA,CAmBX,CAEAF,GAAAA,CAAI/c,GACF,OAAOoH,KAAKuW,QAAQnR,MAAM4Q,GAAWA,EAAOpd,OAASA,GACvD,CAEAwH,MAAAA,GACE,MAAMiJ,EAAUrJ,KAAKG,KAAK,WACpBoW,EAAUvW,KAAKG,KAAK,YAAc,GAClCiM,EAAYpM,KAAKG,KAAK,aAuB5B,OArBAoF,IAEAvF,KAAK4G,IAAMf,EAAc,MAAO,CAC9BnK,GAAIyD,EAAK,mBACTnH,UAAW,mCAAmCoU,MAEhDpM,KAAKsJ,OAAOiN,GACZnd,SAASqM,KAAKwB,YAAYjH,KAAK4G,KAE3B5G,KAAK0L,QACP1L,KAAK+R,OAGH/R,KAAKoW,UACPpW,KAAK8W,UAGHvgB,EAAW8S,IACbA,EAAQzL,KAAKoC,MAGRA,IACT,CAEAuJ,KAAAA,GAEE,OADAvJ,KAAK4G,IAAIpL,UAAY,GACdwE,IACT,CAEAsJ,MAAAA,CAAOiN,GACL,MAAMN,EAAUjW,KAAKG,KAAK,WACpBuG,EAAYtN,SAASuN,yBAyB3B,OAvBA4P,EAAQjf,SAAS0e,IACf,MAAMG,EAAUJ,GAAcC,EAAQC,GAChCJ,EAAU7V,KAAK2W,YAAYX,IAC3Bpd,KAAEA,EAAIwd,SAAEA,EAAQnX,QAAEA,GAAY+W,EAEpCtP,EAAUO,YAAYkP,GAEjBnW,KAAK0W,QAAQ9d,KAChBoH,KAAKuW,QAAQ9a,KAAK,CAChBmL,IAAKuP,EACLvd,OACAwd,SAAUA,IAAY,EACtBnX,QAASA,GAAWe,OAGlB6V,GACF7V,KAAK0V,SAASjd,IAAIod,GAEtB,IAGF7V,KAAK4G,IAAIK,YAAYP,GAEd1G,IACT,CAEAwJ,OAAAA,GAEE,OADApQ,SAASqM,KAAKmD,YAAY5I,KAAK4G,KACxB5G,IACT,CAEAQ,OAAAA,CAAQ+V,GAGN,OAFAvW,KAAKG,KAAK,CAAEoW,YACZvW,KAAKuJ,QAAQD,OAAOiN,GACbvW,IACT,CAEAvH,GAAAA,CAAIud,GACF,MAAMpP,EAAM5G,KAAK4G,IACXF,EAAYtN,SAASuN,yBACrB4P,EAAUvW,KAAKG,KAAK,YAAc,IAClCvH,KAAEA,EAAIwd,SAAEA,EAAQnX,QAAEA,GAAY+W,EAC9BH,EAAU7V,KAAK2W,YAAYX,GAC3Be,EAAQf,IACZ,MAAMG,EAAUJ,GAAcC,GAE9BtP,EAAUO,YAAYkP,GAEtBI,EAAQ9a,KAAKua,GACbhW,KAAKuW,QAAQ9a,KAAK,CAChBmL,IAAKuP,EACLvd,OACAwd,SAAUA,IAAY,EACtBnX,QAASA,GAAWe,KACpB6V,YAGEA,GACF7V,KAAK0V,SAASjd,IAAIod,EACpB,EAcF,OAXIjf,EAASof,GACXe,EAAKf,GACIlf,EAAQkf,IACjBA,EAAO1e,SAASgG,IACV1G,EAAS0G,IACXyZ,EAAKzZ,EACP,IAGJsJ,EAAIK,YAAYP,GAET1G,IACT,CAEAoI,MAAAA,CAAOxP,GACL,MAAMgO,EAAM5G,KAAK4G,IACX2P,EAAUvW,KAAKuW,QACfP,EAAShW,KAAK2V,IAAI/c,GACxB,IAAI2C,GAAS,EAEb,OAAKya,GAILza,EAAQgb,EAAQ7d,QAAQsd,GAEpBza,GAAS,IACXgb,EAAQ3W,OAAOrE,EAAO,GACtByE,KAAKG,KAAK,WAAWP,OAAOrE,EAAO,IAGrCyE,KAAKgX,SAASpe,GACdgO,EAAIgC,YAAYoN,EAAOpP,KAEhB5G,MAbEA,IAcX,CAEAgX,QAAAA,CAASpe,GACP,MAAMod,EAAShW,KAAK2V,IAAI/c,GAClBid,EAAU7V,KAAK0V,SAASC,IAAI/c,GAElC,OAAKod,GAAUA,EAAOI,WAItBJ,EAAOI,UAAW,EAEdP,GACF7V,KAAK0V,SAASI,IAAID,GAGpBtd,EAASyd,EAAOpP,IAAKyP,KATZrW,IAYX,CAEAiX,OAAAA,CAAQre,GACN,MAAMod,EAAShW,KAAK2V,IAAI/c,GAClBid,EAAU7V,KAAK0V,SAASC,IAAI/c,GAElC,OAAKod,GAAWA,EAAOI,UAIvBJ,EAAOI,UAAW,EAEdP,GACF7V,KAAK0V,SAASjd,IAAIod,GAGpB1N,GAAY6N,EAAOpP,IAAKyP,IAEjBrW,MAXEA,IAYX,CAEA8W,OAAAA,CAAQle,GACN,MAAMwd,EAAWpW,KAAKG,KAAK,iBAc3B,OAZIvH,EACFoH,KAAKgX,SAASpe,IAEdL,EAASyH,KAAK4G,IAAKyP,IACnBrW,KAAKU,kBACLV,KAAKoW,UAAW,EAEZ7f,EAAW6f,IACbA,EAASxY,KAAKoC,OAIXA,IACT,CAEAkX,MAAAA,CAAOte,GACL,MAAMue,EAAUnX,KAAKG,KAAK,gBAc1B,OAZIvH,EACFoH,KAAKiX,QAAQre,IAEboH,KAAKoW,UAAW,EAChBjO,GAAYnI,KAAK4G,IAAKyP,IACtBrW,KAAKK,eAED9J,EAAW4gB,IACbA,EAAQvZ,KAAKoC,OAIVA,IACT,CAEA8R,IAAAA,CAAKlZ,GACH,MAAMsU,EAASlN,KAAKG,KAAK,eACnB6V,EAAShW,KAAK2V,IAAI/c,GAClBgO,EAAM5G,KAAK4G,IAEjB,GAAIhO,EAAM,CACR,IAAKod,EACH,OAAOhW,KAGTmI,GAAY6N,EAAOpP,IAAKkH,GAC1B,MACE3F,GAAYvB,EAAKkH,IACjB9N,KAAK0L,QAAS,EAEVnV,EAAW2W,IACb1W,GAAM,KACJ0W,EAAOtP,KAAKoC,KAAK,GAChB,KAIP,OAAOA,IACT,CAEA+R,IAAAA,CAAKnZ,GACH,MAAM8S,EAAS1L,KAAKG,KAAK,eACnB6V,EAAShW,KAAK2V,IAAI/c,GAClBgO,EAAM5G,KAAK4G,IAEjB,GAAIhO,EAAM,CACR,IAAKod,EACH,OAAOhW,KAGTzH,EAASyd,EAAOpP,IAAKkH,GACvB,MACEvV,EAASqO,EAAKkH,IACd9N,KAAK0L,QAAS,EAEVnV,EAAWmV,IACblV,GAAM,KACJkV,EAAO9N,KAAKoC,KAAK,GAChB,KAIP,OAAOA,IACT,CAEAoN,MAAAA,CAAOxU,GAOL,OANIoH,KAAKmM,WACPnM,KAAK8R,KAAKlZ,GAEVoH,KAAK+R,KAAKnZ,GAGLoH,IACT,CAEAuP,SAAAA,CAAU3W,GACR,MAAMod,EAAShW,KAAK2V,IAAI/c,GACxB,IAAIud,EAEJ,OAAKH,GAILG,EAAUH,EAAOpP,IAEb9O,EAASqe,EAAStF,IACpB1I,GAAYgO,EAAStF,IAErBtY,EAAS4d,EAAStF,IAGb7Q,MAXEA,IAYX,CAEAS,OAAAA,GACE,MAAM2J,EAAgBpK,KAAKG,KAAK,iBAC1BkK,EAAerK,KAAKG,KAAK,gBAa/B,OAXI5J,EAAW6T,IACbA,EAAcxM,KAAKoC,MAGrBA,KAAK0V,SAASJ,QACdtV,KAAKU,kBAAkB8I,UAAUT,WAE7BxS,EAAW8T,IACbA,EAAazM,KAAKoC,MAGbA,IACT,CAEAnB,OAAAA,CAAQjG,GACN,OAAIoH,KAAKyW,WAAW7d,IAIpBoH,KAAK0V,SAAS7W,QAAQjG,GAHboH,IAMX,CAEAoX,SAAAA,CAAUlT,GACR,MAAMiS,EAAUjS,EAAIG,eACpB,IAAIuR,EAAM,GAUV,OARIO,IACFP,EAAMO,EAAQnF,aAAa,YAEvB4E,GACF5V,KAAKnB,QAAQ+W,IAIV5V,IACT,CAEAqX,cAAAA,EAAe5d,IAAEA,EAAGiR,IAAEA,EAAGvI,IAAEA,IACzB,MAAMjH,EAAUgH,KAAKoV,KAAK7d,GAa1B,OAXIyB,GAAWwP,GACb1K,KAAK+R,KAAK,MACV/R,KAAK8R,KAAK,SACD5W,GAAWiH,GACpBnC,KAAK+R,KAAK,QACV/R,KAAK8R,KAAK,OACD5W,EAAUwP,GAAOxP,EAAUiH,IACpCnC,KAAK8R,KAAK,MACV9R,KAAK8R,KAAK,SAGL9R,IACT,CAEAuX,eAAAA,EAAgB9d,IAAEA,EAAGiR,IAAEA,EAAGvI,IAAEA,IAE1B,OADAnC,KAAKqX,eAAe,CAAE5d,MAAKiR,MAAKvI,QACzBnC,IACT,CAEAwX,WAAAA,CAAYjB,GAMV,OALAvW,KAAKG,KAAK,CACRoW,YAEFvW,KAAKQ,QAAQ+V,GAENvW,IACT,CAEAyX,cAAAA,CAAe7e,GAEb,OADAoH,KAAKoI,OAAOxP,GACLoH,IACT,CAEAK,YAAAA,GACE,MAAMkW,EAAUvW,KAAKG,KAAK,YAAc,GAClCyG,EAAM5G,KAAK4G,IAEjB,OAAK2P,GAAWA,EAAQ1d,OAAS,IAIjCmI,EAAG4F,EAAK,2BAA4B,QAAS5G,KAAKoX,UAAWpX,MAAM,GAEnEA,KAAKe,IAAI,iBAAkBf,KAAKuX,iBAChCvX,KAAKe,IAAI,qBAAsBf,KAAKwX,aACpCxX,KAAKe,IAAI,wBAAyBf,KAAKyX,gBACvCzX,KAAKe,IAAI,iBAAkBf,KAAKoN,SARvBpN,IAWX,CAEAU,eAAAA,GACE,MAAM6V,EAAUvW,KAAKG,KAAK,YAAc,GAClCyG,EAAM5G,KAAK4G,IAEjB,OAAK2P,GAAWA,EAAQ1d,OAAS,IAIjC0G,EAAIqH,EAAK,2BAA4B5G,KAAKoX,WAE1CpX,KAAKmB,KAAK,kBACVnB,KAAKmB,KAAK,sBACVnB,KAAKmB,KAAK,yBACVnB,KAAKmB,KAAK,mBARDnB,IAWX,EAGFsW,GAAQtN,SAiBChS,EAhBS,CACdoV,UAAW,MACXV,QAAQ,EACR0K,UAAU,EACVH,SAAS,EACTM,QAAS,GACTrN,QAAS,KACTG,QAAS,KACTmE,YAAa,KACbC,YAAa,KACbiK,cAAe,KACfC,aAAc,KACdvN,cAAe,KACfC,aAAc,OCxiBlB,MAAMuN,GACJ7X,WAAAA,CAAYxD,GACVyD,KAAK6X,UAAY,IAAIC,yBAEjBvb,GACFyD,KAAKE,WAAW3D,EAEpB,CAEAwb,WAAAA,CAAYxb,GAyBV,OAxBIA,EAAQyb,MACVhY,KAAKiY,QAAQ1b,EAAQyb,MAGnBzb,EAAQ2b,OACVlY,KAAKmY,SAAS5b,EAAQ2b,OAGpB3b,EAAQ6b,MACVpY,KAAKqY,QAAQ9b,EAAQ6b,MAGnB7b,EAAQzB,MACVkF,KAAKsY,QAAQ/b,EAAQzB,MAGnByB,EAAQgc,OACVvY,KAAKwY,SAASjc,EAAQgc,OAGpBhc,EAAQkc,QACVzY,KAAK0Y,UAAUnc,EAAQkc,QAGlBzY,IACT,CAEAE,UAAAA,CAAW3D,GAET,OADAyD,KAAK+X,YAAYxb,GAASoc,gBACnB3Y,IACT,CAEA4Y,UAAAA,GACE,OAAOC,gBAAgBC,QACzB,CAEAC,SAAAA,GACE,OAAOF,gBAAgBG,OACzB,CAEAC,QAAAA,GACE,OAAOJ,gBAAgBK,MACzB,CAEAC,SAAAA,GACE,OAAON,gBAAgBM,WACzB,CAEAlB,OAAAA,CAAQD,GAEN,OADAhY,KAAK6X,UAAUG,KAAOA,EACfhY,IACT,CAEAmY,QAAAA,CAASD,GAEP,OADAlY,KAAK6X,UAAUK,MAAQA,EAChBlY,IACT,CAEAqY,OAAAA,CAAQD,GAEN,OADApY,KAAK6X,UAAUO,KAAOA,EACfpY,IACT,CAEAsY,OAAAA,CAAQxd,GAEN,OADAkF,KAAK6X,UAAU/c,KAAOA,EACfkF,IACT,CAEAwY,QAAAA,CAASD,GAEP,OADAvY,KAAK6X,UAAUU,MAAQA,EAChBvY,IACT,CAEA0Y,SAAAA,CAAUD,GAER,OADAzY,KAAK6X,UAAUY,OAASA,EACjBzY,IACT,CAEAoZ,KAAAA,CAAMte,GAOJ,OANIA,GACFkF,KAAKsY,QAAQxd,GAGf+d,gBAAgBO,MAAMpZ,KAAK6X,WAEpB7X,IACT,CAEAqZ,KAAAA,GAEE,OADAR,gBAAgBQ,QACTrZ,IACT,CAEAsZ,MAAAA,GAEE,OADAT,gBAAgBS,SACTtZ,IACT,CAEAuZ,MAAAA,GAGE,OAFAV,gBAAgBU,SAChBvZ,KAAKsY,QAAQ,IACNtY,IACT,CAEA2Y,aAAAA,GACE,MASMd,EAAY7X,KAAK6X,UACjB2B,EAASxZ,KAkBf,MA5ByB,CACvB,WACA,MACA,QACA,QACA,OACA,QACA,UAKe1I,SAASsB,IACxBif,EAAU,KAAKjf,KAAWiI,IACxBC,EAAQlI,EAAM,CACZiI,QACA2Y,UACA,CACH,IAGHX,gBAAgBY,gBAAmB5Y,IACjCC,EAAQ,gBAAiB,CACvBD,QACA2Y,UACA,EAGGxZ,IACT,EAGF4X,GAAO8B,UACE,oBAAqB7X,OCpJ9B,MAAM8X,GAAyBA,CAACC,EAAgBC,KAC9C,IAAIjiB,EACAkiB,EAAWF,EAEf,KAAOE,GACLliB,EAAUkiB,EAASliB,QAAQyO,cAEX,WAAZzO,GAAoC,UAAZA,GAC1BW,EAASuhB,EAAU,0BAInBA,EADED,EACSC,EAASC,uBAETD,EAASE,kBAExB,ECZIC,GAAWA,KACf,MAAMC,EAAKC,UAAUC,UAErB,MAAO,wDAAwDtS,KAAKoS,EAAG,ECWnEG,GAAoB,wBAE1B,MAAMC,WAAexa,EACnBC,WAAAA,CAAYxD,GACVuM,QAEA9I,KAAK+I,WAEDxM,GACFyD,KAAKE,WAAW3D,EAEpB,CAEAwM,QAAAA,GAcE,OAbA/I,KAAKC,MAAQjJ,EAAUsjB,GAAOtR,UAC9BhJ,KAAKua,SAAU,EAEfva,KAAKwa,QAAU,KACfxa,KAAK4G,IAAM,KACX5G,KAAKya,OAAS,KACdza,KAAK6L,OAAS,KACd7L,KAAKrD,SAAW,KAChBqD,KAAK0a,UAAY,KAEjB1a,KAAK2a,QAAU,KACf3a,KAAKwZ,OAAS,KAEPxZ,IACT,CAEAE,UAAAA,CAAW3D,GACT,IAAI4H,EAYJ,OAVAnE,KAAKG,KAAK5D,GAEV4H,EAASnE,KAAKG,KAAK,UAEf3I,EAAS2M,GACXnE,KAAKwa,QAAUphB,SAASC,cAAc8K,GAC7BzM,EAAUyM,KACnBnE,KAAKwa,QAAUrW,GAGZnE,KAAKwa,SAIN5C,GAAO8B,YACT1Z,KAAKwZ,OAAS,IAAI5B,IAGpB5X,KAAKI,SAASC,eAEPL,MATEA,IAUX,CAEA4Y,UAAAA,GAAa,IAAAgC,EACX,OAAO5a,YAAY,QAAR4a,EAAJ5a,KAAMwZ,cAANoB,IAAYA,OAAZA,EAAAA,EAAchC,YACvB,CAEAxY,MAAAA,GAEE,OADAJ,KAAK6a,cAAcvR,OAAOtJ,KAAKwa,SACxBxa,IACT,CAEAuJ,KAAAA,GAEE,OADAvJ,KAAKrD,SAASnB,UAAY,GACnBwE,IACT,CAEAsJ,MAAAA,CAAOwD,GACL,MAAMpG,EAAYtN,SAASuN,yBACrB9C,EAAS/G,EAAAC,EAAO+P,EAASgO,WAAU,GAAMvd,UAU/C,OARA/G,GAAM,KACJqN,EAAUvM,SAAS0M,IACjB0C,EAAUO,YAAYjD,EAAO,IAG/BhE,KAAKrD,SAASsK,YAAYP,EAAU,IAG/B1G,IACT,CAEAwJ,OAAAA,GACE,MAAM5C,EAAM5G,KAAK4G,IACX+T,EAAU3a,KAAK2a,QAUrB,OARI/T,GACFxN,SAASqM,KAAKmD,YAAYhC,GAGxB+T,GACFA,EAAQla,UAGHT,IACT,CAEAQ,OAAAA,GAEE,OADAR,KAAKuJ,QAAQD,OAAOtJ,KAAKwa,SAClBxa,IACT,CAEA+a,gBAAAA,GAEE,OAAKlZ,OAAOmZ,gBAAmBf,MAI/Bja,KAAK0a,UAAUO,QACb,CAEEC,MAAO,CAAC,MAAO,QAEjB,CAEEC,SAAU,IAAIH,eAAe,CAC3Bjd,OAAQiC,KAAKrD,SACbye,KAAM,YAKLpb,MAjBEA,IAkBX,CAEA6a,WAAAA,GACE,MAAML,EAAUxa,KAAKwa,QAEfpT,EADS6S,KACO,GAAK,GAC3B,IACIrT,EACA6T,EACA5O,EACAlP,EACA+d,EACAZ,EANArO,EAAQzL,KAAKG,KAAK,SAQtBua,EAAY7U,EAAc,MAAO,CAC/B7N,UAAW,6BAEbgI,KAAK0a,UAAYA,EAEjB7O,EAAS2O,EAAQnhB,cAAc,MAE3B3B,EAAU+T,KACZI,EAASJ,GAGP/T,EAAUmU,KACZJ,EAAQI,EAAOrF,WAGjBqF,EAAShG,EACP,KACA,CACE7N,UAAW,yBAEbyT,GAEFzL,KAAK6L,OAASA,EAEdlP,EAAWkJ,EACT,UACA,CACEnK,GAAI,0BACJ1D,UAAW,2BAEbiiB,KAAa,GAAK,CAACS,EAAUI,cAE/B9a,KAAKrD,SAAWA,EAEhB8d,EAAS5U,EACP,MACA,CACEnK,GAAI,wBACJ1D,UAAW,yBAEb,CAAC6T,EAAQlP,IAEXqD,KAAKya,OAASA,EAEd,MAAMlE,EAAU,GA8DhB,OA5DAA,EAAQ9a,KAAK,CACX7C,KAAM,QACNsP,KAAM,QACNd,OACAoO,OAAQ,CACNvW,QAASe,KACTiB,QAASjB,KAAKqb,SAIdzD,GAAO8B,WAAa1Z,KAAKG,KAAK,eAChCoW,EAAQ9a,KAAK,CACX7C,KAAM,QACNsP,KAAM,QACNd,OACAoO,OAAQ,CACNvW,QAASe,KACTiB,QAASjB,KAAKoZ,SAKpB7C,EAAQ9a,KAAK,CACX7C,KAAM,OACNsP,KAAM,QACNd,OACAoO,OAAQ,CACNvW,QAASe,KACTiB,QAASjB,KAAKsb,QAIlBtb,KAAK2a,QAAU,IAAIrE,GAAQ,CACzBlK,UAAW,MACXmK,YAGF3P,EAAMf,EACJ,UACA,CACEnK,GAAI,iBACJ1D,UAAW,wCAEb,CAAC0iB,EAAWD,EAAQza,KAAK2a,QAAQ/T,MAEnC5G,KAAK4G,IAAMA,EAEXxN,SAASqM,KAAKwB,YAAYL,GAE1B5G,KAAK+a,mBAELvkB,GAAM,KAEJsjB,EAAWlT,EAAImT,uBACfJ,GAAuBG,GAAU,GAEjCA,EAAWlT,EAAIoT,mBACfL,GAAuBG,EAAS,IAG3B9Z,IACT,CAEAub,KAAAA,GACE,MAAMC,EAAS,iBACTC,EAAU,GAAGD,aACb1N,EAAS,GAAG0N,WACZ5U,EAAM5G,KAAK4G,IACX8U,EAAYtiB,SAASE,iBAAiB,2BACtCqiB,EAAkB3b,KAAKG,KAAK,oBAAsBka,GAExD,OAAIra,KAAKua,UAAY3T,IAIrB8U,EAAUpkB,SAASwiB,IACjBvhB,EAASuhB,EAAUhM,EAAO,IAE5BvV,EAASqO,EAAK6U,GACdtT,GAAYvB,EAAKkH,GACjB9N,KAAK2a,QAAQ7I,OACb9R,KAAKua,SAAU,EAEfhH,GAAQqI,KAAK,CACX5H,OAAO,EACPjV,QAAS4c,IAGX3b,KAAKY,MAAM,iBAhBFZ,IAmBX,CAEAsb,IAAAA,GACE,MAAMO,EAAQ,QACRL,EAAS,iBACTC,EAAU,GAAGD,aACb1N,EAAS,GAAG0N,WACZ5U,EAAM5G,KAAK4G,IACX8U,EAAYtiB,SAASE,iBAAiB,2BACtCkgB,EAASxZ,KAAKwZ,OACdmB,EAAU3a,KAAK2a,QAErB,OAAK3a,KAAKua,SAAY3T,GAItBrO,EAASqO,EAAKkH,GACd3F,GAAYvB,EAAK6U,GACjBC,EAAUpkB,SAASwiB,IACjB3R,GAAY2R,EAAUhM,EAAO,IAE/B6M,EAAQ5I,OACR/R,KAAKua,SAAU,EAEXf,IACEmB,EAAQnE,YAAYqF,IACtBlB,EAAQpL,UAAUsM,GAGpBrC,EAAOD,UAGTvZ,KAAKY,MAAM,eAEJZ,MArBEA,IAsBX,CAEAoN,MAAAA,GAOE,OANIpN,KAAKua,QACPva,KAAKsb,OAELtb,KAAKub,QAGAvb,IACT,CAEAoZ,KAAAA,GACE,MAAMte,EAAOkF,KAAKrD,SAAS6J,UACrBgT,EAASxZ,KAAKwZ,OAEpB,OAAK5B,GAAO8B,WAAcF,GAI1BxZ,KAAK2a,QAAQpL,UAAU,SAEnBvP,KAAK4Y,aACPY,EAAOD,SAEPC,EAAOJ,MAAMte,GAGRkF,MAXEA,IAYX,CAEAqb,KAAAA,GACE,OAAK9kB,EAAW8kB,QAIhBA,QAEOrb,MALEA,IAMX,CAEAS,OAAAA,GAGE,OAFYT,KAAK4G,KAMjB5G,KAAKU,kBAAkB8I,UAAUT,WAE1B/I,MALEA,IAMX,CAEA8b,OAAAA,GAEE,OADA9b,KAAKqb,QACErb,IACT,CAEA+b,cAAAA,GAEE,OADA/b,KAAKoN,SACEpN,IACT,CAEAgc,aAAAA,CAAc9X,GAQZ,OALgB,KAFAA,EAAI+X,SAEEjc,KAAKua,UACzBva,KAAKoN,SACLpT,EAAKkK,IAGAlE,IACT,CAEA2K,SAAAA,GAGE,OAFA3K,KAAKQ,UAEER,IACT,CAEAK,YAAAA,GAGE,OAFYL,KAAK4G,KAMjB8G,GAAGtU,SAAU,QAAS4G,KAAKgc,cAAehc,MAAM,GAEhDA,KAAKe,IAAI,uBAAwBf,KAAK8b,SACtC9b,KAAKe,IAAI,yBAA0Bf,KAAK+b,gBACxC/b,KAAKe,IAAI,eAAgBf,KAAK8b,SAC9B9b,KAAKe,IAAI,iBAAkBf,KAAK2K,WAChC3K,KAAKe,IAAI,eAAgBf,KAAKub,OAC9Bvb,KAAKe,IAAI,cAAef,KAAKsb,MAC7Btb,KAAKe,IAAI,gBAAiBf,KAAKoN,QAExBpN,MAbEA,IAcX,CAEAU,eAAAA,GAGE,OAFYV,KAAK4G,KAMjBrH,EAAInG,SAAU,QAAS4G,KAAKgc,eAE5Bhc,KAAKmB,KAAK,wBACVnB,KAAKmB,KAAK,0BACVnB,KAAKmB,KAAK,kBACVnB,KAAKmB,KAAK,iBAEHnB,MAVEA,IAWX,SAGFsa,GAAOtR,SAQEhS,EAPS,CACdmN,OAAQ,GACRsH,MAAO,GACPkQ,gBAAiBtB,GACjB6B,YAAY,ICrbhB,MAAMC,WAAgBrc,EACpBC,WAAAA,CAAYxD,GACVuM,QAEA9I,KAAKoc,QAAU,SACfpc,KAAK+I,WAEDxM,GACFyD,KAAKE,WAAW3D,EAEpB,CAEAwM,QAAAA,GACE,MAAMxM,EAAU4f,GAAQnT,SAaxB,OAXAhJ,KAAKC,MAAQjJ,EAAUuF,GACvByD,KAAKrD,SAAW,KAChBqD,KAAK7G,eAAiB,KACtB6G,KAAKuW,QAAU,GAEfvW,KAAKqc,QAAU,KACfrc,KAAKsc,OAAS,KACdtc,KAAKma,UAAY,KACjBna,KAAKuc,OAAS,KACdvc,KAAK2a,QAAU,KAER3a,IACT,CAEAE,UAAAA,CAAW3D,GACT,IAAIC,EAAiB,GACjBvD,EAAgB,GAChB0D,EAAW,KAkBf,OAhBAqD,KAAKG,KAAK5D,GAEVC,EAAiBwD,KAAKG,KAAK,kBAC3BlH,EAAgB+G,KAAKG,KAAK,iBAEtB3I,EAASgF,GACXG,EAAWvD,SAASC,cAAcmD,GACzB9E,EAAU8E,KACnBG,EAAWH,GAEbwD,KAAKrD,SAAWA,EAChBqD,KAAK7G,eAAiBH,EAAkBC,GAExC+G,KAAKY,MAAM,UAASgT,EAAO,CAAA,EAAA5T,KAAKG,SAChCH,KAAKI,SAASC,eAEPL,IACT,CAEAwc,UAAAA,GACE,MAAMle,EAAW0B,KAAKG,KAAK,YACrBmc,EAAStc,KAAKsc,OACdnC,EAAYna,KAAKma,UAGvB,QAFcna,KAAKoJ,QAEP,KAIK,aAAb9K,GACMge,EAAOnQ,YAEPgO,EAAUhO,WAEtB,CAEA7P,WAAAA,CAAYI,GAAmB,GAC7B,MAAMF,EAAiBwD,KAAKrD,SACtBF,EAAWuD,KAAKG,KAAK,YACrB1F,EAAWuF,KAAKG,KAAK,YACrBzF,EAAoBsF,KAAKG,KAAK,qBAEpC,OAAO7D,EAAY,CACjBE,iBACAC,WACAhC,WACAC,oBACAgC,oBAEJ,CAEA0M,KAAAA,GACE,OAAOpJ,KAAK1D,cAAczD,MAC5B,CAEAuH,MAAAA,GACE,MAAMqc,EAAazc,KAAKG,KAAK,cACvBhH,EAAiB6G,KAAK7G,eAc5B,OAZA6G,KAAK0c,gBAAgBC,iBAAiBC,mBAAmBC,iBAErD1jB,GAAkBsjB,GACpBzc,KAAKY,MAAM,iBAAkB,CAC3BnH,IAAKN,EAAeI,UACpBmR,IAAK,EACLvI,IAAKhJ,EAAeW,eAIxBkG,KAAKY,MAAM,WAEJZ,IACT,CAEA0c,aAAAA,GACE,MAAMI,EAAS9c,KAAKG,KAAK,UAEzB,OAAK2c,EAAO3Y,QAIZ5L,EAASyH,KAAKrD,SAAU,mBAExBqD,KAAKuc,OAAS,IAAIjC,GAAOwC,GAElB9c,MAPEA,IAQX,CAEA2c,cAAAA,GACE,MAAMngB,EAAiBwD,KAAKG,KAAK,kBAC3B1D,EAAWuD,KAAKG,KAAK,YACrBqK,EAAexK,KAAKG,KAAK,gBACzBlH,EAAgB+G,KAAKG,KAAK,iBAC1B1F,EAAWuF,KAAKG,KAAK,YACrBuJ,EAAY1J,KAAKG,KAAK,aACtBoK,EAAcvK,KAAKG,KAAK,eACxBzF,EAAoBsF,KAAKG,KAAK,qBAC9BwJ,EAAmB3J,KAAKG,KAAK,oBAcnC,OAZAH,KAAKqc,QAAU,IAAIxT,GAAQ,CACzBrM,iBACAgO,eACAvR,gBACAwD,WACAhC,WACAiP,YACAa,cACA7P,oBACAiP,qBAGK3J,IACT,CAEA4c,gBAAAA,GACE,MAAMnR,EAAQzL,KAAKG,KAAK,SAClBqK,EAAexK,KAAKG,KAAK,gBACzBlH,EAAgB+G,KAAKG,KAAK,iBAC1BwM,EAAc3M,KAAKG,KAAK,eACxB1F,EAAWuF,KAAKG,KAAK,YACrBiP,EAAmBpP,KAAKG,KAAK,oBAC7BoN,EAAoBvN,KAAKG,KAAK,qBAC9B4c,EAAoB/c,KAAKG,KAAK,qBAC9B7B,EAAW0B,KAAKG,KAAK,YACrBiM,EAAYpM,KAAKG,KAAK,aACtBuR,EAAc1R,KAAKG,KAAK,eACxBkN,EAAcrN,KAAKG,KAAK,eACxBoK,EAAcvK,KAAKG,KAAK,eACxBiJ,EAAQpJ,KAAKoJ,QACnB,IACI4T,EADAnO,EAAgB7O,KAAKG,KAAK,iBAG9B,OAAIiJ,EAAQ,IAIZ4T,EAAU,CACR/jB,gBACAwB,WACA2U,mBACA9Q,WACAmN,QACAjB,eACA7P,SAAUqF,KAAK1D,cACfoV,cACArE,cACA9C,eAGe,aAAbjM,GACF0B,KAAKsc,OAAS,IAAI9Q,GAAO,CACvBY,YACAX,QACArE,KAAM,OACNmF,WAAW,EACXC,YAAY,EACZe,oBACAZ,cACAa,YAAaA,KACKxN,KAAK2a,QACbvN,QAAQ,IAGpByB,EAAgB7O,KAAKsc,OAAOvQ,MAExBgR,GACF/c,KAAKsc,OAAOrP,QAGd+P,EAAQrQ,YAAcA,EAGxBqQ,EAAQnO,cAAgBA,EACxB7O,KAAKma,UAAY,IAAIlM,GAAU+O,IAxCtBhd,IA2CX,CAEA6c,cAAAA,GACE,MAAMve,EAAW0B,KAAKG,KAAK,YACrBsc,EAAazc,KAAKG,KAAK,cACvB4c,EAAoB/c,KAAKG,KAAK,qBAC9BiM,EAAYpM,KAAKG,KAAK,aACtB8c,EAAWjd,KAAKG,KAAK,YACrB+c,EAAMld,KAAKG,KAAK,OAChBgd,EAAOnd,KAAKG,KAAK,QACjBid,EAASpd,KAAKG,KAAK,UACnBkd,EAAQrd,KAAKG,KAAK,SAClB2c,EAAS9c,KAAKG,KAAK,UACnBiJ,EAAQpJ,KAAKoJ,QACbkU,EAAK,CACT1kB,KAAM,KACNsP,KAAM,KACNd,KAAM,GACNoO,OAAQ,CACNvW,QAASe,KACTiB,QAASjB,KAAKud,QAGZC,EAAO,CACX5kB,KAAM,WACNsP,KAAM,WACNd,KAAM,GACN8O,KAAM+G,GAEFQ,EAAM,CACV7kB,KAAM,SACNsP,KAAM,SACNd,KAAM,GACN8O,KAAMgH,GAEFtS,EAAO,CACXhS,KAAM,OACNsP,KAAM,OACNd,KAAM,GACN8O,KAAMiH,GAEFO,EAAS,CACb9kB,KAAM,SACNsP,KAAM,SACNd,KAAM,GACN8O,KAAMkH,GAEFO,EAAO,CACX/kB,KAAM,SACNsP,KAAM,OACNd,KAAM,GACNoO,OAAQ,CACNvW,QAASe,KACTiB,QAASjB,KAAKoN,SAGZqO,EAAU,CACd7iB,KAAM,UACNsP,KAAM,OACNd,KAAM,GACNoO,OAAQ,CACNvW,QAASe,KACTiB,QAAS,2BAGP2c,EAAQ,CACZhlB,KAAM,QACNsP,KAAM,QACNd,KAAM,GACNoO,OAAQ,CACNvU,QAAS,yBAGP4c,EAAO,CACXjlB,KAAM,OACNsP,KAAM,OACNd,KAAM,GACNoO,OAAQ,CACNvW,QAASe,KACTiB,QAASjB,KAAK8d,WAGZvH,EAAU,GAEhB,OAAKkG,GAILlG,EAAQ9a,KAAK6hB,GACTlU,EAAQ,GACVmN,EAAQ9a,KAAKkiB,GAEXV,GACF1G,EAAQ9a,KAAK+hB,GAEXN,GACF3G,EAAQ9a,KAAKgiB,GAEXN,GACF5G,EAAQ9a,KAAKmP,GAEXwS,GACF7G,EAAQ9a,KAAKiiB,GAEXZ,EAAO3Y,SACToS,EAAQ9a,KAAKggB,GACTllB,EAAW8kB,QACb9E,EAAQ9a,KAAKmiB,KAGbP,aAAK,EAALA,EAAOxkB,QAAS,GAClB0d,EAAQ9a,KAAInF,MAAZigB,EAAOzZ,EAAAC,EAASsgB,IAElB9G,EAAQ9a,KAAKoiB,GACb7d,KAAKuW,QAAO,GAAAwH,OAAOxH,GAEnBvW,KAAK2a,QAAU,IAAIrE,GAAQ,CACzBlK,YACAmK,YAGe,aAAbjY,GAA2Bye,GAC7B/c,KAAK2a,QAAQ5I,OAGR/R,MAxCEA,IAyCX,CAEAQ,OAAAA,GACE,MAAM7F,EAAWqF,KAAK1D,cAQtB,OANA0D,KAAKY,MAAM,kBAAmBjG,GAC9BqF,KAAKY,MAAM,oBAAqBjG,GAChCqF,KAAKY,MAAM,kBAEXZ,KAAKY,MAAM,UAAWjG,GAEfqF,IACT,CAEAge,SAAAA,CAAUhI,GACR,MAAMO,EAAUvW,KAAKuW,QAKrB,OAHAA,EAAQ3W,QAAQ,EAAG,EAAGoW,GACtBhW,KAAKY,MAAM,qBAAsB2V,GAE1BvW,IACT,CAEAie,YAAAA,CAAarlB,GAEX,OADAoH,KAAKY,MAAM,wBAAyBhI,GAC7BoH,IACT,CAEAud,KAAAA,GACE,MAAMhT,EAAcvK,KAAKG,KAAK,eACxBwa,EAAU3a,KAAK2a,QACfR,EAAYna,KAAKma,UACjB/Q,EAAQpJ,KAAKoJ,QAqBnB,OALIA,EAAQ,IACV+Q,EAAUvL,SAAU,GAEtB5O,KAAKxG,SAAS,GAlBG0kB,KACfvD,EAAQ5I,KAAK,MACb4I,EAAQ7I,KAAK,QAET1I,EAAQ,IACV+Q,EAAU5K,UAAU,GACpB4K,EAAUvL,SAAU,EACpBpV,EAAS2gB,EAAUpO,MAAO,IAGxBxV,EAAWgU,IACbA,EAAY3M,KAAK+c,EAAS,KAC5B,IAQK3a,IACT,CAEA8d,QAAAA,GACE,MAAMvT,EAAcvK,KAAKG,KAAK,eACxBhH,EAAiB6G,KAAK7G,eACtBwhB,EAAU3a,KAAK2a,QACfR,EAAYna,KAAKma,UACjB/Q,EAAQpJ,KAAKoJ,QACb3P,EAAMyI,KAAKic,MACfhlB,EAAeW,aAAeX,EAAesR,cAwB/C,OANIrB,EAAQ,IACV+Q,EAAUvL,SAAU,GAGtB5O,KAAKxG,SAASC,GApBI2kB,KAChB,MAAMrS,EAAQoO,EAAUpO,MACxB4O,EAAQ5I,KAAK,QACb4I,EAAQ7I,KAAK,MAET1I,EAAQ,IACV+Q,EAAU5K,UAAUnG,EAAQ,GAC5B5P,EAASuS,EAAOA,EAAMjS,cACtBqgB,EAAUvL,SAAU,GAGlBrY,EAAWgU,IACbA,EAAY3M,KAAK+c,EAAS,SAC5B,IASK3a,IACT,CAEAxG,QAAAA,CAASC,EAAK8Q,GAEZ,OADA/Q,EAASwG,KAAK7G,eAAgBM,EAAK8Q,GAC5BvK,IACT,CAEAqe,YAAAA,GAIE,OAHAre,KAAKY,MAAM,kBACXZ,KAAKY,MAAM,gBAEJZ,IACT,CAEAse,WAAAA,GAIE,OAHAte,KAAKY,MAAM,kBACXZ,KAAKY,MAAM,eAEJZ,IACT,CAEAue,aAAAA,GAIE,OAHAve,KAAKY,MAAM,kBACXZ,KAAKY,MAAM,iBAEJZ,IACT,CAEAwe,MAAAA,GACE,MAAMlgB,EAAW0B,KAAKG,KAAK,YACrBwa,EAAU3a,KAAK2a,QACf2B,EAAStc,KAAKsc,OACdnC,EAAYna,KAAKma,UAGvB,OAFcna,KAAKoJ,QAEP,IAIK,aAAb9K,GACF6b,EAAUrI,OACV6I,EAAQpL,UAAU,YAElBoL,EAAQ5I,OAERvb,GAAM,KACJ8lB,EAAOrP,MAAM,MAVRjN,IAeX,CAEAye,SAAAA,GACE,MAAMngB,EAAW0B,KAAKG,KAAK,YACrBwa,EAAU3a,KAAK2a,QACf2B,EAAStc,KAAKsc,OACdnC,EAAYna,KAAKma,UAGvB,OAFcna,KAAKoJ,QAEP,IAIK,aAAb9K,GACF6b,EAAUpI,OACV4I,EAAQpL,UAAU,YAElBoL,EAAQ7I,OAERtb,GAAM,KACJ8lB,EAAOnP,OAAO,MAVTnN,IAeX,CAEAoN,MAAAA,GAOE,OANIpN,KAAKwc,aACPxc,KAAKye,YAELze,KAAKwe,SAGAxe,IACT,CAEAqb,KAAAA,GAGE,OAFArb,KAAKY,MAAM,gBAEJZ,IACT,CAEA0e,QAAAA,GACE,MAAMtV,EAAQpJ,KAAKoJ,QACnB,IAAIiT,EAAUrc,KAAKqc,QACflC,EAAYna,KAAKma,UACjBmC,EAAStc,KAAKsc,OACdC,EAASvc,KAAKuc,OACd5B,EAAU3a,KAAK2a,QACfzL,GAAY,EA0BhB,OAxBAlP,KAAKU,kBAED6b,GACFA,EAAO9b,UAGL2I,EAAQ,GAAK+Q,IACfjL,EAAYiL,EAAUjL,YAEtBiL,EAAU1Z,UAENyO,GAAaoN,GACfA,EAAO7b,WAIP4b,GACFA,EAAQ5b,UAGNka,GACFA,EAAQla,UAGHT,IACT,CAEAS,OAAAA,GAOE,OANAT,KAAKY,MAAM,iBAEXZ,KAAK0e,WAAW3V,WAEhB/I,KAAKY,MAAM,aAEJZ,IACT,CAEAK,YAAAA,GAGE,OAFmBL,KAAKG,KAAK,eAM7BH,KAAKe,IAAI,iBAAkBf,KAAKuX,iBAEzBvX,MALEA,IAMX,CAEAU,eAAAA,GAGE,OAFmBV,KAAKG,KAAK,eAM7BH,KAAKmB,KAAK,kBAEHnB,MALEA,IAMX,EAyCF,GAtCAmc,GAAQnT,SAmCChS,EAlCS,CACdwF,eAAgB,WAChBC,SAAU,iBACVoS,cAAe,SACf5V,cAAe,YACfwS,MAAO,KACPnN,SAAU,WACV8N,UAAW,MACXgD,kBAAkB,EAClB3U,UAAU,EACVgiB,YAAY,EACZlP,mBAAmB,EACnBwP,mBAAmB,EACnBrT,UAAW,GACXc,aAAc,EACdyS,SAAU,GACVC,IAAK,GACLC,KAAM,GACNC,OAAQ,GACRC,MAAO,GACPd,OAAQ,CACNpY,OAAQ,GACRsH,MAAO,GACPkQ,gBAAiB,wBACjBO,YAAY,GAEdvP,YAAa,GACb+E,YAAa,KACbrE,YAAa,KACb9C,YAAa,KACb7P,kBAAmB,KACnBiP,iBAAkB,OAMZ,QAAVgV,GAAI9c,cAAA8c,IAAMA,IAANA,GAAQC,OAAQ,CAClB,MAAMC,EAAIhd,OAAO+c,OAIjBC,EAAEhhB,OAAOghB,EAAEpoB,GAAI,CACbqoB,QAAS,SAAUviB,GAEjB,IAAII,EAAWkiB,EAAE7e,MAEjB,OAAO,IAAImc,GAET0C,EAAEhhB,OAAO,CAAE,EAAEtB,EAAS,CACpBC,eAAgBG,IAGtB,GAEJ"} \ No newline at end of file +{"version":3,"file":"outline.min.js","sources":["../../utils/lang/toString.js","../../utils/types/isFunction.js","../../utils/lang/later.js","../../utils/types/isObject.js","../../utils/types/isArray.js","../../utils/lang/cloneDeep.js","../../utils/types/isString.js","../../utils/types/isElement.js","../../utils/dom/hasClass.js","../../utils/dom/addClass.js","../../utils/lang/easeInQuad.js","../../utils/dom/scrollTo.js","../../navigator/utils/_getScrollElement.js","../../utils/dom/getScrollElement.js","../../utils/lang/trim.js","../../chapters/getChaptersByHeadings.js","../../utils/lang/stripTags.js","../../chapters/_getChapterParentIdByDiffer.js","../../chapters/_getChaptersWithCode.js","../../chapters/getChapters.js","../../utils/lang/toTree.js","../../utils/lang/hasOwn.js","../../utils/lang/extend.js","../../utils/observer/_subscribers.js","../../utils/observer/_hasDirectSubscribersFor.js","../../utils/observer/has.js","../../utils/observer/_hasSubscribers.js","../../utils/observer/emit.js","../../utils/types/isTypedArray.js","../../utils/lang/guid.js","../../utils/observer/_removeSubscriber.js","../../utils/observer/off.js","../../utils/observer/_removeSubscriberByToken.js","../../component.js","../../utils/observer/on.js","../../utils/lang/timeSlice.js","../../utils/dom/offsetTop.js","../../utils/dom/matches.js","../../utils/dom/getParentOrHost.js","../../utils/event/enum.js","../../utils/event/_off.js","../../utils/event/_delete.js","../../utils/event/purgeElement.js","../../utils/event/getListeners.js","../../utils/event/off.js","../../utils/event/on.js","../../utils/event/getTarget.js","../../utils/dom/resolveTextNode.js","../../utils/dom/closest.js","../../utils/event/stop.js","../../utils/icons/symbols.js","../../utils/icons/defaults.js","../../utils/icons/getSymbols.js","../../utils/icons/getSymbol.js","../../utils/icons/paint.js","../../utils/icons/add.js","../../utils/types/isDOM.js","../../utils/types/isHTMLCollection.js","../../utils/types/isFragment.js","../../utils/types/isTextNode.js","../../utils/dom/setAttribute.js","../../utils/dom/setAttributes.js","../../utils/dom/createElement.js","../../utils/icons/createElement.js","../../utils/types/isSVG.js","../../utils/icons/icon.js","../../utils/dom/removeClass.js","../../anchors/utils/_removeHeading.js","../../utils/types/isEmpty.js","../../node_modules/style-inject/dist/style-inject.es.js","../../anchors/anchors.js","../../anchors/utils/_updateHeading.js","../../utils/types/tags.js","../../utils/types/isHTML.js","../../utils/lang/stripScripts.js","../../utils/dom/setProperty.js","../../utils/dom/zIndex.js","../../drawer/drawer.js","../../utils/dom/html.js","../../utils/event/at.js","../../utils/dom/getStyle.js","../../navigator/navigator.js","../../navigator/utils/_paintChapters.js","../../utils/dom/inBounding.js","../../utils/dom/intersection.js","../../utils/dom/isMobile.js","../../utils/types/isPlainObject.js","../../utils/types/isObjectLike.js","../../utils/lang/encodeHTML.js","../../message/message.js","../../command.js","../../commands.js","../../toolbar/utils/_createButton.js","../../toolbar/toolbar.js","../../speech.js","../../reader/utils/_updateSiblingElements.js","../../reader/reader.js","../../outline.js"],"sourcesContent":["/**\r\n * Object 对象原型上的 toString 方法\r\n * ========================================================================\r\n * @method toString\r\n * @param {*} val\r\n * @returns {string}\r\n */\r\nconst toString = (val) => {\r\n return Object.prototype.toString.apply(val)\r\n}\r\n\r\nexport default toString\r\n","import toString from '@/utils/lang/toString'\r\n\r\n/**\r\n * 检测测试数据是否为 Function 类型\r\n * ========================================================================\r\n * @method isFunction\r\n * @param {*} val - (必须)待检测的数据\r\n * @returns {boolean} 'val' 是 Function 类型返回 true,否则返回 false\r\n */\r\nconst isFunction = (val) => {\r\n return typeof val === 'function' || toString(val) === '[object Function]'\r\n}\r\n\r\nexport default isFunction\r\n","import isFunction from '@/utils/types/isFunction'\r\n\r\n/**\r\n * later - 延迟执行方法\r\n * ========================================================================\r\n * @method later\r\n * @param {Function} fn\r\n * @param {Number} [delay]\r\n * @returns {number|boolean}\r\n */\r\nconst later = (fn, delay = 300) => {\r\n if (!isFunction(fn)) {\r\n return false\r\n }\r\n\r\n return setTimeout(() => {\r\n fn()\r\n }, delay)\r\n}\r\n\r\nexport default later\r\n","import toString from '../lang/toString'\r\nimport isFunction from './isFunction'\r\n\r\n/**\r\n * 检测数据是否为 Object 类型\r\n * ========================================================================\r\n * @method isObject\r\n * @param {*} o\r\n * @returns {boolean}\r\n */\r\nconst isObject = (o) => {\r\n return (\r\n (toString(o) === '[object Object]' ||\r\n typeof o === 'object' ||\r\n isFunction(o)) &&\r\n o !== null\r\n )\r\n}\r\n\r\nexport default isObject\r\n","import toString from '@/utils/lang/toString'\r\n\r\n/**\r\n * 检测数据是否为 Array 类型\r\n * ========================================================================\r\n * @method isArray\r\n * @param {*} o\r\n * @returns {boolean}\r\n */\r\nconst isArray = (o) => {\r\n if (Array.isArray) {\r\n return Array.isArray(o)\r\n } else {\r\n return toString(o) === '[object Array]'\r\n }\r\n}\r\n\r\nexport default isArray\r\n","import isObject from '@/utils/types/isObject'\r\nimport isArray from '@/utils/types/isArray'\r\n\r\n/**\r\n * 深拷贝对象函数\r\n * ========================================================================\r\n * @methods cloneDeep\r\n * @param {Object} obj - 深拷贝的对象\r\n * @returns {Array|Object|*}\r\n *\r\n * @example\r\n * const arr = cloneDeep([2,3,4,6])\r\n * => [2,3,4,6]\r\n */\r\nconst cloneDeep = (obj) => {\r\n let clone = {}\r\n\r\n if (obj === null) {\r\n return null\r\n }\r\n\r\n if (isArray(obj)) {\r\n clone = Array.from(obj)\r\n } else {\r\n clone = Object.assign({}, obj)\r\n Object.keys(clone).forEach((key) => {\r\n return (clone[key] = isObject(obj[key]) ? cloneDeep(obj[key]) : obj[key])\r\n })\r\n }\r\n\r\n return clone\r\n}\r\n\r\nexport default cloneDeep\r\n","/**\r\n * 检测数据是否为 String 类型\r\n * ========================================================================\r\n * @method isArray\r\n * @param {*} str\r\n * @returns {boolean}\r\n */\r\nconst isString = (str) => {\r\n return typeof str === 'string'\r\n}\r\n\r\nexport default isString\r\n","import isObject from './isObject'\r\n\r\n/**\r\n * 检测数据是否为 HTMLElement DOM 节点\r\n * ========================================================================\r\n * @method isElement\r\n * @param {*} o\r\n * @returns {boolean}\r\n */\r\nconst isElement = (o) => {\r\n return !!(isObject(o) && o.nodeName && o.tagName && o.nodeType === 1)\r\n}\r\n\r\nexport default isElement\r\n","import isElement from '../types/isElement'\r\n/**\r\n * 检测 DOM 节点是否包含名为 className 的样式\r\n * ========================================================================\r\n * @method hasClass\r\n * @param {HTMLElement} el - DOM 节点\r\n * @param {String} className - 样式名称\r\n * @returns {Boolean}\r\n */\r\nconst hasClass = (el, className) => {\r\n const pattern = new RegExp('(\\\\s|^)' + className + '(\\\\s|$)')\r\n let allClass\r\n let classList\r\n\r\n if (!isElement(el)) {\r\n return false\r\n }\r\n\r\n allClass = el.className\r\n\r\n if (!allClass) {\r\n return false\r\n }\r\n\r\n classList = el.classList\r\n\r\n if (classList && classList.contains) {\r\n return el.classList.contains(className)\r\n }\r\n\r\n return !!pattern.exec(allClass)\r\n}\r\n\r\nexport default hasClass\r\n","import hasClass from './hasClass'\r\n\r\n/**\r\n * 给 DOM 节点添加名为 className 的样式\r\n * ========================================================================\r\n * @method addClass\r\n * @param {HTMLElement} el - DOM 节点\r\n * @param {String} className - 样式名称\r\n * @returns {Boolean}\r\n */\r\nconst addClass = (el, className) => {\r\n let classList\r\n let allClass\r\n\r\n if (hasClass(el, className)) {\r\n return false\r\n }\r\n\r\n classList = el.classList\r\n\r\n if (classList?.add) {\r\n if (className.indexOf(' ') > -1) {\r\n className.split(' ').forEach((name) => {\r\n classList.add(name)\r\n })\r\n } else {\r\n classList.add(className)\r\n }\r\n } else {\r\n allClass = el.className\r\n allClass += allClass.length > 0 ? ' ' + className : className\r\n el.className = allClass\r\n }\r\n}\r\n\r\nexport default addClass\r\n","/**\r\n * 返回给定值的平方值\r\n * ========================================================================\r\n * @method easeInQuad\r\n * @param {Number} x\r\n * @returns {number}\r\n */\r\nconst easeInQuad = (x) => {\r\n return x * x\r\n}\r\n\r\nexport default easeInQuad\r\n","import easeInQuad from '../lang/easeInQuad'\r\nimport isFunction from '../types/isFunction'\r\nimport _getScrollElement from '../../navigator/utils/_getScrollElement'\r\n\r\n/**\r\n * 指定 rootElement DOM 节点滚动到指定 top 位置\r\n * ========================================================================\r\n * @method scrollTo\r\n * @param {HTMLElement|Object} [scrollElement] - (必须)要滚动的 DOM 节点\r\n * @param {Number} top - (必须)滚动的 scrollTop 数值\r\n * @param {Function} [afterStop] - (可选)滚动完成的回调函数\r\n */\r\nconst scrollTo = (scrollElement, top, afterStop) => {\r\n const $scrollElement = _getScrollElement(scrollElement)\r\n let scrollTop = $scrollElement.scrollTop\r\n let step = 0\r\n const distance = top - scrollTop\r\n const MAX_HEIGHT = $scrollElement.scrollHeight\r\n const MAX_TOP = top - MAX_HEIGHT <= 0 ? top : MAX_HEIGHT\r\n const stop = (top) => {\r\n if (isFunction(afterStop)) {\r\n afterStop(top)\r\n }\r\n\r\n return false\r\n }\r\n const play = () => {\r\n step += 1\r\n\r\n // 向上滚动\r\n if (distance < 0) {\r\n scrollTop -= easeInQuad(step)\r\n $scrollElement.scrollTop = scrollTop\r\n\r\n if (scrollTop <= top) {\r\n $scrollElement.scrollTop = top\r\n return stop(top)\r\n }\r\n } else {\r\n scrollTop += easeInQuad(step)\r\n $scrollElement.scrollTop = scrollTop\r\n\r\n if (scrollTop >= MAX_TOP) {\r\n $scrollElement.scrollTop = MAX_TOP\r\n return stop(MAX_TOP)\r\n }\r\n }\r\n\r\n // eslint-disable-next-line compat/compat\r\n requestAnimationFrame(play)\r\n }\r\n\r\n // eslint-disable-next-line compat/compat\r\n requestAnimationFrame(play)\r\n}\r\n\r\nexport default scrollTo\r\n","import isString from '../../utils/types/isString'\r\nimport isElement from '../../utils/types/isElement'\r\n\r\n/**\r\n * 通过给的 scrollElement 参数,获取滚动 DOM 元素\r\n * ========================================================================\r\n * @method _getScrollElement\r\n * @param {String|HTMLElement} scrollElement\r\n * @returns {Element}\r\n * @private\r\n */\r\nconst _getScrollElement = (scrollElement = null) => {\r\n let $rootElements\r\n let $scrollElement\r\n\r\n if (!scrollElement) {\r\n $rootElements = document.querySelectorAll('html,body')\r\n $scrollElement =\r\n $rootElements[0].scrollTop - $rootElements[1].scrollTop >= 0\r\n ? $rootElements[0]\r\n : $rootElements[1]\r\n } else {\r\n if (isString(scrollElement)) {\r\n $scrollElement = document.querySelector(scrollElement)\r\n } else if (isElement(scrollElement)) {\r\n $scrollElement = scrollElement\r\n }\r\n }\r\n\r\n return $scrollElement\r\n}\r\n\r\nexport default _getScrollElement\r\n","import isString from '../types/isString'\r\nimport isElement from '../types/isElement'\r\n\r\n/**\r\n * 通过给的 scrollElement 参数,获取滚动 DOM 元素\r\n * ========================================================================\r\n * @method getScrollElement\r\n * @param {String|HTMLElement} scrollElement\r\n * @returns {Element}\r\n * @private\r\n */\r\nconst getScrollElement = (scrollElement = null) => {\r\n let $rootElements\r\n let $scrollElement\r\n\r\n if (!scrollElement) {\r\n $rootElements = document.querySelectorAll('html,body')\r\n $scrollElement =\r\n $rootElements[0].scrollTop - $rootElements[1].scrollTop >= 0\r\n ? $rootElements[0]\r\n : $rootElements[1]\r\n } else {\r\n if (isString(scrollElement)) {\r\n $scrollElement = document.querySelector(scrollElement)\r\n } else if (isElement(scrollElement)) {\r\n $scrollElement = scrollElement\r\n }\r\n }\r\n\r\n return $scrollElement\r\n}\r\n\r\nexport default getScrollElement\r\n","import isString from '@/utils/types/isString'\r\n\r\n/**\r\n * 清楚字符串起始位置所有的空格\r\n * ========================================================================\r\n * @method trim\r\n * @param {string} str\r\n * @returns {string|Boolean}\r\n */\r\nconst trim = (str) => {\r\n if (!isString(str)) {\r\n return false\r\n }\r\n return str.replace(/(^\\s+)|(\\s+$)/g, '')\r\n}\r\n\r\nexport default trim\r\n","import trim from '../utils/lang/trim'\r\nimport stripTags from '../utils/lang/stripTags'\r\nimport isFunction from '../utils/types/isFunction'\r\n\r\nimport _getChapterParentIdByDiffer from './_getChapterParentIdByDiffer'\r\nimport _getChaptersWithCode from './_getChaptersWithCode'\r\n\r\n/**\r\n * 根据文章中的 h1~h6 标签,自动分析返回文章章节数据\r\n * ========================================================================\r\n * @method getChaptersByHeadings\r\n * @param {Array} headings\r\n * @param {Boolean} [showCode]\r\n * @param {Function} [chapterTextFilter]\r\n * @return {*|*[]}\r\n */\r\nconst getChaptersByHeadings = (\r\n headings,\r\n showCode = false,\r\n chapterTextFilter = null\r\n) => {\r\n const pattern = /^\\d(\\.|(\\.\\d+)*)\\s?/gi\r\n const chapters = []\r\n let previous = 1\r\n let level = 0\r\n let text = ''\r\n\r\n headings.forEach((heading, i) => {\r\n const tagName = heading.tagName\r\n const headingLevel = tagName.replace(/h/i, '')\r\n let current = parseInt(headingLevel, 10)\r\n let pid = -1\r\n\r\n // 场景1:当前标题是前一个标题的子标题\r\n // 当前标题的(标题标签)序号 > 前一个标题的序号:两个相连的标题是父标题 -> 子标题关系;\r\n // h2 (前一个标题)\r\n // h3 (当前标题)\r\n if (current > previous) {\r\n level += 1\r\n\r\n // 第一层级的 pid 是 -1\r\n if (level === 1) {\r\n pid = -1\r\n } else {\r\n pid = i - 1\r\n }\r\n }\r\n // 场景2:当前标题和前一个标题层级相同\r\n // 当前标题的(标题标签)序号 = 前一个标题的序号\r\n // h2 (前一个标题)\r\n // h2 (当前标题)\r\n // 当前标题的(标题标签)序号 < 前一个标题的序号,并且当前标题序号 > 当前的级别\r\n // h2\r\n // h4 (前一个标题)\r\n // h3 (当前标题:这种情况我们还是任务 h3 是 h2 的下一级章节)\r\n else if (current === previous || (current < previous && current > level)) {\r\n // H1 的层级肯定是 1\r\n if (current === 1) {\r\n level = 1\r\n pid = -1\r\n } else {\r\n pid = chapters[i - 1].pid\r\n }\r\n }\r\n // 场景3:当前标题比前一个标题层级高\r\n else if (current <= level) {\r\n // H1 的层级肯定是 1\r\n if (current === 1) {\r\n level = 1\r\n } else {\r\n level = level - (previous - current)\r\n\r\n if (level <= 1) {\r\n level = 1\r\n }\r\n }\r\n\r\n // 第一级的标题\r\n if (level === 1) {\r\n pid = -1\r\n } else {\r\n // 通过当前标题和前一个标题之间的等级差,获得当前标题的父标题ID\r\n pid = _getChapterParentIdByDiffer(chapters, previous - current, i)\r\n }\r\n }\r\n\r\n previous = current\r\n\r\n text = trim(stripTags(heading.innerHTML))\r\n\r\n // 如果自动生成章节编号,则去掉标题中自带的编号文本\r\n if (showCode) {\r\n text = trim(text.replace(pattern, ''))\r\n }\r\n\r\n if (isFunction(chapterTextFilter)) {\r\n text = chapterTextFilter(text)\r\n }\r\n\r\n chapters.push({\r\n id: i,\r\n pid: pid,\r\n level: level,\r\n rel: `heading-${i}`,\r\n text,\r\n tagName\r\n })\r\n })\r\n\r\n return showCode ? _getChaptersWithCode(chapters) : chapters\r\n}\r\n\r\nexport default getChaptersByHeadings\r\n","import isString from '@/utils/types/isString'\r\n\r\n/**\r\n * 过滤所有 HTML 标签\r\n * ========================================================================\r\n * @method stripTags\r\n * @param {string} str\r\n * @returns {string}\r\n */\r\nconst stripTags = (str) => {\r\n if (!isString(str)) {\r\n return ''\r\n }\r\n return str.replace(/<\\/?[^>]+(>|$)/g, '')\r\n}\r\n\r\nexport default stripTags\r\n","const _getChapterParentIdByDiffer = (chapters, differ, index) => {\r\n let previous = chapters[index - 1]\r\n let pid\r\n let i\r\n\r\n for (i = 0; i < differ; i += 1) {\r\n pid = previous.pid\r\n previous = chapters[pid]\r\n }\r\n\r\n pid = previous.pid\r\n\r\n return pid\r\n}\r\n\r\nexport default _getChapterParentIdByDiffer\r\n","import isArray from '../utils/types/isArray'\r\n\r\nconst _getChaptersWithCode = (chapters) => {\r\n const groups = {}\r\n const cb = (o) => {\r\n return [o.pid]\r\n }\r\n\r\n chapters.forEach((o) => {\r\n const group = JSON.stringify(cb(o))\r\n\r\n groups[group] = groups[group] || []\r\n groups[group].push(o)\r\n\r\n o.index = groups[group].length\r\n\r\n if (o.pid === -1) {\r\n o.code = String(o.index)\r\n }\r\n })\r\n\r\n Object.keys(groups).forEach((group) => {\r\n groups[group].forEach((c) => {\r\n const subjects = groups[`[${c.id}]`]\r\n\r\n if (!subjects || !isArray(subjects)) {\r\n return false\r\n }\r\n\r\n subjects.forEach((o) => {\r\n o.code = c.code + '.' + o.index\r\n })\r\n })\r\n })\r\n\r\n return chapters\r\n}\r\n\r\nexport default _getChaptersWithCode\r\n","import isString from '../utils/types/isString'\r\nimport isFunction from '../utils/types/isFunction'\r\nimport isElement from '../utils/types/isElement'\r\nimport toTree from '../utils/lang/toTree'\r\n\r\nimport getChaptersByHeadings from './getChaptersByHeadings'\r\n\r\n/**\r\n *\r\n * @param {Object} [options]\r\n * @param {String|HTMLElement} [options.articleElement]\r\n * @param {String} [options.selector]\r\n * @param {Boolean} [options.showCode]\r\n * @param {Function} [options.chapterTextFilter]\r\n * @param {Boolean} [options.isTreeStructured]\r\n * @returns {Array}\r\n */\r\nconst getChapters = (options) => {\r\n const {\r\n articleElement,\r\n selector,\r\n showCode,\r\n chapterTextFilter,\r\n isTreeStructured\r\n } = options\r\n let $article = document.querySelector('#article')\r\n let $headings = []\r\n let chapters = []\r\n let filter = null\r\n\r\n if (isString(articleElement)) {\r\n $article = document.querySelector(articleElement)\r\n } else if (isElement(articleElement)) {\r\n $article = articleElement\r\n }\r\n\r\n if (!$article) {\r\n return chapters\r\n }\r\n\r\n if (isFunction(chapterTextFilter)) {\r\n filter = chapterTextFilter\r\n } else {\r\n if (chapterTextFilter === true) {\r\n filter = (text) => {\r\n return text.replace(/\\(.*?\\)/, '()')\r\n }\r\n }\r\n }\r\n\r\n $headings = [...$article.querySelectorAll(selector || 'h1,h2,h3,h4,h5,h6')]\r\n chapters = getChaptersByHeadings($headings, showCode, filter)\r\n\r\n return isTreeStructured === true ? toTree(chapters, 'id', 'pid') : chapters\r\n}\r\n\r\nexport default getChapters\r\n","const toTree = (list, nodeKey, parentKey) => {\r\n const map = {}\r\n const roots = []\r\n\r\n list.forEach((item, i) => {\r\n // initialize the map\r\n map[item[nodeKey]] = i\r\n // initialize the children\r\n item.children = []\r\n })\r\n\r\n list.forEach((item) => {\r\n const node = list[map[item[parentKey]]]\r\n\r\n if (item[parentKey] !== -1) {\r\n // if you have dangling branches check that map[node.parentId] exists\r\n node.children.push(item)\r\n } else {\r\n roots.push(item)\r\n }\r\n })\r\n\r\n return roots\r\n}\r\n\r\nexport default toTree\r\n","/**\r\n * 检测对象自身属性中是否具有指定的属性。\r\n * ========================================================================\r\n * @method hasOwn\r\n * @param {Object} obj - (必须)检测的目标对象\r\n * @param {String} prop - (必须)属性名\r\n * @returns {Boolean}\r\n */\r\nconst hasOwn = (obj, prop) => {\r\n const hasOwnProperty = Object.prototype.hasOwnProperty\r\n return obj && hasOwnProperty.call(obj, prop)\r\n}\r\n\r\nexport default hasOwn\r\n","import hasOwn from './hasOwn'\r\n\r\n/**\r\n * 扩展对象\r\n * ========================================================================\r\n * @method extend\r\n * @param {Object} origin\r\n * @param {Object} source\r\n */\r\nconst extend = (origin, source) => {\r\n const keys = Object.keys(source)\r\n\r\n keys.forEach((prop) => {\r\n if (hasOwn(source, prop)) {\r\n origin[prop] = source[prop]\r\n }\r\n })\r\n}\r\n\r\nexport default extend\r\n","/**\r\n * 存储订阅者(主题和处理器的)私有对象\r\n * ========================================================================\r\n * @type {{}}\r\n * @private\r\n */\r\nconst _subscribers = {}\r\n\r\nexport default _subscribers\r\n","import hasOwn from '@/utils/lang/hasOwn'\r\nimport _subscribers from './_subscribers'\r\n\r\n/**\r\n * 判断是否存在与给定 topic 完全匹配的订阅者信息\r\n * ========================================================================\r\n * @method _hasDirectSubscribersFor\r\n * @param {String} topic - (必须)订阅主题字符串\r\n * @returns {Boolean}\r\n */\r\nconst _hasDirectSubscribersFor = (topic) => {\r\n return hasOwn(_subscribers, topic) && _subscribers[topic].length > 0\r\n}\r\n\r\nexport default _hasDirectSubscribersFor\r\n","import _hasDirectSubscribersFor from './_hasDirectSubscribersFor'\r\nimport _hasSubscribers from './_hasSubscribers'\r\n\r\n/**\r\n * 判断是否存在包含 topic 指定的订阅者信息\r\n * ========================================================================\r\n * @method has\r\n * @param {String} topic - (必须)主题名称\r\n * @param {Boolean} [isDirect] - (可选)是否为直接的主题,默认值:true\r\n * @returns {Boolean}\r\n */\r\nconst has = (topic, isDirect = true) => {\r\n return isDirect ? _hasDirectSubscribersFor(topic) : _hasSubscribers(topic)\r\n}\r\n\r\nexport default has\r\n","import _hasDirectSubscribersFor from './_hasDirectSubscribersFor'\r\n\r\n/**\r\n * 判断是否存在包含给定 topic 相关的订阅者信息\r\n * ========================================================================\r\n * @method _hasSubscribers\r\n * @param {String} topic - (必须)订阅主题字符串\r\n * @returns {Boolean}\r\n */\r\nconst _hasSubscribers = (topic) => {\r\n let found = _hasDirectSubscribersFor(topic)\r\n let position = topic.lastIndexOf('.')\r\n\r\n while (!found && position !== -1) {\r\n topic = topic.substring(0, position)\r\n position = topic.lastIndexOf('.')\r\n found = _hasDirectSubscribersFor(topic)\r\n }\r\n\r\n return found\r\n}\r\n\r\nexport default _hasSubscribers\r\n","import isTypedArray from '@/utils/types/isTypedArray'\r\nimport has from './has'\r\nimport _hasDirectSubscribersFor from './_hasDirectSubscribersFor'\r\nimport _subscribers from './_subscribers'\r\n\r\n/**\r\n * (异步)发布订阅主题信息\r\n * ========================================================================\r\n * 主题默认是异步发布的。确保在消费者处理主题时,主题的发起者不会被阻止。\r\n * ========================================================================\r\n * @method emit\r\n * @param {String} topic - (必须)主题名称\r\n * @param {Object} [data] - (可选)数据对象\r\n * @param {Boolean} [async] - (可选) 是否异步发布\r\n */\r\nconst emit = (topic, data, async = true) => {\r\n const execute = (topic) => {\r\n if (!_hasDirectSubscribersFor(topic)) {\r\n return false\r\n }\r\n\r\n _subscribers[topic].forEach((subscriber) => {\r\n // 针对 mqtt 消息服务返回的 Uint8Array 类似的 typed arrays 格式的数据\r\n // 采用 toString() 方法转化为普通(JSON)字符串\r\n const message = isTypedArray(data) ? data.toString() : data\r\n\r\n subscriber.callback.call(subscriber.context || subscriber, message)\r\n })\r\n }\r\n const deliver = () => {\r\n let subscriber = topic\r\n let position = topic.lastIndexOf('.')\r\n\r\n while (position !== -1) {\r\n subscriber = subscriber.substring(0, position)\r\n position = subscriber.lastIndexOf('.')\r\n\r\n execute(subscriber)\r\n }\r\n\r\n // 执行 topic 对应的处理器\r\n execute(topic)\r\n // 执行特殊 topic:'*'(监听全部消息的发布)\r\n execute('*')\r\n }\r\n\r\n if (!has(topic)) {\r\n return false\r\n }\r\n\r\n if (async) {\r\n setTimeout(deliver, 10)\r\n } else {\r\n deliver()\r\n }\r\n}\r\n\r\nexport default emit\r\n","import toString from '@/utils/lang/toString'\r\n/**\r\n * 判断检测数据是否为 Typed Arrays 类型的数据\r\n * ========================================================================\r\n * @param {*} val\r\n * @returns {boolean}\r\n */\r\nconst isTypedArray = (val) => {\r\n const TYPES = [\r\n '[object Int8Array]',\r\n '[object Uint8Array]',\r\n '[object Uint8ClampedArray]',\r\n '[object Int16Array]',\r\n '[object Uint16Array]',\r\n '[object Int32Array]',\r\n '[object Uint32Array]',\r\n '[object Float32Array]',\r\n '[object Float64Array]',\r\n '[object BigInt64Array]',\r\n '[object BigUint64Array]'\r\n ]\r\n\r\n return TYPES.indexOf(toString(val)) > -1\r\n}\r\n\r\nexport default isTypedArray\r\n","/**\r\n * 生成唯一 id 字符串的函数\r\n * ========================================================================\r\n * @method guid\r\n * @param {String} [prefix] - 生成 id 的前缀字符串\r\n * @return {String} 返回一个表示唯一 id 的字符串\r\n */\r\nconst guid = (() => {\r\n let uuid = 0\r\n\r\n return (prefix) => {\r\n uuid += 1\r\n\r\n return prefix ? prefix + '-' + uuid : 'guid-' + uuid\r\n }\r\n})()\r\n\r\nexport default guid\r\n","import hasOwn from '@/utils/lang/hasOwn'\r\nimport _subscribers from './_subscribers'\r\n\r\n/**\r\n * 删除与给定 topic 相同的订阅者信息\r\n * ========================================================================\r\n * @method _removeSubscriber\r\n * @param {String} topic - (必须)订阅主题字符串\r\n * @returns {Boolean}\r\n */\r\nconst _removeSubscriber = (topic) => {\r\n if (!hasOwn(_subscribers, topic)) {\r\n return false\r\n }\r\n\r\n delete _subscribers[topic]\r\n}\r\n\r\nexport default _removeSubscriber\r\n","import has from './has'\r\nimport _removeSubscriber from './_removeSubscriber'\r\nimport _removeSubscriberByToken from './_removeSubscriberByToken'\r\n\r\n/**\r\n * 取消订阅主题\r\n * ========================================================================\r\n * @method off\r\n * @param {String} topic - (必须)订阅的主题\r\n * @param {Function|String} [token] - (可选)订阅主题的处理器函数或者唯一 Id 值\r\n */\r\nconst off = (topic, token) => {\r\n if (!has(topic)) {\r\n return false\r\n }\r\n\r\n if (token) {\r\n _removeSubscriberByToken(token)\r\n } else {\r\n _removeSubscriber(topic)\r\n }\r\n}\r\n\r\nexport default off\r\n","import _subscribers from './_subscribers'\r\nimport _removeSubscriber from './_removeSubscriber'\r\n\r\n/**\r\n * 通过订阅者 token 值删除订阅者信息\r\n * ========================================================================\r\n * @method _removeSubscriberByToken\r\n * @param {String} token - 订阅者 token 字符串\r\n * @returns {boolean}\r\n * @private\r\n */\r\nconst _removeSubscriberByToken = (token) => {\r\n const keys = Object.keys(_subscribers)\r\n let index = -1\r\n\r\n if (!token || keys.length < 1) {\r\n return false\r\n }\r\n\r\n keys.forEach((subject) => {\r\n const subscriber = _subscribers[subject]\r\n let topic\r\n\r\n subscriber.forEach((execution, j) => {\r\n if (execution.callback === token || execution.token === token) {\r\n topic = execution.topic\r\n subscriber.splice(index, j)\r\n }\r\n })\r\n\r\n /* istanbul ignore else */\r\n if (subscriber.length < 1) {\r\n _removeSubscriber(topic)\r\n }\r\n })\r\n}\r\n\r\nexport default _removeSubscriberByToken\r\n","import isString from './utils/types/isString'\r\n\r\nimport extend from './utils/lang/extend'\r\nimport hasOwn from './utils/lang/hasOwn'\r\n\r\nimport isObject from './utils/types/isObject'\r\n\r\nimport publish from './utils/observer/emit'\r\nimport subscribe from './utils/observer/on'\r\nimport unsubscribe from './utils/observer/off'\r\n\r\nclass Component {\r\n constructor(options) {\r\n this.attrs = {}\r\n this.name = 'component'\r\n\r\n if (options) {\r\n this.initialize(options)\r\n }\r\n }\r\n\r\n initialize(options) {\r\n this.attr(options).render().addListeners()\r\n return this\r\n }\r\n\r\n attr(prop, value) {\r\n const attrs = this.attrs\r\n\r\n if (isString(prop)) {\r\n // 只能扩展 attrs 中已有的属性\r\n if (value && hasOwn(attrs, prop)) {\r\n // 更新单个配置信息\r\n attrs[prop] = value\r\n return this\r\n }\r\n\r\n // 只传递 prop 参数,则返回对应的属性值\r\n return attrs[prop]\r\n } else if (isObject(prop)) {\r\n // 批量更新配置信息\r\n extend(attrs, prop)\r\n\r\n return this\r\n } else if (arguments.length === 0) {\r\n // 不传递参数,直接返回整个\r\n return attrs\r\n }\r\n\r\n return this\r\n }\r\n\r\n render() {\r\n return this\r\n }\r\n\r\n refresh() {\r\n return this\r\n }\r\n\r\n destroy() {\r\n this.removeListeners()\r\n return this\r\n }\r\n\r\n reload(options) {\r\n let attrs = this.attr()\r\n\r\n if (options) {\r\n attrs = this.attr(options)\r\n }\r\n\r\n this.destroy().initialize(attrs)\r\n\r\n return this\r\n }\r\n\r\n $emit(event, data) {\r\n publish(event, data)\r\n return this\r\n }\r\n\r\n $on(event, callback) {\r\n subscribe(event, callback, this)\r\n return this\r\n }\r\n\r\n $off(event, callback) {\r\n unsubscribe(event, callback)\r\n return this\r\n }\r\n\r\n addListeners() {\r\n return this\r\n }\r\n\r\n removeListeners() {\r\n return this\r\n }\r\n}\r\n\r\nexport default Component\r\n","import isFunction from '@/utils/types/isFunction'\r\nimport guid from '@/utils/lang/guid'\r\n\r\nimport _subscribers from './_subscribers'\r\n\r\n/**\r\n * 订阅主题,并给出处理器函数\r\n * ========================================================================\r\n * @method on\r\n * @param {String} topic - (必须)主题名称\r\n * @param {Function} handler - (必须)主题的处理器函数\r\n * @param {Object} [context] - (可选)指定 this 执行上下文\r\n * @return {String} - 唯一的 token 字符串,例如:'guid-1'。\r\n */\r\nconst on = (topic, handler, context = null) => {\r\n const token = guid()\r\n let subject = typeof topic === 'symbol' ? topic.toString() : topic\r\n\r\n if (!isFunction(handler)) {\r\n return ''\r\n }\r\n\r\n /* istanbul ignore else */\r\n if (!_subscribers[subject]) {\r\n _subscribers[subject] = []\r\n }\r\n\r\n _subscribers[subject].push({\r\n topic: subject,\r\n callback: handler,\r\n context,\r\n token\r\n })\r\n\r\n return token\r\n}\r\n\r\nexport default on\r\n","/**\r\n * timeSlice.js 时间切片功能函数\r\n * ====================================================\r\n * Created By: Yaohaixiao\r\n * Update: 2023.09.04\r\n */\r\nimport isFunction from '@/utils/types/isFunction'\r\nimport later from './later'\r\n\r\nconst queue = []\r\nlet isHandling\r\nlet done\r\n\r\n// Shim from https://developers.google.com/web/updates/2015/08/using-requestidlecallback\r\nif (typeof window.requestIdleCallback === 'undefined') {\r\n window.requestIdleCallback = function (cb) {\r\n const start = Date.now()\r\n return later(function () {\r\n cb({\r\n didTimeout: false,\r\n timeRemaining: function () {\r\n return Math.max(0, 50 - (Date.now() - start))\r\n }\r\n })\r\n }, 10)\r\n }\r\n\r\n window.cancelIdleCallback = function (id) {\r\n clearTimeout(id)\r\n }\r\n}\r\n\r\nfunction runIdle(idleDeadline) {\r\n while (idleDeadline.timeRemaining() > 0 && queue.length) {\r\n const fn = queue.shift()\r\n\r\n if (!isFunction(fn)) {\r\n return false\r\n }\r\n\r\n fn()\r\n }\r\n\r\n if (queue.length) {\r\n isHandling = requestIdleCallback(runIdle)\r\n } else {\r\n isHandling = 0\r\n\r\n if (isFunction(done)) {\r\n done()\r\n done = null\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * 时间切片功能函数:主要用于优化长时任务的性能,将长时任务分解成\r\n * 多个短时间任务\r\n * ====================================================\r\n * @param {Function} fn - 需要在空闲时执行的回调函数\r\n * @param {Function} afterComplete - queen 的\r\n * @return {(function(): (boolean|undefined))|*|boolean}\r\n */\r\nconst timeSlice = (fn, afterComplete = null) => {\r\n queue.push(fn)\r\n\r\n if (isFunction(afterComplete)) {\r\n done = afterComplete\r\n }\r\n\r\n if (!isHandling) {\r\n requestIdleCallback(runIdle)\r\n }\r\n}\r\n\r\nexport default timeSlice\r\n","/**\r\n * 获取 DOM 节点相对于窗口的 left (纵坐标)值\r\n * ========================================================================\r\n * @method offsetTop\r\n * @param {HTMLElement} el - DOM 节点\r\n * @returns {Number}\r\n */\r\nconst offsetTop = (el) => {\r\n let top = el.offsetTop\r\n\r\n if (el.offsetParent !== null) {\r\n top += offsetTop(el.offsetParent)\r\n }\r\n\r\n return top\r\n}\r\n\r\nexport default offsetTop\r\n","/**\r\n * 获取 options 节点下匹配 selector 选择器的 DOM 节点\r\n * ========================================================================\r\n * Element.matches() 方法可以用来判断 DOM 元素是否与给定的选择器匹配,事件代理判断是\r\n * 否触发绑定的代理事件回调函数,关键就是使用 Element.matches() 辨别当前事件触发的目\r\n * 标 DOM 元素是否为事件代理所期望触发的目标。\r\n * ========================================================================\r\n * @method matches\r\n * @see https://developer.mozilla.org/en-US/docs/web/api/element/matches\r\n * @param {HTMLElement} el - (必须)DOM 元素\r\n * @param {String} selector - (必须)匹配 DOM 元素的选择器\r\n * @returns {Boolean}\r\n */\r\nconst matches = (el, selector = '') => {\r\n const sel = selector.replace(/^>/i, '')\r\n\r\n if (!selector || !sel || !el) {\r\n return false\r\n }\r\n\r\n /* istanbul ignore else */\r\n if (el.matches) {\r\n return el.matches(sel)\r\n } else if (el.msMatchesSelector) {\r\n return el.msMatchesSelector(sel)\r\n } else {\r\n return false\r\n }\r\n}\r\n\r\nexport default matches\r\n","/**\r\n * 获取 DOM 元素的父节点\r\n * ========================================================================\r\n * @method getParentOrHost\r\n * @param {*|HTMLElement} el - (必须)要获取父节点的 DOM 元素\r\n * @returns {*|HTMLElement}\r\n */\r\nconst getParentOrHost = (el) => {\r\n return el.host && el !== document && el.host.nodeType\r\n ? el.host\r\n : el.parentNode\r\n}\r\n\r\nexport default getParentOrHost\r\n","export const CAPTURE_EVENTS = [\r\n 'focusout',\r\n 'blur',\r\n 'focusin',\r\n 'focus',\r\n 'load',\r\n 'unload',\r\n 'mouseenter',\r\n 'mouseleave'\r\n]\r\n","import { CAPTURE_EVENTS } from './enum'\r\nimport _delete from './_delete'\r\n\r\n/**\r\n * (私有方法)取消 type 类型的代理事件绑定\r\n * ========================================================================\r\n * 如果没有设置 handler,则销毁 this.$options 绑定的所有符合 type 事件类型的事件绑定\r\n * ========================================================================\r\n * @method _off\r\n * @param {HTMLElement} el - (必须)取消事件绑定的 DOM 元素\r\n * @param {String} type - (必须)事件类型\r\n * @param {Function} fn - (必须)事件处理器回调函数\r\n * @private\r\n */\r\nconst _off = (el, type, fn) => {\r\n const capture = CAPTURE_EVENTS.indexOf(type) > -1\r\n\r\n /* istanbul ignore else */\r\n if (fn._delegateListener) {\r\n fn = fn._delegateListener\r\n delete fn._delegateListener\r\n }\r\n\r\n // 移除缓存的 _listeners 数据\r\n _delete(el, type, fn)\r\n\r\n el.removeEventListener(type, fn, capture)\r\n}\r\n\r\nexport default _off\r\n","/**\r\n * 删除 DOM 元素缓存的 _listeners 数据\r\n * ========================================================================\r\n * @method _delete\r\n * @param {HTMLElement} el - 要删除 listener 的 DOM 元素\r\n * @param {String} type - 事件类型(名称)\r\n * @param {Function} [fn] - 事件处理器回调函数\r\n */\r\nconst _delete = function (el, type, fn) {\r\n const listeners = el._listeners\r\n let index = -1\r\n\r\n if (listeners.length < 1) {\r\n return false\r\n }\r\n\r\n // 移除缓存的 _listeners 数据\r\n listeners.forEach((listener, i) => {\r\n const handler = listener.fn\r\n\r\n if (type === listener.type) {\r\n index = i\r\n\r\n if (handler === fn) {\r\n index = i\r\n }\r\n }\r\n })\r\n\r\n /* istanbul ignore else */\r\n if (index > -1) {\r\n listeners.splice(index, 1)\r\n }\r\n}\r\n\r\nexport default _delete\r\n","import isString from '@/utils/types/isString'\r\nimport isElement from '@/utils/types/isElement'\r\nimport getListeners from './getListeners'\r\nimport _off from './_off'\r\n\r\n/**\r\n * 销毁(type 类型的)代理事件绑定\r\n * ========================================================================\r\n * 1. 设置了事件类型 type,则销毁指定类型的事件绑定,否则清除所有代理事件绑定\r\n * 2. recurse 设置为 true,递归销毁子节点全部事件绑定\r\n * ========================================================================\r\n * @method purgeElement\r\n * @param {HTMLElement|String} el - (必须)DOM 元素或者其选择器\r\n * @param {String|Boolean} type - (必须)事件类型\r\n * @param {Boolean} [recurse] - (可选)是否递归销毁子节点所有事件绑定\r\n */\r\nconst purgeElement = function (el, type, recurse = false) {\r\n const $element = isString(el) ? document.querySelector(el) : el\r\n const $children = $element.childNodes\r\n const listeners = getListeners($element, type)\r\n\r\n listeners.forEach((listener) => {\r\n _off($element, listener.type, listener.fn)\r\n })\r\n\r\n if (\r\n (recurse || type === true || arguments.length === 1) &&\r\n $element &&\r\n $children\r\n ) {\r\n $children.forEach(($child) => {\r\n if (isElement($child)) {\r\n purgeElement($child, type, recurse)\r\n }\r\n })\r\n }\r\n}\r\n\r\nexport default purgeElement\r\n","import isString from '@/utils/types/isString'\r\n\r\n/**\r\n * 获取 DOM 元素(type 事件类型)事件绑定信息\r\n * ========================================================================\r\n * 如果设置了事件类型 type, 则返回指定类型的事件绑定信息,否则返回所有事件绑定信息\r\n * ========================================================================\r\n * @methods getListeners\r\n * @param {HTMLElement} el - (必须)要获取事件绑定信息的 DOM 元素\r\n * @param {String} [type] - (可选)事件类型\r\n * @returns {Array} - 已绑定的事件信息\r\n */\r\nconst getListeners = (el, type) => {\r\n let listeners = el._listeners || []\r\n\r\n if (isString(type) && type) {\r\n listeners = listeners.filter((listener) => {\r\n return listener.type === type\r\n })\r\n }\r\n\r\n return listeners\r\n}\r\n\r\nexport default getListeners\r\n","import purgeElement from './purgeElement'\r\nimport isFunction from '../types/isFunction'\r\nimport _off from './_off'\r\n\r\n/**\r\n * 取消 type 类型的代理事件绑定\r\n * ========================================================================\r\n * 如果没有设置 handler,则销毁 this.$options 绑定的所有符合 type 事件类型的事件绑定\r\n * ========================================================================\r\n * @method off\r\n * @param {HTMLElement|Object} el - (必须)取消事件绑定的 DOM 元素\r\n * @param {String} type - (必须)事件类型\r\n * @param {Function} [fn] - (可选)事件处理器回调函数\r\n */\r\nconst off = (el, type, fn) => {\r\n // 如果不设置 fn 参数,默认清除 el 元素上绑定的所有事件处理器\r\n if (!isFunction(fn)) {\r\n purgeElement(el, type)\r\n return false\r\n }\r\n\r\n _off(el, type, fn)\r\n}\r\n\r\nexport default off\r\n","import closest from '@/utils/dom/closest'\r\nimport off from './off'\r\nimport getTarget from './getTarget'\r\n\r\nimport { CAPTURE_EVENTS } from './enum'\r\n\r\n/**\r\n * 绑定代理事件\r\n * ========================================================================\r\n * @method on\r\n * @param {HTMLElement|String|Object} el - (必须)绑定代理事件的 DOM 节点\r\n * @param {String} selector - (必须)事件代理目标 DOM 元素的选择器\r\n * @param {String|Function} type - (必须)事件类型或者事件处理器回调函数\r\n * @param {Function|Object} fn - (可选) 事件处理器回调函数或者传递给事件处理器回调函数的数据对象\r\n * @param {Object|Boolean} [data] - (可选)传递给事件处理器回调函数的数据对象或者事件处理器回调函数的 this 上下文指向,\r\n * @param {Object|Boolean} [context] - (可选)事件处理器回调函数的 this 上下文指向,或者是否仅触发一次\r\n * 当设置为 true 时,则事件处理器回调函数的 this 上下文指向为 data 对象\r\n * @param {Boolean} once - (可选)是否仅触发一次\r\n */\r\nconst on = (el, selector, type, fn, data, context, once = false) => {\r\n // CAPTURE_EVENTS 中的特殊事件,采用事件捕获模型\r\n const capture = CAPTURE_EVENTS.indexOf(type) > -1\r\n\r\n const listener = function (evt) {\r\n const target = getTarget(evt)\r\n // 通过 Element.matches 方法获得点击的目标元素\r\n const delegateTarget = closest(target, selector, el)\r\n let overrideContext = context || el\r\n\r\n evt.delegateTarget = delegateTarget\r\n\r\n // 当设置为 true 时,则事件处理器回调函数的\r\n // this 上下文指向为 data 对象\r\n if (context === true) {\r\n overrideContext = data\r\n }\r\n\r\n /* istanbul ignore else */\r\n if (delegateTarget) {\r\n // 仅触发一次\r\n /* istanbul ignore else */\r\n if (once === true) {\r\n off(el, type, listener)\r\n }\r\n\r\n fn.call(overrideContext, evt, data)\r\n }\r\n }\r\n\r\n if (!el) {\r\n return false\r\n }\r\n\r\n if (!el._listeners) {\r\n el._listeners = []\r\n }\r\n\r\n // 缓存 options 元素绑定的事件处理器\r\n el._listeners.push({\r\n el,\r\n selector,\r\n type,\r\n fn: listener,\r\n data,\r\n context,\r\n capture\r\n })\r\n\r\n // 缓存包装后的事件处理器\r\n fn._delegateListener = listener\r\n\r\n el.addEventListener(type, listener, capture)\r\n}\r\n\r\nexport default on\r\n","import resolveTextNode from '@/utils/dom/resolveTextNode'\r\n\r\n/**\r\n * 返回触发事件的 target DOM 元素\r\n * ========================================================================\r\n * @method getTarget\r\n * @param {Event} evt - Event 对象\r\n * @return {HTMLElement} - Event 对象的 target DOM 元素\r\n */\r\nconst getTarget = function (evt) {\r\n const target = evt.target\r\n\r\n return resolveTextNode(target)\r\n}\r\n\r\nexport default getTarget\r\n","/**\r\n * 在某些情况下,某些浏览器(例如:Safari 浏览器)会返回实际的目标元素内部的文本节点。\r\n * resolveTextNode() 方法则会返回实际的目标节点。\r\n * ========================================================================\r\n * @method resolveTextNode\r\n * @param {HTMLElement|Text} el - 要解析的节点\r\n * @return {*|HTMLElement} - 实际的目标 DOM 节点\r\n */\r\nconst resolveTextNode = function (el) {\r\n if (el && el.nodeType === 3) {\r\n return el.parentNode\r\n }\r\n\r\n return el\r\n}\r\n\r\nexport default resolveTextNode\r\n","import matches from './matches'\r\nimport getParentOrHost from './getParentOrHost'\r\n\r\n/**\r\n * 获取 options 元素父元素最近的包含 selector 选择器的元素\r\n * ========================================================================\r\n * @method closest\r\n * @param {HTMLElement} el - (必须)DOM 元素\r\n * @param {String} selector - (必须)DOM 元素的选择其\r\n * @param {HTMLElement} [ctx] - (必须)比对的 DOM 元素\r\n * @param {Boolean} [includeCTX] - (必须)是否包含 context DOM 元素\r\n * @returns {null|HTMLElement} - 返回最接近的 DOM 元素\r\n */\r\nconst closest = (el, selector, ctx, includeCTX) => {\r\n const context = ctx || document\r\n\r\n if (!el) {\r\n return null\r\n }\r\n\r\n do {\r\n /* istanbul ignore else */\r\n if (\r\n (selector != null &&\r\n (selector.startsWith('>')\r\n ? el.parentNode === context && matches(el, selector)\r\n : matches(el, selector))) ||\r\n (includeCTX && el === context)\r\n ) {\r\n return el\r\n }\r\n\r\n /* istanbul ignore else */\r\n if (el === context) {\r\n break\r\n }\r\n\r\n /* jshint boss:true */\r\n } while ((el = getParentOrHost(el)))\r\n}\r\n\r\nexport default closest\r\n","/**\r\n * 停止事件(阻止默认行为和阻止事件的捕获或冒泡)\r\n * ========================================================================\r\n * @method stop\r\n * @param {Event} evt - 事件对象\r\n *\r\n * @example\r\n *
\r\n * Service\r\n * Help\r\n *
\r\n *\r\n * const $nav = document.querySelector('#nav')\r\n * const $service = document.querySelector('.anchor')\r\n *\r\n * on($nav, 'click', function(evt) {\r\n * console.log('你点击了导航栏')\r\n * })\r\n *\r\n * on($anchor, 'click', function(evt) {\r\n * console.log('tagName', this.tagName)\r\n *\r\n * // 工作台输出:'a'\r\n * // 不会触发事件冒泡,输出:'你点击了导航栏'\r\n * // 也不会切换到 href 属性的页面,阻止了点击链接的默认行为\r\n * stopEvent(evt)\r\n * })\r\n */\r\nconst stop = function (evt) {\r\n evt.stopPropagation()\r\n evt.preventDefault()\r\n}\r\n\r\nexport default stop\r\n","import DEFAULTS from './defaults'\r\n\r\nconst SYMBOLS = [...DEFAULTS]\r\n\r\nexport default SYMBOLS\r\n","const DEFAULTS = [\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n ''\r\n]\r\n\r\nexport default DEFAULTS\r\n","import isString from '@/utils/types/isString'\r\nimport getSymbol from './getSymbol'\r\nimport SYMBOLS from './symbols'\r\n\r\n/**\r\n *\r\n * @method getSymbols\r\n * @param {String} [name]\r\n * @param {String} [iconSet]\r\n * @returns {string[]|*}\r\n */\r\nconst getSymbols = (name, iconSet = 'icon') => {\r\n if (isString(name)) {\r\n return getSymbol(name, iconSet)\r\n }\r\n\r\n return [...SYMBOLS]\r\n}\r\n\r\nexport default getSymbols\r\n","import SYMBOLS from './symbols'\r\n\r\n/**\r\n * @method getSymbol\r\n * @param {String} name\r\n * @param {String} [iconSet]\r\n * @returns {String}\r\n */\r\nconst getSymbol = (name, iconSet = 'icon') => {\r\n const patternName = /id=\"(.*?)\"/\r\n const patternSet = /^(\\w+)-/\r\n const symbols = SYMBOLS\r\n\r\n return symbols.find((symbol) => {\r\n const names = patternName.exec(symbol)\r\n const fullName = names[1]\r\n const sets = patternSet.exec(fullName)\r\n const setName = sets[1]\r\n const iconName =\r\n iconSet === 'icon' ? `${iconSet}-${name}` : `${iconSet}-icon-${name}`\r\n\r\n return setName === iconSet && fullName === iconName\r\n })\r\n}\r\n\r\nexport default getSymbol\r\n","import add from './add'\r\nimport getSymbols from './getSymbols'\r\n\r\n/**\r\n * 绘制 SVG 图标集\r\n * ========================================================================\r\n * @method paint\r\n * @param {String|Array} symbol\r\n */\r\nconst paint = (symbol = '') => {\r\n const $body = document.body\r\n let $icons = document.querySelector('#outline-icons')\r\n let symbols = []\r\n\r\n add(symbol)\r\n symbols = getSymbols()\r\n\r\n if ($icons) {\r\n $icons.innerHTML = symbols.join('')\r\n } else {\r\n $icons = document.createElement('div')\r\n $icons.innerHTML =\r\n ``\r\n $body.insertBefore($icons.firstChild, $body.firstChild)\r\n }\r\n}\r\n\r\nexport default paint\r\n","import isArray from '@/utils/types/isArray'\r\nimport isString from '@/utils/types/isString'\r\nimport SYMBOLS from './symbols'\r\n\r\n/**\r\n * @method add\r\n * @param {Array|String} symbols\r\n * @return {Boolean}\r\n */\r\nconst add = (symbols) => {\r\n if (!symbols) {\r\n return false\r\n }\r\n\r\n if (isArray(symbols) && symbols.length > 0) {\r\n symbols.forEach((symbol) => {\r\n /* istanbul ignore else */\r\n if (SYMBOLS.indexOf(symbol) === -1 && isString(symbol)) {\r\n SYMBOLS.push(symbol)\r\n }\r\n })\r\n } else {\r\n /* istanbul ignore else */\r\n if (isString(symbols)) {\r\n SYMBOLS.push(symbols)\r\n }\r\n }\r\n}\r\n\r\nexport default add\r\n","import isObject from './isObject'\r\nimport isElement from './isElement'\r\nimport isHTMLCollection from './isHTMLCollection'\r\nimport isFragment from './isFragment'\r\nimport isTextNode from './isTextNode'\r\n\r\nconst isDOM = (el) => {\r\n return !!(\r\n isObject(el) &&\r\n (isElement(el) || isHTMLCollection(el) || isFragment(el) || isTextNode(el))\r\n )\r\n}\r\n\r\nexport default isDOM\r\n","import toString from '@/utils/lang/toString'\r\nimport isObject from './isObject'\r\n\r\nconst isHTMLCollection = (el) => {\r\n return !!(isObject(el) && toString(el) === '[object NodeList]')\r\n}\r\n\r\nexport default isHTMLCollection\r\n","import toString from '@/utils/lang/toString'\r\nimport isObject from './isObject'\r\n\r\nconst isFragment = (fragment) => {\r\n return !!(\r\n isObject(fragment) && toString(fragment) === '[object DocumentFragment]'\r\n )\r\n}\r\n\r\nexport default isFragment\r\n","import toString from '@/utils/lang/toString'\r\nimport isObject from './isObject'\r\n\r\nconst isTextNode = (el) => {\r\n return !!(\r\n isObject(el) &&\r\n (toString(el) === '[object Text]' || (el.tagName && el.nodeType === 3))\r\n )\r\n}\r\n\r\nexport default isTextNode\r\n","import addClass from './addClass.js'\r\n\r\n/**\r\n * 给 DOM 节点设置属性/值\r\n * ========================================================================\r\n * @method setAttribute\r\n * @param {HTMLElement} el - DOM 节点\r\n * @param {String} attr - 属性名称\r\n * @param {String|Number|Boolean} value - 属性值\r\n */\r\nconst setAttribute = (el, attr, value) => {\r\n let tagName = el.tagName.toLowerCase()\r\n\r\n switch (attr) {\r\n case 'style':\r\n el.style.cssText = value\r\n break\r\n case 'value':\r\n if (tagName === 'input' || tagName === 'textarea') {\r\n el.value = value\r\n } else {\r\n el.setAttribute(attr, value)\r\n }\r\n break\r\n case 'htmlFor':\r\n el.setAttribute('for', value)\r\n break\r\n case 'className':\r\n addClass(el, value)\r\n break\r\n case 'innerHTML':\r\n el.innerHTML = value\r\n break\r\n case 'innerText':\r\n el.innerText = value\r\n break\r\n default:\r\n el.setAttribute(attr, value)\r\n break\r\n }\r\n}\r\n\r\nexport default setAttribute\r\n","import isObject from '../types/isObject'\r\nimport hasOwn from '../lang/hasOwn'\r\nimport setAttribute from './setAttribute'\r\n\r\nconst setAttributes = (el, attrs) => {\r\n if (!el || !isObject(attrs)) {\r\n return false\r\n }\r\n\r\n Object.keys(attrs).forEach((attr) => {\r\n const value = attrs[attr]\r\n if (hasOwn(attrs, attr)) {\r\n setAttribute(el, attr, value)\r\n }\r\n })\r\n}\r\n\r\nexport default setAttributes\r\n","import isObject from '../types/isObject'\r\nimport isString from '../types/isString'\r\nimport isArray from '../types/isArray'\r\nimport isDOM from '../types/isDOM'\r\nimport setAttributes from './setAttributes'\r\n\r\n/**\r\n * 创建 DOM 节点,并添加属性和子节点\r\n * ========================================================================\r\n * @method createElement\r\n * @param {String} tagName - 标签名称\r\n * @param {Object|Array|HTMLElement|DocumentFragment|String} attrs - 属性对象或者子节点\r\n * @param {Array|HTMLElement|DocumentFragment|String} [children] - 子节点数组\r\n * @returns {HTMLElement}\r\n */\r\nconst createElement = (tagName, attrs, children) => {\r\n const $fragment = document.createDocumentFragment()\r\n const $el = document.createElement(tagName)\r\n const isValidChild = (child) => {\r\n return isDOM(child) || isString(child)\r\n }\r\n const append = (child) => {\r\n let $child\r\n\r\n if (!isValidChild(child)) {\r\n return false\r\n }\r\n\r\n if (isDOM(child)) {\r\n $child = child\r\n } else if (isString(child)) {\r\n $child = document.createTextNode(child)\r\n }\r\n\r\n $fragment.appendChild($child)\r\n }\r\n\r\n if (isObject(attrs)) {\r\n setAttributes($el, attrs)\r\n } else if (isArray(attrs) && attrs.every((attr) => isValidChild(attr))) {\r\n attrs.forEach((child) => {\r\n append(child)\r\n })\r\n } else if (isDOM(attrs)) {\r\n append(attrs)\r\n } else if (isString(attrs)) {\r\n append(document.createTextNode(attrs))\r\n }\r\n\r\n if (isArray(children)) {\r\n children.forEach((child) => {\r\n append(child)\r\n })\r\n } else {\r\n append(children)\r\n }\r\n\r\n $el.appendChild($fragment)\r\n\r\n return $el\r\n}\r\n\r\nexport default createElement\r\n","import isArray from '@/utils/types/isArray'\r\nimport isString from '@/utils/types/isString'\r\nimport isSVG from '@/utils/types/isSVG'\r\nimport setAttributes from '@/utils/dom/setAttributes'\r\n\r\n/**\r\n * 创建 SVG 图标 DOM 元素\r\n * ========================================================================\r\n * @method createElement\r\n * @param {String} name\r\n * @param {Object} [options]\r\n * @param {Number|Array} [options.size]\r\n * @param {String} [options.color]\r\n * @param {String} [options.iconSet]\r\n * @param {Object} [options.attrs]\r\n * @returns {HTMLElement}\r\n */\r\nconst createElement = (name, options = {}) => {\r\n const ICON = 'outline-icon'\r\n const size = options.size || 0\r\n const color = options.color || ''\r\n const iconSet = options.iconSet || ''\r\n const width = isArray(size) ? size[0] : size\r\n const height = isArray(size) ? size[1] : size\r\n const defaultRules = size ? `width:${width}px;height:${height}px;` : ''\r\n const cssRules = color ? defaultRules + `color:${color}` : defaultRules\r\n const attrs = options.attrs || {}\r\n const $icon = document.createElement('i')\r\n let binds = ''\r\n let svg = ''\r\n let $svg\r\n\r\n if (!isString(name)) {\r\n return null\r\n }\r\n\r\n if (isSVG(name)) {\r\n svg = name\r\n } else {\r\n binds =\r\n iconSet && iconSet !== 'icon'\r\n ? `xlink:href=\"#${iconSet}-icon-${name}\"`\r\n : `xlink:href=\"#icon-${name}\"`\r\n svg = ``\r\n }\r\n\r\n $icon.innerHTML = svg\r\n\r\n if (attrs.className) {\r\n attrs.className = `${ICON} ${attrs.className}`\r\n } else {\r\n attrs.className = ICON\r\n }\r\n\r\n setAttributes($icon, attrs)\r\n\r\n $svg = $icon.querySelector('svg')\r\n setAttributes($svg, {\r\n 'aria-hidden': true,\r\n xmlns: 'http://www.w3.org/2000/svg',\r\n class: 'outline-icon__svg',\r\n width: 200,\r\n height: 200,\r\n style: cssRules\r\n })\r\n\r\n return $icon\r\n}\r\n\r\nexport default createElement\r\n","import isString from './isString'\r\n\r\nconst isSVG = (str) => {\r\n const declaration = '(?:<\\\\?xml[^>]*>\\\\s*)?'\r\n const doctype =\r\n '(?:<\\\\!doctype svg[^>]*\\\\s*(?:\\\\[?(?:\\\\s*]*>\\\\s*)*\\\\]?)*[^>]*>\\\\s*)?'\r\n const content = ']*>[^]*<\\\\/svg>\\\\s*$'\r\n const svg = `^\\\\s*${declaration}${doctype}${content}\\\\s*$`\r\n const pattern = new RegExp(svg, 'i')\r\n\r\n return isString(str) && pattern.test(str)\r\n}\r\n\r\nexport default isSVG\r\n","import createElement from './createElement'\r\n\r\n/**\r\n * 创建 SVG 图标 DOM 元素\r\n * ========================================================================\r\n * @method icon\r\n * @alias createElement\r\n * @see createElement\r\n * @param {String} name\r\n * @param {Object} [options]\r\n * @param {Number|Array} [options.size]\r\n * @param {String} [options.color]\r\n * @param {String} [options.iconSet]\r\n * @returns {HTMLElement}\r\n */\r\nconst icon = (name, options = {}) => {\r\n return createElement(name, options)\r\n}\r\n\r\nexport default icon\r\n","import trim from '../lang/trim'\r\nimport hasClass from './hasClass'\r\n\r\n/**\r\n * 移除 DOM 节点的 className 样式\r\n * ========================================================================\r\n * @method removeClass\r\n * @param {HTMLElement} el - DOM 节点\r\n * @param {String} className - 样式名称\r\n * @returns {Boolean}\r\n */\r\nconst removeClass = (el, className) => {\r\n let allClass = el.className\r\n let classList\r\n\r\n if (!allClass || !hasClass(el, className)) {\r\n return false\r\n }\r\n\r\n classList = el.classList\r\n\r\n if (classList?.remove) {\r\n classList.remove(className)\r\n } else {\r\n allClass = trim(allClass.replace(className, ''))\r\n el.className = allClass\r\n }\r\n}\r\n\r\nexport default removeClass\r\n","import removeClass from '@/utils/dom/removeClass'\r\nimport isEmpty from '@/utils/types/isEmpty'\r\nimport trim from '@/utils/lang/trim'\r\n\r\nconst _removeHeading = ($heading, hasAnchor = true, isAtStart = true) => {\r\n const CLS_HEADING = 'outline-heading'\r\n const text = $heading.innerHTML\r\n const pattern = /^\\d+(\\.?\\d+)*\\s?/gi\r\n let $anchor\r\n\r\n $heading.innerHTML = text.replace(pattern, '')\r\n $heading.removeAttribute('id')\r\n $heading.removeAttribute('data-id')\r\n\r\n removeClass($heading, CLS_HEADING)\r\n\r\n if (!hasAnchor) {\r\n return false\r\n }\r\n\r\n $anchor = $heading.querySelector(`.${CLS_HEADING}__anchor`)\r\n\r\n if (isAtStart) {\r\n removeClass($heading, `${CLS_HEADING}_start`)\r\n }\r\n\r\n if (isEmpty(trim($heading.className))) {\r\n $heading.removeAttribute('class')\r\n }\r\n\r\n // 存在锚点才移除\r\n if ($anchor) {\r\n $heading.removeChild($anchor)\r\n }\r\n}\r\n\r\nexport default _removeHeading\r\n","import isString from './isString'\r\n/**\r\n * 检测数据是否为空字符串\r\n * ========================================================================\r\n * @method isEmpty\r\n * @param {String} str\r\n * @returns {boolean}\r\n */\r\nconst isEmpty = (str) => {\r\n return isString(str) && str === ''\r\n}\r\n\r\nexport default isEmpty\r\n","function styleInject(css, ref) {\n if ( ref === void 0 ) ref = {};\n var insertAt = ref.insertAt;\n\n if (!css || typeof document === 'undefined') { return; }\n\n var head = document.head || document.getElementsByTagName('head')[0];\n var style = document.createElement('style');\n style.type = 'text/css';\n\n if (insertAt === 'top') {\n if (head.firstChild) {\n head.insertBefore(style, head.firstChild);\n } else {\n head.appendChild(style);\n }\n } else {\n head.appendChild(style);\n }\n\n if (style.styleSheet) {\n style.styleSheet.cssText = css;\n } else {\n style.appendChild(document.createTextNode(css));\n }\n}\n\nexport default styleInject;\n","import isString from '@/utils/types/isString'\r\nimport isFunction from '@/utils/types/isFunction'\r\nimport isElement from '@/utils/types/isElement'\r\n\r\nimport cloneDeep from '@/utils/lang/cloneDeep'\r\nimport timeSlice from '@/utils/lang/timeSlice'\r\nimport later from '@/utils/lang/later'\r\n\r\nimport scrollTo from '@/utils/dom/scrollTo'\r\nimport getScrollElement from '@/utils/dom/getScrollElement'\r\nimport offsetTop from '@/utils/dom/offsetTop'\r\n\r\nimport on from '@/utils/event/on'\r\nimport off from '@/utils/event/off'\r\nimport stop from '@/utils/event/stop'\r\n\r\nimport paint from '@/utils/icons/paint'\r\n\r\nimport getChapters from '@/chapters/getChapters'\r\n\r\nimport Component from '@/component'\r\n\r\nimport _updateHeading from './utils/_updateHeading'\r\nimport _removeHeading from './utils/_removeHeading'\r\n\r\nimport './anchors.less'\r\n\r\nclass Anchors extends Component {\r\n constructor(options) {\r\n super()\r\n\r\n this._default()\r\n\r\n if (options) {\r\n this.initialize(options)\r\n }\r\n }\r\n\r\n _default() {\r\n this.attrs = cloneDeep(Anchors.DEFAULTS)\r\n\r\n this.$articleElement = null\r\n this.$scrollElement = null\r\n this.$headings = []\r\n\r\n return this\r\n }\r\n\r\n initialize(options) {\r\n let created\r\n let scrollElement\r\n let $articleElement\r\n let articleElement\r\n\r\n this.attr(options)\r\n\r\n articleElement = this.attr('articleElement')\r\n scrollElement = this.attr('scrollElement')\r\n created = this.attr('created')\r\n\r\n if (isString(articleElement)) {\r\n $articleElement = document.querySelector(articleElement)\r\n } else if (isElement(articleElement)) {\r\n $articleElement = articleElement\r\n }\r\n\r\n if (!$articleElement) {\r\n return this\r\n }\r\n\r\n this.$articleElement = $articleElement\r\n this.$scrollElement = getScrollElement(scrollElement)\r\n this.$headings = this.getHeadings()\r\n\r\n if (this.$headings.length < 1) {\r\n return this\r\n }\r\n\r\n if (isFunction(created)) {\r\n created.call(this)\r\n }\r\n\r\n this.render().addListeners()\r\n\r\n return this\r\n }\r\n\r\n getHeadings() {\r\n const $articleElement = this.$articleElement\r\n const selector = this.attr('selector')\r\n\r\n return [...$articleElement.querySelectorAll(selector)]\r\n }\r\n\r\n count() {\r\n return this.getHeadings().length\r\n }\r\n\r\n render() {\r\n const articleElement = this.attr('articleElement')\r\n const selector = this.attr('selector')\r\n const showCode = this.attr('showCode')\r\n const chapterTextFilter = this.attr('chapterTextFilter')\r\n const mounted = this.attr('mounted')\r\n const chapters = getChapters({\r\n articleElement,\r\n selector,\r\n showCode,\r\n chapterTextFilter\r\n })\r\n\r\n paint()\r\n\r\n this._paint(chapters)\r\n\r\n if (isFunction(mounted)) {\r\n mounted.call(this)\r\n }\r\n\r\n return this\r\n }\r\n\r\n erase() {\r\n this._remove()\r\n\r\n return this\r\n }\r\n\r\n _paint(chapters) {\r\n const LIMIT = 400\r\n const hasAnchor = this.attr('hasAnchor')\r\n const isAtStart = this.attr('isAtStart')\r\n const showCode = this.attr('showCode')\r\n const anchorURL = this.attr('anchorURL')\r\n const anchorLinkFilter = this.attr('anchorLinkFilter')\r\n const count = this.count()\r\n const $headings = [...this.$headings]\r\n const update = (headings, group) => {\r\n headings.forEach(($heading, i) => {\r\n const id = i + group * LIMIT\r\n const chapterCode = chapters[id].code\r\n _updateHeading($heading, id, {\r\n hasAnchor,\r\n isAtStart,\r\n showCode,\r\n chapterCode,\r\n anchorURL,\r\n anchorLinkFilter\r\n })\r\n })\r\n }\r\n let groupIndex = -1\r\n\r\n // 针对超长的文章,进行 timeSlice 处理\r\n if (count > LIMIT) {\r\n groupIndex += 1\r\n // 同步绘制 Limit 以内的标题链接(可以确保 50ms 完成绘制)\r\n update($headings.splice(0, LIMIT), 0)\r\n // 采用 timeSlice 处理机制绘制剩余的标题\r\n while ($headings.length > 0) {\r\n const once = $headings.splice(0, LIMIT)\r\n timeSlice(\r\n () => {\r\n update(once, (groupIndex += 1))\r\n },\r\n () => {\r\n this.$emit('anchors:all:paint')\r\n }\r\n )\r\n }\r\n } else {\r\n update($headings, 0)\r\n }\r\n\r\n return this\r\n }\r\n\r\n _remove() {\r\n const hasAnchor = this.attr('hasAnchor')\r\n const isAtStart = this.attr('isAtStart')\r\n const $headings = this.$headings\r\n\r\n $headings.forEach(($heading) => {\r\n _removeHeading($heading, hasAnchor, isAtStart)\r\n })\r\n\r\n return this\r\n }\r\n\r\n refresh(chapters) {\r\n const articleElement = this.attr('articleElement')\r\n const selector = this.attr('selector')\r\n const showCode = this.attr('showCode')\r\n const chapterTextFilter = this.attr('chapterTextFilter')\r\n\r\n this.$headings = this.getHeadings()\r\n\r\n this.erase()._paint(\r\n chapters ||\r\n getChapters({\r\n articleElement,\r\n selector,\r\n showCode,\r\n chapterTextFilter\r\n })\r\n )\r\n\r\n return this\r\n }\r\n\r\n scrollTo(top, after) {\r\n const el = this.$scrollElement\r\n\r\n scrollTo(el, top, after)\r\n\r\n return this\r\n }\r\n\r\n destroy() {\r\n const beforeDestroy = this.attr('beforeDestroy')\r\n const afterDestroy = this.attr('afterDestroy')\r\n\r\n if (isFunction(beforeDestroy)) {\r\n beforeDestroy.call(this)\r\n }\r\n\r\n this.removeListeners()._remove()._default()\r\n\r\n if (isFunction(afterDestroy)) {\r\n afterDestroy.call(this)\r\n }\r\n\r\n return this\r\n }\r\n\r\n onAnchorTrigger(evt) {\r\n const anchorURL = this.attr('anchorURL')\r\n const afterScroll = this.attr('afterScroll')\r\n const stickyHeight = this.attr('stickyHeight')\r\n const $anchor = evt.delegateTarget\r\n const $heading = $anchor.parentNode\r\n const top = offsetTop($heading) - (stickyHeight + 10)\r\n const $scrollElement = this.$scrollElement\r\n const min = 0\r\n const max = $scrollElement.scrollHeight - $scrollElement.clientHeight\r\n const after = () => {\r\n if (isFunction(afterScroll)) {\r\n afterScroll.call(this, 'anchor')\r\n }\r\n\r\n later(() => {\r\n this.$emit('toolbar:update', {\r\n top,\r\n min,\r\n max\r\n })\r\n })\r\n }\r\n\r\n this.scrollTo(top, after)\r\n\r\n if (!anchorURL) {\r\n stop(evt)\r\n }\r\n\r\n return this\r\n }\r\n\r\n onRefresh(chapters) {\r\n this.refresh(chapters)\r\n\r\n return this\r\n }\r\n\r\n addListeners() {\r\n const $articleElement = this.$articleElement\r\n\r\n if (this.count() < 1) {\r\n return this\r\n }\r\n\r\n on(\r\n $articleElement,\r\n '.outline-heading__anchor',\r\n 'click',\r\n this.onAnchorTrigger,\r\n this,\r\n true\r\n )\r\n\r\n this.$on('anchors:refresh', this.onRefresh)\r\n\r\n return this\r\n }\r\n\r\n removeListeners() {\r\n const $articleElement = this.$articleElement\r\n\r\n if (this.count() < 1) {\r\n return this\r\n }\r\n\r\n off($articleElement, 'click', this.onAnchorTrigger)\r\n this.$off('anchors:refresh', this.onRefresh)\r\n\r\n return this\r\n }\r\n}\r\n\r\nAnchors.DEFAULTS = (() => {\r\n const OPTIONS = {\r\n scrollElement: 'html,body',\r\n articleElement: '#article',\r\n selector: 'h1,h2,h3,h4,h5,h6',\r\n stickyHeight: 0,\r\n anchorURL: '',\r\n hasAnchor: true,\r\n isAtStart: true,\r\n showCode: false,\r\n created: null,\r\n mounted: null,\r\n afterScroll: null,\r\n beforeDestroy: null,\r\n afterDestroy: null,\r\n chapterTextFilter: null,\r\n anchorLinkFilter: null\r\n }\r\n\r\n return cloneDeep(OPTIONS)\r\n})()\r\n\r\nexport default Anchors\r\n","import isFunction from '@/utils/types/isFunction'\r\nimport trim from '@/utils/lang/trim'\r\nimport createElement from '@/utils/dom/createElement'\r\nimport setAttributes from '@/utils/dom/setAttributes'\r\n\r\nimport icon from '@/utils/icons/icon'\r\n\r\nconst _updateHeading = ($heading, i, options) => {\r\n const CLS_HEADING = 'outline-heading'\r\n const hasAnchor = options.hasAnchor || true\r\n const isAtStart = options.isAtStart || true\r\n const showCode = options.showCode || false\r\n const chapterCode = options.chapterCode || ''\r\n const anchorURL = options.anchorURL || ''\r\n const anchorLinkFilter = options.anchorLinkFilter || null\r\n const headingId = `heading-${i}`\r\n const attrs = {\r\n id: headingId,\r\n className: isAtStart ? `${CLS_HEADING} ${CLS_HEADING}_start` : CLS_HEADING,\r\n 'data-id': i\r\n }\r\n const text = trim($heading.innerHTML)\r\n let url\r\n let $anchor\r\n let $icon\r\n\r\n if (showCode) {\r\n attrs.innerHTML = chapterCode + ' ' + text\r\n attrs['data-code'] = chapterCode\r\n }\r\n setAttributes($heading, attrs)\r\n\r\n if (!hasAnchor) {\r\n return false\r\n }\r\n\r\n if (anchorURL) {\r\n url = anchorURL\r\n } else {\r\n if (isFunction(anchorLinkFilter)) {\r\n url = anchorLinkFilter($heading.tagName.toLowerCase(), text, i)\r\n } else {\r\n url = `#${headingId}`\r\n }\r\n }\r\n\r\n $icon = icon('hash', { iconSet: 'outline' })\r\n $anchor = createElement(\r\n 'a',\r\n {\r\n id: `anchor-${i}`,\r\n className: `${CLS_HEADING}__anchor anchor-${i}`,\r\n href: url,\r\n target: anchorURL ? '_blank' : 'self',\r\n 'data-id': i\r\n },\r\n $icon\r\n )\r\n $heading.appendChild($anchor)\r\n}\r\n\r\nexport default _updateHeading\r\n","// HTML 合法的标签\r\nconst TAGS = [\r\n 'a',\r\n 'abbr',\r\n 'address',\r\n 'area',\r\n 'article',\r\n 'aside',\r\n 'audio',\r\n 'b',\r\n 'base',\r\n 'bdi',\r\n 'bdo',\r\n 'blockquote',\r\n 'body',\r\n 'br',\r\n 'button',\r\n 'canvas',\r\n 'caption',\r\n 'cite',\r\n 'code',\r\n 'col',\r\n 'colgroup',\r\n 'data',\r\n 'datalist',\r\n 'dd',\r\n 'del',\r\n 'details',\r\n 'dfn',\r\n 'dialog',\r\n 'div',\r\n 'dl',\r\n 'dt',\r\n 'em',\r\n 'embed',\r\n 'fieldset',\r\n 'figcaption',\r\n 'figure',\r\n 'footer',\r\n 'form',\r\n 'h1',\r\n 'h2',\r\n 'h3',\r\n 'h4',\r\n 'h5',\r\n 'h6',\r\n 'head',\r\n 'header',\r\n 'hgroup',\r\n 'hr',\r\n 'html',\r\n 'i',\r\n 'iframe',\r\n 'img',\r\n 'input',\r\n 'ins',\r\n 'kbd',\r\n 'label',\r\n 'legend',\r\n 'li',\r\n 'link',\r\n 'main',\r\n 'map',\r\n 'mark',\r\n 'math',\r\n 'menu',\r\n 'menuitem',\r\n 'meta',\r\n 'meter',\r\n 'nav',\r\n 'noscript',\r\n 'object',\r\n 'ol',\r\n 'optgroup',\r\n 'option',\r\n 'output',\r\n 'p',\r\n 'param',\r\n 'picture',\r\n 'pre',\r\n 'progress',\r\n 'q',\r\n 'rb',\r\n 'rp',\r\n 'rt',\r\n 'rtc',\r\n 'ruby',\r\n 's',\r\n 'samp',\r\n 'script',\r\n 'search',\r\n 'section',\r\n 'select',\r\n 'slot',\r\n 'small',\r\n 'source',\r\n 'span',\r\n 'strong',\r\n 'style',\r\n 'sub',\r\n 'summary',\r\n 'sup',\r\n 'svg',\r\n 'table',\r\n 'tbody',\r\n 'td',\r\n 'template',\r\n 'textarea',\r\n 'tfoot',\r\n 'th',\r\n 'thead',\r\n 'time',\r\n 'title',\r\n 'tr',\r\n 'track',\r\n 'u',\r\n 'ul',\r\n 'var',\r\n 'video',\r\n 'wbr'\r\n]\r\n\r\nexport default TAGS\r\n","import trim from '@/utils/lang/trim'\r\nimport isString from './isString'\r\nimport TAGS from './tags'\r\n\r\n/**\r\n * 检测测试数据是否为合法的 HTML 代码\r\n * ========================================================================\r\n * @method isHTML\r\n * @category Lang\r\n * @see https://github.com/sindresorhus/html-tags\r\n * @see https://github.com/sindresorhus/is-html\r\n * @param {String} str - 要检测的数据\r\n * @returns {Boolean} 'val' 为合法的 HTML 代码,返回 true,否则返回 false\r\n */\r\nconst isHTML = (str) => {\r\n let html\r\n let basic\r\n let full\r\n\r\n if (!isString(str)) {\r\n return false\r\n }\r\n\r\n // 为了提高性能,我们将其限制在合理的长度内。\r\n html = trim(str).slice(0, 1000)\r\n basic = /\\s*|]*>|]*>|]+>/i\r\n full = new RegExp(TAGS.map((tag) => `<${tag}\\\\b[^>]*>`).join('|'), 'i')\r\n\r\n return basic.test(html) || full.test(html)\r\n}\r\n\r\nexport default isHTML\r\n","/**\r\n * 移除字符串中的 JavaScript 代码\r\n * ====================================================\r\n * @param {String} str\r\n * @returns {String}\r\n */\r\nconst stripScripts = (str) => {\r\n return str.replace(/]*>.*?<\\/script>/gi, '')\r\n}\r\n\r\nexport default stripScripts\r\n","const setProperty = (prop, value) => {\r\n const documentElement = document.documentElement\r\n documentElement.style.setProperty(prop, value)\r\n}\r\n\r\nexport default setProperty\r\n","import setProperty from './setProperty'\r\n\r\nlet index = 2000\r\n\r\nconst zIndex = (idx) => {\r\n if (idx) {\r\n index = idx\r\n } else {\r\n index += 1\r\n }\r\n\r\n setProperty('--outline-zIndex', `${index}`)\r\n\r\n return index\r\n}\r\n\r\nexport default zIndex\r\n","import later from '@/utils/lang/later'\r\nimport cloneDeep from '@/utils/lang/cloneDeep'\r\nimport isFunction from '@/utils/types/isFunction'\r\nimport isDOM from '@/utils/types/isDOM'\r\nimport isHTML from '@/utils/types/isHTML'\r\nimport addClass from '@/utils/dom/addClass'\r\nimport removeClass from '@/utils/dom/removeClass'\r\nimport html from '@/utils/dom/html'\r\nimport createElement from '@/utils/dom/createElement'\r\nimport zIndex from '@/utils/dom/zIndex'\r\nimport on from '@/utils/event/on'\r\nimport off from '@/utils/event/off'\r\n\r\nimport paint from '@/utils/icons/paint'\r\nimport icon from '@/utils/icons/icon'\r\n\r\nimport Component from '@/component'\r\n\r\nimport './drawer.less'\r\n\r\nclass Drawer extends Component {\r\n constructor(options) {\r\n super()\r\n\r\n this._default()\r\n\r\n this.zIndex = 0\r\n\r\n if (options) {\r\n this.initialize(options)\r\n }\r\n }\r\n\r\n _default() {\r\n this.attrs = cloneDeep(Drawer.DEFAULTS)\r\n this.title = ''\r\n this.closed = false\r\n\r\n this.$el = null\r\n this.$modal = null\r\n this.$header = null\r\n this.$title = null\r\n this.$close = null\r\n this.$main = null\r\n this.$footer = null\r\n this.$overlay = null\r\n\r\n return this\r\n }\r\n\r\n initialize(options) {\r\n let created\r\n\r\n this.attr(options)\r\n\r\n this.title = this.attr('title')\r\n created = this.attr('created')\r\n\r\n if (isFunction(created)) {\r\n created.call(this)\r\n }\r\n\r\n this.render().addListeners()\r\n return this\r\n }\r\n\r\n setTitle(title) {\r\n this.attr('title', title)\r\n this.title = title\r\n this.$title.innerHTML = title\r\n\r\n return this\r\n }\r\n\r\n isClosed() {\r\n return this.closed\r\n }\r\n\r\n render() {\r\n const mounted = this.attr('mounted')\r\n const size = this.attr('size')\r\n const placement = this.attr('placement')\r\n const hasClose = this.attr('hasClose')\r\n const hasOverlay = this.attr('hasOverlay')\r\n const hasOffset = this.attr('hasOffset')\r\n const hasPadding = this.attr('hasPadding')\r\n const autoHeight = this.attr('autoHeight')\r\n const overflow = this.attr('overflow')\r\n const customClass = this.attr('customClass')\r\n let mainClassName = 'outline-drawer__main'\r\n let $el\r\n let $modal\r\n let $header\r\n let $title\r\n let $close\r\n let $main\r\n let $footer\r\n let $overlay\r\n\r\n paint()\r\n this.zIndex = zIndex()\r\n\r\n $title = createElement(\r\n 'h2',\r\n {\r\n className: 'outline-drawer__title'\r\n },\r\n this.title\r\n )\r\n this.$title = $title\r\n\r\n if (hasClose) {\r\n $close = createElement(\r\n 'div',\r\n {\r\n className: 'outline-drawer__close'\r\n },\r\n icon('close', { iconSet: 'outline', size: 20 })\r\n )\r\n this.$close = $close\r\n }\r\n\r\n $header = createElement(\r\n 'header',\r\n {\r\n className: 'outline-drawer__header'\r\n },\r\n [$title, $close]\r\n )\r\n this.$header = $header\r\n\r\n if (overflow === 'hidden') {\r\n mainClassName += ' overflow-hidden'\r\n }\r\n\r\n $main = createElement('div', {\r\n className: mainClassName\r\n })\r\n this.$main = $main\r\n\r\n if (!hasPadding) {\r\n addClass($main, 'outline-drawer_full')\r\n }\r\n\r\n $footer = createElement('footer', {\r\n className: 'outline-drawer__footer'\r\n })\r\n this.$footer = $footer\r\n\r\n $modal = createElement(\r\n 'div',\r\n {\r\n className: `outline-drawer__modal outline-drawer_${placement} outline-drawer_${size} outline-drawer_closed`\r\n },\r\n [$header, $main, $footer]\r\n )\r\n this.$modal = $modal\r\n\r\n if (hasOffset) {\r\n addClass($modal, 'outline-drawer_offset')\r\n }\r\n\r\n if (autoHeight) {\r\n addClass($modal, 'outline-drawer_auto')\r\n }\r\n\r\n if (customClass) {\r\n addClass($modal, customClass)\r\n }\r\n\r\n if (hasOverlay) {\r\n $overlay = createElement('div', {\r\n className: 'outline-drawer__overlay'\r\n })\r\n this.$overlay = $overlay\r\n }\r\n\r\n $el = createElement(\r\n 'div',\r\n {\r\n className: `outline-drawer`\r\n },\r\n [$modal, $overlay]\r\n )\r\n this.$el = $el\r\n document.body.appendChild($el)\r\n\r\n if (isFunction(mounted)) {\r\n mounted.call(this)\r\n }\r\n\r\n return this\r\n }\r\n\r\n erase() {\r\n this.$main.innerHTML = ''\r\n return this\r\n }\r\n\r\n _paint(content) {\r\n let $content = null\r\n\r\n if (isFunction(content)) {\r\n $content = content()\r\n } else if (isDOM(content)) {\r\n $content = content\r\n } else if (isHTML(content)) {\r\n $content = html(content)\r\n }\r\n\r\n if ($content) {\r\n this.$main.appendChild($content)\r\n }\r\n\r\n return this\r\n }\r\n\r\n _remove() {\r\n document.body.removeChild(this.$el)\r\n return this\r\n }\r\n\r\n refresh(content) {\r\n this.erase()._paint(content)\r\n return this\r\n }\r\n\r\n open() {\r\n const opened = this.attr('afterOpened')\r\n const $modal = this.$modal\r\n\r\n addClass(this.$el, 'outline-drawer_opened')\r\n removeClass($modal, 'outline-drawer_closed')\r\n addClass($modal, 'outline-drawer_opened')\r\n\r\n later(() => {\r\n this.closed = false\r\n\r\n if (isFunction(opened)) {\r\n opened.call(this)\r\n }\r\n })\r\n\r\n return this\r\n }\r\n\r\n close() {\r\n const closed = this.attr('afterClosed')\r\n const $modal = this.$modal\r\n\r\n removeClass($modal, 'outline-drawer_opened')\r\n addClass($modal, 'outline-drawer_closed')\r\n\r\n later(() => {\r\n removeClass(this.$el, 'outline-drawer_opened')\r\n this.closed = true\r\n\r\n if (isFunction(closed)) {\r\n closed.call(this)\r\n }\r\n })\r\n\r\n return this\r\n }\r\n\r\n toggle() {\r\n const afterToggle = this.attr('afterToggle')\r\n const closed = this.isClosed()\r\n\r\n if (closed) {\r\n this.open()\r\n } else {\r\n this.close()\r\n }\r\n\r\n if (isFunction(afterToggle)) {\r\n later(() => {\r\n afterToggle.call(this, closed)\r\n })\r\n }\r\n\r\n return this\r\n }\r\n\r\n destroy() {\r\n const afterDestroy = this.attr('afterDestroy')\r\n const beforeDestroy = this.attr('beforeDestroy')\r\n let index = this.zIndex\r\n\r\n if (isFunction(beforeDestroy)) {\r\n beforeDestroy.call(this)\r\n }\r\n\r\n this.removeListeners()._remove()._default()\r\n\r\n index -= 1\r\n zIndex(index)\r\n this.zIndex = 0\r\n\r\n if (isFunction(afterDestroy)) {\r\n afterDestroy.call(this)\r\n }\r\n\r\n return this\r\n }\r\n\r\n onClose() {\r\n this.close()\r\n return this\r\n }\r\n\r\n addListeners() {\r\n const hasClose = this.attr('hasClose')\r\n const hasOverlay = this.attr('hasOverlay')\r\n const closeOnClickModal = this.attr('closeOnClickModal')\r\n const $el = this.$el\r\n\r\n if (hasClose) {\r\n on($el, '.outline-drawer__close', 'click', this.onClose, this, true)\r\n }\r\n\r\n if (hasOverlay && closeOnClickModal) {\r\n on($el, '.outline-drawer__overlay', 'click', this.onClose, this, true)\r\n }\r\n\r\n return this\r\n }\r\n\r\n removeListeners() {\r\n const hasClose = this.attr('hasClose')\r\n const hasOverlay = this.attr('hasOverlay')\r\n const $el = this.$el\r\n\r\n if (!hasClose && !hasOverlay) {\r\n return this\r\n }\r\n\r\n off($el, 'click', this.onClose)\r\n\r\n return this\r\n }\r\n}\r\n\r\nDrawer.DEFAULTS = (() => {\r\n const OPTIONS = {\r\n placement: 'rtl',\r\n title: '标题',\r\n size: 'regular',\r\n hasClose: true,\r\n hasOverlay: true,\r\n hasOffset: false,\r\n hasPadding: true,\r\n autoHeight: true,\r\n closeOnClickModal: true,\r\n overflow: 'auto',\r\n created: null,\r\n mounted: null,\r\n afterClosed: null,\r\n afterOpened: null,\r\n afterScroll: null,\r\n beforeDestroy: null,\r\n afterDestroy: null,\r\n afterToggle: null\r\n }\r\n\r\n return cloneDeep(OPTIONS)\r\n})()\r\n\r\nexport default Drawer\r\n","import isHTML from '../types/isHTML'\r\nimport isString from '../types/isString'\r\nimport isElement from '../types/isElement'\r\nimport stripScripts from '../lang/stripScripts'\r\nimport createElement from './createElement'\r\n\r\n/**\r\n * 获取或者设置 DOM 元素的 innerHTML 属性值,或者通过 HTML 字符串,创建 DOM 元素\r\n * ========================================================================\r\n * @method html\r\n * @param {HTMLElement|String} el\r\n * @param {String} [strHTML]\r\n * @return {DocumentFragment|null|*}\r\n */\r\nconst html = (el, strHTML) => {\r\n const $fragment = document.createDocumentFragment()\r\n\r\n if (!el || (!isHTML(el) && !isString(el) && !isElement(el))) {\r\n return null\r\n }\r\n\r\n if (isHTML(el)) {\r\n const template = createElement('div')\r\n let children = []\r\n\r\n template.innerHTML = stripScripts(el)\r\n children = [...template.childNodes]\r\n children.forEach((child) => {\r\n $fragment.appendChild(child)\r\n })\r\n\r\n return $fragment\r\n } else if (isString(strHTML)) {\r\n el.innerHTML = stripScripts(strHTML)\r\n } else {\r\n return el.innerHTML\r\n }\r\n}\r\n\r\nexport default html\r\n","import isFunction from '@/utils/types/isFunction'\r\nimport off from './off'\r\n\r\nimport { CAPTURE_EVENTS } from './enum'\r\n\r\n/**\r\n * 绑定事件\r\n * ========================================================================\r\n * @method at\r\n * @param {HTMLElement|String|Object} el - (必须)绑定代理事件的 DOM 节点\r\n * @param {String|Function} type - (必须)事件类型或者事件处理器回调函数\r\n * @param {Function|Object} fn - (必须) 事件处理器回调函数或者传递给事件处理器回调函数的数据对象\r\n * @param {Object|Boolean} [data] - (可选)传递给事件处理器回调函数的数据对象或者事件处理器回调函数的 this 上下文指向,\r\n * @param {Object|Boolean} [context] - (可选)事件处理器回调函数的 this 上下文指向,或者是否仅触发一次\r\n * 当设置为 true 时,则事件处理器回调函数的 this 上下文指向为 data 对象\r\n * @param {Boolean} once - (可选)是否仅触发一次\r\n */\r\nconst at = (el, type, fn, data, context, once = false) => {\r\n // CAPTURE_EVENTS 中的特殊事件,采用事件捕获模型\r\n const capture = CAPTURE_EVENTS.indexOf(type) > -1\r\n const listener = function (evt) {\r\n let overrideContext = context || el\r\n\r\n // 当设置为 true 时,则事件处理器回调函数的\r\n // this 上下文指向为 data 对象\r\n if (context === true) {\r\n overrideContext = data\r\n }\r\n\r\n // 仅触发一次\r\n /* istanbul ignore else */\r\n if (once === true) {\r\n off(el, type, listener)\r\n }\r\n\r\n fn.call(overrideContext, evt, data)\r\n }\r\n\r\n if (!isFunction(fn)) {\r\n return false\r\n }\r\n\r\n if (!el._listeners) {\r\n el._listeners = []\r\n }\r\n\r\n // 缓存 options 元素绑定的事件处理器\r\n el._listeners.push({\r\n el,\r\n type,\r\n fn: listener,\r\n data,\r\n context,\r\n capture\r\n })\r\n\r\n // 缓存包装后的事件处理器\r\n fn._delegateListener = listener\r\n\r\n el.addEventListener(type, listener, capture)\r\n}\r\n\r\nexport default at\r\n","/**\r\n * 获取HTML元素的某个CSS样式值\r\n * ====================================================\r\n * @param el\r\n * @param ruleName\r\n * @returns {*}\r\n */\r\nconst getStyle = (el, ruleName) => {\r\n return getComputedStyle(el)[ruleName]\r\n}\r\n\r\nexport default getStyle\r\n","import isString from '@/utils/types/isString'\r\nimport isFunction from '@/utils/types/isFunction'\r\nimport isElement from '@/utils/types/isElement'\r\nimport later from '@/utils/lang/later'\r\nimport cloneDeep from '@/utils/lang/cloneDeep'\r\n\r\nimport at from '@/utils/event/at'\r\nimport on from '@/utils/event/on'\r\nimport off from '@/utils/event/off'\r\nimport stop from '@/utils/event/stop'\r\n\r\nimport createElement from '@/utils/dom/createElement'\r\nimport scrollTo from '@/utils/dom/scrollTo'\r\nimport addClass from '@/utils/dom/addClass'\r\nimport intersection from '@/utils/dom/intersection'\r\nimport removeClass from '@/utils/dom/removeClass'\r\nimport offsetTop from '@/utils/dom/offsetTop'\r\nimport getStyle from '@/utils/dom/getStyle'\r\nimport setProperty from '@/utils/dom/setProperty'\r\nimport inBounding from '@/utils/dom/inBounding'\r\nimport getScrollElement from '@/utils/dom/getScrollElement'\r\n\r\nimport Component from '@/component'\r\n\r\nimport _paintChapters from './utils/_paintChapters'\r\n\r\nimport './navigator.less'\r\n\r\nconst HIDDEN = 'outline-navigator_hidden'\r\nconst EXPANDED = 'outline-navigator_expanded'\r\nconst FOLDED = 'outline-navigator_folded'\r\n\r\nclass Navigator extends Component {\r\n constructor(options) {\r\n super()\r\n\r\n this._default()\r\n\r\n this.scrollTimer = null\r\n this.resizeTimer = null\r\n this.observerTimer = null\r\n this.Observer = null\r\n\r\n if (options) {\r\n this.initialize(options)\r\n }\r\n }\r\n\r\n _default() {\r\n this.attrs = cloneDeep(Navigator.DEFAULTS)\r\n\r\n this.$el = null\r\n this.$title = null\r\n this.$main = null\r\n this.$list = null\r\n this.$placeholder = null\r\n this.$parentElement = null\r\n this.$scrollElement = null\r\n this.$active = null\r\n\r\n this.chapters = []\r\n this.active = 0\r\n this.offsetWidth = 0\r\n this.offsetTop = 0\r\n this.playing = false\r\n this.closed = false\r\n\r\n return this\r\n }\r\n\r\n initialize(options) {\r\n let created\r\n let parentElement\r\n let scrollElement\r\n let $parent\r\n\r\n this.attr(options)\r\n\r\n created = this.attr('created')\r\n parentElement = this.attr('parentElement')\r\n scrollElement = this.attr('scrollElement')\r\n\r\n if (isString(parentElement)) {\r\n $parent = document.querySelector(parentElement)\r\n } else if (isElement(parentElement)) {\r\n $parent = parentElement\r\n }\r\n this.$parentElement = $parent\r\n this.$scrollElement = getScrollElement(scrollElement)\r\n\r\n this.chapters = this.attr('chapters')\r\n this.closed = this.attr('closed')\r\n this.active = this.attr('active')\r\n\r\n if (isFunction(created)) {\r\n created.call(this)\r\n }\r\n\r\n if (this.chapters.length < 1) {\r\n return this\r\n }\r\n\r\n this.render().addListeners()\r\n\r\n this.$active = document.querySelector(`#chapter-${this.active}`)\r\n\r\n return this\r\n }\r\n\r\n isClosed() {\r\n return this.closed\r\n }\r\n\r\n isSticky() {\r\n const position = this.attr('position')\r\n return position === 'sticky'\r\n }\r\n\r\n isFixed() {\r\n const position = this.attr('position')\r\n return position === 'fixed'\r\n }\r\n\r\n isInside() {\r\n return this.isFixed() || this.isSticky()\r\n }\r\n\r\n isOutside() {\r\n return !this.isInside()\r\n }\r\n\r\n count() {\r\n return this.chapters.length\r\n }\r\n\r\n _paintEdge() {\r\n const $fragment = document.createDocumentFragment()\r\n const STICKY = 'outline-navigator_sticky'\r\n const title = this.attr('title')\r\n const animationCurrent = this.attr('animationCurrent')\r\n const customClass = this.attr('customClass')\r\n const $parentElement = this.$parentElement\r\n const children = []\r\n const contents = []\r\n let $title = null\r\n let $el\r\n let $main\r\n let $list\r\n let $placeholder\r\n\r\n if (!$parentElement) {\r\n return this\r\n }\r\n\r\n if (this.isInside() && title) {\r\n $title = createElement(\r\n 'h2',\r\n {\r\n className: 'outline-navigator__title'\r\n },\r\n title\r\n )\r\n this.$title = $title\r\n contents.push($title)\r\n }\r\n\r\n $list = createElement('ul', {\r\n // 为优化性能,添加了 _fixed 和 _hidden\r\n // fixed 为了让 $list 脱离流布局\r\n // hidden 让 $list 不可见\r\n className: `outline-navigator__list`\r\n })\r\n this.$list = $list\r\n children.push($list)\r\n\r\n if (animationCurrent) {\r\n $placeholder = createElement('div', {\r\n className: 'outline-navigator__placeholder'\r\n })\r\n this.$placeholder = $placeholder\r\n children.push($placeholder)\r\n }\r\n\r\n $main = createElement(\r\n 'div',\r\n {\r\n className: 'outline-navigator__main'\r\n },\r\n children\r\n )\r\n this.$main = $main\r\n contents.push($main)\r\n\r\n $el = createElement(\r\n 'nav',\r\n {\r\n id: 'outline-navigator',\r\n className: `outline-navigator ${HIDDEN}`\r\n },\r\n contents\r\n )\r\n this.$el = $el\r\n\r\n if (this.isSticky()) {\r\n this.calculateStickyHeight()\r\n addClass($el, STICKY)\r\n }\r\n\r\n if (customClass) {\r\n addClass($el, customClass)\r\n }\r\n $fragment.appendChild($el)\r\n $parentElement.appendChild($fragment)\r\n\r\n return this\r\n }\r\n\r\n render() {\r\n const mounted = this.attr('mounted')\r\n const $parentElement = this.$parentElement\r\n const chapters = this.chapters\r\n const count = this.count()\r\n let $el\r\n\r\n if (!$parentElement || chapters.length < 1) {\r\n return this\r\n }\r\n\r\n if (this.isInside()) {\r\n addClass($parentElement, 'outline-navigator-parent')\r\n }\r\n\r\n this._paintEdge()\r\n $el = this.$el\r\n\r\n this._paint(chapters)\r\n\r\n later(() => {\r\n this.highlight(this.active)\r\n }, 60)\r\n\r\n this.offsetTop = offsetTop($el)\r\n this.offsetWidth = $el.offsetWidth\r\n\r\n if (this.isFixed()) {\r\n this.sticky()\r\n setProperty('--outline-navigator-width', `${this.offsetWidth}px`)\r\n }\r\n\r\n if (isFunction(mounted)) {\r\n mounted.call(this)\r\n }\r\n\r\n if (count < 400) {\r\n this.onObserver()\r\n }\r\n\r\n return this\r\n }\r\n\r\n erase() {\r\n this.$list.innerHTML = ''\r\n\r\n return this\r\n }\r\n\r\n _paint(chapters) {\r\n const showCode = this.attr('showCode')\r\n const $el = this.$el\r\n const $list = this.$list\r\n\r\n _paintChapters($list, chapters, showCode)\r\n removeClass($el, HIDDEN)\r\n addClass($el, EXPANDED)\r\n\r\n return this\r\n }\r\n\r\n _remove() {\r\n this.$parentElement.removeChild(this.$el)\r\n return this\r\n }\r\n\r\n refresh(chapters) {\r\n const $el = this.$el\r\n\r\n removeClass($el, HIDDEN)\r\n this.erase()._paint(chapters)\r\n\r\n return this\r\n }\r\n\r\n _getPlaceholderOffset(index) {\r\n const $main = this.$main\r\n const $list = this.$list\r\n const $anchor = $list.querySelector('.outline-navigator__anchor')\r\n const mainPaddingTop = parseInt(getStyle($main, 'padding-top'), 10)\r\n const mainBorderTop = parseInt(getStyle($main, 'border-top-width'), 10)\r\n const placeholderPaddingTop = parseInt(getStyle($list, 'padding-top'), 10)\r\n const placeholderMarginTop = parseInt(getStyle($list, 'margin-top'), 10)\r\n const placeholderBorderTop = parseInt(\r\n getStyle($list, 'border-top-width'),\r\n 10\r\n )\r\n let height = $anchor.offsetHeight\r\n let offsetTop = 0\r\n let top\r\n\r\n if (mainPaddingTop) {\r\n offsetTop += mainPaddingTop\r\n }\r\n\r\n if (placeholderPaddingTop) {\r\n offsetTop += placeholderPaddingTop\r\n }\r\n\r\n if (placeholderMarginTop) {\r\n offsetTop += placeholderMarginTop\r\n }\r\n\r\n if (mainBorderTop) {\r\n offsetTop += mainBorderTop\r\n }\r\n\r\n if (placeholderBorderTop) {\r\n offsetTop += placeholderBorderTop\r\n }\r\n\r\n top = height * index\r\n\r\n return offsetTop + top\r\n }\r\n\r\n positionPlaceholder(index) {\r\n const $list = this.$list\r\n const $placeholder = this.$placeholder\r\n const $anchor = $list.querySelector('.outline-navigator__anchor')\r\n const animationCurrent = this.attr('animationCurrent')\r\n const height = $anchor.offsetHeight\r\n let offsetTop = 0\r\n\r\n if (!animationCurrent) {\r\n return this\r\n }\r\n\r\n offsetTop = this._getPlaceholderOffset(index)\r\n\r\n $placeholder.style.cssText = `transform: translateY(${offsetTop}px);height:${height}px;`\r\n\r\n return this\r\n }\r\n\r\n highlight(id) {\r\n const $el = this.$el\r\n const animationCurrent = this.attr('animationCurrent')\r\n const position = this.attr('position')\r\n const ACTIVE = 'outline-navigator_active'\r\n const HIGHLIGHT = 'outline-navigator_highlight'\r\n let $parent = position === 'relative' ? this.$parentElement : this.$main\r\n let $anchor = null\r\n let placeholderOffsetTop = 0\r\n\r\n if (!$el) {\r\n return this\r\n }\r\n\r\n $anchor = $el.querySelector(`#chapter__anchor-${id}`)\r\n\r\n if (!$anchor) {\r\n return this\r\n }\r\n\r\n this.active = parseInt($anchor.getAttribute('data-id'), 10)\r\n\r\n if (this.$active) {\r\n removeClass(this.$active, HIGHLIGHT)\r\n removeClass(this.$active, ACTIVE)\r\n }\r\n\r\n this.$active = $anchor\r\n addClass(this.$active, ACTIVE)\r\n\r\n if (animationCurrent) {\r\n this.positionPlaceholder(this.active)\r\n } else {\r\n addClass(this.$active, HIGHLIGHT)\r\n }\r\n\r\n later(() => {\r\n if (!inBounding(this.$active, $parent)) {\r\n placeholderOffsetTop = this._getPlaceholderOffset(this.active)\r\n scrollTo($parent, placeholderOffsetTop)\r\n }\r\n })\r\n\r\n return this\r\n }\r\n\r\n sticky() {\r\n const afterSticky = this.attr('afterSticky')\r\n const FIXED = 'outline-navigator_fixed'\r\n const $el = this.$el\r\n const top = this.offsetTop\r\n const scrollTop = this.$scrollElement.scrollTop\r\n let isStickying\r\n\r\n if (!this.isFixed()) {\r\n return this\r\n }\r\n\r\n isStickying = scrollTop >= top\r\n\r\n if (isStickying) {\r\n addClass($el, FIXED)\r\n } else {\r\n removeClass($el, FIXED)\r\n }\r\n\r\n if (isFunction(afterSticky)) {\r\n afterSticky.call(this, this.isClosed(), isStickying)\r\n }\r\n\r\n return this\r\n }\r\n\r\n calculateStickyHeight() {\r\n const documentElement = document.documentElement\r\n const height = Math.max(\r\n documentElement.clientHeight || 0,\r\n window.innerHeight || 0\r\n )\r\n setProperty('--outline-sticky-height', `${height}px`)\r\n return this\r\n }\r\n\r\n scrollTo(top, after) {\r\n const el = this.$scrollElement\r\n\r\n scrollTo(el, top, after)\r\n\r\n return this\r\n }\r\n\r\n show() {\r\n const opened = this.attr('afterOpened')\r\n const count = this.count()\r\n const $el = this.$el\r\n const $parent = this.$parentElement\r\n\r\n if (this.isInside()) {\r\n if (count > 800) {\r\n removeClass($parent, HIDDEN)\r\n } else {\r\n removeClass($parent, HIDDEN)\r\n later(() => {\r\n removeClass($parent, FOLDED)\r\n addClass($parent, EXPANDED)\r\n }, 30)\r\n }\r\n } else {\r\n removeClass($el, HIDDEN)\r\n }\r\n this.closed = false\r\n\r\n if (isFunction(opened)) {\r\n opened.call(this)\r\n }\r\n\r\n return this\r\n }\r\n\r\n hide() {\r\n const closed = this.attr('afterClosed')\r\n const count = this.count()\r\n const $el = this.$el\r\n const $parent = this.$parentElement\r\n\r\n if (this.isInside()) {\r\n if (count > 800) {\r\n addClass($parent, HIDDEN)\r\n } else {\r\n addClass($parent, FOLDED)\r\n removeClass($parent, EXPANDED)\r\n later(() => {\r\n addClass($parent, HIDDEN)\r\n })\r\n }\r\n } else {\r\n addClass($el, HIDDEN)\r\n }\r\n this.closed = true\r\n\r\n if (isFunction(closed)) {\r\n closed.call(this)\r\n }\r\n\r\n return this\r\n }\r\n\r\n toggle() {\r\n const afterToggle = this.attr('afterToggle')\r\n const top = this.offsetTop\r\n const scrollTop = this.$scrollElement.scrollTop\r\n let isStickying\r\n\r\n if (this.isClosed()) {\r\n this.show()\r\n } else {\r\n this.hide()\r\n }\r\n\r\n if (isFunction(afterToggle)) {\r\n later(() => {\r\n isStickying = scrollTop >= top\r\n afterToggle.call(this, this.isClosed(), isStickying)\r\n })\r\n }\r\n\r\n return this\r\n }\r\n\r\n destroy() {\r\n const beforeDestroy = this.attr('beforeDestroy')\r\n const afterDestroy = this.attr('afterDestroy')\r\n\r\n if (isFunction(beforeDestroy)) {\r\n beforeDestroy.call(this)\r\n }\r\n\r\n this.removeListeners()._remove()._default()\r\n\r\n if (this.scrollTimer) {\r\n clearTimeout(this.scrollTimer)\r\n this.scrollTimer = null\r\n }\r\n\r\n if (this.resizeTimer) {\r\n clearTimeout(this.resizeTimer)\r\n this.resizeTimer = null\r\n }\r\n\r\n if (this.observerTimer) {\r\n clearTimeout(this.observerTimer)\r\n this.observerTimer = null\r\n }\r\n\r\n if (this.Observer) {\r\n this.Observer = null\r\n }\r\n\r\n if (isFunction(afterDestroy)) {\r\n afterDestroy.call(this)\r\n }\r\n\r\n return this\r\n }\r\n\r\n onObserver() {\r\n const selector = this.attr('selector')\r\n\r\n this.Observer = intersection(\r\n ($heading) => {\r\n const id = $heading.getAttribute('data-id')\r\n\r\n if (this.playing) {\r\n return false\r\n }\r\n\r\n if (this.observerTimer) {\r\n clearTimeout(this.observerTimer)\r\n }\r\n\r\n this.observerTimer = later(() => {\r\n this.highlight(id)\r\n }, 100)\r\n },\r\n {\r\n selector,\r\n context: this\r\n }\r\n )\r\n\r\n return this\r\n }\r\n\r\n onSelect(evt) {\r\n const stickyHeight = this.attr('stickyHeight')\r\n const $anchor = evt.delegateTarget\r\n const id = $anchor.getAttribute('data-id')\r\n const headingId = $anchor.href.split('#')[1]\r\n const $heading = document.querySelector(`#${headingId}`)\r\n const top = offsetTop($heading) - (stickyHeight + 10)\r\n const min = 0\r\n const max = this.$scrollElement.scrollHeight\r\n const afterScroll = this.attr('afterScroll')\r\n const after = () => {\r\n if (isFunction(afterScroll)) {\r\n afterScroll.call(this, 'chapter')\r\n }\r\n\r\n later(() => {\r\n this.playing = false\r\n this.$emit('toolbar:update', {\r\n top,\r\n min,\r\n max\r\n })\r\n })\r\n }\r\n\r\n this.playing = true\r\n if (this.isFixed()) {\r\n this.sticky()\r\n later(() => {\r\n this.scrollTo(top, after)\r\n this.highlight(id)\r\n }, 10)\r\n } else {\r\n this.scrollTo(top, after)\r\n this.highlight(id)\r\n }\r\n\r\n stop(evt)\r\n\r\n return this\r\n }\r\n\r\n onScroll() {\r\n const $scrollElement = this.$scrollElement\r\n\r\n if (this.scrollTimer) {\r\n clearTimeout(this.scrollTimer)\r\n }\r\n\r\n this.scrollTimer = later(() => {\r\n const top = $scrollElement.scrollTop\r\n const min = 0\r\n const max = $scrollElement.scrollHeight - $scrollElement.clientHeight\r\n\r\n if (this.isFixed()) {\r\n this.sticky()\r\n }\r\n\r\n this.$emit('toolbar:update', {\r\n top,\r\n min,\r\n max\r\n })\r\n }, 100)\r\n\r\n return this\r\n }\r\n\r\n onResize() {\r\n // 添加判断\r\n if (!this.isSticky()) {\r\n return this\r\n }\r\n\r\n if (this.resizeTimer) {\r\n clearTimeout(this.resizeTimer)\r\n }\r\n\r\n this.resizeTimer = later(() => {\r\n this.calculateStickyHeight()\r\n })\r\n\r\n return this\r\n }\r\n\r\n onRefresh(chapters) {\r\n this.refresh(chapters)\r\n\r\n return this\r\n }\r\n\r\n addListeners() {\r\n const $el = this.$el\r\n const $scrollElement = this.$scrollElement\r\n const tagName = $scrollElement.tagName.toLowerCase()\r\n let $element = $scrollElement\r\n\r\n if (this.count() < 1) {\r\n return this\r\n }\r\n\r\n if (tagName === 'html' || tagName === 'body') {\r\n $element = window\r\n }\r\n\r\n on($el, '.outline-navigator__anchor', 'click', this.onSelect, this, true)\r\n at($element, 'scroll', this.onScroll, this, true)\r\n if (this.isSticky()) {\r\n at(window, 'resize', this.onResize, this, true)\r\n }\r\n\r\n this.$on('anchors:all:paint', this.onObserver, this)\r\n this.$on('navigator:refresh', this.onRefresh, this)\r\n\r\n return this\r\n }\r\n\r\n removeListeners() {\r\n const selector = this.attr('selector')\r\n const $el = this.$el\r\n const $scrollElement = this.$scrollElement\r\n const tagName = $scrollElement.tagName.toLowerCase()\r\n let $element = $scrollElement\r\n\r\n if (this.count() < 1) {\r\n return this\r\n }\r\n\r\n if (tagName === 'html' || tagName === 'body') {\r\n $element = window\r\n }\r\n\r\n off($el, 'click', this.onSelect)\r\n off($element, 'scroll', this.onScroll)\r\n if (this.isSticky()) {\r\n off(window, 'resize', this.onResize)\r\n }\r\n this.$off('anchors:all:paint')\r\n this.$off('navigator:refresh')\r\n\r\n if (this.Observer) {\r\n document.querySelectorAll(selector).forEach((section) => {\r\n this.Observer.unobserve(section)\r\n })\r\n }\r\n\r\n return this\r\n }\r\n}\r\n\r\nNavigator.DEFAULTS = (() => {\r\n const OPTIONS = {\r\n parentElement: '',\r\n scrollElement: '',\r\n selector: '.outline-heading',\r\n active: 0,\r\n closed: false,\r\n showCode: true,\r\n animationCurrent: true,\r\n position: 'relative',\r\n stickyHeight: 0,\r\n chapters: [],\r\n created: null,\r\n mounted: null,\r\n afterClosed: null,\r\n afterOpened: null,\r\n afterScroll: null,\r\n beforeDestroy: null,\r\n afterDestroy: null,\r\n afterSticky: null\r\n }\r\n\r\n return cloneDeep(OPTIONS)\r\n})()\r\n\r\nexport default Navigator\r\n","import createElement from '@/utils/dom/createElement'\r\nimport timeSlice from '@/utils/lang/timeSlice'\r\n\r\nconst _paintChapters = ($list, chapters, showCode = false) => {\r\n const LIMIT = 400\r\n const count = chapters.length\r\n const clones = [...chapters]\r\n const paint = (parts) => {\r\n const byId = (id) => $list.querySelector(`#${id}`)\r\n parts.forEach((chapter) => {\r\n const pid = chapter.pid\r\n const id = chapter.id\r\n const code = chapter.code\r\n const rel = chapter.rel\r\n const children = []\r\n const $text = createElement(\r\n 'span',\r\n {\r\n className: 'outline-navigator__text'\r\n },\r\n chapter.text\r\n )\r\n let $link\r\n let $code\r\n let $li\r\n let $subject\r\n let $chapter\r\n\r\n if (showCode) {\r\n $code = createElement(\r\n 'span',\r\n {\r\n className: 'outline-navigator__code',\r\n 'data-id': id\r\n },\r\n chapter.code\r\n )\r\n\r\n children.push($code)\r\n }\r\n\r\n children.push($text)\r\n\r\n $link = createElement(\r\n 'a',\r\n {\r\n id: `chapter__anchor-${id}`,\r\n className: 'outline-navigator__anchor',\r\n href: '#' + rel,\r\n rel: rel,\r\n 'data-id': id,\r\n 'data-code': code\r\n },\r\n children\r\n )\r\n\r\n $li = createElement(\r\n 'li',\r\n {\r\n id: `chapter-${id}`,\r\n className: 'outline-navigator__item',\r\n 'data-id': id,\r\n 'data-code': code\r\n },\r\n $link\r\n )\r\n\r\n if (pid === -1) {\r\n $list.appendChild($li)\r\n } else {\r\n $chapter = byId(`chapter-${pid}`)\r\n $subject = byId(`subject-${pid}`)\r\n\r\n if (!$subject) {\r\n $subject = createElement(\r\n 'ul',\r\n {\r\n id: 'subject-' + pid,\r\n className: 'outline-navigator__subject'\r\n },\r\n $li\r\n )\r\n\r\n $chapter.appendChild($subject)\r\n } else {\r\n $subject.appendChild($li)\r\n }\r\n }\r\n })\r\n }\r\n\r\n // 在大量 DOM 菜单绘制的时候,使用 TIME SLICE 拆分绘制任务\r\n // 以避免一次绘制大量 DOM 导致占用资源过高,导致卡死\r\n if (count > LIMIT) {\r\n // 同步绘制\r\n paint(clones.splice(0, LIMIT))\r\n\r\n // 剩余的采用 timeSlice 机制绘制\r\n while (clones.length > 0) {\r\n const once = clones.splice(0, LIMIT)\r\n timeSlice(() => {\r\n paint(once)\r\n })\r\n }\r\n } else {\r\n paint(clones)\r\n }\r\n}\r\n\r\nexport default _paintChapters\r\n","import isElement from '../types/isElement'\r\n\r\n/**\r\n * 检测某个 DOM 节点的位置是否在另个一个 DOM 节点范围内\r\n * ========================================================================\r\n * @method inBounding\r\n * @param {HTMLElement} child\r\n * @param {HTMLElement} parent\r\n * @return {Boolean}\r\n */\r\nconst inBounding = (child, parent) => {\r\n let isInBounding = false\r\n let parentRect\r\n let childRect\r\n\r\n if (!isElement(child) || !isElement(parent)) {\r\n return isInBounding\r\n }\r\n\r\n parentRect = parent.getBoundingClientRect()\r\n childRect = child.getBoundingClientRect()\r\n\r\n isInBounding = !!(\r\n childRect.top >= parentRect.top &&\r\n childRect.right <= parentRect.right &&\r\n childRect.bottom <= parentRect.bottom &&\r\n childRect.left >= parentRect.left\r\n )\r\n\r\n return isInBounding\r\n}\r\n\r\nexport default inBounding\r\n","import isFunction from '../types/isFunction'\r\nimport isElement from '../types/isElement'\r\n\r\n/**\r\n * 通用的 IntersectionObserver 观察者处理器\r\n * ========================================================================\r\n * @method intersection\r\n * @param {Function} fn\r\n * @param {Object} [props]\r\n * @param {Object|HTMLElement} [props.root]\r\n * @param {String} [props.selector]\r\n * @param {Object} [props.context]\r\n * @param {String} [props.attr]\r\n * @param {String} [props.rootMargin]\r\n */\r\nconst intersection = (fn, props = {}) => {\r\n const root = props.root || null\r\n const selector = props.selector || '.outline-heading'\r\n const context = props.context || null\r\n const rootMargin = props.rootMargin || '0px 0px -90% 0px'\r\n const options = {\r\n rootMargin: rootMargin\r\n }\r\n // eslint-disable-next-line compat/compat\r\n const Observer = new IntersectionObserver((entries) => {\r\n entries.forEach((entry) => {\r\n if (entry.intersectionRatio > 0) {\r\n if (isFunction(fn)) {\r\n fn.call(context || entry.target, entry.target)\r\n }\r\n }\r\n })\r\n }, options)\r\n const $root = isElement(root) ? root : document\r\n\r\n if (root) {\r\n options.root = root\r\n }\r\n\r\n $root.querySelectorAll(selector).forEach((section) => {\r\n Observer.observe(section)\r\n })\r\n\r\n return Observer\r\n}\r\n\r\nexport default intersection\r\n","/**\r\n * 检测当前设备是否为移动设备\r\n * ========================================================================\r\n * @method isMobile\r\n * @return {boolean}\r\n */\r\nconst isMobile = () => {\r\n const ua = navigator.userAgent\r\n\r\n return /Mobile|mini|Fennec|Android|iP(ad|od|hone)|NokiaN[^/]*/.test(ua)\r\n}\r\n\r\nexport default isMobile\r\n","import isObjectLike from './isObjectLike'\r\n\r\n/**\r\n * 检测测试数据是否为普通对象\r\n * ========================================================================\r\n * @method isPlainObject\r\n * @param {Object} val - 要检测的数据\r\n * @returns {Boolean} 'val' 是普通对象,返回 true,否则返回 false\r\n */\r\nconst isPlainObject = (val) => {\r\n const getPrototypeOf = Object.getPrototypeOf\r\n let proto\r\n\r\n // Detect obvious negatives\r\n if (!isObjectLike(val)) {\r\n return false\r\n }\r\n\r\n proto = val.prototype\r\n\r\n // JavaScript 对象分为两种:普通对象和函数对象\r\n // 普通对象:原型是 __proto__,没有 prototype 原型(属性)\r\n // 函数对象:原型是 prototype ,prototype 只存在于函数对象上\r\n if (!proto) {\r\n return true\r\n }\r\n\r\n proto = val\r\n\r\n while (getPrototypeOf(proto) !== null) {\r\n proto = getPrototypeOf(proto)\r\n }\r\n\r\n return getPrototypeOf(val) === proto\r\n}\r\n\r\nexport default isPlainObject\r\n","import isObject from './isObject'\r\n\r\n/**\r\n * 检测测试数据是否为类似 Object 类型\r\n * ========================================================================\r\n * @method isObjectLike\r\n * @param {Object} val - 要检测的数据\r\n * @returns {Boolean} 'val' 是类似 Object 类型,返回 true,否则返回 false\r\n */\r\nconst isObjectLike = (val) => {\r\n return isObject(val) && val !== null\r\n}\r\n\r\nexport default isObjectLike\r\n","/**\r\n * 转义字符串中的 HTML 标签\r\n * ========================================================================\r\n * @param {String} str - 需要转义的字符串\r\n * @returns {String}\r\n */\r\nconst encodeHTML = (str) => {\r\n const CHARTS = {\r\n '&': '&',\r\n '<': '<',\r\n '>': '>',\r\n \"'\": ''',\r\n '\"': '"'\r\n }\r\n\r\n return str.replace(/[&<>'\"]/g, (tag) => {\r\n return CHARTS[tag] || tag\r\n })\r\n}\r\n\r\nexport default encodeHTML\r\n","import isString from '@/utils/types/isString'\r\nimport isPlainObject from '@/utils/types/isPlainObject'\r\nimport isFunction from '@/utils/types/isFunction'\r\n\r\nimport extend from '@/utils/lang/extend'\r\nimport later from '@/utils/lang/later'\r\nimport stripScripts from '@/utils/lang/stripScripts'\r\nimport encodeHTML from '@/utils/lang/encodeHTML'\r\nimport cloneDeep from '@/utils/lang/cloneDeep'\r\nimport guid from '@/utils/lang/guid'\r\n\r\nimport createElement from '@/utils/dom/createElement'\r\nimport addClass from '@/utils/dom/addClass'\r\nimport removeClass from '@/utils/dom/removeClass'\r\nimport setAttribute from '@/utils/dom/setAttribute'\r\nimport setAttributes from '@/utils/dom/setAttributes'\r\n\r\nimport icon from '@/utils/icons/icon'\r\nimport paint from '@/utils/icons/paint'\r\n\r\nimport on from '@/utils/event/on'\r\nimport off from '@/utils/event/off'\r\n\r\nimport Component from '@/component'\r\n\r\nimport './message.less'\r\n\r\nconst TYPES = ['info', 'success', 'warning', 'error']\r\nconst instances = []\r\nlet instance\r\n\r\npaint()\r\n\r\nclass Message extends Component {\r\n constructor(options) {\r\n super()\r\n\r\n this._default()\r\n\r\n if (options) {\r\n this.initialize(options)\r\n }\r\n }\r\n\r\n _default() {\r\n this.attrs = cloneDeep(Message.DEFAULTS)\r\n\r\n this.$el = null\r\n this.id = ''\r\n this.closed = false\r\n this.visible = false\r\n this.offset = -50\r\n this.timer = null\r\n this.destroyed = false\r\n\r\n return this\r\n }\r\n\r\n initialize(options) {\r\n this.attr(options)\r\n this.id = this.attr('id')\r\n this.offset = this.attr('offset') || -50\r\n\r\n this.$emit('created', { ...this.attr() })\r\n\r\n this.render().addListeners()\r\n\r\n if (this.attr('visible')) {\r\n this.open()\r\n }\r\n\r\n return this\r\n }\r\n\r\n isClosed() {\r\n return this.closed\r\n }\r\n\r\n isDestroyed() {\r\n return this.destroyed\r\n }\r\n\r\n _getClassName() {\r\n const type = this.attr('type')\r\n const effect = this.attr('effect')\r\n const round = this.attr('round')\r\n const closable = this.attr('closable')\r\n const visible = this.attr('visible')\r\n const customClass = this.attr('customClass')\r\n const className = [\r\n 'outline-message',\r\n `outline-message_${type}`,\r\n `outline-message_${effect}`\r\n ]\r\n\r\n if (round) {\r\n className.push('outline-message_round')\r\n }\r\n\r\n if (!closable) {\r\n className.push('outline-message_full-width')\r\n }\r\n\r\n if (visible) {\r\n className.push('outline-message_visible')\r\n }\r\n\r\n if (customClass) {\r\n className.push(customClass)\r\n }\r\n\r\n return className\r\n }\r\n\r\n render() {\r\n const type = this.attr('type')\r\n const message = this.attr('message')\r\n const effect = this.attr('effect')\r\n const round = this.attr('round')\r\n const closable = this.attr('closable')\r\n const dangerouslyUseHTMLString = this.attr('dangerouslyUseHTMLString')\r\n const className = this._getClassName()\r\n const iconName = effect === 'light' ? `circle-${type}` : type\r\n const children = []\r\n let iconSize = 20\r\n let $type\r\n let $message\r\n let $text\r\n let $close\r\n let $el\r\n\r\n if (round && effect === 'default') {\r\n iconSize = 12\r\n }\r\n\r\n if (effect !== 'plain') {\r\n $type = icon(iconName, {\r\n iconSet: 'outline',\r\n size: iconSize\r\n })\r\n addClass($type, 'outline-message__icon')\r\n children.push($type)\r\n }\r\n\r\n if (!dangerouslyUseHTMLString) {\r\n $text = document.createTextNode(encodeHTML(stripScripts(message)))\r\n } else {\r\n $text = document.createDocumentFragment()\r\n $text.innerHTML = message\r\n }\r\n $message = createElement(\r\n 'p',\r\n {\r\n className: 'outline-message__content'\r\n },\r\n [$text]\r\n )\r\n children.push($message)\r\n\r\n if (closable) {\r\n $close = icon('close', {\r\n iconSet: 'outline',\r\n size: 18\r\n })\r\n addClass($close, 'outline-message__close')\r\n children.push($close)\r\n }\r\n\r\n $el = createElement(\r\n 'div',\r\n {\r\n className: className.join(' ')\r\n },\r\n children\r\n )\r\n $el.style.cssText = `top:-50px;`\r\n this.$el = $el\r\n document.body.appendChild(this.$el)\r\n\r\n this.$emit('mounted')\r\n\r\n return this\r\n }\r\n\r\n _refreshIcon() {\r\n const HIDDEN = '.outline-message_hidden'\r\n const $el = this.$el\r\n let iconSize = 20\r\n let type\r\n let effect\r\n let round\r\n let iconName\r\n let $icon\r\n let $svg\r\n let $use\r\n\r\n if (this.isDestroyed()) {\r\n return this\r\n }\r\n\r\n $icon = $el.querySelector('.outline-icon')\r\n\r\n if (!$icon) {\r\n return this\r\n }\r\n\r\n type = this.attr('type')\r\n effect = this.attr('effect')\r\n round = this.attr('round')\r\n\r\n if (effect === 'plain') {\r\n addClass($icon, HIDDEN)\r\n } else {\r\n removeClass($icon, HIDDEN)\r\n\r\n if (round && effect === 'default') {\r\n iconSize = 12\r\n }\r\n }\r\n\r\n $svg = $icon.querySelector('.outline-icon__svg')\r\n setAttributes($svg, {\r\n style: `width:${iconSize}px;height:${iconSize}px;`\r\n })\r\n\r\n $use = $svg.querySelector('use')\r\n iconName = effect === 'light' ? `circle-${type}` : type\r\n setAttribute($use, 'xlink:href', `#outline-icon-${iconName}`)\r\n\r\n return this\r\n }\r\n\r\n _refreshMessage() {\r\n const $el = this.$el\r\n let $message\r\n let dangerouslyUseHTMLString\r\n let message\r\n let text\r\n\r\n if (this.isDestroyed()) {\r\n return this\r\n }\r\n\r\n $message = $el.querySelector('.outline-message__content')\r\n dangerouslyUseHTMLString = this.attr('dangerouslyUseHTMLString')\r\n message = this.attr('message')\r\n\r\n if (!dangerouslyUseHTMLString) {\r\n text = encodeHTML(stripScripts(message))\r\n } else {\r\n text = message\r\n }\r\n\r\n $message.innerHTML = text\r\n\r\n return this\r\n }\r\n\r\n _refreshClose() {\r\n const HIDDEN = '.outline-message_hidden'\r\n const $el = this.$el\r\n let $close\r\n let closable\r\n\r\n if (this.isDestroyed()) {\r\n return this\r\n }\r\n\r\n $close = $el.querySelector('.outline-message__close')\r\n closable = this.attr('closable')\r\n\r\n if ($close) {\r\n if (closable) {\r\n addClass($close, HIDDEN)\r\n } else {\r\n removeClass($close, HIDDEN)\r\n }\r\n }\r\n\r\n return this\r\n }\r\n\r\n _refreshEl() {\r\n const $el = this.$el\r\n let className\r\n\r\n if (this.isDestroyed()) {\r\n return this\r\n }\r\n\r\n className = this._getClassName()\r\n setAttribute($el, 'className', className.join(' '))\r\n\r\n return this\r\n }\r\n\r\n refresh(options) {\r\n if (!isPlainObject(options)) {\r\n return this\r\n }\r\n\r\n this.attr(options)\r\n ._refreshIcon()\r\n ._refreshMessage()\r\n ._refreshClose()\r\n ._refreshEl()\r\n\r\n return this\r\n }\r\n\r\n clearTimer() {\r\n if (this.isDestroyed()) {\r\n return this\r\n }\r\n\r\n if (this.timer) {\r\n clearTimeout(this.timer)\r\n this.timer = null\r\n }\r\n\r\n return this\r\n }\r\n\r\n startTimer(duration) {\r\n if (this.isDestroyed()) {\r\n return this\r\n }\r\n\r\n this.timer = later(() => {\r\n this.$emit('opened')\r\n this.close()\r\n }, duration * 1000)\r\n\r\n return this\r\n }\r\n\r\n open(options) {\r\n const $el = this.$el\r\n let offset\r\n let duration\r\n let top\r\n let cssRules\r\n\r\n if (this.isDestroyed()) {\r\n return this\r\n }\r\n\r\n if (this.isClosed()) {\r\n this.refresh(options)\r\n }\r\n\r\n offset = this.attr('offset')\r\n duration = this.attr('duration')\r\n top = offset && offset >= this.offset ? offset : this.offset\r\n cssRules = `top:${top}px;`\r\n\r\n this.clearTimer()\r\n\r\n this.$emit('beforeOpen')\r\n\r\n later(() => {\r\n this.visible = true\r\n\r\n addClass($el, 'outline-message_visible')\r\n $el.style.cssText = cssRules\r\n\r\n if (duration > 0) {\r\n this.startTimer(duration)\r\n }\r\n }, 100)\r\n\r\n return this\r\n }\r\n\r\n close() {\r\n const $el = this.$el\r\n const cssRules = `top:-50px;`\r\n let destroyAfterClosed\r\n let beforeClose\r\n\r\n if (this.isDestroyed()) {\r\n return this\r\n }\r\n\r\n destroyAfterClosed = this.attr('destroyAfterClosed')\r\n beforeClose = this.attr('beforeClose')\r\n\r\n if (isFunction(beforeClose)) {\r\n beforeClose.call(this)\r\n }\r\n\r\n $el.style.cssText = cssRules\r\n removeClass($el, 'outline-message_visible')\r\n\r\n this.visible = false\r\n this.closed = true\r\n\r\n later(() => {\r\n this.$emit('closed')\r\n\r\n if (destroyAfterClosed) {\r\n this.destroy()\r\n }\r\n }, 500)\r\n\r\n return this\r\n }\r\n\r\n destroy() {\r\n this.$emit('beforeDestroy')\r\n\r\n if (this.isDestroyed()) {\r\n return this\r\n }\r\n\r\n this.removeListeners()\r\n\r\n document.body.removeChild(this.$el)\r\n\r\n clearTimeout(this.timer)\r\n this._default()\r\n\r\n this.$emit('afterDestroy')\r\n\r\n return this\r\n }\r\n\r\n onMouseEnter() {\r\n this.clearTimer()\r\n return this\r\n }\r\n\r\n onMouseLeave() {\r\n const duration = this.attr('duration')\r\n const delay = this.attr('delay')\r\n\r\n if (duration <= 0) {\r\n return this\r\n }\r\n\r\n this.startTimer(delay)\r\n\r\n return this\r\n }\r\n\r\n onClose() {\r\n this.clearTimer()\r\n this.close()\r\n return this\r\n }\r\n\r\n addListeners() {\r\n const $el = this.$el\r\n\r\n on(\r\n $el,\r\n '.outline-message__content',\r\n 'mouseenter',\r\n this.onMouseEnter,\r\n this,\r\n true\r\n )\r\n on(\r\n $el,\r\n '.outline-message__content',\r\n 'mouseleave',\r\n this.onMouseLeave,\r\n this,\r\n true\r\n )\r\n on($el, '.outline-message__close', 'click', this.onClose, this, true)\r\n\r\n return this\r\n }\r\n\r\n removeListeners() {\r\n const $el = this.$el\r\n\r\n off($el, 'mouseenter', this.onMouseEnter)\r\n off($el, 'mouseleave', this.onMouseLeave)\r\n off($el, 'click', this.onClose)\r\n\r\n return this\r\n }\r\n}\r\n\r\nMessage.DEFAULTS = (() => {\r\n const OPTIONS = {\r\n id: '',\r\n type: 'info',\r\n effect: 'default',\r\n round: false,\r\n offset: 30,\r\n duration: 3,\r\n delay: 2,\r\n message: '',\r\n customClass: '',\r\n closable: true,\r\n visible: true,\r\n dangerouslyUseHTMLString: false,\r\n destroyAfterClosed: true,\r\n beforeClose: null\r\n }\r\n\r\n return cloneDeep(OPTIONS)\r\n})()\r\n\r\nTYPES.forEach((type) => {\r\n Message[type] = (options) => {\r\n const config = {}\r\n const id = guid(`outline-message-`)\r\n const beforeClose = options.beforeClose || null\r\n let offset = options.offset || 30\r\n\r\n if (isString(options)) {\r\n config.message = options\r\n } else {\r\n if (isPlainObject(options)) {\r\n extend(config, options)\r\n }\r\n }\r\n config.id = id\r\n config.type = type\r\n config.offset = offset\r\n config.visible = false\r\n config.beforeClose = () => {\r\n Message.close(id, beforeClose)\r\n }\r\n\r\n instance = new Message(config)\r\n instances.forEach((item) => {\r\n offset += item.$el.offsetHeight + 16\r\n })\r\n instance.offset = offset\r\n instance.open()\r\n instances.push(instance)\r\n\r\n return instance\r\n }\r\n})\r\n\r\n// 关闭指定 id 消息的静态方法\r\nMessage.close = (id, beforeClose) => {\r\n const len = instances.length\r\n let index = -1\r\n let i\r\n let offsetHeight\r\n\r\n instances.forEach((instance, i) => {\r\n // 在 instances 中通过 id 找到要关闭的消息\r\n if (id === instance.id) {\r\n offsetHeight = instance.$el.offsetHeight\r\n index = i\r\n\r\n // 关闭消息\r\n if (isFunction(beforeClose)) {\r\n beforeClose.call(instance)\r\n }\r\n\r\n instances.splice(i, 1)\r\n }\r\n })\r\n\r\n if (len <= 1 || index === -1 || index > instances.length - 1) {\r\n return false\r\n }\r\n\r\n i = index\r\n\r\n // 界面中的消息逐个向上收起\r\n for (; i < len - 1; i += 1) {\r\n const dom = instances[i].$el\r\n\r\n dom.style['top'] = parseInt(dom.style['top'], 10) - offsetHeight - 16 + 'px'\r\n }\r\n}\r\n\r\n// 关闭所有消息的静态方法\r\nMessage.clear = () => {\r\n let i = instances.length - 1\r\n for (; i >= 0; i -= 1) {\r\n instances[i].close()\r\n }\r\n}\r\n\r\nexport default Message\r\n","import isFunction from './utils/types/isFunction'\r\n\r\nclass Command {\r\n constructor(name, action) {\r\n this.name = name\r\n\r\n if (isFunction(action)) {\r\n this.action = action\r\n }\r\n }\r\n\r\n execute() {\r\n this.action()\r\n\r\n return this\r\n }\r\n}\r\n\r\nexport default Command\r\n","import isFunction from './utils/types/isFunction'\r\n\r\nclass Commands {\r\n constructor() {\r\n this.commands = []\r\n }\r\n\r\n get(name) {\r\n return this.commands.find((cmd) => cmd.name === name)\r\n }\r\n\r\n add(command) {\r\n this.commands.push(command)\r\n\r\n return this\r\n }\r\n\r\n del(name) {\r\n const commands = this.commands\r\n const command = commands.find((cmd) => cmd.name === name)\r\n const index = command ? commands.indexOf(command) : -1\r\n\r\n if (index > -1) {\r\n commands.splice(index, 1)\r\n }\r\n\r\n return this\r\n }\r\n\r\n clear() {\r\n this.commands = []\r\n\r\n return this\r\n }\r\n\r\n execute(name) {\r\n const command = this.commands.find((cmd) => cmd.name === name)\r\n\r\n if (isFunction(command?.execute)) {\r\n command.execute()\r\n }\r\n\r\n return this\r\n }\r\n}\r\n\r\nexport default Commands\r\n","import icon from '../../utils/icons/icon'\r\nimport createElement from '../../utils/dom/createElement'\r\nimport addClass from '../../utils/dom/addClass'\r\n\r\nconst _createButton = (button, rounded = true) => {\r\n const $icon = icon(button.icon, {\r\n iconSet: button.iconSet || 'outline',\r\n color: button.color || '',\r\n size: button.size\r\n })\r\n const $anchor = createElement(\r\n 'a',\r\n {\r\n className: `outline-toolbar__anchor`,\r\n href: button.link\r\n },\r\n $icon\r\n )\r\n const $button = createElement(\r\n 'div',\r\n {\r\n className: `outline-toolbar__button ${button.name}`,\r\n 'data-cmd': button.name\r\n },\r\n [button.link ? $anchor : $icon]\r\n )\r\n\r\n addClass($icon, 'outline-toolbar__icon')\r\n\r\n if (rounded) {\r\n addClass($button, 'outline-toolbar_rounded')\r\n }\r\n\r\n if (button.disabled) {\r\n addClass($button, 'outline-toolbar_disabled')\r\n }\r\n\r\n return $button\r\n}\r\n\r\nexport default _createButton\r\n","import isString from '@/utils/types/isString'\r\nimport isFunction from '@/utils/types/isFunction'\r\nimport isObject from '@/utils/types/isObject'\r\nimport isArray from '@/utils/types/isArray'\r\n\r\nimport later from '@/utils/lang/later'\r\nimport guid from '@/utils/lang/guid'\r\nimport cloneDeep from '@/utils/lang/cloneDeep'\r\n\r\nimport createElement from '@/utils/dom/createElement'\r\nimport addClass from '@/utils/dom/addClass'\r\nimport hasClass from '@/utils/dom/hasClass'\r\nimport removeClass from '@/utils/dom/removeClass'\r\n\r\nimport on from '@/utils/event/on'\r\nimport off from '@/utils/event/off'\r\n\r\nimport paint from '@/utils/icons/paint'\r\n\r\nimport Command from '@/command'\r\nimport Commands from '@/commands'\r\nimport Component from '@/component'\r\n\r\nimport _createButton from './utils/_createButton'\r\n\r\nimport './toolbar.less'\r\n\r\nconst DISABLED = 'outline-toolbar_disabled'\r\nconst HIDDEN = 'outline-toolbar_hidden'\r\nconst ACTIVE = 'outline-toolbar_active'\r\n\r\nclass Toolbar extends Component {\r\n constructor(options) {\r\n super()\r\n\r\n this._default()\r\n\r\n if (options) {\r\n this.initialize(options)\r\n }\r\n }\r\n\r\n _default() {\r\n this.attrs = cloneDeep(Toolbar.DEFAULTS)\r\n\r\n this.disabled = false\r\n this.closed = false\r\n\r\n this.$el = null\r\n this.buttons = []\r\n this.commands = null\r\n\r\n return this\r\n }\r\n\r\n initialize(options) {\r\n let created\r\n\r\n this.attr(options)\r\n\r\n this.disabled = this.attr('disabled')\r\n this.closed = this.attr('closed')\r\n this.commands = new Commands()\r\n\r\n created = this.attr('created')\r\n\r\n if (isFunction(created)) {\r\n created.call(this)\r\n }\r\n\r\n this.render().addListeners()\r\n\r\n return this\r\n }\r\n\r\n isHighlight(name) {\r\n const button = this.get(name)\r\n\r\n if (!button) {\r\n return false\r\n }\r\n\r\n return hasClass(button.$el, ACTIVE)\r\n }\r\n\r\n isDisabled(name) {\r\n let button\r\n\r\n if (name) {\r\n button = this.get(name)\r\n\r\n return button.disabled\r\n }\r\n\r\n return this.disabled\r\n }\r\n\r\n isExist(name) {\r\n const button = this.get(name)\r\n return !!button\r\n }\r\n\r\n isClosed() {\r\n return this.closed\r\n }\r\n\r\n _getCommand(button) {\r\n const _self = this\r\n const { action, name } = button\r\n let command = null\r\n let handler = null\r\n let context\r\n let listener\r\n\r\n if (!action) {\r\n return command\r\n }\r\n\r\n handler = action.handler\r\n context = action.context || this\r\n\r\n if (isFunction(handler)) {\r\n listener = handler\r\n } else if (isString(handler)) {\r\n listener = function () {\r\n _self.$emit(handler, name)\r\n }\r\n }\r\n\r\n if (isFunction(listener)) {\r\n command = new Command(name, listener.bind(context))\r\n }\r\n\r\n return command\r\n }\r\n\r\n get(name) {\r\n return this.buttons.find((button) => button.name === name)\r\n }\r\n\r\n render() {\r\n const mounted = this.attr('mounted')\r\n const buttons = this.attr('buttons') || []\r\n const placement = this.attr('placement')\r\n\r\n paint()\r\n\r\n this.$el = createElement('div', {\r\n id: guid('outline-toolbar'),\r\n className: `outline-toolbar outline-toolbar_${placement}`\r\n })\r\n this._paint(buttons)\r\n document.body.appendChild(this.$el)\r\n\r\n if (this.closed) {\r\n this.hide()\r\n }\r\n\r\n if (this.disabled) {\r\n this.disable()\r\n }\r\n\r\n if (isFunction(mounted)) {\r\n mounted.call(this)\r\n }\r\n\r\n return this\r\n }\r\n\r\n erase() {\r\n this.$el.innerHTML = ''\r\n return this\r\n }\r\n\r\n _paint(buttons) {\r\n const rounded = this.attr('rounded')\r\n const $fragment = document.createDocumentFragment()\r\n\r\n buttons.forEach((button) => {\r\n const $button = _createButton(button, rounded)\r\n const command = this._getCommand(button)\r\n const { name, disabled, context } = button\r\n\r\n $fragment.appendChild($button)\r\n\r\n if (!this.isExist(name)) {\r\n this.buttons.push({\r\n $el: $button,\r\n name,\r\n disabled: disabled || false,\r\n context: context || this\r\n })\r\n\r\n if (command) {\r\n this.commands.add(command)\r\n }\r\n }\r\n })\r\n\r\n this.$el.appendChild($fragment)\r\n\r\n return this\r\n }\r\n\r\n _remove() {\r\n document.body.removeChild(this.$el)\r\n return this\r\n }\r\n\r\n refresh(buttons) {\r\n this.attr({ buttons })\r\n this.erase()._paint(buttons)\r\n return this\r\n }\r\n\r\n add(button) {\r\n const $el = this.$el\r\n const $fragment = document.createDocumentFragment()\r\n const buttons = this.attr('buttons') || []\r\n const { name, disabled, context } = button\r\n const command = this._getCommand(button)\r\n const _add = (button) => {\r\n const $button = _createButton(button)\r\n\r\n $fragment.appendChild($button)\r\n\r\n buttons.push(button)\r\n this.buttons.push({\r\n $el: $button,\r\n name,\r\n disabled: disabled || false,\r\n context: context || this,\r\n command\r\n })\r\n\r\n if (command) {\r\n this.commands.add(command)\r\n }\r\n }\r\n\r\n if (isObject(button)) {\r\n _add(button)\r\n } else if (isArray(button)) {\r\n button.forEach((item) => {\r\n if (isObject(item)) {\r\n _add(item)\r\n }\r\n })\r\n }\r\n $el.appendChild($fragment)\r\n\r\n return this\r\n }\r\n\r\n remove(name) {\r\n const $el = this.$el\r\n const buttons = this.buttons\r\n const button = this.get(name)\r\n let index = -1\r\n\r\n if (!button) {\r\n return this\r\n }\r\n\r\n index = buttons.indexOf(button)\r\n\r\n if (index > -1) {\r\n buttons.splice(index, 1)\r\n this.attr('buttons').splice(index, 1)\r\n }\r\n\r\n this._disable(name)\r\n $el.removeChild(button.$el)\r\n\r\n return this\r\n }\r\n\r\n _disable(name) {\r\n const button = this.get(name)\r\n const command = this.commands.get(name)\r\n\r\n if (!button || button.disabled) {\r\n return this\r\n }\r\n\r\n button.disabled = true\r\n\r\n if (command) {\r\n this.commands.del(command)\r\n }\r\n\r\n addClass(button.$el, DISABLED)\r\n\r\n return this\r\n }\r\n\r\n _enable(name) {\r\n const button = this.get(name)\r\n const command = this.commands.get(name)\r\n\r\n if (!button || !button.disabled) {\r\n return this\r\n }\r\n\r\n button.disabled = false\r\n\r\n if (command) {\r\n this.commands.add(command)\r\n }\r\n\r\n removeClass(button.$el, DISABLED)\r\n\r\n return this\r\n }\r\n\r\n disable(name) {\r\n const disabled = this.attr('afterDisabled')\r\n\r\n if (name) {\r\n this._disable(name)\r\n } else {\r\n addClass(this.$el, DISABLED)\r\n this.removeListeners()\r\n this.disabled = true\r\n\r\n if (isFunction(disabled)) {\r\n disabled.call(this)\r\n }\r\n }\r\n\r\n return this\r\n }\r\n\r\n enable(name) {\r\n const enabled = this.attr('afterEnabled')\r\n\r\n if (name) {\r\n this._enable(name)\r\n } else {\r\n this.disabled = false\r\n removeClass(this.$el, DISABLED)\r\n this.addListeners()\r\n\r\n if (isFunction(enabled)) {\r\n enabled.call(this)\r\n }\r\n }\r\n\r\n return this\r\n }\r\n\r\n show(name) {\r\n const opened = this.attr('afterOpened')\r\n const button = this.get(name)\r\n const $el = this.$el\r\n\r\n if (name) {\r\n if (!button) {\r\n return this\r\n }\r\n\r\n removeClass(button.$el, HIDDEN)\r\n } else {\r\n removeClass($el, HIDDEN)\r\n this.closed = false\r\n\r\n if (isFunction(opened)) {\r\n later(() => {\r\n opened.call(this)\r\n }, 310)\r\n }\r\n }\r\n\r\n return this\r\n }\r\n\r\n hide(name) {\r\n const closed = this.attr('afterClosed')\r\n const button = this.get(name)\r\n const $el = this.$el\r\n\r\n if (name) {\r\n if (!button) {\r\n return this\r\n }\r\n\r\n addClass(button.$el, HIDDEN)\r\n } else {\r\n addClass($el, HIDDEN)\r\n this.closed = true\r\n\r\n if (isFunction(closed)) {\r\n later(() => {\r\n closed.call(this)\r\n }, 310)\r\n }\r\n }\r\n\r\n return this\r\n }\r\n\r\n toggle(name) {\r\n if (this.isClosed()) {\r\n this.show(name)\r\n } else {\r\n this.hide(name)\r\n }\r\n\r\n return this\r\n }\r\n\r\n highlight(name) {\r\n const button = this.get(name)\r\n let $button\r\n\r\n if (!button) {\r\n return this\r\n }\r\n\r\n $button = button.$el\r\n\r\n if (hasClass($button, ACTIVE)) {\r\n removeClass($button, ACTIVE)\r\n } else {\r\n addClass($button, ACTIVE)\r\n }\r\n\r\n return this\r\n }\r\n\r\n destroy() {\r\n const beforeDestroy = this.attr('beforeDestroy')\r\n const afterDestroy = this.attr('afterDestroy')\r\n\r\n if (isFunction(beforeDestroy)) {\r\n beforeDestroy.call(this)\r\n }\r\n\r\n this.commands.clear()\r\n this.removeListeners()._remove()._default()\r\n\r\n if (isFunction(afterDestroy)) {\r\n afterDestroy.call(this)\r\n }\r\n\r\n return this\r\n }\r\n\r\n execute(name) {\r\n if (this.isDisabled(name)) {\r\n return this\r\n }\r\n\r\n this.commands.execute(name)\r\n\r\n return this\r\n }\r\n\r\n onExecute(evt) {\r\n const $button = evt.delegateTarget\r\n let cmd = ''\r\n\r\n if ($button) {\r\n cmd = $button.getAttribute('data-cmd')\r\n\r\n if (cmd) {\r\n this.execute(cmd)\r\n }\r\n }\r\n\r\n return this\r\n }\r\n\r\n _updateToolbar({ top, min, max }) {\r\n const current = Math.ceil(top)\r\n\r\n if (current <= min) {\r\n this.hide('up')\r\n this.show('down')\r\n } else if (current >= max) {\r\n this.hide('down')\r\n this.show('up')\r\n } else if (current > min && current < max) {\r\n this.show('up')\r\n this.show('down')\r\n }\r\n\r\n return this\r\n }\r\n\r\n onToolbarUpdate({ top, min, max }) {\r\n this._updateToolbar({ top, min, max })\r\n return this\r\n }\r\n\r\n onAddButton(buttons) {\r\n this.attr({\r\n buttons\r\n })\r\n this.refresh(buttons)\r\n\r\n return this\r\n }\r\n\r\n onRemoveButton(name) {\r\n this.remove(name)\r\n return this\r\n }\r\n\r\n addListeners() {\r\n const buttons = this.attr('buttons') || []\r\n const $el = this.$el\r\n\r\n if (!buttons || buttons.length < 1) {\r\n return this\r\n }\r\n\r\n on($el, `.outline-toolbar__button`, 'click', this.onExecute, this, true)\r\n\r\n this.$on('toolbar:update', this.onToolbarUpdate)\r\n this.$on('toolbar:add:button', this.onAddButton)\r\n this.$on('toolbar:remove:button', this.onRemoveButton)\r\n this.$on('toolbar:toggle', this.toggle)\r\n\r\n return this\r\n }\r\n\r\n removeListeners() {\r\n const buttons = this.attr('buttons') || []\r\n const $el = this.$el\r\n\r\n if (!buttons || buttons.length < 1) {\r\n return this\r\n }\r\n\r\n off($el, '.outline-toolbar__button', this.onExecute)\r\n\r\n this.$off('toolbar:update')\r\n this.$off('toolbar:add:button')\r\n this.$off('toolbar:remove:button')\r\n this.$off('toolbar:toggle')\r\n\r\n return this\r\n }\r\n}\r\n\r\nToolbar.DEFAULTS = (() => {\r\n const OPTIONS = {\r\n placement: 'ltr',\r\n closed: false,\r\n disabled: false,\r\n rounded: true,\r\n buttons: [],\r\n created: null,\r\n mounted: null,\r\n afterClosed: null,\r\n afterOpened: null,\r\n afterDisabled: null,\r\n afterEnabled: null,\r\n beforeDestroy: null,\r\n afterDestroy: null\r\n }\r\n\r\n return cloneDeep(OPTIONS)\r\n})()\r\n\r\nexport default Toolbar\r\n","import publish from './utils/observer/emit'\r\n\r\nclass Speech {\r\n constructor(options) {\r\n this.utterance = new SpeechSynthesisUtterance()\r\n\r\n if (options) {\r\n this.initialize(options)\r\n }\r\n }\r\n\r\n _initialize(options) {\r\n if (options.lang) {\r\n this.setLang(options.lang)\r\n }\r\n\r\n if (options.pitch) {\r\n this.setPitch(options.pitch)\r\n }\r\n\r\n if (options.rate) {\r\n this.setRate(options.rate)\r\n }\r\n\r\n if (options.text) {\r\n this.setText(options.text)\r\n }\r\n\r\n if (options.voice) {\r\n this.setVoice(options.voice)\r\n }\r\n\r\n if (options.volume) {\r\n this.setVolume(options.volume)\r\n }\r\n\r\n return this\r\n }\r\n\r\n initialize(options) {\r\n this._initialize(options)._addListeners()\r\n return this\r\n }\r\n\r\n isSpeaking() {\r\n return speechSynthesis.speaking\r\n }\r\n\r\n isPending() {\r\n return speechSynthesis.pending\r\n }\r\n\r\n isPaused() {\r\n return speechSynthesis.paused\r\n }\r\n\r\n getVoices() {\r\n return speechSynthesis.getVoices()\r\n }\r\n\r\n setLang(lang) {\r\n this.utterance.lang = lang\r\n return this\r\n }\r\n\r\n setPitch(pitch) {\r\n this.utterance.pitch = pitch\r\n return this\r\n }\r\n\r\n setRate(rate) {\r\n this.utterance.rate = rate\r\n return this\r\n }\r\n\r\n setText(text) {\r\n this.utterance.text = text\r\n return this\r\n }\r\n\r\n setVoice(voice) {\r\n this.utterance.voice = voice\r\n return this\r\n }\r\n\r\n setVolume(volume) {\r\n this.utterance.volume = volume\r\n return this\r\n }\r\n\r\n speak(text) {\r\n if (text) {\r\n this.setText(text)\r\n }\r\n\r\n speechSynthesis.speak(this.utterance)\r\n\r\n return this\r\n }\r\n\r\n pause() {\r\n speechSynthesis.pause()\r\n return this\r\n }\r\n\r\n resume() {\r\n speechSynthesis.resume()\r\n return this\r\n }\r\n\r\n cancel() {\r\n speechSynthesis.cancel()\r\n this.setText('')\r\n return this\r\n }\r\n\r\n _addListeners() {\r\n const UTTERANCE_EVENTS = [\r\n 'boundary',\r\n 'end',\r\n 'error',\r\n 'start',\r\n 'mark',\r\n 'pause',\r\n 'resume'\r\n ]\r\n const utterance = this.utterance\r\n const speech = this\r\n\r\n UTTERANCE_EVENTS.forEach((name) => {\r\n utterance[`on${name}`] = (event) => {\r\n publish(name, {\r\n event,\r\n speech\r\n })\r\n }\r\n })\r\n\r\n speechSynthesis.onvoiceschanged = (event) => {\r\n publish('voiceschanged', {\r\n event,\r\n speech\r\n })\r\n }\r\n\r\n return this\r\n }\r\n}\r\n\r\nSpeech.isSupport = (() => {\r\n return 'speechSynthesis' in window\r\n})()\r\n\r\nexport default Speech\r\n","import addClass from '../../utils/dom/addClass'\r\n\r\nconst _updateSiblingElements = (siblingElement, isPrev) => {\r\n let tagName\r\n let $sibling = siblingElement\r\n\r\n while ($sibling) {\r\n tagName = $sibling.tagName.toLowerCase()\r\n\r\n if (tagName !== 'script' && tagName !== 'style') {\r\n addClass($sibling, 'outline-reader_sibling')\r\n }\r\n\r\n if (isPrev) {\r\n $sibling = $sibling.previousElementSibling\r\n } else {\r\n $sibling = $sibling.nextElementSibling\r\n }\r\n }\r\n}\r\n\r\nexport default _updateSiblingElements\r\n","import cloneDeep from '@/utils/lang/cloneDeep'\r\nimport later from '@/utils/lang/later'\r\nimport isString from '@/utils/types/isString'\r\nimport isElement from '@/utils/types/isElement'\r\nimport isFunction from '@/utils/types/isFunction'\r\nimport createElement from '@/utils/dom/createElement'\r\nimport addClass from '@/utils/dom/addClass'\r\nimport removeClass from '@/utils/dom/removeClass'\r\nimport isMobile from '@/utils/dom/isMobile'\r\n\r\nimport at from '@/utils/event/at'\r\nimport stop from '@/utils/event/stop'\r\nimport off from '@/utils/event/off'\r\n\r\nimport Message from '@/message/message'\r\nimport Toolbar from '@/toolbar/toolbar'\r\n\r\nimport Speech from '@/speech'\r\nimport Component from '@/component'\r\n\r\nimport _updateSiblingElements from './utils/_updateSiblingElements'\r\n\r\nimport './reader.less'\r\n\r\nconst ENTER_READING_TIP = '进入阅读模式,按 ESC 键可退出阅读模式'\r\n\r\nclass Reader extends Component {\r\n constructor(options) {\r\n super()\r\n\r\n this._default()\r\n\r\n if (options) {\r\n this.initialize(options)\r\n }\r\n }\r\n\r\n _default() {\r\n this.attrs = cloneDeep(Reader.DEFAULTS)\r\n this.reading = false\r\n\r\n this.$target = null\r\n this.$el = null\r\n this.$paper = null\r\n this.$title = null\r\n this.$article = null\r\n this.$progress = null\r\n\r\n this.toolbar = null\r\n this.speech = null\r\n\r\n return this\r\n }\r\n\r\n initialize(options) {\r\n let target\r\n\r\n this.attr(options)\r\n\r\n target = this.attr('target')\r\n\r\n if (isString(target)) {\r\n this.$target = document.querySelector(target)\r\n } else if (isElement(target)) {\r\n this.$target = target\r\n }\r\n\r\n if (!this.$target) {\r\n return this\r\n }\r\n\r\n if (Speech.isSupport) {\r\n this.speech = new Speech()\r\n }\r\n\r\n this.render().addListeners()\r\n\r\n return this\r\n }\r\n\r\n isSpeaking() {\r\n return this?.speech?.isSpeaking()\r\n }\r\n\r\n render() {\r\n this._renderEdge()._paint(this.$target)\r\n return this\r\n }\r\n\r\n erase() {\r\n this.$article.innerHTML = ''\r\n return this\r\n }\r\n\r\n _paint($content) {\r\n const $fragment = document.createDocumentFragment()\r\n const $children = [...$content.cloneNode(true).children]\r\n\r\n later(() => {\r\n $children.forEach(($child) => {\r\n $fragment.appendChild($child)\r\n })\r\n\r\n this.$article.appendChild($fragment)\r\n })\r\n\r\n return this\r\n }\r\n\r\n _remove() {\r\n const $el = this.$el\r\n const toolbar = this.toolbar\r\n\r\n if ($el) {\r\n document.body.removeChild($el)\r\n }\r\n\r\n if (toolbar) {\r\n toolbar.destroy()\r\n }\r\n\r\n return this\r\n }\r\n\r\n refresh() {\r\n this.erase()._paint(this.$target)\r\n return this\r\n }\r\n\r\n _animateTimeline() {\r\n // eslint-disable-next-line\r\n if (!window.ScrollTimeline || !isMobile()) {\r\n return this\r\n }\r\n\r\n this.$progress.animate(\r\n {\r\n // from\r\n scale: ['0 1', '1 1']\r\n },\r\n {\r\n // eslint-disable-next-line\r\n timeline: new ScrollTimeline({\r\n source: this.$article,\r\n axis: 'block'\r\n })\r\n }\r\n )\r\n\r\n return this\r\n }\r\n\r\n _renderEdge() {\r\n const $target = this.$target\r\n const mobile = isMobile()\r\n const size = mobile ? 26 : 20\r\n let title = this.attr('title')\r\n let $el\r\n let $paper\r\n let $title\r\n let $article\r\n let $progress\r\n let $sibling\r\n\r\n $progress = createElement('div', {\r\n className: 'outline-reader__progress'\r\n })\r\n this.$progress = $progress\r\n\r\n $title = $target.querySelector('h1')\r\n\r\n if (isElement(title)) {\r\n $title = title\r\n }\r\n\r\n if (isElement($title)) {\r\n title = $title.innerText\r\n }\r\n\r\n $title = createElement(\r\n 'h1',\r\n {\r\n className: 'outline-reader__title'\r\n },\r\n title\r\n )\r\n this.$title = $title\r\n\r\n $article = createElement(\r\n 'article',\r\n {\r\n id: 'outline-reader__article',\r\n className: 'outline-reader__article'\r\n },\r\n isMobile() ? [] : [$progress.cloneNode()]\r\n )\r\n this.$article = $article\r\n\r\n $paper = createElement(\r\n 'div',\r\n {\r\n id: 'outline-reader__paper',\r\n className: 'outline-reader__paper'\r\n },\r\n [$title, $article]\r\n )\r\n this.$paper = $paper\r\n\r\n const buttons = []\r\n\r\n buttons.push({\r\n name: 'print',\r\n icon: 'print',\r\n size,\r\n action: {\r\n context: this,\r\n handler: this.print\r\n }\r\n })\r\n\r\n if (Speech.isSupport && this.attr('allowSpeak')) {\r\n buttons.push({\r\n name: 'speak',\r\n icon: 'sound',\r\n size,\r\n action: {\r\n context: this,\r\n handler: this.speak\r\n }\r\n })\r\n }\r\n\r\n buttons.push({\r\n name: 'exit',\r\n icon: 'close',\r\n size,\r\n action: {\r\n context: this,\r\n handler: this.exit\r\n }\r\n })\r\n\r\n this.toolbar = new Toolbar({\r\n placement: 'rtl',\r\n buttons\r\n })\r\n\r\n $el = createElement(\r\n 'section',\r\n {\r\n id: 'outline-reader',\r\n className: 'outline-reader outline-reader_hidden'\r\n },\r\n [$progress, $paper, this.toolbar.$el]\r\n )\r\n this.$el = $el\r\n\r\n document.body.appendChild($el)\r\n\r\n this._animateTimeline()\r\n\r\n later(() => {\r\n // 设置邻居节点的打印样式\r\n $sibling = $el.previousElementSibling\r\n _updateSiblingElements($sibling, true)\r\n\r\n $sibling = $el.nextElementSibling\r\n _updateSiblingElements($sibling)\r\n })\r\n\r\n return this\r\n }\r\n\r\n enter() {\r\n const READER = 'outline-reader'\r\n const READING = `${READER}--reading`\r\n const HIDDEN = `${READER}_hidden`\r\n const $el = this.$el\r\n const $siblings = document.querySelectorAll('.outline-reader_sibling')\r\n const enterReadingTip = this.attr('enterReadingTip') || ENTER_READING_TIP\r\n\r\n if (this.reading || !$el) {\r\n return this\r\n }\r\n\r\n $siblings.forEach(($sibling) => {\r\n addClass($sibling, HIDDEN)\r\n })\r\n addClass($el, READING)\r\n removeClass($el, HIDDEN)\r\n this.toolbar.show()\r\n this.reading = true\r\n\r\n Message.info({\r\n round: true,\r\n message: enterReadingTip\r\n })\r\n\r\n this.$emit('reader:enter')\r\n\r\n return this\r\n }\r\n\r\n exit() {\r\n const SPEAK = 'speak'\r\n const READER = 'outline-reader'\r\n const READING = `${READER}--reading`\r\n const HIDDEN = `${READER}_hidden`\r\n const $el = this.$el\r\n const $siblings = document.querySelectorAll('.outline-reader_sibling')\r\n const speech = this.speech\r\n const toolbar = this.toolbar\r\n\r\n if (!this.reading || !$el) {\r\n return this\r\n }\r\n\r\n addClass($el, HIDDEN)\r\n removeClass($el, READING)\r\n $siblings.forEach(($sibling) => {\r\n removeClass($sibling, HIDDEN)\r\n })\r\n toolbar.hide()\r\n this.reading = false\r\n\r\n if (speech) {\r\n if (toolbar.isHighlight(SPEAK)) {\r\n toolbar.highlight(SPEAK)\r\n }\r\n\r\n speech.cancel()\r\n }\r\n\r\n this.$emit('reader:exit')\r\n\r\n return this\r\n }\r\n\r\n toggle() {\r\n if (this.reading) {\r\n this.exit()\r\n } else {\r\n this.enter()\r\n }\r\n\r\n return this\r\n }\r\n\r\n speak() {\r\n const text = this.$article.innerText\r\n const speech = this.speech\r\n\r\n if (!Speech.isSupport || !speech) {\r\n return this\r\n }\r\n\r\n this.toolbar.highlight('speak')\r\n\r\n if (this.isSpeaking()) {\r\n speech.cancel()\r\n } else {\r\n speech.speak(text)\r\n }\r\n\r\n return this\r\n }\r\n\r\n print() {\r\n if (!isFunction(print)) {\r\n return this\r\n }\r\n\r\n print()\r\n\r\n return this\r\n }\r\n\r\n destroy() {\r\n const $el = this.$el\r\n\r\n if (!$el) {\r\n return this\r\n }\r\n\r\n this.removeListeners()._remove()._default()\r\n\r\n return this\r\n }\r\n\r\n onPrint() {\r\n this.print()\r\n return this\r\n }\r\n\r\n onEnterReading() {\r\n this.toggle()\r\n return this\r\n }\r\n\r\n onExitReading(evt) {\r\n const keyCode = evt.keyCode\r\n\r\n if (keyCode === 27 && this.reading) {\r\n this.toggle()\r\n stop(evt)\r\n }\r\n\r\n return this\r\n }\r\n\r\n onRefresh() {\r\n this.refresh()\r\n\r\n return this\r\n }\r\n\r\n addListeners() {\r\n const $el = this.$el\r\n\r\n if (!$el) {\r\n return this\r\n }\r\n\r\n at(document, 'keyup', this.onExitReading, this, true)\r\n\r\n this.$on('toolbar:action:print', this.onPrint)\r\n this.$on('toolbar:action:reading', this.onEnterReading)\r\n this.$on('reader:print', this.onPrint)\r\n this.$on('reader:refresh', this.onRefresh)\r\n this.$on('reader:enter', this.enter)\r\n this.$on('reader:exit', this.exit)\r\n this.$on('reader:toggle', this.toggle)\r\n\r\n return this\r\n }\r\n\r\n removeListeners() {\r\n const $el = this.$el\r\n\r\n if (!$el) {\r\n return this\r\n }\r\n\r\n off(document, 'keyup', this.onExitReading)\r\n\r\n this.$off('toolbar:action:print')\r\n this.$off('toolbar:action:reading')\r\n this.$off('reader:refresh')\r\n this.$off('reader:toggle')\r\n\r\n return this\r\n }\r\n}\r\n\r\nReader.DEFAULTS = (() => {\r\n const OPTIONS = {\r\n target: '',\r\n title: '',\r\n enterReadingTip: ENTER_READING_TIP,\r\n allowSpeak: false\r\n }\r\n\r\n return cloneDeep(OPTIONS)\r\n})()\r\n\r\nexport default Reader\r\n","import later from './utils/lang/later'\r\nimport cloneDeep from './utils/lang/cloneDeep'\r\n\r\nimport isFunction from './utils/types/isFunction'\r\nimport isString from './utils/types/isString'\r\nimport isElement from './utils/types/isElement'\r\n\r\nimport addClass from './utils/dom/addClass'\r\nimport scrollTo from './utils/dom/scrollTo'\r\nimport getScrollElement from './utils/dom/getScrollElement'\r\n\r\nimport getChapters from './chapters/getChapters'\r\n\r\nimport Component from './component'\r\nimport Anchors from './anchors/anchors'\r\nimport Drawer from './drawer/drawer'\r\nimport Navigator from './navigator/navigator'\r\nimport Reader from './reader/reader'\r\nimport Toolbar from './toolbar/toolbar'\r\n\r\nclass Outline extends Component {\r\n constructor(options) {\r\n super()\r\n\r\n this.version = '3.39.0'\r\n this._default()\r\n\r\n if (options) {\r\n this.initialize(options)\r\n }\r\n }\r\n\r\n _default() {\r\n const options = Outline.DEFAULTS\r\n\r\n this.attrs = cloneDeep(options)\r\n this.$article = null\r\n this.$scrollElement = null\r\n this.buttons = []\r\n\r\n this.anchors = null\r\n this.drawer = null\r\n this.navigator = null\r\n this.reader = null\r\n this.toolbar = null\r\n\r\n return this\r\n }\r\n\r\n initialize(options) {\r\n let articleElement = ''\r\n let scrollElement = ''\r\n let $article = null\r\n\r\n this.attr(options)\r\n\r\n articleElement = this.attr('articleElement')\r\n scrollElement = this.attr('scrollElement')\r\n\r\n if (isString(articleElement)) {\r\n $article = document.querySelector(articleElement)\r\n } else if (isElement(articleElement)) {\r\n $article = articleElement\r\n }\r\n this.$article = $article\r\n this.$scrollElement = getScrollElement(scrollElement)\r\n\r\n this.$emit('created', { ...this.attr() })\r\n this.render().addListeners()\r\n\r\n return this\r\n }\r\n\r\n isExpanded() {\r\n const position = this.attr('position')\r\n const drawer = this.drawer\r\n const navigator = this.navigator\r\n const count = this.count()\r\n\r\n if (count < 0) {\r\n return false\r\n }\r\n\r\n if (position === 'relative') {\r\n return !drawer.isClosed()\r\n } else {\r\n return !navigator.isClosed()\r\n }\r\n }\r\n\r\n getChapters(isTreeStructured = false) {\r\n const articleElement = this.$article\r\n const selector = this.attr('selector')\r\n const showCode = this.attr('showCode')\r\n const chapterTextFilter = this.attr('chapterTextFilter')\r\n\r\n return getChapters({\r\n articleElement,\r\n selector,\r\n showCode,\r\n chapterTextFilter,\r\n isTreeStructured\r\n })\r\n }\r\n\r\n count() {\r\n return this.getChapters().length\r\n }\r\n\r\n render() {\r\n const hasToolbar = this.attr('hasToolbar')\r\n const $scrollElement = this.$scrollElement\r\n\r\n this._renderReader()._renderAnchors()._renderNavigator()._renderToolbar()\r\n\r\n if ($scrollElement && hasToolbar) {\r\n this.$emit('toolbar:update', {\r\n top: $scrollElement.scrollTop,\r\n min: 0,\r\n max: $scrollElement.scrollHeight\r\n })\r\n }\r\n\r\n this.$emit('mounted')\r\n\r\n return this\r\n }\r\n\r\n _renderReader() {\r\n const option = this.attr('reader')\r\n\r\n if (!option.target) {\r\n return this\r\n }\r\n\r\n addClass(this.$article, 'outline-article')\r\n\r\n this.reader = new Reader(option)\r\n\r\n return this\r\n }\r\n\r\n _renderAnchors() {\r\n const articleElement = this.attr('articleElement')\r\n const selector = this.attr('selector')\r\n const stickyHeight = this.attr('stickyHeight')\r\n const scrollElement = this.attr('scrollElement')\r\n const showCode = this.attr('showCode')\r\n const anchorURL = this.attr('anchorURL')\r\n const afterScroll = this.attr('afterScroll')\r\n const chapterTextFilter = this.attr('chapterTextFilter')\r\n const anchorLinkFilter = this.attr('anchorLinkFilter')\r\n\r\n this.anchors = new Anchors({\r\n articleElement,\r\n stickyHeight,\r\n scrollElement,\r\n selector,\r\n showCode,\r\n anchorURL,\r\n afterScroll,\r\n chapterTextFilter,\r\n anchorLinkFilter\r\n })\r\n\r\n return this\r\n }\r\n\r\n _renderNavigator() {\r\n const title = this.attr('title')\r\n const stickyHeight = this.attr('stickyHeight')\r\n const scrollElement = this.attr('scrollElement')\r\n const customClass = this.attr('customClass')\r\n const showCode = this.attr('showCode')\r\n const animationCurrent = this.attr('animationCurrent')\r\n const closeOnClickModal = this.attr('closeOnClickModal')\r\n const showNavModalFirst = this.attr('showNavModalFirst')\r\n const position = this.attr('position')\r\n const placement = this.attr('placement')\r\n const afterSticky = this.attr('afterSticky')\r\n const afterToggle = this.attr('afterToggle')\r\n const afterScroll = this.attr('afterScroll')\r\n const count = this.count()\r\n let parentElement = this.attr('parentElement')\r\n let OPTIONS\r\n\r\n if (count < 1) {\r\n return this\r\n }\r\n\r\n OPTIONS = {\r\n scrollElement,\r\n showCode,\r\n animationCurrent,\r\n position,\r\n title,\r\n stickyHeight,\r\n chapters: this.getChapters(),\r\n afterSticky,\r\n afterToggle,\r\n afterScroll\r\n }\r\n\r\n if (position === 'relative') {\r\n this.drawer = new Drawer({\r\n placement,\r\n title,\r\n size: 'tiny',\r\n hasOffset: true,\r\n hasPadding: false,\r\n closeOnClickModal,\r\n customClass,\r\n afterClosed: () => {\r\n const toolbar = this.toolbar\r\n toolbar.toggle()\r\n }\r\n })\r\n parentElement = this.drawer.$main\r\n\r\n if (showNavModalFirst) {\r\n this.drawer.open()\r\n }\r\n } else {\r\n OPTIONS.customClass = customClass\r\n }\r\n\r\n OPTIONS.parentElement = parentElement\r\n this.navigator = new Navigator(OPTIONS)\r\n\r\n return this\r\n }\r\n\r\n _renderToolbar() {\r\n const position = this.attr('position')\r\n const hasToolbar = this.attr('hasToolbar')\r\n const showNavModalFirst = this.attr('showNavModalFirst')\r\n const placement = this.attr('placement')\r\n const homepage = this.attr('homepage')\r\n const git = this.attr('git')\r\n const tags = this.attr('tags')\r\n const issues = this.attr('issues')\r\n const tools = this.attr('tools')\r\n const option = this.attr('reader')\r\n const count = this.count()\r\n const UP = {\r\n name: 'up',\r\n icon: 'up',\r\n size: 20,\r\n action: {\r\n context: this,\r\n handler: this.toTop\r\n }\r\n }\r\n const HOME = {\r\n name: 'homepage',\r\n icon: 'homepage',\r\n size: 20,\r\n link: homepage\r\n }\r\n const GIT = {\r\n name: 'github',\r\n icon: 'github',\r\n size: 20,\r\n link: git\r\n }\r\n const TAGS = {\r\n name: 'tags',\r\n icon: 'tags',\r\n size: 20,\r\n link: tags\r\n }\r\n const ISSUES = {\r\n name: 'issues',\r\n icon: 'issues',\r\n size: 20,\r\n link: issues\r\n }\r\n const MENU = {\r\n name: 'toggle',\r\n icon: 'menu',\r\n size: 18,\r\n action: {\r\n context: this,\r\n handler: this.toggle\r\n }\r\n }\r\n const READING = {\r\n name: 'reading',\r\n icon: 'file',\r\n size: 18,\r\n action: {\r\n context: this,\r\n handler: 'toolbar:action:reading'\r\n }\r\n }\r\n const PRINT = {\r\n name: 'print',\r\n icon: 'print',\r\n size: 20,\r\n action: {\r\n handler: 'toolbar:action:print'\r\n }\r\n }\r\n const DOWN = {\r\n name: 'down',\r\n icon: 'down',\r\n size: 20,\r\n action: {\r\n context: this,\r\n handler: this.toBottom\r\n }\r\n }\r\n const buttons = []\r\n\r\n if (!hasToolbar) {\r\n return this\r\n }\r\n\r\n buttons.push(UP)\r\n if (count > 0) {\r\n buttons.push(MENU)\r\n }\r\n if (homepage) {\r\n buttons.push(HOME)\r\n }\r\n if (git) {\r\n buttons.push(GIT)\r\n }\r\n if (tags) {\r\n buttons.push(TAGS)\r\n }\r\n if (issues) {\r\n buttons.push(ISSUES)\r\n }\r\n if (option.target) {\r\n buttons.push(READING)\r\n if (isFunction(print)) {\r\n buttons.push(PRINT)\r\n }\r\n }\r\n if (tools?.length > 0) {\r\n buttons.push(...tools)\r\n }\r\n buttons.push(DOWN)\r\n this.buttons = [...buttons]\r\n\r\n this.toolbar = new Toolbar({\r\n placement,\r\n buttons\r\n })\r\n\r\n if (position === 'relative' && showNavModalFirst) {\r\n this.toolbar.hide()\r\n }\r\n\r\n return this\r\n }\r\n\r\n refresh() {\r\n const chapters = this.getChapters()\r\n\r\n this.$emit('anchors:refresh', chapters)\r\n this.$emit('navigator:refresh', chapters)\r\n this.$emit('reader:refresh')\r\n\r\n this.$emit('refresh', chapters)\r\n\r\n return this\r\n }\r\n\r\n addButton(button) {\r\n const buttons = this.buttons\r\n\r\n buttons.splice(-1, 0, button)\r\n this.$emit('toolbar:add:button', buttons)\r\n\r\n return this\r\n }\r\n\r\n removeButton(name) {\r\n this.$emit('toolbar:remove:button', name)\r\n return this\r\n }\r\n\r\n toTop() {\r\n const afterScroll = this.attr('afterScroll')\r\n const toolbar = this.toolbar\r\n const navigator = this.navigator\r\n const count = this.count()\r\n const afterTop = () => {\r\n toolbar.hide('up')\r\n toolbar.show('down')\r\n\r\n if (count > 0) {\r\n navigator.highlight(0)\r\n navigator.playing = false\r\n scrollTo(navigator.$main, 0)\r\n }\r\n\r\n if (isFunction(afterScroll)) {\r\n afterScroll.call(toolbar, 'up')\r\n }\r\n }\r\n\r\n if (count > 0) {\r\n navigator.playing = true\r\n }\r\n this.scrollTo(0, afterTop)\r\n\r\n return this\r\n }\r\n\r\n toBottom() {\r\n const afterScroll = this.attr('afterScroll')\r\n const $scrollElement = this.$scrollElement\r\n const toolbar = this.toolbar\r\n const navigator = this.navigator\r\n const count = this.count()\r\n const top = Math.floor(\r\n $scrollElement.scrollHeight - $scrollElement.clientHeight\r\n )\r\n const afterDown = () => {\r\n const $main = navigator.$main\r\n toolbar.hide('down')\r\n toolbar.show('up')\r\n\r\n if (count > 0) {\r\n navigator.highlight(count - 1)\r\n scrollTo($main, $main.scrollHeight)\r\n navigator.playing = false\r\n }\r\n\r\n if (isFunction(afterScroll)) {\r\n afterScroll.call(toolbar, 'bottom')\r\n }\r\n }\r\n\r\n if (count > 0) {\r\n navigator.playing = true\r\n }\r\n\r\n this.scrollTo(top, afterDown)\r\n\r\n return this\r\n }\r\n\r\n scrollTo(top, afterScroll) {\r\n scrollTo(this.$scrollElement, top, afterScroll)\r\n return this\r\n }\r\n\r\n enterReading() {\r\n this.$emit('toolbar:toggle')\r\n this.$emit('reader:enter')\r\n\r\n return this\r\n }\r\n\r\n exitReading() {\r\n this.$emit('toolbar:toggle')\r\n this.$emit('reader:exit')\r\n\r\n return this\r\n }\r\n\r\n switchReading() {\r\n this.$emit('toolbar:toggle')\r\n this.$emit('reader:toggle')\r\n\r\n return this\r\n }\r\n\r\n expand() {\r\n const position = this.attr('position')\r\n const toolbar = this.toolbar\r\n const drawer = this.drawer\r\n const navigator = this.navigator\r\n const count = this.count()\r\n\r\n if (count < 1) {\r\n return this\r\n }\r\n\r\n if (position !== 'relative') {\r\n navigator.show()\r\n toolbar.highlight('toggle')\r\n } else {\r\n toolbar.hide()\r\n\r\n later(() => {\r\n drawer.open()\r\n })\r\n }\r\n\r\n return this\r\n }\r\n\r\n collapses() {\r\n const position = this.attr('position')\r\n const toolbar = this.toolbar\r\n const drawer = this.drawer\r\n const navigator = this.navigator\r\n const count = this.count()\r\n\r\n if (count < 1) {\r\n return this\r\n }\r\n\r\n if (position !== 'relative') {\r\n navigator.hide()\r\n toolbar.highlight('toggle')\r\n } else {\r\n toolbar.show()\r\n\r\n later(() => {\r\n drawer.close()\r\n })\r\n }\r\n\r\n return this\r\n }\r\n\r\n toggle() {\r\n if (this.isExpanded()) {\r\n this.collapses()\r\n } else {\r\n this.expand()\r\n }\r\n\r\n return this\r\n }\r\n\r\n print() {\r\n this.$emit('reader:print')\r\n\r\n return this\r\n }\r\n\r\n _destroy() {\r\n const count = this.count()\r\n let anchors = this.anchors\r\n let navigator = this.navigator\r\n let drawer = this.drawer\r\n let reader = this.reader\r\n let toolbar = this.toolbar\r\n let isOutside = false\r\n\r\n this.removeListeners()\r\n\r\n if (reader) {\r\n reader.destroy()\r\n }\r\n\r\n if (count > 0 && navigator) {\r\n isOutside = navigator.isOutside()\r\n\r\n navigator.destroy()\r\n\r\n if (isOutside && drawer) {\r\n drawer.destroy()\r\n }\r\n }\r\n\r\n if (anchors) {\r\n anchors.destroy()\r\n }\r\n\r\n if (toolbar) {\r\n toolbar.destroy()\r\n }\r\n\r\n return this\r\n }\r\n\r\n destroy() {\r\n this.$emit('beforeDestroy')\r\n\r\n this._destroy()._default()\r\n\r\n this.$emit('destroyed')\r\n\r\n return this\r\n }\r\n\r\n addListeners() {\r\n const hasToolbar = this.attr('hasToolbar')\r\n\r\n if (!hasToolbar) {\r\n return this\r\n }\r\n\r\n this.$on('toolbar:update', this.onToolbarUpdate)\r\n\r\n return this\r\n }\r\n\r\n removeListeners() {\r\n const hasToolbar = this.attr('hasToolbar')\r\n\r\n if (!hasToolbar) {\r\n return this\r\n }\r\n\r\n this.$off('toolbar:update')\r\n\r\n return this\r\n }\r\n}\r\n\r\nOutline.DEFAULTS = (() => {\r\n const OPTIONS = {\r\n articleElement: '#article',\r\n selector: 'h2,h3,h4,h5,h6',\r\n parentElement: '#aside',\r\n scrollElement: 'html,body',\r\n title: '目录',\r\n position: 'relative',\r\n placement: 'rtl',\r\n animationCurrent: true,\r\n showCode: false,\r\n hasToolbar: true,\r\n closeOnClickModal: true,\r\n showNavModalFirst: false,\r\n anchorURL: '',\r\n stickyHeight: 0,\r\n homepage: '',\r\n git: '',\r\n tags: '',\r\n issues: '',\r\n tools: [],\r\n reader: {\r\n target: '',\r\n title: '',\r\n enterReadingTip: '进入阅读模式,按 ESC 键可退出阅读模式',\r\n allowSpeak: false\r\n },\r\n customClass: '',\r\n afterSticky: null,\r\n afterToggle: null,\r\n afterScroll: null,\r\n chapterTextFilter: null,\r\n anchorLinkFilter: null\r\n }\r\n\r\n return cloneDeep(OPTIONS)\r\n})()\r\n\r\nif (window?.jQuery) {\r\n const $ = window.jQuery\r\n\r\n // 将 Outline 扩展为一个 jquery 插件\r\n // eslint-disable-next-line no-undef\r\n $.extend($.fn, {\r\n outline: function (options) {\r\n // eslint-disable-next-line no-undef\r\n let $article = $(this)\r\n\r\n return new Outline(\r\n // eslint-disable-next-line no-undef\r\n $.extend({}, options, {\r\n articleElement: $article\r\n })\r\n )\r\n }\r\n })\r\n}\r\n\r\nexport default Outline\r\n"],"names":["toString","val","Object","prototype","apply","isFunction","later","fn","delay","setTimeout","isObject","o","isArray","Array","cloneDeep","obj","clone","from","assign","keys","forEach","key","isString","str","isElement","nodeName","tagName","nodeType","hasClass","el","className","pattern","RegExp","allClass","classList","contains","exec","addClass","_classList","add","indexOf","split","name","length","easeInQuad","x","scrollTo","scrollElement","top","afterStop","$scrollElement","_getScrollElement","$rootElements","document","querySelector","querySelectorAll","scrollTop","step","distance","MAX_HEIGHT","scrollHeight","MAX_TOP","stop","play","requestAnimationFrame","getScrollElement","trim","replace","getChaptersByHeadings","headings","showCode","chapterTextFilter","chapters","previous","level","text","heading","i","headingLevel","current","parseInt","pid","_getChapterParentIdByDiffer","differ","index","innerHTML","push","id","rel","groups","group","JSON","stringify","cb","code","String","c","subjects","_getChaptersWithCode","getChapters","options","articleElement","selector","isTreeStructured","$article","$headings","filter","_maybeArrayLike","_toConsumableArray","toTree","list","nodeKey","parentKey","map","roots","item","children","node","hasOwn","prop","hasOwnProperty","call","extend","origin","source","_subscribers","_hasDirectSubscribersFor","topic","has","isDirect","found","position","lastIndexOf","substring","_hasSubscribers","emit","data","async","execute","subscriber","message","callback","context","deliver","guid","uuid","prefix","_removeSubscriber","off","token","subject","execution","j","splice","_removeSubscriberByToken","Component","constructor","this","attrs","initialize","attr","render","addListeners","value","arguments","refresh","destroy","removeListeners","reload","$emit","event","publish","$on","on","handler","subscribe","$off","unsubscribe","queue","isHandling","done","runIdle","idleDeadline","timeRemaining","shift","requestIdleCallback","window","start","Date","now","didTimeout","Math","max","cancelIdleCallback","clearTimeout","timeSlice","afterComplete","offsetTop","offsetParent","matches","sel","msMatchesSelector","getParentOrHost","host","parentNode","CAPTURE_EVENTS","_off","type","capture","_delegateListener","listeners","_listeners","listener","_delete","removeEventListener","purgeElement","recurse","$element","$children","childNodes","getListeners","$child","once","evt","target","getTarget","delegateTarget","closest","ctx","includeCTX","startsWith","overrideContext","addEventListener","stopPropagation","preventDefault","SYMBOLS","getSymbols","iconSet","getSymbol","patternName","patternSet","find","symbol","fullName","paint","$body","body","$icons","symbols","join","createElement","insertBefore","firstChild","isDOM","isHTMLCollection","fragment","isTextNode","setAttribute","toLowerCase","style","cssText","innerText","setAttributes","$fragment","createDocumentFragment","$el","isValidChild","child","append","createTextNode","appendChild","every","ICON","size","color","width","height","defaultRules","cssRules","$icon","$svg","binds","svg","test","isSVG","xmlns","class","icon","removeClass","remove","_removeHeading","$heading","hasAnchor","isAtStart","CLS_HEADING","$anchor","removeAttribute","removeChild","styleInject","css","ref","insertAt","head","getElementsByTagName","styleSheet","Anchors","super","_default","DEFAULTS","$articleElement","created","getHeadings","count","mounted","_paint","erase","_remove","LIMIT","anchorURL","anchorLinkFilter","update","chapterCode","_updateHeading","headingId","url","href","groupIndex","after","beforeDestroy","afterDestroy","onAnchorTrigger","afterScroll","stickyHeight","clientHeight","min","onRefresh","TAGS","isHTML","html","basic","full","slice","tag","stripScripts","setProperty","documentElement","zIndex","idx","Drawer","title","closed","$modal","$header","$title","$close","$main","$footer","$overlay","setTitle","isClosed","placement","hasClose","hasOverlay","hasOffset","hasPadding","autoHeight","overflow","customClass","mainClassName","content","$content","strHTML","template","open","opened","close","toggle","afterToggle","onClose","closeOnClickModal","afterClosed","afterOpened","at","getStyle","ruleName","getComputedStyle","HIDDEN","EXPANDED","FOLDED","Navigator","scrollTimer","resizeTimer","observerTimer","Observer","$list","$placeholder","$parentElement","$active","active","offsetWidth","playing","parentElement","$parent","isSticky","isFixed","isInside","isOutside","_paintEdge","animationCurrent","contents","calculateStickyHeight","highlight","sticky","onObserver","_paintChapters","clones","parts","byId","chapter","$text","$link","$code","$li","$subject","$chapter","_getPlaceholderOffset","mainPaddingTop","mainBorderTop","placeholderPaddingTop","placeholderMarginTop","placeholderBorderTop","offsetHeight","positionPlaceholder","ACTIVE","HIGHLIGHT","placeholderOffsetTop","getAttribute","inBounding","parent","parentRect","childRect","isInBounding","getBoundingClientRect","right","bottom","left","afterSticky","FIXED","isStickying","innerHeight","show","hide","intersection","props","root","rootMargin","IntersectionObserver","entries","entry","intersectionRatio","$root","section","observe","onSelect","onScroll","onResize","unobserve","isMobile","ua","navigator","userAgent","isPlainObject","getPrototypeOf","proto","isObjectLike","encodeHTML","CHARTS","instances","instance","Message","visible","offset","timer","destroyed","_objectSpread","isDestroyed","_getClassName","effect","round","closable","dangerouslyUseHTMLString","$type","$message","iconSize","_refreshIcon","iconName","$use","_refreshMessage","_refreshClose","_refreshEl","clearTimer","startTimer","duration","destroyAfterClosed","beforeClose","onMouseEnter","onMouseLeave","config","len","dom","clear","Command","action","Commands","commands","get","cmd","command","del","_createButton","button","rounded","link","$button","disabled","DISABLED","Toolbar","buttons","isHighlight","isDisabled","isExist","_getCommand","_self","bind","disable","_add","_disable","_enable","enable","enabled","onExecute","_updateToolbar","ceil","onToolbarUpdate","onAddButton","onRemoveButton","afterDisabled","afterEnabled","Speech","utterance","SpeechSynthesisUtterance","_initialize","lang","setLang","pitch","setPitch","rate","setRate","setText","voice","setVoice","volume","setVolume","_addListeners","isSpeaking","speechSynthesis","speaking","isPending","pending","isPaused","paused","getVoices","speak","pause","resume","cancel","speech","onvoiceschanged","isSupport","_updateSiblingElements","siblingElement","isPrev","$sibling","previousElementSibling","nextElementSibling","ENTER_READING_TIP","Reader","reading","$target","$paper","$progress","toolbar","_this$speech","_renderEdge","cloneNode","_animateTimeline","ScrollTimeline","animate","scale","timeline","axis","print","exit","enter","READER","READING","$siblings","enterReadingTip","info","SPEAK","onPrint","onEnterReading","onExitReading","keyCode","allowSpeak","Outline","version","anchors","drawer","reader","isExpanded","hasToolbar","_renderReader","_renderAnchors","_renderNavigator","_renderToolbar","option","showNavModalFirst","OPTIONS","homepage","git","tags","issues","tools","UP","toTop","HOME","GIT","ISSUES","MENU","PRINT","DOWN","toBottom","concat","addButton","removeButton","afterTop","floor","afterDown","enterReading","exitReading","switchReading","expand","collapses","_destroy","_window","jQuery","$","outline"],"mappings":"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ACT,CAEAkL,SAAAA,CAAUvQ,GAGR,OAFAqF,KAAKQ,QAAQ7F,GAENqF,IACT,CAEAK,YAAAA,GACE,MAAMmJ,EAAkBxJ,KAAKwJ,gBAE7B,OAAIxJ,KAAK2J,QAAU,IAInB3I,EACEwI,EACA,2BACA,QACAxJ,KAAK6K,gBACL7K,MACA,GAGFA,KAAKe,IAAI,kBAAmBf,KAAKkL,YAZxBlL,IAeX,CAEAU,eAAAA,GACE,MAAM8I,EAAkBxJ,KAAKwJ,gBAE7B,OAAIxJ,KAAK2J,QAAU,IAInBpK,EAAIiK,EAAiB,QAASxJ,KAAK6K,iBACnC7K,KAAKmB,KAAK,kBAAmBnB,KAAKkL,YAJzBlL,IAOX,EAGFoJ,GAAQG,SAmBCtS,EAlBS,CACdiC,cAAe,YACfsD,eAAgB,WAChBC,SAAU,oBACVsO,aAAc,EACdd,UAAW,GACX1B,WAAW,EACXC,WAAW,EACX/N,UAAU,EACVgP,QAAS,KACTG,QAAS,KACTkB,YAAa,KACbH,cAAe,KACfC,aAAc,KACdlQ,kBAAmB,KACnBwP,iBAAkB,OEpUtB,MAAMiB,GAAO,CACX,IACA,OACA,UACA,OACA,UACA,QACA,QACA,IACA,OACA,MACA,MACA,aACA,OACA,KACA,SACA,SACA,UACA,OACA,OACA,MACA,WACA,OACA,WACA,KACA,MACA,UACA,MACA,SACA,MACA,KACA,KACA,KACA,QACA,WACA,aACA,SACA,SACA,OACA,KACA,KACA,KACA,KACA,KACA,KACA,OACA,SACA,SACA,KACA,OACA,IACA,SACA,MACA,QACA,MACA,MACA,QACA,SACA,KACA,OACA,OACA,MACA,OACA,OACA,OACA,WACA,OACA,QACA,MACA,WACA,SACA,KACA,WACA,SACA,SACA,IACA,QACA,UACA,MACA,WACA,IACA,KACA,KACA,KACA,MACA,OACA,IACA,OACA,SACA,SACA,UACA,SACA,OACA,QACA,SACA,OACA,SACA,QACA,MACA,UACA,MACA,MACA,QACA,QACA,KACA,WACA,WACA,QACA,KACA,QACA,OACA,QACA,KACA,QACA,IACA,KACA,MACA,QACA,OCzGIC,GAAU1T,IACd,IAAI2T,EACAC,EACAC,EAEJ,QAAK9T,EAASC,KAKd2T,EAAOhR,EAAK3C,GAAK8T,MAAM,EAAG,KAC1BF,EAAQ,4DACRC,EAAO,IAAIpT,OAAOgT,GAAK/N,KAAKqO,GAAQ,IAAIA,eAAgB7F,KAAK,KAAM,KAE5D0F,EAAMxD,KAAKuD,IAASE,EAAKzD,KAAKuD,GAAK,ECtBtCK,GAAgBhU,GACbA,EAAI4C,QAAQ,+BAAgC,ICP/CqR,GAAcA,CAACjO,EAAM4C,KACD9G,SAASoS,gBACjBtF,MAAMqF,YAAYjO,EAAM4C,EAAM,ECAhD,IAAI/E,GAAQ,IAEZ,MAAMsQ,GAAUC,IACVA,EACFvQ,GAAQuQ,EAERvQ,IAAS,EAGXoQ,GAAY,mBAAoB,GAAGpQ,MAE5BA,2vLCOT,MAAMwQ,WAAejM,EACnBC,WAAAA,CAAYxD,GACV8M,QAEArJ,KAAKsJ,WAELtJ,KAAK6L,OAAS,EAEVtP,GACFyD,KAAKE,WAAW3D,EAEpB,CAEA+M,QAAAA,GAcE,OAbAtJ,KAAKC,MAAQhJ,EAAU8U,GAAOxC,UAC9BvJ,KAAKgM,MAAQ,GACbhM,KAAKiM,QAAS,EAEdjM,KAAK4G,IAAM,KACX5G,KAAKkM,OAAS,KACdlM,KAAKmM,QAAU,KACfnM,KAAKoM,OAAS,KACdpM,KAAKqM,OAAS,KACdrM,KAAKsM,MAAQ,KACbtM,KAAKuM,QAAU,KACfvM,KAAKwM,SAAW,KAETxM,IACT,CAEAE,UAAAA,CAAW3D,GACT,IAAIkN,EAYJ,OAVAzJ,KAAKG,KAAK5D,GAEVyD,KAAKgM,MAAQhM,KAAKG,KAAK,SACvBsJ,EAAUzJ,KAAKG,KAAK,WAEhB3J,EAAWiT,IACbA,EAAQ7L,KAAKoC,MAGfA,KAAKI,SAASC,eACPL,IACT,CAEAyM,QAAAA,CAAST,GAKP,OAJAhM,KAAKG,KAAK,QAAS6L,GACnBhM,KAAKgM,MAAQA,EACbhM,KAAKoM,OAAO5Q,UAAYwQ,EAEjBhM,IACT,CAEA0M,QAAAA,GACE,OAAO1M,KAAKiM,MACd,CAEA7L,MAAAA,GACE,MAAMwJ,EAAU5J,KAAKG,KAAK,WACpBiH,EAAOpH,KAAKG,KAAK,QACjBwM,EAAY3M,KAAKG,KAAK,aACtByM,EAAW5M,KAAKG,KAAK,YACrB0M,EAAa7M,KAAKG,KAAK,cACvB2M,EAAY9M,KAAKG,KAAK,aACtB4M,EAAa/M,KAAKG,KAAK,cACvB6M,EAAahN,KAAKG,KAAK,cACvB8M,EAAWjN,KAAKG,KAAK,YACrB+M,EAAclN,KAAKG,KAAK,eAC9B,IACIyG,EACAsF,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EARAW,EAAgB,uBAsGpB,OA5FA5H,IACAvF,KAAK6L,OAASA,KAEdO,EAASvG,EACP,KACA,CACE5N,UAAW,yBAEb+H,KAAKgM,OAEPhM,KAAKoM,OAASA,EAEVQ,IACFP,EAASxG,EACP,MACA,CACE5N,UAAW,yBAEbiQ,GAAK,QAAS,CAAElD,QAAS,UAAWoC,KAAM,MAE5CpH,KAAKqM,OAASA,GAGhBF,EAAUtG,EACR,SACA,CACE5N,UAAW,0BAEb,CAACmU,EAAQC,IAEXrM,KAAKmM,QAAUA,EAEE,WAAbc,IACFE,GAAiB,oBAGnBb,EAAQzG,EAAc,MAAO,CAC3B5N,UAAWkV,IAEbnN,KAAKsM,MAAQA,EAERS,GACHvU,EAAS8T,EAAO,uBAGlBC,EAAU1G,EAAc,SAAU,CAChC5N,UAAW,2BAEb+H,KAAKuM,QAAUA,EAEfL,EAASrG,EACP,MACA,CACE5N,UAAW,wCAAwC0U,oBAA4BvF,2BAEjF,CAAC+E,EAASG,EAAOC,IAEnBvM,KAAKkM,OAASA,EAEVY,GACFtU,EAAS0T,EAAQ,yBAGfc,GACFxU,EAAS0T,EAAQ,uBAGfgB,GACF1U,EAAS0T,EAAQgB,GAGfL,IACFL,EAAW3G,EAAc,MAAO,CAC9B5N,UAAW,4BAEb+H,KAAKwM,SAAWA,GAGlB5F,EAAMf,EACJ,MACA,CACE5N,UAAW,kBAEb,CAACiU,EAAQM,IAEXxM,KAAK4G,IAAMA,EACXpN,SAASiM,KAAKwB,YAAYL,GAEtBpQ,EAAWoT,IACbA,EAAQhM,KAAKoC,MAGRA,IACT,CAEA8J,KAAAA,GAEE,OADA9J,KAAKsM,MAAM9Q,UAAY,GAChBwE,IACT,CAEA6J,MAAAA,CAAOuD,GACL,IAAIC,EAAW,KAcf,OAZI7W,EAAW4W,GACbC,EAAWD,IACFpH,EAAMoH,GACfC,EAAWD,EACFhC,GAAOgC,KAChBC,ECjMOhC,EAACrT,EAAIsV,KAChB,MAAM5G,EAAYlN,SAASmN,yBAE3B,IAAK3O,IAAQoT,GAAOpT,KAAQP,EAASO,KAAQL,EAAUK,GACrD,OAAO,KAGT,GAAIoT,GAAOpT,GAAK,CACd,MAAMuV,EAAW1H,EAAc,OAC/B,IAAItI,EAAW,GAQf,OANAgQ,EAAS/R,UAAYkQ,GAAa1T,GAClCuF,EAAQT,EAAAC,EAAOwQ,EAASzJ,YACxBvG,EAAShG,SAASuP,IAChBJ,EAAUO,YAAYH,EAAM,IAGvBJ,CACT,CAAO,IAAIjP,EAAS6V,GAGlB,OAAOtV,EAAGwD,UAFVxD,EAAGwD,UAAYkQ,GAAa4B,EAG9B,ED2KejC,CAAK+B,IAGdC,GACFrN,KAAKsM,MAAMrF,YAAYoG,GAGlBrN,IACT,CAEA+J,OAAAA,GAEE,OADAvQ,SAASiM,KAAKmD,YAAY5I,KAAK4G,KACxB5G,IACT,CAEAQ,OAAAA,CAAQ4M,GAEN,OADApN,KAAK8J,QAAQD,OAAOuD,GACbpN,IACT,CAEAwN,IAAAA,GACE,MAAMC,EAASzN,KAAKG,KAAK,eACnB+L,EAASlM,KAAKkM,OAcpB,OAZA1T,EAASwH,KAAK4G,IAAK,yBACnBuB,GAAY+D,EAAQ,yBACpB1T,EAAS0T,EAAQ,yBAEjBzV,GAAM,KACJuJ,KAAKiM,QAAS,EAEVzV,EAAWiX,IACbA,EAAO7P,KAAKoC,KACd,IAGKA,IACT,CAEA0N,KAAAA,GACE,MAAMzB,EAASjM,KAAKG,KAAK,eACnB+L,EAASlM,KAAKkM,OAcpB,OAZA/D,GAAY+D,EAAQ,yBACpB1T,EAAS0T,EAAQ,yBAEjBzV,GAAM,KACJ0R,GAAYnI,KAAK4G,IAAK,yBACtB5G,KAAKiM,QAAS,EAEVzV,EAAWyV,IACbA,EAAOrO,KAAKoC,KACd,IAGKA,IACT,CAEA2N,MAAAA,GACE,MAAMC,EAAc5N,KAAKG,KAAK,eACxB8L,EAASjM,KAAK0M,WAcpB,OAZIT,EACFjM,KAAKwN,OAELxN,KAAK0N,QAGHlX,EAAWoX,IACbnX,GAAM,KACJmX,EAAYhQ,KAAKoC,KAAMiM,EAAO,IAI3BjM,IACT,CAEAS,OAAAA,GACE,MAAMmK,EAAe5K,KAAKG,KAAK,gBACzBwK,EAAgB3K,KAAKG,KAAK,iBAChC,IAAI5E,EAAQyE,KAAK6L,OAgBjB,OAdIrV,EAAWmU,IACbA,EAAc/M,KAAKoC,MAGrBA,KAAKU,kBAAkBqJ,UAAUT,WAEjC/N,GAAS,EACTsQ,GAAOtQ,GACPyE,KAAK6L,OAAS,EAEVrV,EAAWoU,IACbA,EAAahN,KAAKoC,MAGbA,IACT,CAEA6N,OAAAA,GAEE,OADA7N,KAAK0N,QACE1N,IACT,CAEAK,YAAAA,GACE,MAAMuM,EAAW5M,KAAKG,KAAK,YACrB0M,EAAa7M,KAAKG,KAAK,cACvB2N,EAAoB9N,KAAKG,KAAK,qBAC9ByG,EAAM5G,KAAK4G,IAUjB,OARIgG,GACF5L,EAAG4F,EAAK,yBAA0B,QAAS5G,KAAK6N,QAAS7N,MAAM,GAG7D6M,GAAciB,GAChB9M,EAAG4F,EAAK,2BAA4B,QAAS5G,KAAK6N,QAAS7N,MAAM,GAG5DA,IACT,CAEAU,eAAAA,GACE,MAAMkM,EAAW5M,KAAKG,KAAK,YACrB0M,EAAa7M,KAAKG,KAAK,cACvByG,EAAM5G,KAAK4G,IAEjB,OAAKgG,GAAaC,GAIlBtN,EAAIqH,EAAK,QAAS5G,KAAK6N,SAEhB7N,MALEA,IAMX,EAGF+L,GAAOxC,SAsBEtS,EArBS,CACd0V,UAAW,MACXX,MAAO,KACP5E,KAAM,UACNwF,UAAU,EACVC,YAAY,EACZC,WAAW,EACXC,YAAY,EACZC,YAAY,EACZc,mBAAmB,EACnBb,SAAU,OACVxD,QAAS,KACTG,QAAS,KACTmE,YAAa,KACbC,YAAa,KACblD,YAAa,KACbH,cAAe,KACfC,aAAc,KACdgD,YAAa,OEzVjB,MAAMK,GAAKA,CAACjW,EAAIkL,EAAMxM,EAAIiI,EAAMM,EAASgF,GAAO,KAE9C,MAAMd,EAAUH,EAAerK,QAAQuK,IAAS,EAC1CK,EAAW,SAAUW,GACzB,IAAIQ,EAAkBzF,GAAWjH,GAIjB,IAAZiH,IACFyF,EAAkB/F,IAKP,IAATsF,GACF1E,EAAIvH,EAAIkL,EAAMK,GAGhB7M,EAAGkH,KAAK8G,EAAiBR,EAAKvF,IAGhC,IAAKnI,EAAWE,GACd,OAAO,EAGJsB,EAAGsL,aACNtL,EAAGsL,WAAa,IAIlBtL,EAAGsL,WAAW7H,KAAK,CACjBzD,KACAkL,OACAxM,GAAI6M,EACJ5E,OACAM,UACAkE,YAIFzM,EAAG0M,kBAAoBG,EAEvBvL,EAAG2M,iBAAiBzB,EAAMK,EAAUJ,EAAQ,ECpDxC+K,GAAWA,CAAClW,EAAImW,IACbC,iBAAiBpW,GAAImW,w4ECoB9B,MAAME,GAAS,2BACTC,GAAW,6BACXC,GAAS,2BAEf,MAAMC,WAAkB1O,EACtBC,WAAAA,CAAYxD,GACV8M,QAEArJ,KAAKsJ,WAELtJ,KAAKyO,YAAc,KACnBzO,KAAK0O,YAAc,KACnB1O,KAAK2O,cAAgB,KACrB3O,KAAK4O,SAAW,KAEZrS,GACFyD,KAAKE,WAAW3D,EAEpB,CAEA+M,QAAAA,GAmBE,OAlBAtJ,KAAKC,MAAQhJ,EAAUuX,GAAUjF,UAEjCvJ,KAAK4G,IAAM,KACX5G,KAAKoM,OAAS,KACdpM,KAAKsM,MAAQ,KACbtM,KAAK6O,MAAQ,KACb7O,KAAK8O,aAAe,KACpB9O,KAAK+O,eAAiB,KACtB/O,KAAK3G,eAAiB,KACtB2G,KAAKgP,QAAU,KAEfhP,KAAKrF,SAAW,GAChBqF,KAAKiP,OAAS,EACdjP,KAAKkP,YAAc,EACnBlP,KAAKwC,UAAY,EACjBxC,KAAKmP,SAAU,EACfnP,KAAKiM,QAAS,EAEPjM,IACT,CAEAE,UAAAA,CAAW3D,GACT,IAAIkN,EACA2F,EACAlW,EACAmW,EAwBJ,OAtBArP,KAAKG,KAAK5D,GAEVkN,EAAUzJ,KAAKG,KAAK,WACpBiP,EAAgBpP,KAAKG,KAAK,iBAC1BjH,EAAgB8G,KAAKG,KAAK,iBAEtB1I,EAAS2X,GACXC,EAAU7V,SAASC,cAAc2V,GACxBzX,EAAUyX,KACnBC,EAAUD,GAEZpP,KAAK+O,eAAiBM,EACtBrP,KAAK3G,eAAiBe,EAAiBlB,GAEvC8G,KAAKrF,SAAWqF,KAAKG,KAAK,YAC1BH,KAAKiM,OAASjM,KAAKG,KAAK,UACxBH,KAAKiP,OAASjP,KAAKG,KAAK,UAEpB3J,EAAWiT,IACbA,EAAQ7L,KAAKoC,MAGXA,KAAKrF,SAAS7B,OAAS,IAI3BkH,KAAKI,SAASC,eAEdL,KAAKgP,QAAUxV,SAASC,cAAc,YAAYuG,KAAKiP,WAL9CjP,IAQX,CAEA0M,QAAAA,GACE,OAAO1M,KAAKiM,MACd,CAEAqD,QAAAA,GAEE,MAAoB,WADHtP,KAAKG,KAAK,WAE7B,CAEAoP,OAAAA,GAEE,MAAoB,UADHvP,KAAKG,KAAK,WAE7B,CAEAqP,QAAAA,GACE,OAAOxP,KAAKuP,WAAavP,KAAKsP,UAChC,CAEAG,SAAAA,GACE,OAAQzP,KAAKwP,UACf,CAEA7F,KAAAA,GACE,OAAO3J,KAAKrF,SAAS7B,MACvB,CAEA4W,UAAAA,GACE,MAAMhJ,EAAYlN,SAASmN,yBAErBqF,EAAQhM,KAAKG,KAAK,SAClBwP,EAAmB3P,KAAKG,KAAK,oBAC7B+M,EAAclN,KAAKG,KAAK,eACxB4O,EAAiB/O,KAAK+O,eACtBxR,EAAW,GACXqS,EAAW,GACjB,IACIhJ,EACA0F,EACAuC,EACAC,EAJA1C,EAAS,KAMb,OAAK2C,GAID/O,KAAKwP,YAAcxD,IACrBI,EAASvG,EACP,KACA,CACE5N,UAAW,4BAEb+T,GAEFhM,KAAKoM,OAASA,EACdwD,EAASnU,KAAK2Q,IAGhByC,EAAQhJ,EAAc,KAAM,CAI1B5N,UAAW,4BAEb+H,KAAK6O,MAAQA,EACbtR,EAAS9B,KAAKoT,GAEVc,IACFb,EAAejJ,EAAc,MAAO,CAClC5N,UAAW,mCAEb+H,KAAK8O,aAAeA,EACpBvR,EAAS9B,KAAKqT,IAGhBxC,EAAQzG,EACN,MACA,CACE5N,UAAW,2BAEbsF,GAEFyC,KAAKsM,MAAQA,EACbsD,EAASnU,KAAK6Q,GAEd1F,EAAMf,EACJ,MACA,CACEnK,GAAI,oBACJzD,UAAW,qBAAqBoW,MAElCuB,GAEF5P,KAAK4G,IAAMA,EAEP5G,KAAKsP,aACPtP,KAAK6P,wBACLrX,EAASoO,EApEI,6BAuEXsG,GACF1U,EAASoO,EAAKsG,GAEhBxG,EAAUO,YAAYL,GACtBmI,EAAe9H,YAAYP,GAEpB1G,MA/DEA,IAgEX,CAEAI,MAAAA,GACE,MAAMwJ,EAAU5J,KAAKG,KAAK,WACpB4O,EAAiB/O,KAAK+O,eACtBpU,EAAWqF,KAAKrF,SAChBgP,EAAQ3J,KAAK2J,QACnB,IAAI/C,EAEJ,OAAKmI,GAAkBpU,EAAS7B,OAAS,IAIrCkH,KAAKwP,YACPhX,EAASuW,EAAgB,4BAG3B/O,KAAK0P,aACL9I,EAAM5G,KAAK4G,IAEX5G,KAAK6J,OAAOlP,GAEZlE,GAAM,KACJuJ,KAAK8P,UAAU9P,KAAKiP,OAAO,GAC1B,IAEHjP,KAAKwC,UAAYA,EAAUoE,GAC3B5G,KAAKkP,YAActI,EAAIsI,YAEnBlP,KAAKuP,YACPvP,KAAK+P,SACLpE,GAAY,4BAA6B,GAAG3L,KAAKkP,kBAG/C1Y,EAAWoT,IACbA,EAAQhM,KAAKoC,MAGX2J,EAAQ,KACV3J,KAAKgQ,cA7BEhQ,IAiCX,CAEA8J,KAAAA,GAGE,OAFA9J,KAAK6O,MAAMrT,UAAY,GAEhBwE,IACT,CAEA6J,MAAAA,CAAOlP,GACL,MAAMF,EAAWuF,KAAKG,KAAK,YACrByG,EAAM5G,KAAK4G,IAOjB,MChRmBqJ,EAACpB,EAAOlU,EAAUF,GAAW,KAClD,MACMkP,EAAQhP,EAAS7B,OACjBoX,EAAMpT,EAAAC,EAAOpC,GACb4K,EAAS4K,IACb,MAAMC,EAAQ1U,GAAOmT,EAAMpV,cAAc,IAAIiC,KAC7CyU,EAAM5Y,SAAS8Y,IACb,MAAMjV,EAAMiV,EAAQjV,IACdM,EAAK2U,EAAQ3U,GACbO,EAAOoU,EAAQpU,KACfN,EAAM0U,EAAQ1U,IACd4B,EAAW,GACX+S,EAAQzK,EACZ,OACA,CACE5N,UAAW,2BAEboY,EAAQvV,MAEV,IAAIyV,EACAC,EACAC,EACAC,EACAC,EAEAlW,IACF+V,EAAQ3K,EACN,OACA,CACE5N,UAAW,0BACX,UAAWyD,GAEb2U,EAAQpU,MAGVsB,EAAS9B,KAAK+U,IAGhBjT,EAAS9B,KAAK6U,GAEdC,EAAQ1K,EACN,IACA,CACEnK,GAAI,mBAAmBA,IACvBzD,UAAW,4BACXuS,KAAM,IAAM7O,EACZA,IAAKA,EACL,UAAWD,EACX,YAAaO,GAEfsB,GAGFkT,EAAM5K,EACJ,KACA,CACEnK,GAAI,WAAWA,IACfzD,UAAW,0BACX,UAAWyD,EACX,YAAaO,GAEfsU,IAGW,IAATnV,EACFyT,EAAM5H,YAAYwJ,IAElBE,EAAWP,EAAK,WAAWhV,KAC3BsV,EAAWN,EAAK,WAAWhV,KAEtBsV,EAYHA,EAASzJ,YAAYwJ,IAXrBC,EAAW7K,EACT,KACA,CACEnK,GAAI,WAAaN,EACjBnD,UAAW,8BAEbwY,GAGFE,EAAS1J,YAAYyJ,IAIzB,GACA,EAKJ,GAAI/G,EAzFU,IA8FZ,IAHApE,EAAM2K,EAAOtQ,OAAO,EA3FR,MA8FLsQ,EAAOpX,OAAS,GAAG,CACxB,MAAMmL,EAAOiM,EAAOtQ,OAAO,EA/FjB,KAgGV0C,GAAU,KACRiD,EAAMtB,EAAK,GAEf,MAEAsB,EAAM2K,EACR,EDqKED,CAFcjQ,KAAK6O,MAEGlU,EAAUF,GAChC0N,GAAYvB,EAAKyH,IACjB7V,EAASoO,EAAK0H,IAEPtO,IACT,CAEA+J,OAAAA,GAEE,OADA/J,KAAK+O,eAAenG,YAAY5I,KAAK4G,KAC9B5G,IACT,CAEAQ,OAAAA,CAAQ7F,GACN,MAAMiM,EAAM5G,KAAK4G,IAKjB,OAHAuB,GAAYvB,EAAKyH,IACjBrO,KAAK8J,QAAQD,OAAOlP,GAEbqF,IACT,CAEA4Q,qBAAAA,CAAsBrV,GACpB,MAAM+Q,EAAQtM,KAAKsM,MACbuC,EAAQ7O,KAAK6O,MACbnG,EAAUmG,EAAMpV,cAAc,8BAC9BoX,EAAiB1V,SAAS+S,GAAS5B,EAAO,eAAgB,IAC1DwE,EAAgB3V,SAAS+S,GAAS5B,EAAO,oBAAqB,IAC9DyE,EAAwB5V,SAAS+S,GAASW,EAAO,eAAgB,IACjEmC,EAAuB7V,SAAS+S,GAASW,EAAO,cAAe,IAC/DoC,EAAuB9V,SAC3B+S,GAASW,EAAO,oBAChB,IAEF,IAEI1V,EADAqJ,EAAY,EAyBhB,OAtBIqO,IACFrO,GAAaqO,GAGXE,IACFvO,GAAauO,GAGXC,IACFxO,GAAawO,GAGXF,IACFtO,GAAasO,GAGXG,IACFzO,GAAayO,GAGf9X,EAxBauP,EAAQwI,aAwBN3V,EAERiH,EAAYrJ,CACrB,CAEAgY,mBAAAA,CAAoB5V,GAClB,MAAMsT,EAAQ7O,KAAK6O,MACbC,EAAe9O,KAAK8O,aACpBpG,EAAUmG,EAAMpV,cAAc,8BAC9BkW,EAAmB3P,KAAKG,KAAK,oBAC7BoH,EAASmB,EAAQwI,aACvB,IAAI1O,EAAY,EAEhB,OAAKmN,GAILnN,EAAYxC,KAAK4Q,sBAAsBrV,GAEvCuT,EAAaxI,MAAMC,QAAU,yBAAyB/D,eAAuB+E,OAEtEvH,MAPEA,IAQX,CAEA8P,SAAAA,CAAUpU,GACR,MAAMkL,EAAM5G,KAAK4G,IACX+I,EAAmB3P,KAAKG,KAAK,oBAE7BiR,EAAS,2BACTC,EAAY,8BAClB,IAAIhC,EAAuB,aAHVrP,KAAKG,KAAK,YAGaH,KAAK+O,eAAiB/O,KAAKsM,MAC/D5D,EAAU,KACV4I,EAAuB,EAE3B,OAAK1K,GAIL8B,EAAU9B,EAAInN,cAAc,oBAAoBiC,KAE3CgN,GAIL1I,KAAKiP,OAAS9T,SAASuN,EAAQ6I,aAAa,WAAY,IAEpDvR,KAAKgP,UACP7G,GAAYnI,KAAKgP,QAASqC,GAC1BlJ,GAAYnI,KAAKgP,QAASoC,IAG5BpR,KAAKgP,QAAUtG,EACflQ,EAASwH,KAAKgP,QAASoC,GAEnBzB,EACF3P,KAAKmR,oBAAoBnR,KAAKiP,QAE9BzW,EAASwH,KAAKgP,QAASqC,GAGzB5a,GAAM,KE1XS+a,EAAC1K,EAAO2K,KACzB,IACIC,EACAC,EAFAC,GAAe,EAInB,OAAKja,EAAUmP,IAAWnP,EAAU8Z,IAIpCC,EAAaD,EAAOI,wBACpBF,EAAY7K,EAAM+K,wBAElBD,KACED,EAAUxY,KAAOuY,EAAWvY,KAC5BwY,EAAUG,OAASJ,EAAWI,OAC9BH,EAAUI,QAAUL,EAAWK,QAC/BJ,EAAUK,MAAQN,EAAWM,MAGxBJ,GAbEA,CAaU,EFwWVJ,CAAWxR,KAAKgP,QAASK,KAC5BiC,EAAuBtR,KAAK4Q,sBAAsB5Q,KAAKiP,QACvDhW,EAASoW,EAASiC,GACpB,IAGKtR,MA1BEA,MANAA,IAiCX,CAEA+P,MAAAA,GACE,MAAMkC,EAAcjS,KAAKG,KAAK,eACxB+R,EAAQ,0BACRtL,EAAM5G,KAAK4G,IACXzN,EAAM6G,KAAKwC,UACX7I,EAAYqG,KAAK3G,eAAeM,UACtC,IAAIwY,EAEJ,OAAKnS,KAAKuP,WAIV4C,EAAcxY,GAAaR,EAEvBgZ,EACF3Z,EAASoO,EAAKsL,GAEd/J,GAAYvB,EAAKsL,GAGf1b,EAAWyb,IACbA,EAAYrU,KAAKoC,KAAMA,KAAK0M,WAAYyF,GAGnCnS,MAfEA,IAgBX,CAEA6P,qBAAAA,GACE,MAAMjE,EAAkBpS,SAASoS,gBAC3BrE,EAASrF,KAAKC,IAClByJ,EAAgBZ,cAAgB,EAChCnJ,OAAOuQ,aAAe,GAGxB,OADAzG,GAAY,0BAA2B,GAAGpE,OACnCvH,IACT,CAEA/G,QAAAA,CAASE,EAAKuR,GACZ,MAAM1S,EAAKgI,KAAK3G,eAIhB,OAFAJ,EAASjB,EAAImB,EAAKuR,GAEX1K,IACT,CAEAqS,IAAAA,GACE,MAAM5E,EAASzN,KAAKG,KAAK,eACnBwJ,EAAQ3J,KAAK2J,QACb/C,EAAM5G,KAAK4G,IACXyI,EAAUrP,KAAK+O,eAqBrB,OAnBI/O,KAAKwP,WACH7F,EAAQ,IACVxB,GAAYkH,EAAShB,KAErBlG,GAAYkH,EAAShB,IACrB5X,GAAM,KACJ0R,GAAYkH,EAASd,IACrB/V,EAAS6W,EAASf,GAAS,GAC1B,KAGLnG,GAAYvB,EAAKyH,IAEnBrO,KAAKiM,QAAS,EAEVzV,EAAWiX,IACbA,EAAO7P,KAAKoC,MAGPA,IACT,CAEAsS,IAAAA,GACE,MAAMrG,EAASjM,KAAKG,KAAK,eACnBwJ,EAAQ3J,KAAK2J,QACb/C,EAAM5G,KAAK4G,IACXyI,EAAUrP,KAAK+O,eAqBrB,OAnBI/O,KAAKwP,WACH7F,EAAQ,IACVnR,EAAS6W,EAAShB,KAElB7V,EAAS6W,EAASd,IAClBpG,GAAYkH,EAASf,IACrB7X,GAAM,KACJ+B,EAAS6W,EAAShB,GAAO,KAI7B7V,EAASoO,EAAKyH,IAEhBrO,KAAKiM,QAAS,EAEVzV,EAAWyV,IACbA,EAAOrO,KAAKoC,MAGPA,IACT,CAEA2N,MAAAA,GACE,MAAMC,EAAc5N,KAAKG,KAAK,eACxBhH,EAAM6G,KAAKwC,UACX7I,EAAYqG,KAAK3G,eAAeM,UACtC,IAAIwY,EAeJ,OAbInS,KAAK0M,WACP1M,KAAKqS,OAELrS,KAAKsS,OAGH9b,EAAWoX,IACbnX,GAAM,KACJ0b,EAAcxY,GAAaR,EAC3ByU,EAAYhQ,KAAKoC,KAAMA,KAAK0M,WAAYyF,EAAY,IAIjDnS,IACT,CAEAS,OAAAA,GACE,MAAMkK,EAAgB3K,KAAKG,KAAK,iBAC1ByK,EAAe5K,KAAKG,KAAK,gBA+B/B,OA7BI3J,EAAWmU,IACbA,EAAc/M,KAAKoC,MAGrBA,KAAKU,kBAAkBqJ,UAAUT,WAE7BtJ,KAAKyO,cACPpM,aAAarC,KAAKyO,aAClBzO,KAAKyO,YAAc,MAGjBzO,KAAK0O,cACPrM,aAAarC,KAAK0O,aAClB1O,KAAK0O,YAAc,MAGjB1O,KAAK2O,gBACPtM,aAAarC,KAAK2O,eAClB3O,KAAK2O,cAAgB,MAGnB3O,KAAK4O,WACP5O,KAAK4O,SAAW,MAGdpY,EAAWoU,IACbA,EAAahN,KAAKoC,MAGbA,IACT,CAEAgQ,UAAAA,GACE,MAAMvT,EAAWuD,KAAKG,KAAK,YAwB3B,OAtBAH,KAAK4O,SGjiBY2D,EAAC7b,EAAI8b,EAAQ,MAChC,MAAMC,EAAOD,EAAMC,MAAQ,KACrBhW,EAAW+V,EAAM/V,UAAY,mBAC7BwC,EAAUuT,EAAMvT,SAAW,KAE3B1C,EAAU,CACdmW,WAFiBF,EAAME,YAAc,oBAKjC9D,EAAW,IAAI+D,sBAAsBC,IACzCA,EAAQrb,SAASsb,IACXA,EAAMC,kBAAoB,GACxBtc,EAAWE,IACbA,EAAGkH,KAAKqB,GAAW4T,EAAM1O,OAAQ0O,EAAM1O,OAE3C,GACA,GACD5H,GACGwW,EAAQpb,EAAU8a,GAAQA,EAAOjZ,SAUvC,OARIiZ,IACFlW,EAAQkW,KAAOA,GAGjBM,EAAMrZ,iBAAiB+C,GAAUlF,SAASyb,IACxCpE,EAASqE,QAAQD,EAAQ,IAGpBpE,CAAQ,EHqgBG2D,EACbjK,IACC,MAAM5M,EAAK4M,EAASiJ,aAAa,WAEjC,GAAIvR,KAAKmP,QACP,OAAO,EAGLnP,KAAK2O,eACPtM,aAAarC,KAAK2O,eAGpB3O,KAAK2O,cAAgBlY,GAAM,KACzBuJ,KAAK8P,UAAUpU,EAAG,GACjB,IAAI,GAET,CACEe,WACAwC,QAASe,OAINA,IACT,CAEAkT,QAAAA,CAAShP,GACP,MAAM6G,EAAe/K,KAAKG,KAAK,gBACzBuI,EAAUxE,EAAIG,eACd3I,EAAKgN,EAAQ6I,aAAa,WAC1BjH,EAAY5B,EAAQ8B,KAAK5R,MAAM,KAAK,GACpC0P,EAAW9O,SAASC,cAAc,IAAI6Q,KACtCnR,EAAMqJ,EAAU8F,IAAayC,EAAe,IAE5C5I,EAAMnC,KAAK3G,eAAeU,aAC1B+Q,EAAc9K,KAAKG,KAAK,eACxBuK,EAAQA,KACRlU,EAAWsU,IACbA,EAAYlN,KAAKoC,KAAM,WAGzBvJ,GAAM,KACJuJ,KAAKmP,SAAU,EACfnP,KAAKY,MAAM,iBAAkB,CAC3BzH,MACA8R,IAZM,EAaN9I,OACA,GACF,EAiBJ,OAdAnC,KAAKmP,SAAU,EACXnP,KAAKuP,WACPvP,KAAK+P,SACLtZ,GAAM,KACJuJ,KAAK/G,SAASE,EAAKuR,GACnB1K,KAAK8P,UAAUpU,EAAG,GACjB,MAEHsE,KAAK/G,SAASE,EAAKuR,GACnB1K,KAAK8P,UAAUpU,IAGjBzB,EAAKiK,GAEElE,IACT,CAEAmT,QAAAA,GACE,MAAM9Z,EAAiB2G,KAAK3G,eAsB5B,OApBI2G,KAAKyO,aACPpM,aAAarC,KAAKyO,aAGpBzO,KAAKyO,YAAchY,GAAM,KACvB,MAAM0C,EAAME,EAAeM,UAErBwI,EAAM9I,EAAeU,aAAeV,EAAe2R,aAErDhL,KAAKuP,WACPvP,KAAK+P,SAGP/P,KAAKY,MAAM,iBAAkB,CAC3BzH,MACA8R,IATU,EAUV9I,OACA,GACD,KAEInC,IACT,CAEAoT,QAAAA,GAEE,OAAKpT,KAAKsP,YAINtP,KAAK0O,aACPrM,aAAarC,KAAK0O,aAGpB1O,KAAK0O,YAAcjY,GAAM,KACvBuJ,KAAK6P,uBAAuB,IAGvB7P,MAXEA,IAYX,CAEAkL,SAAAA,CAAUvQ,GAGR,OAFAqF,KAAKQ,QAAQ7F,GAENqF,IACT,CAEAK,YAAAA,GACE,MAAMuG,EAAM5G,KAAK4G,IACXvN,EAAiB2G,KAAK3G,eACtBxB,EAAUwB,EAAexB,QAAQwO,cACvC,IAAIzC,EAAWvK,EAEf,OAAI2G,KAAK2J,QAAU,IAIH,SAAZ9R,GAAkC,SAAZA,IACxB+L,EAAW/B,QAGbb,EAAG4F,EAAK,6BAA8B,QAAS5G,KAAKkT,SAAUlT,MAAM,GACpEiO,GAAGrK,EAAU,SAAU5D,KAAKmT,SAAUnT,MAAM,GACxCA,KAAKsP,YACPrB,GAAGpM,OAAQ,SAAU7B,KAAKoT,SAAUpT,MAAM,GAG5CA,KAAKe,IAAI,oBAAqBf,KAAKgQ,WAAYhQ,MAC/CA,KAAKe,IAAI,oBAAqBf,KAAKkL,UAAWlL,OAdrCA,IAiBX,CAEAU,eAAAA,GACE,MAAMjE,EAAWuD,KAAKG,KAAK,YACrByG,EAAM5G,KAAK4G,IACXvN,EAAiB2G,KAAK3G,eACtBxB,EAAUwB,EAAexB,QAAQwO,cACvC,IAAIzC,EAAWvK,EAEf,OAAI2G,KAAK2J,QAAU,IAIH,SAAZ9R,GAAkC,SAAZA,IACxB+L,EAAW/B,QAGbtC,EAAIqH,EAAK,QAAS5G,KAAKkT,UACvB3T,EAAIqE,EAAU,SAAU5D,KAAKmT,UACzBnT,KAAKsP,YACP/P,EAAIsC,OAAQ,SAAU7B,KAAKoT,UAE7BpT,KAAKmB,KAAK,qBACVnB,KAAKmB,KAAK,qBAENnB,KAAK4O,UACPpV,SAASE,iBAAiB+C,GAAUlF,SAASyb,IAC3ChT,KAAK4O,SAASyE,UAAUL,EAAQ,KAjB3BhT,IAsBX,EAGFwO,GAAUjF,SAsBDtS,EArBS,CACdmY,cAAe,GACflW,cAAe,GACfuD,SAAU,mBACVwS,OAAQ,EACRhD,QAAQ,EACRxR,UAAU,EACVkV,kBAAkB,EAClBrR,SAAU,WACVyM,aAAc,EACdpQ,SAAU,GACV8O,QAAS,KACTG,QAAS,KACTmE,YAAa,KACbC,YAAa,KACblD,YAAa,KACbH,cAAe,KACfC,aAAc,KACdqH,YAAa,OI5uBjB,MAAMqB,GAAWA,KACf,MAAMC,EAAKC,UAAUC,UAErB,MAAO,wDAAwD3L,KAAKyL,EAAG,ECAnEG,GAAiBtd,IACrB,MAAMud,EAAiBtd,OAAOsd,eAC9B,IAAIC,EAGJ,ICLoBxd,IACbS,EAAST,IAAgB,OAARA,EDInByd,CAAazd,GAChB,OAAO,EAQT,GALAwd,EAAQxd,EAAIE,WAKPsd,EACH,OAAO,EAKT,IAFAA,EAAQxd,EAEyB,OAA1Bud,EAAeC,IACpBA,EAAQD,EAAeC,GAGzB,OAAOD,EAAevd,KAASwd,CAAK,EE3BhCE,GAAcpc,IAClB,MAAMqc,EAAS,CACb,IAAK,QACL,IAAK,OACL,IAAK,OACL,IAAK,QACL,IAAK,UAGP,OAAOrc,EAAI4C,QAAQ,YAAamR,GACvBsI,EAAOtI,IAAQA,GACtB,25GCUJ,MACMuI,GAAY,GAClB,IAAIC,GAEJ1O,IAEA,MAAM2O,WAAgBpU,EACpBC,WAAAA,CAAYxD,GACV8M,QAEArJ,KAAKsJ,WAED/M,GACFyD,KAAKE,WAAW3D,EAEpB,CAEA+M,QAAAA,GAWE,OAVAtJ,KAAKC,MAAQhJ,EAAUid,GAAQ3K,UAE/BvJ,KAAK4G,IAAM,KACX5G,KAAKtE,GAAK,GACVsE,KAAKiM,QAAS,EACdjM,KAAKmU,SAAU,EACfnU,KAAKoU,QAAU,GACfpU,KAAKqU,MAAQ,KACbrU,KAAKsU,WAAY,EAEVtU,IACT,CAEAE,UAAAA,CAAW3D,GAaT,OAZAyD,KAAKG,KAAK5D,GACVyD,KAAKtE,GAAKsE,KAAKG,KAAK,MACpBH,KAAKoU,OAASpU,KAAKG,KAAK,YAAc,GAEtCH,KAAKY,MAAM,UAAS2T,EAAO,CAAA,EAAAvU,KAAKG,SAEhCH,KAAKI,SAASC,eAEVL,KAAKG,KAAK,YACZH,KAAKwN,OAGAxN,IACT,CAEA0M,QAAAA,GACE,OAAO1M,KAAKiM,MACd,CAEAuI,WAAAA,GACE,OAAOxU,KAAKsU,SACd,CAEAG,aAAAA,GACE,MAAMvR,EAAOlD,KAAKG,KAAK,QACjBuU,EAAS1U,KAAKG,KAAK,UACnBwU,EAAQ3U,KAAKG,KAAK,SAClByU,EAAW5U,KAAKG,KAAK,YACrBgU,EAAUnU,KAAKG,KAAK,WACpB+M,EAAclN,KAAKG,KAAK,eACxBlI,EAAY,CAChB,kBACA,mBAAmBiL,IACnB,mBAAmBwR,KAmBrB,OAhBIC,GACF1c,EAAUwD,KAAK,yBAGZmZ,GACH3c,EAAUwD,KAAK,8BAGb0Y,GACFlc,EAAUwD,KAAK,2BAGbyR,GACFjV,EAAUwD,KAAKyR,GAGVjV,CACT,CAEAmI,MAAAA,GACE,MAAM8C,EAAOlD,KAAKG,KAAK,QACjBpB,EAAUiB,KAAKG,KAAK,WACpBuU,EAAS1U,KAAKG,KAAK,UACnBwU,EAAQ3U,KAAKG,KAAK,SAClByU,EAAW5U,KAAKG,KAAK,YACrB0U,EAA2B7U,KAAKG,KAAK,4BACrClI,EAAY+H,KAAKyU,gBAEjBlX,EAAW,GACjB,IACIuX,EACAC,EACAzE,EACAjE,EACAzF,EALAoO,EAAW,GAyDf,OAlDIL,GAAoB,YAAXD,IACXM,EAAW,IAGE,UAAXN,IACFI,EAAQ5M,GAdkB,UAAXwM,EAAqB,UAAUxR,IAASA,EAchC,CACrB8B,QAAS,UACToC,KAAM4N,IAERxc,EAASsc,EAAO,yBAChBvX,EAAS9B,KAAKqZ,IAGXD,GAGHvE,EAAQ9W,SAASmN,yBACjB2J,EAAM9U,UAAYuD,GAHlBuR,EAAQ9W,SAASwN,eAAe8M,GAAWpI,GAAa3M,KAK1DgW,EAAWlP,EACT,IACA,CACE5N,UAAW,4BAEb,CAACqY,IAEH/S,EAAS9B,KAAKsZ,GAEVH,IACFvI,EAASnE,GAAK,QAAS,CACrBlD,QAAS,UACToC,KAAM,KAER5O,EAAS6T,EAAQ,0BACjB9O,EAAS9B,KAAK4Q,IAGhBzF,EAAMf,EACJ,MACA,CACE5N,UAAWA,EAAU2N,KAAK,MAE5BrI,GAEFqJ,EAAIN,MAAMC,QAAU,aACpBvG,KAAK4G,IAAMA,EACXpN,SAASiM,KAAKwB,YAAYjH,KAAK4G,KAE/B5G,KAAKY,MAAM,WAEJZ,IACT,CAEAiV,YAAAA,GACE,MAAM5G,EAAS,0BACTzH,EAAM5G,KAAK4G,IACjB,IACI1D,EACAwR,EACAC,EACAO,EACAxN,EACAC,EACAwN,EAPAH,EAAW,GASf,OAAIhV,KAAKwU,cACAxU,MAGT0H,EAAQd,EAAInN,cAAc,iBAErBiO,GAILxE,EAAOlD,KAAKG,KAAK,QACjBuU,EAAS1U,KAAKG,KAAK,UACnBwU,EAAQ3U,KAAKG,KAAK,SAEH,UAAXuU,EACFlc,EAASkP,EAAO2G,IAEhBlG,GAAYT,EAAO2G,GAEfsG,GAAoB,YAAXD,IACXM,EAAW,KAIfrN,EAAOD,EAAMjO,cAAc,sBAC3BgN,EAAckB,EAAM,CAClBrB,MAAO,SAAS0O,cAAqBA,SAGvCG,EAAOxN,EAAKlO,cAAc,OAC1Byb,EAAsB,UAAXR,EAAqB,UAAUxR,IAASA,EACnDkD,EAAa+O,EAAM,aAAc,iBAAiBD,KAE3ClV,MA1BEA,KA2BX,CAEAoV,eAAAA,GACE,MAAMxO,EAAM5G,KAAK4G,IACjB,IAAImO,EACAF,EACA9V,EACAjE,EAEJ,OAAIkF,KAAKwU,gBAITO,EAAWnO,EAAInN,cAAc,6BAC7Bob,EAA2B7U,KAAKG,KAAK,4BACrCpB,EAAUiB,KAAKG,KAAK,WAKlBrF,EAHG+Z,EAGI9V,EAFA+U,GAAWpI,GAAa3M,IAKjCgW,EAASvZ,UAAYV,GAbZkF,IAgBX,CAEAqV,aAAAA,GACE,MAAMhH,EAAS,0BACTzH,EAAM5G,KAAK4G,IACjB,IAAIyF,EACAuI,EAEJ,OAAI5U,KAAKwU,gBAITnI,EAASzF,EAAInN,cAAc,2BAC3Bmb,EAAW5U,KAAKG,KAAK,YAEjBkM,IACEuI,EACFpc,EAAS6T,EAAQgC,GAEjBlG,GAAYkE,EAAQgC,KAVfrO,IAeX,CAEAsV,UAAAA,GACE,MAAM1O,EAAM5G,KAAK4G,IACjB,IAAI3O,EAEJ,OAAI+H,KAAKwU,gBAITvc,EAAY+H,KAAKyU,gBACjBrO,EAAaQ,EAAK,YAAa3O,EAAU2N,KAAK,OAJrC5F,IAOX,CAEAQ,OAAAA,CAAQjE,GACN,OAAKmX,GAAcnX,IAInByD,KAAKG,KAAK5D,GACP0Y,eACAG,kBACAC,gBACAC,aAEItV,MATEA,IAUX,CAEAuV,UAAAA,GACE,OAAIvV,KAAKwU,eAILxU,KAAKqU,QACPhS,aAAarC,KAAKqU,OAClBrU,KAAKqU,MAAQ,MALNrU,IASX,CAEAwV,UAAAA,CAAWC,GACT,OAAIzV,KAAKwU,gBAITxU,KAAKqU,MAAQ5d,GAAM,KACjBuJ,KAAKY,MAAM,UACXZ,KAAK0N,OAAO,GACA,IAAX+H,IANMzV,IASX,CAEAwN,IAAAA,CAAKjR,GACH,MAAMqK,EAAM5G,KAAK4G,IACjB,IAAIwN,EACAqB,EACAtc,EACAsO,EAEJ,OAAIzH,KAAKwU,gBAILxU,KAAK0M,YACP1M,KAAKQ,QAAQjE,GAGf6X,EAASpU,KAAKG,KAAK,UACnBsV,EAAWzV,KAAKG,KAAK,YACrBhH,EAAMib,GAAUA,GAAUpU,KAAKoU,OAASA,EAASpU,KAAKoU,OACtD3M,EAAW,OAAOtO,OAElB6G,KAAKuV,aAELvV,KAAKY,MAAM,cAEXnK,GAAM,KACJuJ,KAAKmU,SAAU,EAEf3b,EAASoO,EAAK,2BACdA,EAAIN,MAAMC,QAAUkB,EAEhBgO,EAAW,GACbzV,KAAKwV,WAAWC,EAClB,GACC,MAzBMzV,IA4BX,CAEA0N,KAAAA,GACE,MAAM9G,EAAM5G,KAAK4G,IAEjB,IAAI8O,EACAC,EAEJ,OAAI3V,KAAKwU,gBAITkB,EAAqB1V,KAAKG,KAAK,sBAC/BwV,EAAc3V,KAAKG,KAAK,eAEpB3J,EAAWmf,IACbA,EAAY/X,KAAKoC,MAGnB4G,EAAIN,MAAMC,QAfO,aAgBjB4B,GAAYvB,EAAK,2BAEjB5G,KAAKmU,SAAU,EACfnU,KAAKiM,QAAS,EAEdxV,GAAM,KACJuJ,KAAKY,MAAM,UAEP8U,GACF1V,KAAKS,SACP,GACC,MAtBMT,IAyBX,CAEAS,OAAAA,GAGE,OAFAT,KAAKY,MAAM,iBAEPZ,KAAKwU,gBAITxU,KAAKU,kBAELlH,SAASiM,KAAKmD,YAAY5I,KAAK4G,KAE/BvE,aAAarC,KAAKqU,OAClBrU,KAAKsJ,WAELtJ,KAAKY,MAAM,iBAVFZ,IAaX,CAEA4V,YAAAA,GAEE,OADA5V,KAAKuV,aACEvV,IACT,CAEA6V,YAAAA,GACE,MAAMJ,EAAWzV,KAAKG,KAAK,YACrBxJ,EAAQqJ,KAAKG,KAAK,SAExB,OAAIsV,GAAY,GAIhBzV,KAAKwV,WAAW7e,GAHPqJ,IAMX,CAEA6N,OAAAA,GAGE,OAFA7N,KAAKuV,aACLvV,KAAK0N,QACE1N,IACT,CAEAK,YAAAA,GACE,MAAMuG,EAAM5G,KAAK4G,IAoBjB,OAlBA5F,EACE4F,EACA,4BACA,aACA5G,KAAK4V,aACL5V,MACA,GAEFgB,EACE4F,EACA,4BACA,aACA5G,KAAK6V,aACL7V,MACA,GAEFgB,EAAG4F,EAAK,0BAA2B,QAAS5G,KAAK6N,QAAS7N,MAAM,GAEzDA,IACT,CAEAU,eAAAA,GACE,MAAMkG,EAAM5G,KAAK4G,IAMjB,OAJArH,EAAIqH,EAAK,aAAc5G,KAAK4V,cAC5BrW,EAAIqH,EAAK,aAAc5G,KAAK6V,cAC5BtW,EAAIqH,EAAK,QAAS5G,KAAK6N,SAEhB7N,IACT,EAGFkU,GAAQ3K,SAkBCtS,EAjBS,CACdyE,GAAI,GACJwH,KAAM,OACNwR,OAAQ,UACRC,OAAO,EACPP,OAAQ,GACRqB,SAAU,EACV9e,MAAO,EACPoI,QAAS,GACTmO,YAAa,GACb0H,UAAU,EACVT,SAAS,EACTU,0BAA0B,EAC1Ba,oBAAoB,EACpBC,YAAa,OA1dH,CAAC,OAAQ,UAAW,UAAW,SAgevCpe,SAAS2L,IACbgR,GAAQhR,GAAS3G,IACf,MAAMuZ,EAAS,CAAA,EACTpa,EAAKyD,EAAK,oBACVwW,EAAcpZ,EAAQoZ,aAAe,KAC3C,IAAIvB,EAAS7X,EAAQ6X,QAAU,GAyB/B,OAvBI3c,EAAS8E,GACXuZ,EAAO/W,QAAUxC,EAEbmX,GAAcnX,IAChBsB,EAAOiY,EAAQvZ,GAGnBuZ,EAAOpa,GAAKA,EACZoa,EAAO5S,KAAOA,EACd4S,EAAO1B,OAASA,EAChB0B,EAAO3B,SAAU,EACjB2B,EAAOH,YAAc,KACnBzB,GAAQxG,MAAMhS,EAAIia,EAAY,EAGhC1B,GAAW,IAAIC,GAAQ4B,GACvB9B,GAAUzc,SAAS+F,IACjB8W,GAAU9W,EAAKsJ,IAAIsK,aAAe,EAAE,IAEtC+C,GAASG,OAASA,EAClBH,GAASzG,OACTwG,GAAUvY,KAAKwY,IAERA,EAAQ,CAChB,IAIHC,GAAQxG,MAAQ,CAAChS,EAAIia,KACnB,MAAMI,EAAM/B,GAAUlb,OACtB,IACIkC,EACAkW,EAFA3V,GAAS,EAmBb,GAfAyY,GAAUzc,SAAQ,CAAC0c,EAAUjZ,KAEvBU,IAAOuY,EAASvY,KAClBwV,EAAe+C,EAASrN,IAAIsK,aAC5B3V,EAAQP,EAGJxE,EAAWmf,IACbA,EAAY/X,KAAKqW,GAGnBD,GAAUpU,OAAO5E,EAAG,GACtB,IAGE+a,GAAO,IAAgB,IAAXxa,GAAgBA,EAAQyY,GAAUlb,OAAS,EACzD,OAAO,EAMT,IAHAkC,EAAIO,EAGGP,EAAI+a,EAAM,EAAG/a,GAAK,EAAG,CAC1B,MAAMgb,EAAMhC,GAAUhZ,GAAG4L,IAEzBoP,EAAI1P,MAAW,IAAInL,SAAS6a,EAAI1P,MAAW,IAAG,IAAM4K,EAAe,GAAK,IAC1E,GAIFgD,GAAQ+B,MAAQ,KACd,IAAIjb,EAAIgZ,GAAUlb,OAAS,EAC3B,KAAOkC,GAAK,EAAGA,GAAK,EAClBgZ,GAAUhZ,GAAG0S,OACf,ECpkBF,MAAMwI,GACJnW,WAAAA,CAAYlH,EAAMsd,GAChBnW,KAAKnH,KAAOA,EAERrC,EAAW2f,KACbnW,KAAKmW,OAASA,EAElB,CAEAtX,OAAAA,GAGE,OAFAmB,KAAKmW,SAEEnW,IACT,ECbF,MAAMoW,GACJrW,WAAAA,GACEC,KAAKqW,SAAW,EAClB,CAEAC,GAAAA,CAAIzd,GACF,OAAOmH,KAAKqW,SAASjR,MAAMmR,GAAQA,EAAI1d,OAASA,GAClD,CAEAH,GAAAA,CAAI8d,GAGF,OAFAxW,KAAKqW,SAAS5a,KAAK+a,GAEZxW,IACT,CAEAyW,GAAAA,CAAI5d,GACF,MAAMwd,EAAWrW,KAAKqW,SAChBG,EAAUH,EAASjR,MAAMmR,GAAQA,EAAI1d,OAASA,IAC9C0C,EAAQib,EAAUH,EAAS1d,QAAQ6d,IAAY,EAMrD,OAJIjb,GAAS,GACX8a,EAASzW,OAAOrE,EAAO,GAGlByE,IACT,CAEAiW,KAAAA,GAGE,OAFAjW,KAAKqW,SAAW,GAETrW,IACT,CAEAnB,OAAAA,CAAQhG,GACN,MAAM2d,EAAUxW,KAAKqW,SAASjR,MAAMmR,GAAQA,EAAI1d,OAASA,IAMzD,OAJIrC,EAAWggB,eAAAA,EAAS3X,UACtB2X,EAAQ3X,UAGHmB,IACT,ECvCF,MAAM0W,GAAgBA,CAACC,EAAQC,GAAU,KACvC,MAAMlP,EAAQQ,GAAKyO,EAAOzO,KAAM,CAC9BlD,QAAS2R,EAAO3R,SAAW,UAC3BqC,MAAOsP,EAAOtP,OAAS,GACvBD,KAAMuP,EAAOvP,OAETsB,EAAU7C,EACd,IACA,CACE5N,UAAW,0BACXuS,KAAMmM,EAAOE,MAEfnP,GAEIoP,EAAUjR,EACd,MACA,CACE5N,UAAW,2BAA2B0e,EAAO9d,OAC7C,WAAY8d,EAAO9d,MAErB,CAAC8d,EAAOE,KAAOnO,EAAUhB,IAa3B,OAVAlP,EAASkP,EAAO,yBAEZkP,GACFpe,EAASse,EAAS,2BAGhBH,EAAOI,UACTve,EAASse,EAAS,4BAGbA,CAAO,ywGCVhB,MAAME,GAAW,2BACX3I,GAAS,yBACT+C,GAAS,yBAEf,MAAM6F,WAAgBnX,EACpBC,WAAAA,CAAYxD,GACV8M,QAEArJ,KAAKsJ,WAED/M,GACFyD,KAAKE,WAAW3D,EAEpB,CAEA+M,QAAAA,GAUE,OATAtJ,KAAKC,MAAQhJ,EAAUggB,GAAQ1N,UAE/BvJ,KAAK+W,UAAW,EAChB/W,KAAKiM,QAAS,EAEdjM,KAAK4G,IAAM,KACX5G,KAAKkX,QAAU,GACflX,KAAKqW,SAAW,KAETrW,IACT,CAEAE,UAAAA,CAAW3D,GACT,IAAIkN,EAgBJ,OAdAzJ,KAAKG,KAAK5D,GAEVyD,KAAK+W,SAAW/W,KAAKG,KAAK,YAC1BH,KAAKiM,OAASjM,KAAKG,KAAK,UACxBH,KAAKqW,SAAW,IAAID,GAEpB3M,EAAUzJ,KAAKG,KAAK,WAEhB3J,EAAWiT,IACbA,EAAQ7L,KAAKoC,MAGfA,KAAKI,SAASC,eAEPL,IACT,CAEAmX,WAAAA,CAAYte,GACV,MAAM8d,EAAS3W,KAAKsW,IAAIzd,GAExB,QAAK8d,GAIE5e,EAAS4e,EAAO/P,IAAKwK,GAC9B,CAEAgG,UAAAA,CAAWve,GACT,IAAI8d,EAEJ,OAAI9d,GACF8d,EAAS3W,KAAKsW,IAAIzd,GAEX8d,EAAOI,UAGT/W,KAAK+W,QACd,CAEAM,OAAAA,CAAQxe,GAEN,QADemH,KAAKsW,IAAIzd,EAE1B,CAEA6T,QAAAA,GACE,OAAO1M,KAAKiM,MACd,CAEAqL,WAAAA,CAAYX,GACV,MAAMY,EAAQvX,MACRmW,OAAEA,EAAMtd,KAAEA,GAAS8d,EACzB,IAEI1X,EACAsE,EAHAiT,EAAU,KACVvV,EAAU,KAId,OAAKkV,GAILlV,EAAUkV,EAAOlV,QACjBhC,EAAUkX,EAAOlX,SAAWe,KAExBxJ,EAAWyK,GACbsC,EAAWtC,EACFxJ,EAASwJ,KAClBsC,EAAW,WACTgU,EAAM3W,MAAMK,EAASpI,KAIrBrC,EAAW+M,KACbiT,EAAU,IAAIN,GAAQrd,EAAM0K,EAASiU,KAAKvY,KAGrCuX,GAlBEA,CAmBX,CAEAF,GAAAA,CAAIzd,GACF,OAAOmH,KAAKkX,QAAQ9R,MAAMuR,GAAWA,EAAO9d,OAASA,GACvD,CAEAuH,MAAAA,GACE,MAAMwJ,EAAU5J,KAAKG,KAAK,WACpB+W,EAAUlX,KAAKG,KAAK,YAAc,GAClCwM,EAAY3M,KAAKG,KAAK,aAuB5B,OArBAoF,IAEAvF,KAAK4G,IAAMf,EAAc,MAAO,CAC9BnK,GAAIyD,EAAK,mBACTlH,UAAW,mCAAmC0U,MAEhD3M,KAAK6J,OAAOqN,GACZ1d,SAASiM,KAAKwB,YAAYjH,KAAK4G,KAE3B5G,KAAKiM,QACPjM,KAAKsS,OAGHtS,KAAK+W,UACP/W,KAAKyX,UAGHjhB,EAAWoT,IACbA,EAAQhM,KAAKoC,MAGRA,IACT,CAEA8J,KAAAA,GAEE,OADA9J,KAAK4G,IAAIpL,UAAY,GACdwE,IACT,CAEA6J,MAAAA,CAAOqN,GACL,MAAMN,EAAU5W,KAAKG,KAAK,WACpBuG,EAAYlN,SAASmN,yBAyB3B,OAvBAuQ,EAAQ3f,SAASof,IACf,MAAMG,EAAUJ,GAAcC,EAAQC,GAChCJ,EAAUxW,KAAKsX,YAAYX,IAC3B9d,KAAEA,EAAIke,SAAEA,EAAQ9X,QAAEA,GAAY0X,EAEpCjQ,EAAUO,YAAY6P,GAEjB9W,KAAKqX,QAAQxe,KAChBmH,KAAKkX,QAAQzb,KAAK,CAChBmL,IAAKkQ,EACLje,OACAke,SAAUA,IAAY,EACtB9X,QAASA,GAAWe,OAGlBwW,GACFxW,KAAKqW,SAAS3d,IAAI8d,GAEtB,IAGFxW,KAAK4G,IAAIK,YAAYP,GAEd1G,IACT,CAEA+J,OAAAA,GAEE,OADAvQ,SAASiM,KAAKmD,YAAY5I,KAAK4G,KACxB5G,IACT,CAEAQ,OAAAA,CAAQ0W,GAGN,OAFAlX,KAAKG,KAAK,CAAE+W,YACZlX,KAAK8J,QAAQD,OAAOqN,GACblX,IACT,CAEAtH,GAAAA,CAAIie,GACF,MAAM/P,EAAM5G,KAAK4G,IACXF,EAAYlN,SAASmN,yBACrBuQ,EAAUlX,KAAKG,KAAK,YAAc,IAClCtH,KAAEA,EAAIke,SAAEA,EAAQ9X,QAAEA,GAAY0X,EAC9BH,EAAUxW,KAAKsX,YAAYX,GAC3Be,EAAQf,IACZ,MAAMG,EAAUJ,GAAcC,GAE9BjQ,EAAUO,YAAY6P,GAEtBI,EAAQzb,KAAKkb,GACb3W,KAAKkX,QAAQzb,KAAK,CAChBmL,IAAKkQ,EACLje,OACAke,SAAUA,IAAY,EACtB9X,QAASA,GAAWe,KACpBwW,YAGEA,GACFxW,KAAKqW,SAAS3d,IAAI8d,EACpB,EAcF,OAXI3f,EAAS8f,GACXe,EAAKf,GACI5f,EAAQ4f,IACjBA,EAAOpf,SAAS+F,IACVzG,EAASyG,IACXoa,EAAKpa,EACP,IAGJsJ,EAAIK,YAAYP,GAET1G,IACT,CAEAoI,MAAAA,CAAOvP,GACL,MAAM+N,EAAM5G,KAAK4G,IACXsQ,EAAUlX,KAAKkX,QACfP,EAAS3W,KAAKsW,IAAIzd,GACxB,IAAI0C,GAAS,EAEb,OAAKob,GAILpb,EAAQ2b,EAAQve,QAAQge,GAEpBpb,GAAS,IACX2b,EAAQtX,OAAOrE,EAAO,GACtByE,KAAKG,KAAK,WAAWP,OAAOrE,EAAO,IAGrCyE,KAAK2X,SAAS9e,GACd+N,EAAIgC,YAAY+N,EAAO/P,KAEhB5G,MAbEA,IAcX,CAEA2X,QAAAA,CAAS9e,GACP,MAAM8d,EAAS3W,KAAKsW,IAAIzd,GAClB2d,EAAUxW,KAAKqW,SAASC,IAAIzd,GAElC,OAAK8d,GAAUA,EAAOI,WAItBJ,EAAOI,UAAW,EAEdP,GACFxW,KAAKqW,SAASI,IAAID,GAGpBhe,EAASme,EAAO/P,IAAKoQ,KATZhX,IAYX,CAEA4X,OAAAA,CAAQ/e,GACN,MAAM8d,EAAS3W,KAAKsW,IAAIzd,GAClB2d,EAAUxW,KAAKqW,SAASC,IAAIzd,GAElC,OAAK8d,GAAWA,EAAOI,UAIvBJ,EAAOI,UAAW,EAEdP,GACFxW,KAAKqW,SAAS3d,IAAI8d,GAGpBrO,GAAYwO,EAAO/P,IAAKoQ,IAEjBhX,MAXEA,IAYX,CAEAyX,OAAAA,CAAQ5e,GACN,MAAMke,EAAW/W,KAAKG,KAAK,iBAc3B,OAZItH,EACFmH,KAAK2X,SAAS9e,IAEdL,EAASwH,KAAK4G,IAAKoQ,IACnBhX,KAAKU,kBACLV,KAAK+W,UAAW,EAEZvgB,EAAWugB,IACbA,EAASnZ,KAAKoC,OAIXA,IACT,CAEA6X,MAAAA,CAAOhf,GACL,MAAMif,EAAU9X,KAAKG,KAAK,gBAc1B,OAZItH,EACFmH,KAAK4X,QAAQ/e,IAEbmH,KAAK+W,UAAW,EAChB5O,GAAYnI,KAAK4G,IAAKoQ,IACtBhX,KAAKK,eAED7J,EAAWshB,IACbA,EAAQla,KAAKoC,OAIVA,IACT,CAEAqS,IAAAA,CAAKxZ,GACH,MAAM4U,EAASzN,KAAKG,KAAK,eACnBwW,EAAS3W,KAAKsW,IAAIzd,GAClB+N,EAAM5G,KAAK4G,IAEjB,GAAI/N,EAAM,CACR,IAAK8d,EACH,OAAO3W,KAGTmI,GAAYwO,EAAO/P,IAAKyH,GAC1B,MACElG,GAAYvB,EAAKyH,IACjBrO,KAAKiM,QAAS,EAEVzV,EAAWiX,IACbhX,GAAM,KACJgX,EAAO7P,KAAKoC,KAAK,GAChB,KAIP,OAAOA,IACT,CAEAsS,IAAAA,CAAKzZ,GACH,MAAMoT,EAASjM,KAAKG,KAAK,eACnBwW,EAAS3W,KAAKsW,IAAIzd,GAClB+N,EAAM5G,KAAK4G,IAEjB,GAAI/N,EAAM,CACR,IAAK8d,EACH,OAAO3W,KAGTxH,EAASme,EAAO/P,IAAKyH,GACvB,MACE7V,EAASoO,EAAKyH,IACdrO,KAAKiM,QAAS,EAEVzV,EAAWyV,IACbxV,GAAM,KACJwV,EAAOrO,KAAKoC,KAAK,GAChB,KAIP,OAAOA,IACT,CAEA2N,MAAAA,CAAO9U,GAOL,OANImH,KAAK0M,WACP1M,KAAKqS,KAAKxZ,GAEVmH,KAAKsS,KAAKzZ,GAGLmH,IACT,CAEA8P,SAAAA,CAAUjX,GACR,MAAM8d,EAAS3W,KAAKsW,IAAIzd,GACxB,IAAIie,EAEJ,OAAKH,GAILG,EAAUH,EAAO/P,IAEb7O,EAAS+e,EAAS1F,IACpBjJ,GAAY2O,EAAS1F,IAErB5Y,EAASse,EAAS1F,IAGbpR,MAXEA,IAYX,CAEAS,OAAAA,GACE,MAAMkK,EAAgB3K,KAAKG,KAAK,iBAC1ByK,EAAe5K,KAAKG,KAAK,gBAa/B,OAXI3J,EAAWmU,IACbA,EAAc/M,KAAKoC,MAGrBA,KAAKqW,SAASJ,QACdjW,KAAKU,kBAAkBqJ,UAAUT,WAE7B9S,EAAWoU,IACbA,EAAahN,KAAKoC,MAGbA,IACT,CAEAnB,OAAAA,CAAQhG,GACN,OAAImH,KAAKoX,WAAWve,IAIpBmH,KAAKqW,SAASxX,QAAQhG,GAHbmH,IAMX,CAEA+X,SAAAA,CAAU7T,GACR,MAAM4S,EAAU5S,EAAIG,eACpB,IAAIkS,EAAM,GAUV,OARIO,IACFP,EAAMO,EAAQvF,aAAa,YAEvBgF,GACFvW,KAAKnB,QAAQ0X,IAIVvW,IACT,CAEAgY,cAAAA,EAAe7e,IAAEA,EAAG8R,IAAEA,EAAG9I,IAAEA,IACzB,MAAMjH,EAAUgH,KAAK+V,KAAK9e,GAa1B,OAXI+B,GAAW+P,GACbjL,KAAKsS,KAAK,MACVtS,KAAKqS,KAAK,SACDnX,GAAWiH,GACpBnC,KAAKsS,KAAK,QACVtS,KAAKqS,KAAK,OACDnX,EAAU+P,GAAO/P,EAAUiH,IACpCnC,KAAKqS,KAAK,MACVrS,KAAKqS,KAAK,SAGLrS,IACT,CAEAkY,eAAAA,EAAgB/e,IAAEA,EAAG8R,IAAEA,EAAG9I,IAAEA,IAE1B,OADAnC,KAAKgY,eAAe,CAAE7e,MAAK8R,MAAK9I,QACzBnC,IACT,CAEAmY,WAAAA,CAAYjB,GAMV,OALAlX,KAAKG,KAAK,CACR+W,YAEFlX,KAAKQ,QAAQ0W,GAENlX,IACT,CAEAoY,cAAAA,CAAevf,GAEb,OADAmH,KAAKoI,OAAOvP,GACLmH,IACT,CAEAK,YAAAA,GACE,MAAM6W,EAAUlX,KAAKG,KAAK,YAAc,GAClCyG,EAAM5G,KAAK4G,IAEjB,OAAKsQ,GAAWA,EAAQpe,OAAS,IAIjCkI,EAAG4F,EAAK,2BAA4B,QAAS5G,KAAK+X,UAAW/X,MAAM,GAEnEA,KAAKe,IAAI,iBAAkBf,KAAKkY,iBAChClY,KAAKe,IAAI,qBAAsBf,KAAKmY,aACpCnY,KAAKe,IAAI,wBAAyBf,KAAKoY,gBACvCpY,KAAKe,IAAI,iBAAkBf,KAAK2N,SARvB3N,IAWX,CAEAU,eAAAA,GACE,MAAMwW,EAAUlX,KAAKG,KAAK,YAAc,GAClCyG,EAAM5G,KAAK4G,IAEjB,OAAKsQ,GAAWA,EAAQpe,OAAS,IAIjCyG,EAAIqH,EAAK,2BAA4B5G,KAAK+X,WAE1C/X,KAAKmB,KAAK,kBACVnB,KAAKmB,KAAK,sBACVnB,KAAKmB,KAAK,yBACVnB,KAAKmB,KAAK,mBARDnB,IAWX,EAGFiX,GAAQ1N,SAiBCtS,EAhBS,CACd0V,UAAW,MACXV,QAAQ,EACR8K,UAAU,EACVH,SAAS,EACTM,QAAS,GACTzN,QAAS,KACTG,QAAS,KACTmE,YAAa,KACbC,YAAa,KACbqK,cAAe,KACfC,aAAc,KACd3N,cAAe,KACfC,aAAc,OC9iBlB,MAAM2N,GACJxY,WAAAA,CAAYxD,GACVyD,KAAKwY,UAAY,IAAIC,yBAEjBlc,GACFyD,KAAKE,WAAW3D,EAEpB,CAEAmc,WAAAA,CAAYnc,GAyBV,OAxBIA,EAAQoc,MACV3Y,KAAK4Y,QAAQrc,EAAQoc,MAGnBpc,EAAQsc,OACV7Y,KAAK8Y,SAASvc,EAAQsc,OAGpBtc,EAAQwc,MACV/Y,KAAKgZ,QAAQzc,EAAQwc,MAGnBxc,EAAQzB,MACVkF,KAAKiZ,QAAQ1c,EAAQzB,MAGnByB,EAAQ2c,OACVlZ,KAAKmZ,SAAS5c,EAAQ2c,OAGpB3c,EAAQ6c,QACVpZ,KAAKqZ,UAAU9c,EAAQ6c,QAGlBpZ,IACT,CAEAE,UAAAA,CAAW3D,GAET,OADAyD,KAAK0Y,YAAYnc,GAAS+c,gBACnBtZ,IACT,CAEAuZ,UAAAA,GACE,OAAOC,gBAAgBC,QACzB,CAEAC,SAAAA,GACE,OAAOF,gBAAgBG,OACzB,CAEAC,QAAAA,GACE,OAAOJ,gBAAgBK,MACzB,CAEAC,SAAAA,GACE,OAAON,gBAAgBM,WACzB,CAEAlB,OAAAA,CAAQD,GAEN,OADA3Y,KAAKwY,UAAUG,KAAOA,EACf3Y,IACT,CAEA8Y,QAAAA,CAASD,GAEP,OADA7Y,KAAKwY,UAAUK,MAAQA,EAChB7Y,IACT,CAEAgZ,OAAAA,CAAQD,GAEN,OADA/Y,KAAKwY,UAAUO,KAAOA,EACf/Y,IACT,CAEAiZ,OAAAA,CAAQne,GAEN,OADAkF,KAAKwY,UAAU1d,KAAOA,EACfkF,IACT,CAEAmZ,QAAAA,CAASD,GAEP,OADAlZ,KAAKwY,UAAUU,MAAQA,EAChBlZ,IACT,CAEAqZ,SAAAA,CAAUD,GAER,OADApZ,KAAKwY,UAAUY,OAASA,EACjBpZ,IACT,CAEA+Z,KAAAA,CAAMjf,GAOJ,OANIA,GACFkF,KAAKiZ,QAAQne,GAGf0e,gBAAgBO,MAAM/Z,KAAKwY,WAEpBxY,IACT,CAEAga,KAAAA,GAEE,OADAR,gBAAgBQ,QACTha,IACT,CAEAia,MAAAA,GAEE,OADAT,gBAAgBS,SACTja,IACT,CAEAka,MAAAA,GAGE,OAFAV,gBAAgBU,SAChBla,KAAKiZ,QAAQ,IACNjZ,IACT,CAEAsZ,aAAAA,GACE,MASMd,EAAYxY,KAAKwY,UACjB2B,EAASna,KAkBf,MA5ByB,CACvB,WACA,MACA,QACA,QACA,OACA,QACA,UAKezI,SAASsB,IACxB2f,EAAU,KAAK3f,KAAWgI,IACxBC,EAAQjI,EAAM,CACZgI,QACAsZ,UACA,CACH,IAGHX,gBAAgBY,gBAAmBvZ,IACjCC,EAAQ,gBAAiB,CACvBD,QACAsZ,UACA,EAGGna,IACT,EAGFuY,GAAO8B,UACE,oBAAqBxY,OCpJ9B,MAAMyY,GAAyBA,CAACC,EAAgBC,KAC9C,IAAI3iB,EACA4iB,EAAWF,EAEf,KAAOE,GACL5iB,EAAU4iB,EAAS5iB,QAAQwO,cAEX,WAAZxO,GAAoC,UAAZA,GAC1BW,EAASiiB,EAAU,0BAInBA,EADED,EACSC,EAASC,uBAETD,EAASE,kBAExB,o3GCMF,MAAMC,GAAoB,wBAE1B,MAAMC,WAAe/a,EACnBC,WAAAA,CAAYxD,GACV8M,QAEArJ,KAAKsJ,WAED/M,GACFyD,KAAKE,WAAW3D,EAEpB,CAEA+M,QAAAA,GAcE,OAbAtJ,KAAKC,MAAQhJ,EAAU4jB,GAAOtR,UAC9BvJ,KAAK8a,SAAU,EAEf9a,KAAK+a,QAAU,KACf/a,KAAK4G,IAAM,KACX5G,KAAKgb,OAAS,KACdhb,KAAKoM,OAAS,KACdpM,KAAKrD,SAAW,KAChBqD,KAAKib,UAAY,KAEjBjb,KAAKkb,QAAU,KACflb,KAAKma,OAAS,KAEPna,IACT,CAEAE,UAAAA,CAAW3D,GACT,IAAI4H,EAYJ,OAVAnE,KAAKG,KAAK5D,GAEV4H,EAASnE,KAAKG,KAAK,UAEf1I,EAAS0M,GACXnE,KAAK+a,QAAUvhB,SAASC,cAAc0K,GAC7BxM,EAAUwM,KACnBnE,KAAK+a,QAAU5W,GAGZnE,KAAK+a,SAINxC,GAAO8B,YACTra,KAAKma,OAAS,IAAI5B,IAGpBvY,KAAKI,SAASC,eAEPL,MATEA,IAUX,CAEAuZ,UAAAA,GAAa,IAAA4B,EACX,OAAOnb,YAAY,QAARmb,EAAJnb,KAAMma,cAANgB,IAAYA,OAAZA,EAAAA,EAAc5B,YACvB,CAEAnZ,MAAAA,GAEE,OADAJ,KAAKob,cAAcvR,OAAO7J,KAAK+a,SACxB/a,IACT,CAEA8J,KAAAA,GAEE,OADA9J,KAAKrD,SAASnB,UAAY,GACnBwE,IACT,CAEA6J,MAAAA,CAAOwD,GACL,MAAM3G,EAAYlN,SAASmN,yBACrB9C,EAAS/G,EAAAC,EAAOsQ,EAASgO,WAAU,GAAM9d,UAU/C,OARA9G,GAAM,KACJoN,EAAUtM,SAASyM,IACjB0C,EAAUO,YAAYjD,EAAO,IAG/BhE,KAAKrD,SAASsK,YAAYP,EAAU,IAG/B1G,IACT,CAEA+J,OAAAA,GACE,MAAMnD,EAAM5G,KAAK4G,IACXsU,EAAUlb,KAAKkb,QAUrB,OARItU,GACFpN,SAASiM,KAAKmD,YAAYhC,GAGxBsU,GACFA,EAAQza,UAGHT,IACT,CAEAQ,OAAAA,GAEE,OADAR,KAAK8J,QAAQD,OAAO7J,KAAK+a,SAClB/a,IACT,CAEAsb,gBAAAA,GAEE,OAAKzZ,OAAO0Z,gBAAmBjI,MAI/BtT,KAAKib,UAAUO,QACb,CAEEC,MAAO,CAAC,MAAO,QAEjB,CAEEC,SAAU,IAAIH,eAAe,CAC3Bxd,OAAQiC,KAAKrD,SACbgf,KAAM,YAKL3b,MAjBEA,IAkBX,CAEAob,WAAAA,GACE,MAAML,EAAU/a,KAAK+a,QAEf3T,EADSkM,KACO,GAAK,GAC3B,IACI1M,EACAoU,EACA5O,EACAzP,EACAse,EACAR,EANAzO,EAAQhM,KAAKG,KAAK,SAQtB8a,EAAYpV,EAAc,MAAO,CAC/B5N,UAAW,6BAEb+H,KAAKib,UAAYA,EAEjB7O,EAAS2O,EAAQthB,cAAc,MAE3B9B,EAAUqU,KACZI,EAASJ,GAGPrU,EAAUyU,KACZJ,EAAQI,EAAO5F,WAGjB4F,EAASvG,EACP,KACA,CACE5N,UAAW,yBAEb+T,GAEFhM,KAAKoM,OAASA,EAEdzP,EAAWkJ,EACT,UACA,CACEnK,GAAI,0BACJzD,UAAW,2BAEbqb,KAAa,GAAK,CAAC2H,EAAUI,cAE/Brb,KAAKrD,SAAWA,EAEhBqe,EAASnV,EACP,MACA,CACEnK,GAAI,wBACJzD,UAAW,yBAEb,CAACmU,EAAQzP,IAEXqD,KAAKgb,OAASA,EAEd,MAAM9D,EAAU,GA8DhB,OA5DAA,EAAQzb,KAAK,CACX5C,KAAM,QACNqP,KAAM,QACNd,OACA+O,OAAQ,CACNlX,QAASe,KACTiB,QAASjB,KAAK4b,SAIdrD,GAAO8B,WAAara,KAAKG,KAAK,eAChC+W,EAAQzb,KAAK,CACX5C,KAAM,QACNqP,KAAM,QACNd,OACA+O,OAAQ,CACNlX,QAASe,KACTiB,QAASjB,KAAK+Z,SAKpB7C,EAAQzb,KAAK,CACX5C,KAAM,OACNqP,KAAM,QACNd,OACA+O,OAAQ,CACNlX,QAASe,KACTiB,QAASjB,KAAK6b,QAIlB7b,KAAKkb,QAAU,IAAIjE,GAAQ,CACzBtK,UAAW,MACXuK,YAGFtQ,EAAMf,EACJ,UACA,CACEnK,GAAI,iBACJzD,UAAW,wCAEb,CAACgjB,EAAWD,EAAQhb,KAAKkb,QAAQtU,MAEnC5G,KAAK4G,IAAMA,EAEXpN,SAASiM,KAAKwB,YAAYL,GAE1B5G,KAAKsb,mBAEL7kB,GAAM,KAEJgkB,EAAW7T,EAAI8T,uBACfJ,GAAuBG,GAAU,GAEjCA,EAAW7T,EAAI+T,mBACfL,GAAuBG,EAAS,IAG3Bza,IACT,CAEA8b,KAAAA,GACE,MAAMC,EAAS,iBACTC,EAAU,GAAGD,aACb1N,EAAS,GAAG0N,WACZnV,EAAM5G,KAAK4G,IACXqV,EAAYziB,SAASE,iBAAiB,2BACtCwiB,EAAkBlc,KAAKG,KAAK,oBAAsBya,GAExD,OAAI5a,KAAK8a,UAAYlU,IAIrBqV,EAAU1kB,SAASkjB,IACjBjiB,EAASiiB,EAAUpM,EAAO,IAE5B7V,EAASoO,EAAKoV,GACd7T,GAAYvB,EAAKyH,GACjBrO,KAAKkb,QAAQ7I,OACbrS,KAAK8a,SAAU,EAEf5G,GAAQiI,KAAK,CACXxH,OAAO,EACP5V,QAASmd,IAGXlc,KAAKY,MAAM,iBAhBFZ,IAmBX,CAEA6b,IAAAA,GACE,MAAMO,EAAQ,QACRL,EAAS,iBACTC,EAAU,GAAGD,aACb1N,EAAS,GAAG0N,WACZnV,EAAM5G,KAAK4G,IACXqV,EAAYziB,SAASE,iBAAiB,2BACtCygB,EAASna,KAAKma,OACde,EAAUlb,KAAKkb,QAErB,OAAKlb,KAAK8a,SAAYlU,GAItBpO,EAASoO,EAAKyH,GACdlG,GAAYvB,EAAKoV,GACjBC,EAAU1kB,SAASkjB,IACjBtS,GAAYsS,EAAUpM,EAAO,IAE/B6M,EAAQ5I,OACRtS,KAAK8a,SAAU,EAEXX,IACEe,EAAQ/D,YAAYiF,IACtBlB,EAAQpL,UAAUsM,GAGpBjC,EAAOD,UAGTla,KAAKY,MAAM,eAEJZ,MArBEA,IAsBX,CAEA2N,MAAAA,GAOE,OANI3N,KAAK8a,QACP9a,KAAK6b,OAEL7b,KAAK8b,QAGA9b,IACT,CAEA+Z,KAAAA,GACE,MAAMjf,EAAOkF,KAAKrD,SAAS6J,UACrB2T,EAASna,KAAKma,OAEpB,OAAK5B,GAAO8B,WAAcF,GAI1Bna,KAAKkb,QAAQpL,UAAU,SAEnB9P,KAAKuZ,aACPY,EAAOD,SAEPC,EAAOJ,MAAMjf,GAGRkF,MAXEA,IAYX,CAEA4b,KAAAA,GACE,OAAKplB,EAAWolB,QAIhBA,QAEO5b,MALEA,IAMX,CAEAS,OAAAA,GAGE,OAFYT,KAAK4G,KAMjB5G,KAAKU,kBAAkBqJ,UAAUT,WAE1BtJ,MALEA,IAMX,CAEAqc,OAAAA,GAEE,OADArc,KAAK4b,QACE5b,IACT,CAEAsc,cAAAA,GAEE,OADAtc,KAAK2N,SACE3N,IACT,CAEAuc,aAAAA,CAAcrY,GAQZ,OALgB,KAFAA,EAAIsY,SAEExc,KAAK8a,UACzB9a,KAAK2N,SACL1T,EAAKiK,IAGAlE,IACT,CAEAkL,SAAAA,GAGE,OAFAlL,KAAKQ,UAEER,IACT,CAEAK,YAAAA,GAGE,OAFYL,KAAK4G,KAMjBqH,GAAGzU,SAAU,QAASwG,KAAKuc,cAAevc,MAAM,GAEhDA,KAAKe,IAAI,uBAAwBf,KAAKqc,SACtCrc,KAAKe,IAAI,yBAA0Bf,KAAKsc,gBACxCtc,KAAKe,IAAI,eAAgBf,KAAKqc,SAC9Brc,KAAKe,IAAI,iBAAkBf,KAAKkL,WAChClL,KAAKe,IAAI,eAAgBf,KAAK8b,OAC9B9b,KAAKe,IAAI,cAAef,KAAK6b,MAC7B7b,KAAKe,IAAI,gBAAiBf,KAAK2N,QAExB3N,MAbEA,IAcX,CAEAU,eAAAA,GAGE,OAFYV,KAAK4G,KAMjBrH,EAAI/F,SAAU,QAASwG,KAAKuc,eAE5Bvc,KAAKmB,KAAK,wBACVnB,KAAKmB,KAAK,0BACVnB,KAAKmB,KAAK,kBACVnB,KAAKmB,KAAK,iBAEHnB,MAVEA,IAWX,SAGF6a,GAAOtR,SAQEtS,EAPS,CACdkN,OAAQ,GACR6H,MAAO,GACPkQ,gBAAiBtB,GACjB6B,YAAY,ICvbhB,MAAMC,WAAgB5c,EACpBC,WAAAA,CAAYxD,GACV8M,QAEArJ,KAAK2c,QAAU,SACf3c,KAAKsJ,WAED/M,GACFyD,KAAKE,WAAW3D,EAEpB,CAEA+M,QAAAA,GACE,MAAM/M,EAAUmgB,GAAQnT,SAaxB,OAXAvJ,KAAKC,MAAQhJ,EAAUsF,GACvByD,KAAKrD,SAAW,KAChBqD,KAAK3G,eAAiB,KACtB2G,KAAKkX,QAAU,GAEflX,KAAK4c,QAAU,KACf5c,KAAK6c,OAAS,KACd7c,KAAKwT,UAAY,KACjBxT,KAAK8c,OAAS,KACd9c,KAAKkb,QAAU,KAERlb,IACT,CAEAE,UAAAA,CAAW3D,GACT,IAAIC,EAAiB,GACjBtD,EAAgB,GAChByD,EAAW,KAkBf,OAhBAqD,KAAKG,KAAK5D,GAEVC,EAAiBwD,KAAKG,KAAK,kBAC3BjH,EAAgB8G,KAAKG,KAAK,iBAEtB1I,EAAS+E,GACXG,EAAWnD,SAASC,cAAc+C,GACzB7E,EAAU6E,KACnBG,EAAWH,GAEbwD,KAAKrD,SAAWA,EAChBqD,KAAK3G,eAAiBe,EAAiBlB,GAEvC8G,KAAKY,MAAM,UAAS2T,EAAO,CAAA,EAAAvU,KAAKG,SAChCH,KAAKI,SAASC,eAEPL,IACT,CAEA+c,UAAAA,GACE,MAAMze,EAAW0B,KAAKG,KAAK,YACrB0c,EAAS7c,KAAK6c,OACdrJ,EAAYxT,KAAKwT,UAGvB,QAFcxT,KAAK2J,QAEP,KAIK,aAAbrL,GACMue,EAAOnQ,YAEP8G,EAAU9G,WAEtB,CAEApQ,WAAAA,CAAYI,GAAmB,GAC7B,MAAMF,EAAiBwD,KAAKrD,SACtBF,EAAWuD,KAAKG,KAAK,YACrB1F,EAAWuF,KAAKG,KAAK,YACrBzF,EAAoBsF,KAAKG,KAAK,qBAEpC,OAAO7D,EAAY,CACjBE,iBACAC,WACAhC,WACAC,oBACAgC,oBAEJ,CAEAiN,KAAAA,GACE,OAAO3J,KAAK1D,cAAcxD,MAC5B,CAEAsH,MAAAA,GACE,MAAM4c,EAAahd,KAAKG,KAAK,cACvB9G,EAAiB2G,KAAK3G,eAc5B,OAZA2G,KAAKid,gBAAgBC,iBAAiBC,mBAAmBC,iBAErD/jB,GAAkB2jB,GACpBhd,KAAKY,MAAM,iBAAkB,CAC3BzH,IAAKE,EAAeM,UACpBsR,IAAK,EACL9I,IAAK9I,EAAeU,eAIxBiG,KAAKY,MAAM,WAEJZ,IACT,CAEAid,aAAAA,GACE,MAAMI,EAASrd,KAAKG,KAAK,UAEzB,OAAKkd,EAAOlZ,QAIZ3L,EAASwH,KAAKrD,SAAU,mBAExBqD,KAAK8c,OAAS,IAAIjC,GAAOwC,GAElBrd,MAPEA,IAQX,CAEAkd,cAAAA,GACE,MAAM1gB,EAAiBwD,KAAKG,KAAK,kBAC3B1D,EAAWuD,KAAKG,KAAK,YACrB4K,EAAe/K,KAAKG,KAAK,gBACzBjH,EAAgB8G,KAAKG,KAAK,iBAC1B1F,EAAWuF,KAAKG,KAAK,YACrB8J,EAAYjK,KAAKG,KAAK,aACtB2K,EAAc9K,KAAKG,KAAK,eACxBzF,EAAoBsF,KAAKG,KAAK,qBAC9B+J,EAAmBlK,KAAKG,KAAK,oBAcnC,OAZAH,KAAK4c,QAAU,IAAIxT,GAAQ,CACzB5M,iBACAuO,eACA7R,gBACAuD,WACAhC,WACAwP,YACAa,cACApQ,oBACAwP,qBAGKlK,IACT,CAEAmd,gBAAAA,GACE,MAAMnR,EAAQhM,KAAKG,KAAK,SAClB4K,EAAe/K,KAAKG,KAAK,gBACzBjH,EAAgB8G,KAAKG,KAAK,iBAC1B+M,EAAclN,KAAKG,KAAK,eACxB1F,EAAWuF,KAAKG,KAAK,YACrBwP,EAAmB3P,KAAKG,KAAK,oBAC7B2N,EAAoB9N,KAAKG,KAAK,qBAC9Bmd,EAAoBtd,KAAKG,KAAK,qBAC9B7B,EAAW0B,KAAKG,KAAK,YACrBwM,EAAY3M,KAAKG,KAAK,aACtB8R,EAAcjS,KAAKG,KAAK,eACxByN,EAAc5N,KAAKG,KAAK,eACxB2K,EAAc9K,KAAKG,KAAK,eACxBwJ,EAAQ3J,KAAK2J,QACnB,IACI4T,EADAnO,EAAgBpP,KAAKG,KAAK,iBAG9B,OAAIwJ,EAAQ,IAIZ4T,EAAU,CACRrkB,gBACAuB,WACAkV,mBACArR,WACA0N,QACAjB,eACApQ,SAAUqF,KAAK1D,cACf2V,cACArE,cACA9C,eAGe,aAAbxM,GACF0B,KAAK6c,OAAS,IAAI9Q,GAAO,CACvBY,YACAX,QACA5E,KAAM,OACN0F,WAAW,EACXC,YAAY,EACZe,oBACAZ,cACAa,YAAaA,KACK/N,KAAKkb,QACbvN,QAAQ,IAGpByB,EAAgBpP,KAAK6c,OAAOvQ,MAExBgR,GACFtd,KAAK6c,OAAOrP,QAGd+P,EAAQrQ,YAAcA,EAGxBqQ,EAAQnO,cAAgBA,EACxBpP,KAAKwT,UAAY,IAAIhF,GAAU+O,IAxCtBvd,IA2CX,CAEAod,cAAAA,GACE,MAAM9e,EAAW0B,KAAKG,KAAK,YACrB6c,EAAahd,KAAKG,KAAK,cACvBmd,EAAoBtd,KAAKG,KAAK,qBAC9BwM,EAAY3M,KAAKG,KAAK,aACtBqd,EAAWxd,KAAKG,KAAK,YACrBsd,EAAMzd,KAAKG,KAAK,OAChBud,EAAO1d,KAAKG,KAAK,QACjBwd,EAAS3d,KAAKG,KAAK,UACnByd,EAAQ5d,KAAKG,KAAK,SAClBkd,EAASrd,KAAKG,KAAK,UACnBwJ,EAAQ3J,KAAK2J,QACbkU,EAAK,CACThlB,KAAM,KACNqP,KAAM,KACNd,KAAM,GACN+O,OAAQ,CACNlX,QAASe,KACTiB,QAASjB,KAAK8d,QAGZC,EAAO,CACXllB,KAAM,WACNqP,KAAM,WACNd,KAAM,GACNyP,KAAM2G,GAEFQ,EAAM,CACVnlB,KAAM,SACNqP,KAAM,SACNd,KAAM,GACNyP,KAAM4G,GAEFtS,EAAO,CACXtS,KAAM,OACNqP,KAAM,OACNd,KAAM,GACNyP,KAAM6G,GAEFO,EAAS,CACbplB,KAAM,SACNqP,KAAM,SACNd,KAAM,GACNyP,KAAM8G,GAEFO,EAAO,CACXrlB,KAAM,SACNqP,KAAM,OACNd,KAAM,GACN+O,OAAQ,CACNlX,QAASe,KACTiB,QAASjB,KAAK2N,SAGZqO,EAAU,CACdnjB,KAAM,UACNqP,KAAM,OACNd,KAAM,GACN+O,OAAQ,CACNlX,QAASe,KACTiB,QAAS,2BAGPkd,EAAQ,CACZtlB,KAAM,QACNqP,KAAM,QACNd,KAAM,GACN+O,OAAQ,CACNlV,QAAS,yBAGPmd,EAAO,CACXvlB,KAAM,OACNqP,KAAM,OACNd,KAAM,GACN+O,OAAQ,CACNlX,QAASe,KACTiB,QAASjB,KAAKqe,WAGZnH,EAAU,GAEhB,OAAK8F,GAIL9F,EAAQzb,KAAKoiB,GACTlU,EAAQ,GACVuN,EAAQzb,KAAKyiB,GAEXV,GACFtG,EAAQzb,KAAKsiB,GAEXN,GACFvG,EAAQzb,KAAKuiB,GAEXN,GACFxG,EAAQzb,KAAK0P,GAEXwS,GACFzG,EAAQzb,KAAKwiB,GAEXZ,EAAOlZ,SACT+S,EAAQzb,KAAKugB,GACTxlB,EAAWolB,QACb1E,EAAQzb,KAAK0iB,KAGbP,aAAK,EAALA,EAAO9kB,QAAS,GAClBoe,EAAQzb,KAAIlF,MAAZ2gB,EAAOpa,EAAAC,EAAS6gB,IAElB1G,EAAQzb,KAAK2iB,GACbpe,KAAKkX,QAAO,GAAAoH,OAAOpH,GAEnBlX,KAAKkb,QAAU,IAAIjE,GAAQ,CACzBtK,YACAuK,YAGe,aAAb5Y,GAA2Bgf,GAC7Btd,KAAKkb,QAAQ5I,OAGRtS,MAxCEA,IAyCX,CAEAQ,OAAAA,GACE,MAAM7F,EAAWqF,KAAK1D,cAQtB,OANA0D,KAAKY,MAAM,kBAAmBjG,GAC9BqF,KAAKY,MAAM,oBAAqBjG,GAChCqF,KAAKY,MAAM,kBAEXZ,KAAKY,MAAM,UAAWjG,GAEfqF,IACT,CAEAue,SAAAA,CAAU5H,GACR,MAAMO,EAAUlX,KAAKkX,QAKrB,OAHAA,EAAQtX,QAAQ,EAAG,EAAG+W,GACtB3W,KAAKY,MAAM,qBAAsBsW,GAE1BlX,IACT,CAEAwe,YAAAA,CAAa3lB,GAEX,OADAmH,KAAKY,MAAM,wBAAyB/H,GAC7BmH,IACT,CAEA8d,KAAAA,GACE,MAAMhT,EAAc9K,KAAKG,KAAK,eACxB+a,EAAUlb,KAAKkb,QACf1H,EAAYxT,KAAKwT,UACjB7J,EAAQ3J,KAAK2J,QAqBnB,OALIA,EAAQ,IACV6J,EAAUrE,SAAU,GAEtBnP,KAAK/G,SAAS,GAlBGwlB,KACfvD,EAAQ5I,KAAK,MACb4I,EAAQ7I,KAAK,QAET1I,EAAQ,IACV6J,EAAU1D,UAAU,GACpB0D,EAAUrE,SAAU,EACpBlW,EAASua,EAAUlH,MAAO,IAGxB9V,EAAWsU,IACbA,EAAYlN,KAAKsd,EAAS,KAC5B,IAQKlb,IACT,CAEAqe,QAAAA,GACE,MAAMvT,EAAc9K,KAAKG,KAAK,eACxB9G,EAAiB2G,KAAK3G,eACtB6hB,EAAUlb,KAAKkb,QACf1H,EAAYxT,KAAKwT,UACjB7J,EAAQ3J,KAAK2J,QACbxQ,EAAM+I,KAAKwc,MACfrlB,EAAeU,aAAeV,EAAe2R,cAwB/C,OANIrB,EAAQ,IACV6J,EAAUrE,SAAU,GAGtBnP,KAAK/G,SAASE,GApBIwlB,KAChB,MAAMrS,EAAQkH,EAAUlH,MACxB4O,EAAQ5I,KAAK,QACb4I,EAAQ7I,KAAK,MAET1I,EAAQ,IACV6J,EAAU1D,UAAUnG,EAAQ,GAC5B1Q,EAASqT,EAAOA,EAAMvS,cACtByZ,EAAUrE,SAAU,GAGlB3Y,EAAWsU,IACbA,EAAYlN,KAAKsd,EAAS,SAC5B,IASKlb,IACT,CAEA/G,QAAAA,CAASE,EAAK2R,GAEZ,OADA7R,EAAS+G,KAAK3G,eAAgBF,EAAK2R,GAC5B9K,IACT,CAEA4e,YAAAA,GAIE,OAHA5e,KAAKY,MAAM,kBACXZ,KAAKY,MAAM,gBAEJZ,IACT,CAEA6e,WAAAA,GAIE,OAHA7e,KAAKY,MAAM,kBACXZ,KAAKY,MAAM,eAEJZ,IACT,CAEA8e,aAAAA,GAIE,OAHA9e,KAAKY,MAAM,kBACXZ,KAAKY,MAAM,iBAEJZ,IACT,CAEA+e,MAAAA,GACE,MAAMzgB,EAAW0B,KAAKG,KAAK,YACrB+a,EAAUlb,KAAKkb,QACf2B,EAAS7c,KAAK6c,OACdrJ,EAAYxT,KAAKwT,UAGvB,OAFcxT,KAAK2J,QAEP,IAIK,aAAbrL,GACFkV,EAAUnB,OACV6I,EAAQpL,UAAU,YAElBoL,EAAQ5I,OAER7b,GAAM,KACJomB,EAAOrP,MAAM,MAVRxN,IAeX,CAEAgf,SAAAA,GACE,MAAM1gB,EAAW0B,KAAKG,KAAK,YACrB+a,EAAUlb,KAAKkb,QACf2B,EAAS7c,KAAK6c,OACdrJ,EAAYxT,KAAKwT,UAGvB,OAFcxT,KAAK2J,QAEP,IAIK,aAAbrL,GACFkV,EAAUlB,OACV4I,EAAQpL,UAAU,YAElBoL,EAAQ7I,OAER5b,GAAM,KACJomB,EAAOnP,OAAO,MAVT1N,IAeX,CAEA2N,MAAAA,GAOE,OANI3N,KAAK+c,aACP/c,KAAKgf,YAELhf,KAAK+e,SAGA/e,IACT,CAEA4b,KAAAA,GAGE,OAFA5b,KAAKY,MAAM,gBAEJZ,IACT,CAEAif,QAAAA,GACE,MAAMtV,EAAQ3J,KAAK2J,QACnB,IAAIiT,EAAU5c,KAAK4c,QACfpJ,EAAYxT,KAAKwT,UACjBqJ,EAAS7c,KAAK6c,OACdC,EAAS9c,KAAK8c,OACd5B,EAAUlb,KAAKkb,QACfzL,GAAY,EA0BhB,OAxBAzP,KAAKU,kBAEDoc,GACFA,EAAOrc,UAGLkJ,EAAQ,GAAK6J,IACf/D,EAAY+D,EAAU/D,YAEtB+D,EAAU/S,UAENgP,GAAaoN,GACfA,EAAOpc,WAIPmc,GACFA,EAAQnc,UAGNya,GACFA,EAAQza,UAGHT,IACT,CAEAS,OAAAA,GAOE,OANAT,KAAKY,MAAM,iBAEXZ,KAAKif,WAAW3V,WAEhBtJ,KAAKY,MAAM,aAEJZ,IACT,CAEAK,YAAAA,GAGE,OAFmBL,KAAKG,KAAK,eAM7BH,KAAKe,IAAI,iBAAkBf,KAAKkY,iBAEzBlY,MALEA,IAMX,CAEAU,eAAAA,GAGE,OAFmBV,KAAKG,KAAK,eAM7BH,KAAKmB,KAAK,kBAEHnB,MALEA,IAMX,EAyCF,GAtCA0c,GAAQnT,SAmCCtS,EAlCS,CACduF,eAAgB,WAChBC,SAAU,iBACV2S,cAAe,SACflW,cAAe,YACf8S,MAAO,KACP1N,SAAU,WACVqO,UAAW,MACXgD,kBAAkB,EAClBlV,UAAU,EACVuiB,YAAY,EACZlP,mBAAmB,EACnBwP,mBAAmB,EACnBrT,UAAW,GACXc,aAAc,EACdyS,SAAU,GACVC,IAAK,GACLC,KAAM,GACNC,OAAQ,GACRC,MAAO,GACPd,OAAQ,CACN3Y,OAAQ,GACR6H,MAAO,GACPkQ,gBAAiB,wBACjBO,YAAY,GAEdvP,YAAa,GACb+E,YAAa,KACbrE,YAAa,KACb9C,YAAa,KACbpQ,kBAAmB,KACnBwP,iBAAkB,OAMZ,QAAVgV,GAAIrd,cAAAqd,IAAMA,IAANA,GAAQC,OAAQ,CAClB,MAAMC,EAAIvd,OAAOsd,OAIjBC,EAAEvhB,OAAOuhB,EAAE1oB,GAAI,CACb2oB,QAAS,SAAU9iB,GAEjB,IAAII,EAAWyiB,EAAEpf,MAEjB,OAAO,IAAI0c,GAET0C,EAAEvhB,OAAO,CAAE,EAAEtB,EAAS,CACpBC,eAAgBG,IAGtB,GAEJ","x_google_ignoreList":[69]} \ No newline at end of file diff --git a/docs/js/reader.min.js b/docs/js/reader.min.js deleted file mode 100644 index 3d7c9a28..00000000 --- a/docs/js/reader.min.js +++ /dev/null @@ -1,2 +0,0 @@ -!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(t="undefined"!=typeof globalThis?globalThis:t||self).Reader=e()}(this,(function(){"use strict";function t(t,e){(null==e||e>t.length)&&(e=t.length);for(var s=0,i=Array(e);sObject.prototype.toString.apply(t),o=t=>"function"==typeof t||"[object Function]"===n(t),l=t=>("[object Object]"===n(t)||"object"==typeof t||o(t))&&null!==t,a=t=>Array.isArray?Array.isArray(t):"[object Array]"===n(t),h=t=>{let e={};return null===t?null:(a(t)?e=Array.from(t):(e=Object.assign({},t),Object.keys(e).forEach((s=>e[s]=l(t[s])?h(t[s]):t[s]))),e)},c=(t,e=300)=>!!o(t)&&setTimeout((()=>{t()}),e),u=t=>"string"==typeof t,d=t=>!!(l(t)&&t.nodeName&&t.tagName&&1===t.nodeType),m=t=>{return!(!l(t)||!(d(t)||(t=>!(!l(t)||"[object NodeList]"!==n(t)))(t)||(e=t,l(e)&&"[object DocumentFragment]"===n(e))||(t=>!(!l(t)||!("[object Text]"===n(t)||t.tagName&&3===t.nodeType)))(t)));var e},p=(t,e)=>{const s=Object.prototype.hasOwnProperty;return t&&s.call(t,e)},f=(t,e)=>{const s=new RegExp("(\\s|^)"+e+"(\\s|$)");let i,r;return!!d(t)&&(i=t.className,!!i&&(r=t.classList,r&&r.contains?t.classList.contains(e):!!s.exec(i)))},b=(t,e)=>{var s;let i,r;if(f(t,e))return!1;i=t.classList,null!==(s=i)&&void 0!==s&&s.add?e.indexOf(" ")>-1?e.split(" ").forEach((t=>{i.add(t)})):i.add(e):(r=t.className,r+=r.length>0?" "+e:e,t.className=r)},g=(t,e,s)=>{let i=t.tagName.toLowerCase();switch(e){case"style":t.style.cssText=s;break;case"value":"input"===i||"textarea"===i?t.value=s:t.setAttribute(e,s);break;case"htmlFor":t.setAttribute("for",s);break;case"className":b(t,s);break;case"innerHTML":t.innerHTML=s;break;case"innerText":t.innerText=s;break;default:t.setAttribute(e,s)}},y=(t,e)=>{if(!t||!l(e))return!1;Object.keys(e).forEach((s=>{const i=e[s];p(e,s)&&g(t,s,i)}))},v=(t,e,s)=>{const i=document.createDocumentFragment(),r=document.createElement(t),n=t=>m(t)||u(t),o=t=>{let e;if(!n(t))return!1;m(t)?e=t:u(t)&&(e=document.createTextNode(t)),i.appendChild(e)};return l(e)?y(r,e):a(e)&&e.every((t=>n(t)))?e.forEach((t=>{o(t)})):m(e)?o(e):u(e)&&o(document.createTextNode(e)),a(s)?s.forEach((t=>{o(t)})):o(s),r.appendChild(i),r},$=(t,e)=>{var s;let i,r=t.className;if(!r||!f(t,e))return!1;var n;i=t.classList,null!==(s=i)&&void 0!==s&&s.remove?i.remove(e):(n=r.replace(e,""),r=!!u(n)&&n.replace(/(^\s+)|(\s+$)/g,""),t.className=r)},_=["focusout","blur","focusin","focus","load","unload","mouseenter","mouseleave"],x=(t,e,s)=>{const i=_.indexOf(e)>-1;s._delegateListener&&delete(s=s._delegateListener)._delegateListener,function(t,e,s){const i=t._listeners;let r=-1;if(i.length<1)return!1;i.forEach(((t,i)=>{const n=t.fn;e===t.type&&(r=i,n===s&&(r=i))})),r>-1&&i.splice(r,1)}(t,e,s),t.removeEventListener(e,s,i)},z=function(t,e,s=!1){const i=u(t)?document.querySelector(t):t,r=i.childNodes,n=((t,e)=>{let s=t._listeners||[];return u(e)&&e&&(s=s.filter((t=>t.type===e))),s})(i,e);n.forEach((t=>{x(i,t.type,t.fn)})),(s||!0===e||1===arguments.length)&&i&&r&&r.forEach((t=>{d(t)&&z(t,e,s)}))},w=(t,e,s)=>{if(!o(s))return z(t,e),!1;x(t,e,s)},M=(t,e)=>{Object.keys(e).forEach((s=>{p(e,s)&&(t[s]=e[s])}))},S={},L=t=>p(S,t)&&S[t].length>0,T=(t,e=!0)=>e?L(t):(t=>{let e=L(t),s=t.lastIndexOf(".");for(;!e&&-1!==s;)s=(t=t.substring(0,s)).lastIndexOf("."),e=L(t);return e})(t),E=(t,e,s=!0)=>{const i=t=>{if(!L(t))return!1;S[t].forEach((t=>{const s=["[object Int8Array]","[object Uint8Array]","[object Uint8ClampedArray]","[object Int16Array]","[object Uint16Array]","[object Int32Array]","[object Uint32Array]","[object Float32Array]","[object Float64Array]","[object BigInt64Array]","[object BigUint64Array]"].indexOf(n(e))>-1?e.toString():e;t.callback.call(t.context||t,s)}))},r=()=>{let e=t,s=t.lastIndexOf(".");for(;-1!==s;)e=e.substring(0,s),s=e.lastIndexOf("."),i(e);i(t),i("*")};if(!T(t))return!1;s?setTimeout(r,10):r()},C=(()=>{let t=0;return e=>(t+=1,e?e+"-"+t:"guid-"+t)})(),j=t=>{if(!p(S,t))return!1;delete S[t]},A=(t,e)=>{if(!T(t))return!1;e?(t=>{const e=Object.keys(S);if(!t||e.length<1)return!1;e.forEach((e=>{const s=S[e];let i;s.forEach(((e,r)=>{e.callback!==t&&e.token!==t||(i=e.topic,s.splice(-1,r))})),s.length<1&&j(i)}))})(e):j(t)};class k{constructor(t){this.attrs={},t&&this.initialize(t)}initialize(t){return this.attr(t).render().addListeners(),this}attr(t,e){const s=this.attrs;return u(t)?e&&p(s,t)?(s[t]=e,this):s[t]:l(t)?(M(s,t),this):0===arguments.length?s:this}render(){return this}refresh(){return this}destroy(){return this.removeListeners(),this}reload(t){let e=this.attr();return t&&(e=this.attr(t)),this.destroy().initialize(e),this}$emit(t,e){return E(t,e),this}$on(t,e){return((t,e,s=null)=>{const i=C();let r="symbol"==typeof t?t.toString():t;o(e)&&(S[r]||(S[r]=[]),S[r].push({topic:r,callback:e,context:s,token:i}))})(t,e,this),this}$off(t,e){return A(t,e),this}addListeners(){return this}removeListeners(){return this}}const O=t=>{const e=Object.getPrototypeOf;let s;if(!(t=>l(t)&&null!==t)(t))return!1;if(s=t.prototype,!s)return!0;for(s=t;null!==e(s);)s=e(s);return e(t)===s},N=t=>t.replace(/]*>.*?<\/script>/gi,""),D=t=>{const e={"&":"&","<":"<",">":">","'":"'",'"':"""};return t.replace(/[&<>'"]/g,(t=>e[t]||t))},B=(t,e={})=>{const s="outline-icon",i=e.size||0,r=e.color||"",n=e.iconSet||"",o=a(i)?i[0]:i,l=a(i)?i[1]:i,h=i?`width:${o}px;height:${l}px;`:"",c=r?h+`color:${r}`:h,d=e.attrs||{},m=document.createElement("i");let p,f="",b="";return u(t)?((t=>{const e=new RegExp("^\\s*(?:<\\?xml[^>]*>\\s*)?(?:<\\!doctype svg[^>]*\\s*(?:\\[?(?:\\s*]*>\\s*)*\\]?)*[^>]*>\\s*)?]*>[^]*<\\/svg>\\s*$\\s*$","i");return u(t)&&e.test(t)})(t)?b=t:(f=n&&"icon"!==n?`xlink:href="#${n}-icon-${t}"`:`xlink:href="#icon-${t}"`,b=``),m.innerHTML=b,d.className?d.className=`${s} ${d.className}`:d.className=s,y(m,d),p=m.querySelector("svg"),y(p,{"aria-hidden":!0,xmlns:"http://www.w3.org/2000/svg",class:"outline-icon__svg",width:200,height:200,style:c}),m):null},H=(t,e={})=>B(t,e),P=s(r,['','','','','','','','','','','','','','','','','','','','']),U=(t,e="icon")=>u(t)?((t,e="icon")=>{const s=/id="(.*?)"/,i=/^(\w+)-/;return P.find((r=>{const n=s.exec(r)[1];return i.exec(n)[1]===e&&n===("icon"===e?`${e}-${t}`:`${e}-icon-${t}`)}))})(t,e):s(r,P),F=(t="")=>{const e=document.body;let s=document.querySelector("#outline-icons"),i=[];(t=>{if(!t)return!1;a(t)&&t.length>0?t.forEach((t=>{-1===P.indexOf(t)&&u(t)&&P.push(t)})):u(t)&&P.push(t)})(t),i=U(),s?s.innerHTML=i.join(""):(s=document.createElement("div"),s.innerHTML=``,e.insertBefore(s.firstChild,e.firstChild))},V=(t,e="")=>{const s=e.replace(/^>/i,"");return!!(e&&s&&t)&&(t.matches?t.matches(s):!!t.msMatchesSelector&&t.msMatchesSelector(s))},q=t=>t.host&&t!==document&&t.host.nodeType?t.host:t.parentNode,R=(t,e,s,i,r,n,o=!1)=>{const l=_.indexOf(s)>-1,a=function(l){const h=function(t){const e=t.target;return(s=e)&&3===s.nodeType?s.parentNode:s;var s}(l),c=((t,e,s,i)=>{const r=s||document;if(!t)return null;do{if(null!=e&&(e.startsWith(">")?t.parentNode===r&&V(t,e):V(t,e))||i&&t===r)return t;if(t===r)break}while(t=q(t))})(h,e,t);let u=n||t;l.delegateTarget=c,!0===n&&(u=r),c&&(!0===o&&w(t,s,a),i.call(u,l,r))};if(!t)return!1;t._listeners||(t._listeners=[]),t._listeners.push({el:t,selector:e,type:s,fn:a,data:r,context:n,capture:l}),i._delegateListener=a,t.addEventListener(s,a,l)},I=[];let W;F();class G extends k{constructor(t){super(),this._default(),t&&this.initialize(t)}_default(){return this.attrs=h(G.DEFAULTS),this.$el=null,this.id="",this.closed=!1,this.visible=!1,this.offset=-50,this.timer=null,this.destroyed=!1,this}initialize(t){return this.attr(t),this.id=this.attr("id"),this.offset=this.attr("offset")||-50,this.$emit("created",function(t){for(var s=1;s{this.$emit("opened"),this.close()}),1e3*t)),this}open(t){const e=this.$el;let s,i,r,n;return this.isDestroyed()||(this.isClosed()&&this.refresh(t),s=this.attr("offset"),i=this.attr("duration"),r=s&&s>=this.offset?s:this.offset,n=`top:${r}px;`,this.clearTimer(),this.$emit("beforeOpen"),c((()=>{this.visible=!0,b(e,"outline-message_visible"),e.style.cssText=n,i>0&&this.startTimer(i)}),100)),this}close(){const t=this.$el;let e,s;return this.isDestroyed()||(e=this.attr("destroyAfterClosed"),s=this.attr("beforeClose"),o(s)&&s.call(this),t.style.cssText="top:-50px;",$(t,"outline-message_visible"),this.visible=!1,this.closed=!0,c((()=>{this.$emit("closed"),e&&this.destroy()}),500)),this}destroy(){return this.$emit("beforeDestroy"),this.isDestroyed()||(this.removeListeners(),document.body.removeChild(this.$el),clearTimeout(this.timer),this._default(),this.$emit("afterDestroy")),this}onMouseEnter(){return this.clearTimer(),this}onMouseLeave(){const t=this.attr("duration"),e=this.attr("delay");return t<=0||this.startTimer(e),this}onClose(){return this.clearTimer(),this.close(),this}addListeners(){const t=this.$el;return R(t,".outline-message__content","mouseenter",this.onMouseEnter,this,!0),R(t,".outline-message__content","mouseleave",this.onMouseLeave,this,!0),R(t,".outline-message__close","click",this.onClose,this,!0),this}removeListeners(){const t=this.$el;return w(t,"mouseenter",this.onMouseEnter),w(t,"mouseleave",this.onMouseLeave),w(t,"click",this.onClose),this}}G.DEFAULTS=h({id:"",type:"info",effect:"default",round:!1,offset:30,duration:3,delay:2,message:"",customClass:"",closable:!0,visible:!0,dangerouslyUseHTMLString:!1,destroyAfterClosed:!0,beforeClose:null}),["info","success","warning","error"].forEach((t=>{G[t]=e=>{const s={},i=C("outline-message-"),r=e.beforeClose||null;let n=e.offset||30;return u(e)?s.message=e:O(e)&&M(s,e),s.id=i,s.type=t,s.offset=n,s.visible=!1,s.beforeClose=()=>{G.close(i,r)},W=new G(s),I.forEach((t=>{n+=t.$el.offsetHeight+16})),W.offset=n,W.open(),I.push(W),W}})),G.close=(t,e)=>{const s=I.length;let i,r,n=-1;if(I.forEach(((s,i)=>{t===s.id&&(r=s.$el.offsetHeight,n=i,o(e)&&e.call(s),I.splice(i,1))})),s<=1||-1===n||n>I.length-1)return!1;for(i=n;i{let t=I.length-1;for(;t>=0;t-=1)I[t].close()};class J{constructor(t,e){this.name=t,o(e)&&(this.action=e)}execute(){return this.action(),this}}class K{constructor(){this.commands=[]}get(t){return this.commands.find((e=>e.name===t))}add(t){return this.commands.push(t),this}del(t){const e=this.commands,s=e.find((e=>e.name===t)),i=s?e.indexOf(s):-1;return i>-1&&e.splice(i,1),this}clear(){return this.commands=[],this}execute(t){const e=this.commands.find((e=>e.name===t));return o(null==e?void 0:e.execute)&&e.execute(),this}}const Q=(t,e=!0)=>{const s=H(t.icon,{iconSet:t.iconSet||"outline",color:t.color||"",size:t.size}),i=v("a",{className:"outline-toolbar__anchor",href:t.link},s),r=v("div",{className:`outline-toolbar__button ${t.name}`,"data-cmd":t.name},[t.link?i:s]);return b(s,"outline-toolbar__icon"),e&&b(r,"outline-toolbar_rounded"),t.disabled&&b(r,"outline-toolbar_disabled"),r},X="outline-toolbar_disabled",Y="outline-toolbar_hidden",Z="outline-toolbar_active";class tt extends k{constructor(t){super(),this._default(),t&&this.initialize(t)}_default(){return this.attrs=h(tt.DEFAULTS),this.disabled=!1,this.closed=!1,this.$el=null,this.buttons=[],this.commands=null,this}initialize(t){let e;return this.attr(t),this.disabled=this.attr("disabled"),this.closed=this.attr("closed"),this.commands=new K,e=this.attr("created"),o(e)&&e.call(this),this.render().addListeners(),this}isHighlight(t){const e=this.get(t);return!!e&&f(e.$el,Z)}isDisabled(t){let e;return t?(e=this.get(t),e.disabled):this.disabled}isExist(t){return!!this.get(t)}isClosed(){return this.closed}_getCommand(t){const e=this,{action:s,name:i}=t;let r,n,l=null,a=null;return s?(a=s.handler,r=s.context||this,o(a)?n=a:u(a)&&(n=function(){e.$emit(a,i)}),o(n)&&(l=new J(i,n.bind(r))),l):l}get(t){return this.buttons.find((e=>e.name===t))}render(){const t=this.attr("mounted"),e=this.attr("buttons")||[],s=this.attr("placement");return F(),this.$el=v("div",{id:C("outline-toolbar"),className:`outline-toolbar outline-toolbar_${s}`}),this._paint(e),document.body.appendChild(this.$el),this.closed&&this.hide(),this.disabled&&this.disable(),o(t)&&t.call(this),this}erase(){return this.$el.innerHTML="",this}_paint(t){const e=this.attr("rounded"),s=document.createDocumentFragment();return t.forEach((t=>{const i=Q(t,e),r=this._getCommand(t),{name:n,disabled:o,context:l}=t;s.appendChild(i),this.isExist(n)||(this.buttons.push({$el:i,name:n,disabled:o||!1,context:l||this}),r&&this.commands.add(r))})),this.$el.appendChild(s),this}_remove(){return document.body.removeChild(this.$el),this}refresh(t){return this.attr({buttons:t}),this.erase()._paint(t),this}add(t){const e=this.$el,s=document.createDocumentFragment(),i=this.attr("buttons")||[],{name:r,disabled:n,context:o}=t,h=this._getCommand(t),c=t=>{const e=Q(t);s.appendChild(e),i.push(t),this.buttons.push({$el:e,name:r,disabled:n||!1,context:o||this,command:h}),h&&this.commands.add(h)};return l(t)?c(t):a(t)&&t.forEach((t=>{l(t)&&c(t)})),e.appendChild(s),this}remove(t){const e=this.$el,s=this.buttons,i=this.get(t);let r=-1;return i?(r=s.indexOf(i),r>-1&&(s.splice(r,1),this.attr("buttons").splice(r,1)),this._disable(t),e.removeChild(i.$el),this):this}_disable(t){const e=this.get(t),s=this.commands.get(t);return!e||e.disabled||(e.disabled=!0,s&&this.commands.del(s),b(e.$el,X)),this}_enable(t){const e=this.get(t),s=this.commands.get(t);return e&&e.disabled?(e.disabled=!1,s&&this.commands.add(s),$(e.$el,X),this):this}disable(t){const e=this.attr("afterDisabled");return t?this._disable(t):(b(this.$el,X),this.removeListeners(),this.disabled=!0,o(e)&&e.call(this)),this}enable(t){const e=this.attr("afterEnabled");return t?this._enable(t):(this.disabled=!1,$(this.$el,X),this.addListeners(),o(e)&&e.call(this)),this}show(t){const e=this.attr("afterOpened"),s=this.get(t),i=this.$el;if(t){if(!s)return this;$(s.$el,Y)}else $(i,Y),this.closed=!1,o(e)&&c((()=>{e.call(this)}),310);return this}hide(t){const e=this.attr("afterClosed"),s=this.get(t),i=this.$el;if(t){if(!s)return this;b(s.$el,Y)}else b(i,Y),this.closed=!0,o(e)&&c((()=>{e.call(this)}),310);return this}toggle(t){return this.isClosed()?this.show(t):this.hide(t),this}highlight(t){const e=this.get(t);let s;return e?(s=e.$el,f(s,Z)?$(s,Z):b(s,Z),this):this}destroy(){const t=this.attr("beforeDestroy"),e=this.attr("afterDestroy");return o(t)&&t.call(this),this.commands.clear(),this.removeListeners()._remove()._default(),o(e)&&e.call(this),this}execute(t){return this.isDisabled(t)||this.commands.execute(t),this}onExecute(t){const e=t.delegateTarget;let s="";return e&&(s=e.getAttribute("data-cmd"),s&&this.execute(s)),this}_updateToolbar({top:t,min:e,max:s}){const i=Math.ceil(t);return i<=e?(this.hide("up"),this.show("down")):i>=s?(this.hide("down"),this.show("up")):i>e&&i{t[`on${s}`]=t=>{E(s,{event:t,speech:e})}})),speechSynthesis.onvoiceschanged=t=>{E("voiceschanged",{event:t,speech:e})},this}}et.isSupport="speechSynthesis"in window;const st=(t,e)=>{let s,i=t;for(;i;)s=i.tagName.toLowerCase(),"script"!==s&&"style"!==s&&b(i,"outline-reader_sibling"),i=e?i.previousElementSibling:i.nextElementSibling},it=()=>{const t=navigator.userAgent;return/Mobile|mini|Fennec|Android|iP(ad|od|hone)|NokiaN[^/]*/.test(t)},rt="进入阅读模式,按 ESC 键可退出阅读模式";class nt extends k{constructor(t){super(),this._default(),t&&this.initialize(t)}_default(){return this.attrs=h(nt.DEFAULTS),this.reading=!1,this.$target=null,this.$el=null,this.$paper=null,this.$title=null,this.$article=null,this.$progress=null,this.toolbar=null,this.speech=null,this}initialize(t){let e;return this.attr(t),e=this.attr("target"),u(e)?this.$target=document.querySelector(e):d(e)&&(this.$target=e),this.$target?(et.isSupport&&(this.speech=new et),this.render().addListeners(),this):this}isSpeaking(){var t;return null==this||null===(t=this.speech)||void 0===t?void 0:t.isSpeaking()}render(){return this._renderEdge()._paint(this.$target),this}erase(){return this.$article.innerHTML="",this}_paint(t){const e=document.createDocumentFragment(),i=s(r,t.cloneNode(!0).children);return c((()=>{i.forEach((t=>{e.appendChild(t)})),this.$article.appendChild(e)})),this}_remove(){const t=this.$el,e=this.toolbar;return t&&document.body.removeChild(t),e&&e.destroy(),this}refresh(){return this.erase()._paint(this.$target),this}_animateTimeline(){return window.ScrollTimeline&&it()?(this.$progress.animate({scale:["0 1","1 1"]},{timeline:new ScrollTimeline({source:this.$article,axis:"block"})}),this):this}_renderEdge(){const t=this.$target,e=it()?26:20;let s,i,r,n,o,l,a=this.attr("title");o=v("div",{className:"outline-reader__progress"}),this.$progress=o,r=t.querySelector("h1"),d(a)&&(r=a),d(r)&&(a=r.innerText),r=v("h1",{className:"outline-reader__title"},a),this.$title=r,n=v("article",{id:"outline-reader__article",className:"outline-reader__article"},it()?[]:[o.cloneNode()]),this.$article=n,i=v("div",{id:"outline-reader__paper",className:"outline-reader__paper"},[r,n]),this.$paper=i;const h=[];return h.push({name:"print",icon:"print",size:e,action:{context:this,handler:this.print}}),et.isSupport&&this.attr("allowSpeak")&&h.push({name:"speak",icon:"sound",size:e,action:{context:this,handler:this.speak}}),h.push({name:"exit",icon:"close",size:e,action:{context:this,handler:this.exit}}),this.toolbar=new tt({placement:"rtl",buttons:h}),s=v("section",{id:"outline-reader",className:"outline-reader outline-reader_hidden"},[o,i,this.toolbar.$el]),this.$el=s,document.body.appendChild(s),this._animateTimeline(),c((()=>{l=s.previousElementSibling,st(l,!0),l=s.nextElementSibling,st(l)})),this}enter(){const t="outline-reader",e=`${t}--reading`,s=`${t}_hidden`,i=this.$el,r=document.querySelectorAll(".outline-reader_sibling"),n=this.attr("enterReadingTip")||rt;return this.reading||!i||(r.forEach((t=>{b(t,s)})),b(i,e),$(i,s),this.toolbar.show(),this.reading=!0,G.info({round:!0,message:n}),this.$emit("reader:enter")),this}exit(){const t="speak",e="outline-reader",s=`${e}--reading`,i=`${e}_hidden`,r=this.$el,n=document.querySelectorAll(".outline-reader_sibling"),o=this.speech,l=this.toolbar;return this.reading&&r?(b(r,i),$(r,s),n.forEach((t=>{$(t,i)})),l.hide(),this.reading=!1,o&&(l.isHighlight(t)&&l.highlight(t),o.cancel()),this.$emit("reader:exit"),this):this}toggle(){return this.reading?this.exit():this.enter(),this}speak(){const t=this.$article.innerText,e=this.speech;return et.isSupport&&e?(this.toolbar.highlight("speak"),this.isSpeaking()?e.cancel():e.speak(t),this):this}print(){return o(print)?(print(),this):this}destroy(){return this.$el?(this.removeListeners()._remove()._default(),this):this}onPrint(){return this.print(),this}onEnterReading(){return this.toggle(),this}onExitReading(t){return 27===t.keyCode&&this.reading&&(this.toggle(),function(t){t.stopPropagation(),t.preventDefault()}(t)),this}onRefresh(){return this.refresh(),this}addListeners(){return this.$el?(((t,e,s,i,r,n=!1)=>{const l=_.indexOf(e)>-1,a=function(o){let l=r||t;!0===r&&(l=i),!0===n&&w(t,e,a),s.call(l,o,i)};if(!o(s))return!1;t._listeners||(t._listeners=[]),t._listeners.push({el:t,type:e,fn:a,data:i,context:r,capture:l}),s._delegateListener=a,t.addEventListener(e,a,l)})(document,"keyup",this.onExitReading,this,!0),this.$on("toolbar:action:print",this.onPrint),this.$on("toolbar:action:reading",this.onEnterReading),this.$on("reader:print",this.onPrint),this.$on("reader:refresh",this.onRefresh),this.$on("reader:enter",this.enter),this.$on("reader:exit",this.exit),this.$on("reader:toggle",this.toggle),this):this}removeListeners(){return this.$el?(w(document,"keyup",this.onExitReading),this.$off("toolbar:action:print"),this.$off("toolbar:action:reading"),this.$off("reader:refresh"),this.$off("reader:toggle"),this):this}}return nt.DEFAULTS=h({target:"",title:"",enterReadingTip:rt,allowSpeak:!1}),nt})); -//# sourceMappingURL=reader.min.js.map diff --git a/docs/js/reader.min.js.map b/docs/js/reader.min.js.map deleted file mode 100644 index b6e735c0..00000000 --- a/docs/js/reader.min.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"reader.min.js","sources":["../../utils/lang/toString.js","../../utils/types/isFunction.js","../../utils/types/isObject.js","../../utils/types/isArray.js","../../utils/lang/cloneDeep.js","../../utils/lang/later.js","../../utils/types/isString.js","../../utils/types/isElement.js","../../utils/types/isDOM.js","../../utils/types/isHTMLCollection.js","../../utils/types/isFragment.js","../../utils/types/isTextNode.js","../../utils/lang/hasOwn.js","../../utils/dom/hasClass.js","../../utils/dom/addClass.js","../../utils/dom/setAttribute.js","../../utils/dom/setAttributes.js","../../utils/dom/createElement.js","../../utils/dom/removeClass.js","../../utils/lang/trim.js","../../utils/event/enum.js","../../utils/event/_off.js","../../utils/event/_delete.js","../../utils/event/purgeElement.js","../../utils/event/getListeners.js","../../utils/event/off.js","../../utils/lang/extend.js","../../utils/observer/_subscribers.js","../../utils/observer/_hasDirectSubscribersFor.js","../../utils/observer/has.js","../../utils/observer/_hasSubscribers.js","../../utils/observer/emit.js","../../utils/types/isTypedArray.js","../../utils/lang/guid.js","../../utils/observer/_removeSubscriber.js","../../utils/observer/off.js","../../utils/observer/_removeSubscriberByToken.js","../../base.js","../../utils/observer/on.js","../../utils/types/isObjectLike.js","../../utils/types/isPlainObject.js","../../utils/lang/stripScripts.js","../../utils/lang/encodeHTML.js","../../utils/icons/createElement.js","../../utils/types/isSVG.js","../../utils/icons/icon.js","../../utils/icons/symbols.js","../../utils/icons/defaults.js","../../utils/icons/getSymbols.js","../../utils/icons/getSymbol.js","../../utils/icons/paint.js","../../utils/icons/add.js","../../utils/dom/matches.js","../../utils/dom/getParentOrHost.js","../../utils/event/on.js","../../utils/event/getTarget.js","../../utils/dom/resolveTextNode.js","../../utils/dom/closest.js","../../message.js","../../command.js","../../commands.js","../../_createButton.js","../../toolbar.js","../../speech.js","../../_updateSiblingElements.js","../../utils/dom/isMobile.js","../../reader.js","../../utils/event/stop.js","../../utils/event/at.js"],"sourcesContent":["/**\r\n * Object 对象原型上的 toString 方法\r\n * ========================================================================\r\n * @method toString\r\n * @param {*} val\r\n * @returns {string}\r\n */\r\nconst toString = (val) => {\r\n return Object.prototype.toString.apply(val)\r\n}\r\n\r\nexport default toString\r\n","import toString from '../lang/toString'\r\n\r\n/**\r\n * 检测测试数据是否为 Function 类型\r\n * ========================================================================\r\n * @method isFunction\r\n * @param {*} val - (必须)待检测的数据\r\n * @returns {boolean} 'val' 是 Function 类型返回 true,否则返回 false\r\n */\r\nconst isFunction = (val) => {\r\n return typeof val === 'function' || toString(val) === '[object Function]'\r\n}\r\n\r\nexport default isFunction\r\n","import toString from '../lang/toString'\r\nimport isFunction from './isFunction'\r\n\r\n/**\r\n * 检测数据是否为 Object 类型\r\n * ========================================================================\r\n * @method isObject\r\n * @param {*} o\r\n * @returns {boolean}\r\n */\r\nconst isObject = (o) => {\r\n return (\r\n (toString(o) === '[object Object]' ||\r\n typeof o === 'object' ||\r\n isFunction(o)) &&\r\n o !== null\r\n )\r\n}\r\n\r\nexport default isObject\r\n","import toString from '../lang/toString'\r\n\r\n/**\r\n * 检测数据是否为 Array 类型\r\n * ========================================================================\r\n * @method isArray\r\n * @param {*} o\r\n * @returns {boolean}\r\n */\r\nconst isArray = (o) => {\r\n if (Array.isArray) {\r\n return Array.isArray(o)\r\n } else {\r\n return toString(o) === '[object Array]'\r\n }\r\n}\r\n\r\nexport default isArray\r\n","import isObject from '../types/isObject'\r\nimport isArray from '../types/isArray'\r\n\r\n/**\r\n * 深拷贝对象函数\r\n * ========================================================================\r\n * @methods cloneDeep\r\n * @param {Object} obj - 深拷贝的对象\r\n * @returns {Array|Object|*}\r\n *\r\n * @example\r\n * const arr = cloneDeep([2,3,4,6])\r\n * => [2,3,4,6]\r\n */\r\nconst cloneDeep = (obj) => {\r\n let clone = {}\r\n\r\n if (obj === null) {\r\n return null\r\n }\r\n\r\n if (isArray(obj)) {\r\n clone = Array.from(obj)\r\n } else {\r\n clone = Object.assign({}, obj)\r\n Object.keys(clone).forEach((key) => {\r\n return (clone[key] = isObject(obj[key]) ? cloneDeep(obj[key]) : obj[key])\r\n })\r\n }\r\n\r\n return clone\r\n}\r\n\r\nexport default cloneDeep\r\n","import isFunction from '../types/isFunction'\r\n\r\n/**\r\n * later - 延迟执行方法\r\n * ========================================================================\r\n * @method later\r\n * @param {Function} fn\r\n * @param {Number} [delay]\r\n * @returns {number|boolean}\r\n */\r\nconst later = (fn, delay = 300) => {\r\n if (!isFunction(fn)) {\r\n return false\r\n }\r\n\r\n return setTimeout(() => {\r\n fn()\r\n }, delay)\r\n}\r\n\r\nexport default later\r\n","/**\r\n * 检测数据是否为 String 类型\r\n * ========================================================================\r\n * @method isArray\r\n * @param {*} str\r\n * @returns {boolean}\r\n */\r\nconst isString = (str) => {\r\n return typeof str === 'string'\r\n}\r\n\r\nexport default isString\r\n","import isObject from './isObject'\r\n\r\n/**\r\n * 检测数据是否为 HTMLElement DOM 节点\r\n * ========================================================================\r\n * @method isElement\r\n * @param {*} o\r\n * @returns {boolean}\r\n */\r\nconst isElement = (o) => {\r\n return !!(isObject(o) && o.nodeName && o.tagName && o.nodeType === 1)\r\n}\r\n\r\nexport default isElement\r\n","import isObject from './isObject'\r\nimport isElement from './isElement'\r\nimport isHTMLCollection from './isHTMLCollection'\r\nimport isFragment from './isFragment'\r\nimport isTextNode from './isTextNode'\r\n\r\nconst isDOM = (el) => {\r\n return !!(\r\n isObject(el) &&\r\n (isElement(el) || isHTMLCollection(el) || isFragment(el) || isTextNode(el))\r\n )\r\n}\r\n\r\nexport default isDOM\r\n","import toString from '../lang/toString'\r\nimport isObject from './isObject'\r\n\r\nconst isHTMLCollection = (el) => {\r\n return !!(isObject(el) && toString(el) === '[object NodeList]')\r\n}\r\n\r\nexport default isHTMLCollection\r\n","import toString from '../lang/toString'\r\nimport isObject from './isObject'\r\n\r\nconst isFragment = (fragment) => {\r\n return !!(\r\n isObject(fragment) && toString(fragment) === '[object DocumentFragment]'\r\n )\r\n}\r\n\r\nexport default isFragment\r\n","import toString from '../lang/toString'\r\nimport isObject from './isObject'\r\n\r\nconst isTextNode = (el) => {\r\n return !!(\r\n isObject(el) &&\r\n (toString(el) === '[object Text]' || (el.tagName && el.nodeType === 3))\r\n )\r\n}\r\n\r\nexport default isTextNode\r\n","/**\r\n * 检测对象自身属性中是否具有指定的属性。\r\n * ========================================================================\r\n * @method hasOwn\r\n * @param {Object} obj - (必须)检测的目标对象\r\n * @param {String} prop - (必须)属性名\r\n * @returns {Boolean}\r\n */\r\nconst hasOwn = (obj, prop) => {\r\n const hasOwnProperty = Object.prototype.hasOwnProperty\r\n return obj && hasOwnProperty.call(obj, prop)\r\n}\r\n\r\nexport default hasOwn\r\n","import isElement from '../types/isElement'\r\n/**\r\n * 检测 DOM 节点是否包含名为 className 的样式\r\n * ========================================================================\r\n * @method hasClass\r\n * @param {HTMLElement} el - DOM 节点\r\n * @param {String} className - 样式名称\r\n * @returns {Boolean}\r\n */\r\nconst hasClass = (el, className) => {\r\n const pattern = new RegExp('(\\\\s|^)' + className + '(\\\\s|$)')\r\n let allClass\r\n let classList\r\n\r\n if (!isElement(el)) {\r\n return false\r\n }\r\n\r\n allClass = el.className\r\n\r\n if (!allClass) {\r\n return false\r\n }\r\n\r\n classList = el.classList\r\n\r\n if (classList && classList.contains) {\r\n return el.classList.contains(className)\r\n }\r\n\r\n return !!pattern.exec(allClass)\r\n}\r\n\r\nexport default hasClass\r\n","import hasClass from './hasClass'\r\n\r\n/**\r\n * 给 DOM 节点添加名为 className 的样式\r\n * ========================================================================\r\n * @method addClass\r\n * @param {HTMLElement} el - DOM 节点\r\n * @param {String} className - 样式名称\r\n * @returns {Boolean}\r\n */\r\nconst addClass = (el, className) => {\r\n let classList\r\n let allClass\r\n\r\n if (hasClass(el, className)) {\r\n return false\r\n }\r\n\r\n classList = el.classList\r\n\r\n if (classList?.add) {\r\n if (className.indexOf(' ') > -1) {\r\n className.split(' ').forEach((name) => {\r\n classList.add(name)\r\n })\r\n } else {\r\n classList.add(className)\r\n }\r\n } else {\r\n allClass = el.className\r\n allClass += allClass.length > 0 ? ' ' + className : className\r\n el.className = allClass\r\n }\r\n}\r\n\r\nexport default addClass\r\n","import addClass from './addClass.js'\r\n\r\n/**\r\n * 给 DOM 节点设置属性/值\r\n * ========================================================================\r\n * @method setAttribute\r\n * @param {HTMLElement} el - DOM 节点\r\n * @param {String} attr - 属性名称\r\n * @param {String|Number|Boolean} value - 属性值\r\n */\r\nconst setAttribute = (el, attr, value) => {\r\n let tagName = el.tagName.toLowerCase()\r\n\r\n switch (attr) {\r\n case 'style':\r\n el.style.cssText = value\r\n break\r\n case 'value':\r\n if (tagName === 'input' || tagName === 'textarea') {\r\n el.value = value\r\n } else {\r\n el.setAttribute(attr, value)\r\n }\r\n break\r\n case 'htmlFor':\r\n el.setAttribute('for', value)\r\n break\r\n case 'className':\r\n addClass(el, value)\r\n break\r\n case 'innerHTML':\r\n el.innerHTML = value\r\n break\r\n case 'innerText':\r\n el.innerText = value\r\n break\r\n default:\r\n el.setAttribute(attr, value)\r\n break\r\n }\r\n}\r\n\r\nexport default setAttribute\r\n","import isObject from '../types/isObject'\r\nimport hasOwn from '../lang/hasOwn'\r\nimport setAttribute from './setAttribute'\r\n\r\nconst setAttributes = (el, attrs) => {\r\n if (!el || !isObject(attrs)) {\r\n return false\r\n }\r\n\r\n Object.keys(attrs).forEach((attr) => {\r\n const value = attrs[attr]\r\n if (hasOwn(attrs, attr)) {\r\n setAttribute(el, attr, value)\r\n }\r\n })\r\n}\r\n\r\nexport default setAttributes\r\n","import isObject from '../types/isObject'\r\nimport isString from '../types/isString'\r\nimport isArray from '../types/isArray'\r\nimport isDOM from '../types/isDOM'\r\nimport setAttributes from './setAttributes'\r\n\r\n/**\r\n * 创建 DOM 节点,并添加属性和子节点\r\n * ========================================================================\r\n * @method createElement\r\n * @param {String} tagName - 标签名称\r\n * @param {Object|Array|HTMLElement|DocumentFragment|String} attrs - 属性对象或者子节点\r\n * @param {Array|HTMLElement|DocumentFragment|String} [children] - 子节点数组\r\n * @returns {HTMLElement}\r\n */\r\nconst createElement = (tagName, attrs, children) => {\r\n const $fragment = document.createDocumentFragment()\r\n const $el = document.createElement(tagName)\r\n const isValidChild = (child) => {\r\n return isDOM(child) || isString(child)\r\n }\r\n const append = (child) => {\r\n let $child\r\n\r\n if (!isValidChild(child)) {\r\n return false\r\n }\r\n\r\n if (isDOM(child)) {\r\n $child = child\r\n } else if (isString(child)) {\r\n $child = document.createTextNode(child)\r\n }\r\n\r\n $fragment.appendChild($child)\r\n }\r\n\r\n if (isObject(attrs)) {\r\n setAttributes($el, attrs)\r\n } else if (isArray(attrs) && attrs.every((attr) => isValidChild(attr))) {\r\n attrs.forEach((child) => {\r\n append(child)\r\n })\r\n } else if (isDOM(attrs)) {\r\n append(attrs)\r\n } else if (isString(attrs)) {\r\n append(document.createTextNode(attrs))\r\n }\r\n\r\n if (isArray(children)) {\r\n children.forEach((child) => {\r\n append(child)\r\n })\r\n } else {\r\n append(children)\r\n }\r\n\r\n $el.appendChild($fragment)\r\n\r\n return $el\r\n}\r\n\r\nexport default createElement\r\n","import trim from '../lang/trim'\r\nimport hasClass from './hasClass'\r\n\r\n/**\r\n * 移除 DOM 节点的 className 样式\r\n * ========================================================================\r\n * @method removeClass\r\n * @param {HTMLElement} el - DOM 节点\r\n * @param {String} className - 样式名称\r\n * @returns {Boolean}\r\n */\r\nconst removeClass = (el, className) => {\r\n let allClass = el.className\r\n let classList\r\n\r\n if (!allClass || !hasClass(el, className)) {\r\n return false\r\n }\r\n\r\n classList = el.classList\r\n\r\n if (classList?.remove) {\r\n classList.remove(className)\r\n } else {\r\n allClass = trim(allClass.replace(className, ''))\r\n el.className = allClass\r\n }\r\n}\r\n\r\nexport default removeClass\r\n","import isString from '../types/isString'\r\n\r\n/**\r\n * 清楚字符串起始位置所有的空格\r\n * ========================================================================\r\n * @method trim\r\n * @param {string} str\r\n * @returns {string|Boolean}\r\n */\r\nconst trim = (str) => {\r\n if (!isString(str)) {\r\n return false\r\n }\r\n return str.replace(/(^\\s+)|(\\s+$)/g, '')\r\n}\r\n\r\nexport default trim\r\n","export const CAPTURE_EVENTS = [\r\n 'focusout',\r\n 'blur',\r\n 'focusin',\r\n 'focus',\r\n 'load',\r\n 'unload',\r\n 'mouseenter',\r\n 'mouseleave'\r\n]\r\n","import { CAPTURE_EVENTS } from './enum'\r\nimport _delete from './_delete'\r\n\r\n/**\r\n * (私有方法)取消 type 类型的代理事件绑定\r\n * ========================================================================\r\n * 如果没有设置 handler,则销毁 this.$options 绑定的所有符合 type 事件类型的事件绑定\r\n * ========================================================================\r\n * @method _off\r\n * @param {HTMLElement} el - (必须)取消事件绑定的 DOM 元素\r\n * @param {String} type - (必须)事件类型\r\n * @param {Function} fn - (必须)事件处理器回调函数\r\n * @private\r\n */\r\nconst _off = (el, type, fn) => {\r\n const capture = CAPTURE_EVENTS.indexOf(type) > -1\r\n\r\n /* istanbul ignore else */\r\n if (fn._delegateListener) {\r\n fn = fn._delegateListener\r\n delete fn._delegateListener\r\n }\r\n\r\n // 移除缓存的 _listeners 数据\r\n _delete(el, type, fn)\r\n\r\n el.removeEventListener(type, fn, capture)\r\n}\r\n\r\nexport default _off\r\n","/**\r\n * 删除 DOM 元素缓存的 _listeners 数据\r\n * ========================================================================\r\n * @method _delete\r\n * @param {HTMLElement} el - 要删除 listener 的 DOM 元素\r\n * @param {String} type - 事件类型(名称)\r\n * @param {Function} [fn] - 事件处理器回调函数\r\n */\r\nconst _delete = function (el, type, fn) {\r\n const listeners = el._listeners\r\n let index = -1\r\n\r\n if (listeners.length < 1) {\r\n return false\r\n }\r\n\r\n // 移除缓存的 _listeners 数据\r\n listeners.forEach((listener, i) => {\r\n const handler = listener.fn\r\n\r\n if (type === listener.type) {\r\n index = i\r\n\r\n if (handler === fn) {\r\n index = i\r\n }\r\n }\r\n })\r\n\r\n /* istanbul ignore else */\r\n if (index > -1) {\r\n listeners.splice(index, 1)\r\n }\r\n}\r\n\r\nexport default _delete\r\n","import isString from '../types/isString'\r\nimport isElement from '../types/isElement'\r\nimport getListeners from './getListeners'\r\nimport _off from './_off'\r\n\r\n/**\r\n * 销毁(type 类型的)代理事件绑定\r\n * ========================================================================\r\n * 1. 设置了事件类型 type,则销毁指定类型的事件绑定,否则清除所有代理事件绑定\r\n * 2. recurse 设置为 true,递归销毁子节点全部事件绑定\r\n * ========================================================================\r\n * @method purgeElement\r\n * @param {HTMLElement|String} el - (必须)DOM 元素或者其选择器\r\n * @param {String|Boolean} type - (必须)事件类型\r\n * @param {Boolean} [recurse] - (可选)是否递归销毁子节点所有事件绑定\r\n */\r\nconst purgeElement = function (el, type, recurse = false) {\r\n const $element = isString(el) ? document.querySelector(el) : el\r\n const $children = $element.childNodes\r\n const listeners = getListeners($element, type)\r\n\r\n listeners.forEach((listener) => {\r\n _off($element, listener.type, listener.fn)\r\n })\r\n\r\n if (\r\n (recurse || type === true || arguments.length === 1) &&\r\n $element &&\r\n $children\r\n ) {\r\n $children.forEach(($child) => {\r\n if (isElement($child)) {\r\n purgeElement($child, type, recurse)\r\n }\r\n })\r\n }\r\n}\r\n\r\nexport default purgeElement\r\n","import isString from '../types/isString'\r\n\r\n/**\r\n * 获取 DOM 元素(type 事件类型)事件绑定信息\r\n * ========================================================================\r\n * 如果设置了事件类型 type, 则返回指定类型的事件绑定信息,否则返回所有事件绑定信息\r\n * ========================================================================\r\n * @methods getListeners\r\n * @param {HTMLElement} el - (必须)要获取事件绑定信息的 DOM 元素\r\n * @param {String} [type] - (可选)事件类型\r\n * @returns {Array} - 已绑定的事件信息\r\n */\r\nconst getListeners = (el, type) => {\r\n let listeners = el._listeners || []\r\n\r\n if (isString(type) && type) {\r\n listeners = listeners.filter((listener) => {\r\n return listener.type === type\r\n })\r\n }\r\n\r\n return listeners\r\n}\r\n\r\nexport default getListeners\r\n","import purgeElement from './purgeElement'\r\nimport isFunction from '../types/isFunction'\r\nimport _off from './_off'\r\n\r\n/**\r\n * 取消 type 类型的代理事件绑定\r\n * ========================================================================\r\n * 如果没有设置 handler,则销毁 this.$options 绑定的所有符合 type 事件类型的事件绑定\r\n * ========================================================================\r\n * @method off\r\n * @param {HTMLElement|Object} el - (必须)取消事件绑定的 DOM 元素\r\n * @param {String} type - (必须)事件类型\r\n * @param {Function} [fn] - (可选)事件处理器回调函数\r\n */\r\nconst off = (el, type, fn) => {\r\n // 如果不设置 fn 参数,默认清除 el 元素上绑定的所有事件处理器\r\n if (!isFunction(fn)) {\r\n purgeElement(el, type)\r\n return false\r\n }\r\n\r\n _off(el, type, fn)\r\n}\r\n\r\nexport default off\r\n","import hasOwn from './hasOwn'\r\n\r\n/**\r\n * 扩展对象\r\n * ========================================================================\r\n * @method extend\r\n * @param {Object} origin\r\n * @param {Object} source\r\n */\r\nconst extend = (origin, source) => {\r\n const keys = Object.keys(source)\r\n\r\n keys.forEach((prop) => {\r\n if (hasOwn(source, prop)) {\r\n origin[prop] = source[prop]\r\n }\r\n })\r\n}\r\n\r\nexport default extend\r\n","/**\r\n * 存储订阅者(主题和处理器的)私有对象\r\n * ========================================================================\r\n * @type {{}}\r\n * @private\r\n */\r\nconst _subscribers = {}\r\n\r\nexport default _subscribers\r\n","import _subscribers from './_subscribers'\r\nimport hasOwn from '../lang/hasOwn'\r\n\r\n/**\r\n * 判断是否存在与给定 topic 完全匹配的订阅者信息\r\n * ========================================================================\r\n * @method _hasDirectSubscribersFor\r\n * @param {String} topic - (必须)订阅主题字符串\r\n * @returns {Boolean}\r\n */\r\nconst _hasDirectSubscribersFor = (topic) => {\r\n return hasOwn(_subscribers, topic) && _subscribers[topic].length > 0\r\n}\r\n\r\nexport default _hasDirectSubscribersFor\r\n","import _hasDirectSubscribersFor from './_hasDirectSubscribersFor'\r\nimport _hasSubscribers from './_hasSubscribers'\r\n\r\n/**\r\n * 判断是否存在包含 topic 指定的订阅者信息\r\n * ========================================================================\r\n * @method has\r\n * @param {String} topic - (必须)主题名称\r\n * @param {Boolean} [isDirect] - (可选)是否为直接的主题,默认值:true\r\n * @returns {Boolean}\r\n */\r\nconst has = (topic, isDirect = true) => {\r\n return isDirect ? _hasDirectSubscribersFor(topic) : _hasSubscribers(topic)\r\n}\r\n\r\nexport default has\r\n","import _hasDirectSubscribersFor from './_hasDirectSubscribersFor'\r\n\r\n/**\r\n * 判断是否存在包含给定 topic 相关的订阅者信息\r\n * ========================================================================\r\n * @method _hasSubscribers\r\n * @param {String} topic - (必须)订阅主题字符串\r\n * @returns {Boolean}\r\n */\r\nconst _hasSubscribers = (topic) => {\r\n let found = _hasDirectSubscribersFor(topic)\r\n let position = topic.lastIndexOf('.')\r\n\r\n while (!found && position !== -1) {\r\n topic = topic.substring(0, position)\r\n position = topic.lastIndexOf('.')\r\n found = _hasDirectSubscribersFor(topic)\r\n }\r\n\r\n return found\r\n}\r\n\r\nexport default _hasSubscribers\r\n","import isTypedArray from '../types/isTypedArray'\r\nimport _subscribers from './_subscribers'\r\nimport has from './has'\r\nimport _hasDirectSubscribersFor from './_hasDirectSubscribersFor'\r\n\r\n/**\r\n * (异步)发布订阅主题信息\r\n * ========================================================================\r\n * 主题默认是异步发布的。确保在消费者处理主题时,主题的发起者不会被阻止。\r\n * ========================================================================\r\n * @method emit\r\n * @param {String} topic - (必须)主题名称\r\n * @param {Object} [data] - (可选)数据对象\r\n * @param {Boolean} [async] - (可选) 是否异步发布\r\n */\r\nconst emit = (topic, data, async = true) => {\r\n const execute = (topic) => {\r\n if (!_hasDirectSubscribersFor(topic)) {\r\n return false\r\n }\r\n\r\n _subscribers[topic].forEach((subscriber) => {\r\n // 针对 mqtt 消息服务返回的 Uint8Array 类似的 typed arrays 格式的数据\r\n // 采用 toString() 方法转化为普通(JSON)字符串\r\n const message = isTypedArray(data) ? data.toString() : data\r\n\r\n subscriber.callback.call(subscriber.context || subscriber, message)\r\n })\r\n }\r\n const deliver = () => {\r\n let subscriber = topic\r\n let position = topic.lastIndexOf('.')\r\n\r\n while (position !== -1) {\r\n subscriber = subscriber.substring(0, position)\r\n position = subscriber.lastIndexOf('.')\r\n\r\n execute(subscriber)\r\n }\r\n\r\n // 执行 topic 对应的处理器\r\n execute(topic)\r\n // 执行特殊 topic:'*'(监听全部消息的发布)\r\n execute('*')\r\n }\r\n\r\n if (!has(topic)) {\r\n return false\r\n }\r\n\r\n if (async) {\r\n setTimeout(deliver, 10)\r\n } else {\r\n deliver()\r\n }\r\n}\r\n\r\nexport default emit\r\n","import toString from '../lang/toString'\r\n/**\r\n * 判断检测数据是否为 Typed Arrays 类型的数据\r\n * ========================================================================\r\n * @param {*} val\r\n * @returns {boolean}\r\n */\r\nconst isTypedArray = (val) => {\r\n const TYPES = [\r\n '[object Int8Array]',\r\n '[object Uint8Array]',\r\n '[object Uint8ClampedArray]',\r\n '[object Int16Array]',\r\n '[object Uint16Array]',\r\n '[object Int32Array]',\r\n '[object Uint32Array]',\r\n '[object Float32Array]',\r\n '[object Float64Array]',\r\n '[object BigInt64Array]',\r\n '[object BigUint64Array]'\r\n ]\r\n\r\n return TYPES.indexOf(toString(val)) > -1\r\n}\r\n\r\nexport default isTypedArray\r\n","/**\r\n * 生成唯一 id 字符串的函数\r\n * ========================================================================\r\n * @method guid\r\n * @param {String} [prefix] - 生成 id 的前缀字符串\r\n * @return {String} 返回一个表示唯一 id 的字符串\r\n */\r\nconst guid = (() => {\r\n let uuid = 0\r\n\r\n return (prefix) => {\r\n uuid += 1\r\n\r\n return prefix ? prefix + '-' + uuid : 'guid-' + uuid\r\n }\r\n})()\r\n\r\nexport default guid\r\n","import _subscribers from './_subscribers'\r\nimport hasOwn from '../lang/hasOwn'\r\n\r\n/**\r\n * 删除与给定 topic 相同的订阅者信息\r\n * ========================================================================\r\n * @method _removeSubscriber\r\n * @param {String} topic - (必须)订阅主题字符串\r\n * @returns {Boolean}\r\n */\r\nconst _removeSubscriber = (topic) => {\r\n if (!hasOwn(_subscribers, topic)) {\r\n return false\r\n }\r\n\r\n delete _subscribers[topic]\r\n}\r\n\r\nexport default _removeSubscriber\r\n","import has from './has'\r\nimport _removeSubscriber from './_removeSubscriber'\r\nimport _removeSubscriberByToken from './_removeSubscriberByToken'\r\n\r\n/**\r\n * 取消订阅主题\r\n * ========================================================================\r\n * @method off\r\n * @param {String} topic - (必须)订阅的主题\r\n * @param {Function|String} [token] - (可选)订阅主题的处理器函数或者唯一 Id 值\r\n */\r\nconst off = (topic, token) => {\r\n if (!has(topic)) {\r\n return false\r\n }\r\n\r\n if (token) {\r\n _removeSubscriberByToken(token)\r\n } else {\r\n _removeSubscriber(topic)\r\n }\r\n}\r\n\r\nexport default off\r\n","import _subscribers from './_subscribers'\r\nimport _removeSubscriber from './_removeSubscriber'\r\n\r\n/**\r\n * 通过订阅者 token 值删除订阅者信息\r\n * ========================================================================\r\n * @method _removeSubscriberByToken\r\n * @param {String} token - 订阅者 token 字符串\r\n * @returns {boolean}\r\n * @private\r\n */\r\nconst _removeSubscriberByToken = (token) => {\r\n const keys = Object.keys(_subscribers)\r\n let index = -1\r\n\r\n if (!token || keys.length < 1) {\r\n return false\r\n }\r\n\r\n keys.forEach((subject) => {\r\n const subscriber = _subscribers[subject]\r\n let topic\r\n\r\n subscriber.forEach((execution, j) => {\r\n if (execution.callback === token || execution.token === token) {\r\n topic = execution.topic\r\n subscriber.splice(index, j)\r\n }\r\n })\r\n\r\n /* istanbul ignore else */\r\n if (subscriber.length < 1) {\r\n _removeSubscriber(topic)\r\n }\r\n })\r\n}\r\n\r\nexport default _removeSubscriberByToken\r\n","import isString from './utils/types/isString'\r\nimport hasOwn from './utils/lang/hasOwn'\r\nimport isObject from './utils/types/isObject'\r\nimport extend from './utils/lang/extend'\r\nimport publish from './utils/observer/emit'\r\nimport subscribe from './utils/observer/on'\r\nimport unsubscribe from './utils/observer/off'\r\n\r\nclass Base {\r\n constructor(options) {\r\n this.attrs = {}\r\n\r\n if (options) {\r\n this.initialize(options)\r\n }\r\n }\r\n\r\n initialize(options) {\r\n this.attr(options).render().addListeners()\r\n return this\r\n }\r\n\r\n attr(prop, value) {\r\n const attrs = this.attrs\r\n\r\n if (isString(prop)) {\r\n // 只能扩展 attrs 中已有的属性\r\n if (value && hasOwn(attrs, prop)) {\r\n // 更新单个配置信息\r\n attrs[prop] = value\r\n return this\r\n }\r\n\r\n // 只传递 prop 参数,则返回对应的属性值\r\n return attrs[prop]\r\n } else if (isObject(prop)) {\r\n // 批量更新配置信息\r\n extend(attrs, prop)\r\n\r\n return this\r\n } else if (arguments.length === 0) {\r\n // 不传递参数,直接返回整个\r\n return attrs\r\n }\r\n\r\n return this\r\n }\r\n\r\n render() {\r\n return this\r\n }\r\n\r\n refresh() {\r\n return this\r\n }\r\n\r\n destroy() {\r\n this.removeListeners()\r\n return this\r\n }\r\n\r\n reload(options) {\r\n let attrs = this.attr()\r\n\r\n if (options) {\r\n attrs = this.attr(options)\r\n }\r\n\r\n this.destroy().initialize(attrs)\r\n\r\n return this\r\n }\r\n\r\n $emit(event, data) {\r\n publish(event, data)\r\n return this\r\n }\r\n\r\n $on(event, callback) {\r\n subscribe(event, callback, this)\r\n return this\r\n }\r\n\r\n $off(event, callback) {\r\n unsubscribe(event, callback)\r\n return this\r\n }\r\n\r\n addListeners() {\r\n return this\r\n }\r\n\r\n removeListeners() {\r\n return this\r\n }\r\n}\r\n\r\nexport default Base\r\n","import _subscribers from './_subscribers'\r\nimport isFunction from '../types/isFunction'\r\nimport guid from '../lang/guid'\r\n\r\n/**\r\n * 订阅主题,并给出处理器函数\r\n * ========================================================================\r\n * @method on\r\n * @param {String} topic - (必须)主题名称\r\n * @param {Function} handler - (必须)主题的处理器函数\r\n * @param {Object} [context] - (可选)指定 this 执行上下文\r\n * @return {String} - 唯一的 token 字符串,例如:'guid-1'。\r\n */\r\nconst on = (topic, handler, context = null) => {\r\n const token = guid()\r\n let subject = typeof topic === 'symbol' ? topic.toString() : topic\r\n\r\n if (!isFunction(handler)) {\r\n return ''\r\n }\r\n\r\n /* istanbul ignore else */\r\n if (!_subscribers[subject]) {\r\n _subscribers[subject] = []\r\n }\r\n\r\n _subscribers[subject].push({\r\n topic: subject,\r\n callback: handler,\r\n context,\r\n token\r\n })\r\n\r\n return token\r\n}\r\n\r\nexport default on\r\n","import isObject from './isObject'\r\n\r\n/**\r\n * 检测测试数据是否为类似 Object 类型\r\n * ========================================================================\r\n * @method isObjectLike\r\n * @param {Object} val - 要检测的数据\r\n * @returns {Boolean} 'val' 是类似 Object 类型,返回 true,否则返回 false\r\n */\r\nconst isObjectLike = (val) => {\r\n return isObject(val) && val !== null\r\n}\r\n\r\nexport default isObjectLike\r\n","import isObjectLike from './isObjectLike'\r\n\r\n/**\r\n * 检测测试数据是否为普通对象\r\n * ========================================================================\r\n * @method isPlainObject\r\n * @param {Object} val - 要检测的数据\r\n * @returns {Boolean} 'val' 是普通对象,返回 true,否则返回 false\r\n */\r\nconst isPlainObject = (val) => {\r\n const getPrototypeOf = Object.getPrototypeOf\r\n let proto\r\n\r\n // Detect obvious negatives\r\n if (!isObjectLike(val)) {\r\n return false\r\n }\r\n\r\n proto = val.prototype\r\n\r\n // JavaScript 对象分为两种:普通对象和函数对象\r\n // 普通对象:原型是 __proto__,没有 prototype 原型(属性)\r\n // 函数对象:原型是 prototype ,prototype 只存在于函数对象上\r\n if (!proto) {\r\n return true\r\n }\r\n\r\n proto = val\r\n\r\n while (getPrototypeOf(proto) !== null) {\r\n proto = getPrototypeOf(proto)\r\n }\r\n\r\n return getPrototypeOf(val) === proto\r\n}\r\n\r\nexport default isPlainObject\r\n","/**\r\n * 移除字符串中的 JavaScript 代码\r\n * ====================================================\r\n * @param {String} str\r\n * @returns {String}\r\n */\r\nconst stripScripts = (str) => {\r\n return str.replace(/]*>.*?<\\/script>/gi, '')\r\n}\r\n\r\nexport default stripScripts\r\n","/**\r\n * 转义字符串中的 HTML 标签\r\n * ========================================================================\r\n * @param {String} str - 需要转义的字符串\r\n * @returns {String}\r\n */\r\nconst encodeHTML = (str) => {\r\n const CHARTS = {\r\n '&': '&',\r\n '<': '<',\r\n '>': '>',\r\n \"'\": ''',\r\n '\"': '"'\r\n }\r\n\r\n return str.replace(/[&<>'\"]/g, (tag) => {\r\n return CHARTS[tag] || tag\r\n })\r\n}\r\n\r\nexport default encodeHTML\r\n","import isArray from '../types/isArray'\r\nimport isString from '../types/isString'\r\nimport isSVG from '../types/isSVG'\r\nimport setAttributes from '../dom/setAttributes'\r\n\r\n/**\r\n * 创建 SVG 图标 DOM 元素\r\n * ========================================================================\r\n * @method createElement\r\n * @param {String} name\r\n * @param {Object} [options]\r\n * @param {Number|Array} [options.size]\r\n * @param {String} [options.color]\r\n * @param {String} [options.iconSet]\r\n * @param {Object} [options.attrs]\r\n * @returns {HTMLElement}\r\n */\r\nconst createElement = (name, options = {}) => {\r\n const ICON = 'outline-icon'\r\n const size = options.size || 0\r\n const color = options.color || ''\r\n const iconSet = options.iconSet || ''\r\n const width = isArray(size) ? size[0] : size\r\n const height = isArray(size) ? size[1] : size\r\n const defaultRules = size ? `width:${width}px;height:${height}px;` : ''\r\n const cssRules = color ? defaultRules + `color:${color}` : defaultRules\r\n const attrs = options.attrs || {}\r\n const $icon = document.createElement('i')\r\n let binds = ''\r\n let svg = ''\r\n let $svg\r\n\r\n if (!isString(name)) {\r\n return null\r\n }\r\n\r\n if (isSVG(name)) {\r\n svg = name\r\n } else {\r\n binds =\r\n iconSet && iconSet !== 'icon'\r\n ? `xlink:href=\"#${iconSet}-icon-${name}\"`\r\n : `xlink:href=\"#icon-${name}\"`\r\n svg = ``\r\n }\r\n\r\n $icon.innerHTML = svg\r\n\r\n if (attrs.className) {\r\n attrs.className = `${ICON} ${attrs.className}`\r\n } else {\r\n attrs.className = ICON\r\n }\r\n\r\n setAttributes($icon, attrs)\r\n\r\n $svg = $icon.querySelector('svg')\r\n setAttributes($svg, {\r\n 'aria-hidden': true,\r\n xmlns: 'http://www.w3.org/2000/svg',\r\n class: 'outline-icon__svg',\r\n width: 200,\r\n height: 200,\r\n style: cssRules\r\n })\r\n\r\n return $icon\r\n}\r\n\r\nexport default createElement\r\n","import isString from './isString'\r\n\r\nconst isSVG = (str) => {\r\n const declaration = '(?:<\\\\?xml[^>]*>\\\\s*)?'\r\n const doctype =\r\n '(?:<\\\\!doctype svg[^>]*\\\\s*(?:\\\\[?(?:\\\\s*]*>\\\\s*)*\\\\]?)*[^>]*>\\\\s*)?'\r\n const content = ']*>[^]*<\\\\/svg>\\\\s*$'\r\n const svg = `^\\\\s*${declaration}${doctype}${content}\\\\s*$`\r\n const pattern = new RegExp(svg, 'i')\r\n\r\n return isString(str) && pattern.test(str)\r\n}\r\n\r\nexport default isSVG\r\n","import createElement from './createElement'\r\n\r\n/**\r\n * 创建 SVG 图标 DOM 元素\r\n * ========================================================================\r\n * @method icon\r\n * @alias createElement\r\n * @see createElement\r\n * @param {String} name\r\n * @param {Object} [options]\r\n * @param {Number|Array} [options.size]\r\n * @param {String} [options.color]\r\n * @param {String} [options.iconSet]\r\n * @returns {HTMLElement}\r\n */\r\nconst icon = (name, options = {}) => {\r\n return createElement(name, options)\r\n}\r\n\r\nexport default icon\r\n","import DEFAULTS from './defaults'\r\n\r\nconst SYMBOLS = [...DEFAULTS]\r\n\r\nexport default SYMBOLS\r\n","const DEFAULTS = [\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n ''\r\n]\r\n\r\nexport default DEFAULTS\r\n","import isString from '../types/isString'\r\nimport getSymbol from './getSymbol'\r\nimport SYMBOLS from './symbols'\r\n\r\n/**\r\n *\r\n * @method getSymbols\r\n * @param {String} [name]\r\n * @param {String} [iconSet]\r\n * @returns {string[]|*}\r\n */\r\nconst getSymbols = (name, iconSet = 'icon') => {\r\n if (isString(name)) {\r\n return getSymbol(name, iconSet)\r\n }\r\n\r\n return [...SYMBOLS]\r\n}\r\n\r\nexport default getSymbols\r\n","import SYMBOLS from './symbols'\r\n\r\n/**\r\n * @method getSymbol\r\n * @param {String} name\r\n * @param {String} [iconSet]\r\n * @returns {String}\r\n */\r\nconst getSymbol = (name, iconSet = 'icon') => {\r\n const patternName = /id=\"(.*?)\"/\r\n const patternSet = /^(\\w+)-/\r\n const symbols = SYMBOLS\r\n\r\n return symbols.find((symbol) => {\r\n const names = patternName.exec(symbol)\r\n const fullName = names[1]\r\n const sets = patternSet.exec(fullName)\r\n const setName = sets[1]\r\n const iconName =\r\n iconSet === 'icon' ? `${iconSet}-${name}` : `${iconSet}-icon-${name}`\r\n\r\n return setName === iconSet && fullName === iconName\r\n })\r\n}\r\n\r\nexport default getSymbol\r\n","import add from './add'\r\nimport getSymbols from './getSymbols'\r\n\r\n/**\r\n * 绘制 SVG 图标集\r\n * ========================================================================\r\n * @method paint\r\n * @param {String|Array} symbol\r\n */\r\nconst paint = (symbol = '') => {\r\n const $body = document.body\r\n let $icons = document.querySelector('#outline-icons')\r\n let symbols = []\r\n\r\n add(symbol)\r\n symbols = getSymbols()\r\n\r\n if ($icons) {\r\n $icons.innerHTML = symbols.join('')\r\n } else {\r\n $icons = document.createElement('div')\r\n $icons.innerHTML =\r\n ``\r\n $body.insertBefore($icons.firstChild, $body.firstChild)\r\n }\r\n}\r\n\r\nexport default paint\r\n","import isArray from '../types/isArray'\r\nimport isString from '../types/isString'\r\nimport SYMBOLS from './symbols'\r\n\r\n/**\r\n * @method add\r\n * @param {Array|String} symbols\r\n * @return {Boolean}\r\n */\r\nconst add = (symbols) => {\r\n if (!symbols) {\r\n return false\r\n }\r\n\r\n if (isArray(symbols) && symbols.length > 0) {\r\n symbols.forEach((symbol) => {\r\n /* istanbul ignore else */\r\n if (SYMBOLS.indexOf(symbol) === -1 && isString(symbol)) {\r\n SYMBOLS.push(symbol)\r\n }\r\n })\r\n } else {\r\n /* istanbul ignore else */\r\n if (isString(symbols)) {\r\n SYMBOLS.push(symbols)\r\n }\r\n }\r\n}\r\n\r\nexport default add\r\n","/**\r\n * 获取 options 节点下匹配 selector 选择器的 DOM 节点\r\n * ========================================================================\r\n * Element.matches() 方法可以用来判断 DOM 元素是否与给定的选择器匹配,事件代理判断是\r\n * 否触发绑定的代理事件回调函数,关键就是使用 Element.matches() 辨别当前事件触发的目\r\n * 标 DOM 元素是否为事件代理所期望触发的目标。\r\n * ========================================================================\r\n * @method matches\r\n * @see https://developer.mozilla.org/en-US/docs/web/api/element/matches\r\n * @param {HTMLElement} el - (必须)DOM 元素\r\n * @param {String} selector - (必须)匹配 DOM 元素的选择器\r\n * @returns {Boolean}\r\n */\r\nconst matches = (el, selector = '') => {\r\n const sel = selector.replace(/^>/i, '')\r\n\r\n if (!selector || !sel || !el) {\r\n return false\r\n }\r\n\r\n /* istanbul ignore else */\r\n if (el.matches) {\r\n return el.matches(sel)\r\n } else if (el.msMatchesSelector) {\r\n return el.msMatchesSelector(sel)\r\n } else {\r\n return false\r\n }\r\n}\r\n\r\nexport default matches\r\n","/**\r\n * 获取 DOM 元素的父节点\r\n * ========================================================================\r\n * @method getParentOrHost\r\n * @param {*|HTMLElement} el - (必须)要获取父节点的 DOM 元素\r\n * @returns {*|HTMLElement}\r\n */\r\nconst getParentOrHost = (el) => {\r\n return el.host && el !== document && el.host.nodeType\r\n ? el.host\r\n : el.parentNode\r\n}\r\n\r\nexport default getParentOrHost\r\n","import closest from '../dom/closest'\r\nimport off from './off'\r\nimport getTarget from './getTarget'\r\n\r\nimport { CAPTURE_EVENTS } from './enum'\r\n\r\n/**\r\n * 绑定代理事件\r\n * ========================================================================\r\n * @method on\r\n * @param {HTMLElement|String|Object} el - (必须)绑定代理事件的 DOM 节点\r\n * @param {String} selector - (必须)事件代理目标 DOM 元素的选择器\r\n * @param {String|Function} type - (必须)事件类型或者事件处理器回调函数\r\n * @param {Function|Object} fn - (可选) 事件处理器回调函数或者传递给事件处理器回调函数的数据对象\r\n * @param {Object|Boolean} [data] - (可选)传递给事件处理器回调函数的数据对象或者事件处理器回调函数的 this 上下文指向,\r\n * @param {Object|Boolean} [context] - (可选)事件处理器回调函数的 this 上下文指向,或者是否仅触发一次\r\n * 当设置为 true 时,则事件处理器回调函数的 this 上下文指向为 data 对象\r\n * @param {Boolean} once - (可选)是否仅触发一次\r\n */\r\nconst on = (el, selector, type, fn, data, context, once = false) => {\r\n // CAPTURE_EVENTS 中的特殊事件,采用事件捕获模型\r\n const capture = CAPTURE_EVENTS.indexOf(type) > -1\r\n\r\n const listener = function (evt) {\r\n const target = getTarget(evt)\r\n // 通过 Element.matches 方法获得点击的目标元素\r\n const delegateTarget = closest(target, selector, el)\r\n let overrideContext = context || el\r\n\r\n evt.delegateTarget = delegateTarget\r\n\r\n // 当设置为 true 时,则事件处理器回调函数的\r\n // this 上下文指向为 data 对象\r\n if (context === true) {\r\n overrideContext = data\r\n }\r\n\r\n /* istanbul ignore else */\r\n if (delegateTarget) {\r\n // 仅触发一次\r\n /* istanbul ignore else */\r\n if (once === true) {\r\n off(el, type, listener)\r\n }\r\n\r\n fn.call(overrideContext, evt, data)\r\n }\r\n }\r\n\r\n if (!el) {\r\n return false\r\n }\r\n\r\n if (!el._listeners) {\r\n el._listeners = []\r\n }\r\n\r\n // 缓存 options 元素绑定的事件处理器\r\n el._listeners.push({\r\n el,\r\n selector,\r\n type,\r\n fn: listener,\r\n data,\r\n context,\r\n capture\r\n })\r\n\r\n // 缓存包装后的事件处理器\r\n fn._delegateListener = listener\r\n\r\n el.addEventListener(type, listener, capture)\r\n}\r\n\r\nexport default on\r\n","import resolveTextNode from '../dom/resolveTextNode'\r\n\r\n/**\r\n * 返回触发事件的 target DOM 元素\r\n * ========================================================================\r\n * @method getTarget\r\n * @param {Event} evt - Event 对象\r\n * @return {HTMLElement} - Event 对象的 target DOM 元素\r\n */\r\nconst getTarget = function (evt) {\r\n const target = evt.target\r\n\r\n return resolveTextNode(target)\r\n}\r\n\r\nexport default getTarget\r\n","/**\r\n * 在某些情况下,某些浏览器(例如:Safari 浏览器)会返回实际的目标元素内部的文本节点。\r\n * resolveTextNode() 方法则会返回实际的目标节点。\r\n * ========================================================================\r\n * @method resolveTextNode\r\n * @param {HTMLElement|Text} el - 要解析的节点\r\n * @return {*|HTMLElement} - 实际的目标 DOM 节点\r\n */\r\nconst resolveTextNode = function (el) {\r\n if (el && el.nodeType === 3) {\r\n return el.parentNode\r\n }\r\n\r\n return el\r\n}\r\n\r\nexport default resolveTextNode\r\n","import matches from './matches'\r\nimport getParentOrHost from './getParentOrHost'\r\n\r\n/**\r\n * 获取 options 元素父元素最近的包含 selector 选择器的元素\r\n * ========================================================================\r\n * @method closest\r\n * @param {HTMLElement} el - (必须)DOM 元素\r\n * @param {String} selector - (必须)DOM 元素的选择其\r\n * @param {HTMLElement} [ctx] - (必须)比对的 DOM 元素\r\n * @param {Boolean} [includeCTX] - (必须)是否包含 context DOM 元素\r\n * @returns {null|HTMLElement} - 返回最接近的 DOM 元素\r\n */\r\nconst closest = (el, selector, ctx, includeCTX) => {\r\n const context = ctx || document\r\n\r\n if (!el) {\r\n return null\r\n }\r\n\r\n do {\r\n /* istanbul ignore else */\r\n if (\r\n (selector != null &&\r\n (selector.startsWith('>')\r\n ? el.parentNode === context && matches(el, selector)\r\n : matches(el, selector))) ||\r\n (includeCTX && el === context)\r\n ) {\r\n return el\r\n }\r\n\r\n /* istanbul ignore else */\r\n if (el === context) {\r\n break\r\n }\r\n\r\n /* jshint boss:true */\r\n } while ((el = getParentOrHost(el)))\r\n}\r\n\r\nexport default closest\r\n","import isString from './utils/types/isString'\r\nimport isPlainObject from './utils/types/isPlainObject'\r\nimport isFunction from './utils/types/isFunction'\r\n\r\nimport extend from './utils/lang/extend'\r\nimport later from './utils/lang/later'\r\nimport stripScripts from './utils/lang/stripScripts'\r\nimport encodeHTML from './utils/lang/encodeHTML'\r\nimport cloneDeep from './utils/lang/cloneDeep'\r\nimport guid from './utils/lang/guid'\r\n\r\nimport createElement from './utils/dom/createElement'\r\nimport addClass from './utils/dom/addClass'\r\nimport removeClass from './utils/dom/removeClass'\r\nimport setAttribute from './utils/dom/setAttribute'\r\nimport setAttributes from './utils/dom/setAttributes'\r\n\r\nimport icon from './utils/icons/icon'\r\nimport paint from './utils/icons/paint'\r\nimport on from './utils/event/on'\r\nimport off from './utils/event/off'\r\n\r\nimport Base from './base'\r\n\r\nconst TYPES = ['info', 'success', 'warning', 'error']\r\nconst instances = []\r\nlet instance\r\n\r\npaint()\r\n\r\nclass Message extends Base {\r\n constructor(options) {\r\n super()\r\n\r\n this._default()\r\n\r\n if (options) {\r\n this.initialize(options)\r\n }\r\n }\r\n\r\n _default() {\r\n this.attrs = cloneDeep(Message.DEFAULTS)\r\n\r\n this.$el = null\r\n this.id = ''\r\n this.closed = false\r\n this.visible = false\r\n this.offset = -50\r\n this.timer = null\r\n this.destroyed = false\r\n\r\n return this\r\n }\r\n\r\n initialize(options) {\r\n this.attr(options)\r\n this.id = this.attr('id')\r\n this.offset = this.attr('offset') || -50\r\n\r\n this.$emit('created', { ...this.attr() })\r\n\r\n this.render().addListeners()\r\n\r\n if (this.attr('visible')) {\r\n this.open()\r\n }\r\n\r\n return this\r\n }\r\n\r\n isClosed() {\r\n return this.closed\r\n }\r\n\r\n isDestroyed() {\r\n return this.destroyed\r\n }\r\n\r\n _getClassName() {\r\n const type = this.attr('type')\r\n const effect = this.attr('effect')\r\n const round = this.attr('round')\r\n const closable = this.attr('closable')\r\n const visible = this.attr('visible')\r\n const customClass = this.attr('customClass')\r\n const className = [\r\n 'outline-message',\r\n `outline-message_${type}`,\r\n `outline-message_${effect}`\r\n ]\r\n\r\n if (round) {\r\n className.push('outline-message_round')\r\n }\r\n\r\n if (!closable) {\r\n className.push('outline-message_full-width')\r\n }\r\n\r\n if (visible) {\r\n className.push('outline-message_visible')\r\n }\r\n\r\n if (customClass) {\r\n className.push(customClass)\r\n }\r\n\r\n return className\r\n }\r\n\r\n render() {\r\n const type = this.attr('type')\r\n const message = this.attr('message')\r\n const effect = this.attr('effect')\r\n const round = this.attr('round')\r\n const closable = this.attr('closable')\r\n const dangerouslyUseHTMLString = this.attr('dangerouslyUseHTMLString')\r\n const className = this._getClassName()\r\n const iconName = effect === 'light' ? `circle-${type}` : type\r\n const children = []\r\n let iconSize = 20\r\n let $type\r\n let $message\r\n let $text\r\n let $close\r\n let $el\r\n\r\n if (round && effect === 'default') {\r\n iconSize = 12\r\n }\r\n\r\n if (effect !== 'plain') {\r\n $type = icon(iconName, {\r\n iconSet: 'outline',\r\n size: iconSize\r\n })\r\n addClass($type, 'outline-message__icon')\r\n children.push($type)\r\n }\r\n\r\n if (!dangerouslyUseHTMLString) {\r\n $text = document.createTextNode(encodeHTML(stripScripts(message)))\r\n } else {\r\n $text = document.createDocumentFragment()\r\n $text.innerHTML = message\r\n }\r\n $message = createElement(\r\n 'p',\r\n {\r\n className: 'outline-message__content'\r\n },\r\n [$text]\r\n )\r\n children.push($message)\r\n\r\n if (closable) {\r\n $close = icon('close', {\r\n iconSet: 'outline',\r\n size: 18\r\n })\r\n addClass($close, 'outline-message__close')\r\n children.push($close)\r\n }\r\n\r\n $el = createElement(\r\n 'div',\r\n {\r\n className: className.join(' ')\r\n },\r\n children\r\n )\r\n $el.style.cssText = `top:-50px;`\r\n this.$el = $el\r\n document.body.appendChild(this.$el)\r\n\r\n this.$emit('mounted')\r\n\r\n return this\r\n }\r\n\r\n _refreshIcon() {\r\n const HIDDEN = '.outline-message_hidden'\r\n const $el = this.$el\r\n let iconSize = 20\r\n let type\r\n let effect\r\n let round\r\n let iconName\r\n let $icon\r\n let $svg\r\n let $use\r\n\r\n if (this.isDestroyed()) {\r\n return this\r\n }\r\n\r\n $icon = $el.querySelector('.outline-icon')\r\n\r\n if (!$icon) {\r\n return this\r\n }\r\n\r\n type = this.attr('type')\r\n effect = this.attr('effect')\r\n round = this.attr('round')\r\n\r\n if (effect === 'plain') {\r\n addClass($icon, HIDDEN)\r\n } else {\r\n removeClass($icon, HIDDEN)\r\n\r\n if (round && effect === 'default') {\r\n iconSize = 12\r\n }\r\n }\r\n\r\n $svg = $icon.querySelector('.outline-icon__svg')\r\n setAttributes($svg, {\r\n style: `width:${iconSize}px;height:${iconSize}px;`\r\n })\r\n\r\n $use = $svg.querySelector('use')\r\n iconName = effect === 'light' ? `circle-${type}` : type\r\n setAttribute($use, 'xlink:href', `#outline-icon-${iconName}`)\r\n\r\n return this\r\n }\r\n\r\n _refreshMessage() {\r\n const $el = this.$el\r\n let $message\r\n let dangerouslyUseHTMLString\r\n let message\r\n let text\r\n\r\n if (this.isDestroyed()) {\r\n return this\r\n }\r\n\r\n $message = $el.querySelector('.outline-message__content')\r\n dangerouslyUseHTMLString = this.attr('dangerouslyUseHTMLString')\r\n message = this.attr('message')\r\n\r\n if (!dangerouslyUseHTMLString) {\r\n text = encodeHTML(stripScripts(message))\r\n } else {\r\n text = message\r\n }\r\n\r\n $message.innerHTML = text\r\n\r\n return this\r\n }\r\n\r\n _refreshClose() {\r\n const HIDDEN = '.outline-message_hidden'\r\n const $el = this.$el\r\n let $close\r\n let closable\r\n\r\n if (this.isDestroyed()) {\r\n return this\r\n }\r\n\r\n $close = $el.querySelector('.outline-message__close')\r\n closable = this.attr('closable')\r\n\r\n if ($close) {\r\n if (closable) {\r\n addClass($close, HIDDEN)\r\n } else {\r\n removeClass($close, HIDDEN)\r\n }\r\n }\r\n\r\n return this\r\n }\r\n\r\n _refreshEl() {\r\n const $el = this.$el\r\n let className\r\n\r\n if (this.isDestroyed()) {\r\n return this\r\n }\r\n\r\n className = this._getClassName()\r\n setAttribute($el, 'className', className.join(' '))\r\n\r\n return this\r\n }\r\n\r\n refresh(options) {\r\n if (!isPlainObject(options)) {\r\n return this\r\n }\r\n\r\n this.attr(options)\r\n ._refreshIcon()\r\n ._refreshMessage()\r\n ._refreshClose()\r\n ._refreshEl()\r\n\r\n return this\r\n }\r\n\r\n clearTimer() {\r\n if (this.isDestroyed()) {\r\n return this\r\n }\r\n\r\n if (this.timer) {\r\n clearTimeout(this.timer)\r\n this.timer = null\r\n }\r\n\r\n return this\r\n }\r\n\r\n startTimer(duration) {\r\n if (this.isDestroyed()) {\r\n return this\r\n }\r\n\r\n this.timer = later(() => {\r\n this.$emit('opened')\r\n this.close()\r\n }, duration * 1000)\r\n\r\n return this\r\n }\r\n\r\n open(options) {\r\n const $el = this.$el\r\n let offset\r\n let duration\r\n let top\r\n let cssRules\r\n\r\n if (this.isDestroyed()) {\r\n return this\r\n }\r\n\r\n if (this.isClosed()) {\r\n this.refresh(options)\r\n }\r\n\r\n offset = this.attr('offset')\r\n duration = this.attr('duration')\r\n top = offset && offset >= this.offset ? offset : this.offset\r\n cssRules = `top:${top}px;`\r\n\r\n this.clearTimer()\r\n\r\n this.$emit('beforeOpen')\r\n\r\n later(() => {\r\n this.visible = true\r\n\r\n addClass($el, 'outline-message_visible')\r\n $el.style.cssText = cssRules\r\n\r\n if (duration > 0) {\r\n this.startTimer(duration)\r\n }\r\n }, 100)\r\n\r\n return this\r\n }\r\n\r\n close() {\r\n const $el = this.$el\r\n const cssRules = `top:-50px;`\r\n let destroyAfterClosed\r\n let beforeClose\r\n\r\n if (this.isDestroyed()) {\r\n return this\r\n }\r\n\r\n destroyAfterClosed = this.attr('destroyAfterClosed')\r\n beforeClose = this.attr('beforeClose')\r\n\r\n if (isFunction(beforeClose)) {\r\n beforeClose.call(this)\r\n }\r\n\r\n $el.style.cssText = cssRules\r\n removeClass($el, 'outline-message_visible')\r\n\r\n this.visible = false\r\n this.closed = true\r\n\r\n later(() => {\r\n this.$emit('closed')\r\n\r\n if (destroyAfterClosed) {\r\n this.destroy()\r\n }\r\n }, 500)\r\n\r\n return this\r\n }\r\n\r\n destroy() {\r\n this.$emit('beforeDestroy')\r\n\r\n if (this.isDestroyed()) {\r\n return this\r\n }\r\n\r\n this.removeListeners()\r\n\r\n document.body.removeChild(this.$el)\r\n\r\n clearTimeout(this.timer)\r\n this._default()\r\n\r\n this.$emit('afterDestroy')\r\n\r\n return this\r\n }\r\n\r\n onMouseEnter() {\r\n this.clearTimer()\r\n return this\r\n }\r\n\r\n onMouseLeave() {\r\n const duration = this.attr('duration')\r\n const delay = this.attr('delay')\r\n\r\n if (duration <= 0) {\r\n return this\r\n }\r\n\r\n this.startTimer(delay)\r\n\r\n return this\r\n }\r\n\r\n onClose() {\r\n this.clearTimer()\r\n this.close()\r\n return this\r\n }\r\n\r\n addListeners() {\r\n const $el = this.$el\r\n\r\n on(\r\n $el,\r\n '.outline-message__content',\r\n 'mouseenter',\r\n this.onMouseEnter,\r\n this,\r\n true\r\n )\r\n on(\r\n $el,\r\n '.outline-message__content',\r\n 'mouseleave',\r\n this.onMouseLeave,\r\n this,\r\n true\r\n )\r\n on($el, '.outline-message__close', 'click', this.onClose, this, true)\r\n\r\n return this\r\n }\r\n\r\n removeListeners() {\r\n const $el = this.$el\r\n\r\n off($el, 'mouseenter', this.onMouseEnter)\r\n off($el, 'mouseleave', this.onMouseLeave)\r\n off($el, 'click', this.onClose)\r\n\r\n return this\r\n }\r\n}\r\n\r\nMessage.DEFAULTS = (() => {\r\n const OPTIONS = {\r\n id: '',\r\n type: 'info',\r\n effect: 'default',\r\n round: false,\r\n offset: 30,\r\n duration: 3,\r\n delay: 2,\r\n message: '',\r\n customClass: '',\r\n closable: true,\r\n visible: true,\r\n dangerouslyUseHTMLString: false,\r\n destroyAfterClosed: true,\r\n beforeClose: null\r\n }\r\n\r\n return cloneDeep(OPTIONS)\r\n})()\r\n\r\nTYPES.forEach((type) => {\r\n Message[type] = (options) => {\r\n const config = {}\r\n const id = guid(`outline-message-`)\r\n const beforeClose = options.beforeClose || null\r\n let offset = options.offset || 30\r\n\r\n if (isString(options)) {\r\n config.message = options\r\n } else {\r\n if (isPlainObject(options)) {\r\n extend(config, options)\r\n }\r\n }\r\n config.id = id\r\n config.type = type\r\n config.offset = offset\r\n config.visible = false\r\n config.beforeClose = () => {\r\n Message.close(id, beforeClose)\r\n }\r\n\r\n instance = new Message(config)\r\n instances.forEach((item) => {\r\n offset += item.$el.offsetHeight + 16\r\n })\r\n instance.offset = offset\r\n instance.open()\r\n instances.push(instance)\r\n\r\n return instance\r\n }\r\n})\r\n\r\n// 关闭指定 id 消息的静态方法\r\nMessage.close = (id, beforeClose) => {\r\n const len = instances.length\r\n let index = -1\r\n let i\r\n let offsetHeight\r\n\r\n instances.forEach((instance, i) => {\r\n // 在 instances 中通过 id 找到要关闭的消息\r\n if (id === instance.id) {\r\n offsetHeight = instance.$el.offsetHeight\r\n index = i\r\n\r\n // 关闭消息\r\n if (isFunction(beforeClose)) {\r\n beforeClose.call(instance)\r\n }\r\n\r\n instances.splice(i, 1)\r\n }\r\n })\r\n\r\n if (len <= 1 || index === -1 || index > instances.length - 1) {\r\n return false\r\n }\r\n\r\n i = index\r\n\r\n // 界面中的消息逐个向上收起\r\n for (; i < len - 1; i += 1) {\r\n const dom = instances[i].$el\r\n\r\n dom.style['top'] = parseInt(dom.style['top'], 10) - offsetHeight - 16 + 'px'\r\n }\r\n}\r\n\r\n// 关闭所有消息的静态方法\r\nMessage.clear = () => {\r\n let i = instances.length - 1\r\n for (; i >= 0; i -= 1) {\r\n instances[i].close()\r\n }\r\n}\r\n\r\nexport default Message\r\n","import isFunction from './utils/types/isFunction'\r\n\r\nclass Command {\r\n constructor(name, action) {\r\n this.name = name\r\n\r\n if (isFunction(action)) {\r\n this.action = action\r\n }\r\n }\r\n\r\n execute() {\r\n this.action()\r\n\r\n return this\r\n }\r\n}\r\n\r\nexport default Command\r\n","import isFunction from './utils/types/isFunction'\r\n\r\nclass Commands {\r\n constructor() {\r\n this.commands = []\r\n }\r\n\r\n get(name) {\r\n return this.commands.find((cmd) => cmd.name === name)\r\n }\r\n\r\n add(command) {\r\n this.commands.push(command)\r\n\r\n return this\r\n }\r\n\r\n del(name) {\r\n const commands = this.commands\r\n const command = commands.find((cmd) => cmd.name === name)\r\n const index = command ? commands.indexOf(command) : -1\r\n\r\n if (index > -1) {\r\n commands.splice(index, 1)\r\n }\r\n\r\n return this\r\n }\r\n\r\n clear() {\r\n this.commands = []\r\n\r\n return this\r\n }\r\n\r\n execute(name) {\r\n const command = this.commands.find((cmd) => cmd.name === name)\r\n\r\n if (isFunction(command?.execute)) {\r\n command.execute()\r\n }\r\n\r\n return this\r\n }\r\n}\r\n\r\nexport default Commands\r\n","import icon from './utils/icons/icon'\r\nimport createElement from './utils/dom/createElement'\r\nimport addClass from './utils/dom/addClass'\r\n\r\nconst _createButton = (button, rounded = true) => {\r\n const $icon = icon(button.icon, {\r\n iconSet: button.iconSet || 'outline',\r\n color: button.color || '',\r\n size: button.size\r\n })\r\n const $anchor = createElement(\r\n 'a',\r\n {\r\n className: `outline-toolbar__anchor`,\r\n href: button.link\r\n },\r\n $icon\r\n )\r\n const $button = createElement(\r\n 'div',\r\n {\r\n className: `outline-toolbar__button ${button.name}`,\r\n 'data-cmd': button.name\r\n },\r\n [button.link ? $anchor : $icon]\r\n )\r\n\r\n addClass($icon, 'outline-toolbar__icon')\r\n\r\n if (rounded) {\r\n addClass($button, 'outline-toolbar_rounded')\r\n }\r\n\r\n if (button.disabled) {\r\n addClass($button, 'outline-toolbar_disabled')\r\n }\r\n\r\n return $button\r\n}\r\n\r\nexport default _createButton\r\n","import isString from './utils/types/isString'\r\nimport isFunction from './utils/types/isFunction'\r\nimport isObject from './utils/types/isObject'\r\nimport isArray from './utils/types/isArray'\r\nimport later from './utils/lang/later'\r\nimport guid from './utils/lang/guid'\r\nimport cloneDeep from './utils/lang/cloneDeep'\r\nimport createElement from './utils/dom/createElement'\r\nimport addClass from './utils/dom/addClass'\r\nimport hasClass from './utils/dom/hasClass'\r\nimport removeClass from './utils/dom/removeClass'\r\nimport on from './utils/event/on'\r\nimport off from './utils/event/off'\r\nimport paint from './utils/icons/paint'\r\n\r\nimport Base from './base'\r\nimport Command from './command'\r\nimport Commands from './commands'\r\n\r\nimport _createButton from './_createButton'\r\n\r\nconst DISABLED = 'outline-toolbar_disabled'\r\nconst HIDDEN = 'outline-toolbar_hidden'\r\nconst ACTIVE = 'outline-toolbar_active'\r\n\r\nclass Toolbar extends Base {\r\n constructor(options) {\r\n super()\r\n\r\n this._default()\r\n\r\n if (options) {\r\n this.initialize(options)\r\n }\r\n }\r\n\r\n _default() {\r\n this.attrs = cloneDeep(Toolbar.DEFAULTS)\r\n\r\n this.disabled = false\r\n this.closed = false\r\n\r\n this.$el = null\r\n this.buttons = []\r\n this.commands = null\r\n\r\n return this\r\n }\r\n\r\n initialize(options) {\r\n let created\r\n\r\n this.attr(options)\r\n\r\n this.disabled = this.attr('disabled')\r\n this.closed = this.attr('closed')\r\n this.commands = new Commands()\r\n\r\n created = this.attr('created')\r\n\r\n if (isFunction(created)) {\r\n created.call(this)\r\n }\r\n\r\n this.render().addListeners()\r\n\r\n return this\r\n }\r\n\r\n isHighlight(name) {\r\n const button = this.get(name)\r\n\r\n if (!button) {\r\n return false\r\n }\r\n\r\n return hasClass(button.$el, ACTIVE)\r\n }\r\n\r\n isDisabled(name) {\r\n let button\r\n\r\n if (name) {\r\n button = this.get(name)\r\n\r\n return button.disabled\r\n }\r\n\r\n return this.disabled\r\n }\r\n\r\n isExist(name) {\r\n const button = this.get(name)\r\n return !!button\r\n }\r\n\r\n isClosed() {\r\n return this.closed\r\n }\r\n\r\n _getCommand(button) {\r\n const _self = this\r\n const { action, name } = button\r\n let command = null\r\n let handler = null\r\n let context\r\n let listener\r\n\r\n if (!action) {\r\n return command\r\n }\r\n\r\n handler = action.handler\r\n context = action.context || this\r\n\r\n if (isFunction(handler)) {\r\n listener = handler\r\n } else if (isString(handler)) {\r\n listener = function () {\r\n _self.$emit(handler, name)\r\n }\r\n }\r\n\r\n if (isFunction(listener)) {\r\n command = new Command(name, listener.bind(context))\r\n }\r\n\r\n return command\r\n }\r\n\r\n get(name) {\r\n return this.buttons.find((button) => button.name === name)\r\n }\r\n\r\n render() {\r\n const mounted = this.attr('mounted')\r\n const buttons = this.attr('buttons') || []\r\n const placement = this.attr('placement')\r\n\r\n paint()\r\n\r\n this.$el = createElement('div', {\r\n id: guid('outline-toolbar'),\r\n className: `outline-toolbar outline-toolbar_${placement}`\r\n })\r\n this._paint(buttons)\r\n document.body.appendChild(this.$el)\r\n\r\n if (this.closed) {\r\n this.hide()\r\n }\r\n\r\n if (this.disabled) {\r\n this.disable()\r\n }\r\n\r\n if (isFunction(mounted)) {\r\n mounted.call(this)\r\n }\r\n\r\n return this\r\n }\r\n\r\n erase() {\r\n this.$el.innerHTML = ''\r\n return this\r\n }\r\n\r\n _paint(buttons) {\r\n const rounded = this.attr('rounded')\r\n const $fragment = document.createDocumentFragment()\r\n\r\n buttons.forEach((button) => {\r\n const $button = _createButton(button, rounded)\r\n const command = this._getCommand(button)\r\n const { name, disabled, context } = button\r\n\r\n $fragment.appendChild($button)\r\n\r\n if (!this.isExist(name)) {\r\n this.buttons.push({\r\n $el: $button,\r\n name,\r\n disabled: disabled || false,\r\n context: context || this\r\n })\r\n\r\n if (command) {\r\n this.commands.add(command)\r\n }\r\n }\r\n })\r\n\r\n this.$el.appendChild($fragment)\r\n\r\n return this\r\n }\r\n\r\n _remove() {\r\n document.body.removeChild(this.$el)\r\n return this\r\n }\r\n\r\n refresh(buttons) {\r\n this.attr({ buttons })\r\n this.erase()._paint(buttons)\r\n return this\r\n }\r\n\r\n add(button) {\r\n const $el = this.$el\r\n const $fragment = document.createDocumentFragment()\r\n const buttons = this.attr('buttons') || []\r\n const { name, disabled, context } = button\r\n const command = this._getCommand(button)\r\n const _add = (button) => {\r\n const $button = _createButton(button)\r\n\r\n $fragment.appendChild($button)\r\n\r\n buttons.push(button)\r\n this.buttons.push({\r\n $el: $button,\r\n name,\r\n disabled: disabled || false,\r\n context: context || this,\r\n command\r\n })\r\n\r\n if (command) {\r\n this.commands.add(command)\r\n }\r\n }\r\n\r\n if (isObject(button)) {\r\n _add(button)\r\n } else if (isArray(button)) {\r\n button.forEach((item) => {\r\n if (isObject(item)) {\r\n _add(item)\r\n }\r\n })\r\n }\r\n $el.appendChild($fragment)\r\n\r\n return this\r\n }\r\n\r\n remove(name) {\r\n const $el = this.$el\r\n const buttons = this.buttons\r\n const button = this.get(name)\r\n let index = -1\r\n\r\n if (!button) {\r\n return this\r\n }\r\n\r\n index = buttons.indexOf(button)\r\n\r\n if (index > -1) {\r\n buttons.splice(index, 1)\r\n this.attr('buttons').splice(index, 1)\r\n }\r\n\r\n this._disable(name)\r\n $el.removeChild(button.$el)\r\n\r\n return this\r\n }\r\n\r\n _disable(name) {\r\n const button = this.get(name)\r\n const command = this.commands.get(name)\r\n\r\n if (!button || button.disabled) {\r\n return this\r\n }\r\n\r\n button.disabled = true\r\n\r\n if (command) {\r\n this.commands.del(command)\r\n }\r\n\r\n addClass(button.$el, DISABLED)\r\n\r\n return this\r\n }\r\n\r\n _enable(name) {\r\n const button = this.get(name)\r\n const command = this.commands.get(name)\r\n\r\n if (!button || !button.disabled) {\r\n return this\r\n }\r\n\r\n button.disabled = false\r\n\r\n if (command) {\r\n this.commands.add(command)\r\n }\r\n\r\n removeClass(button.$el, DISABLED)\r\n\r\n return this\r\n }\r\n\r\n disable(name) {\r\n const disabled = this.attr('afterDisabled')\r\n\r\n if (name) {\r\n this._disable(name)\r\n } else {\r\n addClass(this.$el, DISABLED)\r\n this.removeListeners()\r\n this.disabled = true\r\n\r\n if (isFunction(disabled)) {\r\n disabled.call(this)\r\n }\r\n }\r\n\r\n return this\r\n }\r\n\r\n enable(name) {\r\n const enabled = this.attr('afterEnabled')\r\n\r\n if (name) {\r\n this._enable(name)\r\n } else {\r\n this.disabled = false\r\n removeClass(this.$el, DISABLED)\r\n this.addListeners()\r\n\r\n if (isFunction(enabled)) {\r\n enabled.call(this)\r\n }\r\n }\r\n\r\n return this\r\n }\r\n\r\n show(name) {\r\n const opened = this.attr('afterOpened')\r\n const button = this.get(name)\r\n const $el = this.$el\r\n\r\n if (name) {\r\n if (!button) {\r\n return this\r\n }\r\n\r\n removeClass(button.$el, HIDDEN)\r\n } else {\r\n removeClass($el, HIDDEN)\r\n this.closed = false\r\n\r\n if (isFunction(opened)) {\r\n later(() => {\r\n opened.call(this)\r\n }, 310)\r\n }\r\n }\r\n\r\n return this\r\n }\r\n\r\n hide(name) {\r\n const closed = this.attr('afterClosed')\r\n const button = this.get(name)\r\n const $el = this.$el\r\n\r\n if (name) {\r\n if (!button) {\r\n return this\r\n }\r\n\r\n addClass(button.$el, HIDDEN)\r\n } else {\r\n addClass($el, HIDDEN)\r\n this.closed = true\r\n\r\n if (isFunction(closed)) {\r\n later(() => {\r\n closed.call(this)\r\n }, 310)\r\n }\r\n }\r\n\r\n return this\r\n }\r\n\r\n toggle(name) {\r\n if (this.isClosed()) {\r\n this.show(name)\r\n } else {\r\n this.hide(name)\r\n }\r\n\r\n return this\r\n }\r\n\r\n highlight(name) {\r\n const button = this.get(name)\r\n let $button\r\n\r\n if (!button) {\r\n return this\r\n }\r\n\r\n $button = button.$el\r\n\r\n if (hasClass($button, ACTIVE)) {\r\n removeClass($button, ACTIVE)\r\n } else {\r\n addClass($button, ACTIVE)\r\n }\r\n\r\n return this\r\n }\r\n\r\n destroy() {\r\n const beforeDestroy = this.attr('beforeDestroy')\r\n const afterDestroy = this.attr('afterDestroy')\r\n\r\n if (isFunction(beforeDestroy)) {\r\n beforeDestroy.call(this)\r\n }\r\n\r\n this.commands.clear()\r\n this.removeListeners()._remove()._default()\r\n\r\n if (isFunction(afterDestroy)) {\r\n afterDestroy.call(this)\r\n }\r\n\r\n return this\r\n }\r\n\r\n execute(name) {\r\n if (this.isDisabled(name)) {\r\n return this\r\n }\r\n\r\n this.commands.execute(name)\r\n\r\n return this\r\n }\r\n\r\n onExecute(evt) {\r\n const $button = evt.delegateTarget\r\n let cmd = ''\r\n\r\n if ($button) {\r\n cmd = $button.getAttribute('data-cmd')\r\n\r\n if (cmd) {\r\n this.execute(cmd)\r\n }\r\n }\r\n\r\n return this\r\n }\r\n\r\n _updateToolbar({ top, min, max }) {\r\n const current = Math.ceil(top)\r\n\r\n if (current <= min) {\r\n this.hide('up')\r\n this.show('down')\r\n } else if (current >= max) {\r\n this.hide('down')\r\n this.show('up')\r\n } else if (current > min && current < max) {\r\n this.show('up')\r\n this.show('down')\r\n }\r\n\r\n return this\r\n }\r\n\r\n onToolbarUpdate({ top, min, max }) {\r\n this._updateToolbar({ top, min, max })\r\n return this\r\n }\r\n\r\n onAddButton(buttons) {\r\n this.attr({\r\n buttons\r\n })\r\n this.refresh(buttons)\r\n\r\n return this\r\n }\r\n\r\n onRemoveButton(name) {\r\n this.remove(name)\r\n return this\r\n }\r\n\r\n addListeners() {\r\n const buttons = this.attr('buttons') || []\r\n const $el = this.$el\r\n\r\n if (!buttons || buttons.length < 1) {\r\n return this\r\n }\r\n\r\n on($el, `.outline-toolbar__button`, 'click', this.onExecute, this, true)\r\n\r\n this.$on('toolbar:update', this.onToolbarUpdate)\r\n this.$on('toolbar:add:button', this.onAddButton)\r\n this.$on('toolbar:remove:button', this.onRemoveButton)\r\n this.$on('toolbar:toggle', this.toggle)\r\n\r\n return this\r\n }\r\n\r\n removeListeners() {\r\n const buttons = this.attr('buttons') || []\r\n const $el = this.$el\r\n\r\n if (!buttons || buttons.length < 1) {\r\n return this\r\n }\r\n\r\n off($el, '.outline-toolbar__button', this.onExecute)\r\n\r\n this.$off('toolbar:update')\r\n this.$off('toolbar:add:button')\r\n this.$off('toolbar:remove:button')\r\n this.$off('toolbar:toggle')\r\n\r\n return this\r\n }\r\n}\r\n\r\nToolbar.DEFAULTS = (() => {\r\n const OPTIONS = {\r\n placement: 'ltr',\r\n closed: false,\r\n disabled: false,\r\n rounded: true,\r\n buttons: [],\r\n created: null,\r\n mounted: null,\r\n afterClosed: null,\r\n afterOpened: null,\r\n afterDisabled: null,\r\n afterEnabled: null,\r\n beforeDestroy: null,\r\n afterDestroy: null\r\n }\r\n\r\n return cloneDeep(OPTIONS)\r\n})()\r\n\r\nexport default Toolbar\r\n","import publish from './utils/observer/emit'\r\n\r\nclass Speech {\r\n constructor(options) {\r\n this.utterance = new SpeechSynthesisUtterance()\r\n\r\n if (options) {\r\n this.initialize(options)\r\n }\r\n }\r\n\r\n _initialize(options) {\r\n if (options.lang) {\r\n this.setLang(options.lang)\r\n }\r\n\r\n if (options.pitch) {\r\n this.setPitch(options.pitch)\r\n }\r\n\r\n if (options.rate) {\r\n this.setRate(options.rate)\r\n }\r\n\r\n if (options.text) {\r\n this.setText(options.text)\r\n }\r\n\r\n if (options.voice) {\r\n this.setVoice(options.voice)\r\n }\r\n\r\n if (options.volume) {\r\n this.setVolume(options.volume)\r\n }\r\n\r\n return this\r\n }\r\n\r\n initialize(options) {\r\n this._initialize(options)._addListeners()\r\n return this\r\n }\r\n\r\n isSpeaking() {\r\n return speechSynthesis.speaking\r\n }\r\n\r\n isPending() {\r\n return speechSynthesis.pending\r\n }\r\n\r\n isPaused() {\r\n return speechSynthesis.paused\r\n }\r\n\r\n getVoices() {\r\n return speechSynthesis.getVoices()\r\n }\r\n\r\n setLang(lang) {\r\n this.utterance.lang = lang\r\n return this\r\n }\r\n\r\n setPitch(pitch) {\r\n this.utterance.pitch = pitch\r\n return this\r\n }\r\n\r\n setRate(rate) {\r\n this.utterance.rate = rate\r\n return this\r\n }\r\n\r\n setText(text) {\r\n this.utterance.text = text\r\n return this\r\n }\r\n\r\n setVoice(voice) {\r\n this.utterance.voice = voice\r\n return this\r\n }\r\n\r\n setVolume(volume) {\r\n this.utterance.volume = volume\r\n return this\r\n }\r\n\r\n speak(text) {\r\n if (text) {\r\n this.setText(text)\r\n }\r\n\r\n speechSynthesis.speak(this.utterance)\r\n\r\n return this\r\n }\r\n\r\n pause() {\r\n speechSynthesis.pause()\r\n return this\r\n }\r\n\r\n resume() {\r\n speechSynthesis.resume()\r\n return this\r\n }\r\n\r\n cancel() {\r\n speechSynthesis.cancel()\r\n this.setText('')\r\n return this\r\n }\r\n\r\n _addListeners() {\r\n const UTTERANCE_EVENTS = [\r\n 'boundary',\r\n 'end',\r\n 'error',\r\n 'start',\r\n 'mark',\r\n 'pause',\r\n 'resume'\r\n ]\r\n const utterance = this.utterance\r\n const speech = this\r\n\r\n UTTERANCE_EVENTS.forEach((name) => {\r\n utterance[`on${name}`] = (event) => {\r\n publish(name, {\r\n event,\r\n speech\r\n })\r\n }\r\n })\r\n\r\n speechSynthesis.onvoiceschanged = (event) => {\r\n publish('voiceschanged', {\r\n event,\r\n speech\r\n })\r\n }\r\n\r\n return this\r\n }\r\n}\r\n\r\nSpeech.isSupport = (() => {\r\n return 'speechSynthesis' in window\r\n})()\r\n\r\nexport default Speech\r\n","import addClass from './utils/dom/addClass'\r\n\r\nconst _updateSiblingElements = (siblingElement, isPrev) => {\r\n let tagName\r\n let $sibling = siblingElement\r\n\r\n while ($sibling) {\r\n tagName = $sibling.tagName.toLowerCase()\r\n\r\n if (tagName !== 'script' && tagName !== 'style') {\r\n addClass($sibling, 'outline-reader_sibling')\r\n }\r\n\r\n if (isPrev) {\r\n $sibling = $sibling.previousElementSibling\r\n } else {\r\n $sibling = $sibling.nextElementSibling\r\n }\r\n }\r\n}\r\n\r\nexport default _updateSiblingElements\r\n","/**\r\n * 检测当前设备是否为移动设备\r\n * ========================================================================\r\n * @method isMobile\r\n * @return {boolean}\r\n */\r\nconst isMobile = () => {\r\n const ua = navigator.userAgent\r\n\r\n return /Mobile|mini|Fennec|Android|iP(ad|od|hone)|NokiaN[^/]*/.test(ua)\r\n}\r\n\r\nexport default isMobile\r\n","import cloneDeep from './utils/lang/cloneDeep'\r\nimport later from './utils/lang/later'\r\nimport isString from './utils/types/isString'\r\nimport isElement from './utils/types/isElement'\r\nimport isFunction from './utils/types/isFunction'\r\nimport createElement from './utils/dom/createElement'\r\nimport addClass from './utils/dom/addClass'\r\nimport removeClass from './utils/dom/removeClass'\r\nimport at from './utils/event/at'\r\nimport stop from './utils/event/stop'\r\nimport off from './utils/event/off'\r\n\r\nimport Base from './base'\r\nimport Message from './message'\r\nimport Toolbar from './toolbar'\r\nimport Speech from './speech'\r\n\r\nimport _updateSiblingElements from './_updateSiblingElements'\r\nimport isMobile from './utils/dom/isMobile'\r\n\r\nconst ENTER_READING_TIP = '进入阅读模式,按 ESC 键可退出阅读模式'\r\n\r\nclass Reader extends Base {\r\n constructor(options) {\r\n super()\r\n\r\n this._default()\r\n\r\n if (options) {\r\n this.initialize(options)\r\n }\r\n }\r\n\r\n _default() {\r\n this.attrs = cloneDeep(Reader.DEFAULTS)\r\n this.reading = false\r\n\r\n this.$target = null\r\n this.$el = null\r\n this.$paper = null\r\n this.$title = null\r\n this.$article = null\r\n this.$progress = null\r\n\r\n this.toolbar = null\r\n this.speech = null\r\n\r\n return this\r\n }\r\n\r\n initialize(options) {\r\n let target\r\n\r\n this.attr(options)\r\n\r\n target = this.attr('target')\r\n\r\n if (isString(target)) {\r\n this.$target = document.querySelector(target)\r\n } else if (isElement(target)) {\r\n this.$target = target\r\n }\r\n\r\n if (!this.$target) {\r\n return this\r\n }\r\n\r\n if (Speech.isSupport) {\r\n this.speech = new Speech()\r\n }\r\n\r\n this.render().addListeners()\r\n\r\n return this\r\n }\r\n\r\n isSpeaking() {\r\n return this?.speech?.isSpeaking()\r\n }\r\n\r\n render() {\r\n this._renderEdge()._paint(this.$target)\r\n return this\r\n }\r\n\r\n erase() {\r\n this.$article.innerHTML = ''\r\n return this\r\n }\r\n\r\n _paint($content) {\r\n const $fragment = document.createDocumentFragment()\r\n const $children = [...$content.cloneNode(true).children]\r\n\r\n later(() => {\r\n $children.forEach(($child) => {\r\n $fragment.appendChild($child)\r\n })\r\n\r\n this.$article.appendChild($fragment)\r\n })\r\n\r\n return this\r\n }\r\n\r\n _remove() {\r\n const $el = this.$el\r\n const toolbar = this.toolbar\r\n\r\n if ($el) {\r\n document.body.removeChild($el)\r\n }\r\n\r\n if (toolbar) {\r\n toolbar.destroy()\r\n }\r\n\r\n return this\r\n }\r\n\r\n refresh() {\r\n this.erase()._paint(this.$target)\r\n return this\r\n }\r\n\r\n _animateTimeline() {\r\n // eslint-disable-next-line\r\n if (!window.ScrollTimeline || !isMobile()) {\r\n return this\r\n }\r\n\r\n this.$progress.animate(\r\n {\r\n // from\r\n scale: ['0 1', '1 1']\r\n },\r\n {\r\n // eslint-disable-next-line\r\n timeline: new ScrollTimeline({\r\n source: this.$article,\r\n axis: 'block'\r\n })\r\n }\r\n )\r\n\r\n return this\r\n }\r\n\r\n _renderEdge() {\r\n const $target = this.$target\r\n const mobile = isMobile()\r\n const size = mobile ? 26 : 20\r\n let title = this.attr('title')\r\n let $el\r\n let $paper\r\n let $title\r\n let $article\r\n let $progress\r\n let $sibling\r\n\r\n $progress = createElement('div', {\r\n className: 'outline-reader__progress'\r\n })\r\n this.$progress = $progress\r\n\r\n $title = $target.querySelector('h1')\r\n\r\n if (isElement(title)) {\r\n $title = title\r\n }\r\n\r\n if (isElement($title)) {\r\n title = $title.innerText\r\n }\r\n\r\n $title = createElement(\r\n 'h1',\r\n {\r\n className: 'outline-reader__title'\r\n },\r\n title\r\n )\r\n this.$title = $title\r\n\r\n $article = createElement(\r\n 'article',\r\n {\r\n id: 'outline-reader__article',\r\n className: 'outline-reader__article'\r\n },\r\n isMobile() ? [] : [$progress.cloneNode()]\r\n )\r\n this.$article = $article\r\n\r\n $paper = createElement(\r\n 'div',\r\n {\r\n id: 'outline-reader__paper',\r\n className: 'outline-reader__paper'\r\n },\r\n [$title, $article]\r\n )\r\n this.$paper = $paper\r\n\r\n const buttons = []\r\n\r\n buttons.push({\r\n name: 'print',\r\n icon: 'print',\r\n size,\r\n action: {\r\n context: this,\r\n handler: this.print\r\n }\r\n })\r\n\r\n if (Speech.isSupport && this.attr('allowSpeak')) {\r\n buttons.push({\r\n name: 'speak',\r\n icon: 'sound',\r\n size,\r\n action: {\r\n context: this,\r\n handler: this.speak\r\n }\r\n })\r\n }\r\n\r\n buttons.push({\r\n name: 'exit',\r\n icon: 'close',\r\n size,\r\n action: {\r\n context: this,\r\n handler: this.exit\r\n }\r\n })\r\n\r\n this.toolbar = new Toolbar({\r\n placement: 'rtl',\r\n buttons\r\n })\r\n\r\n $el = createElement(\r\n 'section',\r\n {\r\n id: 'outline-reader',\r\n className: 'outline-reader outline-reader_hidden'\r\n },\r\n [$progress, $paper, this.toolbar.$el]\r\n )\r\n this.$el = $el\r\n\r\n document.body.appendChild($el)\r\n\r\n this._animateTimeline()\r\n\r\n later(() => {\r\n // 设置邻居节点的打印样式\r\n $sibling = $el.previousElementSibling\r\n _updateSiblingElements($sibling, true)\r\n\r\n $sibling = $el.nextElementSibling\r\n _updateSiblingElements($sibling)\r\n })\r\n\r\n return this\r\n }\r\n\r\n enter() {\r\n const READER = 'outline-reader'\r\n const READING = `${READER}--reading`\r\n const HIDDEN = `${READER}_hidden`\r\n const $el = this.$el\r\n const $siblings = document.querySelectorAll('.outline-reader_sibling')\r\n const enterReadingTip = this.attr('enterReadingTip') || ENTER_READING_TIP\r\n\r\n if (this.reading || !$el) {\r\n return this\r\n }\r\n\r\n $siblings.forEach(($sibling) => {\r\n addClass($sibling, HIDDEN)\r\n })\r\n addClass($el, READING)\r\n removeClass($el, HIDDEN)\r\n this.toolbar.show()\r\n this.reading = true\r\n\r\n Message.info({\r\n round: true,\r\n message: enterReadingTip\r\n })\r\n\r\n this.$emit('reader:enter')\r\n\r\n return this\r\n }\r\n\r\n exit() {\r\n const SPEAK = 'speak'\r\n const READER = 'outline-reader'\r\n const READING = `${READER}--reading`\r\n const HIDDEN = `${READER}_hidden`\r\n const $el = this.$el\r\n const $siblings = document.querySelectorAll('.outline-reader_sibling')\r\n const speech = this.speech\r\n const toolbar = this.toolbar\r\n\r\n if (!this.reading || !$el) {\r\n return this\r\n }\r\n\r\n addClass($el, HIDDEN)\r\n removeClass($el, READING)\r\n $siblings.forEach(($sibling) => {\r\n removeClass($sibling, HIDDEN)\r\n })\r\n toolbar.hide()\r\n this.reading = false\r\n\r\n if (speech) {\r\n if (toolbar.isHighlight(SPEAK)) {\r\n toolbar.highlight(SPEAK)\r\n }\r\n\r\n speech.cancel()\r\n }\r\n\r\n this.$emit('reader:exit')\r\n\r\n return this\r\n }\r\n\r\n toggle() {\r\n if (this.reading) {\r\n this.exit()\r\n } else {\r\n this.enter()\r\n }\r\n\r\n return this\r\n }\r\n\r\n speak() {\r\n const text = this.$article.innerText\r\n const speech = this.speech\r\n\r\n if (!Speech.isSupport || !speech) {\r\n return this\r\n }\r\n\r\n this.toolbar.highlight('speak')\r\n\r\n if (this.isSpeaking()) {\r\n speech.cancel()\r\n } else {\r\n speech.speak(text)\r\n }\r\n\r\n return this\r\n }\r\n\r\n print() {\r\n if (!isFunction(print)) {\r\n return this\r\n }\r\n\r\n print()\r\n\r\n return this\r\n }\r\n\r\n destroy() {\r\n const $el = this.$el\r\n\r\n if (!$el) {\r\n return this\r\n }\r\n\r\n this.removeListeners()._remove()._default()\r\n\r\n return this\r\n }\r\n\r\n onPrint() {\r\n this.print()\r\n return this\r\n }\r\n\r\n onEnterReading() {\r\n this.toggle()\r\n return this\r\n }\r\n\r\n onExitReading(evt) {\r\n const keyCode = evt.keyCode\r\n\r\n if (keyCode === 27 && this.reading) {\r\n this.toggle()\r\n stop(evt)\r\n }\r\n\r\n return this\r\n }\r\n\r\n onRefresh() {\r\n this.refresh()\r\n\r\n return this\r\n }\r\n\r\n addListeners() {\r\n const $el = this.$el\r\n\r\n if (!$el) {\r\n return this\r\n }\r\n\r\n at(document, 'keyup', this.onExitReading, this, true)\r\n\r\n this.$on('toolbar:action:print', this.onPrint)\r\n this.$on('toolbar:action:reading', this.onEnterReading)\r\n this.$on('reader:print', this.onPrint)\r\n this.$on('reader:refresh', this.onRefresh)\r\n this.$on('reader:enter', this.enter)\r\n this.$on('reader:exit', this.exit)\r\n this.$on('reader:toggle', this.toggle)\r\n\r\n return this\r\n }\r\n\r\n removeListeners() {\r\n const $el = this.$el\r\n\r\n if (!$el) {\r\n return this\r\n }\r\n\r\n off(document, 'keyup', this.onExitReading)\r\n\r\n this.$off('toolbar:action:print')\r\n this.$off('toolbar:action:reading')\r\n this.$off('reader:refresh')\r\n this.$off('reader:toggle')\r\n\r\n return this\r\n }\r\n}\r\n\r\nReader.DEFAULTS = (() => {\r\n const OPTIONS = {\r\n target: '',\r\n title: '',\r\n enterReadingTip: ENTER_READING_TIP,\r\n allowSpeak: false\r\n }\r\n\r\n return cloneDeep(OPTIONS)\r\n})()\r\n\r\nexport default Reader\r\n","/**\r\n * 停止事件(阻止默认行为和阻止事件的捕获或冒泡)\r\n * ========================================================================\r\n * @method stop\r\n * @param {Event} evt - 事件对象\r\n *\r\n * @example\r\n *
\r\n * Service\r\n * Help\r\n *
\r\n *\r\n * const $nav = document.querySelector('#nav')\r\n * const $service = document.querySelector('.anchor')\r\n *\r\n * on($nav, 'click', function(evt) {\r\n * console.log('你点击了导航栏')\r\n * })\r\n *\r\n * on($anchor, 'click', function(evt) {\r\n * console.log('tagName', this.tagName)\r\n *\r\n * // 工作台输出:'a'\r\n * // 不会触发事件冒泡,输出:'你点击了导航栏'\r\n * // 也不会切换到 href 属性的页面,阻止了点击链接的默认行为\r\n * stopEvent(evt)\r\n * })\r\n */\r\nconst stop = function (evt) {\r\n evt.stopPropagation()\r\n evt.preventDefault()\r\n}\r\n\r\nexport default stop\r\n","import isFunction from '../types/isFunction'\r\nimport off from './off'\r\n\r\nimport { CAPTURE_EVENTS } from './enum'\r\n\r\n/**\r\n * 绑定事件\r\n * ========================================================================\r\n * @method at\r\n * @param {HTMLElement|String|Object} el - (必须)绑定代理事件的 DOM 节点\r\n * @param {String|Function} type - (必须)事件类型或者事件处理器回调函数\r\n * @param {Function|Object} fn - (必须) 事件处理器回调函数或者传递给事件处理器回调函数的数据对象\r\n * @param {Object|Boolean} [data] - (可选)传递给事件处理器回调函数的数据对象或者事件处理器回调函数的 this 上下文指向,\r\n * @param {Object|Boolean} [context] - (可选)事件处理器回调函数的 this 上下文指向,或者是否仅触发一次\r\n * 当设置为 true 时,则事件处理器回调函数的 this 上下文指向为 data 对象\r\n * @param {Boolean} once - (可选)是否仅触发一次\r\n */\r\nconst at = (el, type, fn, data, context, once = false) => {\r\n // CAPTURE_EVENTS 中的特殊事件,采用事件捕获模型\r\n const capture = CAPTURE_EVENTS.indexOf(type) > -1\r\n const listener = function (evt) {\r\n let overrideContext = context || el\r\n\r\n // 当设置为 true 时,则事件处理器回调函数的\r\n // this 上下文指向为 data 对象\r\n if (context === true) {\r\n overrideContext = data\r\n }\r\n\r\n // 仅触发一次\r\n /* istanbul ignore else */\r\n if (once === true) {\r\n off(el, type, listener)\r\n }\r\n\r\n fn.call(overrideContext, evt, data)\r\n }\r\n\r\n if (!isFunction(fn)) {\r\n return false\r\n }\r\n\r\n if (!el._listeners) {\r\n el._listeners = []\r\n }\r\n\r\n // 缓存 options 元素绑定的事件处理器\r\n el._listeners.push({\r\n el,\r\n type,\r\n fn: listener,\r\n data,\r\n context,\r\n capture\r\n })\r\n\r\n // 缓存包装后的事件处理器\r\n fn._delegateListener = listener\r\n\r\n el.addEventListener(type, listener, capture)\r\n}\r\n\r\nexport default at\r\n"],"names":["toString","val","Object","prototype","apply","isFunction","isObject","o","isArray","Array","cloneDeep","obj","clone","from","assign","keys","forEach","key","later","fn","delay","setTimeout","isString","str","isElement","nodeName","tagName","nodeType","isDOM","el","isHTMLCollection","fragment","isTextNode","hasOwn","prop","hasOwnProperty","call","hasClass","className","pattern","RegExp","allClass","classList","contains","exec","addClass","_classList","add","indexOf","split","name","length","setAttribute","attr","value","toLowerCase","style","cssText","innerHTML","innerText","setAttributes","attrs","createElement","children","$fragment","document","createDocumentFragment","$el","isValidChild","child","append","$child","createTextNode","appendChild","every","removeClass","remove","replace","CAPTURE_EVENTS","_off","type","capture","_delegateListener","listeners","_listeners","index","listener","i","handler","splice","_delete","removeEventListener","purgeElement","recurse","$element","querySelector","$children","childNodes","getListeners","filter","arguments","off","extend","origin","source","_subscribers","_hasDirectSubscribersFor","topic","has","isDirect","found","position","lastIndexOf","substring","_hasSubscribers","emit","data","async","execute","subscriber","message","callback","context","deliver","guid","uuid","prefix","_removeSubscriber","token","subject","execution","j","_removeSubscriberByToken","Base","constructor","options","this","initialize","render","addListeners","refresh","destroy","removeListeners","reload","$emit","event","publish","$on","on","push","subscribe","$off","unsubscribe","isPlainObject","getPrototypeOf","proto","isObjectLike","stripScripts","encodeHTML","CHARTS","tag","ICON","size","color","iconSet","width","height","defaultRules","cssRules","$icon","$svg","binds","svg","test","isSVG","xmlns","class","icon","SYMBOLS","_maybeArrayLike","_toConsumableArray","getSymbols","getSymbol","patternName","patternSet","find","symbol","fullName","paint","$body","body","$icons","symbols","join","insertBefore","firstChild","matches","selector","sel","msMatchesSelector","getParentOrHost","host","parentNode","once","evt","target","getTarget","delegateTarget","closest","ctx","includeCTX","startsWith","overrideContext","addEventListener","instances","instance","Message","super","_default","DEFAULTS","id","closed","visible","offset","timer","destroyed","_objectSpread","open","isClosed","isDestroyed","_getClassName","effect","round","closable","customClass","dangerouslyUseHTMLString","$type","$message","$text","$close","iconSize","_refreshIcon","HIDDEN","iconName","$use","_refreshMessage","text","_refreshClose","_refreshEl","clearTimer","clearTimeout","startTimer","duration","close","top","destroyAfterClosed","beforeClose","removeChild","onMouseEnter","onMouseLeave","onClose","config","item","offsetHeight","len","dom","parseInt","clear","Command","action","Commands","commands","get","cmd","command","del","_createButton","button","rounded","$anchor","href","link","$button","disabled","DISABLED","ACTIVE","Toolbar","buttons","created","isHighlight","isDisabled","isExist","_getCommand","_self","bind","mounted","placement","_paint","hide","disable","erase","_remove","_add","_disable","_enable","enable","enabled","show","opened","toggle","highlight","beforeDestroy","afterDestroy","onExecute","getAttribute","_updateToolbar","min","max","current","Math","ceil","onToolbarUpdate","onAddButton","onRemoveButton","afterClosed","afterOpened","afterDisabled","afterEnabled","Speech","utterance","SpeechSynthesisUtterance","_initialize","lang","setLang","pitch","setPitch","rate","setRate","setText","voice","setVoice","volume","setVolume","_addListeners","isSpeaking","speechSynthesis","speaking","isPending","pending","isPaused","paused","getVoices","speak","pause","resume","cancel","speech","onvoiceschanged","isSupport","window","_updateSiblingElements","siblingElement","isPrev","$sibling","previousElementSibling","nextElementSibling","isMobile","ua","navigator","userAgent","ENTER_READING_TIP","Reader","reading","$target","$paper","$title","$article","$progress","toolbar","_this$speech","_renderEdge","$content","cloneNode","_animateTimeline","ScrollTimeline","animate","scale","timeline","axis","title","print","exit","enter","READER","READING","$siblings","querySelectorAll","enterReadingTip","info","SPEAK","onPrint","onEnterReading","onExitReading","keyCode","stopPropagation","preventDefault","stop","onRefresh","at","allowSpeak"],"mappings":"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"} \ No newline at end of file diff --git a/docs/js/toolbar.min.js b/docs/js/toolbar.min.js deleted file mode 100644 index 6c339686..00000000 --- a/docs/js/toolbar.min.js +++ /dev/null @@ -1,2 +0,0 @@ -!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(t="undefined"!=typeof globalThis?globalThis:t||self).Toolbar=e()}(this,(function(){"use strict";const t=t=>"string"==typeof t,e=t=>Object.prototype.toString.apply(t),s=t=>"function"==typeof t||"[object Function]"===e(t),i=t=>("[object Object]"===e(t)||"object"==typeof t||s(t))&&null!==t,n=t=>Array.isArray?Array.isArray(t):"[object Array]"===e(t),o=(t,e=300)=>!!s(t)&&setTimeout((()=>{t()}),e),r=(()=>{let t=0;return e=>(t+=1,e?e+"-"+t:"guid-"+t)})(),l=t=>{let e={};return null===t?null:(n(t)?e=Array.from(t):(e=Object.assign({},t),Object.keys(e).forEach((s=>e[s]=i(t[s])?l(t[s]):t[s]))),e)},a=t=>!!(i(t)&&t.nodeName&&t.tagName&&1===t.nodeType),c=t=>{return!(!i(t)||!(a(t)||(t=>!(!i(t)||"[object NodeList]"!==e(t)))(t)||(s=t,i(s)&&"[object DocumentFragment]"===e(s))||(t=>!(!i(t)||!("[object Text]"===e(t)||t.tagName&&3===t.nodeType)))(t)));var s},h=(t,e)=>{const s=Object.prototype.hasOwnProperty;return t&&s.call(t,e)},d=(t,e)=>{const s=new RegExp("(\\s|^)"+e+"(\\s|$)");let i,n;return!!a(t)&&(i=t.className,!!i&&(n=t.classList,n&&n.contains?t.classList.contains(e):!!s.exec(i)))},u=(t,e)=>{var s;let i,n;if(d(t,e))return!1;i=t.classList,null!==(s=i)&&void 0!==s&&s.add?e.indexOf(" ")>-1?e.split(" ").forEach((t=>{i.add(t)})):i.add(e):(n=t.className,n+=n.length>0?" "+e:e,t.className=n)},m=(t,e)=>{if(!t||!i(e))return!1;Object.keys(e).forEach((s=>{const i=e[s];h(e,s)&&((t,e,s)=>{let i=t.tagName.toLowerCase();switch(e){case"style":t.style.cssText=s;break;case"value":"input"===i||"textarea"===i?t.value=s:t.setAttribute(e,s);break;case"htmlFor":t.setAttribute("for",s);break;case"className":u(t,s);break;case"innerHTML":t.innerHTML=s;break;case"innerText":t.innerText=s;break;default:t.setAttribute(e,s)}})(t,s,i)}))},b=(e,s,o)=>{const r=document.createDocumentFragment(),l=document.createElement(e),a=e=>c(e)||t(e),h=e=>{let s;if(!a(e))return!1;c(e)?s=e:t(e)&&(s=document.createTextNode(e)),r.appendChild(s)};return i(s)?m(l,s):n(s)&&s.every((t=>a(t)))?s.forEach((t=>{h(t)})):c(s)?h(s):t(s)&&h(document.createTextNode(s)),n(o)?o.forEach((t=>{h(t)})):h(o),l.appendChild(r),l},p=(e,s)=>{var i;let n,o=e.className;if(!o||!d(e,s))return!1;var r;n=e.classList,null!==(i=n)&&void 0!==i&&i.remove?n.remove(s):(r=o.replace(s,""),o=!!t(r)&&r.replace(/(^\s+)|(\s+$)/g,""),e.className=o)},f=(t,e="")=>{const s=e.replace(/^>/i,"");return!!(e&&s&&t)&&(t.matches?t.matches(s):!!t.msMatchesSelector&&t.msMatchesSelector(s))},y=t=>t.host&&t!==document&&t.host.nodeType?t.host:t.parentNode,v=["focusout","blur","focusin","focus","load","unload","mouseenter","mouseleave"],g=(t,e,s)=>{const i=v.indexOf(e)>-1;s._delegateListener&&delete(s=s._delegateListener)._delegateListener,function(t,e,s){const i=t._listeners;let n=-1;if(i.length<1)return!1;i.forEach(((t,i)=>{const o=t.fn;e===t.type&&(n=i,o===s&&(n=i))})),n>-1&&i.splice(n,1)}(t,e,s),t.removeEventListener(e,s,i)},x=function(e,s,i=!1){const n=t(e)?document.querySelector(e):e,o=n.childNodes,r=((e,s)=>{let i=e._listeners||[];return t(s)&&s&&(i=i.filter((t=>t.type===s))),i})(n,s);r.forEach((t=>{g(n,t.type,t.fn)})),(i||!0===s||1===arguments.length)&&n&&o&&o.forEach((t=>{a(t)&&x(t,s,i)}))},z=(t,e,i)=>{if(!s(i))return x(t,e),!1;g(t,e,i)},M=(t,e,s,i,n,o,r=!1)=>{const l=v.indexOf(s)>-1,a=function(l){const c=function(t){const e=t.target;return(s=e)&&3===s.nodeType?s.parentNode:s;var s}(l),h=((t,e,s,i)=>{const n=s||document;if(!t)return null;do{if(null!=e&&(e.startsWith(">")?t.parentNode===n&&f(t,e):f(t,e))||i&&t===n)return t;if(t===n)break}while(t=y(t))})(c,e,t);let d=o||t;l.delegateTarget=h,!0===o&&(d=n),h&&(!0===r&&z(t,s,a),i.call(d,l,n))};if(!t)return!1;t._listeners||(t._listeners=[]),t._listeners.push({el:t,selector:e,type:s,fn:a,data:n,context:o,capture:l}),i._delegateListener=a,t.addEventListener(s,a,l)};function $(t,e){(null==e||e>t.length)&&(e=t.length);for(var s=0,i=Array(e);s','','','','','','','','','','','','','','','','','','','']),A=(e,s="icon")=>t(e)?((t,e="icon")=>{const s=/id="(.*?)"/,i=/^(\w+)-/;return L.find((n=>{const o=s.exec(n)[1];return i.exec(o)[1]===e&&o===("icon"===e?`${e}-${t}`:`${e}-icon-${t}`)}))})(e,s):w(_,L),E=(e="")=>{const s=document.body;let i=document.querySelector("#outline-icons"),o=[];(e=>{if(!e)return!1;n(e)&&e.length>0?e.forEach((e=>{-1===L.indexOf(e)&&t(e)&&L.push(e)})):t(e)&&L.push(e)})(e),o=A(),i?i.innerHTML=o.join(""):(i=document.createElement("div"),i.innerHTML=``,s.insertBefore(i.firstChild,s.firstChild))},j={},C=t=>h(j,t)&&j[t].length>0,T=(t,e=!0)=>e?C(t):(t=>{let e=C(t),s=t.lastIndexOf(".");for(;!e&&-1!==s;)s=(t=t.substring(0,s)).lastIndexOf("."),e=C(t);return e})(t),B=(t,s,i=!0)=>{const n=t=>{if(!C(t))return!1;j[t].forEach((t=>{const i=["[object Int8Array]","[object Uint8Array]","[object Uint8ClampedArray]","[object Int16Array]","[object Uint16Array]","[object Int32Array]","[object Uint32Array]","[object Float32Array]","[object Float64Array]","[object BigInt64Array]","[object BigUint64Array]"].indexOf(e(s))>-1?s.toString():s;t.callback.call(t.context||t,i)}))},o=()=>{let e=t,s=t.lastIndexOf(".");for(;-1!==s;)e=e.substring(0,s),s=e.lastIndexOf("."),n(e);n(t),n("*")};if(!T(t))return!1;i?setTimeout(o,10):o()},N=t=>{if(!h(j,t))return!1;delete j[t]},O=(t,e)=>{if(!T(t))return!1;e?(t=>{const e=Object.keys(j);if(!t||e.length<1)return!1;e.forEach((e=>{const s=j[e];let i;s.forEach(((e,n)=>{e.callback!==t&&e.token!==t||(i=e.topic,s.splice(-1,n))})),s.length<1&&N(i)}))})(e):N(t)};class S{constructor(t){this.attrs={},t&&this.initialize(t)}initialize(t){return this.attr(t).render().addListeners(),this}attr(e,s){const n=this.attrs;return t(e)?s&&h(n,e)?(n[e]=s,this):n[e]:i(e)?(o=n,r=e,Object.keys(r).forEach((t=>{h(r,t)&&(o[t]=r[t])})),this):0===arguments.length?n:this;var o,r}render(){return this}refresh(){return this}destroy(){return this.removeListeners(),this}reload(t){let e=this.attr();return t&&(e=this.attr(t)),this.destroy().initialize(e),this}$emit(t,e){return B(t,e),this}$on(t,e){return((t,e,i=null)=>{const n=r();let o="symbol"==typeof t?t.toString():t;s(e)&&(j[o]||(j[o]=[]),j[o].push({topic:o,callback:e,context:i,token:n}))})(t,e,this),this}$off(t,e){return O(t,e),this}addListeners(){return this}removeListeners(){return this}}class k{constructor(t,e){this.name=t,s(e)&&(this.action=e)}execute(){return this.action(),this}}class H{constructor(){this.commands=[]}get(t){return this.commands.find((e=>e.name===t))}add(t){return this.commands.push(t),this}del(t){const e=this.commands,s=e.find((e=>e.name===t)),i=s?e.indexOf(s):-1;return i>-1&&e.splice(i,1),this}clear(){return this.commands=[],this}execute(t){const e=this.commands.find((e=>e.name===t));return s(null==e?void 0:e.execute)&&e.execute(),this}}const D=(e,s={})=>{const i="outline-icon",o=s.size||0,r=s.color||"",l=s.iconSet||"",a=n(o)?o[0]:o,c=n(o)?o[1]:o,h=o?`width:${a}px;height:${c}px;`:"",d=r?h+`color:${r}`:h,u=s.attrs||{},b=document.createElement("i");let p,f="",y="";return t(e)?((e=>{const s=new RegExp("^\\s*(?:<\\?xml[^>]*>\\s*)?(?:<\\!doctype svg[^>]*\\s*(?:\\[?(?:\\s*]*>\\s*)*\\]?)*[^>]*>\\s*)?]*>[^]*<\\/svg>\\s*$\\s*$","i");return t(e)&&s.test(e)})(e)?y=e:(f=l&&"icon"!==l?`xlink:href="#${l}-icon-${e}"`:`xlink:href="#icon-${e}"`,y=``),b.innerHTML=y,u.className?u.className=`${i} ${u.className}`:u.className=i,m(b,u),p=b.querySelector("svg"),m(p,{"aria-hidden":!0,xmlns:"http://www.w3.org/2000/svg",class:"outline-icon__svg",width:200,height:200,style:d}),b):null},I=(t,e=!0)=>{const s=((t,e={})=>D(t,e))(t.icon,{iconSet:t.iconSet||"outline",color:t.color||"",size:t.size}),i=b("a",{className:"outline-toolbar__anchor",href:t.link},s),n=b("div",{className:`outline-toolbar__button ${t.name}`,"data-cmd":t.name},[t.link?i:s]);return u(s,"outline-toolbar__icon"),e&&u(n,"outline-toolbar_rounded"),t.disabled&&u(n,"outline-toolbar_disabled"),n},V="outline-toolbar_disabled",F="outline-toolbar_hidden",U="outline-toolbar_active";class q extends S{constructor(t){super(),this._default(),t&&this.initialize(t)}_default(){return this.attrs=l(q.DEFAULTS),this.disabled=!1,this.closed=!1,this.$el=null,this.buttons=[],this.commands=null,this}initialize(t){let e;return this.attr(t),this.disabled=this.attr("disabled"),this.closed=this.attr("closed"),this.commands=new H,e=this.attr("created"),s(e)&&e.call(this),this.render().addListeners(),this}isHighlight(t){const e=this.get(t);return!!e&&d(e.$el,U)}isDisabled(t){let e;return t?(e=this.get(t),e.disabled):this.disabled}isExist(t){return!!this.get(t)}isClosed(){return this.closed}_getCommand(e){const i=this,{action:n,name:o}=e;let r,l,a=null,c=null;return n?(c=n.handler,r=n.context||this,s(c)?l=c:t(c)&&(l=function(){i.$emit(c,o)}),s(l)&&(a=new k(o,l.bind(r))),a):a}get(t){return this.buttons.find((e=>e.name===t))}render(){const t=this.attr("mounted"),e=this.attr("buttons")||[],i=this.attr("placement");return E(),this.$el=b("div",{id:r("outline-toolbar"),className:`outline-toolbar outline-toolbar_${i}`}),this._paint(e),document.body.appendChild(this.$el),this.closed&&this.hide(),this.disabled&&this.disable(),s(t)&&t.call(this),this}erase(){return this.$el.innerHTML="",this}_paint(t){const e=this.attr("rounded"),s=document.createDocumentFragment();return t.forEach((t=>{const i=I(t,e),n=this._getCommand(t),{name:o,disabled:r,context:l}=t;s.appendChild(i),this.isExist(o)||(this.buttons.push({$el:i,name:o,disabled:r||!1,context:l||this}),n&&this.commands.add(n))})),this.$el.appendChild(s),this}_remove(){return document.body.removeChild(this.$el),this}refresh(t){return this.attr({buttons:t}),this.erase()._paint(t),this}add(t){const e=this.$el,s=document.createDocumentFragment(),o=this.attr("buttons")||[],{name:r,disabled:l,context:a}=t,c=this._getCommand(t),h=t=>{const e=I(t);s.appendChild(e),o.push(t),this.buttons.push({$el:e,name:r,disabled:l||!1,context:a||this,command:c}),c&&this.commands.add(c)};return i(t)?h(t):n(t)&&t.forEach((t=>{i(t)&&h(t)})),e.appendChild(s),this}remove(t){const e=this.$el,s=this.buttons,i=this.get(t);let n=-1;return i?(n=s.indexOf(i),n>-1&&(s.splice(n,1),this.attr("buttons").splice(n,1)),this._disable(t),e.removeChild(i.$el),this):this}_disable(t){const e=this.get(t),s=this.commands.get(t);return!e||e.disabled||(e.disabled=!0,s&&this.commands.del(s),u(e.$el,V)),this}_enable(t){const e=this.get(t),s=this.commands.get(t);return e&&e.disabled?(e.disabled=!1,s&&this.commands.add(s),p(e.$el,V),this):this}disable(t){const e=this.attr("afterDisabled");return t?this._disable(t):(u(this.$el,V),this.removeListeners(),this.disabled=!0,s(e)&&e.call(this)),this}enable(t){const e=this.attr("afterEnabled");return t?this._enable(t):(this.disabled=!1,p(this.$el,V),this.addListeners(),s(e)&&e.call(this)),this}show(t){const e=this.attr("afterOpened"),i=this.get(t),n=this.$el;if(t){if(!i)return this;p(i.$el,F)}else p(n,F),this.closed=!1,s(e)&&o((()=>{e.call(this)}),310);return this}hide(t){const e=this.attr("afterClosed"),i=this.get(t),n=this.$el;if(t){if(!i)return this;u(i.$el,F)}else u(n,F),this.closed=!0,s(e)&&o((()=>{e.call(this)}),310);return this}toggle(t){return this.isClosed()?this.show(t):this.hide(t),this}highlight(t){const e=this.get(t);let s;return e?(s=e.$el,d(s,U)?p(s,U):u(s,U),this):this}destroy(){const t=this.attr("beforeDestroy"),e=this.attr("afterDestroy");return s(t)&&t.call(this),this.commands.clear(),this.removeListeners()._remove()._default(),s(e)&&e.call(this),this}execute(t){return this.isDisabled(t)||this.commands.execute(t),this}onExecute(t){const e=t.delegateTarget;let s="";return e&&(s=e.getAttribute("data-cmd"),s&&this.execute(s)),this}_updateToolbar({top:t,min:e,max:s}){const i=Math.ceil(t);return i<=e?(this.hide("up"),this.show("down")):i>=s?(this.hide("down"),this.show("up")):i>e&&i {\r\n return typeof str === 'string'\r\n}\r\n\r\nexport default isString\r\n","/**\r\n * Object 对象原型上的 toString 方法\r\n * ========================================================================\r\n * @method toString\r\n * @param {*} val\r\n * @returns {string}\r\n */\r\nconst toString = (val) => {\r\n return Object.prototype.toString.apply(val)\r\n}\r\n\r\nexport default toString\r\n","import toString from '../lang/toString'\r\n\r\n/**\r\n * 检测测试数据是否为 Function 类型\r\n * ========================================================================\r\n * @method isFunction\r\n * @param {*} val - (必须)待检测的数据\r\n * @returns {boolean} 'val' 是 Function 类型返回 true,否则返回 false\r\n */\r\nconst isFunction = (val) => {\r\n return typeof val === 'function' || toString(val) === '[object Function]'\r\n}\r\n\r\nexport default isFunction\r\n","import toString from '../lang/toString'\r\nimport isFunction from './isFunction'\r\n\r\n/**\r\n * 检测数据是否为 Object 类型\r\n * ========================================================================\r\n * @method isObject\r\n * @param {*} o\r\n * @returns {boolean}\r\n */\r\nconst isObject = (o) => {\r\n return (\r\n (toString(o) === '[object Object]' ||\r\n typeof o === 'object' ||\r\n isFunction(o)) &&\r\n o !== null\r\n )\r\n}\r\n\r\nexport default isObject\r\n","import toString from '../lang/toString'\r\n\r\n/**\r\n * 检测数据是否为 Array 类型\r\n * ========================================================================\r\n * @method isArray\r\n * @param {*} o\r\n * @returns {boolean}\r\n */\r\nconst isArray = (o) => {\r\n if (Array.isArray) {\r\n return Array.isArray(o)\r\n } else {\r\n return toString(o) === '[object Array]'\r\n }\r\n}\r\n\r\nexport default isArray\r\n","import isFunction from '../types/isFunction'\r\n\r\n/**\r\n * later - 延迟执行方法\r\n * ========================================================================\r\n * @method later\r\n * @param {Function} fn\r\n * @param {Number} [delay]\r\n * @returns {number|boolean}\r\n */\r\nconst later = (fn, delay = 300) => {\r\n if (!isFunction(fn)) {\r\n return false\r\n }\r\n\r\n return setTimeout(() => {\r\n fn()\r\n }, delay)\r\n}\r\n\r\nexport default later\r\n","/**\r\n * 生成唯一 id 字符串的函数\r\n * ========================================================================\r\n * @method guid\r\n * @param {String} [prefix] - 生成 id 的前缀字符串\r\n * @return {String} 返回一个表示唯一 id 的字符串\r\n */\r\nconst guid = (() => {\r\n let uuid = 0\r\n\r\n return (prefix) => {\r\n uuid += 1\r\n\r\n return prefix ? prefix + '-' + uuid : 'guid-' + uuid\r\n }\r\n})()\r\n\r\nexport default guid\r\n","import isObject from '../types/isObject'\r\nimport isArray from '../types/isArray'\r\n\r\n/**\r\n * 深拷贝对象函数\r\n * ========================================================================\r\n * @methods cloneDeep\r\n * @param {Object} obj - 深拷贝的对象\r\n * @returns {Array|Object|*}\r\n *\r\n * @example\r\n * const arr = cloneDeep([2,3,4,6])\r\n * => [2,3,4,6]\r\n */\r\nconst cloneDeep = (obj) => {\r\n let clone = {}\r\n\r\n if (obj === null) {\r\n return null\r\n }\r\n\r\n if (isArray(obj)) {\r\n clone = Array.from(obj)\r\n } else {\r\n clone = Object.assign({}, obj)\r\n Object.keys(clone).forEach((key) => {\r\n return (clone[key] = isObject(obj[key]) ? cloneDeep(obj[key]) : obj[key])\r\n })\r\n }\r\n\r\n return clone\r\n}\r\n\r\nexport default cloneDeep\r\n","import isObject from './isObject'\r\n\r\n/**\r\n * 检测数据是否为 HTMLElement DOM 节点\r\n * ========================================================================\r\n * @method isElement\r\n * @param {*} o\r\n * @returns {boolean}\r\n */\r\nconst isElement = (o) => {\r\n return !!(isObject(o) && o.nodeName && o.tagName && o.nodeType === 1)\r\n}\r\n\r\nexport default isElement\r\n","import isObject from './isObject'\r\nimport isElement from './isElement'\r\nimport isHTMLCollection from './isHTMLCollection'\r\nimport isFragment from './isFragment'\r\nimport isTextNode from './isTextNode'\r\n\r\nconst isDOM = (el) => {\r\n return !!(\r\n isObject(el) &&\r\n (isElement(el) || isHTMLCollection(el) || isFragment(el) || isTextNode(el))\r\n )\r\n}\r\n\r\nexport default isDOM\r\n","import toString from '../lang/toString'\r\nimport isObject from './isObject'\r\n\r\nconst isHTMLCollection = (el) => {\r\n return !!(isObject(el) && toString(el) === '[object NodeList]')\r\n}\r\n\r\nexport default isHTMLCollection\r\n","import toString from '../lang/toString'\r\nimport isObject from './isObject'\r\n\r\nconst isFragment = (fragment) => {\r\n return !!(\r\n isObject(fragment) && toString(fragment) === '[object DocumentFragment]'\r\n )\r\n}\r\n\r\nexport default isFragment\r\n","import toString from '../lang/toString'\r\nimport isObject from './isObject'\r\n\r\nconst isTextNode = (el) => {\r\n return !!(\r\n isObject(el) &&\r\n (toString(el) === '[object Text]' || (el.tagName && el.nodeType === 3))\r\n )\r\n}\r\n\r\nexport default isTextNode\r\n","/**\r\n * 检测对象自身属性中是否具有指定的属性。\r\n * ========================================================================\r\n * @method hasOwn\r\n * @param {Object} obj - (必须)检测的目标对象\r\n * @param {String} prop - (必须)属性名\r\n * @returns {Boolean}\r\n */\r\nconst hasOwn = (obj, prop) => {\r\n const hasOwnProperty = Object.prototype.hasOwnProperty\r\n return obj && hasOwnProperty.call(obj, prop)\r\n}\r\n\r\nexport default hasOwn\r\n","import isElement from '../types/isElement'\r\n/**\r\n * 检测 DOM 节点是否包含名为 className 的样式\r\n * ========================================================================\r\n * @method hasClass\r\n * @param {HTMLElement} el - DOM 节点\r\n * @param {String} className - 样式名称\r\n * @returns {Boolean}\r\n */\r\nconst hasClass = (el, className) => {\r\n const pattern = new RegExp('(\\\\s|^)' + className + '(\\\\s|$)')\r\n let allClass\r\n let classList\r\n\r\n if (!isElement(el)) {\r\n return false\r\n }\r\n\r\n allClass = el.className\r\n\r\n if (!allClass) {\r\n return false\r\n }\r\n\r\n classList = el.classList\r\n\r\n if (classList && classList.contains) {\r\n return el.classList.contains(className)\r\n }\r\n\r\n return !!pattern.exec(allClass)\r\n}\r\n\r\nexport default hasClass\r\n","import hasClass from './hasClass'\r\n\r\n/**\r\n * 给 DOM 节点添加名为 className 的样式\r\n * ========================================================================\r\n * @method addClass\r\n * @param {HTMLElement} el - DOM 节点\r\n * @param {String} className - 样式名称\r\n * @returns {Boolean}\r\n */\r\nconst addClass = (el, className) => {\r\n let classList\r\n let allClass\r\n\r\n if (hasClass(el, className)) {\r\n return false\r\n }\r\n\r\n classList = el.classList\r\n\r\n if (classList?.add) {\r\n if (className.indexOf(' ') > -1) {\r\n className.split(' ').forEach((name) => {\r\n classList.add(name)\r\n })\r\n } else {\r\n classList.add(className)\r\n }\r\n } else {\r\n allClass = el.className\r\n allClass += allClass.length > 0 ? ' ' + className : className\r\n el.className = allClass\r\n }\r\n}\r\n\r\nexport default addClass\r\n","import isObject from '../types/isObject'\r\nimport hasOwn from '../lang/hasOwn'\r\nimport setAttribute from './setAttribute'\r\n\r\nconst setAttributes = (el, attrs) => {\r\n if (!el || !isObject(attrs)) {\r\n return false\r\n }\r\n\r\n Object.keys(attrs).forEach((attr) => {\r\n const value = attrs[attr]\r\n if (hasOwn(attrs, attr)) {\r\n setAttribute(el, attr, value)\r\n }\r\n })\r\n}\r\n\r\nexport default setAttributes\r\n","import addClass from './addClass.js'\r\n\r\n/**\r\n * 给 DOM 节点设置属性/值\r\n * ========================================================================\r\n * @method setAttribute\r\n * @param {HTMLElement} el - DOM 节点\r\n * @param {String} attr - 属性名称\r\n * @param {String|Number|Boolean} value - 属性值\r\n */\r\nconst setAttribute = (el, attr, value) => {\r\n let tagName = el.tagName.toLowerCase()\r\n\r\n switch (attr) {\r\n case 'style':\r\n el.style.cssText = value\r\n break\r\n case 'value':\r\n if (tagName === 'input' || tagName === 'textarea') {\r\n el.value = value\r\n } else {\r\n el.setAttribute(attr, value)\r\n }\r\n break\r\n case 'htmlFor':\r\n el.setAttribute('for', value)\r\n break\r\n case 'className':\r\n addClass(el, value)\r\n break\r\n case 'innerHTML':\r\n el.innerHTML = value\r\n break\r\n case 'innerText':\r\n el.innerText = value\r\n break\r\n default:\r\n el.setAttribute(attr, value)\r\n break\r\n }\r\n}\r\n\r\nexport default setAttribute\r\n","import isObject from '../types/isObject'\r\nimport isString from '../types/isString'\r\nimport isArray from '../types/isArray'\r\nimport isDOM from '../types/isDOM'\r\nimport setAttributes from './setAttributes'\r\n\r\n/**\r\n * 创建 DOM 节点,并添加属性和子节点\r\n * ========================================================================\r\n * @method createElement\r\n * @param {String} tagName - 标签名称\r\n * @param {Object|Array|HTMLElement|DocumentFragment|String} attrs - 属性对象或者子节点\r\n * @param {Array|HTMLElement|DocumentFragment|String} [children] - 子节点数组\r\n * @returns {HTMLElement}\r\n */\r\nconst createElement = (tagName, attrs, children) => {\r\n const $fragment = document.createDocumentFragment()\r\n const $el = document.createElement(tagName)\r\n const isValidChild = (child) => {\r\n return isDOM(child) || isString(child)\r\n }\r\n const append = (child) => {\r\n let $child\r\n\r\n if (!isValidChild(child)) {\r\n return false\r\n }\r\n\r\n if (isDOM(child)) {\r\n $child = child\r\n } else if (isString(child)) {\r\n $child = document.createTextNode(child)\r\n }\r\n\r\n $fragment.appendChild($child)\r\n }\r\n\r\n if (isObject(attrs)) {\r\n setAttributes($el, attrs)\r\n } else if (isArray(attrs) && attrs.every((attr) => isValidChild(attr))) {\r\n attrs.forEach((child) => {\r\n append(child)\r\n })\r\n } else if (isDOM(attrs)) {\r\n append(attrs)\r\n } else if (isString(attrs)) {\r\n append(document.createTextNode(attrs))\r\n }\r\n\r\n if (isArray(children)) {\r\n children.forEach((child) => {\r\n append(child)\r\n })\r\n } else {\r\n append(children)\r\n }\r\n\r\n $el.appendChild($fragment)\r\n\r\n return $el\r\n}\r\n\r\nexport default createElement\r\n","import trim from '../lang/trim'\r\nimport hasClass from './hasClass'\r\n\r\n/**\r\n * 移除 DOM 节点的 className 样式\r\n * ========================================================================\r\n * @method removeClass\r\n * @param {HTMLElement} el - DOM 节点\r\n * @param {String} className - 样式名称\r\n * @returns {Boolean}\r\n */\r\nconst removeClass = (el, className) => {\r\n let allClass = el.className\r\n let classList\r\n\r\n if (!allClass || !hasClass(el, className)) {\r\n return false\r\n }\r\n\r\n classList = el.classList\r\n\r\n if (classList?.remove) {\r\n classList.remove(className)\r\n } else {\r\n allClass = trim(allClass.replace(className, ''))\r\n el.className = allClass\r\n }\r\n}\r\n\r\nexport default removeClass\r\n","import isString from '../types/isString'\r\n\r\n/**\r\n * 清楚字符串起始位置所有的空格\r\n * ========================================================================\r\n * @method trim\r\n * @param {string} str\r\n * @returns {string|Boolean}\r\n */\r\nconst trim = (str) => {\r\n if (!isString(str)) {\r\n return false\r\n }\r\n return str.replace(/(^\\s+)|(\\s+$)/g, '')\r\n}\r\n\r\nexport default trim\r\n","/**\r\n * 获取 options 节点下匹配 selector 选择器的 DOM 节点\r\n * ========================================================================\r\n * Element.matches() 方法可以用来判断 DOM 元素是否与给定的选择器匹配,事件代理判断是\r\n * 否触发绑定的代理事件回调函数,关键就是使用 Element.matches() 辨别当前事件触发的目\r\n * 标 DOM 元素是否为事件代理所期望触发的目标。\r\n * ========================================================================\r\n * @method matches\r\n * @see https://developer.mozilla.org/en-US/docs/web/api/element/matches\r\n * @param {HTMLElement} el - (必须)DOM 元素\r\n * @param {String} selector - (必须)匹配 DOM 元素的选择器\r\n * @returns {Boolean}\r\n */\r\nconst matches = (el, selector = '') => {\r\n const sel = selector.replace(/^>/i, '')\r\n\r\n if (!selector || !sel || !el) {\r\n return false\r\n }\r\n\r\n /* istanbul ignore else */\r\n if (el.matches) {\r\n return el.matches(sel)\r\n } else if (el.msMatchesSelector) {\r\n return el.msMatchesSelector(sel)\r\n } else {\r\n return false\r\n }\r\n}\r\n\r\nexport default matches\r\n","/**\r\n * 获取 DOM 元素的父节点\r\n * ========================================================================\r\n * @method getParentOrHost\r\n * @param {*|HTMLElement} el - (必须)要获取父节点的 DOM 元素\r\n * @returns {*|HTMLElement}\r\n */\r\nconst getParentOrHost = (el) => {\r\n return el.host && el !== document && el.host.nodeType\r\n ? el.host\r\n : el.parentNode\r\n}\r\n\r\nexport default getParentOrHost\r\n","export const CAPTURE_EVENTS = [\r\n 'focusout',\r\n 'blur',\r\n 'focusin',\r\n 'focus',\r\n 'load',\r\n 'unload',\r\n 'mouseenter',\r\n 'mouseleave'\r\n]\r\n","import { CAPTURE_EVENTS } from './enum'\r\nimport _delete from './_delete'\r\n\r\n/**\r\n * (私有方法)取消 type 类型的代理事件绑定\r\n * ========================================================================\r\n * 如果没有设置 handler,则销毁 this.$options 绑定的所有符合 type 事件类型的事件绑定\r\n * ========================================================================\r\n * @method _off\r\n * @param {HTMLElement} el - (必须)取消事件绑定的 DOM 元素\r\n * @param {String} type - (必须)事件类型\r\n * @param {Function} fn - (必须)事件处理器回调函数\r\n * @private\r\n */\r\nconst _off = (el, type, fn) => {\r\n const capture = CAPTURE_EVENTS.indexOf(type) > -1\r\n\r\n /* istanbul ignore else */\r\n if (fn._delegateListener) {\r\n fn = fn._delegateListener\r\n delete fn._delegateListener\r\n }\r\n\r\n // 移除缓存的 _listeners 数据\r\n _delete(el, type, fn)\r\n\r\n el.removeEventListener(type, fn, capture)\r\n}\r\n\r\nexport default _off\r\n","/**\r\n * 删除 DOM 元素缓存的 _listeners 数据\r\n * ========================================================================\r\n * @method _delete\r\n * @param {HTMLElement} el - 要删除 listener 的 DOM 元素\r\n * @param {String} type - 事件类型(名称)\r\n * @param {Function} [fn] - 事件处理器回调函数\r\n */\r\nconst _delete = function (el, type, fn) {\r\n const listeners = el._listeners\r\n let index = -1\r\n\r\n if (listeners.length < 1) {\r\n return false\r\n }\r\n\r\n // 移除缓存的 _listeners 数据\r\n listeners.forEach((listener, i) => {\r\n const handler = listener.fn\r\n\r\n if (type === listener.type) {\r\n index = i\r\n\r\n if (handler === fn) {\r\n index = i\r\n }\r\n }\r\n })\r\n\r\n /* istanbul ignore else */\r\n if (index > -1) {\r\n listeners.splice(index, 1)\r\n }\r\n}\r\n\r\nexport default _delete\r\n","import isString from '../types/isString'\r\nimport isElement from '../types/isElement'\r\nimport getListeners from './getListeners'\r\nimport _off from './_off'\r\n\r\n/**\r\n * 销毁(type 类型的)代理事件绑定\r\n * ========================================================================\r\n * 1. 设置了事件类型 type,则销毁指定类型的事件绑定,否则清除所有代理事件绑定\r\n * 2. recurse 设置为 true,递归销毁子节点全部事件绑定\r\n * ========================================================================\r\n * @method purgeElement\r\n * @param {HTMLElement|String} el - (必须)DOM 元素或者其选择器\r\n * @param {String|Boolean} type - (必须)事件类型\r\n * @param {Boolean} [recurse] - (可选)是否递归销毁子节点所有事件绑定\r\n */\r\nconst purgeElement = function (el, type, recurse = false) {\r\n const $element = isString(el) ? document.querySelector(el) : el\r\n const $children = $element.childNodes\r\n const listeners = getListeners($element, type)\r\n\r\n listeners.forEach((listener) => {\r\n _off($element, listener.type, listener.fn)\r\n })\r\n\r\n if (\r\n (recurse || type === true || arguments.length === 1) &&\r\n $element &&\r\n $children\r\n ) {\r\n $children.forEach(($child) => {\r\n if (isElement($child)) {\r\n purgeElement($child, type, recurse)\r\n }\r\n })\r\n }\r\n}\r\n\r\nexport default purgeElement\r\n","import isString from '../types/isString'\r\n\r\n/**\r\n * 获取 DOM 元素(type 事件类型)事件绑定信息\r\n * ========================================================================\r\n * 如果设置了事件类型 type, 则返回指定类型的事件绑定信息,否则返回所有事件绑定信息\r\n * ========================================================================\r\n * @methods getListeners\r\n * @param {HTMLElement} el - (必须)要获取事件绑定信息的 DOM 元素\r\n * @param {String} [type] - (可选)事件类型\r\n * @returns {Array} - 已绑定的事件信息\r\n */\r\nconst getListeners = (el, type) => {\r\n let listeners = el._listeners || []\r\n\r\n if (isString(type) && type) {\r\n listeners = listeners.filter((listener) => {\r\n return listener.type === type\r\n })\r\n }\r\n\r\n return listeners\r\n}\r\n\r\nexport default getListeners\r\n","import purgeElement from './purgeElement'\r\nimport isFunction from '../types/isFunction'\r\nimport _off from './_off'\r\n\r\n/**\r\n * 取消 type 类型的代理事件绑定\r\n * ========================================================================\r\n * 如果没有设置 handler,则销毁 this.$options 绑定的所有符合 type 事件类型的事件绑定\r\n * ========================================================================\r\n * @method off\r\n * @param {HTMLElement|Object} el - (必须)取消事件绑定的 DOM 元素\r\n * @param {String} type - (必须)事件类型\r\n * @param {Function} [fn] - (可选)事件处理器回调函数\r\n */\r\nconst off = (el, type, fn) => {\r\n // 如果不设置 fn 参数,默认清除 el 元素上绑定的所有事件处理器\r\n if (!isFunction(fn)) {\r\n purgeElement(el, type)\r\n return false\r\n }\r\n\r\n _off(el, type, fn)\r\n}\r\n\r\nexport default off\r\n","import closest from '../dom/closest'\r\nimport off from './off'\r\nimport getTarget from './getTarget'\r\n\r\nimport { CAPTURE_EVENTS } from './enum'\r\n\r\n/**\r\n * 绑定代理事件\r\n * ========================================================================\r\n * @method on\r\n * @param {HTMLElement|String|Object} el - (必须)绑定代理事件的 DOM 节点\r\n * @param {String} selector - (必须)事件代理目标 DOM 元素的选择器\r\n * @param {String|Function} type - (必须)事件类型或者事件处理器回调函数\r\n * @param {Function|Object} fn - (可选) 事件处理器回调函数或者传递给事件处理器回调函数的数据对象\r\n * @param {Object|Boolean} [data] - (可选)传递给事件处理器回调函数的数据对象或者事件处理器回调函数的 this 上下文指向,\r\n * @param {Object|Boolean} [context] - (可选)事件处理器回调函数的 this 上下文指向,或者是否仅触发一次\r\n * 当设置为 true 时,则事件处理器回调函数的 this 上下文指向为 data 对象\r\n * @param {Boolean} once - (可选)是否仅触发一次\r\n */\r\nconst on = (el, selector, type, fn, data, context, once = false) => {\r\n // CAPTURE_EVENTS 中的特殊事件,采用事件捕获模型\r\n const capture = CAPTURE_EVENTS.indexOf(type) > -1\r\n\r\n const listener = function (evt) {\r\n const target = getTarget(evt)\r\n // 通过 Element.matches 方法获得点击的目标元素\r\n const delegateTarget = closest(target, selector, el)\r\n let overrideContext = context || el\r\n\r\n evt.delegateTarget = delegateTarget\r\n\r\n // 当设置为 true 时,则事件处理器回调函数的\r\n // this 上下文指向为 data 对象\r\n if (context === true) {\r\n overrideContext = data\r\n }\r\n\r\n /* istanbul ignore else */\r\n if (delegateTarget) {\r\n // 仅触发一次\r\n /* istanbul ignore else */\r\n if (once === true) {\r\n off(el, type, listener)\r\n }\r\n\r\n fn.call(overrideContext, evt, data)\r\n }\r\n }\r\n\r\n if (!el) {\r\n return false\r\n }\r\n\r\n if (!el._listeners) {\r\n el._listeners = []\r\n }\r\n\r\n // 缓存 options 元素绑定的事件处理器\r\n el._listeners.push({\r\n el,\r\n selector,\r\n type,\r\n fn: listener,\r\n data,\r\n context,\r\n capture\r\n })\r\n\r\n // 缓存包装后的事件处理器\r\n fn._delegateListener = listener\r\n\r\n el.addEventListener(type, listener, capture)\r\n}\r\n\r\nexport default on\r\n","import resolveTextNode from '../dom/resolveTextNode'\r\n\r\n/**\r\n * 返回触发事件的 target DOM 元素\r\n * ========================================================================\r\n * @method getTarget\r\n * @param {Event} evt - Event 对象\r\n * @return {HTMLElement} - Event 对象的 target DOM 元素\r\n */\r\nconst getTarget = function (evt) {\r\n const target = evt.target\r\n\r\n return resolveTextNode(target)\r\n}\r\n\r\nexport default getTarget\r\n","/**\r\n * 在某些情况下,某些浏览器(例如:Safari 浏览器)会返回实际的目标元素内部的文本节点。\r\n * resolveTextNode() 方法则会返回实际的目标节点。\r\n * ========================================================================\r\n * @method resolveTextNode\r\n * @param {HTMLElement|Text} el - 要解析的节点\r\n * @return {*|HTMLElement} - 实际的目标 DOM 节点\r\n */\r\nconst resolveTextNode = function (el) {\r\n if (el && el.nodeType === 3) {\r\n return el.parentNode\r\n }\r\n\r\n return el\r\n}\r\n\r\nexport default resolveTextNode\r\n","import matches from './matches'\r\nimport getParentOrHost from './getParentOrHost'\r\n\r\n/**\r\n * 获取 options 元素父元素最近的包含 selector 选择器的元素\r\n * ========================================================================\r\n * @method closest\r\n * @param {HTMLElement} el - (必须)DOM 元素\r\n * @param {String} selector - (必须)DOM 元素的选择其\r\n * @param {HTMLElement} [ctx] - (必须)比对的 DOM 元素\r\n * @param {Boolean} [includeCTX] - (必须)是否包含 context DOM 元素\r\n * @returns {null|HTMLElement} - 返回最接近的 DOM 元素\r\n */\r\nconst closest = (el, selector, ctx, includeCTX) => {\r\n const context = ctx || document\r\n\r\n if (!el) {\r\n return null\r\n }\r\n\r\n do {\r\n /* istanbul ignore else */\r\n if (\r\n (selector != null &&\r\n (selector.startsWith('>')\r\n ? el.parentNode === context && matches(el, selector)\r\n : matches(el, selector))) ||\r\n (includeCTX && el === context)\r\n ) {\r\n return el\r\n }\r\n\r\n /* istanbul ignore else */\r\n if (el === context) {\r\n break\r\n }\r\n\r\n /* jshint boss:true */\r\n } while ((el = getParentOrHost(el)))\r\n}\r\n\r\nexport default closest\r\n","const DEFAULTS = [\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n ''\r\n]\r\n\r\nexport default DEFAULTS\r\n","import DEFAULTS from './defaults'\r\n\r\nconst SYMBOLS = [...DEFAULTS]\r\n\r\nexport default SYMBOLS\r\n","import isString from '../types/isString'\r\nimport getSymbol from './getSymbol'\r\nimport SYMBOLS from './symbols'\r\n\r\n/**\r\n *\r\n * @method getSymbols\r\n * @param {String} [name]\r\n * @param {String} [iconSet]\r\n * @returns {string[]|*}\r\n */\r\nconst getSymbols = (name, iconSet = 'icon') => {\r\n if (isString(name)) {\r\n return getSymbol(name, iconSet)\r\n }\r\n\r\n return [...SYMBOLS]\r\n}\r\n\r\nexport default getSymbols\r\n","import SYMBOLS from './symbols'\r\n\r\n/**\r\n * @method getSymbol\r\n * @param {String} name\r\n * @param {String} [iconSet]\r\n * @returns {String}\r\n */\r\nconst getSymbol = (name, iconSet = 'icon') => {\r\n const patternName = /id=\"(.*?)\"/\r\n const patternSet = /^(\\w+)-/\r\n const symbols = SYMBOLS\r\n\r\n return symbols.find((symbol) => {\r\n const names = patternName.exec(symbol)\r\n const fullName = names[1]\r\n const sets = patternSet.exec(fullName)\r\n const setName = sets[1]\r\n const iconName =\r\n iconSet === 'icon' ? `${iconSet}-${name}` : `${iconSet}-icon-${name}`\r\n\r\n return setName === iconSet && fullName === iconName\r\n })\r\n}\r\n\r\nexport default getSymbol\r\n","import add from './add'\r\nimport getSymbols from './getSymbols'\r\n\r\n/**\r\n * 绘制 SVG 图标集\r\n * ========================================================================\r\n * @method paint\r\n * @param {String|Array} symbol\r\n */\r\nconst paint = (symbol = '') => {\r\n const $body = document.body\r\n let $icons = document.querySelector('#outline-icons')\r\n let symbols = []\r\n\r\n add(symbol)\r\n symbols = getSymbols()\r\n\r\n if ($icons) {\r\n $icons.innerHTML = symbols.join('')\r\n } else {\r\n $icons = document.createElement('div')\r\n $icons.innerHTML =\r\n ``\r\n $body.insertBefore($icons.firstChild, $body.firstChild)\r\n }\r\n}\r\n\r\nexport default paint\r\n","import isArray from '../types/isArray'\r\nimport isString from '../types/isString'\r\nimport SYMBOLS from './symbols'\r\n\r\n/**\r\n * @method add\r\n * @param {Array|String} symbols\r\n * @return {Boolean}\r\n */\r\nconst add = (symbols) => {\r\n if (!symbols) {\r\n return false\r\n }\r\n\r\n if (isArray(symbols) && symbols.length > 0) {\r\n symbols.forEach((symbol) => {\r\n /* istanbul ignore else */\r\n if (SYMBOLS.indexOf(symbol) === -1 && isString(symbol)) {\r\n SYMBOLS.push(symbol)\r\n }\r\n })\r\n } else {\r\n /* istanbul ignore else */\r\n if (isString(symbols)) {\r\n SYMBOLS.push(symbols)\r\n }\r\n }\r\n}\r\n\r\nexport default add\r\n","/**\r\n * 存储订阅者(主题和处理器的)私有对象\r\n * ========================================================================\r\n * @type {{}}\r\n * @private\r\n */\r\nconst _subscribers = {}\r\n\r\nexport default _subscribers\r\n","import _subscribers from './_subscribers'\r\nimport hasOwn from '../lang/hasOwn'\r\n\r\n/**\r\n * 判断是否存在与给定 topic 完全匹配的订阅者信息\r\n * ========================================================================\r\n * @method _hasDirectSubscribersFor\r\n * @param {String} topic - (必须)订阅主题字符串\r\n * @returns {Boolean}\r\n */\r\nconst _hasDirectSubscribersFor = (topic) => {\r\n return hasOwn(_subscribers, topic) && _subscribers[topic].length > 0\r\n}\r\n\r\nexport default _hasDirectSubscribersFor\r\n","import _hasDirectSubscribersFor from './_hasDirectSubscribersFor'\r\nimport _hasSubscribers from './_hasSubscribers'\r\n\r\n/**\r\n * 判断是否存在包含 topic 指定的订阅者信息\r\n * ========================================================================\r\n * @method has\r\n * @param {String} topic - (必须)主题名称\r\n * @param {Boolean} [isDirect] - (可选)是否为直接的主题,默认值:true\r\n * @returns {Boolean}\r\n */\r\nconst has = (topic, isDirect = true) => {\r\n return isDirect ? _hasDirectSubscribersFor(topic) : _hasSubscribers(topic)\r\n}\r\n\r\nexport default has\r\n","import _hasDirectSubscribersFor from './_hasDirectSubscribersFor'\r\n\r\n/**\r\n * 判断是否存在包含给定 topic 相关的订阅者信息\r\n * ========================================================================\r\n * @method _hasSubscribers\r\n * @param {String} topic - (必须)订阅主题字符串\r\n * @returns {Boolean}\r\n */\r\nconst _hasSubscribers = (topic) => {\r\n let found = _hasDirectSubscribersFor(topic)\r\n let position = topic.lastIndexOf('.')\r\n\r\n while (!found && position !== -1) {\r\n topic = topic.substring(0, position)\r\n position = topic.lastIndexOf('.')\r\n found = _hasDirectSubscribersFor(topic)\r\n }\r\n\r\n return found\r\n}\r\n\r\nexport default _hasSubscribers\r\n","import isTypedArray from '../types/isTypedArray'\r\nimport _subscribers from './_subscribers'\r\nimport has from './has'\r\nimport _hasDirectSubscribersFor from './_hasDirectSubscribersFor'\r\n\r\n/**\r\n * (异步)发布订阅主题信息\r\n * ========================================================================\r\n * 主题默认是异步发布的。确保在消费者处理主题时,主题的发起者不会被阻止。\r\n * ========================================================================\r\n * @method emit\r\n * @param {String} topic - (必须)主题名称\r\n * @param {Object} [data] - (可选)数据对象\r\n * @param {Boolean} [async] - (可选) 是否异步发布\r\n */\r\nconst emit = (topic, data, async = true) => {\r\n const execute = (topic) => {\r\n if (!_hasDirectSubscribersFor(topic)) {\r\n return false\r\n }\r\n\r\n _subscribers[topic].forEach((subscriber) => {\r\n // 针对 mqtt 消息服务返回的 Uint8Array 类似的 typed arrays 格式的数据\r\n // 采用 toString() 方法转化为普通(JSON)字符串\r\n const message = isTypedArray(data) ? data.toString() : data\r\n\r\n subscriber.callback.call(subscriber.context || subscriber, message)\r\n })\r\n }\r\n const deliver = () => {\r\n let subscriber = topic\r\n let position = topic.lastIndexOf('.')\r\n\r\n while (position !== -1) {\r\n subscriber = subscriber.substring(0, position)\r\n position = subscriber.lastIndexOf('.')\r\n\r\n execute(subscriber)\r\n }\r\n\r\n // 执行 topic 对应的处理器\r\n execute(topic)\r\n // 执行特殊 topic:'*'(监听全部消息的发布)\r\n execute('*')\r\n }\r\n\r\n if (!has(topic)) {\r\n return false\r\n }\r\n\r\n if (async) {\r\n setTimeout(deliver, 10)\r\n } else {\r\n deliver()\r\n }\r\n}\r\n\r\nexport default emit\r\n","import toString from '../lang/toString'\r\n/**\r\n * 判断检测数据是否为 Typed Arrays 类型的数据\r\n * ========================================================================\r\n * @param {*} val\r\n * @returns {boolean}\r\n */\r\nconst isTypedArray = (val) => {\r\n const TYPES = [\r\n '[object Int8Array]',\r\n '[object Uint8Array]',\r\n '[object Uint8ClampedArray]',\r\n '[object Int16Array]',\r\n '[object Uint16Array]',\r\n '[object Int32Array]',\r\n '[object Uint32Array]',\r\n '[object Float32Array]',\r\n '[object Float64Array]',\r\n '[object BigInt64Array]',\r\n '[object BigUint64Array]'\r\n ]\r\n\r\n return TYPES.indexOf(toString(val)) > -1\r\n}\r\n\r\nexport default isTypedArray\r\n","import _subscribers from './_subscribers'\r\nimport hasOwn from '../lang/hasOwn'\r\n\r\n/**\r\n * 删除与给定 topic 相同的订阅者信息\r\n * ========================================================================\r\n * @method _removeSubscriber\r\n * @param {String} topic - (必须)订阅主题字符串\r\n * @returns {Boolean}\r\n */\r\nconst _removeSubscriber = (topic) => {\r\n if (!hasOwn(_subscribers, topic)) {\r\n return false\r\n }\r\n\r\n delete _subscribers[topic]\r\n}\r\n\r\nexport default _removeSubscriber\r\n","import has from './has'\r\nimport _removeSubscriber from './_removeSubscriber'\r\nimport _removeSubscriberByToken from './_removeSubscriberByToken'\r\n\r\n/**\r\n * 取消订阅主题\r\n * ========================================================================\r\n * @method off\r\n * @param {String} topic - (必须)订阅的主题\r\n * @param {Function|String} [token] - (可选)订阅主题的处理器函数或者唯一 Id 值\r\n */\r\nconst off = (topic, token) => {\r\n if (!has(topic)) {\r\n return false\r\n }\r\n\r\n if (token) {\r\n _removeSubscriberByToken(token)\r\n } else {\r\n _removeSubscriber(topic)\r\n }\r\n}\r\n\r\nexport default off\r\n","import _subscribers from './_subscribers'\r\nimport _removeSubscriber from './_removeSubscriber'\r\n\r\n/**\r\n * 通过订阅者 token 值删除订阅者信息\r\n * ========================================================================\r\n * @method _removeSubscriberByToken\r\n * @param {String} token - 订阅者 token 字符串\r\n * @returns {boolean}\r\n * @private\r\n */\r\nconst _removeSubscriberByToken = (token) => {\r\n const keys = Object.keys(_subscribers)\r\n let index = -1\r\n\r\n if (!token || keys.length < 1) {\r\n return false\r\n }\r\n\r\n keys.forEach((subject) => {\r\n const subscriber = _subscribers[subject]\r\n let topic\r\n\r\n subscriber.forEach((execution, j) => {\r\n if (execution.callback === token || execution.token === token) {\r\n topic = execution.topic\r\n subscriber.splice(index, j)\r\n }\r\n })\r\n\r\n /* istanbul ignore else */\r\n if (subscriber.length < 1) {\r\n _removeSubscriber(topic)\r\n }\r\n })\r\n}\r\n\r\nexport default _removeSubscriberByToken\r\n","import isString from './utils/types/isString'\r\nimport hasOwn from './utils/lang/hasOwn'\r\nimport isObject from './utils/types/isObject'\r\nimport extend from './utils/lang/extend'\r\nimport publish from './utils/observer/emit'\r\nimport subscribe from './utils/observer/on'\r\nimport unsubscribe from './utils/observer/off'\r\n\r\nclass Base {\r\n constructor(options) {\r\n this.attrs = {}\r\n\r\n if (options) {\r\n this.initialize(options)\r\n }\r\n }\r\n\r\n initialize(options) {\r\n this.attr(options).render().addListeners()\r\n return this\r\n }\r\n\r\n attr(prop, value) {\r\n const attrs = this.attrs\r\n\r\n if (isString(prop)) {\r\n // 只能扩展 attrs 中已有的属性\r\n if (value && hasOwn(attrs, prop)) {\r\n // 更新单个配置信息\r\n attrs[prop] = value\r\n return this\r\n }\r\n\r\n // 只传递 prop 参数,则返回对应的属性值\r\n return attrs[prop]\r\n } else if (isObject(prop)) {\r\n // 批量更新配置信息\r\n extend(attrs, prop)\r\n\r\n return this\r\n } else if (arguments.length === 0) {\r\n // 不传递参数,直接返回整个\r\n return attrs\r\n }\r\n\r\n return this\r\n }\r\n\r\n render() {\r\n return this\r\n }\r\n\r\n refresh() {\r\n return this\r\n }\r\n\r\n destroy() {\r\n this.removeListeners()\r\n return this\r\n }\r\n\r\n reload(options) {\r\n let attrs = this.attr()\r\n\r\n if (options) {\r\n attrs = this.attr(options)\r\n }\r\n\r\n this.destroy().initialize(attrs)\r\n\r\n return this\r\n }\r\n\r\n $emit(event, data) {\r\n publish(event, data)\r\n return this\r\n }\r\n\r\n $on(event, callback) {\r\n subscribe(event, callback, this)\r\n return this\r\n }\r\n\r\n $off(event, callback) {\r\n unsubscribe(event, callback)\r\n return this\r\n }\r\n\r\n addListeners() {\r\n return this\r\n }\r\n\r\n removeListeners() {\r\n return this\r\n }\r\n}\r\n\r\nexport default Base\r\n","import hasOwn from './hasOwn'\r\n\r\n/**\r\n * 扩展对象\r\n * ========================================================================\r\n * @method extend\r\n * @param {Object} origin\r\n * @param {Object} source\r\n */\r\nconst extend = (origin, source) => {\r\n const keys = Object.keys(source)\r\n\r\n keys.forEach((prop) => {\r\n if (hasOwn(source, prop)) {\r\n origin[prop] = source[prop]\r\n }\r\n })\r\n}\r\n\r\nexport default extend\r\n","import _subscribers from './_subscribers'\r\nimport isFunction from '../types/isFunction'\r\nimport guid from '../lang/guid'\r\n\r\n/**\r\n * 订阅主题,并给出处理器函数\r\n * ========================================================================\r\n * @method on\r\n * @param {String} topic - (必须)主题名称\r\n * @param {Function} handler - (必须)主题的处理器函数\r\n * @param {Object} [context] - (可选)指定 this 执行上下文\r\n * @return {String} - 唯一的 token 字符串,例如:'guid-1'。\r\n */\r\nconst on = (topic, handler, context = null) => {\r\n const token = guid()\r\n let subject = typeof topic === 'symbol' ? topic.toString() : topic\r\n\r\n if (!isFunction(handler)) {\r\n return ''\r\n }\r\n\r\n /* istanbul ignore else */\r\n if (!_subscribers[subject]) {\r\n _subscribers[subject] = []\r\n }\r\n\r\n _subscribers[subject].push({\r\n topic: subject,\r\n callback: handler,\r\n context,\r\n token\r\n })\r\n\r\n return token\r\n}\r\n\r\nexport default on\r\n","import isFunction from './utils/types/isFunction'\r\n\r\nclass Command {\r\n constructor(name, action) {\r\n this.name = name\r\n\r\n if (isFunction(action)) {\r\n this.action = action\r\n }\r\n }\r\n\r\n execute() {\r\n this.action()\r\n\r\n return this\r\n }\r\n}\r\n\r\nexport default Command\r\n","import isFunction from './utils/types/isFunction'\r\n\r\nclass Commands {\r\n constructor() {\r\n this.commands = []\r\n }\r\n\r\n get(name) {\r\n return this.commands.find((cmd) => cmd.name === name)\r\n }\r\n\r\n add(command) {\r\n this.commands.push(command)\r\n\r\n return this\r\n }\r\n\r\n del(name) {\r\n const commands = this.commands\r\n const command = commands.find((cmd) => cmd.name === name)\r\n const index = command ? commands.indexOf(command) : -1\r\n\r\n if (index > -1) {\r\n commands.splice(index, 1)\r\n }\r\n\r\n return this\r\n }\r\n\r\n clear() {\r\n this.commands = []\r\n\r\n return this\r\n }\r\n\r\n execute(name) {\r\n const command = this.commands.find((cmd) => cmd.name === name)\r\n\r\n if (isFunction(command?.execute)) {\r\n command.execute()\r\n }\r\n\r\n return this\r\n }\r\n}\r\n\r\nexport default Commands\r\n","import isString from './isString'\r\n\r\nconst isSVG = (str) => {\r\n const declaration = '(?:<\\\\?xml[^>]*>\\\\s*)?'\r\n const doctype =\r\n '(?:<\\\\!doctype svg[^>]*\\\\s*(?:\\\\[?(?:\\\\s*]*>\\\\s*)*\\\\]?)*[^>]*>\\\\s*)?'\r\n const content = ']*>[^]*<\\\\/svg>\\\\s*$'\r\n const svg = `^\\\\s*${declaration}${doctype}${content}\\\\s*$`\r\n const pattern = new RegExp(svg, 'i')\r\n\r\n return isString(str) && pattern.test(str)\r\n}\r\n\r\nexport default isSVG\r\n","import isArray from '../types/isArray'\r\nimport isString from '../types/isString'\r\nimport isSVG from '../types/isSVG'\r\nimport setAttributes from '../dom/setAttributes'\r\n\r\n/**\r\n * 创建 SVG 图标 DOM 元素\r\n * ========================================================================\r\n * @method createElement\r\n * @param {String} name\r\n * @param {Object} [options]\r\n * @param {Number|Array} [options.size]\r\n * @param {String} [options.color]\r\n * @param {String} [options.iconSet]\r\n * @param {Object} [options.attrs]\r\n * @returns {HTMLElement}\r\n */\r\nconst createElement = (name, options = {}) => {\r\n const ICON = 'outline-icon'\r\n const size = options.size || 0\r\n const color = options.color || ''\r\n const iconSet = options.iconSet || ''\r\n const width = isArray(size) ? size[0] : size\r\n const height = isArray(size) ? size[1] : size\r\n const defaultRules = size ? `width:${width}px;height:${height}px;` : ''\r\n const cssRules = color ? defaultRules + `color:${color}` : defaultRules\r\n const attrs = options.attrs || {}\r\n const $icon = document.createElement('i')\r\n let binds = ''\r\n let svg = ''\r\n let $svg\r\n\r\n if (!isString(name)) {\r\n return null\r\n }\r\n\r\n if (isSVG(name)) {\r\n svg = name\r\n } else {\r\n binds =\r\n iconSet && iconSet !== 'icon'\r\n ? `xlink:href=\"#${iconSet}-icon-${name}\"`\r\n : `xlink:href=\"#icon-${name}\"`\r\n svg = ``\r\n }\r\n\r\n $icon.innerHTML = svg\r\n\r\n if (attrs.className) {\r\n attrs.className = `${ICON} ${attrs.className}`\r\n } else {\r\n attrs.className = ICON\r\n }\r\n\r\n setAttributes($icon, attrs)\r\n\r\n $svg = $icon.querySelector('svg')\r\n setAttributes($svg, {\r\n 'aria-hidden': true,\r\n xmlns: 'http://www.w3.org/2000/svg',\r\n class: 'outline-icon__svg',\r\n width: 200,\r\n height: 200,\r\n style: cssRules\r\n })\r\n\r\n return $icon\r\n}\r\n\r\nexport default createElement\r\n","import icon from './utils/icons/icon'\r\nimport createElement from './utils/dom/createElement'\r\nimport addClass from './utils/dom/addClass'\r\n\r\nconst _createButton = (button, rounded = true) => {\r\n const $icon = icon(button.icon, {\r\n iconSet: button.iconSet || 'outline',\r\n color: button.color || '',\r\n size: button.size\r\n })\r\n const $anchor = createElement(\r\n 'a',\r\n {\r\n className: `outline-toolbar__anchor`,\r\n href: button.link\r\n },\r\n $icon\r\n )\r\n const $button = createElement(\r\n 'div',\r\n {\r\n className: `outline-toolbar__button ${button.name}`,\r\n 'data-cmd': button.name\r\n },\r\n [button.link ? $anchor : $icon]\r\n )\r\n\r\n addClass($icon, 'outline-toolbar__icon')\r\n\r\n if (rounded) {\r\n addClass($button, 'outline-toolbar_rounded')\r\n }\r\n\r\n if (button.disabled) {\r\n addClass($button, 'outline-toolbar_disabled')\r\n }\r\n\r\n return $button\r\n}\r\n\r\nexport default _createButton\r\n","import createElement from './createElement'\r\n\r\n/**\r\n * 创建 SVG 图标 DOM 元素\r\n * ========================================================================\r\n * @method icon\r\n * @alias createElement\r\n * @see createElement\r\n * @param {String} name\r\n * @param {Object} [options]\r\n * @param {Number|Array} [options.size]\r\n * @param {String} [options.color]\r\n * @param {String} [options.iconSet]\r\n * @returns {HTMLElement}\r\n */\r\nconst icon = (name, options = {}) => {\r\n return createElement(name, options)\r\n}\r\n\r\nexport default icon\r\n","import isString from './utils/types/isString'\r\nimport isFunction from './utils/types/isFunction'\r\nimport isObject from './utils/types/isObject'\r\nimport isArray from './utils/types/isArray'\r\nimport later from './utils/lang/later'\r\nimport guid from './utils/lang/guid'\r\nimport cloneDeep from './utils/lang/cloneDeep'\r\nimport createElement from './utils/dom/createElement'\r\nimport addClass from './utils/dom/addClass'\r\nimport hasClass from './utils/dom/hasClass'\r\nimport removeClass from './utils/dom/removeClass'\r\nimport on from './utils/event/on'\r\nimport off from './utils/event/off'\r\nimport paint from './utils/icons/paint'\r\n\r\nimport Base from './base'\r\nimport Command from './command'\r\nimport Commands from './commands'\r\n\r\nimport _createButton from './_createButton'\r\n\r\nconst DISABLED = 'outline-toolbar_disabled'\r\nconst HIDDEN = 'outline-toolbar_hidden'\r\nconst ACTIVE = 'outline-toolbar_active'\r\n\r\nclass Toolbar extends Base {\r\n constructor(options) {\r\n super()\r\n\r\n this._default()\r\n\r\n if (options) {\r\n this.initialize(options)\r\n }\r\n }\r\n\r\n _default() {\r\n this.attrs = cloneDeep(Toolbar.DEFAULTS)\r\n\r\n this.disabled = false\r\n this.closed = false\r\n\r\n this.$el = null\r\n this.buttons = []\r\n this.commands = null\r\n\r\n return this\r\n }\r\n\r\n initialize(options) {\r\n let created\r\n\r\n this.attr(options)\r\n\r\n this.disabled = this.attr('disabled')\r\n this.closed = this.attr('closed')\r\n this.commands = new Commands()\r\n\r\n created = this.attr('created')\r\n\r\n if (isFunction(created)) {\r\n created.call(this)\r\n }\r\n\r\n this.render().addListeners()\r\n\r\n return this\r\n }\r\n\r\n isHighlight(name) {\r\n const button = this.get(name)\r\n\r\n if (!button) {\r\n return false\r\n }\r\n\r\n return hasClass(button.$el, ACTIVE)\r\n }\r\n\r\n isDisabled(name) {\r\n let button\r\n\r\n if (name) {\r\n button = this.get(name)\r\n\r\n return button.disabled\r\n }\r\n\r\n return this.disabled\r\n }\r\n\r\n isExist(name) {\r\n const button = this.get(name)\r\n return !!button\r\n }\r\n\r\n isClosed() {\r\n return this.closed\r\n }\r\n\r\n _getCommand(button) {\r\n const _self = this\r\n const { action, name } = button\r\n let command = null\r\n let handler = null\r\n let context\r\n let listener\r\n\r\n if (!action) {\r\n return command\r\n }\r\n\r\n handler = action.handler\r\n context = action.context || this\r\n\r\n if (isFunction(handler)) {\r\n listener = handler\r\n } else if (isString(handler)) {\r\n listener = function () {\r\n _self.$emit(handler, name)\r\n }\r\n }\r\n\r\n if (isFunction(listener)) {\r\n command = new Command(name, listener.bind(context))\r\n }\r\n\r\n return command\r\n }\r\n\r\n get(name) {\r\n return this.buttons.find((button) => button.name === name)\r\n }\r\n\r\n render() {\r\n const mounted = this.attr('mounted')\r\n const buttons = this.attr('buttons') || []\r\n const placement = this.attr('placement')\r\n\r\n paint()\r\n\r\n this.$el = createElement('div', {\r\n id: guid('outline-toolbar'),\r\n className: `outline-toolbar outline-toolbar_${placement}`\r\n })\r\n this._paint(buttons)\r\n document.body.appendChild(this.$el)\r\n\r\n if (this.closed) {\r\n this.hide()\r\n }\r\n\r\n if (this.disabled) {\r\n this.disable()\r\n }\r\n\r\n if (isFunction(mounted)) {\r\n mounted.call(this)\r\n }\r\n\r\n return this\r\n }\r\n\r\n erase() {\r\n this.$el.innerHTML = ''\r\n return this\r\n }\r\n\r\n _paint(buttons) {\r\n const rounded = this.attr('rounded')\r\n const $fragment = document.createDocumentFragment()\r\n\r\n buttons.forEach((button) => {\r\n const $button = _createButton(button, rounded)\r\n const command = this._getCommand(button)\r\n const { name, disabled, context } = button\r\n\r\n $fragment.appendChild($button)\r\n\r\n if (!this.isExist(name)) {\r\n this.buttons.push({\r\n $el: $button,\r\n name,\r\n disabled: disabled || false,\r\n context: context || this\r\n })\r\n\r\n if (command) {\r\n this.commands.add(command)\r\n }\r\n }\r\n })\r\n\r\n this.$el.appendChild($fragment)\r\n\r\n return this\r\n }\r\n\r\n _remove() {\r\n document.body.removeChild(this.$el)\r\n return this\r\n }\r\n\r\n refresh(buttons) {\r\n this.attr({ buttons })\r\n this.erase()._paint(buttons)\r\n return this\r\n }\r\n\r\n add(button) {\r\n const $el = this.$el\r\n const $fragment = document.createDocumentFragment()\r\n const buttons = this.attr('buttons') || []\r\n const { name, disabled, context } = button\r\n const command = this._getCommand(button)\r\n const _add = (button) => {\r\n const $button = _createButton(button)\r\n\r\n $fragment.appendChild($button)\r\n\r\n buttons.push(button)\r\n this.buttons.push({\r\n $el: $button,\r\n name,\r\n disabled: disabled || false,\r\n context: context || this,\r\n command\r\n })\r\n\r\n if (command) {\r\n this.commands.add(command)\r\n }\r\n }\r\n\r\n if (isObject(button)) {\r\n _add(button)\r\n } else if (isArray(button)) {\r\n button.forEach((item) => {\r\n if (isObject(item)) {\r\n _add(item)\r\n }\r\n })\r\n }\r\n $el.appendChild($fragment)\r\n\r\n return this\r\n }\r\n\r\n remove(name) {\r\n const $el = this.$el\r\n const buttons = this.buttons\r\n const button = this.get(name)\r\n let index = -1\r\n\r\n if (!button) {\r\n return this\r\n }\r\n\r\n index = buttons.indexOf(button)\r\n\r\n if (index > -1) {\r\n buttons.splice(index, 1)\r\n this.attr('buttons').splice(index, 1)\r\n }\r\n\r\n this._disable(name)\r\n $el.removeChild(button.$el)\r\n\r\n return this\r\n }\r\n\r\n _disable(name) {\r\n const button = this.get(name)\r\n const command = this.commands.get(name)\r\n\r\n if (!button || button.disabled) {\r\n return this\r\n }\r\n\r\n button.disabled = true\r\n\r\n if (command) {\r\n this.commands.del(command)\r\n }\r\n\r\n addClass(button.$el, DISABLED)\r\n\r\n return this\r\n }\r\n\r\n _enable(name) {\r\n const button = this.get(name)\r\n const command = this.commands.get(name)\r\n\r\n if (!button || !button.disabled) {\r\n return this\r\n }\r\n\r\n button.disabled = false\r\n\r\n if (command) {\r\n this.commands.add(command)\r\n }\r\n\r\n removeClass(button.$el, DISABLED)\r\n\r\n return this\r\n }\r\n\r\n disable(name) {\r\n const disabled = this.attr('afterDisabled')\r\n\r\n if (name) {\r\n this._disable(name)\r\n } else {\r\n addClass(this.$el, DISABLED)\r\n this.removeListeners()\r\n this.disabled = true\r\n\r\n if (isFunction(disabled)) {\r\n disabled.call(this)\r\n }\r\n }\r\n\r\n return this\r\n }\r\n\r\n enable(name) {\r\n const enabled = this.attr('afterEnabled')\r\n\r\n if (name) {\r\n this._enable(name)\r\n } else {\r\n this.disabled = false\r\n removeClass(this.$el, DISABLED)\r\n this.addListeners()\r\n\r\n if (isFunction(enabled)) {\r\n enabled.call(this)\r\n }\r\n }\r\n\r\n return this\r\n }\r\n\r\n show(name) {\r\n const opened = this.attr('afterOpened')\r\n const button = this.get(name)\r\n const $el = this.$el\r\n\r\n if (name) {\r\n if (!button) {\r\n return this\r\n }\r\n\r\n removeClass(button.$el, HIDDEN)\r\n } else {\r\n removeClass($el, HIDDEN)\r\n this.closed = false\r\n\r\n if (isFunction(opened)) {\r\n later(() => {\r\n opened.call(this)\r\n }, 310)\r\n }\r\n }\r\n\r\n return this\r\n }\r\n\r\n hide(name) {\r\n const closed = this.attr('afterClosed')\r\n const button = this.get(name)\r\n const $el = this.$el\r\n\r\n if (name) {\r\n if (!button) {\r\n return this\r\n }\r\n\r\n addClass(button.$el, HIDDEN)\r\n } else {\r\n addClass($el, HIDDEN)\r\n this.closed = true\r\n\r\n if (isFunction(closed)) {\r\n later(() => {\r\n closed.call(this)\r\n }, 310)\r\n }\r\n }\r\n\r\n return this\r\n }\r\n\r\n toggle(name) {\r\n if (this.isClosed()) {\r\n this.show(name)\r\n } else {\r\n this.hide(name)\r\n }\r\n\r\n return this\r\n }\r\n\r\n highlight(name) {\r\n const button = this.get(name)\r\n let $button\r\n\r\n if (!button) {\r\n return this\r\n }\r\n\r\n $button = button.$el\r\n\r\n if (hasClass($button, ACTIVE)) {\r\n removeClass($button, ACTIVE)\r\n } else {\r\n addClass($button, ACTIVE)\r\n }\r\n\r\n return this\r\n }\r\n\r\n destroy() {\r\n const beforeDestroy = this.attr('beforeDestroy')\r\n const afterDestroy = this.attr('afterDestroy')\r\n\r\n if (isFunction(beforeDestroy)) {\r\n beforeDestroy.call(this)\r\n }\r\n\r\n this.commands.clear()\r\n this.removeListeners()._remove()._default()\r\n\r\n if (isFunction(afterDestroy)) {\r\n afterDestroy.call(this)\r\n }\r\n\r\n return this\r\n }\r\n\r\n execute(name) {\r\n if (this.isDisabled(name)) {\r\n return this\r\n }\r\n\r\n this.commands.execute(name)\r\n\r\n return this\r\n }\r\n\r\n onExecute(evt) {\r\n const $button = evt.delegateTarget\r\n let cmd = ''\r\n\r\n if ($button) {\r\n cmd = $button.getAttribute('data-cmd')\r\n\r\n if (cmd) {\r\n this.execute(cmd)\r\n }\r\n }\r\n\r\n return this\r\n }\r\n\r\n _updateToolbar({ top, min, max }) {\r\n const current = Math.ceil(top)\r\n\r\n if (current <= min) {\r\n this.hide('up')\r\n this.show('down')\r\n } else if (current >= max) {\r\n this.hide('down')\r\n this.show('up')\r\n } else if (current > min && current < max) {\r\n this.show('up')\r\n this.show('down')\r\n }\r\n\r\n return this\r\n }\r\n\r\n onToolbarUpdate({ top, min, max }) {\r\n this._updateToolbar({ top, min, max })\r\n return this\r\n }\r\n\r\n onAddButton(buttons) {\r\n this.attr({\r\n buttons\r\n })\r\n this.refresh(buttons)\r\n\r\n return this\r\n }\r\n\r\n onRemoveButton(name) {\r\n this.remove(name)\r\n return this\r\n }\r\n\r\n addListeners() {\r\n const buttons = this.attr('buttons') || []\r\n const $el = this.$el\r\n\r\n if (!buttons || buttons.length < 1) {\r\n return this\r\n }\r\n\r\n on($el, `.outline-toolbar__button`, 'click', this.onExecute, this, true)\r\n\r\n this.$on('toolbar:update', this.onToolbarUpdate)\r\n this.$on('toolbar:add:button', this.onAddButton)\r\n this.$on('toolbar:remove:button', this.onRemoveButton)\r\n this.$on('toolbar:toggle', this.toggle)\r\n\r\n return this\r\n }\r\n\r\n removeListeners() {\r\n const buttons = this.attr('buttons') || []\r\n const $el = this.$el\r\n\r\n if (!buttons || buttons.length < 1) {\r\n return this\r\n }\r\n\r\n off($el, '.outline-toolbar__button', this.onExecute)\r\n\r\n this.$off('toolbar:update')\r\n this.$off('toolbar:add:button')\r\n this.$off('toolbar:remove:button')\r\n this.$off('toolbar:toggle')\r\n\r\n return this\r\n }\r\n}\r\n\r\nToolbar.DEFAULTS = (() => {\r\n const OPTIONS = {\r\n placement: 'ltr',\r\n closed: false,\r\n disabled: false,\r\n rounded: true,\r\n buttons: [],\r\n created: null,\r\n mounted: null,\r\n afterClosed: null,\r\n afterOpened: null,\r\n afterDisabled: null,\r\n afterEnabled: null,\r\n beforeDestroy: null,\r\n afterDestroy: null\r\n }\r\n\r\n return cloneDeep(OPTIONS)\r\n})()\r\n\r\nexport default Toolbar\r\n"],"names":["isString","str","toString","val","Object","prototype","apply","isFunction","isObject","o","isArray","Array","later","fn","delay","setTimeout","guid","uuid","prefix","cloneDeep","obj","clone","from","assign","keys","forEach","key","isElement","nodeName","tagName","nodeType","isDOM","el","isHTMLCollection","fragment","isTextNode","hasOwn","prop","hasOwnProperty","call","hasClass","className","pattern","RegExp","allClass","classList","contains","exec","addClass","_classList","add","indexOf","split","name","length","setAttributes","attrs","attr","value","setAttribute","toLowerCase","style","cssText","innerHTML","innerText","createElement","children","$fragment","document","createDocumentFragment","$el","isValidChild","child","append","$child","createTextNode","appendChild","every","removeClass","remove","replace","matches","selector","sel","msMatchesSelector","getParentOrHost","host","parentNode","CAPTURE_EVENTS","_off","type","capture","_delegateListener","listeners","_listeners","index","listener","i","handler","splice","_delete","removeEventListener","purgeElement","recurse","$element","querySelector","$children","childNodes","getListeners","filter","arguments","off","on","data","context","once","evt","target","getTarget","delegateTarget","closest","ctx","includeCTX","startsWith","overrideContext","push","addEventListener","SYMBOLS","_maybeArrayLike","_toConsumableArray","getSymbols","iconSet","getSymbol","patternName","patternSet","find","symbol","fullName","paint","$body","body","$icons","symbols","join","insertBefore","firstChild","_subscribers","_hasDirectSubscribersFor","topic","has","isDirect","found","position","lastIndexOf","substring","_hasSubscribers","emit","async","execute","subscriber","message","callback","deliver","_removeSubscriber","token","subject","execution","j","_removeSubscriberByToken","Base","constructor","options","this","initialize","render","addListeners","origin","source","extend","refresh","destroy","removeListeners","reload","$emit","event","publish","$on","subscribe","$off","unsubscribe","Command","action","Commands","commands","get","cmd","command","del","clear","ICON","size","color","width","height","defaultRules","cssRules","$icon","$svg","binds","svg","test","isSVG","xmlns","class","_createButton","button","rounded","icon","$anchor","href","link","$button","disabled","DISABLED","HIDDEN","ACTIVE","Toolbar","super","_default","DEFAULTS","closed","buttons","created","isHighlight","isDisabled","isExist","isClosed","_getCommand","_self","bind","mounted","placement","id","_paint","hide","disable","erase","_remove","removeChild","_add","item","_disable","_enable","enable","enabled","show","opened","toggle","highlight","beforeDestroy","afterDestroy","onExecute","getAttribute","_updateToolbar","top","min","max","current","Math","ceil","onToolbarUpdate","onAddButton","onRemoveButton","afterClosed","afterOpened","afterDisabled","afterEnabled"],"mappings":"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"} \ No newline at end of file diff --git a/drawer.css b/drawer.css deleted file mode 100644 index d3641d5a..00000000 --- a/drawer.css +++ /dev/null @@ -1,324 +0,0 @@ -:root { - --outline-zIndex: 2000; - --outline-sticky-height: 100%; - --outline-navigator-width: 100%; -} -/* ========== colors.theme - 基础颜色变量集合 ========== */ -/** - * shadow.less - 阴影样式设置 mixinx 函数 - * ============================================================= - * Created By: Yaohaixiao - * Update: 2022.3.20 - */ -/* ====== 阴影样式设置函数 ====== */ -.outline-drawer { - position: relative; - z-index: -1; - top: 0; - left: 0; - margin: 0; - width: 100%; - height: 100%; - -webkit-box-sizing: border-box; - box-sizing: border-box; - visibility: hidden; - overflow: hidden; -} -.outline-drawer__modal { - -webkit-box-shadow: 0 0 6px 1px #dcdfe6; - box-shadow: 0 0 6px 1px #dcdfe6; - display: -webkit-box; - display: -ms-flexbox; - display: flex; - -webkit-box-orient: vertical; - -webkit-box-direction: normal; - -ms-flex-direction: column; - flex-direction: column; - -ms-flex-wrap: nowrap; - flex-wrap: nowrap; - position: absolute; - z-index: 21; - height: 100%; - background-color: #fff; - -webkit-transition-duration: 0.4s; - transition-duration: 0.4s; - overflow: hidden; -} -.outline-drawer__header, -.outline-drawer__main, -.outline-drawer__footer { - width: 100%; - -webkit-box-sizing: border-box; - box-sizing: border-box; -} -.outline-drawer__header, -.outline-drawer__footer { - -ms-flex-negative: 0; - flex-shrink: 0; -} -.outline-drawer__title, -.outline-drawer__main, -.outline-drawer__footer { - padding: 0 16px; -} -.outline-drawer__header, -.outline-drawer__title { - position: relative; - z-index: 1; - margin: 0 auto; - height: 52px; - line-height: 52px; - overflow: hidden; -} -.outline-drawer__title { - font-size: 16px; - font-weight: 400; - margin: 0 16px; - -webkit-box-sizing: border-box; - box-sizing: border-box; - border-bottom: 1px solid #dcdfe6; -} -.outline-drawer__close { - position: absolute; - z-index: 2; - top: 50%; - right: 12px; - width: 20px; - height: 20px; - line-height: 20px; - color: #999; - font-size: 20px; - text-align: center; - cursor: pointer; - -webkit-transform: translateY(-50%); - transform: translateY(-50%); - overflow: hidden; -} -.outline-drawer__close .outline-icon { - position: absolute; - z-index: 2; - top: 0; - left: 0; -} -.outline-drawer__close:hover { - color: #666; -} -.outline-drawer__main { - -webkit-box-flex: 1; - -ms-flex: 1; - flex: 1; - overflow: auto; -} -.outline-drawer__main.overflow-hidden { - overflow: hidden; -} -.outline-drawer__footer { - margin: 0 auto; - text-align: right; - overflow: hidden; -} -.outline-drawer__overlay { - content: ''; - position: relative; - z-index: 1; - top: 0; - left: 0; - width: 100%; - height: 100%; - background-color: #fff; - opacity: 0.1; - overflow: hidden; -} -.outline-drawer_rtl.outline-drawer_tiny, -.outline-drawer_ltr.outline-drawer_tiny { - width: 280px; -} -.outline-drawer_rtl.outline-drawer_mini, -.outline-drawer_ltr.outline-drawer_mini { - width: 480px; -} -.outline-drawer_rtl.outline-drawer_small, -.outline-drawer_ltr.outline-drawer_small { - width: 540px; -} -.outline-drawer_rtl.outline-drawer_regular, -.outline-drawer_ltr.outline-drawer_regular { - width: 680px; -} -.outline-drawer_rtl.outline-drawer_medium, -.outline-drawer_ltr.outline-drawer_medium { - width: 720px; -} -.outline-drawer_rtl.outline-drawer_large, -.outline-drawer_ltr.outline-drawer_large { - width: 960px; -} -.outline-drawer_rtl { - border-left: 1px solid #dcdfe6; -} -.outline-drawer_rtl.outline-drawer_tiny.outline-drawer_closed { - right: -290px; -} -.outline-drawer_rtl.outline-drawer_mini.outline-drawer_closed { - right: -490px; -} -.outline-drawer_rtl.outline-drawer_small.outline-drawer_closed { - right: -550px; -} -.outline-drawer_rtl.outline-drawer_regular.outline-drawer_closed { - right: -690px; -} -.outline-drawer_rtl.outline-drawer_medium.outline-drawer_closed { - right: -730px; -} -.outline-drawer_rtl.outline-drawer_large.outline-drawer_closed { - right: -970px; -} -.outline-drawer_ltr { - border-right: 1px solid #dcdfe6; -} -.outline-drawer_ltr.outline-drawer_tiny.outline-drawer_closed { - left: -290px; -} -.outline-drawer_ltr.outline-drawer_mini.outline-drawer_closed { - left: -490px; -} -.outline-drawer_ltr.outline-drawer_small.outline-drawer_closed { - left: -550px; -} -.outline-drawer_ltr.outline-drawer_regular.outline-drawer_closed { - left: -690px; -} -.outline-drawer_ltr.outline-drawer_medium.outline-drawer_closed { - left: -730px; -} -.outline-drawer_ltr.outline-drawer_large.outline-drawer_closed { - left: -970px; -} -.outline-drawer_ttb, -.outline-drawer_btt { - left: 0; - width: 100%; -} -.outline-drawer_ttb.outline-drawer_tiny, -.outline-drawer_btt.outline-drawer_tiny { - height: 240px; -} -.outline-drawer_ttb.outline-drawer_mini, -.outline-drawer_btt.outline-drawer_mini { - height: 320px; -} -.outline-drawer_ttb.outline-drawer_small, -.outline-drawer_btt.outline-drawer_small { - height: 360px; -} -.outline-drawer_ttb.outline-drawer_regular, -.outline-drawer_btt.outline-drawer_regular { - height: 400px; -} -.outline-drawer_ttb.outline-drawer_medium, -.outline-drawer_btt.outline-drawer_medium { - height: 440px; -} -.outline-drawer_ttb.outline-drawer_large, -.outline-drawer_btt.outline-drawer_large { - height: 480px; -} -.outline-drawer_ttb { - border-bottom: 1px solid #dcdfe6; -} -.outline-drawer_ttb.outline-drawer_tiny.outline-drawer_closed { - top: -250px; -} -.outline-drawer_ttb.outline-drawer_mini.outline-drawer_closed { - top: -330px; -} -.outline-drawer_ttb.outline-drawer_small.outline-drawer_closed { - top: -370px; -} -.outline-drawer_ttb.outline-drawer_regular.outline-drawer_closed { - top: -410px; -} -.outline-drawer_ttb.outline-drawer_medium.outline-drawer_closed { - top: -450px; -} -.outline-drawer_ttb.outline-drawer_large.outline-drawer_closed { - top: -490px; -} -.outline-drawer_btt { - top: initial; - border-top: 1px solid #dcdfe6; -} -.outline-drawer_btt.outline-drawer_tiny.outline-drawer_closed { - bottom: -250px; -} -.outline-drawer_btt.outline-drawer_mini.outline-drawer_closed { - bottom: -330px; -} -.outline-drawer_btt.outline-drawer_small.outline-drawer_closed { - bottom: -370px; -} -.outline-drawer_btt.outline-drawer_regular.outline-drawer_closed { - bottom: -410px; -} -.outline-drawer_btt.outline-drawer_medium.outline-drawer_closed { - bottom: -450px; -} -.outline-drawer_btt.outline-drawer_large.outline-drawer_closed { - bottom: -490px; -} -.outline-drawer_opened { - visibility: visible; - z-index: var(--outline-zIndex); -} -.outline-drawer_opened.outline-drawer { - position: fixed; -} -.outline-drawer_opened.outline-drawer_rtl { - right: 0; -} -.outline-drawer_opened.outline-drawer_ltr { - left: 0; -} -.outline-drawer_opened.outline-drawer_ttb { - top: 0; -} -.outline-drawer_opened.outline-drawer_btt { - bottom: 0; -} -.outline-drawer_offset.outline-drawer_rtl, -.outline-drawer_offset.outline-drawer_ltr { - height: calc(100% - 4em); - top: 50%; - -webkit-transform: translateY(-50%); - transform: translateY(-50%); -} -.outline-drawer_offset.outline-drawer_ttb, -.outline-drawer_offset.outline-drawer_btt { - width: calc(100% - 4em); - left: 50%; - -webkit-transform: translateX(-50%); - transform: translateX(-50%); -} -.outline-drawer_offset.outline-drawer_opened.outline-drawer_rtl { - right: 2em; -} -.outline-drawer_offset.outline-drawer_opened.outline-drawer_ltr { - left: 2em; -} -.outline-drawer_offset.outline-drawer_opened.outline-drawer_ttb { - top: 2em; -} -.outline-drawer_offset.outline-drawer_opened.outline-drawer_btt { - bottom: 2em; -} -.outline-drawer_auto.outline-drawer_rtl, -.outline-drawer_auto.outline-drawer_ltr { - height: auto; - max-height: calc(100% - 4em); -} -.outline-drawer_full { - padding: 0; -} - -/*# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInZhcmlhYmxlcy5sZXNzIiwiLi4vPGlucHV0IGNzcyAzPiIsImRyYXdlci5sZXNzIiwic2hhZG93Lmxlc3MiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7RUFDRSx1QkFBQTtFQUNBLDhCQUFBO0VBQ0EsZ0NBQUE7Q0NDRDtBQUNELG1EQUFtRDtBQUNuRDs7Ozs7R0FLRztBQUNILDRCQUE0QjtBQ1I1QjtFQUNFLG1CQUFBO0VBQ0EsWUFBQTtFQUNBLE9BQUE7RUFDQSxRQUFBO0VBQ0EsVUFBQTtFQUNBLFlBQUE7RUFDQSxhQUFBO0VBQ0EsK0JBQUE7VUFBQSx1QkFBQTtFQUNBLG1CQUFBO0VBQ0EsaUJBQUE7Q0RVRDtBQ1JDO0VDTkEsd0NBQUE7VUFBQSxnQ0FBQTtFRFFFLHFCQUFBO0VBQUEscUJBQUE7RUFBQSxjQUFBO0VBQ0EsNkJBQUE7RUFBQSw4QkFBQTtNQUFBLDJCQUFBO1VBQUEsdUJBQUE7RUFDQSxzQkFBQTtNQUFBLGtCQUFBO0VBQ0EsbUJBQUE7RUFDQSxZQUFBO0VBQ0EsYUFBQTtFQUNBLHVCQUFBO0VBQ0Esa0NBQUE7VUFBQSwwQkFBQTtFQUNBLGlCQUFBO0NEVUg7QUNQQzs7O0VBR0UsWUFBQTtFQUNBLCtCQUFBO1VBQUEsdUJBQUE7Q0RTSDtBQ05DOztFQUVFLHFCQUFBO01BQUEsZUFBQTtDRFFIO0FDTEM7OztFQUdFLGdCQUFBO0NET0g7QUNKQzs7RUFFRSxtQkFBQTtFQUNBLFdBQUE7RUFDQSxlQUFBO0VBQ0EsYUFBQTtFQUNBLGtCQUFBO0VBQ0EsaUJBQUE7Q0RNSDtBQ0hDO0VBQ0UsZ0JBQUE7RUFDQSxpQkFBQTtFQUNBLGVBQUE7RUFDQSwrQkFBQTtVQUFBLHVCQUFBO0VBQ0EsaUNBQUE7Q0RLSDtBQ0ZDO0VBQ0UsbUJBQUE7RUFDQSxXQUFBO0VBQ0EsU0FBQTtFQUNBLFlBQUE7RUFDQSxZQUFBO0VBQ0EsYUFBQTtFQUNBLGtCQUFBO0VBQ0EsWUFBQTtFQUNBLGdCQUFBO0VBQ0EsbUJBQUE7RUFDQSxnQkFBQTtFQUNBLG9DQUFBO1VBQUEsNEJBQUE7RUFDQSxpQkFBQTtDRElIO0FDakJDO0VBZ0JJLG1CQUFBO0VBQ0EsV0FBQTtFQUNBLE9BQUE7RUFDQSxRQUFBO0NESUw7QUNERztFQUNFLFlBQUE7Q0RHTDtBQ0NDO0VBQ0Usb0JBQUE7TUFBQSxZQUFBO1VBQUEsUUFBQTtFQUNBLGVBQUE7Q0RDSDtBQ0NHO0VBQ0UsaUJBQUE7Q0RDTDtBQ0dDO0VBQ0UsZUFBQTtFQUNBLGtCQUFBO0VBQ0EsaUJBQUE7Q0RESDtBQ0lDO0VBQ0UsWUFBQTtFQUNBLG1CQUFBO0VBQ0EsV0FBQTtFQUNBLE9BQUE7RUFDQSxRQUFBO0VBQ0EsWUFBQTtFQUNBLGFBQUE7RUFDQSx1QkFBQTtFQUNBLGFBQUE7RUFDQSxpQkFBQTtDREZIO0FDUUs7O0VBQ0UsYUFBQTtDRExQO0FDUUs7O0VBQ0UsYUFBQTtDRExQO0FDUUs7O0VBQ0UsYUFBQTtDRExQO0FDUUs7O0VBQ0UsYUFBQTtDRExQO0FDUUs7O0VBQ0UsYUFBQTtDRExQO0FDUUs7O0VBQ0UsYUFBQTtDRExQO0FDVUM7RUFDRSwrQkFBQTtDRFJIO0FDWU87RUFDRSxjQUFBO0NEVlQ7QUNlTztFQUNFLGNBQUE7Q0RiVDtBQ2tCTztFQUNFLGNBQUE7Q0RoQlQ7QUNxQk87RUFDRSxjQUFBO0NEbkJUO0FDd0JPO0VBQ0UsY0FBQTtDRHRCVDtBQzJCTztFQUNFLGNBQUE7Q0R6QlQ7QUMrQkM7RUFDRSxnQ0FBQTtDRDdCSDtBQ2lDTztFQUNFLGFBQUE7Q0QvQlQ7QUNvQ087RUFDRSxhQUFBO0NEbENUO0FDdUNPO0VBQ0UsYUFBQTtDRHJDVDtBQzBDTztFQUNFLGFBQUE7Q0R4Q1Q7QUM2Q087RUFDRSxhQUFBO0NEM0NUO0FDZ0RPO0VBQ0UsYUFBQTtDRDlDVDtBQ29EQzs7RUFFRSxRQUFBO0VBQ0EsWUFBQTtDRGxESDtBQ3FESzs7RUFDRSxjQUFBO0NEbERQO0FDcURLOztFQUNFLGNBQUE7Q0RsRFA7QUNxREs7O0VBQ0UsY0FBQTtDRGxEUDtBQ3FESzs7RUFDRSxjQUFBO0NEbERQO0FDcURLOztFQUNFLGNBQUE7Q0RsRFA7QUNxREs7O0VBQ0UsY0FBQTtDRGxEUDtBQ3VEQztFQUNFLGlDQUFBO0NEckRIO0FDeURPO0VBQ0UsWUFBQTtDRHZEVDtBQzRETztFQUNFLFlBQUE7Q0QxRFQ7QUMrRE87RUFDRSxZQUFBO0NEN0RUO0FDa0VPO0VBQ0UsWUFBQTtDRGhFVDtBQ3FFTztFQUNFLFlBQUE7Q0RuRVQ7QUN3RU87RUFDRSxZQUFBO0NEdEVUO0FDNEVDO0VBQ0UsYUFBQTtFQUNBLDhCQUFBO0NEMUVIO0FDOEVPO0VBQ0UsZUFBQTtDRDVFVDtBQ2lGTztFQUNFLGVBQUE7Q0QvRVQ7QUNvRk87RUFDRSxlQUFBO0NEbEZUO0FDdUZPO0VBQ0UsZUFBQTtDRHJGVDtBQzBGTztFQUNFLGVBQUE7Q0R4RlQ7QUM2Rk87RUFDRSxlQUFBO0NEM0ZUO0FDaUdDO0VBQ0Usb0JBQUE7RUFDQSwrQkFBQTtDRC9GSDtBQ2lHRztFQUNFLGdCQUFBO0NEL0ZMO0FDaUdLO0VBQ0UsU0FBQTtDRC9GUDtBQ2tHSztFQUNFLFFBQUE7Q0RoR1A7QUNtR0s7RUFDRSxPQUFBO0NEakdQO0FDb0dLO0VBQ0UsVUFBQTtDRGxHUDtBQ3lHSzs7RUFFRSx5QkFBQTtFQUNBLFNBQUE7RUFDQSxvQ0FBQTtVQUFBLDRCQUFBO0NEdkdQO0FDMEdLOztFQUVFLHdCQUFBO0VBQ0EsVUFBQTtFQUNBLG9DQUFBO1VBQUEsNEJBQUE7Q0R4R1A7QUM2R1M7RUFDRSxXQUFBO0NEM0dYO0FDOEdTO0VBQ0UsVUFBQTtDRDVHWDtBQytHUztFQUNFLFNBQUE7Q0Q3R1g7QUNnSFM7RUFDRSxZQUFBO0NEOUdYO0FDdUhLOztFQUVFLGFBQUE7RUFDQSw2QkFBQTtDRHJIUDtBQzBIQztFQUNFLFdBQUE7Q0R4SEgiLCJmaWxlIjoiZHJhd2VyLmNzcyIsInNvdXJjZXNDb250ZW50IjpbIjpyb290IHtcclxuICAtLW91dGxpbmUtekluZGV4OiAyMDAwO1xyXG4gIC0tb3V0bGluZS1zdGlja3ktaGVpZ2h0OiAxMDAlO1xyXG4gIC0tb3V0bGluZS1uYXZpZ2F0b3Itd2lkdGg6IDEwMCU7XHJcbn1cclxuIiwiOnJvb3Qge1xuICAtLW91dGxpbmUtekluZGV4OiAyMDAwO1xuICAtLW91dGxpbmUtc3RpY2t5LWhlaWdodDogMTAwJTtcbiAgLS1vdXRsaW5lLW5hdmlnYXRvci13aWR0aDogMTAwJTtcbn1cbi8qID09PT09PT09PT0gY29sb3JzLnRoZW1lIC0g5Z+656GA6aKc6Imy5Y+Y6YeP6ZuG5ZCIID09PT09PT09PT0gKi9cbi8qKlxuICogc2hhZG93Lmxlc3MgLSDpmLTlvbHmoLflvI/orr7nva4gbWl4aW54IOWHveaVsFxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogQ3JlYXRlZCBCeTogWWFvaGFpeGlhb1xuICogVXBkYXRlOiAyMDIyLjMuMjBcbiAqL1xuLyogPT09PT09IOmYtOW9seagt+W8j+iuvue9ruWHveaVsCA9PT09PT0gKi9cbi5vdXRsaW5lLWRyYXdlciB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgei1pbmRleDogLTE7XG4gIHRvcDogMDtcbiAgbGVmdDogMDtcbiAgbWFyZ2luOiAwO1xuICB3aWR0aDogMTAwJTtcbiAgaGVpZ2h0OiAxMDAlO1xuICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICB2aXNpYmlsaXR5OiBoaWRkZW47XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4ub3V0bGluZS1kcmF3ZXJfX21vZGFsIHtcbiAgYm94LXNoYWRvdzogMCAwIDZweCAxcHggI2RjZGZlNjtcbiAgZGlzcGxheTogZmxleDtcbiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgZmxleC13cmFwOiBub3dyYXA7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgei1pbmRleDogMjE7XG4gIGhlaWdodDogMTAwJTtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjtcbiAgdHJhbnNpdGlvbi1kdXJhdGlvbjogMC40cztcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi5vdXRsaW5lLWRyYXdlcl9faGVhZGVyLFxuLm91dGxpbmUtZHJhd2VyX19tYWluLFxuLm91dGxpbmUtZHJhd2VyX19mb290ZXIge1xuICB3aWR0aDogMTAwJTtcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbn1cbi5vdXRsaW5lLWRyYXdlcl9faGVhZGVyLFxuLm91dGxpbmUtZHJhd2VyX19mb290ZXIge1xuICBmbGV4LXNocmluazogMDtcbn1cbi5vdXRsaW5lLWRyYXdlcl9fdGl0bGUsXG4ub3V0bGluZS1kcmF3ZXJfX21haW4sXG4ub3V0bGluZS1kcmF3ZXJfX2Zvb3RlciB7XG4gIHBhZGRpbmc6IDAgMTZweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl9faGVhZGVyLFxuLm91dGxpbmUtZHJhd2VyX190aXRsZSB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgei1pbmRleDogMTtcbiAgbWFyZ2luOiAwIGF1dG87XG4gIGhlaWdodDogNTJweDtcbiAgbGluZS1oZWlnaHQ6IDUycHg7XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4ub3V0bGluZS1kcmF3ZXJfX3RpdGxlIHtcbiAgZm9udC1zaXplOiAxNnB4O1xuICBmb250LXdlaWdodDogNDAwO1xuICBtYXJnaW46IDAgMTZweDtcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNkY2RmZTY7XG59XG4ub3V0bGluZS1kcmF3ZXJfX2Nsb3NlIHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB6LWluZGV4OiAyO1xuICB0b3A6IDUwJTtcbiAgcmlnaHQ6IDEycHg7XG4gIHdpZHRoOiAyMHB4O1xuICBoZWlnaHQ6IDIwcHg7XG4gIGxpbmUtaGVpZ2h0OiAyMHB4O1xuICBjb2xvcjogIzk5OTtcbiAgZm9udC1zaXplOiAyMHB4O1xuICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gIGN1cnNvcjogcG9pbnRlcjtcbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC01MCUpO1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLm91dGxpbmUtZHJhd2VyX19jbG9zZSAub3V0bGluZS1pY29uIHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB6LWluZGV4OiAyO1xuICB0b3A6IDA7XG4gIGxlZnQ6IDA7XG59XG4ub3V0bGluZS1kcmF3ZXJfX2Nsb3NlOmhvdmVyIHtcbiAgY29sb3I6ICM2NjY7XG59XG4ub3V0bGluZS1kcmF3ZXJfX21haW4ge1xuICBmbGV4OiAxO1xuICBvdmVyZmxvdzogYXV0bztcbn1cbi5vdXRsaW5lLWRyYXdlcl9fbWFpbi5vdmVyZmxvdy1oaWRkZW4ge1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLm91dGxpbmUtZHJhd2VyX19mb290ZXIge1xuICBtYXJnaW46IDAgYXV0bztcbiAgdGV4dC1hbGlnbjogcmlnaHQ7XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4ub3V0bGluZS1kcmF3ZXJfX292ZXJsYXkge1xuICBjb250ZW50OiAnJztcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICB6LWluZGV4OiAxO1xuICB0b3A6IDA7XG4gIGxlZnQ6IDA7XG4gIHdpZHRoOiAxMDAlO1xuICBoZWlnaHQ6IDEwMCU7XG4gIGJhY2tncm91bmQtY29sb3I6ICNmZmY7XG4gIG9wYWNpdHk6IDAuMTtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi5vdXRsaW5lLWRyYXdlcl9ydGwub3V0bGluZS1kcmF3ZXJfdGlueSxcbi5vdXRsaW5lLWRyYXdlcl9sdHIub3V0bGluZS1kcmF3ZXJfdGlueSB7XG4gIHdpZHRoOiAyODBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl9ydGwub3V0bGluZS1kcmF3ZXJfbWluaSxcbi5vdXRsaW5lLWRyYXdlcl9sdHIub3V0bGluZS1kcmF3ZXJfbWluaSB7XG4gIHdpZHRoOiA0ODBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl9ydGwub3V0bGluZS1kcmF3ZXJfc21hbGwsXG4ub3V0bGluZS1kcmF3ZXJfbHRyLm91dGxpbmUtZHJhd2VyX3NtYWxsIHtcbiAgd2lkdGg6IDU0MHB4O1xufVxuLm91dGxpbmUtZHJhd2VyX3J0bC5vdXRsaW5lLWRyYXdlcl9yZWd1bGFyLFxuLm91dGxpbmUtZHJhd2VyX2x0ci5vdXRsaW5lLWRyYXdlcl9yZWd1bGFyIHtcbiAgd2lkdGg6IDY4MHB4O1xufVxuLm91dGxpbmUtZHJhd2VyX3J0bC5vdXRsaW5lLWRyYXdlcl9tZWRpdW0sXG4ub3V0bGluZS1kcmF3ZXJfbHRyLm91dGxpbmUtZHJhd2VyX21lZGl1bSB7XG4gIHdpZHRoOiA3MjBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl9ydGwub3V0bGluZS1kcmF3ZXJfbGFyZ2UsXG4ub3V0bGluZS1kcmF3ZXJfbHRyLm91dGxpbmUtZHJhd2VyX2xhcmdlIHtcbiAgd2lkdGg6IDk2MHB4O1xufVxuLm91dGxpbmUtZHJhd2VyX3J0bCB7XG4gIGJvcmRlci1sZWZ0OiAxcHggc29saWQgI2RjZGZlNjtcbn1cbi5vdXRsaW5lLWRyYXdlcl9ydGwub3V0bGluZS1kcmF3ZXJfdGlueS5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xuICByaWdodDogLTI5MHB4O1xufVxuLm91dGxpbmUtZHJhd2VyX3J0bC5vdXRsaW5lLWRyYXdlcl9taW5pLm91dGxpbmUtZHJhd2VyX2Nsb3NlZCB7XG4gIHJpZ2h0OiAtNDkwcHg7XG59XG4ub3V0bGluZS1kcmF3ZXJfcnRsLm91dGxpbmUtZHJhd2VyX3NtYWxsLm91dGxpbmUtZHJhd2VyX2Nsb3NlZCB7XG4gIHJpZ2h0OiAtNTUwcHg7XG59XG4ub3V0bGluZS1kcmF3ZXJfcnRsLm91dGxpbmUtZHJhd2VyX3JlZ3VsYXIub3V0bGluZS1kcmF3ZXJfY2xvc2VkIHtcbiAgcmlnaHQ6IC02OTBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl9ydGwub3V0bGluZS1kcmF3ZXJfbWVkaXVtLm91dGxpbmUtZHJhd2VyX2Nsb3NlZCB7XG4gIHJpZ2h0OiAtNzMwcHg7XG59XG4ub3V0bGluZS1kcmF3ZXJfcnRsLm91dGxpbmUtZHJhd2VyX2xhcmdlLm91dGxpbmUtZHJhd2VyX2Nsb3NlZCB7XG4gIHJpZ2h0OiAtOTcwcHg7XG59XG4ub3V0bGluZS1kcmF3ZXJfbHRyIHtcbiAgYm9yZGVyLXJpZ2h0OiAxcHggc29saWQgI2RjZGZlNjtcbn1cbi5vdXRsaW5lLWRyYXdlcl9sdHIub3V0bGluZS1kcmF3ZXJfdGlueS5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xuICBsZWZ0OiAtMjkwcHg7XG59XG4ub3V0bGluZS1kcmF3ZXJfbHRyLm91dGxpbmUtZHJhd2VyX21pbmkub3V0bGluZS1kcmF3ZXJfY2xvc2VkIHtcbiAgbGVmdDogLTQ5MHB4O1xufVxuLm91dGxpbmUtZHJhd2VyX2x0ci5vdXRsaW5lLWRyYXdlcl9zbWFsbC5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xuICBsZWZ0OiAtNTUwcHg7XG59XG4ub3V0bGluZS1kcmF3ZXJfbHRyLm91dGxpbmUtZHJhd2VyX3JlZ3VsYXIub3V0bGluZS1kcmF3ZXJfY2xvc2VkIHtcbiAgbGVmdDogLTY5MHB4O1xufVxuLm91dGxpbmUtZHJhd2VyX2x0ci5vdXRsaW5lLWRyYXdlcl9tZWRpdW0ub3V0bGluZS1kcmF3ZXJfY2xvc2VkIHtcbiAgbGVmdDogLTczMHB4O1xufVxuLm91dGxpbmUtZHJhd2VyX2x0ci5vdXRsaW5lLWRyYXdlcl9sYXJnZS5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xuICBsZWZ0OiAtOTcwcHg7XG59XG4ub3V0bGluZS1kcmF3ZXJfdHRiLFxuLm91dGxpbmUtZHJhd2VyX2J0dCB7XG4gIGxlZnQ6IDA7XG4gIHdpZHRoOiAxMDAlO1xufVxuLm91dGxpbmUtZHJhd2VyX3R0Yi5vdXRsaW5lLWRyYXdlcl90aW55LFxuLm91dGxpbmUtZHJhd2VyX2J0dC5vdXRsaW5lLWRyYXdlcl90aW55IHtcbiAgaGVpZ2h0OiAyNDBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl90dGIub3V0bGluZS1kcmF3ZXJfbWluaSxcbi5vdXRsaW5lLWRyYXdlcl9idHQub3V0bGluZS1kcmF3ZXJfbWluaSB7XG4gIGhlaWdodDogMzIwcHg7XG59XG4ub3V0bGluZS1kcmF3ZXJfdHRiLm91dGxpbmUtZHJhd2VyX3NtYWxsLFxuLm91dGxpbmUtZHJhd2VyX2J0dC5vdXRsaW5lLWRyYXdlcl9zbWFsbCB7XG4gIGhlaWdodDogMzYwcHg7XG59XG4ub3V0bGluZS1kcmF3ZXJfdHRiLm91dGxpbmUtZHJhd2VyX3JlZ3VsYXIsXG4ub3V0bGluZS1kcmF3ZXJfYnR0Lm91dGxpbmUtZHJhd2VyX3JlZ3VsYXIge1xuICBoZWlnaHQ6IDQwMHB4O1xufVxuLm91dGxpbmUtZHJhd2VyX3R0Yi5vdXRsaW5lLWRyYXdlcl9tZWRpdW0sXG4ub3V0bGluZS1kcmF3ZXJfYnR0Lm91dGxpbmUtZHJhd2VyX21lZGl1bSB7XG4gIGhlaWdodDogNDQwcHg7XG59XG4ub3V0bGluZS1kcmF3ZXJfdHRiLm91dGxpbmUtZHJhd2VyX2xhcmdlLFxuLm91dGxpbmUtZHJhd2VyX2J0dC5vdXRsaW5lLWRyYXdlcl9sYXJnZSB7XG4gIGhlaWdodDogNDgwcHg7XG59XG4ub3V0bGluZS1kcmF3ZXJfdHRiIHtcbiAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNkY2RmZTY7XG59XG4ub3V0bGluZS1kcmF3ZXJfdHRiLm91dGxpbmUtZHJhd2VyX3Rpbnkub3V0bGluZS1kcmF3ZXJfY2xvc2VkIHtcbiAgdG9wOiAtMjUwcHg7XG59XG4ub3V0bGluZS1kcmF3ZXJfdHRiLm91dGxpbmUtZHJhd2VyX21pbmkub3V0bGluZS1kcmF3ZXJfY2xvc2VkIHtcbiAgdG9wOiAtMzMwcHg7XG59XG4ub3V0bGluZS1kcmF3ZXJfdHRiLm91dGxpbmUtZHJhd2VyX3NtYWxsLm91dGxpbmUtZHJhd2VyX2Nsb3NlZCB7XG4gIHRvcDogLTM3MHB4O1xufVxuLm91dGxpbmUtZHJhd2VyX3R0Yi5vdXRsaW5lLWRyYXdlcl9yZWd1bGFyLm91dGxpbmUtZHJhd2VyX2Nsb3NlZCB7XG4gIHRvcDogLTQxMHB4O1xufVxuLm91dGxpbmUtZHJhd2VyX3R0Yi5vdXRsaW5lLWRyYXdlcl9tZWRpdW0ub3V0bGluZS1kcmF3ZXJfY2xvc2VkIHtcbiAgdG9wOiAtNDUwcHg7XG59XG4ub3V0bGluZS1kcmF3ZXJfdHRiLm91dGxpbmUtZHJhd2VyX2xhcmdlLm91dGxpbmUtZHJhd2VyX2Nsb3NlZCB7XG4gIHRvcDogLTQ5MHB4O1xufVxuLm91dGxpbmUtZHJhd2VyX2J0dCB7XG4gIHRvcDogaW5pdGlhbDtcbiAgYm9yZGVyLXRvcDogMXB4IHNvbGlkICNkY2RmZTY7XG59XG4ub3V0bGluZS1kcmF3ZXJfYnR0Lm91dGxpbmUtZHJhd2VyX3Rpbnkub3V0bGluZS1kcmF3ZXJfY2xvc2VkIHtcbiAgYm90dG9tOiAtMjUwcHg7XG59XG4ub3V0bGluZS1kcmF3ZXJfYnR0Lm91dGxpbmUtZHJhd2VyX21pbmkub3V0bGluZS1kcmF3ZXJfY2xvc2VkIHtcbiAgYm90dG9tOiAtMzMwcHg7XG59XG4ub3V0bGluZS1kcmF3ZXJfYnR0Lm91dGxpbmUtZHJhd2VyX3NtYWxsLm91dGxpbmUtZHJhd2VyX2Nsb3NlZCB7XG4gIGJvdHRvbTogLTM3MHB4O1xufVxuLm91dGxpbmUtZHJhd2VyX2J0dC5vdXRsaW5lLWRyYXdlcl9yZWd1bGFyLm91dGxpbmUtZHJhd2VyX2Nsb3NlZCB7XG4gIGJvdHRvbTogLTQxMHB4O1xufVxuLm91dGxpbmUtZHJhd2VyX2J0dC5vdXRsaW5lLWRyYXdlcl9tZWRpdW0ub3V0bGluZS1kcmF3ZXJfY2xvc2VkIHtcbiAgYm90dG9tOiAtNDUwcHg7XG59XG4ub3V0bGluZS1kcmF3ZXJfYnR0Lm91dGxpbmUtZHJhd2VyX2xhcmdlLm91dGxpbmUtZHJhd2VyX2Nsb3NlZCB7XG4gIGJvdHRvbTogLTQ5MHB4O1xufVxuLm91dGxpbmUtZHJhd2VyX29wZW5lZCB7XG4gIHZpc2liaWxpdHk6IHZpc2libGU7XG4gIHotaW5kZXg6IHZhcigtLW91dGxpbmUtekluZGV4KTtcbn1cbi5vdXRsaW5lLWRyYXdlcl9vcGVuZWQub3V0bGluZS1kcmF3ZXIge1xuICBwb3NpdGlvbjogZml4ZWQ7XG59XG4ub3V0bGluZS1kcmF3ZXJfb3BlbmVkLm91dGxpbmUtZHJhd2VyX3J0bCB7XG4gIHJpZ2h0OiAwO1xufVxuLm91dGxpbmUtZHJhd2VyX29wZW5lZC5vdXRsaW5lLWRyYXdlcl9sdHIge1xuICBsZWZ0OiAwO1xufVxuLm91dGxpbmUtZHJhd2VyX29wZW5lZC5vdXRsaW5lLWRyYXdlcl90dGIge1xuICB0b3A6IDA7XG59XG4ub3V0bGluZS1kcmF3ZXJfb3BlbmVkLm91dGxpbmUtZHJhd2VyX2J0dCB7XG4gIGJvdHRvbTogMDtcbn1cbi5vdXRsaW5lLWRyYXdlcl9vZmZzZXQub3V0bGluZS1kcmF3ZXJfcnRsLFxuLm91dGxpbmUtZHJhd2VyX29mZnNldC5vdXRsaW5lLWRyYXdlcl9sdHIge1xuICBoZWlnaHQ6IGNhbGMoMTAwJSAtIDRlbSk7XG4gIHRvcDogNTAlO1xuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTUwJSk7XG59XG4ub3V0bGluZS1kcmF3ZXJfb2Zmc2V0Lm91dGxpbmUtZHJhd2VyX3R0Yixcbi5vdXRsaW5lLWRyYXdlcl9vZmZzZXQub3V0bGluZS1kcmF3ZXJfYnR0IHtcbiAgd2lkdGg6IGNhbGMoMTAwJSAtIDRlbSk7XG4gIGxlZnQ6IDUwJTtcbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC01MCUpO1xufVxuLm91dGxpbmUtZHJhd2VyX29mZnNldC5vdXRsaW5lLWRyYXdlcl9vcGVuZWQub3V0bGluZS1kcmF3ZXJfcnRsIHtcbiAgcmlnaHQ6IDJlbTtcbn1cbi5vdXRsaW5lLWRyYXdlcl9vZmZzZXQub3V0bGluZS1kcmF3ZXJfb3BlbmVkLm91dGxpbmUtZHJhd2VyX2x0ciB7XG4gIGxlZnQ6IDJlbTtcbn1cbi5vdXRsaW5lLWRyYXdlcl9vZmZzZXQub3V0bGluZS1kcmF3ZXJfb3BlbmVkLm91dGxpbmUtZHJhd2VyX3R0YiB7XG4gIHRvcDogMmVtO1xufVxuLm91dGxpbmUtZHJhd2VyX29mZnNldC5vdXRsaW5lLWRyYXdlcl9vcGVuZWQub3V0bGluZS1kcmF3ZXJfYnR0IHtcbiAgYm90dG9tOiAyZW07XG59XG4ub3V0bGluZS1kcmF3ZXJfYXV0by5vdXRsaW5lLWRyYXdlcl9ydGwsXG4ub3V0bGluZS1kcmF3ZXJfYXV0by5vdXRsaW5lLWRyYXdlcl9sdHIge1xuICBoZWlnaHQ6IGF1dG87XG4gIG1heC1oZWlnaHQ6IGNhbGMoMTAwJSAtIDRlbSk7XG59XG4ub3V0bGluZS1kcmF3ZXJfZnVsbCB7XG4gIHBhZGRpbmc6IDA7XG59XG4iLCJAaW1wb3J0ICcuL3ZhcmlhYmxlcyc7XHJcbkBpbXBvcnQgJy4vY29sb3JzJztcclxuQGltcG9ydCAnLi9zaGFkb3cnO1xyXG5cclxuLm91dGxpbmUtZHJhd2VyIHtcclxuICBwb3NpdGlvbjogcmVsYXRpdmU7XHJcbiAgei1pbmRleDogLTE7XHJcbiAgdG9wOiAwO1xyXG4gIGxlZnQ6IDA7XHJcbiAgbWFyZ2luOiAwO1xyXG4gIHdpZHRoOiAxMDAlO1xyXG4gIGhlaWdodDogMTAwJTtcclxuICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xyXG4gIHZpc2liaWxpdHk6IGhpZGRlbjtcclxuICBvdmVyZmxvdzogaGlkZGVuO1xyXG5cclxuICAmX19tb2RhbCB7XHJcbiAgICAuc2hhZG93X2xpZ2h0X3JlZ3VsYXIoKTtcclxuICAgIGRpc3BsYXk6IGZsZXg7XHJcbiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xyXG4gICAgZmxleC13cmFwOiBub3dyYXA7XHJcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XHJcbiAgICB6LWluZGV4OiAyMTtcclxuICAgIGhlaWdodDogMTAwJTtcclxuICAgIGJhY2tncm91bmQtY29sb3I6IEB3aGl0ZTtcclxuICAgIHRyYW5zaXRpb24tZHVyYXRpb246IDAuNHM7XHJcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xyXG4gIH1cclxuXHJcbiAgJl9faGVhZGVyLFxyXG4gICZfX21haW4sXHJcbiAgJl9fZm9vdGVyIHtcclxuICAgIHdpZHRoOiAxMDAlO1xyXG4gICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcclxuICB9XHJcblxyXG4gICZfX2hlYWRlcixcclxuICAmX19mb290ZXIge1xyXG4gICAgZmxleC1zaHJpbms6IDA7XHJcbiAgfVxyXG5cclxuICAmX190aXRsZSxcclxuICAmX19tYWluLFxyXG4gICZfX2Zvb3RlciB7XHJcbiAgICBwYWRkaW5nOiAwIDE2cHg7XHJcbiAgfVxyXG5cclxuICAmX19oZWFkZXIsXHJcbiAgJl9fdGl0bGUge1xyXG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xyXG4gICAgei1pbmRleDogMTtcclxuICAgIG1hcmdpbjogMCBhdXRvO1xyXG4gICAgaGVpZ2h0OiA1MnB4O1xyXG4gICAgbGluZS1oZWlnaHQ6IDUycHg7XHJcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xyXG4gIH1cclxuXHJcbiAgJl9fdGl0bGUge1xyXG4gICAgZm9udC1zaXplOiAxNnB4O1xyXG4gICAgZm9udC13ZWlnaHQ6IDQwMDtcclxuICAgIG1hcmdpbjogMCAxNnB4O1xyXG4gICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcclxuICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCBAcHJpbWFyeV9ib3JkZXJfY29sb3I7XHJcbiAgfVxyXG5cclxuICAmX19jbG9zZSB7XHJcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XHJcbiAgICB6LWluZGV4OiAyO1xyXG4gICAgdG9wOiA1MCU7XHJcbiAgICByaWdodDogMTJweDtcclxuICAgIHdpZHRoOiAyMHB4O1xyXG4gICAgaGVpZ2h0OiAyMHB4O1xyXG4gICAgbGluZS1oZWlnaHQ6IDIwcHg7XHJcbiAgICBjb2xvcjogQGZvdXJ0aF90ZXh0X2NvbG9yO1xyXG4gICAgZm9udC1zaXplOiAyMHB4O1xyXG4gICAgdGV4dC1hbGlnbjogY2VudGVyO1xyXG4gICAgY3Vyc29yOiBwb2ludGVyO1xyXG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC01MCUpO1xyXG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcclxuXHJcbiAgICAub3V0bGluZS1pY29uIHtcclxuICAgICAgcG9zaXRpb246IGFic29sdXRlO1xyXG4gICAgICB6LWluZGV4OiAyO1xyXG4gICAgICB0b3A6IDA7XHJcbiAgICAgIGxlZnQ6IDA7XHJcbiAgICB9XHJcblxyXG4gICAgJjpob3ZlciB7XHJcbiAgICAgIGNvbG9yOiBAdGhpcmRfdGV4dF9jb2xvcjtcclxuICAgIH1cclxuICB9XHJcblxyXG4gICZfX21haW4ge1xyXG4gICAgZmxleDogMTtcclxuICAgIG92ZXJmbG93OiBhdXRvO1xyXG5cclxuICAgICYub3ZlcmZsb3ctaGlkZGVuIHtcclxuICAgICAgb3ZlcmZsb3c6IGhpZGRlbjtcclxuICAgIH1cclxuICB9XHJcblxyXG4gICZfX2Zvb3RlciB7XHJcbiAgICBtYXJnaW46IDAgYXV0bztcclxuICAgIHRleHQtYWxpZ246IHJpZ2h0O1xyXG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcclxuICB9XHJcblxyXG4gICZfX292ZXJsYXkge1xyXG4gICAgY29udGVudDogJyc7XHJcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XHJcbiAgICB6LWluZGV4OiAxO1xyXG4gICAgdG9wOiAwO1xyXG4gICAgbGVmdDogMDtcclxuICAgIHdpZHRoOiAxMDAlO1xyXG4gICAgaGVpZ2h0OiAxMDAlO1xyXG4gICAgYmFja2dyb3VuZC1jb2xvcjogQHdoaXRlO1xyXG4gICAgb3BhY2l0eTogMC4xO1xyXG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcclxuICB9XHJcblxyXG4gICZfcnRsLFxyXG4gICZfbHRyIHtcclxuICAgICYub3V0bGluZS1kcmF3ZXIge1xyXG4gICAgICAmX3Rpbnkge1xyXG4gICAgICAgIHdpZHRoOiAyODBweDtcclxuICAgICAgfVxyXG5cclxuICAgICAgJl9taW5pIHtcclxuICAgICAgICB3aWR0aDogNDgwcHg7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgICZfc21hbGwge1xyXG4gICAgICAgIHdpZHRoOiA1NDBweDtcclxuICAgICAgfVxyXG5cclxuICAgICAgJl9yZWd1bGFyIHtcclxuICAgICAgICB3aWR0aDogNjgwcHg7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgICZfbWVkaXVtIHtcclxuICAgICAgICB3aWR0aDogNzIwcHg7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgICZfbGFyZ2Uge1xyXG4gICAgICAgIHdpZHRoOiA5NjBweDtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgJl9ydGwge1xyXG4gICAgYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCBAcHJpbWFyeV9ib3JkZXJfY29sb3I7XHJcblxyXG4gICAgJi5vdXRsaW5lLWRyYXdlciB7XHJcbiAgICAgICZfdGlueSB7XHJcbiAgICAgICAgJi5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xyXG4gICAgICAgICAgcmlnaHQ6IC0yOTBweDtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgICZfbWluaSB7XHJcbiAgICAgICAgJi5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xyXG4gICAgICAgICAgcmlnaHQ6IC00OTBweDtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgICZfc21hbGwge1xyXG4gICAgICAgICYub3V0bGluZS1kcmF3ZXJfY2xvc2VkIHtcclxuICAgICAgICAgIHJpZ2h0OiAtNTUwcHg7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICAmX3JlZ3VsYXIge1xyXG4gICAgICAgICYub3V0bGluZS1kcmF3ZXJfY2xvc2VkIHtcclxuICAgICAgICAgIHJpZ2h0OiAtNjkwcHg7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICAmX21lZGl1bSB7XHJcbiAgICAgICAgJi5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xyXG4gICAgICAgICAgcmlnaHQ6IC03MzBweDtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgICZfbGFyZ2Uge1xyXG4gICAgICAgICYub3V0bGluZS1kcmF3ZXJfY2xvc2VkIHtcclxuICAgICAgICAgIHJpZ2h0OiAtOTcwcHg7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAmX2x0ciB7XHJcbiAgICBib3JkZXItcmlnaHQ6IDFweCBzb2xpZCBAcHJpbWFyeV9ib3JkZXJfY29sb3I7XHJcblxyXG4gICAgJi5vdXRsaW5lLWRyYXdlciB7XHJcbiAgICAgICZfdGlueSB7XHJcbiAgICAgICAgJi5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xyXG4gICAgICAgICAgbGVmdDogLTI5MHB4O1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgJl9taW5pIHtcclxuICAgICAgICAmLm91dGxpbmUtZHJhd2VyX2Nsb3NlZCB7XHJcbiAgICAgICAgICBsZWZ0OiAtNDkwcHg7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICAmX3NtYWxsIHtcclxuICAgICAgICAmLm91dGxpbmUtZHJhd2VyX2Nsb3NlZCB7XHJcbiAgICAgICAgICBsZWZ0OiAtNTUwcHg7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICAmX3JlZ3VsYXIge1xyXG4gICAgICAgICYub3V0bGluZS1kcmF3ZXJfY2xvc2VkIHtcclxuICAgICAgICAgIGxlZnQ6IC02OTBweDtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgICZfbWVkaXVtIHtcclxuICAgICAgICAmLm91dGxpbmUtZHJhd2VyX2Nsb3NlZCB7XHJcbiAgICAgICAgICBsZWZ0OiAtNzMwcHg7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICAmX2xhcmdlIHtcclxuICAgICAgICAmLm91dGxpbmUtZHJhd2VyX2Nsb3NlZCB7XHJcbiAgICAgICAgICBsZWZ0OiAtOTcwcHg7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAmX3R0YixcclxuICAmX2J0dCB7XHJcbiAgICBsZWZ0OiAwO1xyXG4gICAgd2lkdGg6IDEwMCU7XHJcblxyXG4gICAgJi5vdXRsaW5lLWRyYXdlciB7XHJcbiAgICAgICZfdGlueSB7XHJcbiAgICAgICAgaGVpZ2h0OiAyNDBweDtcclxuICAgICAgfVxyXG5cclxuICAgICAgJl9taW5pIHtcclxuICAgICAgICBoZWlnaHQ6IDMyMHB4O1xyXG4gICAgICB9XHJcblxyXG4gICAgICAmX3NtYWxsIHtcclxuICAgICAgICBoZWlnaHQ6IDM2MHB4O1xyXG4gICAgICB9XHJcblxyXG4gICAgICAmX3JlZ3VsYXIge1xyXG4gICAgICAgIGhlaWdodDogNDAwcHg7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgICZfbWVkaXVtIHtcclxuICAgICAgICBoZWlnaHQ6IDQ0MHB4O1xyXG4gICAgICB9XHJcblxyXG4gICAgICAmX2xhcmdlIHtcclxuICAgICAgICBoZWlnaHQ6IDQ4MHB4O1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAmX3R0YiB7XHJcbiAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgQHByaW1hcnlfYm9yZGVyX2NvbG9yO1xyXG5cclxuICAgICYub3V0bGluZS1kcmF3ZXIge1xyXG4gICAgICAmX3Rpbnkge1xyXG4gICAgICAgICYub3V0bGluZS1kcmF3ZXJfY2xvc2VkIHtcclxuICAgICAgICAgIHRvcDogLTI1MHB4O1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgJl9taW5pIHtcclxuICAgICAgICAmLm91dGxpbmUtZHJhd2VyX2Nsb3NlZCB7XHJcbiAgICAgICAgICB0b3A6IC0zMzBweDtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgICZfc21hbGwge1xyXG4gICAgICAgICYub3V0bGluZS1kcmF3ZXJfY2xvc2VkIHtcclxuICAgICAgICAgIHRvcDogLTM3MHB4O1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgJl9yZWd1bGFyIHtcclxuICAgICAgICAmLm91dGxpbmUtZHJhd2VyX2Nsb3NlZCB7XHJcbiAgICAgICAgICB0b3A6IC00MTBweDtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgICZfbWVkaXVtIHtcclxuICAgICAgICAmLm91dGxpbmUtZHJhd2VyX2Nsb3NlZCB7XHJcbiAgICAgICAgICB0b3A6IC00NTBweDtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgICZfbGFyZ2Uge1xyXG4gICAgICAgICYub3V0bGluZS1kcmF3ZXJfY2xvc2VkIHtcclxuICAgICAgICAgIHRvcDogLTQ5MHB4O1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgJl9idHQge1xyXG4gICAgdG9wOiBpbml0aWFsO1xyXG4gICAgYm9yZGVyLXRvcDogMXB4IHNvbGlkIEBwcmltYXJ5X2JvcmRlcl9jb2xvcjtcclxuXHJcbiAgICAmLm91dGxpbmUtZHJhd2VyIHtcclxuICAgICAgJl90aW55IHtcclxuICAgICAgICAmLm91dGxpbmUtZHJhd2VyX2Nsb3NlZCB7XHJcbiAgICAgICAgICBib3R0b206IC0yNTBweDtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgICZfbWluaSB7XHJcbiAgICAgICAgJi5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xyXG4gICAgICAgICAgYm90dG9tOiAtMzMwcHg7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICAmX3NtYWxsIHtcclxuICAgICAgICAmLm91dGxpbmUtZHJhd2VyX2Nsb3NlZCB7XHJcbiAgICAgICAgICBib3R0b206IC0zNzBweDtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgICZfcmVndWxhciB7XHJcbiAgICAgICAgJi5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xyXG4gICAgICAgICAgYm90dG9tOiAtNDEwcHg7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICAmX21lZGl1bSB7XHJcbiAgICAgICAgJi5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xyXG4gICAgICAgICAgYm90dG9tOiAtNDUwcHg7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICAmX2xhcmdlIHtcclxuICAgICAgICAmLm91dGxpbmUtZHJhd2VyX2Nsb3NlZCB7XHJcbiAgICAgICAgICBib3R0b206IC00OTBweDtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gICZfb3BlbmVkIHtcclxuICAgIHZpc2liaWxpdHk6IHZpc2libGU7XHJcbiAgICB6LWluZGV4OiB2YXIoLS1vdXRsaW5lLXpJbmRleCk7XHJcblxyXG4gICAgJi5vdXRsaW5lLWRyYXdlciB7XHJcbiAgICAgIHBvc2l0aW9uOiBmaXhlZDtcclxuXHJcbiAgICAgICZfcnRsIHtcclxuICAgICAgICByaWdodDogMDtcclxuICAgICAgfVxyXG5cclxuICAgICAgJl9sdHIge1xyXG4gICAgICAgIGxlZnQ6IDA7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgICZfdHRiIHtcclxuICAgICAgICB0b3A6IDA7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgICZfYnR0IHtcclxuICAgICAgICBib3R0b206IDA7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gICZfb2Zmc2V0IHtcclxuICAgICYub3V0bGluZS1kcmF3ZXIge1xyXG4gICAgICAmX3J0bCxcclxuICAgICAgJl9sdHIge1xyXG4gICAgICAgIGhlaWdodDogY2FsYygxMDAlIC0gNGVtKTtcclxuICAgICAgICB0b3A6IDUwJTtcclxuICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTUwJSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgICZfdHRiLFxyXG4gICAgICAmX2J0dCB7XHJcbiAgICAgICAgd2lkdGg6IGNhbGMoMTAwJSAtIDRlbSk7XHJcbiAgICAgICAgbGVmdDogNTAlO1xyXG4gICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgtNTAlKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgJl9vcGVuZWQge1xyXG4gICAgICAgICYub3V0bGluZS1kcmF3ZXIge1xyXG4gICAgICAgICAgJl9ydGwge1xyXG4gICAgICAgICAgICByaWdodDogMmVtO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICZfbHRyIHtcclxuICAgICAgICAgICAgbGVmdDogMmVtO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICZfdHRiIHtcclxuICAgICAgICAgICAgdG9wOiAyZW07XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgJl9idHQge1xyXG4gICAgICAgICAgICBib3R0b206IDJlbTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gICZfYXV0byB7XHJcbiAgICAmLm91dGxpbmUtZHJhd2VyIHtcclxuICAgICAgJl9ydGwsXHJcbiAgICAgICZfbHRyIHtcclxuICAgICAgICBoZWlnaHQ6IGF1dG87XHJcbiAgICAgICAgbWF4LWhlaWdodDogY2FsYygxMDAlIC0gNGVtKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgJl9mdWxsIHtcclxuICAgIHBhZGRpbmc6IDA7XHJcbiAgfVxyXG59XHJcbiIsIi8qKlxyXG4gKiBzaGFkb3cubGVzcyAtIOmYtOW9seagt+W8j+iuvue9riBtaXhpbngg5Ye95pWwXHJcbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cclxuICogQ3JlYXRlZCBCeTogWWFvaGFpeGlhb1xyXG4gKiBVcGRhdGU6IDIwMjIuMy4yMFxyXG4gKi9cclxuQGltcG9ydCAnLi9jb2xvcnMnO1xyXG5cclxuLyogPT09PT09IOmYtOW9seagt+W8j+iuvue9ruWHveaVsCA9PT09PT0gKi9cclxuLnNoYWRvdyhAb2Zmc2V0OiAwIDAgNnB4IDFweCwgQGNvbG9yOiBAcHJpbWFyeV9ib3JkZXJfY29sb3IpIHtcclxuICBib3gtc2hhZG93OiBAb2Zmc2V0IEBjb2xvcjtcclxufVxyXG5cclxuLnNoYWRvd19yZWd1bGFyKEBjb2xvcjogQHByaW1hcnlfYm9yZGVyX2NvbG9yKSB7XHJcbiAgLnNoYWRvdygwIDAgNnB4IDFweCwgQGNvbG9yKTtcclxufVxyXG5cclxuLnNoYWRvd19sYXJnZShAY29sb3I6IEBwcmltYXJ5X2JvcmRlcl9jb2xvcikge1xyXG4gIC5zaGFkb3coMCAwIDEycHggMXB4LCBAY29sb3IpO1xyXG59XHJcblxyXG4uc2hhZG93X2xpZ2h0X3JlZ3VsYXIoKSB7XHJcbiAgLnNoYWRvd19yZWd1bGFyKCk7XHJcbn1cclxuXHJcbi5zaGFkb3dfbGlnaHRfbGFyZ2UoKSB7XHJcbiAgLnNoYWRvd19sYXJnZSgpO1xyXG59XHJcblxyXG4uc2hhZG93X2RhcmtfcmVndWxhcigpIHtcclxuICAuc2hhZG93X3JlZ3VsYXIoQHNlY29uZGFyeV9ib3JkZXJfY29sb3IpO1xyXG59XHJcblxyXG4uc2hhZG93X2RhcmtfbGFyZ2UoKSB7XHJcbiAgLnNoYWRvd19sYXJnZShAc2Vjb25kYXJ5X2JvcmRlcl9jb2xvcik7XHJcbn1cclxuIl19 */ diff --git a/drawer.min.css b/drawer.min.css deleted file mode 100644 index 64374cb2..00000000 --- a/drawer.min.css +++ /dev/null @@ -1,2 +0,0 @@ -.outline-drawer__title,.outline-drawer_ttb{border-bottom:1px solid #dcdfe6}:root{--outline-zIndex:2000;--outline-sticky-height:100%;--outline-navigator-width:100%}.outline-drawer{position:relative;z-index:-1;top:0;left:0;margin:0;width:100%;height:100%;-webkit-box-sizing:border-box;box-sizing:border-box;visibility:hidden;overflow:hidden}.outline-drawer__modal{-webkit-box-shadow:0 0 6px 1px #dcdfe6;box-shadow:0 0 6px 1px #dcdfe6;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-ms-flex-wrap:nowrap;flex-wrap:nowrap;position:absolute;z-index:21;height:100%;background-color:#fff;-webkit-transition-duration:.4s;transition-duration:.4s;overflow:hidden}.outline-drawer__footer,.outline-drawer__header,.outline-drawer__main{width:100%;-webkit-box-sizing:border-box;box-sizing:border-box}.outline-drawer__footer,.outline-drawer__header{-ms-flex-negative:0;flex-shrink:0}.outline-drawer__footer,.outline-drawer__main,.outline-drawer__title{padding:0 16px}.outline-drawer__header,.outline-drawer__title{position:relative;z-index:1;margin:0 auto;height:52px;line-height:52px;overflow:hidden}.outline-drawer__title{font-size:16px;font-weight:400;margin:0 16px;-webkit-box-sizing:border-box;box-sizing:border-box}.outline-drawer__close{position:absolute;z-index:2;top:50%;right:12px;width:20px;height:20px;line-height:20px;color:#999;font-size:20px;text-align:center;cursor:pointer;-webkit-transform:translateY(-50%);transform:translateY(-50%);overflow:hidden}.outline-drawer__close .outline-icon{position:absolute;z-index:2;top:0;left:0}.outline-drawer__close:hover{color:#666}.outline-drawer__main{-webkit-box-flex:1;-ms-flex:1;flex:1;overflow:auto}.outline-drawer__main.overflow-hidden{overflow:hidden}.outline-drawer__footer{margin:0 auto;text-align:right;overflow:hidden}.outline-drawer__overlay{content:'';position:relative;z-index:1;top:0;left:0;width:100%;height:100%;background-color:#fff;opacity:.1;overflow:hidden}.outline-drawer_ltr.outline-drawer_tiny,.outline-drawer_rtl.outline-drawer_tiny{width:280px}.outline-drawer_ltr.outline-drawer_mini,.outline-drawer_rtl.outline-drawer_mini{width:480px}.outline-drawer_ltr.outline-drawer_small,.outline-drawer_rtl.outline-drawer_small{width:540px}.outline-drawer_ltr.outline-drawer_regular,.outline-drawer_rtl.outline-drawer_regular{width:680px}.outline-drawer_ltr.outline-drawer_medium,.outline-drawer_rtl.outline-drawer_medium{width:720px}.outline-drawer_ltr.outline-drawer_large,.outline-drawer_rtl.outline-drawer_large{width:960px}.outline-drawer_rtl{border-left:1px solid #dcdfe6}.outline-drawer_rtl.outline-drawer_tiny.outline-drawer_closed{right:-290px}.outline-drawer_rtl.outline-drawer_mini.outline-drawer_closed{right:-490px}.outline-drawer_rtl.outline-drawer_small.outline-drawer_closed{right:-550px}.outline-drawer_rtl.outline-drawer_regular.outline-drawer_closed{right:-690px}.outline-drawer_rtl.outline-drawer_medium.outline-drawer_closed{right:-730px}.outline-drawer_rtl.outline-drawer_large.outline-drawer_closed{right:-970px}.outline-drawer_ltr{border-right:1px solid #dcdfe6}.outline-drawer_ltr.outline-drawer_tiny.outline-drawer_closed{left:-290px}.outline-drawer_ltr.outline-drawer_mini.outline-drawer_closed{left:-490px}.outline-drawer_ltr.outline-drawer_small.outline-drawer_closed{left:-550px}.outline-drawer_ltr.outline-drawer_regular.outline-drawer_closed{left:-690px}.outline-drawer_ltr.outline-drawer_medium.outline-drawer_closed{left:-730px}.outline-drawer_ltr.outline-drawer_large.outline-drawer_closed{left:-970px}.outline-drawer_btt,.outline-drawer_ttb{left:0;width:100%}.outline-drawer_btt.outline-drawer_tiny,.outline-drawer_ttb.outline-drawer_tiny{height:240px}.outline-drawer_btt.outline-drawer_mini,.outline-drawer_ttb.outline-drawer_mini{height:320px}.outline-drawer_btt.outline-drawer_small,.outline-drawer_ttb.outline-drawer_small{height:360px}.outline-drawer_btt.outline-drawer_regular,.outline-drawer_ttb.outline-drawer_regular{height:400px}.outline-drawer_btt.outline-drawer_medium,.outline-drawer_ttb.outline-drawer_medium{height:440px}.outline-drawer_btt.outline-drawer_large,.outline-drawer_ttb.outline-drawer_large{height:480px}.outline-drawer_ttb.outline-drawer_tiny.outline-drawer_closed{top:-250px}.outline-drawer_ttb.outline-drawer_mini.outline-drawer_closed{top:-330px}.outline-drawer_ttb.outline-drawer_small.outline-drawer_closed{top:-370px}.outline-drawer_ttb.outline-drawer_regular.outline-drawer_closed{top:-410px}.outline-drawer_ttb.outline-drawer_medium.outline-drawer_closed{top:-450px}.outline-drawer_ttb.outline-drawer_large.outline-drawer_closed{top:-490px}.outline-drawer_btt{top:initial;border-top:1px solid #dcdfe6}.outline-drawer_btt.outline-drawer_tiny.outline-drawer_closed{bottom:-250px}.outline-drawer_btt.outline-drawer_mini.outline-drawer_closed{bottom:-330px}.outline-drawer_btt.outline-drawer_small.outline-drawer_closed{bottom:-370px}.outline-drawer_btt.outline-drawer_regular.outline-drawer_closed{bottom:-410px}.outline-drawer_btt.outline-drawer_medium.outline-drawer_closed{bottom:-450px}.outline-drawer_btt.outline-drawer_large.outline-drawer_closed{bottom:-490px}.outline-drawer_opened{visibility:visible;z-index:var(--outline-zIndex)}.outline-drawer_opened.outline-drawer{position:fixed}.outline-drawer_opened.outline-drawer_rtl{right:0}.outline-drawer_opened.outline-drawer_ltr{left:0}.outline-drawer_opened.outline-drawer_ttb{top:0}.outline-drawer_opened.outline-drawer_btt{bottom:0}.outline-drawer_offset.outline-drawer_ltr,.outline-drawer_offset.outline-drawer_rtl{height:calc(100% - 4em);top:50%;-webkit-transform:translateY(-50%);transform:translateY(-50%)}.outline-drawer_offset.outline-drawer_btt,.outline-drawer_offset.outline-drawer_ttb{width:calc(100% - 4em);left:50%;-webkit-transform:translateX(-50%);transform:translateX(-50%)}.outline-drawer_offset.outline-drawer_opened.outline-drawer_rtl{right:2em}.outline-drawer_offset.outline-drawer_opened.outline-drawer_ltr{left:2em}.outline-drawer_offset.outline-drawer_opened.outline-drawer_ttb{top:2em}.outline-drawer_offset.outline-drawer_opened.outline-drawer_btt{bottom:2em}.outline-drawer_auto.outline-drawer_ltr,.outline-drawer_auto.outline-drawer_rtl{height:auto;max-height:calc(100% - 4em)}.outline-drawer_full{padding:0} -/*# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlcyI6WyJkcmF3ZXIuY3NzIl0sInNvdXJjZXNDb250ZW50IjpbIjpyb290IHtcbiAgLS1vdXRsaW5lLXpJbmRleDogMjAwMDtcbiAgLS1vdXRsaW5lLXN0aWNreS1oZWlnaHQ6IDEwMCU7XG4gIC0tb3V0bGluZS1uYXZpZ2F0b3Itd2lkdGg6IDEwMCU7XG59XG4vKiA9PT09PT09PT09IGNvbG9ycy50aGVtZSAtIOWfuuehgOminOiJsuWPmOmHj+mbhuWQiCA9PT09PT09PT09ICovXG4vKipcbiAqIHNoYWRvdy5sZXNzIC0g6Zi05b2x5qC35byP6K6+572uIG1peGlueCDlh73mlbBcbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIENyZWF0ZWQgQnk6IFlhb2hhaXhpYW9cbiAqIFVwZGF0ZTogMjAyMi4zLjIwXG4gKi9cbi8qID09PT09PSDpmLTlvbHmoLflvI/orr7nva7lh73mlbAgPT09PT09ICovXG4ub3V0bGluZS1kcmF3ZXIge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIHotaW5kZXg6IC0xO1xuICB0b3A6IDA7XG4gIGxlZnQ6IDA7XG4gIG1hcmdpbjogMDtcbiAgd2lkdGg6IDEwMCU7XG4gIGhlaWdodDogMTAwJTtcbiAgLXdlYmtpdC1ib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gIHZpc2liaWxpdHk6IGhpZGRlbjtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi5vdXRsaW5lLWRyYXdlcl9fbW9kYWwge1xuICAtd2Via2l0LWJveC1zaGFkb3c6IDAgMCA2cHggMXB4ICNkY2RmZTY7XG4gICAgICAgICAgYm94LXNoYWRvdzogMCAwIDZweCAxcHggI2RjZGZlNjtcbiAgZGlzcGxheTogLXdlYmtpdC1ib3g7XG4gIGRpc3BsYXk6IC1tcy1mbGV4Ym94O1xuICBkaXNwbGF5OiBmbGV4O1xuICAtd2Via2l0LWJveC1vcmllbnQ6IHZlcnRpY2FsO1xuICAtd2Via2l0LWJveC1kaXJlY3Rpb246IG5vcm1hbDtcbiAgICAgIC1tcy1mbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gIC1tcy1mbGV4LXdyYXA6IG5vd3JhcDtcbiAgICAgIGZsZXgtd3JhcDogbm93cmFwO1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHotaW5kZXg6IDIxO1xuICBoZWlnaHQ6IDEwMCU7XG4gIGJhY2tncm91bmQtY29sb3I6ICNmZmY7XG4gIC13ZWJraXQtdHJhbnNpdGlvbi1kdXJhdGlvbjogMC40cztcbiAgICAgICAgICB0cmFuc2l0aW9uLWR1cmF0aW9uOiAwLjRzO1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLm91dGxpbmUtZHJhd2VyX19oZWFkZXIsXG4ub3V0bGluZS1kcmF3ZXJfX21haW4sXG4ub3V0bGluZS1kcmF3ZXJfX2Zvb3RlciB7XG4gIHdpZHRoOiAxMDAlO1xuICAtd2Via2l0LWJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbn1cbi5vdXRsaW5lLWRyYXdlcl9faGVhZGVyLFxuLm91dGxpbmUtZHJhd2VyX19mb290ZXIge1xuICAtbXMtZmxleC1uZWdhdGl2ZTogMDtcbiAgICAgIGZsZXgtc2hyaW5rOiAwO1xufVxuLm91dGxpbmUtZHJhd2VyX190aXRsZSxcbi5vdXRsaW5lLWRyYXdlcl9fbWFpbixcbi5vdXRsaW5lLWRyYXdlcl9fZm9vdGVyIHtcbiAgcGFkZGluZzogMCAxNnB4O1xufVxuLm91dGxpbmUtZHJhd2VyX19oZWFkZXIsXG4ub3V0bGluZS1kcmF3ZXJfX3RpdGxlIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICB6LWluZGV4OiAxO1xuICBtYXJnaW46IDAgYXV0bztcbiAgaGVpZ2h0OiA1MnB4O1xuICBsaW5lLWhlaWdodDogNTJweDtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi5vdXRsaW5lLWRyYXdlcl9fdGl0bGUge1xuICBmb250LXNpemU6IDE2cHg7XG4gIGZvbnQtd2VpZ2h0OiA0MDA7XG4gIG1hcmdpbjogMCAxNnB4O1xuICAtd2Via2l0LWJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNkY2RmZTY7XG59XG4ub3V0bGluZS1kcmF3ZXJfX2Nsb3NlIHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB6LWluZGV4OiAyO1xuICB0b3A6IDUwJTtcbiAgcmlnaHQ6IDEycHg7XG4gIHdpZHRoOiAyMHB4O1xuICBoZWlnaHQ6IDIwcHg7XG4gIGxpbmUtaGVpZ2h0OiAyMHB4O1xuICBjb2xvcjogIzk5OTtcbiAgZm9udC1zaXplOiAyMHB4O1xuICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gIGN1cnNvcjogcG9pbnRlcjtcbiAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTUwJSk7XG4gICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC01MCUpO1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLm91dGxpbmUtZHJhd2VyX19jbG9zZSAub3V0bGluZS1pY29uIHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB6LWluZGV4OiAyO1xuICB0b3A6IDA7XG4gIGxlZnQ6IDA7XG59XG4ub3V0bGluZS1kcmF3ZXJfX2Nsb3NlOmhvdmVyIHtcbiAgY29sb3I6ICM2NjY7XG59XG4ub3V0bGluZS1kcmF3ZXJfX21haW4ge1xuICAtd2Via2l0LWJveC1mbGV4OiAxO1xuICAgICAgLW1zLWZsZXg6IDE7XG4gICAgICAgICAgZmxleDogMTtcbiAgb3ZlcmZsb3c6IGF1dG87XG59XG4ub3V0bGluZS1kcmF3ZXJfX21haW4ub3ZlcmZsb3ctaGlkZGVuIHtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi5vdXRsaW5lLWRyYXdlcl9fZm9vdGVyIHtcbiAgbWFyZ2luOiAwIGF1dG87XG4gIHRleHQtYWxpZ246IHJpZ2h0O1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLm91dGxpbmUtZHJhd2VyX19vdmVybGF5IHtcbiAgY29udGVudDogJyc7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgei1pbmRleDogMTtcbiAgdG9wOiAwO1xuICBsZWZ0OiAwO1xuICB3aWR0aDogMTAwJTtcbiAgaGVpZ2h0OiAxMDAlO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmO1xuICBvcGFjaXR5OiAwLjE7XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4ub3V0bGluZS1kcmF3ZXJfcnRsLm91dGxpbmUtZHJhd2VyX3RpbnksXG4ub3V0bGluZS1kcmF3ZXJfbHRyLm91dGxpbmUtZHJhd2VyX3Rpbnkge1xuICB3aWR0aDogMjgwcHg7XG59XG4ub3V0bGluZS1kcmF3ZXJfcnRsLm91dGxpbmUtZHJhd2VyX21pbmksXG4ub3V0bGluZS1kcmF3ZXJfbHRyLm91dGxpbmUtZHJhd2VyX21pbmkge1xuICB3aWR0aDogNDgwcHg7XG59XG4ub3V0bGluZS1kcmF3ZXJfcnRsLm91dGxpbmUtZHJhd2VyX3NtYWxsLFxuLm91dGxpbmUtZHJhd2VyX2x0ci5vdXRsaW5lLWRyYXdlcl9zbWFsbCB7XG4gIHdpZHRoOiA1NDBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl9ydGwub3V0bGluZS1kcmF3ZXJfcmVndWxhcixcbi5vdXRsaW5lLWRyYXdlcl9sdHIub3V0bGluZS1kcmF3ZXJfcmVndWxhciB7XG4gIHdpZHRoOiA2ODBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl9ydGwub3V0bGluZS1kcmF3ZXJfbWVkaXVtLFxuLm91dGxpbmUtZHJhd2VyX2x0ci5vdXRsaW5lLWRyYXdlcl9tZWRpdW0ge1xuICB3aWR0aDogNzIwcHg7XG59XG4ub3V0bGluZS1kcmF3ZXJfcnRsLm91dGxpbmUtZHJhd2VyX2xhcmdlLFxuLm91dGxpbmUtZHJhd2VyX2x0ci5vdXRsaW5lLWRyYXdlcl9sYXJnZSB7XG4gIHdpZHRoOiA5NjBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl9ydGwge1xuICBib3JkZXItbGVmdDogMXB4IHNvbGlkICNkY2RmZTY7XG59XG4ub3V0bGluZS1kcmF3ZXJfcnRsLm91dGxpbmUtZHJhd2VyX3Rpbnkub3V0bGluZS1kcmF3ZXJfY2xvc2VkIHtcbiAgcmlnaHQ6IC0yOTBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl9ydGwub3V0bGluZS1kcmF3ZXJfbWluaS5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xuICByaWdodDogLTQ5MHB4O1xufVxuLm91dGxpbmUtZHJhd2VyX3J0bC5vdXRsaW5lLWRyYXdlcl9zbWFsbC5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xuICByaWdodDogLTU1MHB4O1xufVxuLm91dGxpbmUtZHJhd2VyX3J0bC5vdXRsaW5lLWRyYXdlcl9yZWd1bGFyLm91dGxpbmUtZHJhd2VyX2Nsb3NlZCB7XG4gIHJpZ2h0OiAtNjkwcHg7XG59XG4ub3V0bGluZS1kcmF3ZXJfcnRsLm91dGxpbmUtZHJhd2VyX21lZGl1bS5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xuICByaWdodDogLTczMHB4O1xufVxuLm91dGxpbmUtZHJhd2VyX3J0bC5vdXRsaW5lLWRyYXdlcl9sYXJnZS5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xuICByaWdodDogLTk3MHB4O1xufVxuLm91dGxpbmUtZHJhd2VyX2x0ciB7XG4gIGJvcmRlci1yaWdodDogMXB4IHNvbGlkICNkY2RmZTY7XG59XG4ub3V0bGluZS1kcmF3ZXJfbHRyLm91dGxpbmUtZHJhd2VyX3Rpbnkub3V0bGluZS1kcmF3ZXJfY2xvc2VkIHtcbiAgbGVmdDogLTI5MHB4O1xufVxuLm91dGxpbmUtZHJhd2VyX2x0ci5vdXRsaW5lLWRyYXdlcl9taW5pLm91dGxpbmUtZHJhd2VyX2Nsb3NlZCB7XG4gIGxlZnQ6IC00OTBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl9sdHIub3V0bGluZS1kcmF3ZXJfc21hbGwub3V0bGluZS1kcmF3ZXJfY2xvc2VkIHtcbiAgbGVmdDogLTU1MHB4O1xufVxuLm91dGxpbmUtZHJhd2VyX2x0ci5vdXRsaW5lLWRyYXdlcl9yZWd1bGFyLm91dGxpbmUtZHJhd2VyX2Nsb3NlZCB7XG4gIGxlZnQ6IC02OTBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl9sdHIub3V0bGluZS1kcmF3ZXJfbWVkaXVtLm91dGxpbmUtZHJhd2VyX2Nsb3NlZCB7XG4gIGxlZnQ6IC03MzBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl9sdHIub3V0bGluZS1kcmF3ZXJfbGFyZ2Uub3V0bGluZS1kcmF3ZXJfY2xvc2VkIHtcbiAgbGVmdDogLTk3MHB4O1xufVxuLm91dGxpbmUtZHJhd2VyX3R0Yixcbi5vdXRsaW5lLWRyYXdlcl9idHQge1xuICBsZWZ0OiAwO1xuICB3aWR0aDogMTAwJTtcbn1cbi5vdXRsaW5lLWRyYXdlcl90dGIub3V0bGluZS1kcmF3ZXJfdGlueSxcbi5vdXRsaW5lLWRyYXdlcl9idHQub3V0bGluZS1kcmF3ZXJfdGlueSB7XG4gIGhlaWdodDogMjQwcHg7XG59XG4ub3V0bGluZS1kcmF3ZXJfdHRiLm91dGxpbmUtZHJhd2VyX21pbmksXG4ub3V0bGluZS1kcmF3ZXJfYnR0Lm91dGxpbmUtZHJhd2VyX21pbmkge1xuICBoZWlnaHQ6IDMyMHB4O1xufVxuLm91dGxpbmUtZHJhd2VyX3R0Yi5vdXRsaW5lLWRyYXdlcl9zbWFsbCxcbi5vdXRsaW5lLWRyYXdlcl9idHQub3V0bGluZS1kcmF3ZXJfc21hbGwge1xuICBoZWlnaHQ6IDM2MHB4O1xufVxuLm91dGxpbmUtZHJhd2VyX3R0Yi5vdXRsaW5lLWRyYXdlcl9yZWd1bGFyLFxuLm91dGxpbmUtZHJhd2VyX2J0dC5vdXRsaW5lLWRyYXdlcl9yZWd1bGFyIHtcbiAgaGVpZ2h0OiA0MDBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl90dGIub3V0bGluZS1kcmF3ZXJfbWVkaXVtLFxuLm91dGxpbmUtZHJhd2VyX2J0dC5vdXRsaW5lLWRyYXdlcl9tZWRpdW0ge1xuICBoZWlnaHQ6IDQ0MHB4O1xufVxuLm91dGxpbmUtZHJhd2VyX3R0Yi5vdXRsaW5lLWRyYXdlcl9sYXJnZSxcbi5vdXRsaW5lLWRyYXdlcl9idHQub3V0bGluZS1kcmF3ZXJfbGFyZ2Uge1xuICBoZWlnaHQ6IDQ4MHB4O1xufVxuLm91dGxpbmUtZHJhd2VyX3R0YiB7XG4gIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjZGNkZmU2O1xufVxuLm91dGxpbmUtZHJhd2VyX3R0Yi5vdXRsaW5lLWRyYXdlcl90aW55Lm91dGxpbmUtZHJhd2VyX2Nsb3NlZCB7XG4gIHRvcDogLTI1MHB4O1xufVxuLm91dGxpbmUtZHJhd2VyX3R0Yi5vdXRsaW5lLWRyYXdlcl9taW5pLm91dGxpbmUtZHJhd2VyX2Nsb3NlZCB7XG4gIHRvcDogLTMzMHB4O1xufVxuLm91dGxpbmUtZHJhd2VyX3R0Yi5vdXRsaW5lLWRyYXdlcl9zbWFsbC5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xuICB0b3A6IC0zNzBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl90dGIub3V0bGluZS1kcmF3ZXJfcmVndWxhci5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xuICB0b3A6IC00MTBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl90dGIub3V0bGluZS1kcmF3ZXJfbWVkaXVtLm91dGxpbmUtZHJhd2VyX2Nsb3NlZCB7XG4gIHRvcDogLTQ1MHB4O1xufVxuLm91dGxpbmUtZHJhd2VyX3R0Yi5vdXRsaW5lLWRyYXdlcl9sYXJnZS5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xuICB0b3A6IC00OTBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl9idHQge1xuICB0b3A6IGluaXRpYWw7XG4gIGJvcmRlci10b3A6IDFweCBzb2xpZCAjZGNkZmU2O1xufVxuLm91dGxpbmUtZHJhd2VyX2J0dC5vdXRsaW5lLWRyYXdlcl90aW55Lm91dGxpbmUtZHJhd2VyX2Nsb3NlZCB7XG4gIGJvdHRvbTogLTI1MHB4O1xufVxuLm91dGxpbmUtZHJhd2VyX2J0dC5vdXRsaW5lLWRyYXdlcl9taW5pLm91dGxpbmUtZHJhd2VyX2Nsb3NlZCB7XG4gIGJvdHRvbTogLTMzMHB4O1xufVxuLm91dGxpbmUtZHJhd2VyX2J0dC5vdXRsaW5lLWRyYXdlcl9zbWFsbC5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xuICBib3R0b206IC0zNzBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl9idHQub3V0bGluZS1kcmF3ZXJfcmVndWxhci5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xuICBib3R0b206IC00MTBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl9idHQub3V0bGluZS1kcmF3ZXJfbWVkaXVtLm91dGxpbmUtZHJhd2VyX2Nsb3NlZCB7XG4gIGJvdHRvbTogLTQ1MHB4O1xufVxuLm91dGxpbmUtZHJhd2VyX2J0dC5vdXRsaW5lLWRyYXdlcl9sYXJnZS5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xuICBib3R0b206IC00OTBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl9vcGVuZWQge1xuICB2aXNpYmlsaXR5OiB2aXNpYmxlO1xuICB6LWluZGV4OiB2YXIoLS1vdXRsaW5lLXpJbmRleCk7XG59XG4ub3V0bGluZS1kcmF3ZXJfb3BlbmVkLm91dGxpbmUtZHJhd2VyIHtcbiAgcG9zaXRpb246IGZpeGVkO1xufVxuLm91dGxpbmUtZHJhd2VyX29wZW5lZC5vdXRsaW5lLWRyYXdlcl9ydGwge1xuICByaWdodDogMDtcbn1cbi5vdXRsaW5lLWRyYXdlcl9vcGVuZWQub3V0bGluZS1kcmF3ZXJfbHRyIHtcbiAgbGVmdDogMDtcbn1cbi5vdXRsaW5lLWRyYXdlcl9vcGVuZWQub3V0bGluZS1kcmF3ZXJfdHRiIHtcbiAgdG9wOiAwO1xufVxuLm91dGxpbmUtZHJhd2VyX29wZW5lZC5vdXRsaW5lLWRyYXdlcl9idHQge1xuICBib3R0b206IDA7XG59XG4ub3V0bGluZS1kcmF3ZXJfb2Zmc2V0Lm91dGxpbmUtZHJhd2VyX3J0bCxcbi5vdXRsaW5lLWRyYXdlcl9vZmZzZXQub3V0bGluZS1kcmF3ZXJfbHRyIHtcbiAgaGVpZ2h0OiBjYWxjKDEwMCUgLSA0ZW0pO1xuICB0b3A6IDUwJTtcbiAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTUwJSk7XG4gICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC01MCUpO1xufVxuLm91dGxpbmUtZHJhd2VyX29mZnNldC5vdXRsaW5lLWRyYXdlcl90dGIsXG4ub3V0bGluZS1kcmF3ZXJfb2Zmc2V0Lm91dGxpbmUtZHJhd2VyX2J0dCB7XG4gIHdpZHRoOiBjYWxjKDEwMCUgLSA0ZW0pO1xuICBsZWZ0OiA1MCU7XG4gIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC01MCUpO1xuICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgtNTAlKTtcbn1cbi5vdXRsaW5lLWRyYXdlcl9vZmZzZXQub3V0bGluZS1kcmF3ZXJfb3BlbmVkLm91dGxpbmUtZHJhd2VyX3J0bCB7XG4gIHJpZ2h0OiAyZW07XG59XG4ub3V0bGluZS1kcmF3ZXJfb2Zmc2V0Lm91dGxpbmUtZHJhd2VyX29wZW5lZC5vdXRsaW5lLWRyYXdlcl9sdHIge1xuICBsZWZ0OiAyZW07XG59XG4ub3V0bGluZS1kcmF3ZXJfb2Zmc2V0Lm91dGxpbmUtZHJhd2VyX29wZW5lZC5vdXRsaW5lLWRyYXdlcl90dGIge1xuICB0b3A6IDJlbTtcbn1cbi5vdXRsaW5lLWRyYXdlcl9vZmZzZXQub3V0bGluZS1kcmF3ZXJfb3BlbmVkLm91dGxpbmUtZHJhd2VyX2J0dCB7XG4gIGJvdHRvbTogMmVtO1xufVxuLm91dGxpbmUtZHJhd2VyX2F1dG8ub3V0bGluZS1kcmF3ZXJfcnRsLFxuLm91dGxpbmUtZHJhd2VyX2F1dG8ub3V0bGluZS1kcmF3ZXJfbHRyIHtcbiAgaGVpZ2h0OiBhdXRvO1xuICBtYXgtaGVpZ2h0OiBjYWxjKDEwMCUgLSA0ZW0pO1xufVxuLm91dGxpbmUtZHJhd2VyX2Z1bGwge1xuICBwYWRkaW5nOiAwO1xufVxuXG4vKiMgc291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247Y2hhcnNldD11dGY4O2Jhc2U2NCxleUoyWlhKemFXOXVJam96TENKemIzVnlZMlZ6SWpwYkluWmhjbWxoWW14bGN5NXNaWE56SWl3aUxpNHZQR2x1Y0hWMElHTnpjeUF6UGlJc0ltUnlZWGRsY2k1c1pYTnpJaXdpYzJoaFpHOTNMbXhsYzNNaVhTd2libUZ0WlhNaU9sdGRMQ0p0WVhCd2FXNW5jeUk2SWtGQlFVRTdSVUZEUlN4MVFrRkJRVHRGUVVOQkxEaENRVUZCTzBWQlEwRXNaME5CUVVFN1EwTkRSRHRCUVVORUxHMUVRVUZ0UkR0QlFVTnVSRHM3T3pzN1IwRkxSenRCUVVOSUxEUkNRVUUwUWp0QlExSTFRanRGUVVORkxHMUNRVUZCTzBWQlEwRXNXVUZCUVR0RlFVTkJMRTlCUVVFN1JVRkRRU3hSUVVGQk8wVkJRMEVzVlVGQlFUdEZRVU5CTEZsQlFVRTdSVUZEUVN4aFFVRkJPMFZCUTBFc0swSkJRVUU3VlVGQlFTeDFRa0ZCUVR0RlFVTkJMRzFDUVVGQk8wVkJRMEVzYVVKQlFVRTdRMFJWUkR0QlExSkRPMFZEVGtFc2QwTkJRVUU3VlVGQlFTeG5RMEZCUVR0RlJGRkZMSEZDUVVGQk8wVkJRVUVzY1VKQlFVRTdSVUZCUVN4alFVRkJPMFZCUTBFc05rSkJRVUU3UlVGQlFTdzRRa0ZCUVR0TlFVRkJMREpDUVVGQk8xVkJRVUVzZFVKQlFVRTdSVUZEUVN4elFrRkJRVHROUVVGQkxHdENRVUZCTzBWQlEwRXNiVUpCUVVFN1JVRkRRU3haUVVGQk8wVkJRMEVzWVVGQlFUdEZRVU5CTEhWQ1FVRkJPMFZCUTBFc2EwTkJRVUU3VlVGQlFTd3dRa0ZCUVR0RlFVTkJMR2xDUVVGQk8wTkVWVWc3UVVOUVF6czdPMFZCUjBVc1dVRkJRVHRGUVVOQkxDdENRVUZCTzFWQlFVRXNkVUpCUVVFN1EwUlRTRHRCUTA1RE96dEZRVVZGTEhGQ1FVRkJPMDFCUVVFc1pVRkJRVHREUkZGSU8wRkRURU03T3p0RlFVZEZMR2RDUVVGQk8wTkVUMGc3UVVOS1F6czdSVUZGUlN4dFFrRkJRVHRGUVVOQkxGZEJRVUU3UlVGRFFTeGxRVUZCTzBWQlEwRXNZVUZCUVR0RlFVTkJMR3RDUVVGQk8wVkJRMEVzYVVKQlFVRTdRMFJOU0R0QlEwaERPMFZCUTBVc1owSkJRVUU3UlVGRFFTeHBRa0ZCUVR0RlFVTkJMR1ZCUVVFN1JVRkRRU3dyUWtGQlFUdFZRVUZCTEhWQ1FVRkJPMFZCUTBFc2FVTkJRVUU3UTBSTFNEdEJRMFpETzBWQlEwVXNiVUpCUVVFN1JVRkRRU3hYUVVGQk8wVkJRMEVzVTBGQlFUdEZRVU5CTEZsQlFVRTdSVUZEUVN4WlFVRkJPMFZCUTBFc1lVRkJRVHRGUVVOQkxHdENRVUZCTzBWQlEwRXNXVUZCUVR0RlFVTkJMR2RDUVVGQk8wVkJRMEVzYlVKQlFVRTdSVUZEUVN4blFrRkJRVHRGUVVOQkxHOURRVUZCTzFWQlFVRXNORUpCUVVFN1JVRkRRU3hwUWtGQlFUdERSRWxJTzBGRGFrSkRPMFZCWjBKSkxHMUNRVUZCTzBWQlEwRXNWMEZCUVR0RlFVTkJMRTlCUVVFN1JVRkRRU3hSUVVGQk8wTkVTVXc3UVVORVJ6dEZRVU5GTEZsQlFVRTdRMFJIVER0QlEwTkRPMFZCUTBVc2IwSkJRVUU3VFVGQlFTeFpRVUZCTzFWQlFVRXNVVUZCUVR0RlFVTkJMR1ZCUVVFN1EwUkRTRHRCUTBOSE8wVkJRMFVzYVVKQlFVRTdRMFJEVER0QlEwZERPMFZCUTBVc1pVRkJRVHRGUVVOQkxHdENRVUZCTzBWQlEwRXNhVUpCUVVFN1EwUkVTRHRCUTBsRE8wVkJRMFVzV1VGQlFUdEZRVU5CTEcxQ1FVRkJPMFZCUTBFc1YwRkJRVHRGUVVOQkxFOUJRVUU3UlVGRFFTeFJRVUZCTzBWQlEwRXNXVUZCUVR0RlFVTkJMR0ZCUVVFN1JVRkRRU3gxUWtGQlFUdEZRVU5CTEdGQlFVRTdSVUZEUVN4cFFrRkJRVHREUkVaSU8wRkRVVXM3TzBWQlEwVXNZVUZCUVR0RFJFeFFPMEZEVVVzN08wVkJRMFVzWVVGQlFUdERSRXhRTzBGRFVVczdPMFZCUTBVc1lVRkJRVHREUkV4UU8wRkRVVXM3TzBWQlEwVXNZVUZCUVR0RFJFeFFPMEZEVVVzN08wVkJRMFVzWVVGQlFUdERSRXhRTzBGRFVVczdPMFZCUTBVc1lVRkJRVHREUkV4UU8wRkRWVU03UlVGRFJTd3JRa0ZCUVR0RFJGSklPMEZEV1U4N1JVRkRSU3hqUVVGQk8wTkVWbFE3UVVObFR6dEZRVU5GTEdOQlFVRTdRMFJpVkR0QlEydENUenRGUVVORkxHTkJRVUU3UTBSb1FsUTdRVU54UWs4N1JVRkRSU3hqUVVGQk8wTkVia0pVTzBGRGQwSlBPMFZCUTBVc1kwRkJRVHREUkhSQ1ZEdEJRekpDVHp0RlFVTkZMR05CUVVFN1EwUjZRbFE3UVVNclFrTTdSVUZEUlN4blEwRkJRVHREUkRkQ1NEdEJRMmxEVHp0RlFVTkZMR0ZCUVVFN1EwUXZRbFE3UVVOdlEwODdSVUZEUlN4aFFVRkJPME5FYkVOVU8wRkRkVU5QTzBWQlEwVXNZVUZCUVR0RFJISkRWRHRCUXpCRFR6dEZRVU5GTEdGQlFVRTdRMFI0UTFRN1FVTTJRMDg3UlVGRFJTeGhRVUZCTzBORU0wTlVPMEZEWjBSUE8wVkJRMFVzWVVGQlFUdERSRGxEVkR0QlEyOUVRenM3UlVGRlJTeFJRVUZCTzBWQlEwRXNXVUZCUVR0RFJHeEVTRHRCUTNGRVN6czdSVUZEUlN4alFVRkJPME5FYkVSUU8wRkRjVVJMT3p0RlFVTkZMR05CUVVFN1EwUnNSRkE3UVVOeFJFczdPMFZCUTBVc1kwRkJRVHREUkd4RVVEdEJRM0ZFU3pzN1JVRkRSU3hqUVVGQk8wTkViRVJRTzBGRGNVUkxPenRGUVVORkxHTkJRVUU3UTBSc1JGQTdRVU54UkVzN08wVkJRMFVzWTBGQlFUdERSR3hFVUR0QlEzVkVRenRGUVVORkxHbERRVUZCTzBORWNrUklPMEZEZVVSUE8wVkJRMFVzV1VGQlFUdERSSFpFVkR0QlF6UkVUenRGUVVORkxGbEJRVUU3UTBReFJGUTdRVU1yUkU4N1JVRkRSU3haUVVGQk8wTkVOMFJVTzBGRGEwVlBPMFZCUTBVc1dVRkJRVHREUkdoRlZEdEJRM0ZGVHp0RlFVTkZMRmxCUVVFN1EwUnVSVlE3UVVOM1JVODdSVUZEUlN4WlFVRkJPME5FZEVWVU8wRkRORVZETzBWQlEwVXNZVUZCUVR0RlFVTkJMRGhDUVVGQk8wTkVNVVZJTzBGRE9FVlBPMFZCUTBVc1pVRkJRVHREUkRWRlZEdEJRMmxHVHp0RlFVTkZMR1ZCUVVFN1EwUXZSVlE3UVVOdlJrODdSVUZEUlN4bFFVRkJPME5FYkVaVU8wRkRkVVpQTzBWQlEwVXNaVUZCUVR0RFJISkdWRHRCUXpCR1R6dEZRVU5GTEdWQlFVRTdRMFI0UmxRN1FVTTJSazg3UlVGRFJTeGxRVUZCTzBORU0wWlVPMEZEYVVkRE8wVkJRMFVzYjBKQlFVRTdSVUZEUVN3clFrRkJRVHREUkM5R1NEdEJRMmxIUnp0RlFVTkZMR2RDUVVGQk8wTkVMMFpNTzBGRGFVZExPMFZCUTBVc1UwRkJRVHREUkM5R1VEdEJRMnRIU3p0RlFVTkZMRkZCUVVFN1EwUm9SMUE3UVVOdFIwczdSVUZEUlN4UFFVRkJPME5FYWtkUU8wRkRiMGRMTzBWQlEwVXNWVUZCUVR0RFJHeEhVRHRCUTNsSFN6czdSVUZGUlN4NVFrRkJRVHRGUVVOQkxGTkJRVUU3UlVGRFFTeHZRMEZCUVR0VlFVRkJMRFJDUVVGQk8wTkVka2RRTzBGRE1FZExPenRGUVVWRkxIZENRVUZCTzBWQlEwRXNWVUZCUVR0RlFVTkJMRzlEUVVGQk8xVkJRVUVzTkVKQlFVRTdRMFI0UjFBN1FVTTJSMU03UlVGRFJTeFhRVUZCTzBORU0wZFlPMEZET0VkVE8wVkJRMFVzVlVGQlFUdERSRFZIV0R0QlF5dEhVenRGUVVORkxGTkJRVUU3UTBRM1IxZzdRVU5uU0ZNN1JVRkRSU3haUVVGQk8wTkVPVWRZTzBGRGRVaExPenRGUVVWRkxHRkJRVUU3UlVGRFFTdzJRa0ZCUVR0RFJISklVRHRCUXpCSVF6dEZRVU5GTEZkQlFVRTdRMFI0U0VnaUxDSm1hV3hsSWpvaVpISmhkMlZ5TG1OemN5SXNJbk52ZFhKalpYTkRiMjUwWlc1MElqcGJJanB5YjI5MElIdGNjbHh1SUNBdExXOTFkR3hwYm1VdGVrbHVaR1Y0T2lBeU1EQXdPMXh5WEc0Z0lDMHRiM1YwYkdsdVpTMXpkR2xqYTNrdGFHVnBaMmgwT2lBeE1EQWxPMXh5WEc0Z0lDMHRiM1YwYkdsdVpTMXVZWFpwWjJGMGIzSXRkMmxrZEdnNklERXdNQ1U3WEhKY2JuMWNjbHh1SWl3aU9uSnZiM1FnZTF4dUlDQXRMVzkxZEd4cGJtVXRla2x1WkdWNE9pQXlNREF3TzF4dUlDQXRMVzkxZEd4cGJtVXRjM1JwWTJ0NUxXaGxhV2RvZERvZ01UQXdKVHRjYmlBZ0xTMXZkWFJzYVc1bExXNWhkbWxuWVhSdmNpMTNhV1IwYURvZ01UQXdKVHRjYm4xY2JpOHFJRDA5UFQwOVBUMDlQVDBnWTI5c2IzSnpMblJvWlcxbElDMGc1Wis2NTZHQTZhS2M2SW15NVkrWTZZZVA2WnVHNVpDSUlEMDlQVDA5UFQwOVBUMGdLaTljYmk4cUtseHVJQ29nYzJoaFpHOTNMbXhsYzNNZ0xTRHBtTFRsdmJIbW9MZmx2SS9vcnI3bnZhNGdiV2w0YVc1NElPV0h2ZWFWc0Z4dUlDb2dQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBWeHVJQ29nUTNKbFlYUmxaQ0JDZVRvZ1dXRnZhR0ZwZUdsaGIxeHVJQ29nVlhCa1lYUmxPaUF5TURJeUxqTXVNakJjYmlBcUwxeHVMeW9nUFQwOVBUMDlJT21ZdE9XOXNlYWd0K1c4aitpdXZ1ZTlydVdIdmVhVnNDQTlQVDA5UFQwZ0tpOWNiaTV2ZFhSc2FXNWxMV1J5WVhkbGNpQjdYRzRnSUhCdmMybDBhVzl1T2lCeVpXeGhkR2wyWlR0Y2JpQWdlaTFwYm1SbGVEb2dMVEU3WEc0Z0lIUnZjRG9nTUR0Y2JpQWdiR1ZtZERvZ01EdGNiaUFnYldGeVoybHVPaUF3TzF4dUlDQjNhV1IwYURvZ01UQXdKVHRjYmlBZ2FHVnBaMmgwT2lBeE1EQWxPMXh1SUNCaWIzZ3RjMmw2YVc1bk9pQmliM0prWlhJdFltOTRPMXh1SUNCMmFYTnBZbWxzYVhSNU9pQm9hV1JrWlc0N1hHNGdJRzkyWlhKbWJHOTNPaUJvYVdSa1pXNDdYRzU5WEc0dWIzVjBiR2x1WlMxa2NtRjNaWEpmWDIxdlpHRnNJSHRjYmlBZ1ltOTRMWE5vWVdSdmR6b2dNQ0F3SURad2VDQXhjSGdnSTJSalpHWmxOanRjYmlBZ1pHbHpjR3hoZVRvZ1pteGxlRHRjYmlBZ1pteGxlQzFrYVhKbFkzUnBiMjQ2SUdOdmJIVnRianRjYmlBZ1pteGxlQzEzY21Gd09pQnViM2R5WVhBN1hHNGdJSEJ2YzJsMGFXOXVPaUJoWW5OdmJIVjBaVHRjYmlBZ2VpMXBibVJsZURvZ01qRTdYRzRnSUdobGFXZG9kRG9nTVRBd0pUdGNiaUFnWW1GamEyZHliM1Z1WkMxamIyeHZjam9nSTJabVpqdGNiaUFnZEhKaGJuTnBkR2x2Ymkxa2RYSmhkR2x2YmpvZ01DNDBjenRjYmlBZ2IzWmxjbVpzYjNjNklHaHBaR1JsYmp0Y2JuMWNiaTV2ZFhSc2FXNWxMV1J5WVhkbGNsOWZhR1ZoWkdWeUxGeHVMbTkxZEd4cGJtVXRaSEpoZDJWeVgxOXRZV2x1TEZ4dUxtOTFkR3hwYm1VdFpISmhkMlZ5WDE5bWIyOTBaWElnZTF4dUlDQjNhV1IwYURvZ01UQXdKVHRjYmlBZ1ltOTRMWE5wZW1sdVp6b2dZbTl5WkdWeUxXSnZlRHRjYm4xY2JpNXZkWFJzYVc1bExXUnlZWGRsY2w5ZmFHVmhaR1Z5TEZ4dUxtOTFkR3hwYm1VdFpISmhkMlZ5WDE5bWIyOTBaWElnZTF4dUlDQm1iR1Y0TFhOb2NtbHVhem9nTUR0Y2JuMWNiaTV2ZFhSc2FXNWxMV1J5WVhkbGNsOWZkR2wwYkdVc1hHNHViM1YwYkdsdVpTMWtjbUYzWlhKZlgyMWhhVzRzWEc0dWIzVjBiR2x1WlMxa2NtRjNaWEpmWDJadmIzUmxjaUI3WEc0Z0lIQmhaR1JwYm1jNklEQWdNVFp3ZUR0Y2JuMWNiaTV2ZFhSc2FXNWxMV1J5WVhkbGNsOWZhR1ZoWkdWeUxGeHVMbTkxZEd4cGJtVXRaSEpoZDJWeVgxOTBhWFJzWlNCN1hHNGdJSEJ2YzJsMGFXOXVPaUJ5Wld4aGRHbDJaVHRjYmlBZ2VpMXBibVJsZURvZ01UdGNiaUFnYldGeVoybHVPaUF3SUdGMWRHODdYRzRnSUdobGFXZG9kRG9nTlRKd2VEdGNiaUFnYkdsdVpTMW9aV2xuYUhRNklEVXljSGc3WEc0Z0lHOTJaWEptYkc5M09pQm9hV1JrWlc0N1hHNTlYRzR1YjNWMGJHbHVaUzFrY21GM1pYSmZYM1JwZEd4bElIdGNiaUFnWm05dWRDMXphWHBsT2lBeE5uQjRPMXh1SUNCbWIyNTBMWGRsYVdkb2REb2dOREF3TzF4dUlDQnRZWEpuYVc0NklEQWdNVFp3ZUR0Y2JpQWdZbTk0TFhOcGVtbHVaem9nWW05eVpHVnlMV0p2ZUR0Y2JpQWdZbTl5WkdWeUxXSnZkSFJ2YlRvZ01YQjRJSE52Ykdsa0lDTmtZMlJtWlRZN1hHNTlYRzR1YjNWMGJHbHVaUzFrY21GM1pYSmZYMk5zYjNObElIdGNiaUFnY0c5emFYUnBiMjQ2SUdGaWMyOXNkWFJsTzF4dUlDQjZMV2x1WkdWNE9pQXlPMXh1SUNCMGIzQTZJRFV3SlR0Y2JpQWdjbWxuYUhRNklERXljSGc3WEc0Z0lIZHBaSFJvT2lBeU1IQjRPMXh1SUNCb1pXbG5hSFE2SURJd2NIZzdYRzRnSUd4cGJtVXRhR1ZwWjJoME9pQXlNSEI0TzF4dUlDQmpiMnh2Y2pvZ0l6azVPVHRjYmlBZ1ptOXVkQzF6YVhwbE9pQXlNSEI0TzF4dUlDQjBaWGgwTFdGc2FXZHVPaUJqWlc1MFpYSTdYRzRnSUdOMWNuTnZjam9nY0c5cGJuUmxjanRjYmlBZ2RISmhibk5tYjNKdE9pQjBjbUZ1YzJ4aGRHVlpLQzAxTUNVcE8xeHVJQ0J2ZG1WeVpteHZkem9nYUdsa1pHVnVPMXh1ZlZ4dUxtOTFkR3hwYm1VdFpISmhkMlZ5WDE5amJHOXpaU0F1YjNWMGJHbHVaUzFwWTI5dUlIdGNiaUFnY0c5emFYUnBiMjQ2SUdGaWMyOXNkWFJsTzF4dUlDQjZMV2x1WkdWNE9pQXlPMXh1SUNCMGIzQTZJREE3WEc0Z0lHeGxablE2SURBN1hHNTlYRzR1YjNWMGJHbHVaUzFrY21GM1pYSmZYMk5zYjNObE9taHZkbVZ5SUh0Y2JpQWdZMjlzYjNJNklDTTJOalk3WEc1OVhHNHViM1YwYkdsdVpTMWtjbUYzWlhKZlgyMWhhVzRnZTF4dUlDQm1iR1Y0T2lBeE8xeHVJQ0J2ZG1WeVpteHZkem9nWVhWMGJ6dGNibjFjYmk1dmRYUnNhVzVsTFdSeVlYZGxjbDlmYldGcGJpNXZkbVZ5Wm14dmR5MW9hV1JrWlc0Z2UxeHVJQ0J2ZG1WeVpteHZkem9nYUdsa1pHVnVPMXh1ZlZ4dUxtOTFkR3hwYm1VdFpISmhkMlZ5WDE5bWIyOTBaWElnZTF4dUlDQnRZWEpuYVc0NklEQWdZWFYwYnp0Y2JpQWdkR1Y0ZEMxaGJHbG5iam9nY21sbmFIUTdYRzRnSUc5MlpYSm1iRzkzT2lCb2FXUmtaVzQ3WEc1OVhHNHViM1YwYkdsdVpTMWtjbUYzWlhKZlgyOTJaWEpzWVhrZ2UxeHVJQ0JqYjI1MFpXNTBPaUFuSnp0Y2JpQWdjRzl6YVhScGIyNDZJSEpsYkdGMGFYWmxPMXh1SUNCNkxXbHVaR1Y0T2lBeE8xeHVJQ0IwYjNBNklEQTdYRzRnSUd4bFpuUTZJREE3WEc0Z0lIZHBaSFJvT2lBeE1EQWxPMXh1SUNCb1pXbG5hSFE2SURFd01DVTdYRzRnSUdKaFkydG5jbTkxYm1RdFkyOXNiM0k2SUNObVptWTdYRzRnSUc5d1lXTnBkSGs2SURBdU1UdGNiaUFnYjNabGNtWnNiM2M2SUdocFpHUmxianRjYm4xY2JpNXZkWFJzYVc1bExXUnlZWGRsY2w5eWRHd3ViM1YwYkdsdVpTMWtjbUYzWlhKZmRHbHVlU3hjYmk1dmRYUnNhVzVsTFdSeVlYZGxjbDlzZEhJdWIzVjBiR2x1WlMxa2NtRjNaWEpmZEdsdWVTQjdYRzRnSUhkcFpIUm9PaUF5T0RCd2VEdGNibjFjYmk1dmRYUnNhVzVsTFdSeVlYZGxjbDl5ZEd3dWIzVjBiR2x1WlMxa2NtRjNaWEpmYldsdWFTeGNiaTV2ZFhSc2FXNWxMV1J5WVhkbGNsOXNkSEl1YjNWMGJHbHVaUzFrY21GM1pYSmZiV2x1YVNCN1hHNGdJSGRwWkhSb09pQTBPREJ3ZUR0Y2JuMWNiaTV2ZFhSc2FXNWxMV1J5WVhkbGNsOXlkR3d1YjNWMGJHbHVaUzFrY21GM1pYSmZjMjFoYkd3c1hHNHViM1YwYkdsdVpTMWtjbUYzWlhKZmJIUnlMbTkxZEd4cGJtVXRaSEpoZDJWeVgzTnRZV3hzSUh0Y2JpQWdkMmxrZEdnNklEVTBNSEI0TzF4dWZWeHVMbTkxZEd4cGJtVXRaSEpoZDJWeVgzSjBiQzV2ZFhSc2FXNWxMV1J5WVhkbGNsOXlaV2QxYkdGeUxGeHVMbTkxZEd4cGJtVXRaSEpoZDJWeVgyeDBjaTV2ZFhSc2FXNWxMV1J5WVhkbGNsOXlaV2QxYkdGeUlIdGNiaUFnZDJsa2RHZzZJRFk0TUhCNE8xeHVmVnh1TG05MWRHeHBibVV0WkhKaGQyVnlYM0owYkM1dmRYUnNhVzVsTFdSeVlYZGxjbDl0WldScGRXMHNYRzR1YjNWMGJHbHVaUzFrY21GM1pYSmZiSFJ5TG05MWRHeHBibVV0WkhKaGQyVnlYMjFsWkdsMWJTQjdYRzRnSUhkcFpIUm9PaUEzTWpCd2VEdGNibjFjYmk1dmRYUnNhVzVsTFdSeVlYZGxjbDl5ZEd3dWIzVjBiR2x1WlMxa2NtRjNaWEpmYkdGeVoyVXNYRzR1YjNWMGJHbHVaUzFrY21GM1pYSmZiSFJ5TG05MWRHeHBibVV0WkhKaGQyVnlYMnhoY21kbElIdGNiaUFnZDJsa2RHZzZJRGsyTUhCNE8xeHVmVnh1TG05MWRHeHBibVV0WkhKaGQyVnlYM0owYkNCN1hHNGdJR0p2Y21SbGNpMXNaV1owT2lBeGNIZ2djMjlzYVdRZ0kyUmpaR1psTmp0Y2JuMWNiaTV2ZFhSc2FXNWxMV1J5WVhkbGNsOXlkR3d1YjNWMGJHbHVaUzFrY21GM1pYSmZkR2x1ZVM1dmRYUnNhVzVsTFdSeVlYZGxjbDlqYkc5elpXUWdlMXh1SUNCeWFXZG9kRG9nTFRJNU1IQjRPMXh1ZlZ4dUxtOTFkR3hwYm1VdFpISmhkMlZ5WDNKMGJDNXZkWFJzYVc1bExXUnlZWGRsY2w5dGFXNXBMbTkxZEd4cGJtVXRaSEpoZDJWeVgyTnNiM05sWkNCN1hHNGdJSEpwWjJoME9pQXRORGt3Y0hnN1hHNTlYRzR1YjNWMGJHbHVaUzFrY21GM1pYSmZjblJzTG05MWRHeHBibVV0WkhKaGQyVnlYM050WVd4c0xtOTFkR3hwYm1VdFpISmhkMlZ5WDJOc2IzTmxaQ0I3WEc0Z0lISnBaMmgwT2lBdE5UVXdjSGc3WEc1OVhHNHViM1YwYkdsdVpTMWtjbUYzWlhKZmNuUnNMbTkxZEd4cGJtVXRaSEpoZDJWeVgzSmxaM1ZzWVhJdWIzVjBiR2x1WlMxa2NtRjNaWEpmWTJ4dmMyVmtJSHRjYmlBZ2NtbG5hSFE2SUMwMk9UQndlRHRjYm4xY2JpNXZkWFJzYVc1bExXUnlZWGRsY2w5eWRHd3ViM1YwYkdsdVpTMWtjbUYzWlhKZmJXVmthWFZ0TG05MWRHeHBibVV0WkhKaGQyVnlYMk5zYjNObFpDQjdYRzRnSUhKcFoyaDBPaUF0TnpNd2NIZzdYRzU5WEc0dWIzVjBiR2x1WlMxa2NtRjNaWEpmY25Sc0xtOTFkR3hwYm1VdFpISmhkMlZ5WDJ4aGNtZGxMbTkxZEd4cGJtVXRaSEpoZDJWeVgyTnNiM05sWkNCN1hHNGdJSEpwWjJoME9pQXRPVGN3Y0hnN1hHNTlYRzR1YjNWMGJHbHVaUzFrY21GM1pYSmZiSFJ5SUh0Y2JpQWdZbTl5WkdWeUxYSnBaMmgwT2lBeGNIZ2djMjlzYVdRZ0kyUmpaR1psTmp0Y2JuMWNiaTV2ZFhSc2FXNWxMV1J5WVhkbGNsOXNkSEl1YjNWMGJHbHVaUzFrY21GM1pYSmZkR2x1ZVM1dmRYUnNhVzVsTFdSeVlYZGxjbDlqYkc5elpXUWdlMXh1SUNCc1pXWjBPaUF0TWprd2NIZzdYRzU5WEc0dWIzVjBiR2x1WlMxa2NtRjNaWEpmYkhSeUxtOTFkR3hwYm1VdFpISmhkMlZ5WDIxcGJta3ViM1YwYkdsdVpTMWtjbUYzWlhKZlkyeHZjMlZrSUh0Y2JpQWdiR1ZtZERvZ0xUUTVNSEI0TzF4dWZWeHVMbTkxZEd4cGJtVXRaSEpoZDJWeVgyeDBjaTV2ZFhSc2FXNWxMV1J5WVhkbGNsOXpiV0ZzYkM1dmRYUnNhVzVsTFdSeVlYZGxjbDlqYkc5elpXUWdlMXh1SUNCc1pXWjBPaUF0TlRVd2NIZzdYRzU5WEc0dWIzVjBiR2x1WlMxa2NtRjNaWEpmYkhSeUxtOTFkR3hwYm1VdFpISmhkMlZ5WDNKbFozVnNZWEl1YjNWMGJHbHVaUzFrY21GM1pYSmZZMnh2YzJWa0lIdGNiaUFnYkdWbWREb2dMVFk1TUhCNE8xeHVmVnh1TG05MWRHeHBibVV0WkhKaGQyVnlYMngwY2k1dmRYUnNhVzVsTFdSeVlYZGxjbDl0WldScGRXMHViM1YwYkdsdVpTMWtjbUYzWlhKZlkyeHZjMlZrSUh0Y2JpQWdiR1ZtZERvZ0xUY3pNSEI0TzF4dWZWeHVMbTkxZEd4cGJtVXRaSEpoZDJWeVgyeDBjaTV2ZFhSc2FXNWxMV1J5WVhkbGNsOXNZWEpuWlM1dmRYUnNhVzVsTFdSeVlYZGxjbDlqYkc5elpXUWdlMXh1SUNCc1pXWjBPaUF0T1Rjd2NIZzdYRzU5WEc0dWIzVjBiR2x1WlMxa2NtRjNaWEpmZEhSaUxGeHVMbTkxZEd4cGJtVXRaSEpoZDJWeVgySjBkQ0I3WEc0Z0lHeGxablE2SURBN1hHNGdJSGRwWkhSb09pQXhNREFsTzF4dWZWeHVMbTkxZEd4cGJtVXRaSEpoZDJWeVgzUjBZaTV2ZFhSc2FXNWxMV1J5WVhkbGNsOTBhVzU1TEZ4dUxtOTFkR3hwYm1VdFpISmhkMlZ5WDJKMGRDNXZkWFJzYVc1bExXUnlZWGRsY2w5MGFXNTVJSHRjYmlBZ2FHVnBaMmgwT2lBeU5EQndlRHRjYm4xY2JpNXZkWFJzYVc1bExXUnlZWGRsY2w5MGRHSXViM1YwYkdsdVpTMWtjbUYzWlhKZmJXbHVhU3hjYmk1dmRYUnNhVzVsTFdSeVlYZGxjbDlpZEhRdWIzVjBiR2x1WlMxa2NtRjNaWEpmYldsdWFTQjdYRzRnSUdobGFXZG9kRG9nTXpJd2NIZzdYRzU5WEc0dWIzVjBiR2x1WlMxa2NtRjNaWEpmZEhSaUxtOTFkR3hwYm1VdFpISmhkMlZ5WDNOdFlXeHNMRnh1TG05MWRHeHBibVV0WkhKaGQyVnlYMkowZEM1dmRYUnNhVzVsTFdSeVlYZGxjbDl6YldGc2JDQjdYRzRnSUdobGFXZG9kRG9nTXpZd2NIZzdYRzU5WEc0dWIzVjBiR2x1WlMxa2NtRjNaWEpmZEhSaUxtOTFkR3hwYm1VdFpISmhkMlZ5WDNKbFozVnNZWElzWEc0dWIzVjBiR2x1WlMxa2NtRjNaWEpmWW5SMExtOTFkR3hwYm1VdFpISmhkMlZ5WDNKbFozVnNZWElnZTF4dUlDQm9aV2xuYUhRNklEUXdNSEI0TzF4dWZWeHVMbTkxZEd4cGJtVXRaSEpoZDJWeVgzUjBZaTV2ZFhSc2FXNWxMV1J5WVhkbGNsOXRaV1JwZFcwc1hHNHViM1YwYkdsdVpTMWtjbUYzWlhKZlluUjBMbTkxZEd4cGJtVXRaSEpoZDJWeVgyMWxaR2wxYlNCN1hHNGdJR2hsYVdkb2REb2dORFF3Y0hnN1hHNTlYRzR1YjNWMGJHbHVaUzFrY21GM1pYSmZkSFJpTG05MWRHeHBibVV0WkhKaGQyVnlYMnhoY21kbExGeHVMbTkxZEd4cGJtVXRaSEpoZDJWeVgySjBkQzV2ZFhSc2FXNWxMV1J5WVhkbGNsOXNZWEpuWlNCN1hHNGdJR2hsYVdkb2REb2dORGd3Y0hnN1hHNTlYRzR1YjNWMGJHbHVaUzFrY21GM1pYSmZkSFJpSUh0Y2JpQWdZbTl5WkdWeUxXSnZkSFJ2YlRvZ01YQjRJSE52Ykdsa0lDTmtZMlJtWlRZN1hHNTlYRzR1YjNWMGJHbHVaUzFrY21GM1pYSmZkSFJpTG05MWRHeHBibVV0WkhKaGQyVnlYM1JwYm5rdWIzVjBiR2x1WlMxa2NtRjNaWEpmWTJ4dmMyVmtJSHRjYmlBZ2RHOXdPaUF0TWpVd2NIZzdYRzU5WEc0dWIzVjBiR2x1WlMxa2NtRjNaWEpmZEhSaUxtOTFkR3hwYm1VdFpISmhkMlZ5WDIxcGJta3ViM1YwYkdsdVpTMWtjbUYzWlhKZlkyeHZjMlZrSUh0Y2JpQWdkRzl3T2lBdE16TXdjSGc3WEc1OVhHNHViM1YwYkdsdVpTMWtjbUYzWlhKZmRIUmlMbTkxZEd4cGJtVXRaSEpoZDJWeVgzTnRZV3hzTG05MWRHeHBibVV0WkhKaGQyVnlYMk5zYjNObFpDQjdYRzRnSUhSdmNEb2dMVE0zTUhCNE8xeHVmVnh1TG05MWRHeHBibVV0WkhKaGQyVnlYM1IwWWk1dmRYUnNhVzVsTFdSeVlYZGxjbDl5WldkMWJHRnlMbTkxZEd4cGJtVXRaSEpoZDJWeVgyTnNiM05sWkNCN1hHNGdJSFJ2Y0RvZ0xUUXhNSEI0TzF4dWZWeHVMbTkxZEd4cGJtVXRaSEpoZDJWeVgzUjBZaTV2ZFhSc2FXNWxMV1J5WVhkbGNsOXRaV1JwZFcwdWIzVjBiR2x1WlMxa2NtRjNaWEpmWTJ4dmMyVmtJSHRjYmlBZ2RHOXdPaUF0TkRVd2NIZzdYRzU5WEc0dWIzVjBiR2x1WlMxa2NtRjNaWEpmZEhSaUxtOTFkR3hwYm1VdFpISmhkMlZ5WDJ4aGNtZGxMbTkxZEd4cGJtVXRaSEpoZDJWeVgyTnNiM05sWkNCN1hHNGdJSFJ2Y0RvZ0xUUTVNSEI0TzF4dWZWeHVMbTkxZEd4cGJtVXRaSEpoZDJWeVgySjBkQ0I3WEc0Z0lIUnZjRG9nYVc1cGRHbGhiRHRjYmlBZ1ltOXlaR1Z5TFhSdmNEb2dNWEI0SUhOdmJHbGtJQ05rWTJSbVpUWTdYRzU5WEc0dWIzVjBiR2x1WlMxa2NtRjNaWEpmWW5SMExtOTFkR3hwYm1VdFpISmhkMlZ5WDNScGJua3ViM1YwYkdsdVpTMWtjbUYzWlhKZlkyeHZjMlZrSUh0Y2JpQWdZbTkwZEc5dE9pQXRNalV3Y0hnN1hHNTlYRzR1YjNWMGJHbHVaUzFrY21GM1pYSmZZblIwTG05MWRHeHBibVV0WkhKaGQyVnlYMjFwYm1rdWIzVjBiR2x1WlMxa2NtRjNaWEpmWTJ4dmMyVmtJSHRjYmlBZ1ltOTBkRzl0T2lBdE16TXdjSGc3WEc1OVhHNHViM1YwYkdsdVpTMWtjbUYzWlhKZlluUjBMbTkxZEd4cGJtVXRaSEpoZDJWeVgzTnRZV3hzTG05MWRHeHBibVV0WkhKaGQyVnlYMk5zYjNObFpDQjdYRzRnSUdKdmRIUnZiVG9nTFRNM01IQjRPMXh1ZlZ4dUxtOTFkR3hwYm1VdFpISmhkMlZ5WDJKMGRDNXZkWFJzYVc1bExXUnlZWGRsY2w5eVpXZDFiR0Z5TG05MWRHeHBibVV0WkhKaGQyVnlYMk5zYjNObFpDQjdYRzRnSUdKdmRIUnZiVG9nTFRReE1IQjRPMXh1ZlZ4dUxtOTFkR3hwYm1VdFpISmhkMlZ5WDJKMGRDNXZkWFJzYVc1bExXUnlZWGRsY2w5dFpXUnBkVzB1YjNWMGJHbHVaUzFrY21GM1pYSmZZMnh2YzJWa0lIdGNiaUFnWW05MGRHOXRPaUF0TkRVd2NIZzdYRzU5WEc0dWIzVjBiR2x1WlMxa2NtRjNaWEpmWW5SMExtOTFkR3hwYm1VdFpISmhkMlZ5WDJ4aGNtZGxMbTkxZEd4cGJtVXRaSEpoZDJWeVgyTnNiM05sWkNCN1hHNGdJR0p2ZEhSdmJUb2dMVFE1TUhCNE8xeHVmVnh1TG05MWRHeHBibVV0WkhKaGQyVnlYMjl3Wlc1bFpDQjdYRzRnSUhacGMybGlhV3hwZEhrNklIWnBjMmxpYkdVN1hHNGdJSG90YVc1a1pYZzZJSFpoY2lndExXOTFkR3hwYm1VdGVrbHVaR1Y0S1R0Y2JuMWNiaTV2ZFhSc2FXNWxMV1J5WVhkbGNsOXZjR1Z1WldRdWIzVjBiR2x1WlMxa2NtRjNaWElnZTF4dUlDQndiM05wZEdsdmJqb2dabWw0WldRN1hHNTlYRzR1YjNWMGJHbHVaUzFrY21GM1pYSmZiM0JsYm1Wa0xtOTFkR3hwYm1VdFpISmhkMlZ5WDNKMGJDQjdYRzRnSUhKcFoyaDBPaUF3TzF4dWZWeHVMbTkxZEd4cGJtVXRaSEpoZDJWeVgyOXdaVzVsWkM1dmRYUnNhVzVsTFdSeVlYZGxjbDlzZEhJZ2UxeHVJQ0JzWldaME9pQXdPMXh1ZlZ4dUxtOTFkR3hwYm1VdFpISmhkMlZ5WDI5d1pXNWxaQzV2ZFhSc2FXNWxMV1J5WVhkbGNsOTBkR0lnZTF4dUlDQjBiM0E2SURBN1hHNTlYRzR1YjNWMGJHbHVaUzFrY21GM1pYSmZiM0JsYm1Wa0xtOTFkR3hwYm1VdFpISmhkMlZ5WDJKMGRDQjdYRzRnSUdKdmRIUnZiVG9nTUR0Y2JuMWNiaTV2ZFhSc2FXNWxMV1J5WVhkbGNsOXZabVp6WlhRdWIzVjBiR2x1WlMxa2NtRjNaWEpmY25Sc0xGeHVMbTkxZEd4cGJtVXRaSEpoZDJWeVgyOW1abk5sZEM1dmRYUnNhVzVsTFdSeVlYZGxjbDlzZEhJZ2UxeHVJQ0JvWldsbmFIUTZJR05oYkdNb01UQXdKU0F0SURSbGJTazdYRzRnSUhSdmNEb2dOVEFsTzF4dUlDQjBjbUZ1YzJadmNtMDZJSFJ5WVc1emJHRjBaVmtvTFRVd0pTazdYRzU5WEc0dWIzVjBiR2x1WlMxa2NtRjNaWEpmYjJabWMyVjBMbTkxZEd4cGJtVXRaSEpoZDJWeVgzUjBZaXhjYmk1dmRYUnNhVzVsTFdSeVlYZGxjbDl2Wm1aelpYUXViM1YwYkdsdVpTMWtjbUYzWlhKZlluUjBJSHRjYmlBZ2QybGtkR2c2SUdOaGJHTW9NVEF3SlNBdElEUmxiU2s3WEc0Z0lHeGxablE2SURVd0pUdGNiaUFnZEhKaGJuTm1iM0p0T2lCMGNtRnVjMnhoZEdWWUtDMDFNQ1VwTzF4dWZWeHVMbTkxZEd4cGJtVXRaSEpoZDJWeVgyOW1abk5sZEM1dmRYUnNhVzVsTFdSeVlYZGxjbDl2Y0dWdVpXUXViM1YwYkdsdVpTMWtjbUYzWlhKZmNuUnNJSHRjYmlBZ2NtbG5hSFE2SURKbGJUdGNibjFjYmk1dmRYUnNhVzVsTFdSeVlYZGxjbDl2Wm1aelpYUXViM1YwYkdsdVpTMWtjbUYzWlhKZmIzQmxibVZrTG05MWRHeHBibVV0WkhKaGQyVnlYMngwY2lCN1hHNGdJR3hsWm5RNklESmxiVHRjYm4xY2JpNXZkWFJzYVc1bExXUnlZWGRsY2w5dlptWnpaWFF1YjNWMGJHbHVaUzFrY21GM1pYSmZiM0JsYm1Wa0xtOTFkR3hwYm1VdFpISmhkMlZ5WDNSMFlpQjdYRzRnSUhSdmNEb2dNbVZ0TzF4dWZWeHVMbTkxZEd4cGJtVXRaSEpoZDJWeVgyOW1abk5sZEM1dmRYUnNhVzVsTFdSeVlYZGxjbDl2Y0dWdVpXUXViM1YwYkdsdVpTMWtjbUYzWlhKZlluUjBJSHRjYmlBZ1ltOTBkRzl0T2lBeVpXMDdYRzU5WEc0dWIzVjBiR2x1WlMxa2NtRjNaWEpmWVhWMGJ5NXZkWFJzYVc1bExXUnlZWGRsY2w5eWRHd3NYRzR1YjNWMGJHbHVaUzFrY21GM1pYSmZZWFYwYnk1dmRYUnNhVzVsTFdSeVlYZGxjbDlzZEhJZ2UxeHVJQ0JvWldsbmFIUTZJR0YxZEc4N1hHNGdJRzFoZUMxb1pXbG5hSFE2SUdOaGJHTW9NVEF3SlNBdElEUmxiU2s3WEc1OVhHNHViM1YwYkdsdVpTMWtjbUYzWlhKZlpuVnNiQ0I3WEc0Z0lIQmhaR1JwYm1jNklEQTdYRzU5WEc0aUxDSkFhVzF3YjNKMElDY3VMM1poY21saFlteGxjeWM3WEhKY2JrQnBiWEJ2Y25RZ0p5NHZZMjlzYjNKekp6dGNjbHh1UUdsdGNHOXlkQ0FuTGk5emFHRmtiM2NuTzF4eVhHNWNjbHh1TG05MWRHeHBibVV0WkhKaGQyVnlJSHRjY2x4dUlDQndiM05wZEdsdmJqb2djbVZzWVhScGRtVTdYSEpjYmlBZ2VpMXBibVJsZURvZ0xURTdYSEpjYmlBZ2RHOXdPaUF3TzF4eVhHNGdJR3hsWm5RNklEQTdYSEpjYmlBZ2JXRnlaMmx1T2lBd08xeHlYRzRnSUhkcFpIUm9PaUF4TURBbE8xeHlYRzRnSUdobGFXZG9kRG9nTVRBd0pUdGNjbHh1SUNCaWIzZ3RjMmw2YVc1bk9pQmliM0prWlhJdFltOTRPMXh5WEc0Z0lIWnBjMmxpYVd4cGRIazZJR2hwWkdSbGJqdGNjbHh1SUNCdmRtVnlabXh2ZHpvZ2FHbGtaR1Z1TzF4eVhHNWNjbHh1SUNBbVgxOXRiMlJoYkNCN1hISmNiaUFnSUNBdWMyaGhaRzkzWDJ4cFoyaDBYM0psWjNWc1lYSW9LVHRjY2x4dUlDQWdJR1JwYzNCc1lYazZJR1pzWlhnN1hISmNiaUFnSUNCbWJHVjRMV1JwY21WamRHbHZiam9nWTI5c2RXMXVPMXh5WEc0Z0lDQWdabXhsZUMxM2NtRndPaUJ1YjNkeVlYQTdYSEpjYmlBZ0lDQndiM05wZEdsdmJqb2dZV0p6YjJ4MWRHVTdYSEpjYmlBZ0lDQjZMV2x1WkdWNE9pQXlNVHRjY2x4dUlDQWdJR2hsYVdkb2REb2dNVEF3SlR0Y2NseHVJQ0FnSUdKaFkydG5jbTkxYm1RdFkyOXNiM0k2SUVCM2FHbDBaVHRjY2x4dUlDQWdJSFJ5WVc1emFYUnBiMjR0WkhWeVlYUnBiMjQ2SURBdU5ITTdYSEpjYmlBZ0lDQnZkbVZ5Wm14dmR6b2dhR2xrWkdWdU8xeHlYRzRnSUgxY2NseHVYSEpjYmlBZ0psOWZhR1ZoWkdWeUxGeHlYRzRnSUNaZlgyMWhhVzRzWEhKY2JpQWdKbDlmWm05dmRHVnlJSHRjY2x4dUlDQWdJSGRwWkhSb09pQXhNREFsTzF4eVhHNGdJQ0FnWW05NExYTnBlbWx1WnpvZ1ltOXlaR1Z5TFdKdmVEdGNjbHh1SUNCOVhISmNibHh5WEc0Z0lDWmZYMmhsWVdSbGNpeGNjbHh1SUNBbVgxOW1iMjkwWlhJZ2UxeHlYRzRnSUNBZ1pteGxlQzF6YUhKcGJtczZJREE3WEhKY2JpQWdmVnh5WEc1Y2NseHVJQ0FtWDE5MGFYUnNaU3hjY2x4dUlDQW1YMTl0WVdsdUxGeHlYRzRnSUNaZlgyWnZiM1JsY2lCN1hISmNiaUFnSUNCd1lXUmthVzVuT2lBd0lERTJjSGc3WEhKY2JpQWdmVnh5WEc1Y2NseHVJQ0FtWDE5b1pXRmtaWElzWEhKY2JpQWdKbDlmZEdsMGJHVWdlMXh5WEc0Z0lDQWdjRzl6YVhScGIyNDZJSEpsYkdGMGFYWmxPMXh5WEc0Z0lDQWdlaTFwYm1SbGVEb2dNVHRjY2x4dUlDQWdJRzFoY21kcGJqb2dNQ0JoZFhSdk8xeHlYRzRnSUNBZ2FHVnBaMmgwT2lBMU1uQjRPMXh5WEc0Z0lDQWdiR2x1WlMxb1pXbG5hSFE2SURVeWNIZzdYSEpjYmlBZ0lDQnZkbVZ5Wm14dmR6b2dhR2xrWkdWdU8xeHlYRzRnSUgxY2NseHVYSEpjYmlBZ0psOWZkR2wwYkdVZ2UxeHlYRzRnSUNBZ1ptOXVkQzF6YVhwbE9pQXhObkI0TzF4eVhHNGdJQ0FnWm05dWRDMTNaV2xuYUhRNklEUXdNRHRjY2x4dUlDQWdJRzFoY21kcGJqb2dNQ0F4Tm5CNE8xeHlYRzRnSUNBZ1ltOTRMWE5wZW1sdVp6b2dZbTl5WkdWeUxXSnZlRHRjY2x4dUlDQWdJR0p2Y21SbGNpMWliM1IwYjIwNklERndlQ0J6YjJ4cFpDQkFjSEpwYldGeWVWOWliM0prWlhKZlkyOXNiM0k3WEhKY2JpQWdmVnh5WEc1Y2NseHVJQ0FtWDE5amJHOXpaU0I3WEhKY2JpQWdJQ0J3YjNOcGRHbHZiam9nWVdKemIyeDFkR1U3WEhKY2JpQWdJQ0I2TFdsdVpHVjRPaUF5TzF4eVhHNGdJQ0FnZEc5d09pQTFNQ1U3WEhKY2JpQWdJQ0J5YVdkb2REb2dNVEp3ZUR0Y2NseHVJQ0FnSUhkcFpIUm9PaUF5TUhCNE8xeHlYRzRnSUNBZ2FHVnBaMmgwT2lBeU1IQjRPMXh5WEc0Z0lDQWdiR2x1WlMxb1pXbG5hSFE2SURJd2NIZzdYSEpjYmlBZ0lDQmpiMnh2Y2pvZ1FHWnZkWEowYUY5MFpYaDBYMk52Ykc5eU8xeHlYRzRnSUNBZ1ptOXVkQzF6YVhwbE9pQXlNSEI0TzF4eVhHNGdJQ0FnZEdWNGRDMWhiR2xuYmpvZ1kyVnVkR1Z5TzF4eVhHNGdJQ0FnWTNWeWMyOXlPaUJ3YjJsdWRHVnlPMXh5WEc0Z0lDQWdkSEpoYm5ObWIzSnRPaUIwY21GdWMyeGhkR1ZaS0MwMU1DVXBPMXh5WEc0Z0lDQWdiM1psY21ac2IzYzZJR2hwWkdSbGJqdGNjbHh1WEhKY2JpQWdJQ0F1YjNWMGJHbHVaUzFwWTI5dUlIdGNjbHh1SUNBZ0lDQWdjRzl6YVhScGIyNDZJR0ZpYzI5c2RYUmxPMXh5WEc0Z0lDQWdJQ0I2TFdsdVpHVjRPaUF5TzF4eVhHNGdJQ0FnSUNCMGIzQTZJREE3WEhKY2JpQWdJQ0FnSUd4bFpuUTZJREE3WEhKY2JpQWdJQ0I5WEhKY2JseHlYRzRnSUNBZ0pqcG9iM1psY2lCN1hISmNiaUFnSUNBZ0lHTnZiRzl5T2lCQWRHaHBjbVJmZEdWNGRGOWpiMnh2Y2p0Y2NseHVJQ0FnSUgxY2NseHVJQ0I5WEhKY2JseHlYRzRnSUNaZlgyMWhhVzRnZTF4eVhHNGdJQ0FnWm14bGVEb2dNVHRjY2x4dUlDQWdJRzkyWlhKbWJHOTNPaUJoZFhSdk8xeHlYRzVjY2x4dUlDQWdJQ1l1YjNabGNtWnNiM2N0YUdsa1pHVnVJSHRjY2x4dUlDQWdJQ0FnYjNabGNtWnNiM2M2SUdocFpHUmxianRjY2x4dUlDQWdJSDFjY2x4dUlDQjlYSEpjYmx4eVhHNGdJQ1pmWDJadmIzUmxjaUI3WEhKY2JpQWdJQ0J0WVhKbmFXNDZJREFnWVhWMGJ6dGNjbHh1SUNBZ0lIUmxlSFF0WVd4cFoyNDZJSEpwWjJoME8xeHlYRzRnSUNBZ2IzWmxjbVpzYjNjNklHaHBaR1JsYmp0Y2NseHVJQ0I5WEhKY2JseHlYRzRnSUNaZlgyOTJaWEpzWVhrZ2UxeHlYRzRnSUNBZ1kyOXVkR1Z1ZERvZ0p5YzdYSEpjYmlBZ0lDQndiM05wZEdsdmJqb2djbVZzWVhScGRtVTdYSEpjYmlBZ0lDQjZMV2x1WkdWNE9pQXhPMXh5WEc0Z0lDQWdkRzl3T2lBd08xeHlYRzRnSUNBZ2JHVm1kRG9nTUR0Y2NseHVJQ0FnSUhkcFpIUm9PaUF4TURBbE8xeHlYRzRnSUNBZ2FHVnBaMmgwT2lBeE1EQWxPMXh5WEc0Z0lDQWdZbUZqYTJkeWIzVnVaQzFqYjJ4dmNqb2dRSGRvYVhSbE8xeHlYRzRnSUNBZ2IzQmhZMmwwZVRvZ01DNHhPMXh5WEc0Z0lDQWdiM1psY21ac2IzYzZJR2hwWkdSbGJqdGNjbHh1SUNCOVhISmNibHh5WEc0Z0lDWmZjblJzTEZ4eVhHNGdJQ1pmYkhSeUlIdGNjbHh1SUNBZ0lDWXViM1YwYkdsdVpTMWtjbUYzWlhJZ2UxeHlYRzRnSUNBZ0lDQW1YM1JwYm5rZ2UxeHlYRzRnSUNBZ0lDQWdJSGRwWkhSb09pQXlPREJ3ZUR0Y2NseHVJQ0FnSUNBZ2ZWeHlYRzVjY2x4dUlDQWdJQ0FnSmw5dGFXNXBJSHRjY2x4dUlDQWdJQ0FnSUNCM2FXUjBhRG9nTkRnd2NIZzdYSEpjYmlBZ0lDQWdJSDFjY2x4dVhISmNiaUFnSUNBZ0lDWmZjMjFoYkd3Z2UxeHlYRzRnSUNBZ0lDQWdJSGRwWkhSb09pQTFOREJ3ZUR0Y2NseHVJQ0FnSUNBZ2ZWeHlYRzVjY2x4dUlDQWdJQ0FnSmw5eVpXZDFiR0Z5SUh0Y2NseHVJQ0FnSUNBZ0lDQjNhV1IwYURvZ05qZ3djSGc3WEhKY2JpQWdJQ0FnSUgxY2NseHVYSEpjYmlBZ0lDQWdJQ1pmYldWa2FYVnRJSHRjY2x4dUlDQWdJQ0FnSUNCM2FXUjBhRG9nTnpJd2NIZzdYSEpjYmlBZ0lDQWdJSDFjY2x4dVhISmNiaUFnSUNBZ0lDWmZiR0Z5WjJVZ2UxeHlYRzRnSUNBZ0lDQWdJSGRwWkhSb09pQTVOakJ3ZUR0Y2NseHVJQ0FnSUNBZ2ZWeHlYRzRnSUNBZ2ZWeHlYRzRnSUgxY2NseHVYSEpjYmlBZ0psOXlkR3dnZTF4eVhHNGdJQ0FnWW05eVpHVnlMV3hsWm5RNklERndlQ0J6YjJ4cFpDQkFjSEpwYldGeWVWOWliM0prWlhKZlkyOXNiM0k3WEhKY2JseHlYRzRnSUNBZ0ppNXZkWFJzYVc1bExXUnlZWGRsY2lCN1hISmNiaUFnSUNBZ0lDWmZkR2x1ZVNCN1hISmNiaUFnSUNBZ0lDQWdKaTV2ZFhSc2FXNWxMV1J5WVhkbGNsOWpiRzl6WldRZ2UxeHlYRzRnSUNBZ0lDQWdJQ0FnY21sbmFIUTZJQzB5T1RCd2VEdGNjbHh1SUNBZ0lDQWdJQ0I5WEhKY2JpQWdJQ0FnSUgxY2NseHVYSEpjYmlBZ0lDQWdJQ1pmYldsdWFTQjdYSEpjYmlBZ0lDQWdJQ0FnSmk1dmRYUnNhVzVsTFdSeVlYZGxjbDlqYkc5elpXUWdlMXh5WEc0Z0lDQWdJQ0FnSUNBZ2NtbG5hSFE2SUMwME9UQndlRHRjY2x4dUlDQWdJQ0FnSUNCOVhISmNiaUFnSUNBZ0lIMWNjbHh1WEhKY2JpQWdJQ0FnSUNaZmMyMWhiR3dnZTF4eVhHNGdJQ0FnSUNBZ0lDWXViM1YwYkdsdVpTMWtjbUYzWlhKZlkyeHZjMlZrSUh0Y2NseHVJQ0FnSUNBZ0lDQWdJSEpwWjJoME9pQXROVFV3Y0hnN1hISmNiaUFnSUNBZ0lDQWdmVnh5WEc0Z0lDQWdJQ0I5WEhKY2JseHlYRzRnSUNBZ0lDQW1YM0psWjNWc1lYSWdlMXh5WEc0Z0lDQWdJQ0FnSUNZdWIzVjBiR2x1WlMxa2NtRjNaWEpmWTJ4dmMyVmtJSHRjY2x4dUlDQWdJQ0FnSUNBZ0lISnBaMmgwT2lBdE5qa3djSGc3WEhKY2JpQWdJQ0FnSUNBZ2ZWeHlYRzRnSUNBZ0lDQjlYSEpjYmx4eVhHNGdJQ0FnSUNBbVgyMWxaR2wxYlNCN1hISmNiaUFnSUNBZ0lDQWdKaTV2ZFhSc2FXNWxMV1J5WVhkbGNsOWpiRzl6WldRZ2UxeHlYRzRnSUNBZ0lDQWdJQ0FnY21sbmFIUTZJQzAzTXpCd2VEdGNjbHh1SUNBZ0lDQWdJQ0I5WEhKY2JpQWdJQ0FnSUgxY2NseHVYSEpjYmlBZ0lDQWdJQ1pmYkdGeVoyVWdlMXh5WEc0Z0lDQWdJQ0FnSUNZdWIzVjBiR2x1WlMxa2NtRjNaWEpmWTJ4dmMyVmtJSHRjY2x4dUlDQWdJQ0FnSUNBZ0lISnBaMmgwT2lBdE9UY3djSGc3WEhKY2JpQWdJQ0FnSUNBZ2ZWeHlYRzRnSUNBZ0lDQjlYSEpjYmlBZ0lDQjlYSEpjYmlBZ2ZWeHlYRzVjY2x4dUlDQW1YMngwY2lCN1hISmNiaUFnSUNCaWIzSmtaWEl0Y21sbmFIUTZJREZ3ZUNCemIyeHBaQ0JBY0hKcGJXRnllVjlpYjNKa1pYSmZZMjlzYjNJN1hISmNibHh5WEc0Z0lDQWdKaTV2ZFhSc2FXNWxMV1J5WVhkbGNpQjdYSEpjYmlBZ0lDQWdJQ1pmZEdsdWVTQjdYSEpjYmlBZ0lDQWdJQ0FnSmk1dmRYUnNhVzVsTFdSeVlYZGxjbDlqYkc5elpXUWdlMXh5WEc0Z0lDQWdJQ0FnSUNBZ2JHVm1kRG9nTFRJNU1IQjRPMXh5WEc0Z0lDQWdJQ0FnSUgxY2NseHVJQ0FnSUNBZ2ZWeHlYRzVjY2x4dUlDQWdJQ0FnSmw5dGFXNXBJSHRjY2x4dUlDQWdJQ0FnSUNBbUxtOTFkR3hwYm1VdFpISmhkMlZ5WDJOc2IzTmxaQ0I3WEhKY2JpQWdJQ0FnSUNBZ0lDQnNaV1owT2lBdE5Ea3djSGc3WEhKY2JpQWdJQ0FnSUNBZ2ZWeHlYRzRnSUNBZ0lDQjlYSEpjYmx4eVhHNGdJQ0FnSUNBbVgzTnRZV3hzSUh0Y2NseHVJQ0FnSUNBZ0lDQW1MbTkxZEd4cGJtVXRaSEpoZDJWeVgyTnNiM05sWkNCN1hISmNiaUFnSUNBZ0lDQWdJQ0JzWldaME9pQXROVFV3Y0hnN1hISmNiaUFnSUNBZ0lDQWdmVnh5WEc0Z0lDQWdJQ0I5WEhKY2JseHlYRzRnSUNBZ0lDQW1YM0psWjNWc1lYSWdlMXh5WEc0Z0lDQWdJQ0FnSUNZdWIzVjBiR2x1WlMxa2NtRjNaWEpmWTJ4dmMyVmtJSHRjY2x4dUlDQWdJQ0FnSUNBZ0lHeGxablE2SUMwMk9UQndlRHRjY2x4dUlDQWdJQ0FnSUNCOVhISmNiaUFnSUNBZ0lIMWNjbHh1WEhKY2JpQWdJQ0FnSUNaZmJXVmthWFZ0SUh0Y2NseHVJQ0FnSUNBZ0lDQW1MbTkxZEd4cGJtVXRaSEpoZDJWeVgyTnNiM05sWkNCN1hISmNiaUFnSUNBZ0lDQWdJQ0JzWldaME9pQXROek13Y0hnN1hISmNiaUFnSUNBZ0lDQWdmVnh5WEc0Z0lDQWdJQ0I5WEhKY2JseHlYRzRnSUNBZ0lDQW1YMnhoY21kbElIdGNjbHh1SUNBZ0lDQWdJQ0FtTG05MWRHeHBibVV0WkhKaGQyVnlYMk5zYjNObFpDQjdYSEpjYmlBZ0lDQWdJQ0FnSUNCc1pXWjBPaUF0T1Rjd2NIZzdYSEpjYmlBZ0lDQWdJQ0FnZlZ4eVhHNGdJQ0FnSUNCOVhISmNiaUFnSUNCOVhISmNiaUFnZlZ4eVhHNWNjbHh1SUNBbVgzUjBZaXhjY2x4dUlDQW1YMkowZENCN1hISmNiaUFnSUNCc1pXWjBPaUF3TzF4eVhHNGdJQ0FnZDJsa2RHZzZJREV3TUNVN1hISmNibHh5WEc0Z0lDQWdKaTV2ZFhSc2FXNWxMV1J5WVhkbGNpQjdYSEpjYmlBZ0lDQWdJQ1pmZEdsdWVTQjdYSEpjYmlBZ0lDQWdJQ0FnYUdWcFoyaDBPaUF5TkRCd2VEdGNjbHh1SUNBZ0lDQWdmVnh5WEc1Y2NseHVJQ0FnSUNBZ0psOXRhVzVwSUh0Y2NseHVJQ0FnSUNBZ0lDQm9aV2xuYUhRNklETXlNSEI0TzF4eVhHNGdJQ0FnSUNCOVhISmNibHh5WEc0Z0lDQWdJQ0FtWDNOdFlXeHNJSHRjY2x4dUlDQWdJQ0FnSUNCb1pXbG5hSFE2SURNMk1IQjRPMXh5WEc0Z0lDQWdJQ0I5WEhKY2JseHlYRzRnSUNBZ0lDQW1YM0psWjNWc1lYSWdlMXh5WEc0Z0lDQWdJQ0FnSUdobGFXZG9kRG9nTkRBd2NIZzdYSEpjYmlBZ0lDQWdJSDFjY2x4dVhISmNiaUFnSUNBZ0lDWmZiV1ZrYVhWdElIdGNjbHh1SUNBZ0lDQWdJQ0JvWldsbmFIUTZJRFEwTUhCNE8xeHlYRzRnSUNBZ0lDQjlYSEpjYmx4eVhHNGdJQ0FnSUNBbVgyeGhjbWRsSUh0Y2NseHVJQ0FnSUNBZ0lDQm9aV2xuYUhRNklEUTRNSEI0TzF4eVhHNGdJQ0FnSUNCOVhISmNiaUFnSUNCOVhISmNiaUFnZlZ4eVhHNWNjbHh1SUNBbVgzUjBZaUI3WEhKY2JpQWdJQ0JpYjNKa1pYSXRZbTkwZEc5dE9pQXhjSGdnYzI5c2FXUWdRSEJ5YVcxaGNubGZZbTl5WkdWeVgyTnZiRzl5TzF4eVhHNWNjbHh1SUNBZ0lDWXViM1YwYkdsdVpTMWtjbUYzWlhJZ2UxeHlYRzRnSUNBZ0lDQW1YM1JwYm5rZ2UxeHlYRzRnSUNBZ0lDQWdJQ1l1YjNWMGJHbHVaUzFrY21GM1pYSmZZMnh2YzJWa0lIdGNjbHh1SUNBZ0lDQWdJQ0FnSUhSdmNEb2dMVEkxTUhCNE8xeHlYRzRnSUNBZ0lDQWdJSDFjY2x4dUlDQWdJQ0FnZlZ4eVhHNWNjbHh1SUNBZ0lDQWdKbDl0YVc1cElIdGNjbHh1SUNBZ0lDQWdJQ0FtTG05MWRHeHBibVV0WkhKaGQyVnlYMk5zYjNObFpDQjdYSEpjYmlBZ0lDQWdJQ0FnSUNCMGIzQTZJQzB6TXpCd2VEdGNjbHh1SUNBZ0lDQWdJQ0I5WEhKY2JpQWdJQ0FnSUgxY2NseHVYSEpjYmlBZ0lDQWdJQ1pmYzIxaGJHd2dlMXh5WEc0Z0lDQWdJQ0FnSUNZdWIzVjBiR2x1WlMxa2NtRjNaWEpmWTJ4dmMyVmtJSHRjY2x4dUlDQWdJQ0FnSUNBZ0lIUnZjRG9nTFRNM01IQjRPMXh5WEc0Z0lDQWdJQ0FnSUgxY2NseHVJQ0FnSUNBZ2ZWeHlYRzVjY2x4dUlDQWdJQ0FnSmw5eVpXZDFiR0Z5SUh0Y2NseHVJQ0FnSUNBZ0lDQW1MbTkxZEd4cGJtVXRaSEpoZDJWeVgyTnNiM05sWkNCN1hISmNiaUFnSUNBZ0lDQWdJQ0IwYjNBNklDMDBNVEJ3ZUR0Y2NseHVJQ0FnSUNBZ0lDQjlYSEpjYmlBZ0lDQWdJSDFjY2x4dVhISmNiaUFnSUNBZ0lDWmZiV1ZrYVhWdElIdGNjbHh1SUNBZ0lDQWdJQ0FtTG05MWRHeHBibVV0WkhKaGQyVnlYMk5zYjNObFpDQjdYSEpjYmlBZ0lDQWdJQ0FnSUNCMGIzQTZJQzAwTlRCd2VEdGNjbHh1SUNBZ0lDQWdJQ0I5WEhKY2JpQWdJQ0FnSUgxY2NseHVYSEpjYmlBZ0lDQWdJQ1pmYkdGeVoyVWdlMXh5WEc0Z0lDQWdJQ0FnSUNZdWIzVjBiR2x1WlMxa2NtRjNaWEpmWTJ4dmMyVmtJSHRjY2x4dUlDQWdJQ0FnSUNBZ0lIUnZjRG9nTFRRNU1IQjRPMXh5WEc0Z0lDQWdJQ0FnSUgxY2NseHVJQ0FnSUNBZ2ZWeHlYRzRnSUNBZ2ZWeHlYRzRnSUgxY2NseHVYSEpjYmlBZ0psOWlkSFFnZTF4eVhHNGdJQ0FnZEc5d09pQnBibWwwYVdGc08xeHlYRzRnSUNBZ1ltOXlaR1Z5TFhSdmNEb2dNWEI0SUhOdmJHbGtJRUJ3Y21sdFlYSjVYMkp2Y21SbGNsOWpiMnh2Y2p0Y2NseHVYSEpjYmlBZ0lDQW1MbTkxZEd4cGJtVXRaSEpoZDJWeUlIdGNjbHh1SUNBZ0lDQWdKbDkwYVc1NUlIdGNjbHh1SUNBZ0lDQWdJQ0FtTG05MWRHeHBibVV0WkhKaGQyVnlYMk5zYjNObFpDQjdYSEpjYmlBZ0lDQWdJQ0FnSUNCaWIzUjBiMjA2SUMweU5UQndlRHRjY2x4dUlDQWdJQ0FnSUNCOVhISmNiaUFnSUNBZ0lIMWNjbHh1WEhKY2JpQWdJQ0FnSUNaZmJXbHVhU0I3WEhKY2JpQWdJQ0FnSUNBZ0ppNXZkWFJzYVc1bExXUnlZWGRsY2w5amJHOXpaV1FnZTF4eVhHNGdJQ0FnSUNBZ0lDQWdZbTkwZEc5dE9pQXRNek13Y0hnN1hISmNiaUFnSUNBZ0lDQWdmVnh5WEc0Z0lDQWdJQ0I5WEhKY2JseHlYRzRnSUNBZ0lDQW1YM050WVd4c0lIdGNjbHh1SUNBZ0lDQWdJQ0FtTG05MWRHeHBibVV0WkhKaGQyVnlYMk5zYjNObFpDQjdYSEpjYmlBZ0lDQWdJQ0FnSUNCaWIzUjBiMjA2SUMwek56QndlRHRjY2x4dUlDQWdJQ0FnSUNCOVhISmNiaUFnSUNBZ0lIMWNjbHh1WEhKY2JpQWdJQ0FnSUNaZmNtVm5kV3hoY2lCN1hISmNiaUFnSUNBZ0lDQWdKaTV2ZFhSc2FXNWxMV1J5WVhkbGNsOWpiRzl6WldRZ2UxeHlYRzRnSUNBZ0lDQWdJQ0FnWW05MGRHOXRPaUF0TkRFd2NIZzdYSEpjYmlBZ0lDQWdJQ0FnZlZ4eVhHNGdJQ0FnSUNCOVhISmNibHh5WEc0Z0lDQWdJQ0FtWDIxbFpHbDFiU0I3WEhKY2JpQWdJQ0FnSUNBZ0ppNXZkWFJzYVc1bExXUnlZWGRsY2w5amJHOXpaV1FnZTF4eVhHNGdJQ0FnSUNBZ0lDQWdZbTkwZEc5dE9pQXRORFV3Y0hnN1hISmNiaUFnSUNBZ0lDQWdmVnh5WEc0Z0lDQWdJQ0I5WEhKY2JseHlYRzRnSUNBZ0lDQW1YMnhoY21kbElIdGNjbHh1SUNBZ0lDQWdJQ0FtTG05MWRHeHBibVV0WkhKaGQyVnlYMk5zYjNObFpDQjdYSEpjYmlBZ0lDQWdJQ0FnSUNCaWIzUjBiMjA2SUMwME9UQndlRHRjY2x4dUlDQWdJQ0FnSUNCOVhISmNiaUFnSUNBZ0lIMWNjbHh1SUNBZ0lIMWNjbHh1SUNCOVhISmNibHh5WEc0Z0lDWmZiM0JsYm1Wa0lIdGNjbHh1SUNBZ0lIWnBjMmxpYVd4cGRIazZJSFpwYzJsaWJHVTdYSEpjYmlBZ0lDQjZMV2x1WkdWNE9pQjJZWElvTFMxdmRYUnNhVzVsTFhwSmJtUmxlQ2s3WEhKY2JseHlYRzRnSUNBZ0ppNXZkWFJzYVc1bExXUnlZWGRsY2lCN1hISmNiaUFnSUNBZ0lIQnZjMmwwYVc5dU9pQm1hWGhsWkR0Y2NseHVYSEpjYmlBZ0lDQWdJQ1pmY25Sc0lIdGNjbHh1SUNBZ0lDQWdJQ0J5YVdkb2REb2dNRHRjY2x4dUlDQWdJQ0FnZlZ4eVhHNWNjbHh1SUNBZ0lDQWdKbDlzZEhJZ2UxeHlYRzRnSUNBZ0lDQWdJR3hsWm5RNklEQTdYSEpjYmlBZ0lDQWdJSDFjY2x4dVhISmNiaUFnSUNBZ0lDWmZkSFJpSUh0Y2NseHVJQ0FnSUNBZ0lDQjBiM0E2SURBN1hISmNiaUFnSUNBZ0lIMWNjbHh1WEhKY2JpQWdJQ0FnSUNaZlluUjBJSHRjY2x4dUlDQWdJQ0FnSUNCaWIzUjBiMjA2SURBN1hISmNiaUFnSUNBZ0lIMWNjbHh1SUNBZ0lIMWNjbHh1SUNCOVhISmNibHh5WEc0Z0lDWmZiMlptYzJWMElIdGNjbHh1SUNBZ0lDWXViM1YwYkdsdVpTMWtjbUYzWlhJZ2UxeHlYRzRnSUNBZ0lDQW1YM0owYkN4Y2NseHVJQ0FnSUNBZ0psOXNkSElnZTF4eVhHNGdJQ0FnSUNBZ0lHaGxhV2RvZERvZ1kyRnNZeWd4TURBbElDMGdOR1Z0S1R0Y2NseHVJQ0FnSUNBZ0lDQjBiM0E2SURVd0pUdGNjbHh1SUNBZ0lDQWdJQ0IwY21GdWMyWnZjbTA2SUhSeVlXNXpiR0YwWlZrb0xUVXdKU2s3WEhKY2JpQWdJQ0FnSUgxY2NseHVYSEpjYmlBZ0lDQWdJQ1pmZEhSaUxGeHlYRzRnSUNBZ0lDQW1YMkowZENCN1hISmNiaUFnSUNBZ0lDQWdkMmxrZEdnNklHTmhiR01vTVRBd0pTQXRJRFJsYlNrN1hISmNiaUFnSUNBZ0lDQWdiR1ZtZERvZ05UQWxPMXh5WEc0Z0lDQWdJQ0FnSUhSeVlXNXpabTl5YlRvZ2RISmhibk5zWVhSbFdDZ3ROVEFsS1R0Y2NseHVJQ0FnSUNBZ2ZWeHlYRzVjY2x4dUlDQWdJQ0FnSmw5dmNHVnVaV1FnZTF4eVhHNGdJQ0FnSUNBZ0lDWXViM1YwYkdsdVpTMWtjbUYzWlhJZ2UxeHlYRzRnSUNBZ0lDQWdJQ0FnSmw5eWRHd2dlMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQnlhV2RvZERvZ01tVnRPMXh5WEc0Z0lDQWdJQ0FnSUNBZ2ZWeHlYRzVjY2x4dUlDQWdJQ0FnSUNBZ0lDWmZiSFJ5SUh0Y2NseHVJQ0FnSUNBZ0lDQWdJQ0FnYkdWbWREb2dNbVZ0TzF4eVhHNGdJQ0FnSUNBZ0lDQWdmVnh5WEc1Y2NseHVJQ0FnSUNBZ0lDQWdJQ1pmZEhSaUlIdGNjbHh1SUNBZ0lDQWdJQ0FnSUNBZ2RHOXdPaUF5WlcwN1hISmNiaUFnSUNBZ0lDQWdJQ0I5WEhKY2JseHlYRzRnSUNBZ0lDQWdJQ0FnSmw5aWRIUWdlMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQmliM1IwYjIwNklESmxiVHRjY2x4dUlDQWdJQ0FnSUNBZ0lIMWNjbHh1SUNBZ0lDQWdJQ0I5WEhKY2JpQWdJQ0FnSUgxY2NseHVJQ0FnSUgxY2NseHVJQ0I5WEhKY2JseHlYRzRnSUNaZllYVjBieUI3WEhKY2JpQWdJQ0FtTG05MWRHeHBibVV0WkhKaGQyVnlJSHRjY2x4dUlDQWdJQ0FnSmw5eWRHd3NYSEpjYmlBZ0lDQWdJQ1pmYkhSeUlIdGNjbHh1SUNBZ0lDQWdJQ0JvWldsbmFIUTZJR0YxZEc4N1hISmNiaUFnSUNBZ0lDQWdiV0Y0TFdobGFXZG9kRG9nWTJGc1l5Z3hNREFsSUMwZ05HVnRLVHRjY2x4dUlDQWdJQ0FnZlZ4eVhHNGdJQ0FnZlZ4eVhHNGdJSDFjY2x4dVhISmNiaUFnSmw5bWRXeHNJSHRjY2x4dUlDQWdJSEJoWkdScGJtYzZJREE3WEhKY2JpQWdmVnh5WEc1OVhISmNiaUlzSWk4cUtseHlYRzRnS2lCemFHRmtiM2N1YkdWemN5QXRJT21ZdE9XOXNlYWd0K1c4aitpdXZ1ZTlyaUJ0YVhocGJuZ2c1WWU5NXBXd1hISmNiaUFxSUQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDFjY2x4dUlDb2dRM0psWVhSbFpDQkNlVG9nV1dGdmFHRnBlR2xoYjF4eVhHNGdLaUJWY0dSaGRHVTZJREl3TWpJdU15NHlNRnh5WEc0Z0tpOWNjbHh1UUdsdGNHOXlkQ0FuTGk5amIyeHZjbk1uTzF4eVhHNWNjbHh1THlvZ1BUMDlQVDA5SU9tWXRPVzlzZWFndCtXOGoraXV2dWU5cnVXSHZlYVZzQ0E5UFQwOVBUMGdLaTljY2x4dUxuTm9ZV1J2ZHloQWIyWm1jMlYwT2lBd0lEQWdObkI0SURGd2VDd2dRR052Ykc5eU9pQkFjSEpwYldGeWVWOWliM0prWlhKZlkyOXNiM0lwSUh0Y2NseHVJQ0JpYjNndGMyaGhaRzkzT2lCQWIyWm1jMlYwSUVCamIyeHZjanRjY2x4dWZWeHlYRzVjY2x4dUxuTm9ZV1J2ZDE5eVpXZDFiR0Z5S0VCamIyeHZjam9nUUhCeWFXMWhjbmxmWW05eVpHVnlYMk52Ykc5eUtTQjdYSEpjYmlBZ0xuTm9ZV1J2ZHlnd0lEQWdObkI0SURGd2VDd2dRR052Ykc5eUtUdGNjbHh1ZlZ4eVhHNWNjbHh1TG5Ob1lXUnZkMTlzWVhKblpTaEFZMjlzYjNJNklFQndjbWx0WVhKNVgySnZjbVJsY2w5amIyeHZjaWtnZTF4eVhHNGdJQzV6YUdGa2IzY29NQ0F3SURFeWNIZ2dNWEI0TENCQVkyOXNiM0lwTzF4eVhHNTlYSEpjYmx4eVhHNHVjMmhoWkc5M1gyeHBaMmgwWDNKbFozVnNZWElvS1NCN1hISmNiaUFnTG5Ob1lXUnZkMTl5WldkMWJHRnlLQ2s3WEhKY2JuMWNjbHh1WEhKY2JpNXphR0ZrYjNkZmJHbG5hSFJmYkdGeVoyVW9LU0I3WEhKY2JpQWdMbk5vWVdSdmQxOXNZWEpuWlNncE8xeHlYRzU5WEhKY2JseHlYRzR1YzJoaFpHOTNYMlJoY210ZmNtVm5kV3hoY2lncElIdGNjbHh1SUNBdWMyaGhaRzkzWDNKbFozVnNZWElvUUhObFkyOXVaR0Z5ZVY5aWIzSmtaWEpmWTI5c2IzSXBPMXh5WEc1OVhISmNibHh5WEc0dWMyaGhaRzkzWDJSaGNtdGZiR0Z5WjJVb0tTQjdYSEpjYmlBZ0xuTm9ZV1J2ZDE5c1lYSm5aU2hBYzJWamIyNWtZWEo1WDJKdmNtUmxjbDlqYjJ4dmNpazdYSEpjYm4xY2NseHVJbDE5ICovXG4iXSwiZmlsZSI6ImRyYXdlci5taW4uY3NzIn0= */ diff --git a/drawer.min.js b/drawer.min.js deleted file mode 100644 index 57f7323e..00000000 --- a/drawer.min.js +++ /dev/null @@ -1,2 +0,0 @@ -!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(t="undefined"!=typeof globalThis?globalThis:t||self).Drawer=e()}(this,(function(){"use strict";const t=t=>"string"==typeof t,e=(t,e)=>{const s=Object.prototype.hasOwnProperty;return t&&s.call(t,e)},s=t=>Object.prototype.toString.apply(t),r=t=>"function"==typeof t||"[object Function]"===s(t),i=t=>("[object Object]"===s(t)||"object"==typeof t||r(t))&&null!==t,l={},o=t=>e(l,t)&&l[t].length>0,n=(t,e=!0)=>e?o(t):(t=>{let e=o(t),s=t.lastIndexOf(".");for(;!e&&-1!==s;)s=(t=t.substring(0,s)).lastIndexOf("."),e=o(t);return e})(t),a=(t,e,r=!0)=>{const i=t=>{if(!o(t))return!1;l[t].forEach((t=>{const r=["[object Int8Array]","[object Uint8Array]","[object Uint8ClampedArray]","[object Int16Array]","[object Uint16Array]","[object Int32Array]","[object Uint32Array]","[object Float32Array]","[object Float64Array]","[object BigInt64Array]","[object BigUint64Array]"].indexOf(s(e))>-1?e.toString():e;t.callback.call(t.context||t,r)}))},a=()=>{let e=t,s=t.lastIndexOf(".");for(;-1!==s;)e=e.substring(0,s),s=e.lastIndexOf("."),i(e);i(t),i("*")};if(!n(t))return!1;r?setTimeout(a,10):a()},c=(()=>{let t=0;return e=>(t+=1,e?e+"-"+t:"guid-"+t)})(),h=t=>{if(!e(l,t))return!1;delete l[t]},d=(t,e)=>{if(!n(t))return!1;e?(t=>{const e=Object.keys(l);if(!t||e.length<1)return!1;e.forEach((e=>{const s=l[e];let r;s.forEach(((e,i)=>{e.callback!==t&&e.token!==t||(r=e.topic,s.splice(-1,i))})),s.length<1&&h(r)}))})(e):h(t)};class u{constructor(t){this.attrs={},t&&this.initialize(t)}initialize(t){return this.attr(t).render().addListeners(),this}attr(s,r){const l=this.attrs;return t(s)?r&&e(l,s)?(l[s]=r,this):l[s]:i(s)?(o=l,n=s,Object.keys(n).forEach((t=>{e(n,t)&&(o[t]=n[t])})),this):0===arguments.length?l:this;var o,n}render(){return this}refresh(){return this}destroy(){return this.removeListeners(),this}reload(t){let e=this.attr();return t&&(e=this.attr(t)),this.destroy().initialize(e),this}$emit(t,e){return a(t,e),this}$on(t,e){return((t,e,s=null)=>{const i=c();let o="symbol"==typeof t?t.toString():t;r(e)&&(l[o]||(l[o]=[]),l[o].push({topic:o,callback:e,context:s,token:i}))})(t,e,this),this}$off(t,e){return d(t,e),this}addListeners(){return this}removeListeners(){return this}}const m=(t,e=300)=>!!r(t)&&setTimeout((()=>{t()}),e),p=t=>Array.isArray?Array.isArray(t):"[object Array]"===s(t),f=t=>{let e={};return null===t?null:(p(t)?e=Array.from(t):(e=Object.assign({},t),Object.keys(e).forEach((s=>e[s]=i(t[s])?f(t[s]):t[s]))),e)},y=t=>!!(i(t)&&t.nodeName&&t.tagName&&1===t.nodeType),b=t=>{return!(!i(t)||!(y(t)||(t=>!(!i(t)||"[object NodeList]"!==s(t)))(t)||(e=t,i(e)&&"[object DocumentFragment]"===s(e))||(t=>!(!i(t)||!("[object Text]"===s(t)||t.tagName&&3===t.nodeType)))(t)));var e},v=e=>!!t(e)&&e.replace(/(^\s+)|(\s+$)/g,""),g=["a","abbr","address","area","article","aside","audio","b","base","bdi","bdo","blockquote","body","br","button","canvas","caption","cite","code","col","colgroup","data","datalist","dd","del","details","dfn","dialog","div","dl","dt","em","embed","fieldset","figcaption","figure","footer","form","h1","h2","h3","h4","h5","h6","head","header","hgroup","hr","html","i","iframe","img","input","ins","kbd","label","legend","li","link","main","map","mark","math","menu","menuitem","meta","meter","nav","noscript","object","ol","optgroup","option","output","p","param","picture","pre","progress","q","rb","rp","rt","rtc","ruby","s","samp","script","search","section","select","slot","small","source","span","strong","style","sub","summary","sup","svg","table","tbody","td","template","textarea","tfoot","th","thead","time","title","tr","track","u","ul","var","video","wbr"],z=e=>{let s,r,i;return!!t(e)&&(s=v(e).slice(0,1e3),r=/\s*|]*>|]*>|]+>/i,i=new RegExp(g.map((t=>`<${t}\\b[^>]*>`)).join("|"),"i"),r.test(s)||i.test(s))},w=(t,e)=>{const s=new RegExp("(\\s|^)"+e+"(\\s|$)");let r,i;return!!y(t)&&(r=t.className,!!r&&(i=t.classList,i&&i.contains?t.classList.contains(e):!!s.exec(r)))},M=(t,e)=>{var s;let r,i;if(w(t,e))return!1;r=t.classList,null!==(s=r)&&void 0!==s&&s.add?e.indexOf(" ")>-1?e.split(" ").forEach((t=>{r.add(t)})):r.add(e):(i=t.className,i+=i.length>0?" "+e:e,t.className=i)},x=(t,e)=>{var s;let r,i=t.className;if(!i||!w(t,e))return!1;r=t.classList,null!==(s=r)&&void 0!==s&&s.remove?r.remove(e):(i=v(i.replace(e,"")),t.className=i)};function $(t,e){(null==e||e>t.length)&&(e=t.length);for(var s=0,r=Array(e);st.replace(/]*>.*?<\/script>/gi,""),A=(t,s)=>{if(!t||!i(s))return!1;Object.keys(s).forEach((r=>{const i=s[r];e(s,r)&&((t,e,s)=>{let r=t.tagName.toLowerCase();switch(e){case"style":t.style.cssText=s;break;case"value":"input"===r||"textarea"===r?t.value=s:t.setAttribute(e,s);break;case"htmlFor":t.setAttribute("for",s);break;case"className":M(t,s);break;case"innerHTML":t.innerHTML=s;break;case"innerText":t.innerText=s;break;default:t.setAttribute(e,s)}})(t,r,i)}))},j=(e,s,r)=>{const l=document.createDocumentFragment(),o=document.createElement(e),n=e=>b(e)||t(e),a=e=>{let s;if(!n(e))return!1;b(e)?s=e:t(e)&&(s=document.createTextNode(e)),l.appendChild(s)};return i(s)?A(o,s):p(s)&&s.every((t=>n(t)))?s.forEach((t=>{a(t)})):b(s)?a(s):t(s)&&a(document.createTextNode(s)),p(r)?r.forEach((t=>{a(t)})):a(r),o.appendChild(l),o},T=(t,e="")=>{const s=e.replace(/^>/i,"");return!!(e&&s&&t)&&(t.matches?t.matches(s):!!t.msMatchesSelector&&t.msMatchesSelector(s))},N=t=>t.host&&t!==document&&t.host.nodeType?t.host:t.parentNode,O=["focusout","blur","focusin","focus","load","unload","mouseenter","mouseleave"],k=(t,e,s)=>{const r=O.indexOf(e)>-1;s._delegateListener&&delete(s=s._delegateListener)._delegateListener,function(t,e,s){const r=t._listeners;let i=-1;if(r.length<1)return!1;r.forEach(((t,r)=>{const l=t.fn;e===t.type&&(i=r,l===s&&(i=r))})),i>-1&&r.splice(i,1)}(t,e,s),t.removeEventListener(e,s,r)},E=function(e,s,r=!1){const i=t(e)?document.querySelector(e):e,l=i.childNodes,o=((e,s)=>{let r=e._listeners||[];return t(s)&&s&&(r=r.filter((t=>t.type===s))),r})(i,s);o.forEach((t=>{k(i,t.type,t.fn)})),(r||!0===s||1===arguments.length)&&i&&l&&l.forEach((t=>{y(t)&&E(t,s,r)}))},B=(t,e,s)=>{if(!r(s))return E(t,e),!1;k(t,e,s)},H=(t,e,s,r,i,l,o=!1)=>{const n=O.indexOf(s)>-1,a=function(n){const c=function(t){const e=t.target;return(s=e)&&3===s.nodeType?s.parentNode:s;var s}(n),h=((t,e,s,r)=>{const i=s||document;if(!t)return null;do{if(null!=e&&(e.startsWith(">")?t.parentNode===i&&T(t,e):T(t,e))||r&&t===i)return t;if(t===i)break}while(t=N(t))})(c,e,t);let d=l||t;n.delegateTarget=h,!0===l&&(d=i),h&&(!0===o&&B(t,s,a),r.call(d,n,i))};if(!t)return!1;t._listeners||(t._listeners=[]),t._listeners.push({el:t,selector:e,type:s,fn:a,data:i,context:l,capture:n}),r._delegateListener=a,t.addEventListener(s,a,n)},S=_(L,['','','','','','','','','','','','','','','','','','','','']),I=(e,s="icon")=>t(e)?((t,e="icon")=>{const s=/id="(.*?)"/,r=/^(\w+)-/;return S.find((i=>{const l=s.exec(i)[1];return r.exec(l)[1]===e&&l===("icon"===e?`${e}-${t}`:`${e}-icon-${t}`)}))})(e,s):_(L,S),V=(e="")=>{const s=document.body;let r=document.querySelector("#outline-icons"),i=[];(e=>{if(!e)return!1;p(e)&&e.length>0?e.forEach((e=>{-1===S.indexOf(e)&&t(e)&&S.push(e)})):t(e)&&S.push(e)})(e),i=I(),r?r.innerHTML=i.join(""):(r=document.createElement("div"),r.innerHTML=``,s.insertBefore(r.firstChild,s.firstChild))},D=(e,s={})=>{const r="outline-icon",i=s.size||0,l=s.color||"",o=s.iconSet||"",n=p(i)?i[0]:i,a=p(i)?i[1]:i,c=i?`width:${n}px;height:${a}px;`:"",h=l?c+`color:${l}`:c,d=s.attrs||{},u=document.createElement("i");let m,f="",y="";return t(e)?((e=>{const s=new RegExp("^\\s*(?:<\\?xml[^>]*>\\s*)?(?:<\\!doctype svg[^>]*\\s*(?:\\[?(?:\\s*]*>\\s*)*\\]?)*[^>]*>\\s*)?]*>[^]*<\\/svg>\\s*$\\s*$","i");return t(e)&&s.test(e)})(e)?y=e:(f=o&&"icon"!==o?`xlink:href="#${o}-icon-${e}"`:`xlink:href="#icon-${e}"`,y=``),u.innerHTML=y,d.className?d.className=`${r} ${d.className}`:d.className=r,A(u,d),m=u.querySelector("svg"),A(m,{"aria-hidden":!0,xmlns:"http://www.w3.org/2000/svg",class:"outline-icon__svg",width:200,height:200,style:h}),u):null};let F=2e3;const q=t=>{var e,s;return t?F=t:F+=1,e="--outline-zIndex",s=`${F}`,document.documentElement.style.setProperty(e,s),F};class U extends u{constructor(t){super(),this._default(),this.zIndex=0,t&&this.initialize(t)}_default(){return this.attrs=f(U.DEFAULTS),this.title="",this.closed=!1,this.$el=null,this.$modal=null,this.$header=null,this.$title=null,this.$close=null,this.$main=null,this.$footer=null,this.$overlay=null,this}initialize(t){let e;return this.attr(t),this.title=this.attr("title"),e=this.attr("created"),r(e)&&e.call(this),this.render().addListeners(),this}setTitle(t){return this.attr("title",t),this.title=t,this.$title.innerHTML=t,this}isClosed(){return this.closed}render(){const t=this.attr("mounted"),e=this.attr("size"),s=this.attr("placement"),i=this.attr("hasClose"),l=this.attr("hasOverlay"),o=this.attr("hasOffset"),n=this.attr("hasPadding"),a=this.attr("autoHeight"),c=this.attr("overflow"),h=this.attr("customClass");let d,u,m,p,f,y,b,v,g="outline-drawer__main";return V(),this.zIndex=q(),p=j("h2",{className:"outline-drawer__title"},this.title),this.$title=p,i&&(f=j("div",{className:"outline-drawer__close"},((t,e={})=>D(t,e))("close",{iconSet:"outline",size:20})),this.$close=f),m=j("header",{className:"outline-drawer__header"},[p,f]),this.$header=m,"hidden"===c&&(g+=" overflow-hidden"),y=j("div",{className:g}),this.$main=y,n||M(y,"outline-drawer_full"),b=j("footer",{className:"outline-drawer__footer"}),this.$footer=b,u=j("div",{className:`outline-drawer__modal outline-drawer_${s} outline-drawer_${e} outline-drawer_closed`},[m,y,b]),this.$modal=u,o&&M(u,"outline-drawer_offset"),a&&M(u,"outline-drawer_auto"),h&&M(u,h),l&&(v=j("div",{className:"outline-drawer__overlay"}),this.$overlay=v),d=j("div",{className:"outline-drawer"},[u,v]),this.$el=d,document.body.appendChild(d),r(t)&&t.call(this),this}erase(){return this.$main.innerHTML="",this}_paint(e){let s=null;return r(e)?s=e():b(e)?s=e:z(e)&&(s=((e,s)=>{const r=document.createDocumentFragment();if(!e||!z(e)&&!t(e)&&!y(e))return null;if(z(e)){const t=j("div");let s=[];return t.innerHTML=C(e),s=_(L,t.childNodes),s.forEach((t=>{r.appendChild(t)})),r}if(!t(s))return e.innerHTML;e.innerHTML=C(s)})(e)),s&&this.$main.appendChild(s),this}_remove(){return document.body.removeChild(this.$el),this}refresh(t){return this.erase()._paint(t),this}open(){const t=this.attr("afterOpened"),e=this.$modal;return M(this.$el,"outline-drawer_opened"),x(e,"outline-drawer_closed"),M(e,"outline-drawer_opened"),m((()=>{this.closed=!1,r(t)&&t.call(this)})),this}close(){const t=this.attr("afterClosed"),e=this.$modal;return x(e,"outline-drawer_opened"),M(e,"outline-drawer_closed"),m((()=>{x(this.$el,"outline-drawer_opened"),this.closed=!0,r(t)&&t.call(this)})),this}toggle(){const t=this.attr("afterToggle"),e=this.isClosed();return e?this.open():this.close(),r(t)&&m((()=>{t.call(this,e)})),this}destroy(){const t=this.attr("afterDestroy"),e=this.attr("beforeDestroy");let s=this.zIndex;return r(e)&&e.call(this),this.removeListeners()._remove()._default(),s-=1,q(s),this.zIndex=0,r(t)&&t.call(this),this}onClose(){return this.close(),this}addListeners(){const t=this.attr("hasClose"),e=this.attr("hasOverlay"),s=this.attr("closeOnClickModal"),r=this.$el;return t&&H(r,".outline-drawer__close","click",this.onClose,this,!0),e&&s&&H(r,".outline-drawer__overlay","click",this.onClose,this,!0),this}removeListeners(){const t=this.attr("hasClose"),e=this.attr("hasOverlay"),s=this.$el;return t||e?(B(s,"click",this.onClose),this):this}}return U.DEFAULTS=f({placement:"rtl",title:"标题",size:"regular",hasClose:!0,hasOverlay:!0,hasOffset:!1,hasPadding:!0,autoHeight:!0,closeOnClickModal:!0,overflow:"auto",created:null,mounted:null,afterClosed:null,afterOpened:null,afterScroll:null,beforeDestroy:null,afterDestroy:null,afterToggle:null}),U})); -//# sourceMappingURL=drawer.min.js.map diff --git a/drawer.min.js.map b/drawer.min.js.map deleted file mode 100644 index c07f3a6a..00000000 --- a/drawer.min.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"drawer.min.js","sources":["utils/types/isString.js","utils/lang/hasOwn.js","utils/lang/toString.js","utils/types/isFunction.js","utils/types/isObject.js","utils/observer/_subscribers.js","utils/observer/_hasDirectSubscribersFor.js","utils/observer/has.js","utils/observer/_hasSubscribers.js","utils/observer/emit.js","utils/types/isTypedArray.js","utils/lang/guid.js","utils/observer/_removeSubscriber.js","utils/observer/off.js","utils/observer/_removeSubscriberByToken.js","base.js","utils/lang/extend.js","utils/observer/on.js","utils/lang/later.js","utils/types/isArray.js","utils/lang/cloneDeep.js","utils/types/isElement.js","utils/types/isDOM.js","utils/types/isHTMLCollection.js","utils/types/isFragment.js","utils/types/isTextNode.js","utils/lang/trim.js","utils/types/tags.js","utils/types/isHTML.js","utils/dom/hasClass.js","utils/dom/addClass.js","utils/dom/removeClass.js","utils/lang/stripScripts.js","utils/dom/setAttributes.js","utils/dom/setAttribute.js","utils/dom/createElement.js","utils/dom/matches.js","utils/dom/getParentOrHost.js","utils/event/enum.js","utils/event/_off.js","utils/event/_delete.js","utils/event/purgeElement.js","utils/event/getListeners.js","utils/event/off.js","utils/event/on.js","utils/event/getTarget.js","utils/dom/resolveTextNode.js","utils/dom/closest.js","utils/icons/symbols.js","utils/icons/defaults.js","utils/icons/getSymbols.js","utils/icons/getSymbol.js","utils/icons/paint.js","utils/icons/add.js","utils/icons/createElement.js","utils/types/isSVG.js","zIndex.js","utils/dom/setProperty.js","drawer.js","utils/icons/icon.js","utils/dom/html.js"],"sourcesContent":["/**\r\n * 检测数据是否为 String 类型\r\n * ========================================================================\r\n * @method isArray\r\n * @param {*} str\r\n * @returns {boolean}\r\n */\r\nconst isString = (str) => {\r\n return typeof str === 'string'\r\n}\r\n\r\nexport default isString\r\n","/**\r\n * 检测对象自身属性中是否具有指定的属性。\r\n * ========================================================================\r\n * @method hasOwn\r\n * @param {Object} obj - (必须)检测的目标对象\r\n * @param {String} prop - (必须)属性名\r\n * @returns {Boolean}\r\n */\r\nconst hasOwn = (obj, prop) => {\r\n const hasOwnProperty = Object.prototype.hasOwnProperty\r\n return obj && hasOwnProperty.call(obj, prop)\r\n}\r\n\r\nexport default hasOwn\r\n","/**\r\n * Object 对象原型上的 toString 方法\r\n * ========================================================================\r\n * @method toString\r\n * @param {*} val\r\n * @returns {string}\r\n */\r\nconst toString = (val) => {\r\n return Object.prototype.toString.apply(val)\r\n}\r\n\r\nexport default toString\r\n","import toString from '../lang/toString'\r\n\r\n/**\r\n * 检测测试数据是否为 Function 类型\r\n * ========================================================================\r\n * @method isFunction\r\n * @param {*} val - (必须)待检测的数据\r\n * @returns {boolean} 'val' 是 Function 类型返回 true,否则返回 false\r\n */\r\nconst isFunction = (val) => {\r\n return typeof val === 'function' || toString(val) === '[object Function]'\r\n}\r\n\r\nexport default isFunction\r\n","import toString from '../lang/toString'\r\nimport isFunction from './isFunction'\r\n\r\n/**\r\n * 检测数据是否为 Object 类型\r\n * ========================================================================\r\n * @method isObject\r\n * @param {*} o\r\n * @returns {boolean}\r\n */\r\nconst isObject = (o) => {\r\n return (\r\n (toString(o) === '[object Object]' ||\r\n typeof o === 'object' ||\r\n isFunction(o)) &&\r\n o !== null\r\n )\r\n}\r\n\r\nexport default isObject\r\n","/**\r\n * 存储订阅者(主题和处理器的)私有对象\r\n * ========================================================================\r\n * @type {{}}\r\n * @private\r\n */\r\nconst _subscribers = {}\r\n\r\nexport default _subscribers\r\n","import _subscribers from './_subscribers'\r\nimport hasOwn from '../lang/hasOwn'\r\n\r\n/**\r\n * 判断是否存在与给定 topic 完全匹配的订阅者信息\r\n * ========================================================================\r\n * @method _hasDirectSubscribersFor\r\n * @param {String} topic - (必须)订阅主题字符串\r\n * @returns {Boolean}\r\n */\r\nconst _hasDirectSubscribersFor = (topic) => {\r\n return hasOwn(_subscribers, topic) && _subscribers[topic].length > 0\r\n}\r\n\r\nexport default _hasDirectSubscribersFor\r\n","import _hasDirectSubscribersFor from './_hasDirectSubscribersFor'\r\nimport _hasSubscribers from './_hasSubscribers'\r\n\r\n/**\r\n * 判断是否存在包含 topic 指定的订阅者信息\r\n * ========================================================================\r\n * @method has\r\n * @param {String} topic - (必须)主题名称\r\n * @param {Boolean} [isDirect] - (可选)是否为直接的主题,默认值:true\r\n * @returns {Boolean}\r\n */\r\nconst has = (topic, isDirect = true) => {\r\n return isDirect ? _hasDirectSubscribersFor(topic) : _hasSubscribers(topic)\r\n}\r\n\r\nexport default has\r\n","import _hasDirectSubscribersFor from './_hasDirectSubscribersFor'\r\n\r\n/**\r\n * 判断是否存在包含给定 topic 相关的订阅者信息\r\n * ========================================================================\r\n * @method _hasSubscribers\r\n * @param {String} topic - (必须)订阅主题字符串\r\n * @returns {Boolean}\r\n */\r\nconst _hasSubscribers = (topic) => {\r\n let found = _hasDirectSubscribersFor(topic)\r\n let position = topic.lastIndexOf('.')\r\n\r\n while (!found && position !== -1) {\r\n topic = topic.substring(0, position)\r\n position = topic.lastIndexOf('.')\r\n found = _hasDirectSubscribersFor(topic)\r\n }\r\n\r\n return found\r\n}\r\n\r\nexport default _hasSubscribers\r\n","import isTypedArray from '../types/isTypedArray'\r\nimport _subscribers from './_subscribers'\r\nimport has from './has'\r\nimport _hasDirectSubscribersFor from './_hasDirectSubscribersFor'\r\n\r\n/**\r\n * (异步)发布订阅主题信息\r\n * ========================================================================\r\n * 主题默认是异步发布的。确保在消费者处理主题时,主题的发起者不会被阻止。\r\n * ========================================================================\r\n * @method emit\r\n * @param {String} topic - (必须)主题名称\r\n * @param {Object} [data] - (可选)数据对象\r\n * @param {Boolean} [async] - (可选) 是否异步发布\r\n */\r\nconst emit = (topic, data, async = true) => {\r\n const execute = (topic) => {\r\n if (!_hasDirectSubscribersFor(topic)) {\r\n return false\r\n }\r\n\r\n _subscribers[topic].forEach((subscriber) => {\r\n // 针对 mqtt 消息服务返回的 Uint8Array 类似的 typed arrays 格式的数据\r\n // 采用 toString() 方法转化为普通(JSON)字符串\r\n const message = isTypedArray(data) ? data.toString() : data\r\n\r\n subscriber.callback.call(subscriber.context || subscriber, message)\r\n })\r\n }\r\n const deliver = () => {\r\n let subscriber = topic\r\n let position = topic.lastIndexOf('.')\r\n\r\n while (position !== -1) {\r\n subscriber = subscriber.substring(0, position)\r\n position = subscriber.lastIndexOf('.')\r\n\r\n execute(subscriber)\r\n }\r\n\r\n // 执行 topic 对应的处理器\r\n execute(topic)\r\n // 执行特殊 topic:'*'(监听全部消息的发布)\r\n execute('*')\r\n }\r\n\r\n if (!has(topic)) {\r\n return false\r\n }\r\n\r\n if (async) {\r\n setTimeout(deliver, 10)\r\n } else {\r\n deliver()\r\n }\r\n}\r\n\r\nexport default emit\r\n","import toString from '../lang/toString'\r\n/**\r\n * 判断检测数据是否为 Typed Arrays 类型的数据\r\n * ========================================================================\r\n * @param {*} val\r\n * @returns {boolean}\r\n */\r\nconst isTypedArray = (val) => {\r\n const TYPES = [\r\n '[object Int8Array]',\r\n '[object Uint8Array]',\r\n '[object Uint8ClampedArray]',\r\n '[object Int16Array]',\r\n '[object Uint16Array]',\r\n '[object Int32Array]',\r\n '[object Uint32Array]',\r\n '[object Float32Array]',\r\n '[object Float64Array]',\r\n '[object BigInt64Array]',\r\n '[object BigUint64Array]'\r\n ]\r\n\r\n return TYPES.indexOf(toString(val)) > -1\r\n}\r\n\r\nexport default isTypedArray\r\n","/**\r\n * 生成唯一 id 字符串的函数\r\n * ========================================================================\r\n * @method guid\r\n * @param {String} [prefix] - 生成 id 的前缀字符串\r\n * @return {String} 返回一个表示唯一 id 的字符串\r\n */\r\nconst guid = (() => {\r\n let uuid = 0\r\n\r\n return (prefix) => {\r\n uuid += 1\r\n\r\n return prefix ? prefix + '-' + uuid : 'guid-' + uuid\r\n }\r\n})()\r\n\r\nexport default guid\r\n","import _subscribers from './_subscribers'\r\nimport hasOwn from '../lang/hasOwn'\r\n\r\n/**\r\n * 删除与给定 topic 相同的订阅者信息\r\n * ========================================================================\r\n * @method _removeSubscriber\r\n * @param {String} topic - (必须)订阅主题字符串\r\n * @returns {Boolean}\r\n */\r\nconst _removeSubscriber = (topic) => {\r\n if (!hasOwn(_subscribers, topic)) {\r\n return false\r\n }\r\n\r\n delete _subscribers[topic]\r\n}\r\n\r\nexport default _removeSubscriber\r\n","import has from './has'\r\nimport _removeSubscriber from './_removeSubscriber'\r\nimport _removeSubscriberByToken from './_removeSubscriberByToken'\r\n\r\n/**\r\n * 取消订阅主题\r\n * ========================================================================\r\n * @method off\r\n * @param {String} topic - (必须)订阅的主题\r\n * @param {Function|String} [token] - (可选)订阅主题的处理器函数或者唯一 Id 值\r\n */\r\nconst off = (topic, token) => {\r\n if (!has(topic)) {\r\n return false\r\n }\r\n\r\n if (token) {\r\n _removeSubscriberByToken(token)\r\n } else {\r\n _removeSubscriber(topic)\r\n }\r\n}\r\n\r\nexport default off\r\n","import _subscribers from './_subscribers'\r\nimport _removeSubscriber from './_removeSubscriber'\r\n\r\n/**\r\n * 通过订阅者 token 值删除订阅者信息\r\n * ========================================================================\r\n * @method _removeSubscriberByToken\r\n * @param {String} token - 订阅者 token 字符串\r\n * @returns {boolean}\r\n * @private\r\n */\r\nconst _removeSubscriberByToken = (token) => {\r\n const keys = Object.keys(_subscribers)\r\n let index = -1\r\n\r\n if (!token || keys.length < 1) {\r\n return false\r\n }\r\n\r\n keys.forEach((subject) => {\r\n const subscriber = _subscribers[subject]\r\n let topic\r\n\r\n subscriber.forEach((execution, j) => {\r\n if (execution.callback === token || execution.token === token) {\r\n topic = execution.topic\r\n subscriber.splice(index, j)\r\n }\r\n })\r\n\r\n /* istanbul ignore else */\r\n if (subscriber.length < 1) {\r\n _removeSubscriber(topic)\r\n }\r\n })\r\n}\r\n\r\nexport default _removeSubscriberByToken\r\n","import isString from './utils/types/isString'\r\nimport hasOwn from './utils/lang/hasOwn'\r\nimport isObject from './utils/types/isObject'\r\nimport extend from './utils/lang/extend'\r\nimport publish from './utils/observer/emit'\r\nimport subscribe from './utils/observer/on'\r\nimport unsubscribe from './utils/observer/off'\r\n\r\nclass Base {\r\n constructor(options) {\r\n this.attrs = {}\r\n\r\n if (options) {\r\n this.initialize(options)\r\n }\r\n }\r\n\r\n initialize(options) {\r\n this.attr(options).render().addListeners()\r\n return this\r\n }\r\n\r\n attr(prop, value) {\r\n const attrs = this.attrs\r\n\r\n if (isString(prop)) {\r\n // 只能扩展 attrs 中已有的属性\r\n if (value && hasOwn(attrs, prop)) {\r\n // 更新单个配置信息\r\n attrs[prop] = value\r\n return this\r\n }\r\n\r\n // 只传递 prop 参数,则返回对应的属性值\r\n return attrs[prop]\r\n } else if (isObject(prop)) {\r\n // 批量更新配置信息\r\n extend(attrs, prop)\r\n\r\n return this\r\n } else if (arguments.length === 0) {\r\n // 不传递参数,直接返回整个\r\n return attrs\r\n }\r\n\r\n return this\r\n }\r\n\r\n render() {\r\n return this\r\n }\r\n\r\n refresh() {\r\n return this\r\n }\r\n\r\n destroy() {\r\n this.removeListeners()\r\n return this\r\n }\r\n\r\n reload(options) {\r\n let attrs = this.attr()\r\n\r\n if (options) {\r\n attrs = this.attr(options)\r\n }\r\n\r\n this.destroy().initialize(attrs)\r\n\r\n return this\r\n }\r\n\r\n $emit(event, data) {\r\n publish(event, data)\r\n return this\r\n }\r\n\r\n $on(event, callback) {\r\n subscribe(event, callback, this)\r\n return this\r\n }\r\n\r\n $off(event, callback) {\r\n unsubscribe(event, callback)\r\n return this\r\n }\r\n\r\n addListeners() {\r\n return this\r\n }\r\n\r\n removeListeners() {\r\n return this\r\n }\r\n}\r\n\r\nexport default Base\r\n","import hasOwn from './hasOwn'\r\n\r\n/**\r\n * 扩展对象\r\n * ========================================================================\r\n * @method extend\r\n * @param {Object} origin\r\n * @param {Object} source\r\n */\r\nconst extend = (origin, source) => {\r\n const keys = Object.keys(source)\r\n\r\n keys.forEach((prop) => {\r\n if (hasOwn(source, prop)) {\r\n origin[prop] = source[prop]\r\n }\r\n })\r\n}\r\n\r\nexport default extend\r\n","import _subscribers from './_subscribers'\r\nimport isFunction from '../types/isFunction'\r\nimport guid from '../lang/guid'\r\n\r\n/**\r\n * 订阅主题,并给出处理器函数\r\n * ========================================================================\r\n * @method on\r\n * @param {String} topic - (必须)主题名称\r\n * @param {Function} handler - (必须)主题的处理器函数\r\n * @param {Object} [context] - (可选)指定 this 执行上下文\r\n * @return {String} - 唯一的 token 字符串,例如:'guid-1'。\r\n */\r\nconst on = (topic, handler, context = null) => {\r\n const token = guid()\r\n let subject = typeof topic === 'symbol' ? topic.toString() : topic\r\n\r\n if (!isFunction(handler)) {\r\n return ''\r\n }\r\n\r\n /* istanbul ignore else */\r\n if (!_subscribers[subject]) {\r\n _subscribers[subject] = []\r\n }\r\n\r\n _subscribers[subject].push({\r\n topic: subject,\r\n callback: handler,\r\n context,\r\n token\r\n })\r\n\r\n return token\r\n}\r\n\r\nexport default on\r\n","import isFunction from '../types/isFunction'\r\n\r\n/**\r\n * later - 延迟执行方法\r\n * ========================================================================\r\n * @method later\r\n * @param {Function} fn\r\n * @param {Number} [delay]\r\n * @returns {number|boolean}\r\n */\r\nconst later = (fn, delay = 300) => {\r\n if (!isFunction(fn)) {\r\n return false\r\n }\r\n\r\n return setTimeout(() => {\r\n fn()\r\n }, delay)\r\n}\r\n\r\nexport default later\r\n","import toString from '../lang/toString'\r\n\r\n/**\r\n * 检测数据是否为 Array 类型\r\n * ========================================================================\r\n * @method isArray\r\n * @param {*} o\r\n * @returns {boolean}\r\n */\r\nconst isArray = (o) => {\r\n if (Array.isArray) {\r\n return Array.isArray(o)\r\n } else {\r\n return toString(o) === '[object Array]'\r\n }\r\n}\r\n\r\nexport default isArray\r\n","import isObject from '../types/isObject'\r\nimport isArray from '../types/isArray'\r\n\r\n/**\r\n * 深拷贝对象函数\r\n * ========================================================================\r\n * @methods cloneDeep\r\n * @param {Object} obj - 深拷贝的对象\r\n * @returns {Array|Object|*}\r\n *\r\n * @example\r\n * const arr = cloneDeep([2,3,4,6])\r\n * => [2,3,4,6]\r\n */\r\nconst cloneDeep = (obj) => {\r\n let clone = {}\r\n\r\n if (obj === null) {\r\n return null\r\n }\r\n\r\n if (isArray(obj)) {\r\n clone = Array.from(obj)\r\n } else {\r\n clone = Object.assign({}, obj)\r\n Object.keys(clone).forEach((key) => {\r\n return (clone[key] = isObject(obj[key]) ? cloneDeep(obj[key]) : obj[key])\r\n })\r\n }\r\n\r\n return clone\r\n}\r\n\r\nexport default cloneDeep\r\n","import isObject from './isObject'\r\n\r\n/**\r\n * 检测数据是否为 HTMLElement DOM 节点\r\n * ========================================================================\r\n * @method isElement\r\n * @param {*} o\r\n * @returns {boolean}\r\n */\r\nconst isElement = (o) => {\r\n return !!(isObject(o) && o.nodeName && o.tagName && o.nodeType === 1)\r\n}\r\n\r\nexport default isElement\r\n","import isObject from './isObject'\r\nimport isElement from './isElement'\r\nimport isHTMLCollection from './isHTMLCollection'\r\nimport isFragment from './isFragment'\r\nimport isTextNode from './isTextNode'\r\n\r\nconst isDOM = (el) => {\r\n return !!(\r\n isObject(el) &&\r\n (isElement(el) || isHTMLCollection(el) || isFragment(el) || isTextNode(el))\r\n )\r\n}\r\n\r\nexport default isDOM\r\n","import toString from '../lang/toString'\r\nimport isObject from './isObject'\r\n\r\nconst isHTMLCollection = (el) => {\r\n return !!(isObject(el) && toString(el) === '[object NodeList]')\r\n}\r\n\r\nexport default isHTMLCollection\r\n","import toString from '../lang/toString'\r\nimport isObject from './isObject'\r\n\r\nconst isFragment = (fragment) => {\r\n return !!(\r\n isObject(fragment) && toString(fragment) === '[object DocumentFragment]'\r\n )\r\n}\r\n\r\nexport default isFragment\r\n","import toString from '../lang/toString'\r\nimport isObject from './isObject'\r\n\r\nconst isTextNode = (el) => {\r\n return !!(\r\n isObject(el) &&\r\n (toString(el) === '[object Text]' || (el.tagName && el.nodeType === 3))\r\n )\r\n}\r\n\r\nexport default isTextNode\r\n","import isString from '../types/isString'\r\n\r\n/**\r\n * 清楚字符串起始位置所有的空格\r\n * ========================================================================\r\n * @method trim\r\n * @param {string} str\r\n * @returns {string|Boolean}\r\n */\r\nconst trim = (str) => {\r\n if (!isString(str)) {\r\n return false\r\n }\r\n return str.replace(/(^\\s+)|(\\s+$)/g, '')\r\n}\r\n\r\nexport default trim\r\n","// HTML 合法的标签\r\nconst TAGS = [\r\n 'a',\r\n 'abbr',\r\n 'address',\r\n 'area',\r\n 'article',\r\n 'aside',\r\n 'audio',\r\n 'b',\r\n 'base',\r\n 'bdi',\r\n 'bdo',\r\n 'blockquote',\r\n 'body',\r\n 'br',\r\n 'button',\r\n 'canvas',\r\n 'caption',\r\n 'cite',\r\n 'code',\r\n 'col',\r\n 'colgroup',\r\n 'data',\r\n 'datalist',\r\n 'dd',\r\n 'del',\r\n 'details',\r\n 'dfn',\r\n 'dialog',\r\n 'div',\r\n 'dl',\r\n 'dt',\r\n 'em',\r\n 'embed',\r\n 'fieldset',\r\n 'figcaption',\r\n 'figure',\r\n 'footer',\r\n 'form',\r\n 'h1',\r\n 'h2',\r\n 'h3',\r\n 'h4',\r\n 'h5',\r\n 'h6',\r\n 'head',\r\n 'header',\r\n 'hgroup',\r\n 'hr',\r\n 'html',\r\n 'i',\r\n 'iframe',\r\n 'img',\r\n 'input',\r\n 'ins',\r\n 'kbd',\r\n 'label',\r\n 'legend',\r\n 'li',\r\n 'link',\r\n 'main',\r\n 'map',\r\n 'mark',\r\n 'math',\r\n 'menu',\r\n 'menuitem',\r\n 'meta',\r\n 'meter',\r\n 'nav',\r\n 'noscript',\r\n 'object',\r\n 'ol',\r\n 'optgroup',\r\n 'option',\r\n 'output',\r\n 'p',\r\n 'param',\r\n 'picture',\r\n 'pre',\r\n 'progress',\r\n 'q',\r\n 'rb',\r\n 'rp',\r\n 'rt',\r\n 'rtc',\r\n 'ruby',\r\n 's',\r\n 'samp',\r\n 'script',\r\n 'search',\r\n 'section',\r\n 'select',\r\n 'slot',\r\n 'small',\r\n 'source',\r\n 'span',\r\n 'strong',\r\n 'style',\r\n 'sub',\r\n 'summary',\r\n 'sup',\r\n 'svg',\r\n 'table',\r\n 'tbody',\r\n 'td',\r\n 'template',\r\n 'textarea',\r\n 'tfoot',\r\n 'th',\r\n 'thead',\r\n 'time',\r\n 'title',\r\n 'tr',\r\n 'track',\r\n 'u',\r\n 'ul',\r\n 'var',\r\n 'video',\r\n 'wbr'\r\n]\r\n\r\nexport default TAGS\r\n","import isString from './isString'\r\nimport trim from '../lang/trim'\r\nimport TAGS from './tags'\r\n\r\n/**\r\n * 检测测试数据是否为合法的 HTML 代码\r\n * ========================================================================\r\n * @method isHTML\r\n * @category Lang\r\n * @see https://github.com/sindresorhus/html-tags\r\n * @see https://github.com/sindresorhus/is-html\r\n * @param {String} str - 要检测的数据\r\n * @returns {Boolean} 'val' 为合法的 HTML 代码,返回 true,否则返回 false\r\n */\r\nconst isHTML = (str) => {\r\n let html\r\n let basic\r\n let full\r\n\r\n if (!isString(str)) {\r\n return false\r\n }\r\n\r\n // 为了提高性能,我们将其限制在合理的长度内。\r\n html = trim(str).slice(0, 1000)\r\n basic = /\\s*|]*>|]*>|]+>/i\r\n full = new RegExp(TAGS.map((tag) => `<${tag}\\\\b[^>]*>`).join('|'), 'i')\r\n\r\n return basic.test(html) || full.test(html)\r\n}\r\n\r\nexport default isHTML\r\n","import isElement from '../types/isElement'\r\n/**\r\n * 检测 DOM 节点是否包含名为 className 的样式\r\n * ========================================================================\r\n * @method hasClass\r\n * @param {HTMLElement} el - DOM 节点\r\n * @param {String} className - 样式名称\r\n * @returns {Boolean}\r\n */\r\nconst hasClass = (el, className) => {\r\n const pattern = new RegExp('(\\\\s|^)' + className + '(\\\\s|$)')\r\n let allClass\r\n let classList\r\n\r\n if (!isElement(el)) {\r\n return false\r\n }\r\n\r\n allClass = el.className\r\n\r\n if (!allClass) {\r\n return false\r\n }\r\n\r\n classList = el.classList\r\n\r\n if (classList && classList.contains) {\r\n return el.classList.contains(className)\r\n }\r\n\r\n return !!pattern.exec(allClass)\r\n}\r\n\r\nexport default hasClass\r\n","import hasClass from './hasClass'\r\n\r\n/**\r\n * 给 DOM 节点添加名为 className 的样式\r\n * ========================================================================\r\n * @method addClass\r\n * @param {HTMLElement} el - DOM 节点\r\n * @param {String} className - 样式名称\r\n * @returns {Boolean}\r\n */\r\nconst addClass = (el, className) => {\r\n let classList\r\n let allClass\r\n\r\n if (hasClass(el, className)) {\r\n return false\r\n }\r\n\r\n classList = el.classList\r\n\r\n if (classList?.add) {\r\n if (className.indexOf(' ') > -1) {\r\n className.split(' ').forEach((name) => {\r\n classList.add(name)\r\n })\r\n } else {\r\n classList.add(className)\r\n }\r\n } else {\r\n allClass = el.className\r\n allClass += allClass.length > 0 ? ' ' + className : className\r\n el.className = allClass\r\n }\r\n}\r\n\r\nexport default addClass\r\n","import trim from '../lang/trim'\r\nimport hasClass from './hasClass'\r\n\r\n/**\r\n * 移除 DOM 节点的 className 样式\r\n * ========================================================================\r\n * @method removeClass\r\n * @param {HTMLElement} el - DOM 节点\r\n * @param {String} className - 样式名称\r\n * @returns {Boolean}\r\n */\r\nconst removeClass = (el, className) => {\r\n let allClass = el.className\r\n let classList\r\n\r\n if (!allClass || !hasClass(el, className)) {\r\n return false\r\n }\r\n\r\n classList = el.classList\r\n\r\n if (classList?.remove) {\r\n classList.remove(className)\r\n } else {\r\n allClass = trim(allClass.replace(className, ''))\r\n el.className = allClass\r\n }\r\n}\r\n\r\nexport default removeClass\r\n","/**\r\n * 移除字符串中的 JavaScript 代码\r\n * ====================================================\r\n * @param {String} str\r\n * @returns {String}\r\n */\r\nconst stripScripts = (str) => {\r\n return str.replace(/]*>.*?<\\/script>/gi, '')\r\n}\r\n\r\nexport default stripScripts\r\n","import isObject from '../types/isObject'\r\nimport hasOwn from '../lang/hasOwn'\r\nimport setAttribute from './setAttribute'\r\n\r\nconst setAttributes = (el, attrs) => {\r\n if (!el || !isObject(attrs)) {\r\n return false\r\n }\r\n\r\n Object.keys(attrs).forEach((attr) => {\r\n const value = attrs[attr]\r\n if (hasOwn(attrs, attr)) {\r\n setAttribute(el, attr, value)\r\n }\r\n })\r\n}\r\n\r\nexport default setAttributes\r\n","import addClass from './addClass.js'\r\n\r\n/**\r\n * 给 DOM 节点设置属性/值\r\n * ========================================================================\r\n * @method setAttribute\r\n * @param {HTMLElement} el - DOM 节点\r\n * @param {String} attr - 属性名称\r\n * @param {String|Number|Boolean} value - 属性值\r\n */\r\nconst setAttribute = (el, attr, value) => {\r\n let tagName = el.tagName.toLowerCase()\r\n\r\n switch (attr) {\r\n case 'style':\r\n el.style.cssText = value\r\n break\r\n case 'value':\r\n if (tagName === 'input' || tagName === 'textarea') {\r\n el.value = value\r\n } else {\r\n el.setAttribute(attr, value)\r\n }\r\n break\r\n case 'htmlFor':\r\n el.setAttribute('for', value)\r\n break\r\n case 'className':\r\n addClass(el, value)\r\n break\r\n case 'innerHTML':\r\n el.innerHTML = value\r\n break\r\n case 'innerText':\r\n el.innerText = value\r\n break\r\n default:\r\n el.setAttribute(attr, value)\r\n break\r\n }\r\n}\r\n\r\nexport default setAttribute\r\n","import isObject from '../types/isObject'\r\nimport isString from '../types/isString'\r\nimport isArray from '../types/isArray'\r\nimport isDOM from '../types/isDOM'\r\nimport setAttributes from './setAttributes'\r\n\r\n/**\r\n * 创建 DOM 节点,并添加属性和子节点\r\n * ========================================================================\r\n * @method createElement\r\n * @param {String} tagName - 标签名称\r\n * @param {Object|Array|HTMLElement|DocumentFragment|String} attrs - 属性对象或者子节点\r\n * @param {Array|HTMLElement|DocumentFragment|String} [children] - 子节点数组\r\n * @returns {HTMLElement}\r\n */\r\nconst createElement = (tagName, attrs, children) => {\r\n const $fragment = document.createDocumentFragment()\r\n const $el = document.createElement(tagName)\r\n const isValidChild = (child) => {\r\n return isDOM(child) || isString(child)\r\n }\r\n const append = (child) => {\r\n let $child\r\n\r\n if (!isValidChild(child)) {\r\n return false\r\n }\r\n\r\n if (isDOM(child)) {\r\n $child = child\r\n } else if (isString(child)) {\r\n $child = document.createTextNode(child)\r\n }\r\n\r\n $fragment.appendChild($child)\r\n }\r\n\r\n if (isObject(attrs)) {\r\n setAttributes($el, attrs)\r\n } else if (isArray(attrs) && attrs.every((attr) => isValidChild(attr))) {\r\n attrs.forEach((child) => {\r\n append(child)\r\n })\r\n } else if (isDOM(attrs)) {\r\n append(attrs)\r\n } else if (isString(attrs)) {\r\n append(document.createTextNode(attrs))\r\n }\r\n\r\n if (isArray(children)) {\r\n children.forEach((child) => {\r\n append(child)\r\n })\r\n } else {\r\n append(children)\r\n }\r\n\r\n $el.appendChild($fragment)\r\n\r\n return $el\r\n}\r\n\r\nexport default createElement\r\n","/**\r\n * 获取 options 节点下匹配 selector 选择器的 DOM 节点\r\n * ========================================================================\r\n * Element.matches() 方法可以用来判断 DOM 元素是否与给定的选择器匹配,事件代理判断是\r\n * 否触发绑定的代理事件回调函数,关键就是使用 Element.matches() 辨别当前事件触发的目\r\n * 标 DOM 元素是否为事件代理所期望触发的目标。\r\n * ========================================================================\r\n * @method matches\r\n * @see https://developer.mozilla.org/en-US/docs/web/api/element/matches\r\n * @param {HTMLElement} el - (必须)DOM 元素\r\n * @param {String} selector - (必须)匹配 DOM 元素的选择器\r\n * @returns {Boolean}\r\n */\r\nconst matches = (el, selector = '') => {\r\n const sel = selector.replace(/^>/i, '')\r\n\r\n if (!selector || !sel || !el) {\r\n return false\r\n }\r\n\r\n /* istanbul ignore else */\r\n if (el.matches) {\r\n return el.matches(sel)\r\n } else if (el.msMatchesSelector) {\r\n return el.msMatchesSelector(sel)\r\n } else {\r\n return false\r\n }\r\n}\r\n\r\nexport default matches\r\n","/**\r\n * 获取 DOM 元素的父节点\r\n * ========================================================================\r\n * @method getParentOrHost\r\n * @param {*|HTMLElement} el - (必须)要获取父节点的 DOM 元素\r\n * @returns {*|HTMLElement}\r\n */\r\nconst getParentOrHost = (el) => {\r\n return el.host && el !== document && el.host.nodeType\r\n ? el.host\r\n : el.parentNode\r\n}\r\n\r\nexport default getParentOrHost\r\n","export const CAPTURE_EVENTS = [\r\n 'focusout',\r\n 'blur',\r\n 'focusin',\r\n 'focus',\r\n 'load',\r\n 'unload',\r\n 'mouseenter',\r\n 'mouseleave'\r\n]\r\n","import { CAPTURE_EVENTS } from './enum'\r\nimport _delete from './_delete'\r\n\r\n/**\r\n * (私有方法)取消 type 类型的代理事件绑定\r\n * ========================================================================\r\n * 如果没有设置 handler,则销毁 this.$options 绑定的所有符合 type 事件类型的事件绑定\r\n * ========================================================================\r\n * @method _off\r\n * @param {HTMLElement} el - (必须)取消事件绑定的 DOM 元素\r\n * @param {String} type - (必须)事件类型\r\n * @param {Function} fn - (必须)事件处理器回调函数\r\n * @private\r\n */\r\nconst _off = (el, type, fn) => {\r\n const capture = CAPTURE_EVENTS.indexOf(type) > -1\r\n\r\n /* istanbul ignore else */\r\n if (fn._delegateListener) {\r\n fn = fn._delegateListener\r\n delete fn._delegateListener\r\n }\r\n\r\n // 移除缓存的 _listeners 数据\r\n _delete(el, type, fn)\r\n\r\n el.removeEventListener(type, fn, capture)\r\n}\r\n\r\nexport default _off\r\n","/**\r\n * 删除 DOM 元素缓存的 _listeners 数据\r\n * ========================================================================\r\n * @method _delete\r\n * @param {HTMLElement} el - 要删除 listener 的 DOM 元素\r\n * @param {String} type - 事件类型(名称)\r\n * @param {Function} [fn] - 事件处理器回调函数\r\n */\r\nconst _delete = function (el, type, fn) {\r\n const listeners = el._listeners\r\n let index = -1\r\n\r\n if (listeners.length < 1) {\r\n return false\r\n }\r\n\r\n // 移除缓存的 _listeners 数据\r\n listeners.forEach((listener, i) => {\r\n const handler = listener.fn\r\n\r\n if (type === listener.type) {\r\n index = i\r\n\r\n if (handler === fn) {\r\n index = i\r\n }\r\n }\r\n })\r\n\r\n /* istanbul ignore else */\r\n if (index > -1) {\r\n listeners.splice(index, 1)\r\n }\r\n}\r\n\r\nexport default _delete\r\n","import isString from '../types/isString'\r\nimport isElement from '../types/isElement'\r\nimport getListeners from './getListeners'\r\nimport _off from './_off'\r\n\r\n/**\r\n * 销毁(type 类型的)代理事件绑定\r\n * ========================================================================\r\n * 1. 设置了事件类型 type,则销毁指定类型的事件绑定,否则清除所有代理事件绑定\r\n * 2. recurse 设置为 true,递归销毁子节点全部事件绑定\r\n * ========================================================================\r\n * @method purgeElement\r\n * @param {HTMLElement|String} el - (必须)DOM 元素或者其选择器\r\n * @param {String|Boolean} type - (必须)事件类型\r\n * @param {Boolean} [recurse] - (可选)是否递归销毁子节点所有事件绑定\r\n */\r\nconst purgeElement = function (el, type, recurse = false) {\r\n const $element = isString(el) ? document.querySelector(el) : el\r\n const $children = $element.childNodes\r\n const listeners = getListeners($element, type)\r\n\r\n listeners.forEach((listener) => {\r\n _off($element, listener.type, listener.fn)\r\n })\r\n\r\n if (\r\n (recurse || type === true || arguments.length === 1) &&\r\n $element &&\r\n $children\r\n ) {\r\n $children.forEach(($child) => {\r\n if (isElement($child)) {\r\n purgeElement($child, type, recurse)\r\n }\r\n })\r\n }\r\n}\r\n\r\nexport default purgeElement\r\n","import isString from '../types/isString'\r\n\r\n/**\r\n * 获取 DOM 元素(type 事件类型)事件绑定信息\r\n * ========================================================================\r\n * 如果设置了事件类型 type, 则返回指定类型的事件绑定信息,否则返回所有事件绑定信息\r\n * ========================================================================\r\n * @methods getListeners\r\n * @param {HTMLElement} el - (必须)要获取事件绑定信息的 DOM 元素\r\n * @param {String} [type] - (可选)事件类型\r\n * @returns {Array} - 已绑定的事件信息\r\n */\r\nconst getListeners = (el, type) => {\r\n let listeners = el._listeners || []\r\n\r\n if (isString(type) && type) {\r\n listeners = listeners.filter((listener) => {\r\n return listener.type === type\r\n })\r\n }\r\n\r\n return listeners\r\n}\r\n\r\nexport default getListeners\r\n","import purgeElement from './purgeElement'\r\nimport isFunction from '../types/isFunction'\r\nimport _off from './_off'\r\n\r\n/**\r\n * 取消 type 类型的代理事件绑定\r\n * ========================================================================\r\n * 如果没有设置 handler,则销毁 this.$options 绑定的所有符合 type 事件类型的事件绑定\r\n * ========================================================================\r\n * @method off\r\n * @param {HTMLElement|Object} el - (必须)取消事件绑定的 DOM 元素\r\n * @param {String} type - (必须)事件类型\r\n * @param {Function} [fn] - (可选)事件处理器回调函数\r\n */\r\nconst off = (el, type, fn) => {\r\n // 如果不设置 fn 参数,默认清除 el 元素上绑定的所有事件处理器\r\n if (!isFunction(fn)) {\r\n purgeElement(el, type)\r\n return false\r\n }\r\n\r\n _off(el, type, fn)\r\n}\r\n\r\nexport default off\r\n","import closest from '../dom/closest'\r\nimport off from './off'\r\nimport getTarget from './getTarget'\r\n\r\nimport { CAPTURE_EVENTS } from './enum'\r\n\r\n/**\r\n * 绑定代理事件\r\n * ========================================================================\r\n * @method on\r\n * @param {HTMLElement|String|Object} el - (必须)绑定代理事件的 DOM 节点\r\n * @param {String} selector - (必须)事件代理目标 DOM 元素的选择器\r\n * @param {String|Function} type - (必须)事件类型或者事件处理器回调函数\r\n * @param {Function|Object} fn - (可选) 事件处理器回调函数或者传递给事件处理器回调函数的数据对象\r\n * @param {Object|Boolean} [data] - (可选)传递给事件处理器回调函数的数据对象或者事件处理器回调函数的 this 上下文指向,\r\n * @param {Object|Boolean} [context] - (可选)事件处理器回调函数的 this 上下文指向,或者是否仅触发一次\r\n * 当设置为 true 时,则事件处理器回调函数的 this 上下文指向为 data 对象\r\n * @param {Boolean} once - (可选)是否仅触发一次\r\n */\r\nconst on = (el, selector, type, fn, data, context, once = false) => {\r\n // CAPTURE_EVENTS 中的特殊事件,采用事件捕获模型\r\n const capture = CAPTURE_EVENTS.indexOf(type) > -1\r\n\r\n const listener = function (evt) {\r\n const target = getTarget(evt)\r\n // 通过 Element.matches 方法获得点击的目标元素\r\n const delegateTarget = closest(target, selector, el)\r\n let overrideContext = context || el\r\n\r\n evt.delegateTarget = delegateTarget\r\n\r\n // 当设置为 true 时,则事件处理器回调函数的\r\n // this 上下文指向为 data 对象\r\n if (context === true) {\r\n overrideContext = data\r\n }\r\n\r\n /* istanbul ignore else */\r\n if (delegateTarget) {\r\n // 仅触发一次\r\n /* istanbul ignore else */\r\n if (once === true) {\r\n off(el, type, listener)\r\n }\r\n\r\n fn.call(overrideContext, evt, data)\r\n }\r\n }\r\n\r\n if (!el) {\r\n return false\r\n }\r\n\r\n if (!el._listeners) {\r\n el._listeners = []\r\n }\r\n\r\n // 缓存 options 元素绑定的事件处理器\r\n el._listeners.push({\r\n el,\r\n selector,\r\n type,\r\n fn: listener,\r\n data,\r\n context,\r\n capture\r\n })\r\n\r\n // 缓存包装后的事件处理器\r\n fn._delegateListener = listener\r\n\r\n el.addEventListener(type, listener, capture)\r\n}\r\n\r\nexport default on\r\n","import resolveTextNode from '../dom/resolveTextNode'\r\n\r\n/**\r\n * 返回触发事件的 target DOM 元素\r\n * ========================================================================\r\n * @method getTarget\r\n * @param {Event} evt - Event 对象\r\n * @return {HTMLElement} - Event 对象的 target DOM 元素\r\n */\r\nconst getTarget = function (evt) {\r\n const target = evt.target\r\n\r\n return resolveTextNode(target)\r\n}\r\n\r\nexport default getTarget\r\n","/**\r\n * 在某些情况下,某些浏览器(例如:Safari 浏览器)会返回实际的目标元素内部的文本节点。\r\n * resolveTextNode() 方法则会返回实际的目标节点。\r\n * ========================================================================\r\n * @method resolveTextNode\r\n * @param {HTMLElement|Text} el - 要解析的节点\r\n * @return {*|HTMLElement} - 实际的目标 DOM 节点\r\n */\r\nconst resolveTextNode = function (el) {\r\n if (el && el.nodeType === 3) {\r\n return el.parentNode\r\n }\r\n\r\n return el\r\n}\r\n\r\nexport default resolveTextNode\r\n","import matches from './matches'\r\nimport getParentOrHost from './getParentOrHost'\r\n\r\n/**\r\n * 获取 options 元素父元素最近的包含 selector 选择器的元素\r\n * ========================================================================\r\n * @method closest\r\n * @param {HTMLElement} el - (必须)DOM 元素\r\n * @param {String} selector - (必须)DOM 元素的选择其\r\n * @param {HTMLElement} [ctx] - (必须)比对的 DOM 元素\r\n * @param {Boolean} [includeCTX] - (必须)是否包含 context DOM 元素\r\n * @returns {null|HTMLElement} - 返回最接近的 DOM 元素\r\n */\r\nconst closest = (el, selector, ctx, includeCTX) => {\r\n const context = ctx || document\r\n\r\n if (!el) {\r\n return null\r\n }\r\n\r\n do {\r\n /* istanbul ignore else */\r\n if (\r\n (selector != null &&\r\n (selector.startsWith('>')\r\n ? el.parentNode === context && matches(el, selector)\r\n : matches(el, selector))) ||\r\n (includeCTX && el === context)\r\n ) {\r\n return el\r\n }\r\n\r\n /* istanbul ignore else */\r\n if (el === context) {\r\n break\r\n }\r\n\r\n /* jshint boss:true */\r\n } while ((el = getParentOrHost(el)))\r\n}\r\n\r\nexport default closest\r\n","import DEFAULTS from './defaults'\r\n\r\nconst SYMBOLS = [...DEFAULTS]\r\n\r\nexport default SYMBOLS\r\n","const DEFAULTS = [\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n ''\r\n]\r\n\r\nexport default DEFAULTS\r\n","import isString from '../types/isString'\r\nimport getSymbol from './getSymbol'\r\nimport SYMBOLS from './symbols'\r\n\r\n/**\r\n *\r\n * @method getSymbols\r\n * @param {String} [name]\r\n * @param {String} [iconSet]\r\n * @returns {string[]|*}\r\n */\r\nconst getSymbols = (name, iconSet = 'icon') => {\r\n if (isString(name)) {\r\n return getSymbol(name, iconSet)\r\n }\r\n\r\n return [...SYMBOLS]\r\n}\r\n\r\nexport default getSymbols\r\n","import SYMBOLS from './symbols'\r\n\r\n/**\r\n * @method getSymbol\r\n * @param {String} name\r\n * @param {String} [iconSet]\r\n * @returns {String}\r\n */\r\nconst getSymbol = (name, iconSet = 'icon') => {\r\n const patternName = /id=\"(.*?)\"/\r\n const patternSet = /^(\\w+)-/\r\n const symbols = SYMBOLS\r\n\r\n return symbols.find((symbol) => {\r\n const names = patternName.exec(symbol)\r\n const fullName = names[1]\r\n const sets = patternSet.exec(fullName)\r\n const setName = sets[1]\r\n const iconName =\r\n iconSet === 'icon' ? `${iconSet}-${name}` : `${iconSet}-icon-${name}`\r\n\r\n return setName === iconSet && fullName === iconName\r\n })\r\n}\r\n\r\nexport default getSymbol\r\n","import add from './add'\r\nimport getSymbols from './getSymbols'\r\n\r\n/**\r\n * 绘制 SVG 图标集\r\n * ========================================================================\r\n * @method paint\r\n * @param {String|Array} symbol\r\n */\r\nconst paint = (symbol = '') => {\r\n const $body = document.body\r\n let $icons = document.querySelector('#outline-icons')\r\n let symbols = []\r\n\r\n add(symbol)\r\n symbols = getSymbols()\r\n\r\n if ($icons) {\r\n $icons.innerHTML = symbols.join('')\r\n } else {\r\n $icons = document.createElement('div')\r\n $icons.innerHTML =\r\n ``\r\n $body.insertBefore($icons.firstChild, $body.firstChild)\r\n }\r\n}\r\n\r\nexport default paint\r\n","import isArray from '../types/isArray'\r\nimport isString from '../types/isString'\r\nimport SYMBOLS from './symbols'\r\n\r\n/**\r\n * @method add\r\n * @param {Array|String} symbols\r\n * @return {Boolean}\r\n */\r\nconst add = (symbols) => {\r\n if (!symbols) {\r\n return false\r\n }\r\n\r\n if (isArray(symbols) && symbols.length > 0) {\r\n symbols.forEach((symbol) => {\r\n /* istanbul ignore else */\r\n if (SYMBOLS.indexOf(symbol) === -1 && isString(symbol)) {\r\n SYMBOLS.push(symbol)\r\n }\r\n })\r\n } else {\r\n /* istanbul ignore else */\r\n if (isString(symbols)) {\r\n SYMBOLS.push(symbols)\r\n }\r\n }\r\n}\r\n\r\nexport default add\r\n","import isArray from '../types/isArray'\r\nimport isString from '../types/isString'\r\nimport isSVG from '../types/isSVG'\r\nimport setAttributes from '../dom/setAttributes'\r\n\r\n/**\r\n * 创建 SVG 图标 DOM 元素\r\n * ========================================================================\r\n * @method createElement\r\n * @param {String} name\r\n * @param {Object} [options]\r\n * @param {Number|Array} [options.size]\r\n * @param {String} [options.color]\r\n * @param {String} [options.iconSet]\r\n * @param {Object} [options.attrs]\r\n * @returns {HTMLElement}\r\n */\r\nconst createElement = (name, options = {}) => {\r\n const ICON = 'outline-icon'\r\n const size = options.size || 0\r\n const color = options.color || ''\r\n const iconSet = options.iconSet || ''\r\n const width = isArray(size) ? size[0] : size\r\n const height = isArray(size) ? size[1] : size\r\n const defaultRules = size ? `width:${width}px;height:${height}px;` : ''\r\n const cssRules = color ? defaultRules + `color:${color}` : defaultRules\r\n const attrs = options.attrs || {}\r\n const $icon = document.createElement('i')\r\n let binds = ''\r\n let svg = ''\r\n let $svg\r\n\r\n if (!isString(name)) {\r\n return null\r\n }\r\n\r\n if (isSVG(name)) {\r\n svg = name\r\n } else {\r\n binds =\r\n iconSet && iconSet !== 'icon'\r\n ? `xlink:href=\"#${iconSet}-icon-${name}\"`\r\n : `xlink:href=\"#icon-${name}\"`\r\n svg = ``\r\n }\r\n\r\n $icon.innerHTML = svg\r\n\r\n if (attrs.className) {\r\n attrs.className = `${ICON} ${attrs.className}`\r\n } else {\r\n attrs.className = ICON\r\n }\r\n\r\n setAttributes($icon, attrs)\r\n\r\n $svg = $icon.querySelector('svg')\r\n setAttributes($svg, {\r\n 'aria-hidden': true,\r\n xmlns: 'http://www.w3.org/2000/svg',\r\n class: 'outline-icon__svg',\r\n width: 200,\r\n height: 200,\r\n style: cssRules\r\n })\r\n\r\n return $icon\r\n}\r\n\r\nexport default createElement\r\n","import isString from './isString'\r\n\r\nconst isSVG = (str) => {\r\n const declaration = '(?:<\\\\?xml[^>]*>\\\\s*)?'\r\n const doctype =\r\n '(?:<\\\\!doctype svg[^>]*\\\\s*(?:\\\\[?(?:\\\\s*]*>\\\\s*)*\\\\]?)*[^>]*>\\\\s*)?'\r\n const content = ']*>[^]*<\\\\/svg>\\\\s*$'\r\n const svg = `^\\\\s*${declaration}${doctype}${content}\\\\s*$`\r\n const pattern = new RegExp(svg, 'i')\r\n\r\n return isString(str) && pattern.test(str)\r\n}\r\n\r\nexport default isSVG\r\n","import setProperty from './utils/dom/setProperty'\r\n\r\nlet index = 2000\r\n\r\nconst zIndex = (idx) => {\r\n if (idx) {\r\n index = idx\r\n } else {\r\n index += 1\r\n }\r\n\r\n setProperty('--outline-zIndex', `${index}`)\r\n\r\n return index\r\n}\r\n\r\nexport default zIndex\r\n","const setProperty = (prop, value) => {\r\n const documentElement = document.documentElement\r\n documentElement.style.setProperty(prop, value)\r\n}\r\n\r\nexport default setProperty\r\n","import Base from './base'\r\n\r\nimport later from './utils/lang/later'\r\nimport cloneDeep from './utils/lang/cloneDeep'\r\nimport isFunction from './utils/types/isFunction'\r\nimport isDOM from './utils/types/isDOM'\r\nimport isHTML from './utils/types/isHTML'\r\nimport addClass from './utils/dom/addClass'\r\nimport removeClass from './utils/dom/removeClass'\r\nimport html from './utils/dom/html'\r\nimport createElement from './utils/dom/createElement'\r\nimport on from './utils/event/on'\r\nimport off from './utils/event/off'\r\n\r\nimport paint from './utils/icons/paint'\r\nimport icon from './utils/icons/icon'\r\nimport zIndex from './zIndex'\r\n\r\nclass Drawer extends Base {\r\n constructor(options) {\r\n super()\r\n\r\n this._default()\r\n\r\n this.zIndex = 0\r\n\r\n if (options) {\r\n this.initialize(options)\r\n }\r\n }\r\n\r\n _default() {\r\n this.attrs = cloneDeep(Drawer.DEFAULTS)\r\n this.title = ''\r\n this.closed = false\r\n\r\n this.$el = null\r\n this.$modal = null\r\n this.$header = null\r\n this.$title = null\r\n this.$close = null\r\n this.$main = null\r\n this.$footer = null\r\n this.$overlay = null\r\n\r\n return this\r\n }\r\n\r\n initialize(options) {\r\n let created\r\n\r\n this.attr(options)\r\n\r\n this.title = this.attr('title')\r\n created = this.attr('created')\r\n\r\n if (isFunction(created)) {\r\n created.call(this)\r\n }\r\n\r\n this.render().addListeners()\r\n return this\r\n }\r\n\r\n setTitle(title) {\r\n this.attr('title', title)\r\n this.title = title\r\n this.$title.innerHTML = title\r\n\r\n return this\r\n }\r\n\r\n isClosed() {\r\n return this.closed\r\n }\r\n\r\n render() {\r\n const mounted = this.attr('mounted')\r\n const size = this.attr('size')\r\n const placement = this.attr('placement')\r\n const hasClose = this.attr('hasClose')\r\n const hasOverlay = this.attr('hasOverlay')\r\n const hasOffset = this.attr('hasOffset')\r\n const hasPadding = this.attr('hasPadding')\r\n const autoHeight = this.attr('autoHeight')\r\n const overflow = this.attr('overflow')\r\n const customClass = this.attr('customClass')\r\n let mainClassName = 'outline-drawer__main'\r\n let $el\r\n let $modal\r\n let $header\r\n let $title\r\n let $close\r\n let $main\r\n let $footer\r\n let $overlay\r\n\r\n paint()\r\n this.zIndex = zIndex()\r\n\r\n $title = createElement(\r\n 'h2',\r\n {\r\n className: 'outline-drawer__title'\r\n },\r\n this.title\r\n )\r\n this.$title = $title\r\n\r\n if (hasClose) {\r\n $close = createElement(\r\n 'div',\r\n {\r\n className: 'outline-drawer__close'\r\n },\r\n icon('close', { iconSet: 'outline', size: 20 })\r\n )\r\n this.$close = $close\r\n }\r\n\r\n $header = createElement(\r\n 'header',\r\n {\r\n className: 'outline-drawer__header'\r\n },\r\n [$title, $close]\r\n )\r\n this.$header = $header\r\n\r\n if (overflow === 'hidden') {\r\n mainClassName += ' overflow-hidden'\r\n }\r\n\r\n $main = createElement('div', {\r\n className: mainClassName\r\n })\r\n this.$main = $main\r\n\r\n if (!hasPadding) {\r\n addClass($main, 'outline-drawer_full')\r\n }\r\n\r\n $footer = createElement('footer', {\r\n className: 'outline-drawer__footer'\r\n })\r\n this.$footer = $footer\r\n\r\n $modal = createElement(\r\n 'div',\r\n {\r\n className: `outline-drawer__modal outline-drawer_${placement} outline-drawer_${size} outline-drawer_closed`\r\n },\r\n [$header, $main, $footer]\r\n )\r\n this.$modal = $modal\r\n\r\n if (hasOffset) {\r\n addClass($modal, 'outline-drawer_offset')\r\n }\r\n\r\n if (autoHeight) {\r\n addClass($modal, 'outline-drawer_auto')\r\n }\r\n\r\n if (customClass) {\r\n addClass($modal, customClass)\r\n }\r\n\r\n if (hasOverlay) {\r\n $overlay = createElement('div', {\r\n className: 'outline-drawer__overlay'\r\n })\r\n this.$overlay = $overlay\r\n }\r\n\r\n $el = createElement(\r\n 'div',\r\n {\r\n className: `outline-drawer`\r\n },\r\n [$modal, $overlay]\r\n )\r\n this.$el = $el\r\n document.body.appendChild($el)\r\n\r\n if (isFunction(mounted)) {\r\n mounted.call(this)\r\n }\r\n\r\n return this\r\n }\r\n\r\n erase() {\r\n this.$main.innerHTML = ''\r\n return this\r\n }\r\n\r\n _paint(content) {\r\n let $content = null\r\n\r\n if (isFunction(content)) {\r\n $content = content()\r\n } else if (isDOM(content)) {\r\n $content = content\r\n } else if (isHTML(content)) {\r\n $content = html(content)\r\n }\r\n\r\n if ($content) {\r\n this.$main.appendChild($content)\r\n }\r\n\r\n return this\r\n }\r\n\r\n _remove() {\r\n document.body.removeChild(this.$el)\r\n return this\r\n }\r\n\r\n refresh(content) {\r\n this.erase()._paint(content)\r\n return this\r\n }\r\n\r\n open() {\r\n const opened = this.attr('afterOpened')\r\n const $modal = this.$modal\r\n\r\n addClass(this.$el, 'outline-drawer_opened')\r\n removeClass($modal, 'outline-drawer_closed')\r\n addClass($modal, 'outline-drawer_opened')\r\n\r\n later(() => {\r\n this.closed = false\r\n\r\n if (isFunction(opened)) {\r\n opened.call(this)\r\n }\r\n })\r\n\r\n return this\r\n }\r\n\r\n close() {\r\n const closed = this.attr('afterClosed')\r\n const $modal = this.$modal\r\n\r\n removeClass($modal, 'outline-drawer_opened')\r\n addClass($modal, 'outline-drawer_closed')\r\n\r\n later(() => {\r\n removeClass(this.$el, 'outline-drawer_opened')\r\n this.closed = true\r\n\r\n if (isFunction(closed)) {\r\n closed.call(this)\r\n }\r\n })\r\n\r\n return this\r\n }\r\n\r\n toggle() {\r\n const afterToggle = this.attr('afterToggle')\r\n const closed = this.isClosed()\r\n\r\n if (closed) {\r\n this.open()\r\n } else {\r\n this.close()\r\n }\r\n\r\n if (isFunction(afterToggle)) {\r\n later(() => {\r\n afterToggle.call(this, closed)\r\n })\r\n }\r\n\r\n return this\r\n }\r\n\r\n destroy() {\r\n const afterDestroy = this.attr('afterDestroy')\r\n const beforeDestroy = this.attr('beforeDestroy')\r\n let index = this.zIndex\r\n\r\n if (isFunction(beforeDestroy)) {\r\n beforeDestroy.call(this)\r\n }\r\n\r\n this.removeListeners()._remove()._default()\r\n\r\n index -= 1\r\n zIndex(index)\r\n this.zIndex = 0\r\n\r\n if (isFunction(afterDestroy)) {\r\n afterDestroy.call(this)\r\n }\r\n\r\n return this\r\n }\r\n\r\n onClose() {\r\n this.close()\r\n return this\r\n }\r\n\r\n addListeners() {\r\n const hasClose = this.attr('hasClose')\r\n const hasOverlay = this.attr('hasOverlay')\r\n const closeOnClickModal = this.attr('closeOnClickModal')\r\n const $el = this.$el\r\n\r\n if (hasClose) {\r\n on($el, '.outline-drawer__close', 'click', this.onClose, this, true)\r\n }\r\n\r\n if (hasOverlay && closeOnClickModal) {\r\n on($el, '.outline-drawer__overlay', 'click', this.onClose, this, true)\r\n }\r\n\r\n return this\r\n }\r\n\r\n removeListeners() {\r\n const hasClose = this.attr('hasClose')\r\n const hasOverlay = this.attr('hasOverlay')\r\n const $el = this.$el\r\n\r\n if (!hasClose && !hasOverlay) {\r\n return this\r\n }\r\n\r\n off($el, 'click', this.onClose)\r\n\r\n return this\r\n }\r\n}\r\n\r\nDrawer.DEFAULTS = (() => {\r\n const OPTIONS = {\r\n placement: 'rtl',\r\n title: '标题',\r\n size: 'regular',\r\n hasClose: true,\r\n hasOverlay: true,\r\n hasOffset: false,\r\n hasPadding: true,\r\n autoHeight: true,\r\n closeOnClickModal: true,\r\n overflow: 'auto',\r\n created: null,\r\n mounted: null,\r\n afterClosed: null,\r\n afterOpened: null,\r\n afterScroll: null,\r\n beforeDestroy: null,\r\n afterDestroy: null,\r\n afterToggle: null\r\n }\r\n\r\n return cloneDeep(OPTIONS)\r\n})()\r\n\r\nexport default Drawer\r\n","import createElement from './createElement'\r\n\r\n/**\r\n * 创建 SVG 图标 DOM 元素\r\n * ========================================================================\r\n * @method icon\r\n * @alias createElement\r\n * @see createElement\r\n * @param {String} name\r\n * @param {Object} [options]\r\n * @param {Number|Array} [options.size]\r\n * @param {String} [options.color]\r\n * @param {String} [options.iconSet]\r\n * @returns {HTMLElement}\r\n */\r\nconst icon = (name, options = {}) => {\r\n return createElement(name, options)\r\n}\r\n\r\nexport default icon\r\n","import isHTML from '../types/isHTML'\r\nimport isString from '../types/isString'\r\nimport isElement from '../types/isElement'\r\nimport stripScripts from '../lang/stripScripts'\r\nimport createElement from './createElement'\r\n\r\n/**\r\n * 获取或者设置 DOM 元素的 innerHTML 属性值,或者通过 HTML 字符串,创建 DOM 元素\r\n * ========================================================================\r\n * @method html\r\n * @param {HTMLElement|String} el\r\n * @param {String} [strHTML]\r\n * @return {DocumentFragment|null|*}\r\n */\r\nconst html = (el, strHTML) => {\r\n const $fragment = document.createDocumentFragment()\r\n\r\n if (!el || (!isHTML(el) && !isString(el) && !isElement(el))) {\r\n return null\r\n }\r\n\r\n if (isHTML(el)) {\r\n const template = createElement('div')\r\n let children = []\r\n\r\n template.innerHTML = stripScripts(el)\r\n children = [...template.childNodes]\r\n children.forEach((child) => {\r\n $fragment.appendChild(child)\r\n })\r\n\r\n return $fragment\r\n } else if (isString(strHTML)) {\r\n el.innerHTML = stripScripts(strHTML)\r\n } else {\r\n return el.innerHTML\r\n }\r\n}\r\n\r\nexport default html\r\n"],"names":["isString","str","hasOwn","obj","prop","hasOwnProperty","Object","prototype","call","toString","val","apply","isFunction","isObject","o","_subscribers","_hasDirectSubscribersFor","topic","length","has","isDirect","found","position","lastIndexOf","substring","_hasSubscribers","emit","data","async","execute","forEach","subscriber","message","indexOf","callback","context","deliver","setTimeout","guid","uuid","prefix","_removeSubscriber","off","token","keys","subject","execution","j","splice","_removeSubscriberByToken","Base","constructor","options","this","attrs","initialize","attr","render","addListeners","value","origin","source","arguments","extend","refresh","destroy","removeListeners","reload","$emit","event","publish","$on","on","handler","push","subscribe","$off","unsubscribe","later","fn","delay","isArray","Array","cloneDeep","clone","from","assign","key","isElement","nodeName","tagName","nodeType","isDOM","el","isHTMLCollection","fragment","isTextNode","trim","replace","TAGS","isHTML","html","basic","full","slice","RegExp","map","tag","join","test","hasClass","className","pattern","allClass","classList","contains","exec","addClass","_classList","add","split","name","removeClass","remove","stripScripts","setAttributes","setAttribute","toLowerCase","style","cssText","innerHTML","innerText","createElement","children","$fragment","document","createDocumentFragment","$el","isValidChild","child","append","$child","createTextNode","appendChild","every","matches","selector","sel","msMatchesSelector","getParentOrHost","host","parentNode","CAPTURE_EVENTS","_off","type","capture","_delegateListener","listeners","_listeners","index","listener","i","_delete","removeEventListener","purgeElement","recurse","$element","querySelector","$children","childNodes","getListeners","filter","once","evt","target","getTarget","delegateTarget","closest","ctx","includeCTX","startsWith","overrideContext","addEventListener","SYMBOLS","_maybeArrayLike","_toConsumableArray","getSymbols","iconSet","getSymbol","patternName","patternSet","find","symbol","fullName","paint","$body","body","$icons","symbols","insertBefore","firstChild","ICON","size","color","width","height","defaultRules","cssRules","$icon","$svg","binds","svg","isSVG","xmlns","class","zIndex","idx","setProperty","documentElement","Drawer","super","_default","DEFAULTS","title","closed","$modal","$header","$title","$close","$main","$footer","$overlay","created","setTitle","isClosed","mounted","placement","hasClose","hasOverlay","hasOffset","hasPadding","autoHeight","overflow","customClass","mainClassName","icon","erase","_paint","content","$content","strHTML","template","_remove","removeChild","open","opened","close","toggle","afterToggle","afterDestroy","beforeDestroy","onClose","closeOnClickModal","afterClosed","afterOpened","afterScroll"],"mappings":"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EAAO,CACX,IACA,OACA,UACA,OACA,UACA,QACA,QACA,IACA,OACA,MACA,MACA,aACA,OACA,KACA,SACA,SACA,UACA,OACA,OACA,MACA,WACA,OACA,WACA,KACA,MACA,UACA,MACA,SACA,MACA,KACA,KACA,KACA,QACA,WACA,aACA,SACA,SACA,OACA,KACA,KACA,KACA,KACA,KACA,KACA,OACA,SACA,SACA,KACA,OACA,IACA,SACA,MACA,QACA,MACA,MACA,QACA,SACA,KACA,OACA,OACA,MACA,OACA,OACA,OACA,WACA,OACA,QACA,MACA,WACA,SACA,KACA,WACA,SACA,SACA,IACA,QACA,UACA,MACA,WACA,IACA,KACA,KACA,KACA,MACA,OACA,IACA,OACA,SACA,SACA,UACA,SACA,OACA,QACA,SACA,OACA,SACA,QACA,MACA,UACA,MACA,MACA,QACA,QACA,KACA,WACA,WACA,QACA,KACA,QACA,OACA,QACA,KACA,QACA,IACA,KACA,MACA,QACA,OCzGIC,EAAUnG,IACd,IAAIoG,EACAC,EACAC,EAEJ,QAAKvG,EAASC,KAKdoG,EAAOJ,EAAKhG,GAAKuG,MAAM,EAAG,KAC1BF,EAAQ,4DACRC,EAAO,IAAIE,OAAON,EAAKO,KAAKC,GAAQ,IAAIA,eAAgBC,KAAK,KAAM,KAE5DN,EAAMO,KAAKR,IAASE,EAAKM,KAAKR,GAAK,ECnBtCS,EAAWA,CAACjB,EAAIkB,KACpB,MAAMC,EAAU,IAAIP,OAAO,UAAYM,EAAY,WACnD,IAAIE,EACAC,EAEJ,QAAK1B,EAAUK,KAIfoB,EAAWpB,EAAGkB,YAETE,IAILC,EAAYrB,EAAGqB,UAEXA,GAAaA,EAAUC,SAClBtB,EAAGqB,UAAUC,SAASJ,KAGtBC,EAAQI,KAAKH,IAAS,ECpB3BI,EAAWA,CAACxB,EAAIkB,KAAc,IAAAO,EAClC,IAAIJ,EACAD,EAEJ,GAAIH,EAASjB,EAAIkB,GACf,OAAO,EAGTG,EAAYrB,EAAGqB,UAEF,QAAbI,EAAIJ,SAAAI,IAASA,GAATA,EAAWC,IACTR,EAAU9E,QAAQ,MAAQ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"} \ No newline at end of file diff --git a/drawer/drawer.css b/drawer/drawer.css new file mode 100644 index 00000000..de951f67 --- /dev/null +++ b/drawer/drawer.css @@ -0,0 +1 @@ +:root{--outline-zIndex:2000;--outline-sticky-height:100%;--outline-navigator-width:100%}.outline-drawer{box-sizing:border-box;height:100%;left:0;margin:0;overflow:hidden;position:relative;top:0;visibility:hidden;width:100%;z-index:-1}.outline-drawer__modal{background-color:#fff;box-shadow:0 0 6px 1px #dcdfe6;display:flex;flex-direction:column;flex-wrap:nowrap;height:100%;overflow:hidden;position:absolute;transition-duration:.4s;z-index:21}.outline-drawer__footer,.outline-drawer__header,.outline-drawer__main{box-sizing:border-box;width:100%}.outline-drawer__footer,.outline-drawer__header{flex-shrink:0}.outline-drawer__footer,.outline-drawer__main,.outline-drawer__title{padding:0 16px}.outline-drawer__header,.outline-drawer__title{height:52px;line-height:52px;margin:0 auto;overflow:hidden;position:relative;z-index:1}.outline-drawer__title{border-bottom:1px solid #dcdfe6;box-sizing:border-box;font-size:16px;font-weight:400;margin:0 16px}.outline-drawer__close{color:#999;cursor:pointer;font-size:20px;height:20px;line-height:20px;overflow:hidden;position:absolute;right:12px;text-align:center;top:50%;transform:translateY(-50%);width:20px;z-index:2}.outline-drawer__close .outline-icon{left:0;position:absolute;top:0;z-index:2}.outline-drawer__close:hover{color:#666}.outline-drawer__main{flex:1;overflow:auto}.outline-drawer__main.overflow-hidden{overflow:hidden}.outline-drawer__footer{margin:0 auto;overflow:hidden;text-align:right}.outline-drawer__overlay{background-color:#fff;content:"";height:100%;left:0;opacity:.1;overflow:hidden;position:relative;top:0;width:100%;z-index:1}.outline-drawer_ltr.outline-drawer_tiny,.outline-drawer_rtl.outline-drawer_tiny{width:280px}.outline-drawer_ltr.outline-drawer_mini,.outline-drawer_rtl.outline-drawer_mini{width:480px}.outline-drawer_ltr.outline-drawer_small,.outline-drawer_rtl.outline-drawer_small{width:540px}.outline-drawer_ltr.outline-drawer_regular,.outline-drawer_rtl.outline-drawer_regular{width:680px}.outline-drawer_ltr.outline-drawer_medium,.outline-drawer_rtl.outline-drawer_medium{width:720px}.outline-drawer_ltr.outline-drawer_large,.outline-drawer_rtl.outline-drawer_large{width:960px}.outline-drawer_rtl{border-left:1px solid #dcdfe6}.outline-drawer_rtl.outline-drawer_tiny.outline-drawer_closed{right:-290px}.outline-drawer_rtl.outline-drawer_mini.outline-drawer_closed{right:-490px}.outline-drawer_rtl.outline-drawer_small.outline-drawer_closed{right:-550px}.outline-drawer_rtl.outline-drawer_regular.outline-drawer_closed{right:-690px}.outline-drawer_rtl.outline-drawer_medium.outline-drawer_closed{right:-730px}.outline-drawer_rtl.outline-drawer_large.outline-drawer_closed{right:-970px}.outline-drawer_ltr{border-right:1px solid #dcdfe6}.outline-drawer_ltr.outline-drawer_tiny.outline-drawer_closed{left:-290px}.outline-drawer_ltr.outline-drawer_mini.outline-drawer_closed{left:-490px}.outline-drawer_ltr.outline-drawer_small.outline-drawer_closed{left:-550px}.outline-drawer_ltr.outline-drawer_regular.outline-drawer_closed{left:-690px}.outline-drawer_ltr.outline-drawer_medium.outline-drawer_closed{left:-730px}.outline-drawer_ltr.outline-drawer_large.outline-drawer_closed{left:-970px}.outline-drawer_btt,.outline-drawer_ttb{left:0;width:100%}.outline-drawer_btt.outline-drawer_tiny,.outline-drawer_ttb.outline-drawer_tiny{height:240px}.outline-drawer_btt.outline-drawer_mini,.outline-drawer_ttb.outline-drawer_mini{height:320px}.outline-drawer_btt.outline-drawer_small,.outline-drawer_ttb.outline-drawer_small{height:360px}.outline-drawer_btt.outline-drawer_regular,.outline-drawer_ttb.outline-drawer_regular{height:400px}.outline-drawer_btt.outline-drawer_medium,.outline-drawer_ttb.outline-drawer_medium{height:440px}.outline-drawer_btt.outline-drawer_large,.outline-drawer_ttb.outline-drawer_large{height:480px}.outline-drawer_ttb{border-bottom:1px solid #dcdfe6}.outline-drawer_ttb.outline-drawer_tiny.outline-drawer_closed{top:-250px}.outline-drawer_ttb.outline-drawer_mini.outline-drawer_closed{top:-330px}.outline-drawer_ttb.outline-drawer_small.outline-drawer_closed{top:-370px}.outline-drawer_ttb.outline-drawer_regular.outline-drawer_closed{top:-410px}.outline-drawer_ttb.outline-drawer_medium.outline-drawer_closed{top:-450px}.outline-drawer_ttb.outline-drawer_large.outline-drawer_closed{top:-490px}.outline-drawer_btt{border-top:1px solid #dcdfe6;top:auto}.outline-drawer_btt.outline-drawer_tiny.outline-drawer_closed{bottom:-250px}.outline-drawer_btt.outline-drawer_mini.outline-drawer_closed{bottom:-330px}.outline-drawer_btt.outline-drawer_small.outline-drawer_closed{bottom:-370px}.outline-drawer_btt.outline-drawer_regular.outline-drawer_closed{bottom:-410px}.outline-drawer_btt.outline-drawer_medium.outline-drawer_closed{bottom:-450px}.outline-drawer_btt.outline-drawer_large.outline-drawer_closed{bottom:-490px}.outline-drawer_opened{visibility:visible;z-index:var(--outline-zIndex)}.outline-drawer_opened.outline-drawer{position:fixed}.outline-drawer_opened.outline-drawer_rtl{right:0}.outline-drawer_opened.outline-drawer_ltr{left:0}.outline-drawer_opened.outline-drawer_ttb{top:0}.outline-drawer_opened.outline-drawer_btt{bottom:0}.outline-drawer_offset.outline-drawer_ltr,.outline-drawer_offset.outline-drawer_rtl{height:calc(100% - 4em);top:50%;transform:translateY(-50%)}.outline-drawer_offset.outline-drawer_btt,.outline-drawer_offset.outline-drawer_ttb{left:50%;transform:translateX(-50%);width:calc(100% - 4em)}.outline-drawer_offset.outline-drawer_opened.outline-drawer_rtl{right:2em}.outline-drawer_offset.outline-drawer_opened.outline-drawer_ltr{left:2em}.outline-drawer_offset.outline-drawer_opened.outline-drawer_ttb{top:2em}.outline-drawer_offset.outline-drawer_opened.outline-drawer_btt{bottom:2em}.outline-drawer_auto.outline-drawer_ltr,.outline-drawer_auto.outline-drawer_rtl{height:auto;max-height:calc(100% - 4em)}.outline-drawer_full{padding:0} \ No newline at end of file diff --git a/drawer.js b/drawer/drawer.js similarity index 90% rename from drawer.js rename to drawer/drawer.js index 1f81429f..5f777444 100644 --- a/drawer.js +++ b/drawer/drawer.js @@ -1,22 +1,24 @@ -import Base from './base' - -import later from './utils/lang/later' -import cloneDeep from './utils/lang/cloneDeep' -import isFunction from './utils/types/isFunction' -import isDOM from './utils/types/isDOM' -import isHTML from './utils/types/isHTML' -import addClass from './utils/dom/addClass' -import removeClass from './utils/dom/removeClass' -import html from './utils/dom/html' -import createElement from './utils/dom/createElement' -import on from './utils/event/on' -import off from './utils/event/off' - -import paint from './utils/icons/paint' -import icon from './utils/icons/icon' -import zIndex from './zIndex' - -class Drawer extends Base { +import later from '@/utils/lang/later' +import cloneDeep from '@/utils/lang/cloneDeep' +import isFunction from '@/utils/types/isFunction' +import isDOM from '@/utils/types/isDOM' +import isHTML from '@/utils/types/isHTML' +import addClass from '@/utils/dom/addClass' +import removeClass from '@/utils/dom/removeClass' +import html from '@/utils/dom/html' +import createElement from '@/utils/dom/createElement' +import zIndex from '@/utils/dom/zIndex' +import on from '@/utils/event/on' +import off from '@/utils/event/off' + +import paint from '@/utils/icons/paint' +import icon from '@/utils/icons/icon' + +import Component from '@/component' + +import './drawer.less' + +class Drawer extends Component { constructor(options) { super() diff --git a/drawer/drawer.less b/drawer/drawer.less new file mode 100644 index 00000000..cd4e2abe --- /dev/null +++ b/drawer/drawer.less @@ -0,0 +1,427 @@ +@import '../theme/variables'; +@import '../theme/colors'; +@import '../theme/shadow'; + +.outline-drawer { + position: relative; + z-index: -1; + top: 0; + left: 0; + margin: 0; + width: 100%; + height: 100%; + box-sizing: border-box; + visibility: hidden; + overflow: hidden; + + &__modal { + .shadow_light_regular(); + display: flex; + flex-direction: column; + flex-wrap: nowrap; + position: absolute; + z-index: 21; + height: 100%; + background-color: @white; + transition-duration: 0.4s; + overflow: hidden; + } + + &__header, + &__main, + &__footer { + width: 100%; + box-sizing: border-box; + } + + &__header, + &__footer { + flex-shrink: 0; + } + + &__title, + &__main, + &__footer { + padding: 0 16px; + } + + &__header, + &__title { + position: relative; + z-index: 1; + margin: 0 auto; + height: 52px; + line-height: 52px; + overflow: hidden; + } + + &__title { + font-size: 16px; + font-weight: 400; + margin: 0 16px; + box-sizing: border-box; + border-bottom: 1px solid @primary_border_color; + } + + &__close { + position: absolute; + z-index: 2; + top: 50%; + right: 12px; + width: 20px; + height: 20px; + line-height: 20px; + color: @fourth_text_color; + font-size: 20px; + text-align: center; + cursor: pointer; + transform: translateY(-50%); + overflow: hidden; + + .outline-icon { + position: absolute; + z-index: 2; + top: 0; + left: 0; + } + + &:hover { + color: @third_text_color; + } + } + + &__main { + flex: 1; + overflow: auto; + + &.overflow-hidden { + overflow: hidden; + } + } + + &__footer { + margin: 0 auto; + text-align: right; + overflow: hidden; + } + + &__overlay { + content: ''; + position: relative; + z-index: 1; + top: 0; + left: 0; + width: 100%; + height: 100%; + background-color: @white; + opacity: 0.1; + overflow: hidden; + } + + &_rtl, + &_ltr { + &.outline-drawer { + &_tiny { + width: 280px; + } + + &_mini { + width: 480px; + } + + &_small { + width: 540px; + } + + &_regular { + width: 680px; + } + + &_medium { + width: 720px; + } + + &_large { + width: 960px; + } + } + } + + &_rtl { + border-left: 1px solid @primary_border_color; + + &.outline-drawer { + &_tiny { + &.outline-drawer_closed { + right: -290px; + } + } + + &_mini { + &.outline-drawer_closed { + right: -490px; + } + } + + &_small { + &.outline-drawer_closed { + right: -550px; + } + } + + &_regular { + &.outline-drawer_closed { + right: -690px; + } + } + + &_medium { + &.outline-drawer_closed { + right: -730px; + } + } + + &_large { + &.outline-drawer_closed { + right: -970px; + } + } + } + } + + &_ltr { + border-right: 1px solid @primary_border_color; + + &.outline-drawer { + &_tiny { + &.outline-drawer_closed { + left: -290px; + } + } + + &_mini { + &.outline-drawer_closed { + left: -490px; + } + } + + &_small { + &.outline-drawer_closed { + left: -550px; + } + } + + &_regular { + &.outline-drawer_closed { + left: -690px; + } + } + + &_medium { + &.outline-drawer_closed { + left: -730px; + } + } + + &_large { + &.outline-drawer_closed { + left: -970px; + } + } + } + } + + &_ttb, + &_btt { + left: 0; + width: 100%; + + &.outline-drawer { + &_tiny { + height: 240px; + } + + &_mini { + height: 320px; + } + + &_small { + height: 360px; + } + + &_regular { + height: 400px; + } + + &_medium { + height: 440px; + } + + &_large { + height: 480px; + } + } + } + + &_ttb { + border-bottom: 1px solid @primary_border_color; + + &.outline-drawer { + &_tiny { + &.outline-drawer_closed { + top: -250px; + } + } + + &_mini { + &.outline-drawer_closed { + top: -330px; + } + } + + &_small { + &.outline-drawer_closed { + top: -370px; + } + } + + &_regular { + &.outline-drawer_closed { + top: -410px; + } + } + + &_medium { + &.outline-drawer_closed { + top: -450px; + } + } + + &_large { + &.outline-drawer_closed { + top: -490px; + } + } + } + } + + &_btt { + top: initial; + border-top: 1px solid @primary_border_color; + + &.outline-drawer { + &_tiny { + &.outline-drawer_closed { + bottom: -250px; + } + } + + &_mini { + &.outline-drawer_closed { + bottom: -330px; + } + } + + &_small { + &.outline-drawer_closed { + bottom: -370px; + } + } + + &_regular { + &.outline-drawer_closed { + bottom: -410px; + } + } + + &_medium { + &.outline-drawer_closed { + bottom: -450px; + } + } + + &_large { + &.outline-drawer_closed { + bottom: -490px; + } + } + } + } + + &_opened { + visibility: visible; + z-index: var(--outline-zIndex); + + &.outline-drawer { + position: fixed; + + &_rtl { + right: 0; + } + + &_ltr { + left: 0; + } + + &_ttb { + top: 0; + } + + &_btt { + bottom: 0; + } + } + } + + &_offset { + &.outline-drawer { + &_rtl, + &_ltr { + height: calc(100% - 4em); + top: 50%; + transform: translateY(-50%); + } + + &_ttb, + &_btt { + width: calc(100% - 4em); + left: 50%; + transform: translateX(-50%); + } + + &_opened { + &.outline-drawer { + &_rtl { + right: 2em; + } + + &_ltr { + left: 2em; + } + + &_ttb { + top: 2em; + } + + &_btt { + bottom: 2em; + } + } + } + } + } + + &_auto { + &.outline-drawer { + &_rtl, + &_ltr { + height: auto; + max-height: calc(100% - 4em); + } + } + } + + &_full { + padding: 0; + } +} diff --git a/drawer/drawer.min.css b/drawer/drawer.min.css new file mode 100644 index 00000000..568a65e4 --- /dev/null +++ b/drawer/drawer.min.css @@ -0,0 +1,6 @@ +.outline-heading{overflow:hidden;position:relative;z-index:1}.outline-heading__anchor{display:none}.outline-heading__anchor:hover,.outline-heading__anchor:link,.outline-heading__anchor:visited{color:#999;text-decoration:none}.outline-heading__anchor:hover{color:#507afe}.outline-heading:hover .outline-heading__anchor{display:inline-block}.outline-heading_start:hover{overflow:visible}.outline-heading_start .outline-heading__anchor{left:-1em;position:absolute;top:50%;transform:translateY(-50%);z-index:2} +:root{--outline-zIndex:2000;--outline-sticky-height:100%;--outline-navigator-width:100%}.outline-navigator{margin:0;overflow:auto;position:relative;width:var(--outline-navigator-width);z-index:1}.outline-navigator-parent{transition:.3s ease-in-out}.outline-navigator__title{border-bottom:1px solid #dcdfe6;font-size:16px;font-weight:400;height:40px;line-height:40px;margin:0 16px;overflow:hidden;padding:0 16px}.outline-navigator__main{margin:0;overflow:hidden;position:relative;z-index:1}.outline-navigator__item,.outline-navigator__list,.outline-navigator__subject{list-style-type:none;margin:0;overflow:hidden;padding:0;position:relative;z-index:2}.outline-navigator__list{padding:.5em 0}.outline-navigator__subject{padding-left:1em}.outline-navigator__item{font-size:13px;line-height:30px;margin:0;overflow:hidden}.outline-navigator__placeholder{background-color:#f7f8f9;border-left:2px solid #058942;box-sizing:border-box;height:30px;left:0;overflow:hidden;position:absolute;top:0;transition-duration:.2s;width:100%;z-index:1}.outline-navigator__anchor{display:block;overflow:hidden;padding:0 1.5em;text-overflow:ellipsis;white-space:nowrap}.outline-navigator__anchor:hover,.outline-navigator__anchor:link,.outline-navigator__anchor:visited{color:#555;text-decoration:none}.outline-navigator__anchor:hover{color:#058942}.outline-navigator__code{padding-right:.5em}.outline-navigator_highlight.outline-navigator__anchor:hover,.outline-navigator_highlight.outline-navigator__anchor:link,.outline-navigator_highlight.outline-navigator__anchor:visited{color:#058942;font-weight:700}.outline-navigator_fixed,.outline-navigator_sticky{display:flex;flex-direction:column;flex-wrap:nowrap;overflow:hidden;top:0;z-index:var(--outline-zIndex)}.outline-navigator_fixed .outline-navigator__main,.outline-navigator_fixed .outline-navigator__title,.outline-navigator_sticky .outline-navigator__main,.outline-navigator_sticky .outline-navigator__title{box-sizing:border-box}.outline-navigator_fixed .outline-navigator__title,.outline-navigator_sticky .outline-navigator__title{flex-shrink:0}.outline-navigator_fixed .outline-navigator__main,.outline-navigator_sticky .outline-navigator__main{flex:1;overflow:auto}.outline-navigator_sticky{max-height:var(--outline-sticky-height);position:sticky}.outline-navigator_fixed{max-height:100%;position:fixed}.outline-navigator_hidden{display:none}.outline-navigator_folded{overflow:hidden;width:0} +.outline-toolbar{margin:0;overflow:hidden;position:fixed;transition-duration:.3s;z-index:99999}.outline-toolbar__button{background-color:#fff;border:1px solid #dcdfe6;border-radius:3px;box-shadow:0 0 6px 1px #dcdfe6;box-sizing:border-box;color:#999;cursor:pointer;height:36px;margin:10px;overflow:hidden;position:relative;text-align:center;transition:all .3s ease-in-out .1s;width:36px;z-index:1}.outline-toolbar__button:hover{border-color:#058942;color:#058942;transform:scale(1.35)}.outline-toolbar__button.hide{display:none}.outline-toolbar__anchor:hover,.outline-toolbar__anchor:link,.outline-toolbar__anchor:visited{color:#999;text-decoration:none}.outline-toolbar__anchor:hover{color:#058942}.outline-toolbar__icon{height:20px;left:50%;position:absolute;top:50%;transform:translate(-50%,-50%);width:20px;z-index:2;fill:currentcolor;overflow:hidden}.outline-toolbar_active.outline-toolbar__button{background-color:#058942;border-color:#058942;color:#fff}.outline-toolbar_active.outline-toolbar__button:hover{color:#fff}.outline-toolbar_active .outline-toolbar__anchor:hover,.outline-toolbar_active .outline-toolbar__anchor:link,.outline-toolbar_active .outline-toolbar__anchor:visited{color:#fff}.outline-toolbar_rounded.outline-toolbar__button{border-radius:18px}.outline-toolbar_disabled .outline-toolbar__anchor:hover,.outline-toolbar_disabled .outline-toolbar__anchor:link,.outline-toolbar_disabled .outline-toolbar__anchor:visited,.outline-toolbar_disabled .outline-toolbar__button,.outline-toolbar_disabled.outline-toolbar__anchor:hover,.outline-toolbar_disabled.outline-toolbar__anchor:link,.outline-toolbar_disabled.outline-toolbar__anchor:visited,.outline-toolbar_disabled.outline-toolbar__button{border-color:#999;color:#999;cursor:not-allowed}.outline-toolbar_disabled .outline-toolbar__anchor:hover:hover,.outline-toolbar_disabled .outline-toolbar__anchor:link:hover,.outline-toolbar_disabled .outline-toolbar__anchor:visited:hover,.outline-toolbar_disabled .outline-toolbar__button:hover,.outline-toolbar_disabled.outline-toolbar__anchor:hover:hover,.outline-toolbar_disabled.outline-toolbar__anchor:link:hover,.outline-toolbar_disabled.outline-toolbar__anchor:visited:hover,.outline-toolbar_disabled.outline-toolbar__button:hover{border-color:#999;color:#999}.outline-toolbar_disabled .outline-toolbar__button,.outline-toolbar_disabled.outline-toolbar__button{background-color:#f5f5f5}.outline-toolbar_btt,.outline-toolbar_ttb{left:50%;transform:translateX(-50%)}.outline-toolbar_btt .outline-toolbar__button,.outline-toolbar_ttb .outline-toolbar__button{display:inline-block}.outline-toolbar_ttb{top:12px}.outline-toolbar_ttb.outline-toolbar_hidden{top:-56px}.outline-toolbar_btt{bottom:12px}.outline-toolbar_btt.outline-toolbar_hidden{bottom:-56px}.outline-toolbar_ltr,.outline-toolbar_rtl{transform:translateY(-50%);width:56px}.outline-toolbar_rtl{right:12px;top:50%}.outline-toolbar_rtl.outline-toolbar_hidden{right:-86px}.outline-toolbar_ltr{left:12px;top:50%}.outline-toolbar_ltr.outline-toolbar_hidden{left:-86px}.outline-toolbar_btt .outline-toolbar__button.outline-toolbar_hidden,.outline-toolbar_ltr .outline-toolbar__button.outline-toolbar_hidden,.outline-toolbar_rtl .outline-toolbar__button.outline-toolbar_hidden,.outline-toolbar_ttb .outline-toolbar__button.outline-toolbar_hidden{display:none} +.outline-reader__progress{animation:outline-reader-progress linear;background-color:#507afe;height:4px;left:0;position:fixed;scale:0 1;top:0;transform-origin:left;width:100%;z-index:3;animation-timeline:--ProgressTimeline}.outline-reader__paper{background-color:#fff;box-shadow:0 0 6px 1px #ddd;box-sizing:border-box;margin:2em auto;max-width:1200px;overflow:hidden;padding:3.2em}.outline-reader__title{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Helvetica Neue,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Helvetica,Arial,sans-serif;font-size:4.2em;font-weight:400;line-height:1.3em;margin:.67em 0;overflow:hidden;text-align:center}.outline-reader__article .outline-reader__progress,.outline-reader_hidden{display:none}.outline-reader_hidden.outline-reader_sibling{display:none!important}.outline-reader_hidden.outline-reader_sibling.wrapper.post{display:none}.outline-reader--reading{background-color:#fafafa;box-sizing:border-box;display:block;height:100%;left:0;margin:0;padding:3em 4em;position:fixed;top:0;width:100%;z-index:2;scroll-timeline-name:--ProgressTimeline;overflow:scroll}@keyframes outline-reader-progress{to{scale:1 1}}@media (max-width:500px){.outline-reader{overflow:hidden}.outline-reader .outline-toolbar{align-items:center;align-self:auto;background-color:#fff;border-top:1px solid #ddd;box-sizing:border-box;display:flex;flex-direction:row;flex-wrap:nowrap;height:48px;padding:0 16px;right:0;top:100%;transform:translateY(-48px);width:100%}.outline-reader .outline-toolbar__button{border:none;border-radius:0;box-shadow:none;flex:1}.outline-reader--reading{background-color:#fff;box-sizing:border-box;padding:0}.outline-reader__paper{box-shadow:none;height:100%;margin:0;overflow:hidden;padding:0;position:relative;z-index:1}.outline-reader__title{background-color:#fff;border-bottom:1px solid #ddd;font-size:1.8em;font-weight:400;height:48px;left:0;line-height:48px;margin:0;overflow:hidden;position:absolute;text-overflow:ellipsis;top:0;white-space:nowrap;width:100%;z-index:3}.outline-reader__article{height:calc(100% - 96px);margin:48px 0;padding:0 1.25em;scroll-timeline-name:--MobileProgressTimeline;overflow-x:hidden;overflow-y:scroll}.outline-reader__article .outline-reader__progress{animation:outline-reader-progress linear;z-index:4;animation-timeline:--MobileProgressTimeline;display:block}}@media print{body,html{background-color:#fff;color:#333;font-size:12pt;height:auto!important}a:hover,a:link,a:visited{color:#507afe;text-decoration:underline!important}audio,video{display:none!important}table{border-collapse:collapse;width:100%}td,th{border:1px solid #dcdfe6;padding:8px 20px}.outline-message,.outline-toolbar{display:none!important}.outline-reader{display:block!important;overflow:hidden}.outline-reader__title{font-size:32pt!important;margin:13.4pt 0 28pt!important;text-align:center!important}.outline-reader--reading{background-color:#fff;height:auto!important;overflow:hidden!important;padding:0!important;position:relative!important}.outline-reader__progress{display:none!important}.outline-reader__paper{box-shadow:none}.outline-reader pre{border:1px solid #ddd!important;border-radius:4px!important;padding:1em!important}.outline-reader code,.outline-reader pre{background-color:#fff!important}.outline-reader img,.outline-reader svg,.outline-reader table{break-inside:avoid}.outline-reader_sibling{display:none!important}} +.outline-icon{display:inline-block;position:relative;vertical-align:middle;z-index:1}.outline-icon,.outline-icon__svg{height:1em;overflow:hidden;width:1em}.outline-icon__svg{left:50%;position:absolute;top:50%;z-index:2;fill:currentcolor;transform:translate(-50%,-50%)}.outline-icon_hidden{display:none}.outline-message{background-color:#fff;border-radius:3px;box-shadow:0 0 6px 1px #dcdfe6;left:50%;opacity:.1;padding:0 50px;position:fixed;top:-50px;transform:translateX(-50%);transition:all .5s ease-in-out;z-index:9999}.outline-message,.outline-message__content{color:#666;font-size:13px;height:40px;line-height:40px;margin:0;overflow:hidden}.outline-message__content{max-width:700px;text-overflow:ellipsis;white-space:nowrap}.outline-message__close,.outline-message__icon{height:40px;line-height:40px;overflow:hidden;position:absolute;text-align:center;top:0;width:40px;z-index:2}.outline-message__icon{color:#fff;left:0}.outline-message__icon .outline-icon{left:50%;position:absolute;top:50%;transform:translate(-50%,-50%);z-index:2}.outline-message__close{color:#999;cursor:pointer;right:0}.outline-message__close .outline-icon{left:50%;position:absolute;top:50%;transform:translate(-50%,-50%);z-index:2}.outline-message__close:hover{color:#666}.outline-message_info .outline-message__icon{background-color:#507afe}.outline-message_warning .outline-message__icon{background-color:#ff9901}.outline-message_success .outline-message__icon{background-color:#058942}.outline-message_error .outline-message__icon{background-color:#ff5d5d}.outline-message_plain{min-width:190px;padding:0 50px 0 15px}.outline-message_plain.outline-message_info{background-color:#ecf8ff;border-left:5px solid #507afe}.outline-message_plain.outline-message_warning{background-color:#fffbe6;border-left:5px solid #ff9901}.outline-message_plain.outline-message_success{background-color:#e1f6eb;border-left:5px solid #058942}.outline-message_plain.outline-message_error{background-color:#fff1f0;border-left:5px solid #ff5d5d}.outline-message_plain .outline-message__icon{display:none;width:0}.outline-message_plain .outline-message__icon .outline-icon{display:none}.outline-message_light{min-width:180px;padding:0 40px}.outline-message_light.outline-message_info .outline-message__icon{color:#507afe}.outline-message_light.outline-message_warning .outline-message__icon{color:#ff9901}.outline-message_light.outline-message_success .outline-message__icon{color:#058942}.outline-message_light.outline-message_error .outline-message__icon{color:#ff5d5d}.outline-message_light .outline-message__icon{background-color:#fff}.outline-message_round{border-radius:20px}.outline-message_round.outline-message_default{min-width:180px;padding:0 40px}.outline-message_round.outline-message_default .outline-message__icon{border-radius:10px;height:20px;left:10px;line-height:20px;top:10px;width:20px}.outline-message_round.outline-message_default.outline-message_full-width{min-width:200px;padding:0 20px 0 40px}.outline-message_round.outline-message_plain{min-width:195px;padding:0 40px 0 20px}.outline-message_round.outline-message_plain.outline-message_full-width{min-width:215px;padding:0 20px}.outline-message_full-width{min-width:200px;padding:0 10px 0 50px}.outline-message_full-width.outline-message_plain{min-width:230px;padding:0 10px 0 15px}.outline-message_full-width.outline-message_light{min-width:210px;padding:0 10px 0 40px}.outline-message_visible{opacity:1}.outline-message_hidden{display:none} +:root{--outline-zIndex:2000;--outline-sticky-height:100%;--outline-navigator-width:100%}.outline-drawer{box-sizing:border-box;height:100%;left:0;margin:0;overflow:hidden;position:relative;top:0;visibility:hidden;width:100%;z-index:-1}.outline-drawer__modal{background-color:#fff;box-shadow:0 0 6px 1px #dcdfe6;display:flex;flex-direction:column;flex-wrap:nowrap;height:100%;overflow:hidden;position:absolute;transition-duration:.4s;z-index:21}.outline-drawer__footer,.outline-drawer__header,.outline-drawer__main{box-sizing:border-box;width:100%}.outline-drawer__footer,.outline-drawer__header{flex-shrink:0}.outline-drawer__footer,.outline-drawer__main,.outline-drawer__title{padding:0 16px}.outline-drawer__header,.outline-drawer__title{height:52px;line-height:52px;margin:0 auto;overflow:hidden;position:relative;z-index:1}.outline-drawer__title{border-bottom:1px solid #dcdfe6;box-sizing:border-box;font-size:16px;font-weight:400;margin:0 16px}.outline-drawer__close{color:#999;cursor:pointer;font-size:20px;height:20px;line-height:20px;overflow:hidden;position:absolute;right:12px;text-align:center;top:50%;transform:translateY(-50%);width:20px;z-index:2}.outline-drawer__close .outline-icon{left:0;position:absolute;top:0;z-index:2}.outline-drawer__close:hover{color:#666}.outline-drawer__main{flex:1;overflow:auto}.outline-drawer__main.overflow-hidden{overflow:hidden}.outline-drawer__footer{margin:0 auto;overflow:hidden;text-align:right}.outline-drawer__overlay{background-color:#fff;content:"";height:100%;left:0;opacity:.1;overflow:hidden;position:relative;top:0;width:100%;z-index:1}.outline-drawer_ltr.outline-drawer_tiny,.outline-drawer_rtl.outline-drawer_tiny{width:280px}.outline-drawer_ltr.outline-drawer_mini,.outline-drawer_rtl.outline-drawer_mini{width:480px}.outline-drawer_ltr.outline-drawer_small,.outline-drawer_rtl.outline-drawer_small{width:540px}.outline-drawer_ltr.outline-drawer_regular,.outline-drawer_rtl.outline-drawer_regular{width:680px}.outline-drawer_ltr.outline-drawer_medium,.outline-drawer_rtl.outline-drawer_medium{width:720px}.outline-drawer_ltr.outline-drawer_large,.outline-drawer_rtl.outline-drawer_large{width:960px}.outline-drawer_rtl{border-left:1px solid #dcdfe6}.outline-drawer_rtl.outline-drawer_tiny.outline-drawer_closed{right:-290px}.outline-drawer_rtl.outline-drawer_mini.outline-drawer_closed{right:-490px}.outline-drawer_rtl.outline-drawer_small.outline-drawer_closed{right:-550px}.outline-drawer_rtl.outline-drawer_regular.outline-drawer_closed{right:-690px}.outline-drawer_rtl.outline-drawer_medium.outline-drawer_closed{right:-730px}.outline-drawer_rtl.outline-drawer_large.outline-drawer_closed{right:-970px}.outline-drawer_ltr{border-right:1px solid #dcdfe6}.outline-drawer_ltr.outline-drawer_tiny.outline-drawer_closed{left:-290px}.outline-drawer_ltr.outline-drawer_mini.outline-drawer_closed{left:-490px}.outline-drawer_ltr.outline-drawer_small.outline-drawer_closed{left:-550px}.outline-drawer_ltr.outline-drawer_regular.outline-drawer_closed{left:-690px}.outline-drawer_ltr.outline-drawer_medium.outline-drawer_closed{left:-730px}.outline-drawer_ltr.outline-drawer_large.outline-drawer_closed{left:-970px}.outline-drawer_btt,.outline-drawer_ttb{left:0;width:100%}.outline-drawer_btt.outline-drawer_tiny,.outline-drawer_ttb.outline-drawer_tiny{height:240px}.outline-drawer_btt.outline-drawer_mini,.outline-drawer_ttb.outline-drawer_mini{height:320px}.outline-drawer_btt.outline-drawer_small,.outline-drawer_ttb.outline-drawer_small{height:360px}.outline-drawer_btt.outline-drawer_regular,.outline-drawer_ttb.outline-drawer_regular{height:400px}.outline-drawer_btt.outline-drawer_medium,.outline-drawer_ttb.outline-drawer_medium{height:440px}.outline-drawer_btt.outline-drawer_large,.outline-drawer_ttb.outline-drawer_large{height:480px}.outline-drawer_ttb{border-bottom:1px solid #dcdfe6}.outline-drawer_ttb.outline-drawer_tiny.outline-drawer_closed{top:-250px}.outline-drawer_ttb.outline-drawer_mini.outline-drawer_closed{top:-330px}.outline-drawer_ttb.outline-drawer_small.outline-drawer_closed{top:-370px}.outline-drawer_ttb.outline-drawer_regular.outline-drawer_closed{top:-410px}.outline-drawer_ttb.outline-drawer_medium.outline-drawer_closed{top:-450px}.outline-drawer_ttb.outline-drawer_large.outline-drawer_closed{top:-490px}.outline-drawer_btt{border-top:1px solid #dcdfe6;top:auto}.outline-drawer_btt.outline-drawer_tiny.outline-drawer_closed{bottom:-250px}.outline-drawer_btt.outline-drawer_mini.outline-drawer_closed{bottom:-330px}.outline-drawer_btt.outline-drawer_small.outline-drawer_closed{bottom:-370px}.outline-drawer_btt.outline-drawer_regular.outline-drawer_closed{bottom:-410px}.outline-drawer_btt.outline-drawer_medium.outline-drawer_closed{bottom:-450px}.outline-drawer_btt.outline-drawer_large.outline-drawer_closed{bottom:-490px}.outline-drawer_opened{visibility:visible;z-index:var(--outline-zIndex)}.outline-drawer_opened.outline-drawer{position:fixed}.outline-drawer_opened.outline-drawer_rtl{right:0}.outline-drawer_opened.outline-drawer_ltr{left:0}.outline-drawer_opened.outline-drawer_ttb{top:0}.outline-drawer_opened.outline-drawer_btt{bottom:0}.outline-drawer_offset.outline-drawer_ltr,.outline-drawer_offset.outline-drawer_rtl{height:calc(100% - 4em);top:50%;transform:translateY(-50%)}.outline-drawer_offset.outline-drawer_btt,.outline-drawer_offset.outline-drawer_ttb{left:50%;transform:translateX(-50%);width:calc(100% - 4em)}.outline-drawer_offset.outline-drawer_opened.outline-drawer_rtl{right:2em}.outline-drawer_offset.outline-drawer_opened.outline-drawer_ltr{left:2em}.outline-drawer_offset.outline-drawer_opened.outline-drawer_ttb{top:2em}.outline-drawer_offset.outline-drawer_opened.outline-drawer_btt{bottom:2em}.outline-drawer_auto.outline-drawer_ltr,.outline-drawer_auto.outline-drawer_rtl{height:auto;max-height:calc(100% - 4em)}.outline-drawer_full{padding:0} \ No newline at end of file diff --git a/drawer/drawer.min.js b/drawer/drawer.min.js new file mode 100644 index 00000000..8f24e5d8 --- /dev/null +++ b/drawer/drawer.min.js @@ -0,0 +1,2 @@ +!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(t="undefined"!=typeof globalThis?globalThis:t||self).Drawer=e()}(this,(function(){"use strict";const t=t=>Object.prototype.toString.apply(t),e=e=>"function"==typeof e||"[object Function]"===t(e),s=(t,s=300)=>!!e(t)&&setTimeout((()=>{t()}),s),r=s=>("[object Object]"===t(s)||"object"==typeof s||e(s))&&null!==s,i=e=>Array.isArray?Array.isArray(e):"[object Array]"===t(e),o=t=>{let e={};return null===t?null:(i(t)?e=Array.from(t):(e=Object.assign({},t),Object.keys(e).forEach((s=>e[s]=r(t[s])?o(t[s]):t[s]))),e)},l=t=>!!(r(t)&&t.nodeName&&t.tagName&&1===t.nodeType),n=e=>{return!(!r(e)||!(l(e)||(e=>!(!r(e)||"[object NodeList]"!==t(e)))(e)||(s=e,r(s)&&"[object DocumentFragment]"===t(s))||(e=>!(!r(e)||!("[object Text]"===t(e)||e.tagName&&3===e.nodeType)))(e)));var s},a=t=>"string"==typeof t,c=t=>!!a(t)&&t.replace(/(^\s+)|(\s+$)/g,""),h=["a","abbr","address","area","article","aside","audio","b","base","bdi","bdo","blockquote","body","br","button","canvas","caption","cite","code","col","colgroup","data","datalist","dd","del","details","dfn","dialog","div","dl","dt","em","embed","fieldset","figcaption","figure","footer","form","h1","h2","h3","h4","h5","h6","head","header","hgroup","hr","html","i","iframe","img","input","ins","kbd","label","legend","li","link","main","map","mark","math","menu","menuitem","meta","meter","nav","noscript","object","ol","optgroup","option","output","p","param","picture","pre","progress","q","rb","rp","rt","rtc","ruby","s","samp","script","search","section","select","slot","small","source","span","strong","style","sub","summary","sup","svg","table","tbody","td","template","textarea","tfoot","th","thead","time","title","tr","track","u","ul","var","video","wbr"],d=t=>{let e,s,r;return!!a(t)&&(e=c(t).slice(0,1e3),s=/\s*|]*>|]*>|]+>/i,r=new RegExp(h.map((t=>`<${t}\\b[^>]*>`)).join("|"),"i"),s.test(e)||r.test(e))},u=(t,e)=>{const s=new RegExp("(\\s|^)"+e+"(\\s|$)");let r,i;return!!l(t)&&(r=t.className,!!r&&(i=t.classList,i&&i.contains?t.classList.contains(e):!!s.exec(r)))},m=(t,e)=>{var s;let r,i;if(u(t,e))return!1;r=t.classList,null!==(s=r)&&void 0!==s&&s.add?e.indexOf(" ")>-1?e.split(" ").forEach((t=>{r.add(t)})):r.add(e):(i=t.className,i+=i.length>0?" "+e:e,t.className=i)},p=(t,e)=>{var s;let r,i=t.className;if(!i||!u(t,e))return!1;r=t.classList,null!==(s=r)&&void 0!==s&&s.remove?r.remove(e):(i=c(i.replace(e,"")),t.className=i)};function f(t,e){(null==e||e>t.length)&&(e=t.length);for(var s=0,r=Array(e);st.replace(/]*>.*?<\/script>/gi,""),g=(t,e)=>{const s=Object.prototype.hasOwnProperty;return t&&s.call(t,e)},z=(t,e)=>{if(!t||!r(e))return!1;Object.keys(e).forEach((s=>{const r=e[s];g(e,s)&&((t,e,s)=>{let r=t.tagName.toLowerCase();switch(e){case"style":t.style.cssText=s;break;case"value":"input"===r||"textarea"===r?t.value=s:t.setAttribute(e,s);break;case"htmlFor":t.setAttribute("for",s);break;case"className":m(t,s);break;case"innerHTML":t.innerHTML=s;break;case"innerText":t.innerText=s;break;default:t.setAttribute(e,s)}})(t,s,r)}))},w=(t,e,s)=>{const o=document.createDocumentFragment(),l=document.createElement(t),c=t=>n(t)||a(t),h=t=>{let e;if(!c(t))return!1;n(t)?e=t:a(t)&&(e=document.createTextNode(t)),o.appendChild(e)};return r(e)?z(l,e):i(e)&&e.every((t=>c(t)))?e.forEach((t=>{h(t)})):n(e)?h(e):a(e)&&h(document.createTextNode(e)),i(s)?s.forEach((t=>{h(t)})):h(s),l.appendChild(o),l};let M=2e3;const x=t=>{var e,s;return t?M=t:M+=1,e="--outline-zIndex",s=`${M}`,document.documentElement.style.setProperty(e,s),M},$=(t,e="")=>{const s=e.replace(/^>/i,"");return!!(e&&s&&t)&&(t.matches?t.matches(s):!!t.msMatchesSelector&&t.msMatchesSelector(s))},_=t=>t.host&&t!==document&&t.host.nodeType?t.host:t.parentNode,L=["focusout","blur","focusin","focus","load","unload","mouseenter","mouseleave"],C=(t,e,s)=>{const r=L.indexOf(e)>-1;s._delegateListener&&delete(s=s._delegateListener)._delegateListener,function(t,e,s){const r=t._listeners;let i=-1;if(r.length<1)return!1;r.forEach(((t,r)=>{const o=t.fn;e===t.type&&(i=r,o===s&&(i=r))})),i>-1&&r.splice(i,1)}(t,e,s),t.removeEventListener(e,s,r)},A=function(t,e,s=!1){const r=a(t)?document.querySelector(t):t,i=r.childNodes,o=((t,e)=>{let s=t._listeners||[];return a(e)&&e&&(s=s.filter((t=>t.type===e))),s})(r,e);o.forEach((t=>{C(r,t.type,t.fn)})),(s||!0===e||1===arguments.length)&&r&&i&&i.forEach((t=>{l(t)&&A(t,e,s)}))},j=(t,s,r)=>{if(!e(r))return A(t,s),!1;C(t,s,r)},T=(t,e,s,r,i,o,l=!1)=>{const n=L.indexOf(s)>-1,a=function(n){const c=function(t){const e=t.target;return(s=e)&&3===s.nodeType?s.parentNode:s;var s}(n),h=((t,e,s,r)=>{const i=s||document;if(!t)return null;do{if(null!=e&&(e.startsWith(">")?t.parentNode===i&&$(t,e):$(t,e))||r&&t===i)return t;if(t===i)break}while(t=_(t))})(c,e,t);let d=o||t;n.delegateTarget=h,!0===o&&(d=i),h&&(!0===l&&j(t,s,a),r.call(d,n,i))};if(!t)return!1;t._listeners||(t._listeners=[]),t._listeners.push({el:t,selector:e,type:s,fn:a,data:i,context:o,capture:n}),r._delegateListener=a,t.addEventListener(s,a,n)},N=y(b,['','','','','','','','','','','','','','','','','','','','']),O=(t,e="icon")=>a(t)?((t,e="icon")=>{const s=/id="(.*?)"/,r=/^(\w+)-/;return N.find((i=>{const o=s.exec(i)[1];return r.exec(o)[1]===e&&o===("icon"===e?`${e}-${t}`:`${e}-icon-${t}`)}))})(t,e):y(b,N),k=(t="")=>{const e=document.body;let s=document.querySelector("#outline-icons"),r=[];(t=>{if(!t)return!1;i(t)&&t.length>0?t.forEach((t=>{-1===N.indexOf(t)&&a(t)&&N.push(t)})):a(t)&&N.push(t)})(t),r=O(),s?s.innerHTML=r.join(""):(s=document.createElement("div"),s.innerHTML=``,e.insertBefore(s.firstChild,e.firstChild))},E=(t,e={})=>{const s="outline-icon",r=e.size||0,o=e.color||"",l=e.iconSet||"",n=i(r)?r[0]:r,c=i(r)?r[1]:r,h=r?`width:${n}px;height:${c}px;`:"",d=o?h+`color:${o}`:h,u=e.attrs||{},m=document.createElement("i");let p,f="",y="";return a(t)?((t=>{const e=new RegExp("^\\s*(?:<\\?xml[^>]*>\\s*)?(?:<\\!doctype svg[^>]*\\s*(?:\\[?(?:\\s*]*>\\s*)*\\]?)*[^>]*>\\s*)?]*>[^]*<\\/svg>\\s*$\\s*$","i");return a(t)&&e.test(t)})(t)?y=t:(f=l&&"icon"!==l?`xlink:href="#${l}-icon-${t}"`:`xlink:href="#icon-${t}"`,y=``),m.innerHTML=y,u.className?u.className=`${s} ${u.className}`:u.className=s,z(m,u),p=m.querySelector("svg"),z(p,{"aria-hidden":!0,xmlns:"http://www.w3.org/2000/svg",class:"outline-icon__svg",width:200,height:200,style:d}),m):null},B={},H=t=>g(B,t)&&B[t].length>0,S=(t,e=!0)=>e?H(t):(t=>{let e=H(t),s=t.lastIndexOf(".");for(;!e&&-1!==s;)s=(t=t.substring(0,s)).lastIndexOf("."),e=H(t);return e})(t),I=(e,s,r=!0)=>{const i=e=>{if(!H(e))return!1;B[e].forEach((e=>{const r=["[object Int8Array]","[object Uint8Array]","[object Uint8ClampedArray]","[object Int16Array]","[object Uint16Array]","[object Int32Array]","[object Uint32Array]","[object Float32Array]","[object Float64Array]","[object BigInt64Array]","[object BigUint64Array]"].indexOf(t(s))>-1?s.toString():s;e.callback.call(e.context||e,r)}))},o=()=>{let t=e,s=e.lastIndexOf(".");for(;-1!==s;)t=t.substring(0,s),s=t.lastIndexOf("."),i(t);i(e),i("*")};if(!S(e))return!1;r?setTimeout(o,10):o()},V=(()=>{let t=0;return e=>(t+=1,e?e+"-"+t:"guid-"+t)})(),D=t=>{if(!g(B,t))return!1;delete B[t]},F=(t,e)=>{if(!S(t))return!1;e?(t=>{const e=Object.keys(B);if(!t||e.length<1)return!1;e.forEach((e=>{const s=B[e];let r;s.forEach(((e,i)=>{e.callback!==t&&e.token!==t||(r=e.topic,s.splice(-1,i))})),s.length<1&&D(r)}))})(e):D(t)};class q{constructor(t){this.attrs={},this.name="component",t&&this.initialize(t)}initialize(t){return this.attr(t).render().addListeners(),this}attr(t,e){const s=this.attrs;return a(t)?e&&g(s,t)?(s[t]=e,this):s[t]:r(t)?(i=s,o=t,Object.keys(o).forEach((t=>{g(o,t)&&(i[t]=o[t])})),this):0===arguments.length?s:this;var i,o}render(){return this}refresh(){return this}destroy(){return this.removeListeners(),this}reload(t){let e=this.attr();return t&&(e=this.attr(t)),this.destroy().initialize(e),this}$emit(t,e){return I(t,e),this}$on(t,s){return((t,s,r=null)=>{const i=V();let o="symbol"==typeof t?t.toString():t;e(s)&&(B[o]||(B[o]=[]),B[o].push({topic:o,callback:s,context:r,token:i}))})(t,s,this),this}$off(t,e){return F(t,e),this}addListeners(){return this}removeListeners(){return this}}class U extends q{constructor(t){super(),this._default(),this.zIndex=0,t&&this.initialize(t)}_default(){return this.attrs=o(U.DEFAULTS),this.title="",this.closed=!1,this.$el=null,this.$modal=null,this.$header=null,this.$title=null,this.$close=null,this.$main=null,this.$footer=null,this.$overlay=null,this}initialize(t){let s;return this.attr(t),this.title=this.attr("title"),s=this.attr("created"),e(s)&&s.call(this),this.render().addListeners(),this}setTitle(t){return this.attr("title",t),this.title=t,this.$title.innerHTML=t,this}isClosed(){return this.closed}render(){const t=this.attr("mounted"),s=this.attr("size"),r=this.attr("placement"),i=this.attr("hasClose"),o=this.attr("hasOverlay"),l=this.attr("hasOffset"),n=this.attr("hasPadding"),a=this.attr("autoHeight"),c=this.attr("overflow"),h=this.attr("customClass");let d,u,p,f,y,b,v,g,z="outline-drawer__main";return k(),this.zIndex=x(),f=w("h2",{className:"outline-drawer__title"},this.title),this.$title=f,i&&(y=w("div",{className:"outline-drawer__close"},((t,e={})=>E(t,e))("close",{iconSet:"outline",size:20})),this.$close=y),p=w("header",{className:"outline-drawer__header"},[f,y]),this.$header=p,"hidden"===c&&(z+=" overflow-hidden"),b=w("div",{className:z}),this.$main=b,n||m(b,"outline-drawer_full"),v=w("footer",{className:"outline-drawer__footer"}),this.$footer=v,u=w("div",{className:`outline-drawer__modal outline-drawer_${r} outline-drawer_${s} outline-drawer_closed`},[p,b,v]),this.$modal=u,l&&m(u,"outline-drawer_offset"),a&&m(u,"outline-drawer_auto"),h&&m(u,h),o&&(g=w("div",{className:"outline-drawer__overlay"}),this.$overlay=g),d=w("div",{className:"outline-drawer"},[u,g]),this.$el=d,document.body.appendChild(d),e(t)&&t.call(this),this}erase(){return this.$main.innerHTML="",this}_paint(t){let s=null;return e(t)?s=t():n(t)?s=t:d(t)&&(s=((t,e)=>{const s=document.createDocumentFragment();if(!t||!d(t)&&!a(t)&&!l(t))return null;if(d(t)){const e=w("div");let r=[];return e.innerHTML=v(t),r=y(b,e.childNodes),r.forEach((t=>{s.appendChild(t)})),s}if(!a(e))return t.innerHTML;t.innerHTML=v(e)})(t)),s&&this.$main.appendChild(s),this}_remove(){return document.body.removeChild(this.$el),this}refresh(t){return this.erase()._paint(t),this}open(){const t=this.attr("afterOpened"),r=this.$modal;return m(this.$el,"outline-drawer_opened"),p(r,"outline-drawer_closed"),m(r,"outline-drawer_opened"),s((()=>{this.closed=!1,e(t)&&t.call(this)})),this}close(){const t=this.attr("afterClosed"),r=this.$modal;return p(r,"outline-drawer_opened"),m(r,"outline-drawer_closed"),s((()=>{p(this.$el,"outline-drawer_opened"),this.closed=!0,e(t)&&t.call(this)})),this}toggle(){const t=this.attr("afterToggle"),r=this.isClosed();return r?this.open():this.close(),e(t)&&s((()=>{t.call(this,r)})),this}destroy(){const t=this.attr("afterDestroy"),s=this.attr("beforeDestroy");let r=this.zIndex;return e(s)&&s.call(this),this.removeListeners()._remove()._default(),r-=1,x(r),this.zIndex=0,e(t)&&t.call(this),this}onClose(){return this.close(),this}addListeners(){const t=this.attr("hasClose"),e=this.attr("hasOverlay"),s=this.attr("closeOnClickModal"),r=this.$el;return t&&T(r,".outline-drawer__close","click",this.onClose,this,!0),e&&s&&T(r,".outline-drawer__overlay","click",this.onClose,this,!0),this}removeListeners(){const t=this.attr("hasClose"),e=this.attr("hasOverlay"),s=this.$el;return t||e?(j(s,"click",this.onClose),this):this}}return U.DEFAULTS=o({placement:"rtl",title:"标题",size:"regular",hasClose:!0,hasOverlay:!0,hasOffset:!1,hasPadding:!0,autoHeight:!0,closeOnClickModal:!0,overflow:"auto",created:null,mounted:null,afterClosed:null,afterOpened:null,afterScroll:null,beforeDestroy:null,afterDestroy:null,afterToggle:null}),U})); +//# sourceMappingURL=drawer.min.js.map diff --git a/drawer/drawer.min.js.map b/drawer/drawer.min.js.map new file mode 100644 index 00000000..1d7e97be --- /dev/null +++ b/drawer/drawer.min.js.map @@ -0,0 +1 @@ +{"version":3,"file":"drawer.min.js","sources":["../utils/lang/toString.js","../utils/types/isFunction.js","../utils/lang/later.js","../utils/types/isObject.js","../utils/types/isArray.js","../utils/lang/cloneDeep.js","../utils/types/isElement.js","../utils/types/isDOM.js","../utils/types/isHTMLCollection.js","../utils/types/isFragment.js","../utils/types/isTextNode.js","../utils/types/isString.js","../utils/lang/trim.js","../utils/types/tags.js","../utils/types/isHTML.js","../utils/dom/hasClass.js","../utils/dom/addClass.js","../utils/dom/removeClass.js","../utils/lang/stripScripts.js","../utils/lang/hasOwn.js","../utils/dom/setAttributes.js","../utils/dom/setAttribute.js","../utils/dom/createElement.js","../utils/dom/zIndex.js","../utils/dom/setProperty.js","../utils/dom/matches.js","../utils/dom/getParentOrHost.js","../utils/event/enum.js","../utils/event/_off.js","../utils/event/_delete.js","../utils/event/purgeElement.js","../utils/event/getListeners.js","../utils/event/off.js","../utils/event/on.js","../utils/event/getTarget.js","../utils/dom/resolveTextNode.js","../utils/dom/closest.js","../utils/icons/symbols.js","../utils/icons/defaults.js","../utils/icons/getSymbols.js","../utils/icons/getSymbol.js","../utils/icons/paint.js","../utils/icons/add.js","../utils/icons/createElement.js","../utils/types/isSVG.js","../utils/observer/_subscribers.js","../utils/observer/_hasDirectSubscribersFor.js","../utils/observer/has.js","../utils/observer/_hasSubscribers.js","../utils/observer/emit.js","../utils/types/isTypedArray.js","../utils/lang/guid.js","../utils/observer/_removeSubscriber.js","../utils/observer/off.js","../utils/observer/_removeSubscriberByToken.js","../component.js","../utils/lang/extend.js","../utils/observer/on.js","drawer.js","../utils/icons/icon.js","../utils/dom/html.js"],"sourcesContent":["/**\r\n * Object 对象原型上的 toString 方法\r\n * ========================================================================\r\n * @method toString\r\n * @param {*} val\r\n * @returns {string}\r\n */\r\nconst toString = (val) => {\r\n return Object.prototype.toString.apply(val)\r\n}\r\n\r\nexport default toString\r\n","import toString from '@/utils/lang/toString'\r\n\r\n/**\r\n * 检测测试数据是否为 Function 类型\r\n * ========================================================================\r\n * @method isFunction\r\n * @param {*} val - (必须)待检测的数据\r\n * @returns {boolean} 'val' 是 Function 类型返回 true,否则返回 false\r\n */\r\nconst isFunction = (val) => {\r\n return typeof val === 'function' || toString(val) === '[object Function]'\r\n}\r\n\r\nexport default isFunction\r\n","import isFunction from '@/utils/types/isFunction'\r\n\r\n/**\r\n * later - 延迟执行方法\r\n * ========================================================================\r\n * @method later\r\n * @param {Function} fn\r\n * @param {Number} [delay]\r\n * @returns {number|boolean}\r\n */\r\nconst later = (fn, delay = 300) => {\r\n if (!isFunction(fn)) {\r\n return false\r\n }\r\n\r\n return setTimeout(() => {\r\n fn()\r\n }, delay)\r\n}\r\n\r\nexport default later\r\n","import toString from '../lang/toString'\r\nimport isFunction from './isFunction'\r\n\r\n/**\r\n * 检测数据是否为 Object 类型\r\n * ========================================================================\r\n * @method isObject\r\n * @param {*} o\r\n * @returns {boolean}\r\n */\r\nconst isObject = (o) => {\r\n return (\r\n (toString(o) === '[object Object]' ||\r\n typeof o === 'object' ||\r\n isFunction(o)) &&\r\n o !== null\r\n )\r\n}\r\n\r\nexport default isObject\r\n","import toString from '@/utils/lang/toString'\r\n\r\n/**\r\n * 检测数据是否为 Array 类型\r\n * ========================================================================\r\n * @method isArray\r\n * @param {*} o\r\n * @returns {boolean}\r\n */\r\nconst isArray = (o) => {\r\n if (Array.isArray) {\r\n return Array.isArray(o)\r\n } else {\r\n return toString(o) === '[object Array]'\r\n }\r\n}\r\n\r\nexport default isArray\r\n","import isObject from '@/utils/types/isObject'\r\nimport isArray from '@/utils/types/isArray'\r\n\r\n/**\r\n * 深拷贝对象函数\r\n * ========================================================================\r\n * @methods cloneDeep\r\n * @param {Object} obj - 深拷贝的对象\r\n * @returns {Array|Object|*}\r\n *\r\n * @example\r\n * const arr = cloneDeep([2,3,4,6])\r\n * => [2,3,4,6]\r\n */\r\nconst cloneDeep = (obj) => {\r\n let clone = {}\r\n\r\n if (obj === null) {\r\n return null\r\n }\r\n\r\n if (isArray(obj)) {\r\n clone = Array.from(obj)\r\n } else {\r\n clone = Object.assign({}, obj)\r\n Object.keys(clone).forEach((key) => {\r\n return (clone[key] = isObject(obj[key]) ? cloneDeep(obj[key]) : obj[key])\r\n })\r\n }\r\n\r\n return clone\r\n}\r\n\r\nexport default cloneDeep\r\n","import isObject from './isObject'\r\n\r\n/**\r\n * 检测数据是否为 HTMLElement DOM 节点\r\n * ========================================================================\r\n * @method isElement\r\n * @param {*} o\r\n * @returns {boolean}\r\n */\r\nconst isElement = (o) => {\r\n return !!(isObject(o) && o.nodeName && o.tagName && o.nodeType === 1)\r\n}\r\n\r\nexport default isElement\r\n","import isObject from './isObject'\r\nimport isElement from './isElement'\r\nimport isHTMLCollection from './isHTMLCollection'\r\nimport isFragment from './isFragment'\r\nimport isTextNode from './isTextNode'\r\n\r\nconst isDOM = (el) => {\r\n return !!(\r\n isObject(el) &&\r\n (isElement(el) || isHTMLCollection(el) || isFragment(el) || isTextNode(el))\r\n )\r\n}\r\n\r\nexport default isDOM\r\n","import toString from '@/utils/lang/toString'\r\nimport isObject from './isObject'\r\n\r\nconst isHTMLCollection = (el) => {\r\n return !!(isObject(el) && toString(el) === '[object NodeList]')\r\n}\r\n\r\nexport default isHTMLCollection\r\n","import toString from '@/utils/lang/toString'\r\nimport isObject from './isObject'\r\n\r\nconst isFragment = (fragment) => {\r\n return !!(\r\n isObject(fragment) && toString(fragment) === '[object DocumentFragment]'\r\n )\r\n}\r\n\r\nexport default isFragment\r\n","import toString from '@/utils/lang/toString'\r\nimport isObject from './isObject'\r\n\r\nconst isTextNode = (el) => {\r\n return !!(\r\n isObject(el) &&\r\n (toString(el) === '[object Text]' || (el.tagName && el.nodeType === 3))\r\n )\r\n}\r\n\r\nexport default isTextNode\r\n","/**\r\n * 检测数据是否为 String 类型\r\n * ========================================================================\r\n * @method isArray\r\n * @param {*} str\r\n * @returns {boolean}\r\n */\r\nconst isString = (str) => {\r\n return typeof str === 'string'\r\n}\r\n\r\nexport default isString\r\n","import isString from '@/utils/types/isString'\r\n\r\n/**\r\n * 清楚字符串起始位置所有的空格\r\n * ========================================================================\r\n * @method trim\r\n * @param {string} str\r\n * @returns {string|Boolean}\r\n */\r\nconst trim = (str) => {\r\n if (!isString(str)) {\r\n return false\r\n }\r\n return str.replace(/(^\\s+)|(\\s+$)/g, '')\r\n}\r\n\r\nexport default trim\r\n","// HTML 合法的标签\r\nconst TAGS = [\r\n 'a',\r\n 'abbr',\r\n 'address',\r\n 'area',\r\n 'article',\r\n 'aside',\r\n 'audio',\r\n 'b',\r\n 'base',\r\n 'bdi',\r\n 'bdo',\r\n 'blockquote',\r\n 'body',\r\n 'br',\r\n 'button',\r\n 'canvas',\r\n 'caption',\r\n 'cite',\r\n 'code',\r\n 'col',\r\n 'colgroup',\r\n 'data',\r\n 'datalist',\r\n 'dd',\r\n 'del',\r\n 'details',\r\n 'dfn',\r\n 'dialog',\r\n 'div',\r\n 'dl',\r\n 'dt',\r\n 'em',\r\n 'embed',\r\n 'fieldset',\r\n 'figcaption',\r\n 'figure',\r\n 'footer',\r\n 'form',\r\n 'h1',\r\n 'h2',\r\n 'h3',\r\n 'h4',\r\n 'h5',\r\n 'h6',\r\n 'head',\r\n 'header',\r\n 'hgroup',\r\n 'hr',\r\n 'html',\r\n 'i',\r\n 'iframe',\r\n 'img',\r\n 'input',\r\n 'ins',\r\n 'kbd',\r\n 'label',\r\n 'legend',\r\n 'li',\r\n 'link',\r\n 'main',\r\n 'map',\r\n 'mark',\r\n 'math',\r\n 'menu',\r\n 'menuitem',\r\n 'meta',\r\n 'meter',\r\n 'nav',\r\n 'noscript',\r\n 'object',\r\n 'ol',\r\n 'optgroup',\r\n 'option',\r\n 'output',\r\n 'p',\r\n 'param',\r\n 'picture',\r\n 'pre',\r\n 'progress',\r\n 'q',\r\n 'rb',\r\n 'rp',\r\n 'rt',\r\n 'rtc',\r\n 'ruby',\r\n 's',\r\n 'samp',\r\n 'script',\r\n 'search',\r\n 'section',\r\n 'select',\r\n 'slot',\r\n 'small',\r\n 'source',\r\n 'span',\r\n 'strong',\r\n 'style',\r\n 'sub',\r\n 'summary',\r\n 'sup',\r\n 'svg',\r\n 'table',\r\n 'tbody',\r\n 'td',\r\n 'template',\r\n 'textarea',\r\n 'tfoot',\r\n 'th',\r\n 'thead',\r\n 'time',\r\n 'title',\r\n 'tr',\r\n 'track',\r\n 'u',\r\n 'ul',\r\n 'var',\r\n 'video',\r\n 'wbr'\r\n]\r\n\r\nexport default TAGS\r\n","import trim from '@/utils/lang/trim'\r\nimport isString from './isString'\r\nimport TAGS from './tags'\r\n\r\n/**\r\n * 检测测试数据是否为合法的 HTML 代码\r\n * ========================================================================\r\n * @method isHTML\r\n * @category Lang\r\n * @see https://github.com/sindresorhus/html-tags\r\n * @see https://github.com/sindresorhus/is-html\r\n * @param {String} str - 要检测的数据\r\n * @returns {Boolean} 'val' 为合法的 HTML 代码,返回 true,否则返回 false\r\n */\r\nconst isHTML = (str) => {\r\n let html\r\n let basic\r\n let full\r\n\r\n if (!isString(str)) {\r\n return false\r\n }\r\n\r\n // 为了提高性能,我们将其限制在合理的长度内。\r\n html = trim(str).slice(0, 1000)\r\n basic = /\\s*|]*>|]*>|]+>/i\r\n full = new RegExp(TAGS.map((tag) => `<${tag}\\\\b[^>]*>`).join('|'), 'i')\r\n\r\n return basic.test(html) || full.test(html)\r\n}\r\n\r\nexport default isHTML\r\n","import isElement from '../types/isElement'\r\n/**\r\n * 检测 DOM 节点是否包含名为 className 的样式\r\n * ========================================================================\r\n * @method hasClass\r\n * @param {HTMLElement} el - DOM 节点\r\n * @param {String} className - 样式名称\r\n * @returns {Boolean}\r\n */\r\nconst hasClass = (el, className) => {\r\n const pattern = new RegExp('(\\\\s|^)' + className + '(\\\\s|$)')\r\n let allClass\r\n let classList\r\n\r\n if (!isElement(el)) {\r\n return false\r\n }\r\n\r\n allClass = el.className\r\n\r\n if (!allClass) {\r\n return false\r\n }\r\n\r\n classList = el.classList\r\n\r\n if (classList && classList.contains) {\r\n return el.classList.contains(className)\r\n }\r\n\r\n return !!pattern.exec(allClass)\r\n}\r\n\r\nexport default hasClass\r\n","import hasClass from './hasClass'\r\n\r\n/**\r\n * 给 DOM 节点添加名为 className 的样式\r\n * ========================================================================\r\n * @method addClass\r\n * @param {HTMLElement} el - DOM 节点\r\n * @param {String} className - 样式名称\r\n * @returns {Boolean}\r\n */\r\nconst addClass = (el, className) => {\r\n let classList\r\n let allClass\r\n\r\n if (hasClass(el, className)) {\r\n return false\r\n }\r\n\r\n classList = el.classList\r\n\r\n if (classList?.add) {\r\n if (className.indexOf(' ') > -1) {\r\n className.split(' ').forEach((name) => {\r\n classList.add(name)\r\n })\r\n } else {\r\n classList.add(className)\r\n }\r\n } else {\r\n allClass = el.className\r\n allClass += allClass.length > 0 ? ' ' + className : className\r\n el.className = allClass\r\n }\r\n}\r\n\r\nexport default addClass\r\n","import trim from '../lang/trim'\r\nimport hasClass from './hasClass'\r\n\r\n/**\r\n * 移除 DOM 节点的 className 样式\r\n * ========================================================================\r\n * @method removeClass\r\n * @param {HTMLElement} el - DOM 节点\r\n * @param {String} className - 样式名称\r\n * @returns {Boolean}\r\n */\r\nconst removeClass = (el, className) => {\r\n let allClass = el.className\r\n let classList\r\n\r\n if (!allClass || !hasClass(el, className)) {\r\n return false\r\n }\r\n\r\n classList = el.classList\r\n\r\n if (classList?.remove) {\r\n classList.remove(className)\r\n } else {\r\n allClass = trim(allClass.replace(className, ''))\r\n el.className = allClass\r\n }\r\n}\r\n\r\nexport default removeClass\r\n","/**\r\n * 移除字符串中的 JavaScript 代码\r\n * ====================================================\r\n * @param {String} str\r\n * @returns {String}\r\n */\r\nconst stripScripts = (str) => {\r\n return str.replace(/]*>.*?<\\/script>/gi, '')\r\n}\r\n\r\nexport default stripScripts\r\n","/**\r\n * 检测对象自身属性中是否具有指定的属性。\r\n * ========================================================================\r\n * @method hasOwn\r\n * @param {Object} obj - (必须)检测的目标对象\r\n * @param {String} prop - (必须)属性名\r\n * @returns {Boolean}\r\n */\r\nconst hasOwn = (obj, prop) => {\r\n const hasOwnProperty = Object.prototype.hasOwnProperty\r\n return obj && hasOwnProperty.call(obj, prop)\r\n}\r\n\r\nexport default hasOwn\r\n","import isObject from '../types/isObject'\r\nimport hasOwn from '../lang/hasOwn'\r\nimport setAttribute from './setAttribute'\r\n\r\nconst setAttributes = (el, attrs) => {\r\n if (!el || !isObject(attrs)) {\r\n return false\r\n }\r\n\r\n Object.keys(attrs).forEach((attr) => {\r\n const value = attrs[attr]\r\n if (hasOwn(attrs, attr)) {\r\n setAttribute(el, attr, value)\r\n }\r\n })\r\n}\r\n\r\nexport default setAttributes\r\n","import addClass from './addClass.js'\r\n\r\n/**\r\n * 给 DOM 节点设置属性/值\r\n * ========================================================================\r\n * @method setAttribute\r\n * @param {HTMLElement} el - DOM 节点\r\n * @param {String} attr - 属性名称\r\n * @param {String|Number|Boolean} value - 属性值\r\n */\r\nconst setAttribute = (el, attr, value) => {\r\n let tagName = el.tagName.toLowerCase()\r\n\r\n switch (attr) {\r\n case 'style':\r\n el.style.cssText = value\r\n break\r\n case 'value':\r\n if (tagName === 'input' || tagName === 'textarea') {\r\n el.value = value\r\n } else {\r\n el.setAttribute(attr, value)\r\n }\r\n break\r\n case 'htmlFor':\r\n el.setAttribute('for', value)\r\n break\r\n case 'className':\r\n addClass(el, value)\r\n break\r\n case 'innerHTML':\r\n el.innerHTML = value\r\n break\r\n case 'innerText':\r\n el.innerText = value\r\n break\r\n default:\r\n el.setAttribute(attr, value)\r\n break\r\n }\r\n}\r\n\r\nexport default setAttribute\r\n","import isObject from '../types/isObject'\r\nimport isString from '../types/isString'\r\nimport isArray from '../types/isArray'\r\nimport isDOM from '../types/isDOM'\r\nimport setAttributes from './setAttributes'\r\n\r\n/**\r\n * 创建 DOM 节点,并添加属性和子节点\r\n * ========================================================================\r\n * @method createElement\r\n * @param {String} tagName - 标签名称\r\n * @param {Object|Array|HTMLElement|DocumentFragment|String} attrs - 属性对象或者子节点\r\n * @param {Array|HTMLElement|DocumentFragment|String} [children] - 子节点数组\r\n * @returns {HTMLElement}\r\n */\r\nconst createElement = (tagName, attrs, children) => {\r\n const $fragment = document.createDocumentFragment()\r\n const $el = document.createElement(tagName)\r\n const isValidChild = (child) => {\r\n return isDOM(child) || isString(child)\r\n }\r\n const append = (child) => {\r\n let $child\r\n\r\n if (!isValidChild(child)) {\r\n return false\r\n }\r\n\r\n if (isDOM(child)) {\r\n $child = child\r\n } else if (isString(child)) {\r\n $child = document.createTextNode(child)\r\n }\r\n\r\n $fragment.appendChild($child)\r\n }\r\n\r\n if (isObject(attrs)) {\r\n setAttributes($el, attrs)\r\n } else if (isArray(attrs) && attrs.every((attr) => isValidChild(attr))) {\r\n attrs.forEach((child) => {\r\n append(child)\r\n })\r\n } else if (isDOM(attrs)) {\r\n append(attrs)\r\n } else if (isString(attrs)) {\r\n append(document.createTextNode(attrs))\r\n }\r\n\r\n if (isArray(children)) {\r\n children.forEach((child) => {\r\n append(child)\r\n })\r\n } else {\r\n append(children)\r\n }\r\n\r\n $el.appendChild($fragment)\r\n\r\n return $el\r\n}\r\n\r\nexport default createElement\r\n","import setProperty from './setProperty'\r\n\r\nlet index = 2000\r\n\r\nconst zIndex = (idx) => {\r\n if (idx) {\r\n index = idx\r\n } else {\r\n index += 1\r\n }\r\n\r\n setProperty('--outline-zIndex', `${index}`)\r\n\r\n return index\r\n}\r\n\r\nexport default zIndex\r\n","const setProperty = (prop, value) => {\r\n const documentElement = document.documentElement\r\n documentElement.style.setProperty(prop, value)\r\n}\r\n\r\nexport default setProperty\r\n","/**\r\n * 获取 options 节点下匹配 selector 选择器的 DOM 节点\r\n * ========================================================================\r\n * Element.matches() 方法可以用来判断 DOM 元素是否与给定的选择器匹配,事件代理判断是\r\n * 否触发绑定的代理事件回调函数,关键就是使用 Element.matches() 辨别当前事件触发的目\r\n * 标 DOM 元素是否为事件代理所期望触发的目标。\r\n * ========================================================================\r\n * @method matches\r\n * @see https://developer.mozilla.org/en-US/docs/web/api/element/matches\r\n * @param {HTMLElement} el - (必须)DOM 元素\r\n * @param {String} selector - (必须)匹配 DOM 元素的选择器\r\n * @returns {Boolean}\r\n */\r\nconst matches = (el, selector = '') => {\r\n const sel = selector.replace(/^>/i, '')\r\n\r\n if (!selector || !sel || !el) {\r\n return false\r\n }\r\n\r\n /* istanbul ignore else */\r\n if (el.matches) {\r\n return el.matches(sel)\r\n } else if (el.msMatchesSelector) {\r\n return el.msMatchesSelector(sel)\r\n } else {\r\n return false\r\n }\r\n}\r\n\r\nexport default matches\r\n","/**\r\n * 获取 DOM 元素的父节点\r\n * ========================================================================\r\n * @method getParentOrHost\r\n * @param {*|HTMLElement} el - (必须)要获取父节点的 DOM 元素\r\n * @returns {*|HTMLElement}\r\n */\r\nconst getParentOrHost = (el) => {\r\n return el.host && el !== document && el.host.nodeType\r\n ? el.host\r\n : el.parentNode\r\n}\r\n\r\nexport default getParentOrHost\r\n","export const CAPTURE_EVENTS = [\r\n 'focusout',\r\n 'blur',\r\n 'focusin',\r\n 'focus',\r\n 'load',\r\n 'unload',\r\n 'mouseenter',\r\n 'mouseleave'\r\n]\r\n","import { CAPTURE_EVENTS } from './enum'\r\nimport _delete from './_delete'\r\n\r\n/**\r\n * (私有方法)取消 type 类型的代理事件绑定\r\n * ========================================================================\r\n * 如果没有设置 handler,则销毁 this.$options 绑定的所有符合 type 事件类型的事件绑定\r\n * ========================================================================\r\n * @method _off\r\n * @param {HTMLElement} el - (必须)取消事件绑定的 DOM 元素\r\n * @param {String} type - (必须)事件类型\r\n * @param {Function} fn - (必须)事件处理器回调函数\r\n * @private\r\n */\r\nconst _off = (el, type, fn) => {\r\n const capture = CAPTURE_EVENTS.indexOf(type) > -1\r\n\r\n /* istanbul ignore else */\r\n if (fn._delegateListener) {\r\n fn = fn._delegateListener\r\n delete fn._delegateListener\r\n }\r\n\r\n // 移除缓存的 _listeners 数据\r\n _delete(el, type, fn)\r\n\r\n el.removeEventListener(type, fn, capture)\r\n}\r\n\r\nexport default _off\r\n","/**\r\n * 删除 DOM 元素缓存的 _listeners 数据\r\n * ========================================================================\r\n * @method _delete\r\n * @param {HTMLElement} el - 要删除 listener 的 DOM 元素\r\n * @param {String} type - 事件类型(名称)\r\n * @param {Function} [fn] - 事件处理器回调函数\r\n */\r\nconst _delete = function (el, type, fn) {\r\n const listeners = el._listeners\r\n let index = -1\r\n\r\n if (listeners.length < 1) {\r\n return false\r\n }\r\n\r\n // 移除缓存的 _listeners 数据\r\n listeners.forEach((listener, i) => {\r\n const handler = listener.fn\r\n\r\n if (type === listener.type) {\r\n index = i\r\n\r\n if (handler === fn) {\r\n index = i\r\n }\r\n }\r\n })\r\n\r\n /* istanbul ignore else */\r\n if (index > -1) {\r\n listeners.splice(index, 1)\r\n }\r\n}\r\n\r\nexport default _delete\r\n","import isString from '@/utils/types/isString'\r\nimport isElement from '@/utils/types/isElement'\r\nimport getListeners from './getListeners'\r\nimport _off from './_off'\r\n\r\n/**\r\n * 销毁(type 类型的)代理事件绑定\r\n * ========================================================================\r\n * 1. 设置了事件类型 type,则销毁指定类型的事件绑定,否则清除所有代理事件绑定\r\n * 2. recurse 设置为 true,递归销毁子节点全部事件绑定\r\n * ========================================================================\r\n * @method purgeElement\r\n * @param {HTMLElement|String} el - (必须)DOM 元素或者其选择器\r\n * @param {String|Boolean} type - (必须)事件类型\r\n * @param {Boolean} [recurse] - (可选)是否递归销毁子节点所有事件绑定\r\n */\r\nconst purgeElement = function (el, type, recurse = false) {\r\n const $element = isString(el) ? document.querySelector(el) : el\r\n const $children = $element.childNodes\r\n const listeners = getListeners($element, type)\r\n\r\n listeners.forEach((listener) => {\r\n _off($element, listener.type, listener.fn)\r\n })\r\n\r\n if (\r\n (recurse || type === true || arguments.length === 1) &&\r\n $element &&\r\n $children\r\n ) {\r\n $children.forEach(($child) => {\r\n if (isElement($child)) {\r\n purgeElement($child, type, recurse)\r\n }\r\n })\r\n }\r\n}\r\n\r\nexport default purgeElement\r\n","import isString from '@/utils/types/isString'\r\n\r\n/**\r\n * 获取 DOM 元素(type 事件类型)事件绑定信息\r\n * ========================================================================\r\n * 如果设置了事件类型 type, 则返回指定类型的事件绑定信息,否则返回所有事件绑定信息\r\n * ========================================================================\r\n * @methods getListeners\r\n * @param {HTMLElement} el - (必须)要获取事件绑定信息的 DOM 元素\r\n * @param {String} [type] - (可选)事件类型\r\n * @returns {Array} - 已绑定的事件信息\r\n */\r\nconst getListeners = (el, type) => {\r\n let listeners = el._listeners || []\r\n\r\n if (isString(type) && type) {\r\n listeners = listeners.filter((listener) => {\r\n return listener.type === type\r\n })\r\n }\r\n\r\n return listeners\r\n}\r\n\r\nexport default getListeners\r\n","import purgeElement from './purgeElement'\r\nimport isFunction from '../types/isFunction'\r\nimport _off from './_off'\r\n\r\n/**\r\n * 取消 type 类型的代理事件绑定\r\n * ========================================================================\r\n * 如果没有设置 handler,则销毁 this.$options 绑定的所有符合 type 事件类型的事件绑定\r\n * ========================================================================\r\n * @method off\r\n * @param {HTMLElement|Object} el - (必须)取消事件绑定的 DOM 元素\r\n * @param {String} type - (必须)事件类型\r\n * @param {Function} [fn] - (可选)事件处理器回调函数\r\n */\r\nconst off = (el, type, fn) => {\r\n // 如果不设置 fn 参数,默认清除 el 元素上绑定的所有事件处理器\r\n if (!isFunction(fn)) {\r\n purgeElement(el, type)\r\n return false\r\n }\r\n\r\n _off(el, type, fn)\r\n}\r\n\r\nexport default off\r\n","import closest from '@/utils/dom/closest'\r\nimport off from './off'\r\nimport getTarget from './getTarget'\r\n\r\nimport { CAPTURE_EVENTS } from './enum'\r\n\r\n/**\r\n * 绑定代理事件\r\n * ========================================================================\r\n * @method on\r\n * @param {HTMLElement|String|Object} el - (必须)绑定代理事件的 DOM 节点\r\n * @param {String} selector - (必须)事件代理目标 DOM 元素的选择器\r\n * @param {String|Function} type - (必须)事件类型或者事件处理器回调函数\r\n * @param {Function|Object} fn - (可选) 事件处理器回调函数或者传递给事件处理器回调函数的数据对象\r\n * @param {Object|Boolean} [data] - (可选)传递给事件处理器回调函数的数据对象或者事件处理器回调函数的 this 上下文指向,\r\n * @param {Object|Boolean} [context] - (可选)事件处理器回调函数的 this 上下文指向,或者是否仅触发一次\r\n * 当设置为 true 时,则事件处理器回调函数的 this 上下文指向为 data 对象\r\n * @param {Boolean} once - (可选)是否仅触发一次\r\n */\r\nconst on = (el, selector, type, fn, data, context, once = false) => {\r\n // CAPTURE_EVENTS 中的特殊事件,采用事件捕获模型\r\n const capture = CAPTURE_EVENTS.indexOf(type) > -1\r\n\r\n const listener = function (evt) {\r\n const target = getTarget(evt)\r\n // 通过 Element.matches 方法获得点击的目标元素\r\n const delegateTarget = closest(target, selector, el)\r\n let overrideContext = context || el\r\n\r\n evt.delegateTarget = delegateTarget\r\n\r\n // 当设置为 true 时,则事件处理器回调函数的\r\n // this 上下文指向为 data 对象\r\n if (context === true) {\r\n overrideContext = data\r\n }\r\n\r\n /* istanbul ignore else */\r\n if (delegateTarget) {\r\n // 仅触发一次\r\n /* istanbul ignore else */\r\n if (once === true) {\r\n off(el, type, listener)\r\n }\r\n\r\n fn.call(overrideContext, evt, data)\r\n }\r\n }\r\n\r\n if (!el) {\r\n return false\r\n }\r\n\r\n if (!el._listeners) {\r\n el._listeners = []\r\n }\r\n\r\n // 缓存 options 元素绑定的事件处理器\r\n el._listeners.push({\r\n el,\r\n selector,\r\n type,\r\n fn: listener,\r\n data,\r\n context,\r\n capture\r\n })\r\n\r\n // 缓存包装后的事件处理器\r\n fn._delegateListener = listener\r\n\r\n el.addEventListener(type, listener, capture)\r\n}\r\n\r\nexport default on\r\n","import resolveTextNode from '@/utils/dom/resolveTextNode'\r\n\r\n/**\r\n * 返回触发事件的 target DOM 元素\r\n * ========================================================================\r\n * @method getTarget\r\n * @param {Event} evt - Event 对象\r\n * @return {HTMLElement} - Event 对象的 target DOM 元素\r\n */\r\nconst getTarget = function (evt) {\r\n const target = evt.target\r\n\r\n return resolveTextNode(target)\r\n}\r\n\r\nexport default getTarget\r\n","/**\r\n * 在某些情况下,某些浏览器(例如:Safari 浏览器)会返回实际的目标元素内部的文本节点。\r\n * resolveTextNode() 方法则会返回实际的目标节点。\r\n * ========================================================================\r\n * @method resolveTextNode\r\n * @param {HTMLElement|Text} el - 要解析的节点\r\n * @return {*|HTMLElement} - 实际的目标 DOM 节点\r\n */\r\nconst resolveTextNode = function (el) {\r\n if (el && el.nodeType === 3) {\r\n return el.parentNode\r\n }\r\n\r\n return el\r\n}\r\n\r\nexport default resolveTextNode\r\n","import matches from './matches'\r\nimport getParentOrHost from './getParentOrHost'\r\n\r\n/**\r\n * 获取 options 元素父元素最近的包含 selector 选择器的元素\r\n * ========================================================================\r\n * @method closest\r\n * @param {HTMLElement} el - (必须)DOM 元素\r\n * @param {String} selector - (必须)DOM 元素的选择其\r\n * @param {HTMLElement} [ctx] - (必须)比对的 DOM 元素\r\n * @param {Boolean} [includeCTX] - (必须)是否包含 context DOM 元素\r\n * @returns {null|HTMLElement} - 返回最接近的 DOM 元素\r\n */\r\nconst closest = (el, selector, ctx, includeCTX) => {\r\n const context = ctx || document\r\n\r\n if (!el) {\r\n return null\r\n }\r\n\r\n do {\r\n /* istanbul ignore else */\r\n if (\r\n (selector != null &&\r\n (selector.startsWith('>')\r\n ? el.parentNode === context && matches(el, selector)\r\n : matches(el, selector))) ||\r\n (includeCTX && el === context)\r\n ) {\r\n return el\r\n }\r\n\r\n /* istanbul ignore else */\r\n if (el === context) {\r\n break\r\n }\r\n\r\n /* jshint boss:true */\r\n } while ((el = getParentOrHost(el)))\r\n}\r\n\r\nexport default closest\r\n","import DEFAULTS from './defaults'\r\n\r\nconst SYMBOLS = [...DEFAULTS]\r\n\r\nexport default SYMBOLS\r\n","const DEFAULTS = [\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n ''\r\n]\r\n\r\nexport default DEFAULTS\r\n","import isString from '@/utils/types/isString'\r\nimport getSymbol from './getSymbol'\r\nimport SYMBOLS from './symbols'\r\n\r\n/**\r\n *\r\n * @method getSymbols\r\n * @param {String} [name]\r\n * @param {String} [iconSet]\r\n * @returns {string[]|*}\r\n */\r\nconst getSymbols = (name, iconSet = 'icon') => {\r\n if (isString(name)) {\r\n return getSymbol(name, iconSet)\r\n }\r\n\r\n return [...SYMBOLS]\r\n}\r\n\r\nexport default getSymbols\r\n","import SYMBOLS from './symbols'\r\n\r\n/**\r\n * @method getSymbol\r\n * @param {String} name\r\n * @param {String} [iconSet]\r\n * @returns {String}\r\n */\r\nconst getSymbol = (name, iconSet = 'icon') => {\r\n const patternName = /id=\"(.*?)\"/\r\n const patternSet = /^(\\w+)-/\r\n const symbols = SYMBOLS\r\n\r\n return symbols.find((symbol) => {\r\n const names = patternName.exec(symbol)\r\n const fullName = names[1]\r\n const sets = patternSet.exec(fullName)\r\n const setName = sets[1]\r\n const iconName =\r\n iconSet === 'icon' ? `${iconSet}-${name}` : `${iconSet}-icon-${name}`\r\n\r\n return setName === iconSet && fullName === iconName\r\n })\r\n}\r\n\r\nexport default getSymbol\r\n","import add from './add'\r\nimport getSymbols from './getSymbols'\r\n\r\n/**\r\n * 绘制 SVG 图标集\r\n * ========================================================================\r\n * @method paint\r\n * @param {String|Array} symbol\r\n */\r\nconst paint = (symbol = '') => {\r\n const $body = document.body\r\n let $icons = document.querySelector('#outline-icons')\r\n let symbols = []\r\n\r\n add(symbol)\r\n symbols = getSymbols()\r\n\r\n if ($icons) {\r\n $icons.innerHTML = symbols.join('')\r\n } else {\r\n $icons = document.createElement('div')\r\n $icons.innerHTML =\r\n ``\r\n $body.insertBefore($icons.firstChild, $body.firstChild)\r\n }\r\n}\r\n\r\nexport default paint\r\n","import isArray from '@/utils/types/isArray'\r\nimport isString from '@/utils/types/isString'\r\nimport SYMBOLS from './symbols'\r\n\r\n/**\r\n * @method add\r\n * @param {Array|String} symbols\r\n * @return {Boolean}\r\n */\r\nconst add = (symbols) => {\r\n if (!symbols) {\r\n return false\r\n }\r\n\r\n if (isArray(symbols) && symbols.length > 0) {\r\n symbols.forEach((symbol) => {\r\n /* istanbul ignore else */\r\n if (SYMBOLS.indexOf(symbol) === -1 && isString(symbol)) {\r\n SYMBOLS.push(symbol)\r\n }\r\n })\r\n } else {\r\n /* istanbul ignore else */\r\n if (isString(symbols)) {\r\n SYMBOLS.push(symbols)\r\n }\r\n }\r\n}\r\n\r\nexport default add\r\n","import isArray from '@/utils/types/isArray'\r\nimport isString from '@/utils/types/isString'\r\nimport isSVG from '@/utils/types/isSVG'\r\nimport setAttributes from '@/utils/dom/setAttributes'\r\n\r\n/**\r\n * 创建 SVG 图标 DOM 元素\r\n * ========================================================================\r\n * @method createElement\r\n * @param {String} name\r\n * @param {Object} [options]\r\n * @param {Number|Array} [options.size]\r\n * @param {String} [options.color]\r\n * @param {String} [options.iconSet]\r\n * @param {Object} [options.attrs]\r\n * @returns {HTMLElement}\r\n */\r\nconst createElement = (name, options = {}) => {\r\n const ICON = 'outline-icon'\r\n const size = options.size || 0\r\n const color = options.color || ''\r\n const iconSet = options.iconSet || ''\r\n const width = isArray(size) ? size[0] : size\r\n const height = isArray(size) ? size[1] : size\r\n const defaultRules = size ? `width:${width}px;height:${height}px;` : ''\r\n const cssRules = color ? defaultRules + `color:${color}` : defaultRules\r\n const attrs = options.attrs || {}\r\n const $icon = document.createElement('i')\r\n let binds = ''\r\n let svg = ''\r\n let $svg\r\n\r\n if (!isString(name)) {\r\n return null\r\n }\r\n\r\n if (isSVG(name)) {\r\n svg = name\r\n } else {\r\n binds =\r\n iconSet && iconSet !== 'icon'\r\n ? `xlink:href=\"#${iconSet}-icon-${name}\"`\r\n : `xlink:href=\"#icon-${name}\"`\r\n svg = ``\r\n }\r\n\r\n $icon.innerHTML = svg\r\n\r\n if (attrs.className) {\r\n attrs.className = `${ICON} ${attrs.className}`\r\n } else {\r\n attrs.className = ICON\r\n }\r\n\r\n setAttributes($icon, attrs)\r\n\r\n $svg = $icon.querySelector('svg')\r\n setAttributes($svg, {\r\n 'aria-hidden': true,\r\n xmlns: 'http://www.w3.org/2000/svg',\r\n class: 'outline-icon__svg',\r\n width: 200,\r\n height: 200,\r\n style: cssRules\r\n })\r\n\r\n return $icon\r\n}\r\n\r\nexport default createElement\r\n","import isString from './isString'\r\n\r\nconst isSVG = (str) => {\r\n const declaration = '(?:<\\\\?xml[^>]*>\\\\s*)?'\r\n const doctype =\r\n '(?:<\\\\!doctype svg[^>]*\\\\s*(?:\\\\[?(?:\\\\s*]*>\\\\s*)*\\\\]?)*[^>]*>\\\\s*)?'\r\n const content = ']*>[^]*<\\\\/svg>\\\\s*$'\r\n const svg = `^\\\\s*${declaration}${doctype}${content}\\\\s*$`\r\n const pattern = new RegExp(svg, 'i')\r\n\r\n return isString(str) && pattern.test(str)\r\n}\r\n\r\nexport default isSVG\r\n","/**\r\n * 存储订阅者(主题和处理器的)私有对象\r\n * ========================================================================\r\n * @type {{}}\r\n * @private\r\n */\r\nconst _subscribers = {}\r\n\r\nexport default _subscribers\r\n","import hasOwn from '@/utils/lang/hasOwn'\r\nimport _subscribers from './_subscribers'\r\n\r\n/**\r\n * 判断是否存在与给定 topic 完全匹配的订阅者信息\r\n * ========================================================================\r\n * @method _hasDirectSubscribersFor\r\n * @param {String} topic - (必须)订阅主题字符串\r\n * @returns {Boolean}\r\n */\r\nconst _hasDirectSubscribersFor = (topic) => {\r\n return hasOwn(_subscribers, topic) && _subscribers[topic].length > 0\r\n}\r\n\r\nexport default _hasDirectSubscribersFor\r\n","import _hasDirectSubscribersFor from './_hasDirectSubscribersFor'\r\nimport _hasSubscribers from './_hasSubscribers'\r\n\r\n/**\r\n * 判断是否存在包含 topic 指定的订阅者信息\r\n * ========================================================================\r\n * @method has\r\n * @param {String} topic - (必须)主题名称\r\n * @param {Boolean} [isDirect] - (可选)是否为直接的主题,默认值:true\r\n * @returns {Boolean}\r\n */\r\nconst has = (topic, isDirect = true) => {\r\n return isDirect ? _hasDirectSubscribersFor(topic) : _hasSubscribers(topic)\r\n}\r\n\r\nexport default has\r\n","import _hasDirectSubscribersFor from './_hasDirectSubscribersFor'\r\n\r\n/**\r\n * 判断是否存在包含给定 topic 相关的订阅者信息\r\n * ========================================================================\r\n * @method _hasSubscribers\r\n * @param {String} topic - (必须)订阅主题字符串\r\n * @returns {Boolean}\r\n */\r\nconst _hasSubscribers = (topic) => {\r\n let found = _hasDirectSubscribersFor(topic)\r\n let position = topic.lastIndexOf('.')\r\n\r\n while (!found && position !== -1) {\r\n topic = topic.substring(0, position)\r\n position = topic.lastIndexOf('.')\r\n found = _hasDirectSubscribersFor(topic)\r\n }\r\n\r\n return found\r\n}\r\n\r\nexport default _hasSubscribers\r\n","import isTypedArray from '@/utils/types/isTypedArray'\r\nimport has from './has'\r\nimport _hasDirectSubscribersFor from './_hasDirectSubscribersFor'\r\nimport _subscribers from './_subscribers'\r\n\r\n/**\r\n * (异步)发布订阅主题信息\r\n * ========================================================================\r\n * 主题默认是异步发布的。确保在消费者处理主题时,主题的发起者不会被阻止。\r\n * ========================================================================\r\n * @method emit\r\n * @param {String} topic - (必须)主题名称\r\n * @param {Object} [data] - (可选)数据对象\r\n * @param {Boolean} [async] - (可选) 是否异步发布\r\n */\r\nconst emit = (topic, data, async = true) => {\r\n const execute = (topic) => {\r\n if (!_hasDirectSubscribersFor(topic)) {\r\n return false\r\n }\r\n\r\n _subscribers[topic].forEach((subscriber) => {\r\n // 针对 mqtt 消息服务返回的 Uint8Array 类似的 typed arrays 格式的数据\r\n // 采用 toString() 方法转化为普通(JSON)字符串\r\n const message = isTypedArray(data) ? data.toString() : data\r\n\r\n subscriber.callback.call(subscriber.context || subscriber, message)\r\n })\r\n }\r\n const deliver = () => {\r\n let subscriber = topic\r\n let position = topic.lastIndexOf('.')\r\n\r\n while (position !== -1) {\r\n subscriber = subscriber.substring(0, position)\r\n position = subscriber.lastIndexOf('.')\r\n\r\n execute(subscriber)\r\n }\r\n\r\n // 执行 topic 对应的处理器\r\n execute(topic)\r\n // 执行特殊 topic:'*'(监听全部消息的发布)\r\n execute('*')\r\n }\r\n\r\n if (!has(topic)) {\r\n return false\r\n }\r\n\r\n if (async) {\r\n setTimeout(deliver, 10)\r\n } else {\r\n deliver()\r\n }\r\n}\r\n\r\nexport default emit\r\n","import toString from '@/utils/lang/toString'\r\n/**\r\n * 判断检测数据是否为 Typed Arrays 类型的数据\r\n * ========================================================================\r\n * @param {*} val\r\n * @returns {boolean}\r\n */\r\nconst isTypedArray = (val) => {\r\n const TYPES = [\r\n '[object Int8Array]',\r\n '[object Uint8Array]',\r\n '[object Uint8ClampedArray]',\r\n '[object Int16Array]',\r\n '[object Uint16Array]',\r\n '[object Int32Array]',\r\n '[object Uint32Array]',\r\n '[object Float32Array]',\r\n '[object Float64Array]',\r\n '[object BigInt64Array]',\r\n '[object BigUint64Array]'\r\n ]\r\n\r\n return TYPES.indexOf(toString(val)) > -1\r\n}\r\n\r\nexport default isTypedArray\r\n","/**\r\n * 生成唯一 id 字符串的函数\r\n * ========================================================================\r\n * @method guid\r\n * @param {String} [prefix] - 生成 id 的前缀字符串\r\n * @return {String} 返回一个表示唯一 id 的字符串\r\n */\r\nconst guid = (() => {\r\n let uuid = 0\r\n\r\n return (prefix) => {\r\n uuid += 1\r\n\r\n return prefix ? prefix + '-' + uuid : 'guid-' + uuid\r\n }\r\n})()\r\n\r\nexport default guid\r\n","import hasOwn from '@/utils/lang/hasOwn'\r\nimport _subscribers from './_subscribers'\r\n\r\n/**\r\n * 删除与给定 topic 相同的订阅者信息\r\n * ========================================================================\r\n * @method _removeSubscriber\r\n * @param {String} topic - (必须)订阅主题字符串\r\n * @returns {Boolean}\r\n */\r\nconst _removeSubscriber = (topic) => {\r\n if (!hasOwn(_subscribers, topic)) {\r\n return false\r\n }\r\n\r\n delete _subscribers[topic]\r\n}\r\n\r\nexport default _removeSubscriber\r\n","import has from './has'\r\nimport _removeSubscriber from './_removeSubscriber'\r\nimport _removeSubscriberByToken from './_removeSubscriberByToken'\r\n\r\n/**\r\n * 取消订阅主题\r\n * ========================================================================\r\n * @method off\r\n * @param {String} topic - (必须)订阅的主题\r\n * @param {Function|String} [token] - (可选)订阅主题的处理器函数或者唯一 Id 值\r\n */\r\nconst off = (topic, token) => {\r\n if (!has(topic)) {\r\n return false\r\n }\r\n\r\n if (token) {\r\n _removeSubscriberByToken(token)\r\n } else {\r\n _removeSubscriber(topic)\r\n }\r\n}\r\n\r\nexport default off\r\n","import _subscribers from './_subscribers'\r\nimport _removeSubscriber from './_removeSubscriber'\r\n\r\n/**\r\n * 通过订阅者 token 值删除订阅者信息\r\n * ========================================================================\r\n * @method _removeSubscriberByToken\r\n * @param {String} token - 订阅者 token 字符串\r\n * @returns {boolean}\r\n * @private\r\n */\r\nconst _removeSubscriberByToken = (token) => {\r\n const keys = Object.keys(_subscribers)\r\n let index = -1\r\n\r\n if (!token || keys.length < 1) {\r\n return false\r\n }\r\n\r\n keys.forEach((subject) => {\r\n const subscriber = _subscribers[subject]\r\n let topic\r\n\r\n subscriber.forEach((execution, j) => {\r\n if (execution.callback === token || execution.token === token) {\r\n topic = execution.topic\r\n subscriber.splice(index, j)\r\n }\r\n })\r\n\r\n /* istanbul ignore else */\r\n if (subscriber.length < 1) {\r\n _removeSubscriber(topic)\r\n }\r\n })\r\n}\r\n\r\nexport default _removeSubscriberByToken\r\n","import isString from './utils/types/isString'\r\n\r\nimport extend from './utils/lang/extend'\r\nimport hasOwn from './utils/lang/hasOwn'\r\n\r\nimport isObject from './utils/types/isObject'\r\n\r\nimport publish from './utils/observer/emit'\r\nimport subscribe from './utils/observer/on'\r\nimport unsubscribe from './utils/observer/off'\r\n\r\nclass Component {\r\n constructor(options) {\r\n this.attrs = {}\r\n this.name = 'component'\r\n\r\n if (options) {\r\n this.initialize(options)\r\n }\r\n }\r\n\r\n initialize(options) {\r\n this.attr(options).render().addListeners()\r\n return this\r\n }\r\n\r\n attr(prop, value) {\r\n const attrs = this.attrs\r\n\r\n if (isString(prop)) {\r\n // 只能扩展 attrs 中已有的属性\r\n if (value && hasOwn(attrs, prop)) {\r\n // 更新单个配置信息\r\n attrs[prop] = value\r\n return this\r\n }\r\n\r\n // 只传递 prop 参数,则返回对应的属性值\r\n return attrs[prop]\r\n } else if (isObject(prop)) {\r\n // 批量更新配置信息\r\n extend(attrs, prop)\r\n\r\n return this\r\n } else if (arguments.length === 0) {\r\n // 不传递参数,直接返回整个\r\n return attrs\r\n }\r\n\r\n return this\r\n }\r\n\r\n render() {\r\n return this\r\n }\r\n\r\n refresh() {\r\n return this\r\n }\r\n\r\n destroy() {\r\n this.removeListeners()\r\n return this\r\n }\r\n\r\n reload(options) {\r\n let attrs = this.attr()\r\n\r\n if (options) {\r\n attrs = this.attr(options)\r\n }\r\n\r\n this.destroy().initialize(attrs)\r\n\r\n return this\r\n }\r\n\r\n $emit(event, data) {\r\n publish(event, data)\r\n return this\r\n }\r\n\r\n $on(event, callback) {\r\n subscribe(event, callback, this)\r\n return this\r\n }\r\n\r\n $off(event, callback) {\r\n unsubscribe(event, callback)\r\n return this\r\n }\r\n\r\n addListeners() {\r\n return this\r\n }\r\n\r\n removeListeners() {\r\n return this\r\n }\r\n}\r\n\r\nexport default Component\r\n","import hasOwn from './hasOwn'\r\n\r\n/**\r\n * 扩展对象\r\n * ========================================================================\r\n * @method extend\r\n * @param {Object} origin\r\n * @param {Object} source\r\n */\r\nconst extend = (origin, source) => {\r\n const keys = Object.keys(source)\r\n\r\n keys.forEach((prop) => {\r\n if (hasOwn(source, prop)) {\r\n origin[prop] = source[prop]\r\n }\r\n })\r\n}\r\n\r\nexport default extend\r\n","import isFunction from '@/utils/types/isFunction'\r\nimport guid from '@/utils/lang/guid'\r\n\r\nimport _subscribers from './_subscribers'\r\n\r\n/**\r\n * 订阅主题,并给出处理器函数\r\n * ========================================================================\r\n * @method on\r\n * @param {String} topic - (必须)主题名称\r\n * @param {Function} handler - (必须)主题的处理器函数\r\n * @param {Object} [context] - (可选)指定 this 执行上下文\r\n * @return {String} - 唯一的 token 字符串,例如:'guid-1'。\r\n */\r\nconst on = (topic, handler, context = null) => {\r\n const token = guid()\r\n let subject = typeof topic === 'symbol' ? topic.toString() : topic\r\n\r\n if (!isFunction(handler)) {\r\n return ''\r\n }\r\n\r\n /* istanbul ignore else */\r\n if (!_subscribers[subject]) {\r\n _subscribers[subject] = []\r\n }\r\n\r\n _subscribers[subject].push({\r\n topic: subject,\r\n callback: handler,\r\n context,\r\n token\r\n })\r\n\r\n return token\r\n}\r\n\r\nexport default on\r\n","import later from '@/utils/lang/later'\r\nimport cloneDeep from '@/utils/lang/cloneDeep'\r\nimport isFunction from '@/utils/types/isFunction'\r\nimport isDOM from '@/utils/types/isDOM'\r\nimport isHTML from '@/utils/types/isHTML'\r\nimport addClass from '@/utils/dom/addClass'\r\nimport removeClass from '@/utils/dom/removeClass'\r\nimport html from '@/utils/dom/html'\r\nimport createElement from '@/utils/dom/createElement'\r\nimport zIndex from '@/utils/dom/zIndex'\r\nimport on from '@/utils/event/on'\r\nimport off from '@/utils/event/off'\r\n\r\nimport paint from '@/utils/icons/paint'\r\nimport icon from '@/utils/icons/icon'\r\n\r\nimport Component from '@/component'\r\n\r\nimport './drawer.less'\r\n\r\nclass Drawer extends Component {\r\n constructor(options) {\r\n super()\r\n\r\n this._default()\r\n\r\n this.zIndex = 0\r\n\r\n if (options) {\r\n this.initialize(options)\r\n }\r\n }\r\n\r\n _default() {\r\n this.attrs = cloneDeep(Drawer.DEFAULTS)\r\n this.title = ''\r\n this.closed = false\r\n\r\n this.$el = null\r\n this.$modal = null\r\n this.$header = null\r\n this.$title = null\r\n this.$close = null\r\n this.$main = null\r\n this.$footer = null\r\n this.$overlay = null\r\n\r\n return this\r\n }\r\n\r\n initialize(options) {\r\n let created\r\n\r\n this.attr(options)\r\n\r\n this.title = this.attr('title')\r\n created = this.attr('created')\r\n\r\n if (isFunction(created)) {\r\n created.call(this)\r\n }\r\n\r\n this.render().addListeners()\r\n return this\r\n }\r\n\r\n setTitle(title) {\r\n this.attr('title', title)\r\n this.title = title\r\n this.$title.innerHTML = title\r\n\r\n return this\r\n }\r\n\r\n isClosed() {\r\n return this.closed\r\n }\r\n\r\n render() {\r\n const mounted = this.attr('mounted')\r\n const size = this.attr('size')\r\n const placement = this.attr('placement')\r\n const hasClose = this.attr('hasClose')\r\n const hasOverlay = this.attr('hasOverlay')\r\n const hasOffset = this.attr('hasOffset')\r\n const hasPadding = this.attr('hasPadding')\r\n const autoHeight = this.attr('autoHeight')\r\n const overflow = this.attr('overflow')\r\n const customClass = this.attr('customClass')\r\n let mainClassName = 'outline-drawer__main'\r\n let $el\r\n let $modal\r\n let $header\r\n let $title\r\n let $close\r\n let $main\r\n let $footer\r\n let $overlay\r\n\r\n paint()\r\n this.zIndex = zIndex()\r\n\r\n $title = createElement(\r\n 'h2',\r\n {\r\n className: 'outline-drawer__title'\r\n },\r\n this.title\r\n )\r\n this.$title = $title\r\n\r\n if (hasClose) {\r\n $close = createElement(\r\n 'div',\r\n {\r\n className: 'outline-drawer__close'\r\n },\r\n icon('close', { iconSet: 'outline', size: 20 })\r\n )\r\n this.$close = $close\r\n }\r\n\r\n $header = createElement(\r\n 'header',\r\n {\r\n className: 'outline-drawer__header'\r\n },\r\n [$title, $close]\r\n )\r\n this.$header = $header\r\n\r\n if (overflow === 'hidden') {\r\n mainClassName += ' overflow-hidden'\r\n }\r\n\r\n $main = createElement('div', {\r\n className: mainClassName\r\n })\r\n this.$main = $main\r\n\r\n if (!hasPadding) {\r\n addClass($main, 'outline-drawer_full')\r\n }\r\n\r\n $footer = createElement('footer', {\r\n className: 'outline-drawer__footer'\r\n })\r\n this.$footer = $footer\r\n\r\n $modal = createElement(\r\n 'div',\r\n {\r\n className: `outline-drawer__modal outline-drawer_${placement} outline-drawer_${size} outline-drawer_closed`\r\n },\r\n [$header, $main, $footer]\r\n )\r\n this.$modal = $modal\r\n\r\n if (hasOffset) {\r\n addClass($modal, 'outline-drawer_offset')\r\n }\r\n\r\n if (autoHeight) {\r\n addClass($modal, 'outline-drawer_auto')\r\n }\r\n\r\n if (customClass) {\r\n addClass($modal, customClass)\r\n }\r\n\r\n if (hasOverlay) {\r\n $overlay = createElement('div', {\r\n className: 'outline-drawer__overlay'\r\n })\r\n this.$overlay = $overlay\r\n }\r\n\r\n $el = createElement(\r\n 'div',\r\n {\r\n className: `outline-drawer`\r\n },\r\n [$modal, $overlay]\r\n )\r\n this.$el = $el\r\n document.body.appendChild($el)\r\n\r\n if (isFunction(mounted)) {\r\n mounted.call(this)\r\n }\r\n\r\n return this\r\n }\r\n\r\n erase() {\r\n this.$main.innerHTML = ''\r\n return this\r\n }\r\n\r\n _paint(content) {\r\n let $content = null\r\n\r\n if (isFunction(content)) {\r\n $content = content()\r\n } else if (isDOM(content)) {\r\n $content = content\r\n } else if (isHTML(content)) {\r\n $content = html(content)\r\n }\r\n\r\n if ($content) {\r\n this.$main.appendChild($content)\r\n }\r\n\r\n return this\r\n }\r\n\r\n _remove() {\r\n document.body.removeChild(this.$el)\r\n return this\r\n }\r\n\r\n refresh(content) {\r\n this.erase()._paint(content)\r\n return this\r\n }\r\n\r\n open() {\r\n const opened = this.attr('afterOpened')\r\n const $modal = this.$modal\r\n\r\n addClass(this.$el, 'outline-drawer_opened')\r\n removeClass($modal, 'outline-drawer_closed')\r\n addClass($modal, 'outline-drawer_opened')\r\n\r\n later(() => {\r\n this.closed = false\r\n\r\n if (isFunction(opened)) {\r\n opened.call(this)\r\n }\r\n })\r\n\r\n return this\r\n }\r\n\r\n close() {\r\n const closed = this.attr('afterClosed')\r\n const $modal = this.$modal\r\n\r\n removeClass($modal, 'outline-drawer_opened')\r\n addClass($modal, 'outline-drawer_closed')\r\n\r\n later(() => {\r\n removeClass(this.$el, 'outline-drawer_opened')\r\n this.closed = true\r\n\r\n if (isFunction(closed)) {\r\n closed.call(this)\r\n }\r\n })\r\n\r\n return this\r\n }\r\n\r\n toggle() {\r\n const afterToggle = this.attr('afterToggle')\r\n const closed = this.isClosed()\r\n\r\n if (closed) {\r\n this.open()\r\n } else {\r\n this.close()\r\n }\r\n\r\n if (isFunction(afterToggle)) {\r\n later(() => {\r\n afterToggle.call(this, closed)\r\n })\r\n }\r\n\r\n return this\r\n }\r\n\r\n destroy() {\r\n const afterDestroy = this.attr('afterDestroy')\r\n const beforeDestroy = this.attr('beforeDestroy')\r\n let index = this.zIndex\r\n\r\n if (isFunction(beforeDestroy)) {\r\n beforeDestroy.call(this)\r\n }\r\n\r\n this.removeListeners()._remove()._default()\r\n\r\n index -= 1\r\n zIndex(index)\r\n this.zIndex = 0\r\n\r\n if (isFunction(afterDestroy)) {\r\n afterDestroy.call(this)\r\n }\r\n\r\n return this\r\n }\r\n\r\n onClose() {\r\n this.close()\r\n return this\r\n }\r\n\r\n addListeners() {\r\n const hasClose = this.attr('hasClose')\r\n const hasOverlay = this.attr('hasOverlay')\r\n const closeOnClickModal = this.attr('closeOnClickModal')\r\n const $el = this.$el\r\n\r\n if (hasClose) {\r\n on($el, '.outline-drawer__close', 'click', this.onClose, this, true)\r\n }\r\n\r\n if (hasOverlay && closeOnClickModal) {\r\n on($el, '.outline-drawer__overlay', 'click', this.onClose, this, true)\r\n }\r\n\r\n return this\r\n }\r\n\r\n removeListeners() {\r\n const hasClose = this.attr('hasClose')\r\n const hasOverlay = this.attr('hasOverlay')\r\n const $el = this.$el\r\n\r\n if (!hasClose && !hasOverlay) {\r\n return this\r\n }\r\n\r\n off($el, 'click', this.onClose)\r\n\r\n return this\r\n }\r\n}\r\n\r\nDrawer.DEFAULTS = (() => {\r\n const OPTIONS = {\r\n placement: 'rtl',\r\n title: '标题',\r\n size: 'regular',\r\n hasClose: true,\r\n hasOverlay: true,\r\n hasOffset: false,\r\n hasPadding: true,\r\n autoHeight: true,\r\n closeOnClickModal: true,\r\n overflow: 'auto',\r\n created: null,\r\n mounted: null,\r\n afterClosed: null,\r\n afterOpened: null,\r\n afterScroll: null,\r\n beforeDestroy: null,\r\n afterDestroy: null,\r\n afterToggle: null\r\n }\r\n\r\n return cloneDeep(OPTIONS)\r\n})()\r\n\r\nexport default Drawer\r\n","import createElement from './createElement'\r\n\r\n/**\r\n * 创建 SVG 图标 DOM 元素\r\n * ========================================================================\r\n * @method icon\r\n * @alias createElement\r\n * @see createElement\r\n * @param {String} name\r\n * @param {Object} [options]\r\n * @param {Number|Array} [options.size]\r\n * @param {String} [options.color]\r\n * @param {String} [options.iconSet]\r\n * @returns {HTMLElement}\r\n */\r\nconst icon = (name, options = {}) => {\r\n return createElement(name, options)\r\n}\r\n\r\nexport default icon\r\n","import isHTML from '../types/isHTML'\r\nimport isString from '../types/isString'\r\nimport isElement from '../types/isElement'\r\nimport stripScripts from '../lang/stripScripts'\r\nimport createElement from './createElement'\r\n\r\n/**\r\n * 获取或者设置 DOM 元素的 innerHTML 属性值,或者通过 HTML 字符串,创建 DOM 元素\r\n * ========================================================================\r\n * @method html\r\n * @param {HTMLElement|String} el\r\n * @param {String} [strHTML]\r\n * @return {DocumentFragment|null|*}\r\n */\r\nconst html = (el, strHTML) => {\r\n const $fragment = document.createDocumentFragment()\r\n\r\n if (!el || (!isHTML(el) && !isString(el) && !isElement(el))) {\r\n return null\r\n }\r\n\r\n if (isHTML(el)) {\r\n const template = createElement('div')\r\n let children = []\r\n\r\n template.innerHTML = stripScripts(el)\r\n children = [...template.childNodes]\r\n children.forEach((child) => {\r\n $fragment.appendChild(child)\r\n })\r\n\r\n return $fragment\r\n } else if (isString(strHTML)) {\r\n el.innerHTML = stripScripts(strHTML)\r\n } else {\r\n return el.innerHTML\r\n }\r\n}\r\n\r\nexport default html\r\n"],"names":["toString","val","Object","prototype","apply","isFunction","later","fn","delay","setTimeout","isObject","o","isArray","Array","cloneDeep","obj","clone","from","assign","keys","forEach","key","isElement","nodeName","tagName","nodeType","isDOM","el","isHTMLCollection","fragment","isTextNode","isString","str","trim","replace","TAGS","isHTML","html","basic","full","slice","RegExp","map","tag","join","test","hasClass","className","pattern","allClass","classList","contains","exec","addClass","_classList","add","indexOf","split","name","length","removeClass","remove","stripScripts","hasOwn","prop","hasOwnProperty","call","setAttributes","attrs","attr","value","setAttribute","toLowerCase","style","cssText","innerHTML","innerText","createElement","children","$fragment","document","createDocumentFragment","$el","isValidChild","child","append","$child","createTextNode","appendChild","every","index","zIndex","idx","setProperty","documentElement","matches","selector","sel","msMatchesSelector","getParentOrHost","host","parentNode","CAPTURE_EVENTS","_off","type","capture","_delegateListener","listeners","_listeners","listener","i","handler","splice","_delete","removeEventListener","purgeElement","recurse","$element","querySelector","$children","childNodes","getListeners","filter","arguments","off","on","data","context","once","evt","target","getTarget","delegateTarget","closest","ctx","includeCTX","startsWith","overrideContext","push","addEventListener","SYMBOLS","_maybeArrayLike","_toConsumableArray","getSymbols","iconSet","getSymbol","patternName","patternSet","find","symbol","fullName","paint","$body","body","$icons","symbols","insertBefore","firstChild","options","ICON","size","color","width","height","defaultRules","cssRules","$icon","$svg","binds","svg","isSVG","xmlns","class","_subscribers","_hasDirectSubscribersFor","topic","has","isDirect","found","position","lastIndexOf","substring","_hasSubscribers","emit","async","execute","subscriber","message","callback","deliver","guid","uuid","prefix","_removeSubscriber","token","subject","execution","j","_removeSubscriberByToken","Component","constructor","this","initialize","render","addListeners","origin","source","extend","refresh","destroy","removeListeners","reload","$emit","event","publish","$on","subscribe","$off","unsubscribe","Drawer","super","_default","DEFAULTS","title","closed","$modal","$header","$title","$close","$main","$footer","$overlay","created","setTitle","isClosed","mounted","placement","hasClose","hasOverlay","hasOffset","hasPadding","autoHeight","overflow","customClass","mainClassName","icon","erase","_paint","content","$content","strHTML","template","_remove","removeChild","open","opened","close","toggle","afterToggle","afterDestroy","beforeDestroy","onClose","closeOnClickModal","afterClosed","afterOpened","afterScroll"],"mappings":"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"} \ No newline at end of file diff --git a/gulpfile.js b/gulpfile.js index cb7aec2c..7bdf5da7 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -60,56 +60,6 @@ const check = () => { const test = gulp.series(lint, check) /* ==================== 编译代码的 gulp 任务 ==================== */ -const buildSourceStyles = () => { - return gulp - .src( - [ - './theme/anchors.less', - './theme/navigator.less', - './theme/drawer.less', - './theme/toolbar.less', - './theme/message.less', - './theme/outline.less' - ], - { - allowEmpty: true - } - ) - .pipe(sourcemaps.init()) - .pipe( - less({ - paths: [path.join(__dirname, 'less', 'includes')], - plugins: [autoprefixer] - }) - ) - .pipe(sourcemaps.write()) - .pipe(gulp.dest('./')) -} - -const minifySourcesStyle = () => { - return gulp - .src( - [ - './anchors.css', - './navigator.css', - './drawer.css', - './toolbar.css', - './message.css', - './outline.css' - ], - { - allowEmpty: true - } - ) - .pipe(sourcemaps.init()) - .pipe(cssmin()) - .pipe(rename({ suffix: '.min' })) - .pipe(sourcemaps.write()) - .pipe(gulp.dest('./')) -} - -const buildLibStyles = gulp.series(buildSourceStyles, minifySourcesStyle) - const buildScript = () => { return run('npm run build:lib').exec() } @@ -128,7 +78,6 @@ const buildApi = () => { const buildExamples = () => { return gulp .src([ - 'api/pug/examples/anchors.pug', 'api/pug/examples/relative.pug', 'api/pug/examples/sticky.pug', 'api/pug/examples/fixed.pug', @@ -214,10 +163,7 @@ const start = gulp.series(build, connectDocs, openDocs) /* ==================== 检测源代码变更相关的 gulp 任务 ==================== */ const watchSource = () => { - return watch( - ['**/*.(js|less)'], - gulp.series(lint, buildScript, buildLibStyles) - ) + return watch(['**/*.(js|less)'], gulp.series(lint, buildScript)) } const watchApi = () => { @@ -235,7 +181,6 @@ const watchAll = gulp.parallel(watchSource, watchApi, watchDocs) // 导出公共方法 module.exports.start = start module.exports.clean = cleanDocs -module.exports.buildLibStyles = buildLibStyles module.exports.buildApi = buildApi module.exports.buildExamples = buildExamples module.exports.buildApiStyle = buildApiStyle diff --git a/jsconfig.json b/jsconfig.json index b5afabbb..afb4bf29 100644 --- a/jsconfig.json +++ b/jsconfig.json @@ -3,7 +3,7 @@ "baseUrl": "./", "paths": { "@/*": [ - "src/*" + "./*" ] } }, diff --git a/message.css b/message.css deleted file mode 100644 index ba0b0a80..00000000 --- a/message.css +++ /dev/null @@ -1,239 +0,0 @@ -/* ========== colors.theme - 基础颜色变量集合 ========== */ -/** - * font.less - 字体相关样式 - * ============================================================= - * Created By: Yaohaixiao - * Update: 2022.3.16 - */ -/* ====== 字体 ====== */ -/* ====== 字重 ====== */ -/* ====== 字号 ====== */ -/* ========== icon.theme - svg 图标的样式 ========== */ -.outline-icon { - position: relative; - z-index: 1; - display: inline-block; - vertical-align: middle; - width: 1em; - height: 1em; - overflow: hidden; -} -.outline-icon__svg { - position: absolute; - z-index: 2; - top: 50%; - left: 50%; - width: 1em; - height: 1em; - fill: currentcolor; - -webkit-transform: translate(-50%, -50%); - transform: translate(-50%, -50%); - overflow: hidden; -} -.outline-icon_hidden { - display: none; -} -/** - * mixins.less - 工具函数 - * ============================================================= - * Created By: Yaohaixiao - * Update: 2022.3.11 - */ -/** - * ellipsis.less - 文本省略 mixinx 函数 - * ============================================================= - * Created By: Yaohaixiao - * Update: 2022.3.11 - */ -/* ====== 文本省略函数 ====== */ -/** - * radius.less - 圆角设置 mixinx 函数 - * ============================================================= - * Created By: Yaohaixiao - * Update: 2024.4.16 - */ -/* ====== 圆角样式设置函数 ====== */ -/** - * shadow.less - 阴影样式设置 mixinx 函数 - * ============================================================= - * Created By: Yaohaixiao - * Update: 2022.3.20 - */ -/* ====== 阴影样式设置函数 ====== */ -.outline-message { - border-radius: 3px; - -webkit-box-shadow: 0 0 6px 1px #dcdfe6; - box-shadow: 0 0 6px 1px #dcdfe6; - position: fixed; - z-index: 9999; - opacity: 0.1; - top: -50px; - left: 50%; - height: 40px; - margin: 0; - padding: 0 50px; - line-height: 40px; - font-size: 13px; - background-color: #fff; - color: #666; - -webkit-transition: all 0.5s ease-in-out; - transition: all 0.5s ease-in-out; - -webkit-transform: translateX(-50%); - transform: translateX(-50%); - overflow: hidden; -} -.outline-message__content { - white-space: nowrap; - text-overflow: ellipsis; - margin: 0; - max-width: 700px; - height: 40px; - line-height: 40px; - font-size: 13px; - color: #666; - overflow: hidden; -} -.outline-message__close, -.outline-message__icon { - position: absolute; - z-index: 2; - top: 0; - width: 40px; - height: 40px; - line-height: 40px; - text-align: center; - overflow: hidden; -} -.outline-message__icon { - left: 0; - color: #fff; -} -.outline-message__icon .outline-icon { - position: absolute; - z-index: 2; - top: 50%; - left: 50%; - -webkit-transform: translate(-50%, -50%); - transform: translate(-50%, -50%); -} -.outline-message__close { - right: 0; - cursor: pointer; - color: #999; -} -.outline-message__close .outline-icon { - position: absolute; - z-index: 2; - top: 50%; - left: 50%; - -webkit-transform: translate(-50%, -50%); - transform: translate(-50%, -50%); -} -.outline-message__close:hover { - color: #666; -} -.outline-message_info .outline-message__icon { - background-color: #507afe; -} -.outline-message_warning .outline-message__icon { - background-color: #ff9901; -} -.outline-message_success .outline-message__icon { - background-color: #058942; -} -.outline-message_error .outline-message__icon { - background-color: #ff5d5d; -} -.outline-message_plain { - min-width: 190px; - padding: 0 50px 0 15px; -} -.outline-message_plain.outline-message_info { - border-left: 5px solid #507afe; - background-color: #ecf8ff; -} -.outline-message_plain.outline-message_warning { - border-left: 5px solid #ff9901; - background-color: #fffbe6; -} -.outline-message_plain.outline-message_success { - border-left: 5px solid #058942; - background-color: #e1f6eb; -} -.outline-message_plain.outline-message_error { - border-left: 5px solid #ff5d5d; - background-color: #fff1f0; -} -.outline-message_plain .outline-message__icon { - width: 0; - display: none; -} -.outline-message_plain .outline-message__icon .outline-icon { - display: none; -} -.outline-message_light { - min-width: 180px; - padding: 0 40px; -} -.outline-message_light.outline-message_info .outline-message__icon { - color: #507afe; -} -.outline-message_light.outline-message_warning .outline-message__icon { - color: #ff9901; -} -.outline-message_light.outline-message_success .outline-message__icon { - color: #058942; -} -.outline-message_light.outline-message_error .outline-message__icon { - color: #ff5d5d; -} -.outline-message_light .outline-message__icon { - background-color: #fff; -} -.outline-message_round { - border-radius: 20px; -} -.outline-message_round.outline-message_default { - min-width: 180px; - padding: 0 40px; -} -.outline-message_round.outline-message_default .outline-message__icon { - border-radius: 10px; - top: 10px; - left: 10px; - width: 20px; - height: 20px; - line-height: 20px; -} -.outline-message_round.outline-message_default.outline-message_full-width { - min-width: 200px; - padding: 0 20px 0 40px; -} -.outline-message_round.outline-message_plain { - min-width: 195px; - padding: 0 40px 0 20px; -} -.outline-message_round.outline-message_plain.outline-message_full-width { - min-width: 215px; - padding: 0 20px; -} -.outline-message_full-width { - min-width: 200px; - padding: 0 10px 0 50px; -} -.outline-message_full-width.outline-message_plain { - min-width: 230px; - padding: 0 10px 0 15px; -} -.outline-message_full-width.outline-message_light { - min-width: 210px; - padding: 0 10px 0 40px; -} -.outline-message_visible { - opacity: 1; -} -.outline-message_hidden { - display: none; -} - -/*# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLzxpbnB1dCBjc3MgNT4iLCJpY29ucy5sZXNzIiwibWVzc2FnZS5sZXNzIiwicmFkaXVzLmxlc3MiLCJzaGFkb3cubGVzcyIsImVsbGlwc2lzLmxlc3MiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsbURBQW1EO0FBQ25EOzs7OztHQUtHO0FBQ0gsc0JBQXNCO0FBQ3RCLHNCQUFzQjtBQUN0QixzQkFBc0I7QUFDdEIsa0RBQWtEO0FDVGxEO0VBQ0UsbUJBQUE7RUFDQSxXQUFBO0VBQ0Esc0JBQUE7RUFDQSx1QkFBQTtFQUNBLFdBQUE7RUFDQSxZQUFBO0VBQ0EsaUJBQUE7Q0RXRDtBQ1RDO0VBQ0UsbUJBQUE7RUFDQSxXQUFBO0VBQ0EsU0FBQTtFQUNBLFVBQUE7RUFDQSxXQUFBO0VBQ0EsWUFBQTtFQUNBLG1CQUFBO0VBQ0EseUNBQUE7VUFBQSxpQ0FBQTtFQUNBLGlCQUFBO0NEV0g7QUNSQztFQUNFLGNBQUE7Q0RVSDtBQUNEOzs7OztHQUtHO0FBQ0g7Ozs7O0dBS0c7QUFDSCwwQkFBMEI7QUFDMUI7Ozs7O0dBS0c7QUFDSCw0QkFBNEI7QUFDNUI7Ozs7O0dBS0c7QUFDSCw0QkFBNEI7QUV2RDVCO0VDSUUsbUJBQUE7RUNDQSx3Q0FBQTtVQUFBLGdDQUFBO0VGRkEsZ0JBQUE7RUFDQSxjQUFBO0VBQ0EsYUFBQTtFQUNBLFdBQUE7RUFDQSxVQUFBO0VBQ0EsYUFBQTtFQUNBLFVBQUE7RUFDQSxnQkFBQTtFQUNBLGtCQUFBO0VBQ0EsZ0JBQUE7RUFDQSx1QkFBQTtFQUNBLFlBQUE7RUFDQSx5Q0FBQTtFQUFBLGlDQUFBO0VBQ0Esb0NBQUE7VUFBQSw0QkFBQTtFQUNBLGlCQUFBO0NGeUREO0FFdkRDO0VHZkEsb0JBQUE7RUFDQSx3QkFBQTtFSGdCRSxVQUFBO0VBQ0EsaUJBQUE7RUFDQSxhQUFBO0VBQ0Esa0JBQUE7RUFDQSxnQkFBQTtFQUNBLFlBQUE7RUFDQSxpQkFBQTtDRjBESDtBRXZEQzs7RUFFRSxtQkFBQTtFQUNBLFdBQUE7RUFDQSxPQUFBO0VBQ0EsWUFBQTtFQUNBLGFBQUE7RUFDQSxrQkFBQTtFQUNBLG1CQUFBO0VBQ0EsaUJBQUE7Q0Z5REg7QUV0REM7RUFDRSxRQUFBO0VBQ0EsWUFBQTtDRndESDtBRTFEQztFQUtJLG1CQUFBO0VBQ0EsV0FBQTtFQUNBLFNBQUE7RUFDQSxVQUFBO0VBQ0EseUNBQUE7VUFBQSxpQ0FBQTtDRndETDtBRXBEQztFQUNFLFNBQUE7RUFDQSxnQkFBQTtFQUNBLFlBQUE7Q0ZzREg7QUV6REM7RUFNSSxtQkFBQTtFQUNBLFdBQUE7RUFDQSxTQUFBO0VBQ0EsVUFBQTtFQUNBLHlDQUFBO1VBQUEsaUNBQUE7Q0ZzREw7QUVuREc7RUFDRSxZQUFBO0NGcURMO0FFakRDO0VBRUksMEJBQUE7Q0ZrREw7QUU5Q0M7RUFFSSwwQkFBQTtDRitDTDtBRTNDQztFQUVJLDBCQUFBO0NGNENMO0FFeENDO0VBRUksMEJBQUE7Q0Z5Q0w7QUVyQ0M7RUFDRSxpQkFBQTtFQUNBLHVCQUFBO0NGdUNIO0FFcENLO0VBQ0UsK0JBQUE7RUFDQSwwQkFBQTtDRnNDUDtBRW5DSztFQUNFLCtCQUFBO0VBQ0EsMEJBQUE7Q0ZxQ1A7QUVsQ0s7RUFDRSwrQkFBQTtFQUNBLDBCQUFBO0NGb0NQO0FFakNLO0VBQ0UsK0JBQUE7RUFDQSwwQkFBQTtDRm1DUDtBRXpEQztFQTJCSSxTQUFBO0VBQ0EsY0FBQTtDRmlDTDtBRTdEQztFQStCTSxjQUFBO0NGaUNQO0FFNUJDO0VBQ0UsaUJBQUE7RUFDQSxnQkFBQTtDRjhCSDtBRTNCSztFQUVJLGVBQUE7Q0Y0QlQ7QUV4Qks7RUFFSSxlQUFBO0NGeUJUO0FFckJLO0VBRUksZUFBQTtDRnNCVDtBRWxCSztFQUVJLGVBQUE7Q0ZtQlQ7QUU1Q0M7RUErQkksdUJBQUE7Q0ZnQkw7QUVaQztFQ3BLQSxvQkFBQTtDSG1MRDtBRVhLO0VBQ0UsaUJBQUE7RUFDQSxnQkFBQTtDRmFQO0FFZks7RUN4S0osb0JBQUE7RUQ4S1EsVUFBQTtFQUNBLFdBQUE7RUFDQSxZQUFBO0VBQ0EsYUFBQTtFQUNBLGtCQUFBO0NGYVQ7QUVWTztFQUNFLGlCQUFBO0VBQ0EsdUJBQUE7Q0ZZVDtBRVJLO0VBQ0UsaUJBQUE7RUFDQSx1QkFBQTtDRlVQO0FFUk87RUFDRSxpQkFBQTtFQUNBLGdCQUFBO0NGVVQ7QUVKQztFQUNFLGlCQUFBO0VBQ0EsdUJBQUE7Q0ZNSDtBRUhLO0VBQ0UsaUJBQUE7RUFDQSx1QkFBQTtDRktQO0FFRks7RUFDRSxpQkFBQTtFQUNBLHVCQUFBO0NGSVA7QUVDQztFQUNFLFdBQUE7Q0ZDSDtBRUVDO0VBQ0UsY0FBQTtDRkFIIiwiZmlsZSI6Im1lc3NhZ2UuY3NzIiwic291cmNlc0NvbnRlbnQiOlsiLyogPT09PT09PT09PSBjb2xvcnMudGhlbWUgLSDln7rnoYDpopzoibLlj5jph4/pm4blkIggPT09PT09PT09PSAqL1xuLyoqXG4gKiBmb250Lmxlc3MgLSDlrZfkvZPnm7jlhbPmoLflvI9cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIENyZWF0ZWQgQnk6IFlhb2hhaXhpYW9cbiAqIFVwZGF0ZTogMjAyMi4zLjE2XG4gKi9cbi8qID09PT09PSDlrZfkvZMgPT09PT09ICovXG4vKiA9PT09PT0g5a2X6YeNID09PT09PSAqL1xuLyogPT09PT09IOWtl+WPtyA9PT09PT0gKi9cbi8qID09PT09PT09PT0gaWNvbi50aGVtZSAtIHN2ZyDlm77moIfnmoTmoLflvI8gPT09PT09PT09PSAqL1xuLm91dGxpbmUtaWNvbiB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgei1pbmRleDogMTtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO1xuICB3aWR0aDogMWVtO1xuICBoZWlnaHQ6IDFlbTtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi5vdXRsaW5lLWljb25fX3N2ZyB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgei1pbmRleDogMjtcbiAgdG9wOiA1MCU7XG4gIGxlZnQ6IDUwJTtcbiAgd2lkdGg6IDFlbTtcbiAgaGVpZ2h0OiAxZW07XG4gIGZpbGw6IGN1cnJlbnRjb2xvcjtcbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgLTUwJSk7XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4ub3V0bGluZS1pY29uX2hpZGRlbiB7XG4gIGRpc3BsYXk6IG5vbmU7XG59XG4vKipcbiAqIG1peGlucy5sZXNzIC0g5bel5YW35Ye95pWwXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBDcmVhdGVkIEJ5OiBZYW9oYWl4aWFvXG4gKiBVcGRhdGU6IDIwMjIuMy4xMVxuICovXG4vKipcbiAqIGVsbGlwc2lzLmxlc3MgLSDmlofmnKznnIHnlaUgbWl4aW54IOWHveaVsFxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogQ3JlYXRlZCBCeTogWWFvaGFpeGlhb1xuICogVXBkYXRlOiAyMDIyLjMuMTFcbiAqL1xuLyogPT09PT09IOaWh+acrOecgeeVpeWHveaVsCA9PT09PT0gKi9cbi8qKlxuICogcmFkaXVzLmxlc3MgLSDlnIbop5Lorr7nva4gbWl4aW54IOWHveaVsFxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogQ3JlYXRlZCBCeTogWWFvaGFpeGlhb1xuICogVXBkYXRlOiAyMDI0LjQuMTZcbiAqL1xuLyogPT09PT09IOWchuinkuagt+W8j+iuvue9ruWHveaVsCA9PT09PT0gKi9cbi8qKlxuICogc2hhZG93Lmxlc3MgLSDpmLTlvbHmoLflvI/orr7nva4gbWl4aW54IOWHveaVsFxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogQ3JlYXRlZCBCeTogWWFvaGFpeGlhb1xuICogVXBkYXRlOiAyMDIyLjMuMjBcbiAqL1xuLyogPT09PT09IOmYtOW9seagt+W8j+iuvue9ruWHveaVsCA9PT09PT0gKi9cbi5vdXRsaW5lLW1lc3NhZ2Uge1xuICBib3JkZXItcmFkaXVzOiAzcHg7XG4gIGJveC1zaGFkb3c6IDAgMCA2cHggMXB4ICNkY2RmZTY7XG4gIHBvc2l0aW9uOiBmaXhlZDtcbiAgei1pbmRleDogOTk5OTtcbiAgb3BhY2l0eTogMC4xO1xuICB0b3A6IC01MHB4O1xuICBsZWZ0OiA1MCU7XG4gIGhlaWdodDogNDBweDtcbiAgbWFyZ2luOiAwO1xuICBwYWRkaW5nOiAwIDUwcHg7XG4gIGxpbmUtaGVpZ2h0OiA0MHB4O1xuICBmb250LXNpemU6IDEzcHg7XG4gIGJhY2tncm91bmQtY29sb3I6ICNmZmY7XG4gIGNvbG9yOiAjNjY2O1xuICB0cmFuc2l0aW9uOiBhbGwgMC41cyBlYXNlLWluLW91dDtcbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC01MCUpO1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLm91dGxpbmUtbWVzc2FnZV9fY29udGVudCB7XG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzO1xuICBtYXJnaW46IDA7XG4gIG1heC13aWR0aDogNzAwcHg7XG4gIGhlaWdodDogNDBweDtcbiAgbGluZS1oZWlnaHQ6IDQwcHg7XG4gIGZvbnQtc2l6ZTogMTNweDtcbiAgY29sb3I6ICM2NjY7XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4ub3V0bGluZS1tZXNzYWdlX19jbG9zZSxcbi5vdXRsaW5lLW1lc3NhZ2VfX2ljb24ge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHotaW5kZXg6IDI7XG4gIHRvcDogMDtcbiAgd2lkdGg6IDQwcHg7XG4gIGhlaWdodDogNDBweDtcbiAgbGluZS1oZWlnaHQ6IDQwcHg7XG4gIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi5vdXRsaW5lLW1lc3NhZ2VfX2ljb24ge1xuICBsZWZ0OiAwO1xuICBjb2xvcjogI2ZmZjtcbn1cbi5vdXRsaW5lLW1lc3NhZ2VfX2ljb24gLm91dGxpbmUtaWNvbiB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgei1pbmRleDogMjtcbiAgdG9wOiA1MCU7XG4gIGxlZnQ6IDUwJTtcbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgLTUwJSk7XG59XG4ub3V0bGluZS1tZXNzYWdlX19jbG9zZSB7XG4gIHJpZ2h0OiAwO1xuICBjdXJzb3I6IHBvaW50ZXI7XG4gIGNvbG9yOiAjOTk5O1xufVxuLm91dGxpbmUtbWVzc2FnZV9fY2xvc2UgLm91dGxpbmUtaWNvbiB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgei1pbmRleDogMjtcbiAgdG9wOiA1MCU7XG4gIGxlZnQ6IDUwJTtcbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgLTUwJSk7XG59XG4ub3V0bGluZS1tZXNzYWdlX19jbG9zZTpob3ZlciB7XG4gIGNvbG9yOiAjNjY2O1xufVxuLm91dGxpbmUtbWVzc2FnZV9pbmZvIC5vdXRsaW5lLW1lc3NhZ2VfX2ljb24ge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjNTA3YWZlO1xufVxuLm91dGxpbmUtbWVzc2FnZV93YXJuaW5nIC5vdXRsaW5lLW1lc3NhZ2VfX2ljb24ge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmY5OTAxO1xufVxuLm91dGxpbmUtbWVzc2FnZV9zdWNjZXNzIC5vdXRsaW5lLW1lc3NhZ2VfX2ljb24ge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjMDU4OTQyO1xufVxuLm91dGxpbmUtbWVzc2FnZV9lcnJvciAub3V0bGluZS1tZXNzYWdlX19pY29uIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ZmNWQ1ZDtcbn1cbi5vdXRsaW5lLW1lc3NhZ2VfcGxhaW4ge1xuICBtaW4td2lkdGg6IDE5MHB4O1xuICBwYWRkaW5nOiAwIDUwcHggMCAxNXB4O1xufVxuLm91dGxpbmUtbWVzc2FnZV9wbGFpbi5vdXRsaW5lLW1lc3NhZ2VfaW5mbyB7XG4gIGJvcmRlci1sZWZ0OiA1cHggc29saWQgIzUwN2FmZTtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2VjZjhmZjtcbn1cbi5vdXRsaW5lLW1lc3NhZ2VfcGxhaW4ub3V0bGluZS1tZXNzYWdlX3dhcm5pbmcge1xuICBib3JkZXItbGVmdDogNXB4IHNvbGlkICNmZjk5MDE7XG4gIGJhY2tncm91bmQtY29sb3I6ICNmZmZiZTY7XG59XG4ub3V0bGluZS1tZXNzYWdlX3BsYWluLm91dGxpbmUtbWVzc2FnZV9zdWNjZXNzIHtcbiAgYm9yZGVyLWxlZnQ6IDVweCBzb2xpZCAjMDU4OTQyO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZTFmNmViO1xufVxuLm91dGxpbmUtbWVzc2FnZV9wbGFpbi5vdXRsaW5lLW1lc3NhZ2VfZXJyb3Ige1xuICBib3JkZXItbGVmdDogNXB4IHNvbGlkICNmZjVkNWQ7XG4gIGJhY2tncm91bmQtY29sb3I6ICNmZmYxZjA7XG59XG4ub3V0bGluZS1tZXNzYWdlX3BsYWluIC5vdXRsaW5lLW1lc3NhZ2VfX2ljb24ge1xuICB3aWR0aDogMDtcbiAgZGlzcGxheTogbm9uZTtcbn1cbi5vdXRsaW5lLW1lc3NhZ2VfcGxhaW4gLm91dGxpbmUtbWVzc2FnZV9faWNvbiAub3V0bGluZS1pY29uIHtcbiAgZGlzcGxheTogbm9uZTtcbn1cbi5vdXRsaW5lLW1lc3NhZ2VfbGlnaHQge1xuICBtaW4td2lkdGg6IDE4MHB4O1xuICBwYWRkaW5nOiAwIDQwcHg7XG59XG4ub3V0bGluZS1tZXNzYWdlX2xpZ2h0Lm91dGxpbmUtbWVzc2FnZV9pbmZvIC5vdXRsaW5lLW1lc3NhZ2VfX2ljb24ge1xuICBjb2xvcjogIzUwN2FmZTtcbn1cbi5vdXRsaW5lLW1lc3NhZ2VfbGlnaHQub3V0bGluZS1tZXNzYWdlX3dhcm5pbmcgLm91dGxpbmUtbWVzc2FnZV9faWNvbiB7XG4gIGNvbG9yOiAjZmY5OTAxO1xufVxuLm91dGxpbmUtbWVzc2FnZV9saWdodC5vdXRsaW5lLW1lc3NhZ2Vfc3VjY2VzcyAub3V0bGluZS1tZXNzYWdlX19pY29uIHtcbiAgY29sb3I6ICMwNTg5NDI7XG59XG4ub3V0bGluZS1tZXNzYWdlX2xpZ2h0Lm91dGxpbmUtbWVzc2FnZV9lcnJvciAub3V0bGluZS1tZXNzYWdlX19pY29uIHtcbiAgY29sb3I6ICNmZjVkNWQ7XG59XG4ub3V0bGluZS1tZXNzYWdlX2xpZ2h0IC5vdXRsaW5lLW1lc3NhZ2VfX2ljb24ge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmO1xufVxuLm91dGxpbmUtbWVzc2FnZV9yb3VuZCB7XG4gIGJvcmRlci1yYWRpdXM6IDIwcHg7XG59XG4ub3V0bGluZS1tZXNzYWdlX3JvdW5kLm91dGxpbmUtbWVzc2FnZV9kZWZhdWx0IHtcbiAgbWluLXdpZHRoOiAxODBweDtcbiAgcGFkZGluZzogMCA0MHB4O1xufVxuLm91dGxpbmUtbWVzc2FnZV9yb3VuZC5vdXRsaW5lLW1lc3NhZ2VfZGVmYXVsdCAub3V0bGluZS1tZXNzYWdlX19pY29uIHtcbiAgYm9yZGVyLXJhZGl1czogMTBweDtcbiAgdG9wOiAxMHB4O1xuICBsZWZ0OiAxMHB4O1xuICB3aWR0aDogMjBweDtcbiAgaGVpZ2h0OiAyMHB4O1xuICBsaW5lLWhlaWdodDogMjBweDtcbn1cbi5vdXRsaW5lLW1lc3NhZ2Vfcm91bmQub3V0bGluZS1tZXNzYWdlX2RlZmF1bHQub3V0bGluZS1tZXNzYWdlX2Z1bGwtd2lkdGgge1xuICBtaW4td2lkdGg6IDIwMHB4O1xuICBwYWRkaW5nOiAwIDIwcHggMCA0MHB4O1xufVxuLm91dGxpbmUtbWVzc2FnZV9yb3VuZC5vdXRsaW5lLW1lc3NhZ2VfcGxhaW4ge1xuICBtaW4td2lkdGg6IDE5NXB4O1xuICBwYWRkaW5nOiAwIDQwcHggMCAyMHB4O1xufVxuLm91dGxpbmUtbWVzc2FnZV9yb3VuZC5vdXRsaW5lLW1lc3NhZ2VfcGxhaW4ub3V0bGluZS1tZXNzYWdlX2Z1bGwtd2lkdGgge1xuICBtaW4td2lkdGg6IDIxNXB4O1xuICBwYWRkaW5nOiAwIDIwcHg7XG59XG4ub3V0bGluZS1tZXNzYWdlX2Z1bGwtd2lkdGgge1xuICBtaW4td2lkdGg6IDIwMHB4O1xuICBwYWRkaW5nOiAwIDEwcHggMCA1MHB4O1xufVxuLm91dGxpbmUtbWVzc2FnZV9mdWxsLXdpZHRoLm91dGxpbmUtbWVzc2FnZV9wbGFpbiB7XG4gIG1pbi13aWR0aDogMjMwcHg7XG4gIHBhZGRpbmc6IDAgMTBweCAwIDE1cHg7XG59XG4ub3V0bGluZS1tZXNzYWdlX2Z1bGwtd2lkdGgub3V0bGluZS1tZXNzYWdlX2xpZ2h0IHtcbiAgbWluLXdpZHRoOiAyMTBweDtcbiAgcGFkZGluZzogMCAxMHB4IDAgNDBweDtcbn1cbi5vdXRsaW5lLW1lc3NhZ2VfdmlzaWJsZSB7XG4gIG9wYWNpdHk6IDE7XG59XG4ub3V0bGluZS1tZXNzYWdlX2hpZGRlbiB7XG4gIGRpc3BsYXk6IG5vbmU7XG59XG4iLCIvKiA9PT09PT09PT09IGljb24udGhlbWUgLSBzdmcg5Zu+5qCH55qE5qC35byPID09PT09PT09PT0gKi9cclxuLm91dGxpbmUtaWNvbiB7XHJcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xyXG4gIHotaW5kZXg6IDE7XHJcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xyXG4gIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XHJcbiAgd2lkdGg6IDFlbTtcclxuICBoZWlnaHQ6IDFlbTtcclxuICBvdmVyZmxvdzogaGlkZGVuO1xyXG5cclxuICAmX19zdmcge1xyXG4gICAgcG9zaXRpb246IGFic29sdXRlO1xyXG4gICAgei1pbmRleDogMjtcclxuICAgIHRvcDogNTAlO1xyXG4gICAgbGVmdDogNTAlO1xyXG4gICAgd2lkdGg6IDFlbTtcclxuICAgIGhlaWdodDogMWVtO1xyXG4gICAgZmlsbDogY3VycmVudGNvbG9yO1xyXG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgLTUwJSk7XHJcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xyXG4gIH1cclxuXHJcbiAgJl9oaWRkZW4ge1xyXG4gICAgZGlzcGxheTogbm9uZTtcclxuICB9XHJcbn1cclxuIiwiQGltcG9ydCAnLi9jb2xvcnMnO1xyXG5AaW1wb3J0ICcuL2ZvbnQnO1xyXG5AaW1wb3J0ICcuL2ljb25zJztcclxuQGltcG9ydCAnLi9taXhpbnMnO1xyXG5cclxuLm91dGxpbmUtbWVzc2FnZSB7XHJcbiAgLnJhZGl1c19zbWFsbCgpO1xyXG4gIC5zaGFkb3dfbGlnaHRfcmVndWxhcigpO1xyXG4gIHBvc2l0aW9uOiBmaXhlZDtcclxuICB6LWluZGV4OiA5OTk5O1xyXG4gIG9wYWNpdHk6IDAuMTtcclxuICB0b3A6IC01MHB4O1xyXG4gIGxlZnQ6IDUwJTtcclxuICBoZWlnaHQ6IDQwcHg7XHJcbiAgbWFyZ2luOiAwO1xyXG4gIHBhZGRpbmc6IDAgNTBweDtcclxuICBsaW5lLWhlaWdodDogNDBweDtcclxuICBmb250LXNpemU6IEBmb250X3NpemVfc21hbGw7XHJcbiAgYmFja2dyb3VuZC1jb2xvcjogQHdoaXRlO1xyXG4gIGNvbG9yOiBAdGhpcmRfdGV4dF9jb2xvcjtcclxuICB0cmFuc2l0aW9uOiBhbGwgMC41cyBlYXNlLWluLW91dDtcclxuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTUwJSk7XHJcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcclxuXHJcbiAgJl9fY29udGVudCB7XHJcbiAgICAuZWxsaXBzaXMoMSk7XHJcbiAgICBtYXJnaW46IDA7XHJcbiAgICBtYXgtd2lkdGg6IDcwMHB4O1xyXG4gICAgaGVpZ2h0OiA0MHB4O1xyXG4gICAgbGluZS1oZWlnaHQ6IDQwcHg7XHJcbiAgICBmb250LXNpemU6IDEzcHg7XHJcbiAgICBjb2xvcjogQHRoaXJkX3RleHRfY29sb3I7XHJcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xyXG4gIH1cclxuXHJcbiAgJl9fY2xvc2UsXHJcbiAgJl9faWNvbiB7XHJcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XHJcbiAgICB6LWluZGV4OiAyO1xyXG4gICAgdG9wOiAwO1xyXG4gICAgd2lkdGg6IDQwcHg7XHJcbiAgICBoZWlnaHQ6IDQwcHg7XHJcbiAgICBsaW5lLWhlaWdodDogNDBweDtcclxuICAgIHRleHQtYWxpZ246IGNlbnRlcjtcclxuICAgIG92ZXJmbG93OiBoaWRkZW47XHJcbiAgfVxyXG5cclxuICAmX19pY29uIHtcclxuICAgIGxlZnQ6IDA7XHJcbiAgICBjb2xvcjogQHdoaXRlO1xyXG5cclxuICAgIC5vdXRsaW5lLWljb24ge1xyXG4gICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XHJcbiAgICAgIHotaW5kZXg6IDI7XHJcbiAgICAgIHRvcDogNTAlO1xyXG4gICAgICBsZWZ0OiA1MCU7XHJcbiAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIC01MCUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgJl9fY2xvc2Uge1xyXG4gICAgcmlnaHQ6IDA7XHJcbiAgICBjdXJzb3I6IHBvaW50ZXI7XHJcbiAgICBjb2xvcjogQGZvdXJ0aF90ZXh0X2NvbG9yO1xyXG5cclxuICAgIC5vdXRsaW5lLWljb24ge1xyXG4gICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XHJcbiAgICAgIHotaW5kZXg6IDI7XHJcbiAgICAgIHRvcDogNTAlO1xyXG4gICAgICBsZWZ0OiA1MCU7XHJcbiAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIC01MCUpO1xyXG4gICAgfVxyXG5cclxuICAgICY6aG92ZXIge1xyXG4gICAgICBjb2xvcjogQHRoaXJkX3RleHRfY29sb3I7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAmX2luZm8ge1xyXG4gICAgLm91dGxpbmUtbWVzc2FnZV9faWNvbiB7XHJcbiAgICAgIGJhY2tncm91bmQtY29sb3I6IEBwcmltYXJ5X2NvbG9yO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgJl93YXJuaW5nIHtcclxuICAgIC5vdXRsaW5lLW1lc3NhZ2VfX2ljb24ge1xyXG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAd2FybmluZ19jb2xvcjtcclxuICAgIH1cclxuICB9XHJcblxyXG4gICZfc3VjY2VzcyB7XHJcbiAgICAub3V0bGluZS1tZXNzYWdlX19pY29uIHtcclxuICAgICAgYmFja2dyb3VuZC1jb2xvcjogQHN1Y2Nlc3NfY29sb3I7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAmX2Vycm9yIHtcclxuICAgIC5vdXRsaW5lLW1lc3NhZ2VfX2ljb24ge1xyXG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAZGFuZ2VyX2NvbG9yO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgJl9wbGFpbiB7XHJcbiAgICBtaW4td2lkdGg6IDE5MHB4O1xyXG4gICAgcGFkZGluZzogMCA1MHB4IDAgMTVweDtcclxuXHJcbiAgICAmLm91dGxpbmUtbWVzc2FnZSB7XHJcbiAgICAgICZfaW5mbyB7XHJcbiAgICAgICAgYm9yZGVyLWxlZnQ6IDVweCBzb2xpZCBAcHJpbWFyeV9jb2xvcjtcclxuICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAaW5mb190aXBfYmdfY29sb3I7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgICZfd2FybmluZyB7XHJcbiAgICAgICAgYm9yZGVyLWxlZnQ6IDVweCBzb2xpZCBAd2FybmluZ19jb2xvcjtcclxuICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAd2FybmluZ190aXBfYmdfY29sb3I7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgICZfc3VjY2VzcyB7XHJcbiAgICAgICAgYm9yZGVyLWxlZnQ6IDVweCBzb2xpZCBAc3VjY2Vzc19jb2xvcjtcclxuICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAc3VjY2Vzc190aXBfYmdfY29sb3I7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgICZfZXJyb3Ige1xyXG4gICAgICAgIGJvcmRlci1sZWZ0OiA1cHggc29saWQgQGRhbmdlcl9jb2xvcjtcclxuICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAZGFuZ2VyX3RpcF9iZ19jb2xvcjtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC5vdXRsaW5lLW1lc3NhZ2VfX2ljb24ge1xyXG4gICAgICB3aWR0aDogMDtcclxuICAgICAgZGlzcGxheTogbm9uZTtcclxuXHJcbiAgICAgIC5vdXRsaW5lLWljb24ge1xyXG4gICAgICAgIGRpc3BsYXk6IG5vbmU7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gICZfbGlnaHQge1xyXG4gICAgbWluLXdpZHRoOiAxODBweDtcclxuICAgIHBhZGRpbmc6IDAgNDBweDtcclxuXHJcbiAgICAmLm91dGxpbmUtbWVzc2FnZSB7XHJcbiAgICAgICZfaW5mbyB7XHJcbiAgICAgICAgLm91dGxpbmUtbWVzc2FnZV9faWNvbiB7XHJcbiAgICAgICAgICBjb2xvcjogQHByaW1hcnlfY29sb3I7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICAmX3dhcm5pbmcge1xyXG4gICAgICAgIC5vdXRsaW5lLW1lc3NhZ2VfX2ljb24ge1xyXG4gICAgICAgICAgY29sb3I6IEB3YXJuaW5nX2NvbG9yO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgJl9zdWNjZXNzIHtcclxuICAgICAgICAub3V0bGluZS1tZXNzYWdlX19pY29uIHtcclxuICAgICAgICAgIGNvbG9yOiBAc3VjY2Vzc19jb2xvcjtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgICZfZXJyb3Ige1xyXG4gICAgICAgIC5vdXRsaW5lLW1lc3NhZ2VfX2ljb24ge1xyXG4gICAgICAgICAgY29sb3I6IEBkYW5nZXJfY29sb3I7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLm91dGxpbmUtbWVzc2FnZV9faWNvbiB7XHJcbiAgICAgIGJhY2tncm91bmQtY29sb3I6IEB3aGl0ZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gICZfcm91bmQge1xyXG4gICAgLnJhZGl1cygyMHB4KTtcclxuXHJcbiAgICAmLm91dGxpbmUtbWVzc2FnZSB7XHJcbiAgICAgICZfZGVmYXVsdCB7XHJcbiAgICAgICAgbWluLXdpZHRoOiAxODBweDtcclxuICAgICAgICBwYWRkaW5nOiAwIDQwcHg7XHJcblxyXG4gICAgICAgIC5vdXRsaW5lLW1lc3NhZ2VfX2ljb24ge1xyXG4gICAgICAgICAgLnJhZGl1cygxMHB4KTtcclxuICAgICAgICAgIHRvcDogMTBweDtcclxuICAgICAgICAgIGxlZnQ6IDEwcHg7XHJcbiAgICAgICAgICB3aWR0aDogMjBweDtcclxuICAgICAgICAgIGhlaWdodDogMjBweDtcclxuICAgICAgICAgIGxpbmUtaGVpZ2h0OiAyMHB4O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgJi5vdXRsaW5lLW1lc3NhZ2VfZnVsbC13aWR0aCB7XHJcbiAgICAgICAgICBtaW4td2lkdGg6IDIwMHB4O1xyXG4gICAgICAgICAgcGFkZGluZzogMCAyMHB4IDAgNDBweDtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgICZfcGxhaW4ge1xyXG4gICAgICAgIG1pbi13aWR0aDogMTk1cHg7XHJcbiAgICAgICAgcGFkZGluZzogMCA0MHB4IDAgMjBweDtcclxuXHJcbiAgICAgICAgJi5vdXRsaW5lLW1lc3NhZ2VfZnVsbC13aWR0aCB7XHJcbiAgICAgICAgICBtaW4td2lkdGg6IDIxNXB4O1xyXG4gICAgICAgICAgcGFkZGluZzogMCAyMHB4O1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgJl9mdWxsLXdpZHRoIHtcclxuICAgIG1pbi13aWR0aDogMjAwcHg7XHJcbiAgICBwYWRkaW5nOiAwIDEwcHggMCA1MHB4O1xyXG5cclxuICAgICYub3V0bGluZS1tZXNzYWdlIHtcclxuICAgICAgJl9wbGFpbiB7XHJcbiAgICAgICAgbWluLXdpZHRoOiAyMzBweDtcclxuICAgICAgICBwYWRkaW5nOiAwIDEwcHggMCAxNXB4O1xyXG4gICAgICB9XHJcblxyXG4gICAgICAmX2xpZ2h0IHtcclxuICAgICAgICBtaW4td2lkdGg6IDIxMHB4O1xyXG4gICAgICAgIHBhZGRpbmc6IDAgMTBweCAwIDQwcHg7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gICZfdmlzaWJsZSB7XHJcbiAgICBvcGFjaXR5OiAxO1xyXG4gIH1cclxuXHJcbiAgJl9oaWRkZW4ge1xyXG4gICAgZGlzcGxheTogbm9uZTtcclxuICB9XHJcbn1cclxuIiwiLyoqXHJcbiAqIHJhZGl1cy5sZXNzIC0g5ZyG6KeS6K6+572uIG1peGlueCDlh73mlbBcclxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxyXG4gKiBDcmVhdGVkIEJ5OiBZYW9oYWl4aWFvXHJcbiAqIFVwZGF0ZTogMjAyNC40LjE2XHJcbiAqL1xyXG5cclxuLyogPT09PT09IOWchuinkuagt+W8j+iuvue9ruWHveaVsCA9PT09PT0gKi9cclxuLnJhZGl1cyhAbnVtOiAycHgpIHtcclxuICBib3JkZXItcmFkaXVzOiBAbnVtO1xyXG59XHJcblxyXG4ucmFkaXVzX25vbmUoKSB7XHJcbiAgLnJhZGl1cygwKTtcclxufVxyXG5cclxuLnJhZGl1c19taW5pKCkge1xyXG4gIC5yYWRpdXMoMnB4KTtcclxufVxyXG5cclxuLnJhZGl1c19zbWFsbCgpIHtcclxuICAucmFkaXVzKDNweCk7XHJcbn1cclxuXHJcbi5yYWRpdXNfcmVndWxhcigpIHtcclxuICAucmFkaXVzKDRweCk7XHJcbn1cclxuXHJcbi5yYWRpdXNfbWVkaXVtKCkge1xyXG4gIC5yYWRpdXMoNXB4KTtcclxufVxyXG5cclxuLnJhZGl1c19sYXJnZSgpIHtcclxuICAucmFkaXVzKDEwcHgpO1xyXG59XHJcblxyXG4ucmFkaXVzX2h1Z2UoKSB7XHJcbiAgLnJhZGl1cygxNnB4KTtcclxufVxyXG5cclxuLnJhZGl1c19yb3VuZCgpIHtcclxuICAucmFkaXVzKDMwcHgpO1xyXG59XHJcbiIsIi8qKlxyXG4gKiBzaGFkb3cubGVzcyAtIOmYtOW9seagt+W8j+iuvue9riBtaXhpbngg5Ye95pWwXHJcbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cclxuICogQ3JlYXRlZCBCeTogWWFvaGFpeGlhb1xyXG4gKiBVcGRhdGU6IDIwMjIuMy4yMFxyXG4gKi9cclxuQGltcG9ydCAnLi9jb2xvcnMnO1xyXG5cclxuLyogPT09PT09IOmYtOW9seagt+W8j+iuvue9ruWHveaVsCA9PT09PT0gKi9cclxuLnNoYWRvdyhAb2Zmc2V0OiAwIDAgNnB4IDFweCwgQGNvbG9yOiBAcHJpbWFyeV9ib3JkZXJfY29sb3IpIHtcclxuICBib3gtc2hhZG93OiBAb2Zmc2V0IEBjb2xvcjtcclxufVxyXG5cclxuLnNoYWRvd19yZWd1bGFyKEBjb2xvcjogQHByaW1hcnlfYm9yZGVyX2NvbG9yKSB7XHJcbiAgLnNoYWRvdygwIDAgNnB4IDFweCwgQGNvbG9yKTtcclxufVxyXG5cclxuLnNoYWRvd19sYXJnZShAY29sb3I6IEBwcmltYXJ5X2JvcmRlcl9jb2xvcikge1xyXG4gIC5zaGFkb3coMCAwIDEycHggMXB4LCBAY29sb3IpO1xyXG59XHJcblxyXG4uc2hhZG93X2xpZ2h0X3JlZ3VsYXIoKSB7XHJcbiAgLnNoYWRvd19yZWd1bGFyKCk7XHJcbn1cclxuXHJcbi5zaGFkb3dfbGlnaHRfbGFyZ2UoKSB7XHJcbiAgLnNoYWRvd19sYXJnZSgpO1xyXG59XHJcblxyXG4uc2hhZG93X2RhcmtfcmVndWxhcigpIHtcclxuICAuc2hhZG93X3JlZ3VsYXIoQHNlY29uZGFyeV9ib3JkZXJfY29sb3IpO1xyXG59XHJcblxyXG4uc2hhZG93X2RhcmtfbGFyZ2UoKSB7XHJcbiAgLnNoYWRvd19sYXJnZShAc2Vjb25kYXJ5X2JvcmRlcl9jb2xvcik7XHJcbn1cclxuIiwiLyoqXHJcbiAqIGVsbGlwc2lzLmxlc3MgLSDmlofmnKznnIHnlaUgbWl4aW54IOWHveaVsFxyXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XHJcbiAqIENyZWF0ZWQgQnk6IFlhb2hhaXhpYW9cclxuICogVXBkYXRlOiAyMDIyLjMuMTFcclxuICovXHJcblxyXG4vKiA9PT09PT0g5paH5pys55yB55Wl5Ye95pWwID09PT09PSAqL1xyXG4uZWxsaXBzaXMgKEBsaW5lcykgd2hlbiAoQGxpbmVzPTEpIHtcclxuICB3aGl0ZS1zcGFjZTogbm93cmFwO1xyXG4gIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzO1xyXG4gIG92ZXJmbG93OiBoaWRkZW47XHJcbn1cclxuXHJcbi5lbGxpcHNpcyAoQGxpbmVzKSB3aGVuIChAbGluZXM+PTIpIHtcclxuICAtd2Via2l0LWxpbmUtY2xhbXA6IEBsaW5lcztcclxuICBkaXNwbGF5OiBib3g7XHJcbiAgLXdlYmtpdC1ib3gtb3JpZW50OiB2ZXJ0aWNhbDtcclxuICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpcztcclxuICBvdmVyZmxvdzogaGlkZGVuO1xyXG59XHJcbiJdfQ== */ diff --git a/message.min.css b/message.min.css deleted file mode 100644 index 29a5d0fc..00000000 --- a/message.min.css +++ /dev/null @@ -1,2 +0,0 @@ -.outline-icon{position:relative;z-index:1;display:inline-block;vertical-align:middle;width:1em;height:1em;overflow:hidden}.outline-icon__svg{position:absolute;z-index:2;top:50%;left:50%;width:1em;height:1em;fill:currentcolor;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%);overflow:hidden}.outline-message,.outline-message__close,.outline-message__content,.outline-message__icon{height:40px;line-height:40px;overflow:hidden}.outline-icon_hidden{display:none}.outline-message{border-radius:3px;-webkit-box-shadow:0 0 6px 1px #dcdfe6;box-shadow:0 0 6px 1px #dcdfe6;position:fixed;z-index:9999;opacity:.1;top:-50px;left:50%;margin:0;padding:0 50px;font-size:13px;background-color:#fff;color:#666;-webkit-transition:all .5s ease-in-out;transition:all .5s ease-in-out;-webkit-transform:translateX(-50%);transform:translateX(-50%)}.outline-message__content{white-space:nowrap;text-overflow:ellipsis;margin:0;max-width:700px;font-size:13px;color:#666}.outline-message__close,.outline-message__icon{position:absolute;z-index:2;top:0;width:40px;text-align:center}.outline-message__icon{left:0;color:#fff}.outline-message__icon .outline-icon{position:absolute;z-index:2;top:50%;left:50%;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%)}.outline-message__close{right:0;cursor:pointer;color:#999}.outline-message__close .outline-icon{position:absolute;z-index:2;top:50%;left:50%;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%)}.outline-message__close:hover{color:#666}.outline-message_info .outline-message__icon{background-color:#507afe}.outline-message_warning .outline-message__icon{background-color:#ff9901}.outline-message_success .outline-message__icon{background-color:#058942}.outline-message_error .outline-message__icon{background-color:#ff5d5d}.outline-message_plain{min-width:190px;padding:0 50px 0 15px}.outline-message_light,.outline-message_round.outline-message_default{min-width:180px;padding:0 40px}.outline-message_plain.outline-message_info{border-left:5px solid #507afe;background-color:#ecf8ff}.outline-message_plain.outline-message_warning{border-left:5px solid #ff9901;background-color:#fffbe6}.outline-message_plain.outline-message_success{border-left:5px solid #058942;background-color:#e1f6eb}.outline-message_plain.outline-message_error{border-left:5px solid #ff5d5d;background-color:#fff1f0}.outline-message_plain .outline-message__icon{width:0;display:none}.outline-message_plain .outline-message__icon .outline-icon{display:none}.outline-message_light.outline-message_info .outline-message__icon{color:#507afe}.outline-message_light.outline-message_warning .outline-message__icon{color:#ff9901}.outline-message_light.outline-message_success .outline-message__icon{color:#058942}.outline-message_light.outline-message_error .outline-message__icon{color:#ff5d5d}.outline-message_light .outline-message__icon{background-color:#fff}.outline-message_round{border-radius:20px}.outline-message_round.outline-message_default .outline-message__icon{border-radius:10px;top:10px;left:10px;width:20px;height:20px;line-height:20px}.outline-message_round.outline-message_default.outline-message_full-width{min-width:200px;padding:0 20px 0 40px}.outline-message_round.outline-message_plain{min-width:195px;padding:0 40px 0 20px}.outline-message_round.outline-message_plain.outline-message_full-width{min-width:215px;padding:0 20px}.outline-message_full-width{min-width:200px;padding:0 10px 0 50px}.outline-message_full-width.outline-message_plain{min-width:230px;padding:0 10px 0 15px}.outline-message_full-width.outline-message_light{min-width:210px;padding:0 10px 0 40px}.outline-message_visible{opacity:1}.outline-message_hidden{display:none} -/*# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlcyI6WyJtZXNzYWdlLmNzcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiA9PT09PT09PT09IGNvbG9ycy50aGVtZSAtIOWfuuehgOminOiJsuWPmOmHj+mbhuWQiCA9PT09PT09PT09ICovXG4vKipcbiAqIGZvbnQubGVzcyAtIOWtl+S9k+ebuOWFs+agt+W8j1xuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogQ3JlYXRlZCBCeTogWWFvaGFpeGlhb1xuICogVXBkYXRlOiAyMDIyLjMuMTZcbiAqL1xuLyogPT09PT09IOWtl+S9kyA9PT09PT0gKi9cbi8qID09PT09PSDlrZfph40gPT09PT09ICovXG4vKiA9PT09PT0g5a2X5Y+3ID09PT09PSAqL1xuLyogPT09PT09PT09PSBpY29uLnRoZW1lIC0gc3ZnIOWbvuagh+eahOagt+W8jyA9PT09PT09PT09ICovXG4ub3V0bGluZS1pY29uIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICB6LWluZGV4OiAxO1xuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XG4gIHdpZHRoOiAxZW07XG4gIGhlaWdodDogMWVtO1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLm91dGxpbmUtaWNvbl9fc3ZnIHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB6LWluZGV4OiAyO1xuICB0b3A6IDUwJTtcbiAgbGVmdDogNTAlO1xuICB3aWR0aDogMWVtO1xuICBoZWlnaHQ6IDFlbTtcbiAgZmlsbDogY3VycmVudGNvbG9yO1xuICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIC01MCUpO1xuICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIC01MCUpO1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLm91dGxpbmUtaWNvbl9oaWRkZW4ge1xuICBkaXNwbGF5OiBub25lO1xufVxuLyoqXG4gKiBtaXhpbnMubGVzcyAtIOW3peWFt+WHveaVsFxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogQ3JlYXRlZCBCeTogWWFvaGFpeGlhb1xuICogVXBkYXRlOiAyMDIyLjMuMTFcbiAqL1xuLyoqXG4gKiBlbGxpcHNpcy5sZXNzIC0g5paH5pys55yB55WlIG1peGlueCDlh73mlbBcbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIENyZWF0ZWQgQnk6IFlhb2hhaXhpYW9cbiAqIFVwZGF0ZTogMjAyMi4zLjExXG4gKi9cbi8qID09PT09PSDmlofmnKznnIHnlaXlh73mlbAgPT09PT09ICovXG4vKipcbiAqIHJhZGl1cy5sZXNzIC0g5ZyG6KeS6K6+572uIG1peGlueCDlh73mlbBcbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIENyZWF0ZWQgQnk6IFlhb2hhaXhpYW9cbiAqIFVwZGF0ZTogMjAyNC40LjE2XG4gKi9cbi8qID09PT09PSDlnIbop5LmoLflvI/orr7nva7lh73mlbAgPT09PT09ICovXG4vKipcbiAqIHNoYWRvdy5sZXNzIC0g6Zi05b2x5qC35byP6K6+572uIG1peGlueCDlh73mlbBcbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIENyZWF0ZWQgQnk6IFlhb2hhaXhpYW9cbiAqIFVwZGF0ZTogMjAyMi4zLjIwXG4gKi9cbi8qID09PT09PSDpmLTlvbHmoLflvI/orr7nva7lh73mlbAgPT09PT09ICovXG4ub3V0bGluZS1tZXNzYWdlIHtcbiAgYm9yZGVyLXJhZGl1czogM3B4O1xuICAtd2Via2l0LWJveC1zaGFkb3c6IDAgMCA2cHggMXB4ICNkY2RmZTY7XG4gICAgICAgICAgYm94LXNoYWRvdzogMCAwIDZweCAxcHggI2RjZGZlNjtcbiAgcG9zaXRpb246IGZpeGVkO1xuICB6LWluZGV4OiA5OTk5O1xuICBvcGFjaXR5OiAwLjE7XG4gIHRvcDogLTUwcHg7XG4gIGxlZnQ6IDUwJTtcbiAgaGVpZ2h0OiA0MHB4O1xuICBtYXJnaW46IDA7XG4gIHBhZGRpbmc6IDAgNTBweDtcbiAgbGluZS1oZWlnaHQ6IDQwcHg7XG4gIGZvbnQtc2l6ZTogMTNweDtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjtcbiAgY29sb3I6ICM2NjY7XG4gIC13ZWJraXQtdHJhbnNpdGlvbjogYWxsIDAuNXMgZWFzZS1pbi1vdXQ7XG4gIHRyYW5zaXRpb246IGFsbCAwLjVzIGVhc2UtaW4tb3V0O1xuICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlWCgtNTAlKTtcbiAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTUwJSk7XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4ub3V0bGluZS1tZXNzYWdlX19jb250ZW50IHtcbiAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbiAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7XG4gIG1hcmdpbjogMDtcbiAgbWF4LXdpZHRoOiA3MDBweDtcbiAgaGVpZ2h0OiA0MHB4O1xuICBsaW5lLWhlaWdodDogNDBweDtcbiAgZm9udC1zaXplOiAxM3B4O1xuICBjb2xvcjogIzY2NjtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi5vdXRsaW5lLW1lc3NhZ2VfX2Nsb3NlLFxuLm91dGxpbmUtbWVzc2FnZV9faWNvbiB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgei1pbmRleDogMjtcbiAgdG9wOiAwO1xuICB3aWR0aDogNDBweDtcbiAgaGVpZ2h0OiA0MHB4O1xuICBsaW5lLWhlaWdodDogNDBweDtcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLm91dGxpbmUtbWVzc2FnZV9faWNvbiB7XG4gIGxlZnQ6IDA7XG4gIGNvbG9yOiAjZmZmO1xufVxuLm91dGxpbmUtbWVzc2FnZV9faWNvbiAub3V0bGluZS1pY29uIHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB6LWluZGV4OiAyO1xuICB0b3A6IDUwJTtcbiAgbGVmdDogNTAlO1xuICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIC01MCUpO1xuICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIC01MCUpO1xufVxuLm91dGxpbmUtbWVzc2FnZV9fY2xvc2Uge1xuICByaWdodDogMDtcbiAgY3Vyc29yOiBwb2ludGVyO1xuICBjb2xvcjogIzk5OTtcbn1cbi5vdXRsaW5lLW1lc3NhZ2VfX2Nsb3NlIC5vdXRsaW5lLWljb24ge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHotaW5kZXg6IDI7XG4gIHRvcDogNTAlO1xuICBsZWZ0OiA1MCU7XG4gIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgLTUwJSk7XG4gICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgLTUwJSk7XG59XG4ub3V0bGluZS1tZXNzYWdlX19jbG9zZTpob3ZlciB7XG4gIGNvbG9yOiAjNjY2O1xufVxuLm91dGxpbmUtbWVzc2FnZV9pbmZvIC5vdXRsaW5lLW1lc3NhZ2VfX2ljb24ge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjNTA3YWZlO1xufVxuLm91dGxpbmUtbWVzc2FnZV93YXJuaW5nIC5vdXRsaW5lLW1lc3NhZ2VfX2ljb24ge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmY5OTAxO1xufVxuLm91dGxpbmUtbWVzc2FnZV9zdWNjZXNzIC5vdXRsaW5lLW1lc3NhZ2VfX2ljb24ge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjMDU4OTQyO1xufVxuLm91dGxpbmUtbWVzc2FnZV9lcnJvciAub3V0bGluZS1tZXNzYWdlX19pY29uIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ZmNWQ1ZDtcbn1cbi5vdXRsaW5lLW1lc3NhZ2VfcGxhaW4ge1xuICBtaW4td2lkdGg6IDE5MHB4O1xuICBwYWRkaW5nOiAwIDUwcHggMCAxNXB4O1xufVxuLm91dGxpbmUtbWVzc2FnZV9wbGFpbi5vdXRsaW5lLW1lc3NhZ2VfaW5mbyB7XG4gIGJvcmRlci1sZWZ0OiA1cHggc29saWQgIzUwN2FmZTtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2VjZjhmZjtcbn1cbi5vdXRsaW5lLW1lc3NhZ2VfcGxhaW4ub3V0bGluZS1tZXNzYWdlX3dhcm5pbmcge1xuICBib3JkZXItbGVmdDogNXB4IHNvbGlkICNmZjk5MDE7XG4gIGJhY2tncm91bmQtY29sb3I6ICNmZmZiZTY7XG59XG4ub3V0bGluZS1tZXNzYWdlX3BsYWluLm91dGxpbmUtbWVzc2FnZV9zdWNjZXNzIHtcbiAgYm9yZGVyLWxlZnQ6IDVweCBzb2xpZCAjMDU4OTQyO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZTFmNmViO1xufVxuLm91dGxpbmUtbWVzc2FnZV9wbGFpbi5vdXRsaW5lLW1lc3NhZ2VfZXJyb3Ige1xuICBib3JkZXItbGVmdDogNXB4IHNvbGlkICNmZjVkNWQ7XG4gIGJhY2tncm91bmQtY29sb3I6ICNmZmYxZjA7XG59XG4ub3V0bGluZS1tZXNzYWdlX3BsYWluIC5vdXRsaW5lLW1lc3NhZ2VfX2ljb24ge1xuICB3aWR0aDogMDtcbiAgZGlzcGxheTogbm9uZTtcbn1cbi5vdXRsaW5lLW1lc3NhZ2VfcGxhaW4gLm91dGxpbmUtbWVzc2FnZV9faWNvbiAub3V0bGluZS1pY29uIHtcbiAgZGlzcGxheTogbm9uZTtcbn1cbi5vdXRsaW5lLW1lc3NhZ2VfbGlnaHQge1xuICBtaW4td2lkdGg6IDE4MHB4O1xuICBwYWRkaW5nOiAwIDQwcHg7XG59XG4ub3V0bGluZS1tZXNzYWdlX2xpZ2h0Lm91dGxpbmUtbWVzc2FnZV9pbmZvIC5vdXRsaW5lLW1lc3NhZ2VfX2ljb24ge1xuICBjb2xvcjogIzUwN2FmZTtcbn1cbi5vdXRsaW5lLW1lc3NhZ2VfbGlnaHQub3V0bGluZS1tZXNzYWdlX3dhcm5pbmcgLm91dGxpbmUtbWVzc2FnZV9faWNvbiB7XG4gIGNvbG9yOiAjZmY5OTAxO1xufVxuLm91dGxpbmUtbWVzc2FnZV9saWdodC5vdXRsaW5lLW1lc3NhZ2Vfc3VjY2VzcyAub3V0bGluZS1tZXNzYWdlX19pY29uIHtcbiAgY29sb3I6ICMwNTg5NDI7XG59XG4ub3V0bGluZS1tZXNzYWdlX2xpZ2h0Lm91dGxpbmUtbWVzc2FnZV9lcnJvciAub3V0bGluZS1tZXNzYWdlX19pY29uIHtcbiAgY29sb3I6ICNmZjVkNWQ7XG59XG4ub3V0bGluZS1tZXNzYWdlX2xpZ2h0IC5vdXRsaW5lLW1lc3NhZ2VfX2ljb24ge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmO1xufVxuLm91dGxpbmUtbWVzc2FnZV9yb3VuZCB7XG4gIGJvcmRlci1yYWRpdXM6IDIwcHg7XG59XG4ub3V0bGluZS1tZXNzYWdlX3JvdW5kLm91dGxpbmUtbWVzc2FnZV9kZWZhdWx0IHtcbiAgbWluLXdpZHRoOiAxODBweDtcbiAgcGFkZGluZzogMCA0MHB4O1xufVxuLm91dGxpbmUtbWVzc2FnZV9yb3VuZC5vdXRsaW5lLW1lc3NhZ2VfZGVmYXVsdCAub3V0bGluZS1tZXNzYWdlX19pY29uIHtcbiAgYm9yZGVyLXJhZGl1czogMTBweDtcbiAgdG9wOiAxMHB4O1xuICBsZWZ0OiAxMHB4O1xuICB3aWR0aDogMjBweDtcbiAgaGVpZ2h0OiAyMHB4O1xuICBsaW5lLWhlaWdodDogMjBweDtcbn1cbi5vdXRsaW5lLW1lc3NhZ2Vfcm91bmQub3V0bGluZS1tZXNzYWdlX2RlZmF1bHQub3V0bGluZS1tZXNzYWdlX2Z1bGwtd2lkdGgge1xuICBtaW4td2lkdGg6IDIwMHB4O1xuICBwYWRkaW5nOiAwIDIwcHggMCA0MHB4O1xufVxuLm91dGxpbmUtbWVzc2FnZV9yb3VuZC5vdXRsaW5lLW1lc3NhZ2VfcGxhaW4ge1xuICBtaW4td2lkdGg6IDE5NXB4O1xuICBwYWRkaW5nOiAwIDQwcHggMCAyMHB4O1xufVxuLm91dGxpbmUtbWVzc2FnZV9yb3VuZC5vdXRsaW5lLW1lc3NhZ2VfcGxhaW4ub3V0bGluZS1tZXNzYWdlX2Z1bGwtd2lkdGgge1xuICBtaW4td2lkdGg6IDIxNXB4O1xuICBwYWRkaW5nOiAwIDIwcHg7XG59XG4ub3V0bGluZS1tZXNzYWdlX2Z1bGwtd2lkdGgge1xuICBtaW4td2lkdGg6IDIwMHB4O1xuICBwYWRkaW5nOiAwIDEwcHggMCA1MHB4O1xufVxuLm91dGxpbmUtbWVzc2FnZV9mdWxsLXdpZHRoLm91dGxpbmUtbWVzc2FnZV9wbGFpbiB7XG4gIG1pbi13aWR0aDogMjMwcHg7XG4gIHBhZGRpbmc6IDAgMTBweCAwIDE1cHg7XG59XG4ub3V0bGluZS1tZXNzYWdlX2Z1bGwtd2lkdGgub3V0bGluZS1tZXNzYWdlX2xpZ2h0IHtcbiAgbWluLXdpZHRoOiAyMTBweDtcbiAgcGFkZGluZzogMCAxMHB4IDAgNDBweDtcbn1cbi5vdXRsaW5lLW1lc3NhZ2VfdmlzaWJsZSB7XG4gIG9wYWNpdHk6IDE7XG59XG4ub3V0bGluZS1tZXNzYWdlX2hpZGRlbiB7XG4gIGRpc3BsYXk6IG5vbmU7XG59XG5cbi8qIyBzb3VyY2VNYXBwaW5nVVJMPWRhdGE6YXBwbGljYXRpb24vanNvbjtjaGFyc2V0PXV0Zjg7YmFzZTY0LGV5SjJaWEp6YVc5dUlqb3pMQ0p6YjNWeVkyVnpJanBiSWk0dUx6eHBibkIxZENCamMzTWdOVDRpTENKcFkyOXVjeTVzWlhOeklpd2liV1Z6YzJGblpTNXNaWE56SWl3aWNtRmthWFZ6TG14bGMzTWlMQ0p6YUdGa2IzY3ViR1Z6Y3lJc0ltVnNiR2x3YzJsekxteGxjM01pWFN3aWJtRnRaWE1pT2x0ZExDSnRZWEJ3YVc1bmN5STZJa0ZCUVVFc2JVUkJRVzFFTzBGQlEyNUVPenM3T3p0SFFVdEhPMEZCUTBnc2MwSkJRWE5DTzBGQlEzUkNMSE5DUVVGelFqdEJRVU4wUWl4elFrRkJjMEk3UVVGRGRFSXNhMFJCUVd0RU8wRkRWR3hFTzBWQlEwVXNiVUpCUVVFN1JVRkRRU3hYUVVGQk8wVkJRMEVzYzBKQlFVRTdSVUZEUVN4MVFrRkJRVHRGUVVOQkxGZEJRVUU3UlVGRFFTeFpRVUZCTzBWQlEwRXNhVUpCUVVFN1EwUlhSRHRCUTFSRE8wVkJRMFVzYlVKQlFVRTdSVUZEUVN4WFFVRkJPMFZCUTBFc1UwRkJRVHRGUVVOQkxGVkJRVUU3UlVGRFFTeFhRVUZCTzBWQlEwRXNXVUZCUVR0RlFVTkJMRzFDUVVGQk8wVkJRMEVzZVVOQlFVRTdWVUZCUVN4cFEwRkJRVHRGUVVOQkxHbENRVUZCTzBORVYwZzdRVU5TUXp0RlFVTkZMR05CUVVFN1EwUlZTRHRCUVVORU96czdPenRIUVV0SE8wRkJRMGc3T3pzN08wZEJTMGM3UVVGRFNDd3dRa0ZCTUVJN1FVRkRNVUk3T3pzN08wZEJTMGM3UVVGRFNDdzBRa0ZCTkVJN1FVRkROVUk3T3pzN08wZEJTMGM3UVVGRFNDdzBRa0ZCTkVJN1FVVjJSRFZDTzBWRFNVVXNiVUpCUVVFN1JVTkRRU3gzUTBGQlFUdFZRVUZCTEdkRFFVRkJPMFZHUmtFc1owSkJRVUU3UlVGRFFTeGpRVUZCTzBWQlEwRXNZVUZCUVR0RlFVTkJMRmRCUVVFN1JVRkRRU3hWUVVGQk8wVkJRMEVzWVVGQlFUdEZRVU5CTEZWQlFVRTdSVUZEUVN4blFrRkJRVHRGUVVOQkxHdENRVUZCTzBWQlEwRXNaMEpCUVVFN1JVRkRRU3gxUWtGQlFUdEZRVU5CTEZsQlFVRTdSVUZEUVN4NVEwRkJRVHRGUVVGQkxHbERRVUZCTzBWQlEwRXNiME5CUVVFN1ZVRkJRU3cwUWtGQlFUdEZRVU5CTEdsQ1FVRkJPME5HZVVSRU8wRkZka1JETzBWSFprRXNiMEpCUVVFN1JVRkRRU3gzUWtGQlFUdEZTR2RDUlN4VlFVRkJPMFZCUTBFc2FVSkJRVUU3UlVGRFFTeGhRVUZCTzBWQlEwRXNhMEpCUVVFN1JVRkRRU3huUWtGQlFUdEZRVU5CTEZsQlFVRTdSVUZEUVN4cFFrRkJRVHREUmpCRVNEdEJSWFpFUXpzN1JVRkZSU3h0UWtGQlFUdEZRVU5CTEZkQlFVRTdSVUZEUVN4UFFVRkJPMFZCUTBFc1dVRkJRVHRGUVVOQkxHRkJRVUU3UlVGRFFTeHJRa0ZCUVR0RlFVTkJMRzFDUVVGQk8wVkJRMEVzYVVKQlFVRTdRMFo1UkVnN1FVVjBSRU03UlVGRFJTeFJRVUZCTzBWQlEwRXNXVUZCUVR0RFJuZEVTRHRCUlRGRVF6dEZRVXRKTEcxQ1FVRkJPMFZCUTBFc1YwRkJRVHRGUVVOQkxGTkJRVUU3UlVGRFFTeFZRVUZCTzBWQlEwRXNlVU5CUVVFN1ZVRkJRU3hwUTBGQlFUdERSbmRFVER0QlJYQkVRenRGUVVORkxGTkJRVUU3UlVGRFFTeG5Ra0ZCUVR0RlFVTkJMRmxCUVVFN1EwWnpSRWc3UVVWNlJFTTdSVUZOU1N4dFFrRkJRVHRGUVVOQkxGZEJRVUU3UlVGRFFTeFRRVUZCTzBWQlEwRXNWVUZCUVR0RlFVTkJMSGxEUVVGQk8xVkJRVUVzYVVOQlFVRTdRMFp6UkV3N1FVVnVSRWM3UlVGRFJTeFpRVUZCTzBOR2NVUk1PMEZGYWtSRE8wVkJSVWtzTUVKQlFVRTdRMFpyUkV3N1FVVTVRME03UlVGRlNTd3dRa0ZCUVR0RFJpdERURHRCUlRORFF6dEZRVVZKTERCQ1FVRkJPME5HTkVOTU8wRkZlRU5ETzBWQlJVa3NNRUpCUVVFN1EwWjVRMHc3UVVWeVEwTTdSVUZEUlN4cFFrRkJRVHRGUVVOQkxIVkNRVUZCTzBOR2RVTklPMEZGY0VOTE8wVkJRMFVzSzBKQlFVRTdSVUZEUVN3d1FrRkJRVHREUm5ORFVEdEJSVzVEU3p0RlFVTkZMQ3RDUVVGQk8wVkJRMEVzTUVKQlFVRTdRMFp4UTFBN1FVVnNRMHM3UlVGRFJTd3JRa0ZCUVR0RlFVTkJMREJDUVVGQk8wTkdiME5RTzBGRmFrTkxPMFZCUTBVc0swSkJRVUU3UlVGRFFTd3dRa0ZCUVR0RFJtMURVRHRCUlhwRVF6dEZRVEpDU1N4VFFVRkJPMFZCUTBFc1kwRkJRVHREUm1sRFREdEJSVGRFUXp0RlFTdENUU3hqUVVGQk8wTkdhVU5RTzBGRk5VSkRPMFZCUTBVc2FVSkJRVUU3UlVGRFFTeG5Ra0ZCUVR0RFJqaENTRHRCUlROQ1N6dEZRVVZKTEdWQlFVRTdRMFkwUWxRN1FVVjRRa3M3UlVGRlNTeGxRVUZCTzBOR2VVSlVPMEZGY2tKTE8wVkJSVWtzWlVGQlFUdERSbk5DVkR0QlJXeENTenRGUVVWSkxHVkJRVUU3UTBadFFsUTdRVVUxUTBNN1JVRXJRa2tzZFVKQlFVRTdRMFpuUWt3N1FVVmFRenRGUTNCTFFTeHZRa0ZCUVR0RFNHMU1SRHRCUlZoTE8wVkJRMFVzYVVKQlFVRTdSVUZEUVN4blFrRkJRVHREUm1GUU8wRkZaa3M3UlVONFMwb3NiMEpCUVVFN1JVUTRTMUVzVlVGQlFUdEZRVU5CTEZkQlFVRTdSVUZEUVN4WlFVRkJPMFZCUTBFc1lVRkJRVHRGUVVOQkxHdENRVUZCTzBOR1lWUTdRVVZXVHp0RlFVTkZMR2xDUVVGQk8wVkJRMEVzZFVKQlFVRTdRMFpaVkR0QlJWSkxPMFZCUTBVc2FVSkJRVUU3UlVGRFFTeDFRa0ZCUVR0RFJsVlFPMEZGVWs4N1JVRkRSU3hwUWtGQlFUdEZRVU5CTEdkQ1FVRkJPME5HVlZRN1FVVktRenRGUVVORkxHbENRVUZCTzBWQlEwRXNkVUpCUVVFN1EwWk5TRHRCUlVoTE8wVkJRMFVzYVVKQlFVRTdSVUZEUVN4MVFrRkJRVHREUmt0UU8wRkZSa3M3UlVGRFJTeHBRa0ZCUVR0RlFVTkJMSFZDUVVGQk8wTkdTVkE3UVVWRFF6dEZRVU5GTEZkQlFVRTdRMFpEU0R0QlJVVkRPMFZCUTBVc1kwRkJRVHREUmtGSUlpd2labWxzWlNJNkltMWxjM05oWjJVdVkzTnpJaXdpYzI5MWNtTmxjME52Ym5SbGJuUWlPbHNpTHlvZ1BUMDlQVDA5UFQwOVBTQmpiMnh2Y25NdWRHaGxiV1VnTFNEbG43cm5vWURwb3B6b2liTGxqNWpwaDQvcG00YmxrSWdnUFQwOVBUMDlQVDA5UFNBcUwxeHVMeW9xWEc0Z0tpQm1iMjUwTG14bGMzTWdMU0Rsclpma3ZaUG5tN2psaGJQbW9MZmx2STljYmlBcUlEMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQxY2JpQXFJRU55WldGMFpXUWdRbms2SUZsaGIyaGhhWGhwWVc5Y2JpQXFJRlZ3WkdGMFpUb2dNakF5TWk0ekxqRTJYRzRnS2k5Y2JpOHFJRDA5UFQwOVBTRGxyWmZrdlpNZ1BUMDlQVDA5SUNvdlhHNHZLaUE5UFQwOVBUMGc1YTJYNlllTklEMDlQVDA5UFNBcUwxeHVMeW9nUFQwOVBUMDlJT1d0bCtXUHR5QTlQVDA5UFQwZ0tpOWNiaThxSUQwOVBUMDlQVDA5UFQwZ2FXTnZiaTUwYUdWdFpTQXRJSE4yWnlEbG03N21vSWZubW9UbW9MZmx2SThnUFQwOVBUMDlQVDA5UFNBcUwxeHVMbTkxZEd4cGJtVXRhV052YmlCN1hHNGdJSEJ2YzJsMGFXOXVPaUJ5Wld4aGRHbDJaVHRjYmlBZ2VpMXBibVJsZURvZ01UdGNiaUFnWkdsemNHeGhlVG9nYVc1c2FXNWxMV0pzYjJOck8xeHVJQ0IyWlhKMGFXTmhiQzFoYkdsbmJqb2diV2xrWkd4bE8xeHVJQ0IzYVdSMGFEb2dNV1Z0TzF4dUlDQm9aV2xuYUhRNklERmxiVHRjYmlBZ2IzWmxjbVpzYjNjNklHaHBaR1JsYmp0Y2JuMWNiaTV2ZFhSc2FXNWxMV2xqYjI1ZlgzTjJaeUI3WEc0Z0lIQnZjMmwwYVc5dU9pQmhZbk52YkhWMFpUdGNiaUFnZWkxcGJtUmxlRG9nTWp0Y2JpQWdkRzl3T2lBMU1DVTdYRzRnSUd4bFpuUTZJRFV3SlR0Y2JpQWdkMmxrZEdnNklERmxiVHRjYmlBZ2FHVnBaMmgwT2lBeFpXMDdYRzRnSUdacGJHdzZJR04xY25KbGJuUmpiMnh2Y2p0Y2JpQWdkSEpoYm5ObWIzSnRPaUIwY21GdWMyeGhkR1VvTFRVd0pTd2dMVFV3SlNrN1hHNGdJRzkyWlhKbWJHOTNPaUJvYVdSa1pXNDdYRzU5WEc0dWIzVjBiR2x1WlMxcFkyOXVYMmhwWkdSbGJpQjdYRzRnSUdScGMzQnNZWGs2SUc1dmJtVTdYRzU5WEc0dktpcGNiaUFxSUcxcGVHbHVjeTVzWlhOeklDMGc1YmVsNVlXMzVZZTk1cFd3WEc0Z0tpQTlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVhHNGdLaUJEY21WaGRHVmtJRUo1T2lCWllXOW9ZV2w0YVdGdlhHNGdLaUJWY0dSaGRHVTZJREl3TWpJdU15NHhNVnh1SUNvdlhHNHZLaXBjYmlBcUlHVnNiR2x3YzJsekxteGxjM01nTFNEbWxvZm1uS3pubklIbmxhVWdiV2w0YVc1NElPV0h2ZWFWc0Z4dUlDb2dQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBWeHVJQ29nUTNKbFlYUmxaQ0JDZVRvZ1dXRnZhR0ZwZUdsaGIxeHVJQ29nVlhCa1lYUmxPaUF5TURJeUxqTXVNVEZjYmlBcUwxeHVMeW9nUFQwOVBUMDlJT2FXaCthY3JPZWNnZWVWcGVXSHZlYVZzQ0E5UFQwOVBUMGdLaTljYmk4cUtseHVJQ29nY21Ga2FYVnpMbXhsYzNNZ0xTRGxuSWJvcDVMb3JyN252YTRnYldsNGFXNTRJT1dIdmVhVnNGeHVJQ29nUFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVnh1SUNvZ1EzSmxZWFJsWkNCQ2VUb2dXV0Z2YUdGcGVHbGhiMXh1SUNvZ1ZYQmtZWFJsT2lBeU1ESTBMalF1TVRaY2JpQXFMMXh1THlvZ1BUMDlQVDA5SU9XY2h1aW5rdWFndCtXOGoraXV2dWU5cnVXSHZlYVZzQ0E5UFQwOVBUMGdLaTljYmk4cUtseHVJQ29nYzJoaFpHOTNMbXhsYzNNZ0xTRHBtTFRsdmJIbW9MZmx2SS9vcnI3bnZhNGdiV2w0YVc1NElPV0h2ZWFWc0Z4dUlDb2dQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBWeHVJQ29nUTNKbFlYUmxaQ0JDZVRvZ1dXRnZhR0ZwZUdsaGIxeHVJQ29nVlhCa1lYUmxPaUF5TURJeUxqTXVNakJjYmlBcUwxeHVMeW9nUFQwOVBUMDlJT21ZdE9XOXNlYWd0K1c4aitpdXZ1ZTlydVdIdmVhVnNDQTlQVDA5UFQwZ0tpOWNiaTV2ZFhSc2FXNWxMVzFsYzNOaFoyVWdlMXh1SUNCaWIzSmtaWEl0Y21Ga2FYVnpPaUF6Y0hnN1hHNGdJR0p2ZUMxemFHRmtiM2M2SURBZ01DQTJjSGdnTVhCNElDTmtZMlJtWlRZN1hHNGdJSEJ2YzJsMGFXOXVPaUJtYVhobFpEdGNiaUFnZWkxcGJtUmxlRG9nT1RrNU9UdGNiaUFnYjNCaFkybDBlVG9nTUM0eE8xeHVJQ0IwYjNBNklDMDFNSEI0TzF4dUlDQnNaV1owT2lBMU1DVTdYRzRnSUdobGFXZG9kRG9nTkRCd2VEdGNiaUFnYldGeVoybHVPaUF3TzF4dUlDQndZV1JrYVc1bk9pQXdJRFV3Y0hnN1hHNGdJR3hwYm1VdGFHVnBaMmgwT2lBME1IQjRPMXh1SUNCbWIyNTBMWE5wZW1VNklERXpjSGc3WEc0Z0lHSmhZMnRuY205MWJtUXRZMjlzYjNJNklDTm1abVk3WEc0Z0lHTnZiRzl5T2lBak5qWTJPMXh1SUNCMGNtRnVjMmwwYVc5dU9pQmhiR3dnTUM0MWN5QmxZWE5sTFdsdUxXOTFkRHRjYmlBZ2RISmhibk5tYjNKdE9pQjBjbUZ1YzJ4aGRHVllLQzAxTUNVcE8xeHVJQ0J2ZG1WeVpteHZkem9nYUdsa1pHVnVPMXh1ZlZ4dUxtOTFkR3hwYm1VdGJXVnpjMkZuWlY5ZlkyOXVkR1Z1ZENCN1hHNGdJSGRvYVhSbExYTndZV05sT2lCdWIzZHlZWEE3WEc0Z0lIUmxlSFF0YjNabGNtWnNiM2M2SUdWc2JHbHdjMmx6TzF4dUlDQnRZWEpuYVc0NklEQTdYRzRnSUcxaGVDMTNhV1IwYURvZ056QXdjSGc3WEc0Z0lHaGxhV2RvZERvZ05EQndlRHRjYmlBZ2JHbHVaUzFvWldsbmFIUTZJRFF3Y0hnN1hHNGdJR1p2Ym5RdGMybDZaVG9nTVROd2VEdGNiaUFnWTI5c2IzSTZJQ00yTmpZN1hHNGdJRzkyWlhKbWJHOTNPaUJvYVdSa1pXNDdYRzU5WEc0dWIzVjBiR2x1WlMxdFpYTnpZV2RsWDE5amJHOXpaU3hjYmk1dmRYUnNhVzVsTFcxbGMzTmhaMlZmWDJsamIyNGdlMXh1SUNCd2IzTnBkR2x2YmpvZ1lXSnpiMngxZEdVN1hHNGdJSG90YVc1a1pYZzZJREk3WEc0Z0lIUnZjRG9nTUR0Y2JpQWdkMmxrZEdnNklEUXdjSGc3WEc0Z0lHaGxhV2RvZERvZ05EQndlRHRjYmlBZ2JHbHVaUzFvWldsbmFIUTZJRFF3Y0hnN1hHNGdJSFJsZUhRdFlXeHBaMjQ2SUdObGJuUmxjanRjYmlBZ2IzWmxjbVpzYjNjNklHaHBaR1JsYmp0Y2JuMWNiaTV2ZFhSc2FXNWxMVzFsYzNOaFoyVmZYMmxqYjI0Z2UxeHVJQ0JzWldaME9pQXdPMXh1SUNCamIyeHZjam9nSTJabVpqdGNibjFjYmk1dmRYUnNhVzVsTFcxbGMzTmhaMlZmWDJsamIyNGdMbTkxZEd4cGJtVXRhV052YmlCN1hHNGdJSEJ2YzJsMGFXOXVPaUJoWW5OdmJIVjBaVHRjYmlBZ2VpMXBibVJsZURvZ01qdGNiaUFnZEc5d09pQTFNQ1U3WEc0Z0lHeGxablE2SURVd0pUdGNiaUFnZEhKaGJuTm1iM0p0T2lCMGNtRnVjMnhoZEdVb0xUVXdKU3dnTFRVd0pTazdYRzU5WEc0dWIzVjBiR2x1WlMxdFpYTnpZV2RsWDE5amJHOXpaU0I3WEc0Z0lISnBaMmgwT2lBd08xeHVJQ0JqZFhKemIzSTZJSEJ2YVc1MFpYSTdYRzRnSUdOdmJHOXlPaUFqT1RrNU8xeHVmVnh1TG05MWRHeHBibVV0YldWemMyRm5aVjlmWTJ4dmMyVWdMbTkxZEd4cGJtVXRhV052YmlCN1hHNGdJSEJ2YzJsMGFXOXVPaUJoWW5OdmJIVjBaVHRjYmlBZ2VpMXBibVJsZURvZ01qdGNiaUFnZEc5d09pQTFNQ1U3WEc0Z0lHeGxablE2SURVd0pUdGNiaUFnZEhKaGJuTm1iM0p0T2lCMGNtRnVjMnhoZEdVb0xUVXdKU3dnTFRVd0pTazdYRzU5WEc0dWIzVjBiR2x1WlMxdFpYTnpZV2RsWDE5amJHOXpaVHBvYjNabGNpQjdYRzRnSUdOdmJHOXlPaUFqTmpZMk8xeHVmVnh1TG05MWRHeHBibVV0YldWemMyRm5aVjlwYm1adklDNXZkWFJzYVc1bExXMWxjM05oWjJWZlgybGpiMjRnZTF4dUlDQmlZV05yWjNKdmRXNWtMV052Ykc5eU9pQWpOVEEzWVdabE8xeHVmVnh1TG05MWRHeHBibVV0YldWemMyRm5aVjkzWVhKdWFXNW5JQzV2ZFhSc2FXNWxMVzFsYzNOaFoyVmZYMmxqYjI0Z2UxeHVJQ0JpWVdOclozSnZkVzVrTFdOdmJHOXlPaUFqWm1ZNU9UQXhPMXh1ZlZ4dUxtOTFkR3hwYm1VdGJXVnpjMkZuWlY5emRXTmpaWE56SUM1dmRYUnNhVzVsTFcxbGMzTmhaMlZmWDJsamIyNGdlMXh1SUNCaVlXTnJaM0p2ZFc1a0xXTnZiRzl5T2lBak1EVTRPVFF5TzF4dWZWeHVMbTkxZEd4cGJtVXRiV1Z6YzJGblpWOWxjbkp2Y2lBdWIzVjBiR2x1WlMxdFpYTnpZV2RsWDE5cFkyOXVJSHRjYmlBZ1ltRmphMmR5YjNWdVpDMWpiMnh2Y2pvZ0kyWm1OV1ExWkR0Y2JuMWNiaTV2ZFhSc2FXNWxMVzFsYzNOaFoyVmZjR3hoYVc0Z2UxeHVJQ0J0YVc0dGQybGtkR2c2SURFNU1IQjRPMXh1SUNCd1lXUmthVzVuT2lBd0lEVXdjSGdnTUNBeE5YQjRPMXh1ZlZ4dUxtOTFkR3hwYm1VdGJXVnpjMkZuWlY5d2JHRnBiaTV2ZFhSc2FXNWxMVzFsYzNOaFoyVmZhVzVtYnlCN1hHNGdJR0p2Y21SbGNpMXNaV1owT2lBMWNIZ2djMjlzYVdRZ0l6VXdOMkZtWlR0Y2JpQWdZbUZqYTJkeWIzVnVaQzFqYjJ4dmNqb2dJMlZqWmpobVpqdGNibjFjYmk1dmRYUnNhVzVsTFcxbGMzTmhaMlZmY0d4aGFXNHViM1YwYkdsdVpTMXRaWE56WVdkbFgzZGhjbTVwYm1jZ2UxeHVJQ0JpYjNKa1pYSXRiR1ZtZERvZ05YQjRJSE52Ykdsa0lDTm1aams1TURFN1hHNGdJR0poWTJ0bmNtOTFibVF0WTI5c2IzSTZJQ05tWm1aaVpUWTdYRzU5WEc0dWIzVjBiR2x1WlMxdFpYTnpZV2RsWDNCc1lXbHVMbTkxZEd4cGJtVXRiV1Z6YzJGblpWOXpkV05qWlhOeklIdGNiaUFnWW05eVpHVnlMV3hsWm5RNklEVndlQ0J6YjJ4cFpDQWpNRFU0T1RReU8xeHVJQ0JpWVdOclozSnZkVzVrTFdOdmJHOXlPaUFqWlRGbU5tVmlPMXh1ZlZ4dUxtOTFkR3hwYm1VdGJXVnpjMkZuWlY5d2JHRnBiaTV2ZFhSc2FXNWxMVzFsYzNOaFoyVmZaWEp5YjNJZ2UxeHVJQ0JpYjNKa1pYSXRiR1ZtZERvZ05YQjRJSE52Ykdsa0lDTm1aalZrTldRN1hHNGdJR0poWTJ0bmNtOTFibVF0WTI5c2IzSTZJQ05tWm1ZeFpqQTdYRzU5WEc0dWIzVjBiR2x1WlMxdFpYTnpZV2RsWDNCc1lXbHVJQzV2ZFhSc2FXNWxMVzFsYzNOaFoyVmZYMmxqYjI0Z2UxeHVJQ0IzYVdSMGFEb2dNRHRjYmlBZ1pHbHpjR3hoZVRvZ2JtOXVaVHRjYm4xY2JpNXZkWFJzYVc1bExXMWxjM05oWjJWZmNHeGhhVzRnTG05MWRHeHBibVV0YldWemMyRm5aVjlmYVdOdmJpQXViM1YwYkdsdVpTMXBZMjl1SUh0Y2JpQWdaR2x6Y0d4aGVUb2dibTl1WlR0Y2JuMWNiaTV2ZFhSc2FXNWxMVzFsYzNOaFoyVmZiR2xuYUhRZ2UxeHVJQ0J0YVc0dGQybGtkR2c2SURFNE1IQjRPMXh1SUNCd1lXUmthVzVuT2lBd0lEUXdjSGc3WEc1OVhHNHViM1YwYkdsdVpTMXRaWE56WVdkbFgyeHBaMmgwTG05MWRHeHBibVV0YldWemMyRm5aVjlwYm1adklDNXZkWFJzYVc1bExXMWxjM05oWjJWZlgybGpiMjRnZTF4dUlDQmpiMnh2Y2pvZ0l6VXdOMkZtWlR0Y2JuMWNiaTV2ZFhSc2FXNWxMVzFsYzNOaFoyVmZiR2xuYUhRdWIzVjBiR2x1WlMxdFpYTnpZV2RsWDNkaGNtNXBibWNnTG05MWRHeHBibVV0YldWemMyRm5aVjlmYVdOdmJpQjdYRzRnSUdOdmJHOXlPaUFqWm1ZNU9UQXhPMXh1ZlZ4dUxtOTFkR3hwYm1VdGJXVnpjMkZuWlY5c2FXZG9kQzV2ZFhSc2FXNWxMVzFsYzNOaFoyVmZjM1ZqWTJWemN5QXViM1YwYkdsdVpTMXRaWE56WVdkbFgxOXBZMjl1SUh0Y2JpQWdZMjlzYjNJNklDTXdOVGc1TkRJN1hHNTlYRzR1YjNWMGJHbHVaUzF0WlhOellXZGxYMnhwWjJoMExtOTFkR3hwYm1VdGJXVnpjMkZuWlY5bGNuSnZjaUF1YjNWMGJHbHVaUzF0WlhOellXZGxYMTlwWTI5dUlIdGNiaUFnWTI5c2IzSTZJQ05tWmpWa05XUTdYRzU5WEc0dWIzVjBiR2x1WlMxdFpYTnpZV2RsWDJ4cFoyaDBJQzV2ZFhSc2FXNWxMVzFsYzNOaFoyVmZYMmxqYjI0Z2UxeHVJQ0JpWVdOclozSnZkVzVrTFdOdmJHOXlPaUFqWm1abU8xeHVmVnh1TG05MWRHeHBibVV0YldWemMyRm5aVjl5YjNWdVpDQjdYRzRnSUdKdmNtUmxjaTF5WVdScGRYTTZJREl3Y0hnN1hHNTlYRzR1YjNWMGJHbHVaUzF0WlhOellXZGxYM0p2ZFc1a0xtOTFkR3hwYm1VdGJXVnpjMkZuWlY5a1pXWmhkV3gwSUh0Y2JpQWdiV2x1TFhkcFpIUm9PaUF4T0RCd2VEdGNiaUFnY0dGa1pHbHVaem9nTUNBME1IQjRPMXh1ZlZ4dUxtOTFkR3hwYm1VdGJXVnpjMkZuWlY5eWIzVnVaQzV2ZFhSc2FXNWxMVzFsYzNOaFoyVmZaR1ZtWVhWc2RDQXViM1YwYkdsdVpTMXRaWE56WVdkbFgxOXBZMjl1SUh0Y2JpQWdZbTl5WkdWeUxYSmhaR2wxY3pvZ01UQndlRHRjYmlBZ2RHOXdPaUF4TUhCNE8xeHVJQ0JzWldaME9pQXhNSEI0TzF4dUlDQjNhV1IwYURvZ01qQndlRHRjYmlBZ2FHVnBaMmgwT2lBeU1IQjRPMXh1SUNCc2FXNWxMV2hsYVdkb2REb2dNakJ3ZUR0Y2JuMWNiaTV2ZFhSc2FXNWxMVzFsYzNOaFoyVmZjbTkxYm1RdWIzVjBiR2x1WlMxdFpYTnpZV2RsWDJSbFptRjFiSFF1YjNWMGJHbHVaUzF0WlhOellXZGxYMloxYkd3dGQybGtkR2dnZTF4dUlDQnRhVzR0ZDJsa2RHZzZJREl3TUhCNE8xeHVJQ0J3WVdSa2FXNW5PaUF3SURJd2NIZ2dNQ0EwTUhCNE8xeHVmVnh1TG05MWRHeHBibVV0YldWemMyRm5aVjl5YjNWdVpDNXZkWFJzYVc1bExXMWxjM05oWjJWZmNHeGhhVzRnZTF4dUlDQnRhVzR0ZDJsa2RHZzZJREU1TlhCNE8xeHVJQ0J3WVdSa2FXNW5PaUF3SURRd2NIZ2dNQ0F5TUhCNE8xeHVmVnh1TG05MWRHeHBibVV0YldWemMyRm5aVjl5YjNWdVpDNXZkWFJzYVc1bExXMWxjM05oWjJWZmNHeGhhVzR1YjNWMGJHbHVaUzF0WlhOellXZGxYMloxYkd3dGQybGtkR2dnZTF4dUlDQnRhVzR0ZDJsa2RHZzZJREl4TlhCNE8xeHVJQ0J3WVdSa2FXNW5PaUF3SURJd2NIZzdYRzU5WEc0dWIzVjBiR2x1WlMxdFpYTnpZV2RsWDJaMWJHd3RkMmxrZEdnZ2UxeHVJQ0J0YVc0dGQybGtkR2c2SURJd01IQjRPMXh1SUNCd1lXUmthVzVuT2lBd0lERXdjSGdnTUNBMU1IQjRPMXh1ZlZ4dUxtOTFkR3hwYm1VdGJXVnpjMkZuWlY5bWRXeHNMWGRwWkhSb0xtOTFkR3hwYm1VdGJXVnpjMkZuWlY5d2JHRnBiaUI3WEc0Z0lHMXBiaTEzYVdSMGFEb2dNak13Y0hnN1hHNGdJSEJoWkdScGJtYzZJREFnTVRCd2VDQXdJREUxY0hnN1hHNTlYRzR1YjNWMGJHbHVaUzF0WlhOellXZGxYMloxYkd3dGQybGtkR2d1YjNWMGJHbHVaUzF0WlhOellXZGxYMnhwWjJoMElIdGNiaUFnYldsdUxYZHBaSFJvT2lBeU1UQndlRHRjYmlBZ2NHRmtaR2x1WnpvZ01DQXhNSEI0SURBZ05EQndlRHRjYm4xY2JpNXZkWFJzYVc1bExXMWxjM05oWjJWZmRtbHphV0pzWlNCN1hHNGdJRzl3WVdOcGRIazZJREU3WEc1OVhHNHViM1YwYkdsdVpTMXRaWE56WVdkbFgyaHBaR1JsYmlCN1hHNGdJR1JwYzNCc1lYazZJRzV2Ym1VN1hHNTlYRzRpTENJdktpQTlQVDA5UFQwOVBUMDlJR2xqYjI0dWRHaGxiV1VnTFNCemRtY2c1WnUrNXFDSDU1cUU1cUMzNWJ5UElEMDlQVDA5UFQwOVBUMGdLaTljY2x4dUxtOTFkR3hwYm1VdGFXTnZiaUI3WEhKY2JpQWdjRzl6YVhScGIyNDZJSEpsYkdGMGFYWmxPMXh5WEc0Z0lIb3RhVzVrWlhnNklERTdYSEpjYmlBZ1pHbHpjR3hoZVRvZ2FXNXNhVzVsTFdKc2IyTnJPMXh5WEc0Z0lIWmxjblJwWTJGc0xXRnNhV2R1T2lCdGFXUmtiR1U3WEhKY2JpQWdkMmxrZEdnNklERmxiVHRjY2x4dUlDQm9aV2xuYUhRNklERmxiVHRjY2x4dUlDQnZkbVZ5Wm14dmR6b2dhR2xrWkdWdU8xeHlYRzVjY2x4dUlDQW1YMTl6ZG1jZ2UxeHlYRzRnSUNBZ2NHOXphWFJwYjI0NklHRmljMjlzZFhSbE8xeHlYRzRnSUNBZ2VpMXBibVJsZURvZ01qdGNjbHh1SUNBZ0lIUnZjRG9nTlRBbE8xeHlYRzRnSUNBZ2JHVm1kRG9nTlRBbE8xeHlYRzRnSUNBZ2QybGtkR2c2SURGbGJUdGNjbHh1SUNBZ0lHaGxhV2RvZERvZ01XVnRPMXh5WEc0Z0lDQWdabWxzYkRvZ1kzVnljbVZ1ZEdOdmJHOXlPMXh5WEc0Z0lDQWdkSEpoYm5ObWIzSnRPaUIwY21GdWMyeGhkR1VvTFRVd0pTd2dMVFV3SlNrN1hISmNiaUFnSUNCdmRtVnlabXh2ZHpvZ2FHbGtaR1Z1TzF4eVhHNGdJSDFjY2x4dVhISmNiaUFnSmw5b2FXUmtaVzRnZTF4eVhHNGdJQ0FnWkdsemNHeGhlVG9nYm05dVpUdGNjbHh1SUNCOVhISmNibjFjY2x4dUlpd2lRR2x0Y0c5eWRDQW5MaTlqYjJ4dmNuTW5PMXh5WEc1QWFXMXdiM0owSUNjdUwyWnZiblFuTzF4eVhHNUFhVzF3YjNKMElDY3VMMmxqYjI1ekp6dGNjbHh1UUdsdGNHOXlkQ0FuTGk5dGFYaHBibk1uTzF4eVhHNWNjbHh1TG05MWRHeHBibVV0YldWemMyRm5aU0I3WEhKY2JpQWdMbkpoWkdsMWMxOXpiV0ZzYkNncE8xeHlYRzRnSUM1emFHRmtiM2RmYkdsbmFIUmZjbVZuZFd4aGNpZ3BPMXh5WEc0Z0lIQnZjMmwwYVc5dU9pQm1hWGhsWkR0Y2NseHVJQ0I2TFdsdVpHVjRPaUE1T1RrNU8xeHlYRzRnSUc5d1lXTnBkSGs2SURBdU1UdGNjbHh1SUNCMGIzQTZJQzAxTUhCNE8xeHlYRzRnSUd4bFpuUTZJRFV3SlR0Y2NseHVJQ0JvWldsbmFIUTZJRFF3Y0hnN1hISmNiaUFnYldGeVoybHVPaUF3TzF4eVhHNGdJSEJoWkdScGJtYzZJREFnTlRCd2VEdGNjbHh1SUNCc2FXNWxMV2hsYVdkb2REb2dOREJ3ZUR0Y2NseHVJQ0JtYjI1MExYTnBlbVU2SUVCbWIyNTBYM05wZW1WZmMyMWhiR3c3WEhKY2JpQWdZbUZqYTJkeWIzVnVaQzFqYjJ4dmNqb2dRSGRvYVhSbE8xeHlYRzRnSUdOdmJHOXlPaUJBZEdocGNtUmZkR1Y0ZEY5amIyeHZjanRjY2x4dUlDQjBjbUZ1YzJsMGFXOXVPaUJoYkd3Z01DNDFjeUJsWVhObExXbHVMVzkxZER0Y2NseHVJQ0IwY21GdWMyWnZjbTA2SUhSeVlXNXpiR0YwWlZnb0xUVXdKU2s3WEhKY2JpQWdiM1psY21ac2IzYzZJR2hwWkdSbGJqdGNjbHh1WEhKY2JpQWdKbDlmWTI5dWRHVnVkQ0I3WEhKY2JpQWdJQ0F1Wld4c2FYQnphWE1vTVNrN1hISmNiaUFnSUNCdFlYSm5hVzQ2SURBN1hISmNiaUFnSUNCdFlYZ3RkMmxrZEdnNklEY3dNSEI0TzF4eVhHNGdJQ0FnYUdWcFoyaDBPaUEwTUhCNE8xeHlYRzRnSUNBZ2JHbHVaUzFvWldsbmFIUTZJRFF3Y0hnN1hISmNiaUFnSUNCbWIyNTBMWE5wZW1VNklERXpjSGc3WEhKY2JpQWdJQ0JqYjJ4dmNqb2dRSFJvYVhKa1gzUmxlSFJmWTI5c2IzSTdYSEpjYmlBZ0lDQnZkbVZ5Wm14dmR6b2dhR2xrWkdWdU8xeHlYRzRnSUgxY2NseHVYSEpjYmlBZ0psOWZZMnh2YzJVc1hISmNiaUFnSmw5ZmFXTnZiaUI3WEhKY2JpQWdJQ0J3YjNOcGRHbHZiam9nWVdKemIyeDFkR1U3WEhKY2JpQWdJQ0I2TFdsdVpHVjRPaUF5TzF4eVhHNGdJQ0FnZEc5d09pQXdPMXh5WEc0Z0lDQWdkMmxrZEdnNklEUXdjSGc3WEhKY2JpQWdJQ0JvWldsbmFIUTZJRFF3Y0hnN1hISmNiaUFnSUNCc2FXNWxMV2hsYVdkb2REb2dOREJ3ZUR0Y2NseHVJQ0FnSUhSbGVIUXRZV3hwWjI0NklHTmxiblJsY2p0Y2NseHVJQ0FnSUc5MlpYSm1iRzkzT2lCb2FXUmtaVzQ3WEhKY2JpQWdmVnh5WEc1Y2NseHVJQ0FtWDE5cFkyOXVJSHRjY2x4dUlDQWdJR3hsWm5RNklEQTdYSEpjYmlBZ0lDQmpiMnh2Y2pvZ1FIZG9hWFJsTzF4eVhHNWNjbHh1SUNBZ0lDNXZkWFJzYVc1bExXbGpiMjRnZTF4eVhHNGdJQ0FnSUNCd2IzTnBkR2x2YmpvZ1lXSnpiMngxZEdVN1hISmNiaUFnSUNBZ0lIb3RhVzVrWlhnNklESTdYSEpjYmlBZ0lDQWdJSFJ2Y0RvZ05UQWxPMXh5WEc0Z0lDQWdJQ0JzWldaME9pQTFNQ1U3WEhKY2JpQWdJQ0FnSUhSeVlXNXpabTl5YlRvZ2RISmhibk5zWVhSbEtDMDFNQ1VzSUMwMU1DVXBPMXh5WEc0Z0lDQWdmVnh5WEc0Z0lIMWNjbHh1WEhKY2JpQWdKbDlmWTJ4dmMyVWdlMXh5WEc0Z0lDQWdjbWxuYUhRNklEQTdYSEpjYmlBZ0lDQmpkWEp6YjNJNklIQnZhVzUwWlhJN1hISmNiaUFnSUNCamIyeHZjam9nUUdadmRYSjBhRjkwWlhoMFgyTnZiRzl5TzF4eVhHNWNjbHh1SUNBZ0lDNXZkWFJzYVc1bExXbGpiMjRnZTF4eVhHNGdJQ0FnSUNCd2IzTnBkR2x2YmpvZ1lXSnpiMngxZEdVN1hISmNiaUFnSUNBZ0lIb3RhVzVrWlhnNklESTdYSEpjYmlBZ0lDQWdJSFJ2Y0RvZ05UQWxPMXh5WEc0Z0lDQWdJQ0JzWldaME9pQTFNQ1U3WEhKY2JpQWdJQ0FnSUhSeVlXNXpabTl5YlRvZ2RISmhibk5zWVhSbEtDMDFNQ1VzSUMwMU1DVXBPMXh5WEc0Z0lDQWdmVnh5WEc1Y2NseHVJQ0FnSUNZNmFHOTJaWElnZTF4eVhHNGdJQ0FnSUNCamIyeHZjam9nUUhSb2FYSmtYM1JsZUhSZlkyOXNiM0k3WEhKY2JpQWdJQ0I5WEhKY2JpQWdmVnh5WEc1Y2NseHVJQ0FtWDJsdVptOGdlMXh5WEc0Z0lDQWdMbTkxZEd4cGJtVXRiV1Z6YzJGblpWOWZhV052YmlCN1hISmNiaUFnSUNBZ0lHSmhZMnRuY205MWJtUXRZMjlzYjNJNklFQndjbWx0WVhKNVgyTnZiRzl5TzF4eVhHNGdJQ0FnZlZ4eVhHNGdJSDFjY2x4dVhISmNiaUFnSmw5M1lYSnVhVzVuSUh0Y2NseHVJQ0FnSUM1dmRYUnNhVzVsTFcxbGMzTmhaMlZmWDJsamIyNGdlMXh5WEc0Z0lDQWdJQ0JpWVdOclozSnZkVzVrTFdOdmJHOXlPaUJBZDJGeWJtbHVaMTlqYjJ4dmNqdGNjbHh1SUNBZ0lIMWNjbHh1SUNCOVhISmNibHh5WEc0Z0lDWmZjM1ZqWTJWemN5QjdYSEpjYmlBZ0lDQXViM1YwYkdsdVpTMXRaWE56WVdkbFgxOXBZMjl1SUh0Y2NseHVJQ0FnSUNBZ1ltRmphMmR5YjNWdVpDMWpiMnh2Y2pvZ1FITjFZMk5sYzNOZlkyOXNiM0k3WEhKY2JpQWdJQ0I5WEhKY2JpQWdmVnh5WEc1Y2NseHVJQ0FtWDJWeWNtOXlJSHRjY2x4dUlDQWdJQzV2ZFhSc2FXNWxMVzFsYzNOaFoyVmZYMmxqYjI0Z2UxeHlYRzRnSUNBZ0lDQmlZV05yWjNKdmRXNWtMV052Ykc5eU9pQkFaR0Z1WjJWeVgyTnZiRzl5TzF4eVhHNGdJQ0FnZlZ4eVhHNGdJSDFjY2x4dVhISmNiaUFnSmw5d2JHRnBiaUI3WEhKY2JpQWdJQ0J0YVc0dGQybGtkR2c2SURFNU1IQjRPMXh5WEc0Z0lDQWdjR0ZrWkdsdVp6b2dNQ0ExTUhCNElEQWdNVFZ3ZUR0Y2NseHVYSEpjYmlBZ0lDQW1MbTkxZEd4cGJtVXRiV1Z6YzJGblpTQjdYSEpjYmlBZ0lDQWdJQ1pmYVc1bWJ5QjdYSEpjYmlBZ0lDQWdJQ0FnWW05eVpHVnlMV3hsWm5RNklEVndlQ0J6YjJ4cFpDQkFjSEpwYldGeWVWOWpiMnh2Y2p0Y2NseHVJQ0FnSUNBZ0lDQmlZV05yWjNKdmRXNWtMV052Ykc5eU9pQkFhVzVtYjE5MGFYQmZZbWRmWTI5c2IzSTdYSEpjYmlBZ0lDQWdJSDFjY2x4dVhISmNiaUFnSUNBZ0lDWmZkMkZ5Ym1sdVp5QjdYSEpjYmlBZ0lDQWdJQ0FnWW05eVpHVnlMV3hsWm5RNklEVndlQ0J6YjJ4cFpDQkFkMkZ5Ym1sdVoxOWpiMnh2Y2p0Y2NseHVJQ0FnSUNBZ0lDQmlZV05yWjNKdmRXNWtMV052Ykc5eU9pQkFkMkZ5Ym1sdVoxOTBhWEJmWW1kZlkyOXNiM0k3WEhKY2JpQWdJQ0FnSUgxY2NseHVYSEpjYmlBZ0lDQWdJQ1pmYzNWalkyVnpjeUI3WEhKY2JpQWdJQ0FnSUNBZ1ltOXlaR1Z5TFd4bFpuUTZJRFZ3ZUNCemIyeHBaQ0JBYzNWalkyVnpjMTlqYjJ4dmNqdGNjbHh1SUNBZ0lDQWdJQ0JpWVdOclozSnZkVzVrTFdOdmJHOXlPaUJBYzNWalkyVnpjMTkwYVhCZlltZGZZMjlzYjNJN1hISmNiaUFnSUNBZ0lIMWNjbHh1WEhKY2JpQWdJQ0FnSUNaZlpYSnliM0lnZTF4eVhHNGdJQ0FnSUNBZ0lHSnZjbVJsY2kxc1pXWjBPaUExY0hnZ2MyOXNhV1FnUUdSaGJtZGxjbDlqYjJ4dmNqdGNjbHh1SUNBZ0lDQWdJQ0JpWVdOclozSnZkVzVrTFdOdmJHOXlPaUJBWkdGdVoyVnlYM1JwY0Y5aVoxOWpiMnh2Y2p0Y2NseHVJQ0FnSUNBZ2ZWeHlYRzRnSUNBZ2ZWeHlYRzVjY2x4dUlDQWdJQzV2ZFhSc2FXNWxMVzFsYzNOaFoyVmZYMmxqYjI0Z2UxeHlYRzRnSUNBZ0lDQjNhV1IwYURvZ01EdGNjbHh1SUNBZ0lDQWdaR2x6Y0d4aGVUb2dibTl1WlR0Y2NseHVYSEpjYmlBZ0lDQWdJQzV2ZFhSc2FXNWxMV2xqYjI0Z2UxeHlYRzRnSUNBZ0lDQWdJR1JwYzNCc1lYazZJRzV2Ym1VN1hISmNiaUFnSUNBZ0lIMWNjbHh1SUNBZ0lIMWNjbHh1SUNCOVhISmNibHh5WEc0Z0lDWmZiR2xuYUhRZ2UxeHlYRzRnSUNBZ2JXbHVMWGRwWkhSb09pQXhPREJ3ZUR0Y2NseHVJQ0FnSUhCaFpHUnBibWM2SURBZ05EQndlRHRjY2x4dVhISmNiaUFnSUNBbUxtOTFkR3hwYm1VdGJXVnpjMkZuWlNCN1hISmNiaUFnSUNBZ0lDWmZhVzVtYnlCN1hISmNiaUFnSUNBZ0lDQWdMbTkxZEd4cGJtVXRiV1Z6YzJGblpWOWZhV052YmlCN1hISmNiaUFnSUNBZ0lDQWdJQ0JqYjJ4dmNqb2dRSEJ5YVcxaGNubGZZMjlzYjNJN1hISmNiaUFnSUNBZ0lDQWdmVnh5WEc0Z0lDQWdJQ0I5WEhKY2JseHlYRzRnSUNBZ0lDQW1YM2RoY201cGJtY2dlMXh5WEc0Z0lDQWdJQ0FnSUM1dmRYUnNhVzVsTFcxbGMzTmhaMlZmWDJsamIyNGdlMXh5WEc0Z0lDQWdJQ0FnSUNBZ1kyOXNiM0k2SUVCM1lYSnVhVzVuWDJOdmJHOXlPMXh5WEc0Z0lDQWdJQ0FnSUgxY2NseHVJQ0FnSUNBZ2ZWeHlYRzVjY2x4dUlDQWdJQ0FnSmw5emRXTmpaWE56SUh0Y2NseHVJQ0FnSUNBZ0lDQXViM1YwYkdsdVpTMXRaWE56WVdkbFgxOXBZMjl1SUh0Y2NseHVJQ0FnSUNBZ0lDQWdJR052Ykc5eU9pQkFjM1ZqWTJWemMxOWpiMnh2Y2p0Y2NseHVJQ0FnSUNBZ0lDQjlYSEpjYmlBZ0lDQWdJSDFjY2x4dVhISmNiaUFnSUNBZ0lDWmZaWEp5YjNJZ2UxeHlYRzRnSUNBZ0lDQWdJQzV2ZFhSc2FXNWxMVzFsYzNOaFoyVmZYMmxqYjI0Z2UxeHlYRzRnSUNBZ0lDQWdJQ0FnWTI5c2IzSTZJRUJrWVc1blpYSmZZMjlzYjNJN1hISmNiaUFnSUNBZ0lDQWdmVnh5WEc0Z0lDQWdJQ0I5WEhKY2JpQWdJQ0I5WEhKY2JseHlYRzRnSUNBZ0xtOTFkR3hwYm1VdGJXVnpjMkZuWlY5ZmFXTnZiaUI3WEhKY2JpQWdJQ0FnSUdKaFkydG5jbTkxYm1RdFkyOXNiM0k2SUVCM2FHbDBaVHRjY2x4dUlDQWdJSDFjY2x4dUlDQjlYSEpjYmx4eVhHNGdJQ1pmY205MWJtUWdlMXh5WEc0Z0lDQWdMbkpoWkdsMWN5Z3lNSEI0S1R0Y2NseHVYSEpjYmlBZ0lDQW1MbTkxZEd4cGJtVXRiV1Z6YzJGblpTQjdYSEpjYmlBZ0lDQWdJQ1pmWkdWbVlYVnNkQ0I3WEhKY2JpQWdJQ0FnSUNBZ2JXbHVMWGRwWkhSb09pQXhPREJ3ZUR0Y2NseHVJQ0FnSUNBZ0lDQndZV1JrYVc1bk9pQXdJRFF3Y0hnN1hISmNibHh5WEc0Z0lDQWdJQ0FnSUM1dmRYUnNhVzVsTFcxbGMzTmhaMlZmWDJsamIyNGdlMXh5WEc0Z0lDQWdJQ0FnSUNBZ0xuSmhaR2wxY3lneE1IQjRLVHRjY2x4dUlDQWdJQ0FnSUNBZ0lIUnZjRG9nTVRCd2VEdGNjbHh1SUNBZ0lDQWdJQ0FnSUd4bFpuUTZJREV3Y0hnN1hISmNiaUFnSUNBZ0lDQWdJQ0IzYVdSMGFEb2dNakJ3ZUR0Y2NseHVJQ0FnSUNBZ0lDQWdJR2hsYVdkb2REb2dNakJ3ZUR0Y2NseHVJQ0FnSUNBZ0lDQWdJR3hwYm1VdGFHVnBaMmgwT2lBeU1IQjRPMXh5WEc0Z0lDQWdJQ0FnSUgxY2NseHVYSEpjYmlBZ0lDQWdJQ0FnSmk1dmRYUnNhVzVsTFcxbGMzTmhaMlZmWm5Wc2JDMTNhV1IwYUNCN1hISmNiaUFnSUNBZ0lDQWdJQ0J0YVc0dGQybGtkR2c2SURJd01IQjRPMXh5WEc0Z0lDQWdJQ0FnSUNBZ2NHRmtaR2x1WnpvZ01DQXlNSEI0SURBZ05EQndlRHRjY2x4dUlDQWdJQ0FnSUNCOVhISmNiaUFnSUNBZ0lIMWNjbHh1WEhKY2JpQWdJQ0FnSUNaZmNHeGhhVzRnZTF4eVhHNGdJQ0FnSUNBZ0lHMXBiaTEzYVdSMGFEb2dNVGsxY0hnN1hISmNiaUFnSUNBZ0lDQWdjR0ZrWkdsdVp6b2dNQ0EwTUhCNElEQWdNakJ3ZUR0Y2NseHVYSEpjYmlBZ0lDQWdJQ0FnSmk1dmRYUnNhVzVsTFcxbGMzTmhaMlZmWm5Wc2JDMTNhV1IwYUNCN1hISmNiaUFnSUNBZ0lDQWdJQ0J0YVc0dGQybGtkR2c2SURJeE5YQjRPMXh5WEc0Z0lDQWdJQ0FnSUNBZ2NHRmtaR2x1WnpvZ01DQXlNSEI0TzF4eVhHNGdJQ0FnSUNBZ0lIMWNjbHh1SUNBZ0lDQWdmVnh5WEc0Z0lDQWdmVnh5WEc0Z0lIMWNjbHh1WEhKY2JpQWdKbDltZFd4c0xYZHBaSFJvSUh0Y2NseHVJQ0FnSUcxcGJpMTNhV1IwYURvZ01qQXdjSGc3WEhKY2JpQWdJQ0J3WVdSa2FXNW5PaUF3SURFd2NIZ2dNQ0ExTUhCNE8xeHlYRzVjY2x4dUlDQWdJQ1l1YjNWMGJHbHVaUzF0WlhOellXZGxJSHRjY2x4dUlDQWdJQ0FnSmw5d2JHRnBiaUI3WEhKY2JpQWdJQ0FnSUNBZ2JXbHVMWGRwWkhSb09pQXlNekJ3ZUR0Y2NseHVJQ0FnSUNBZ0lDQndZV1JrYVc1bk9pQXdJREV3Y0hnZ01DQXhOWEI0TzF4eVhHNGdJQ0FnSUNCOVhISmNibHh5WEc0Z0lDQWdJQ0FtWDJ4cFoyaDBJSHRjY2x4dUlDQWdJQ0FnSUNCdGFXNHRkMmxrZEdnNklESXhNSEI0TzF4eVhHNGdJQ0FnSUNBZ0lIQmhaR1JwYm1jNklEQWdNVEJ3ZUNBd0lEUXdjSGc3WEhKY2JpQWdJQ0FnSUgxY2NseHVJQ0FnSUgxY2NseHVJQ0I5WEhKY2JseHlYRzRnSUNaZmRtbHphV0pzWlNCN1hISmNiaUFnSUNCdmNHRmphWFI1T2lBeE8xeHlYRzRnSUgxY2NseHVYSEpjYmlBZ0psOW9hV1JrWlc0Z2UxeHlYRzRnSUNBZ1pHbHpjR3hoZVRvZ2JtOXVaVHRjY2x4dUlDQjlYSEpjYm4xY2NseHVJaXdpTHlvcVhISmNiaUFxSUhKaFpHbDFjeTVzWlhOeklDMGc1WnlHNktlUzZLNis1NzJ1SUcxcGVHbHVlQ0RsaDczbWxiQmNjbHh1SUNvZ1BUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFZ4eVhHNGdLaUJEY21WaGRHVmtJRUo1T2lCWllXOW9ZV2w0YVdGdlhISmNiaUFxSUZWd1pHRjBaVG9nTWpBeU5DNDBMakUyWEhKY2JpQXFMMXh5WEc1Y2NseHVMeW9nUFQwOVBUMDlJT1djaHVpbmt1YWd0K1c4aitpdXZ1ZTlydVdIdmVhVnNDQTlQVDA5UFQwZ0tpOWNjbHh1TG5KaFpHbDFjeWhBYm5WdE9pQXljSGdwSUh0Y2NseHVJQ0JpYjNKa1pYSXRjbUZrYVhWek9pQkFiblZ0TzF4eVhHNTlYSEpjYmx4eVhHNHVjbUZrYVhWelgyNXZibVVvS1NCN1hISmNiaUFnTG5KaFpHbDFjeWd3S1R0Y2NseHVmVnh5WEc1Y2NseHVMbkpoWkdsMWMxOXRhVzVwS0NrZ2UxeHlYRzRnSUM1eVlXUnBkWE1vTW5CNEtUdGNjbHh1ZlZ4eVhHNWNjbHh1TG5KaFpHbDFjMTl6YldGc2JDZ3BJSHRjY2x4dUlDQXVjbUZrYVhWektETndlQ2s3WEhKY2JuMWNjbHh1WEhKY2JpNXlZV1JwZFhOZmNtVm5kV3hoY2lncElIdGNjbHh1SUNBdWNtRmthWFZ6S0RSd2VDazdYSEpjYm4xY2NseHVYSEpjYmk1eVlXUnBkWE5mYldWa2FYVnRLQ2tnZTF4eVhHNGdJQzV5WVdScGRYTW9OWEI0S1R0Y2NseHVmVnh5WEc1Y2NseHVMbkpoWkdsMWMxOXNZWEpuWlNncElIdGNjbHh1SUNBdWNtRmthWFZ6S0RFd2NIZ3BPMXh5WEc1OVhISmNibHh5WEc0dWNtRmthWFZ6WDJoMVoyVW9LU0I3WEhKY2JpQWdMbkpoWkdsMWN5Z3hObkI0S1R0Y2NseHVmVnh5WEc1Y2NseHVMbkpoWkdsMWMxOXliM1Z1WkNncElIdGNjbHh1SUNBdWNtRmthWFZ6S0RNd2NIZ3BPMXh5WEc1OVhISmNiaUlzSWk4cUtseHlYRzRnS2lCemFHRmtiM2N1YkdWemN5QXRJT21ZdE9XOXNlYWd0K1c4aitpdXZ1ZTlyaUJ0YVhocGJuZ2c1WWU5NXBXd1hISmNiaUFxSUQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDFjY2x4dUlDb2dRM0psWVhSbFpDQkNlVG9nV1dGdmFHRnBlR2xoYjF4eVhHNGdLaUJWY0dSaGRHVTZJREl3TWpJdU15NHlNRnh5WEc0Z0tpOWNjbHh1UUdsdGNHOXlkQ0FuTGk5amIyeHZjbk1uTzF4eVhHNWNjbHh1THlvZ1BUMDlQVDA5SU9tWXRPVzlzZWFndCtXOGoraXV2dWU5cnVXSHZlYVZzQ0E5UFQwOVBUMGdLaTljY2x4dUxuTm9ZV1J2ZHloQWIyWm1jMlYwT2lBd0lEQWdObkI0SURGd2VDd2dRR052Ykc5eU9pQkFjSEpwYldGeWVWOWliM0prWlhKZlkyOXNiM0lwSUh0Y2NseHVJQ0JpYjNndGMyaGhaRzkzT2lCQWIyWm1jMlYwSUVCamIyeHZjanRjY2x4dWZWeHlYRzVjY2x4dUxuTm9ZV1J2ZDE5eVpXZDFiR0Z5S0VCamIyeHZjam9nUUhCeWFXMWhjbmxmWW05eVpHVnlYMk52Ykc5eUtTQjdYSEpjYmlBZ0xuTm9ZV1J2ZHlnd0lEQWdObkI0SURGd2VDd2dRR052Ykc5eUtUdGNjbHh1ZlZ4eVhHNWNjbHh1TG5Ob1lXUnZkMTlzWVhKblpTaEFZMjlzYjNJNklFQndjbWx0WVhKNVgySnZjbVJsY2w5amIyeHZjaWtnZTF4eVhHNGdJQzV6YUdGa2IzY29NQ0F3SURFeWNIZ2dNWEI0TENCQVkyOXNiM0lwTzF4eVhHNTlYSEpjYmx4eVhHNHVjMmhoWkc5M1gyeHBaMmgwWDNKbFozVnNZWElvS1NCN1hISmNiaUFnTG5Ob1lXUnZkMTl5WldkMWJHRnlLQ2s3WEhKY2JuMWNjbHh1WEhKY2JpNXphR0ZrYjNkZmJHbG5hSFJmYkdGeVoyVW9LU0I3WEhKY2JpQWdMbk5vWVdSdmQxOXNZWEpuWlNncE8xeHlYRzU5WEhKY2JseHlYRzR1YzJoaFpHOTNYMlJoY210ZmNtVm5kV3hoY2lncElIdGNjbHh1SUNBdWMyaGhaRzkzWDNKbFozVnNZWElvUUhObFkyOXVaR0Z5ZVY5aWIzSmtaWEpmWTI5c2IzSXBPMXh5WEc1OVhISmNibHh5WEc0dWMyaGhaRzkzWDJSaGNtdGZiR0Z5WjJVb0tTQjdYSEpjYmlBZ0xuTm9ZV1J2ZDE5c1lYSm5aU2hBYzJWamIyNWtZWEo1WDJKdmNtUmxjbDlqYjJ4dmNpazdYSEpjYm4xY2NseHVJaXdpTHlvcVhISmNiaUFxSUdWc2JHbHdjMmx6TG14bGMzTWdMU0RtbG9mbW5Lem5uSUhubGFVZ2JXbDRhVzU0SU9XSHZlYVZzRnh5WEc0Z0tpQTlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVhISmNiaUFxSUVOeVpXRjBaV1FnUW5rNklGbGhiMmhoYVhocFlXOWNjbHh1SUNvZ1ZYQmtZWFJsT2lBeU1ESXlMak11TVRGY2NseHVJQ292WEhKY2JseHlYRzR2S2lBOVBUMDlQVDBnNXBhSDVweXM1NXlCNTVXbDVZZTk1cFd3SUQwOVBUMDlQU0FxTDF4eVhHNHVaV3hzYVhCemFYTWdLRUJzYVc1bGN5a2dkMmhsYmlBb1FHeHBibVZ6UFRFcElIdGNjbHh1SUNCM2FHbDBaUzF6Y0dGalpUb2dibTkzY21Gd08xeHlYRzRnSUhSbGVIUXRiM1psY21ac2IzYzZJR1ZzYkdsd2MybHpPMXh5WEc0Z0lHOTJaWEptYkc5M09pQm9hV1JrWlc0N1hISmNibjFjY2x4dVhISmNiaTVsYkd4cGNITnBjeUFvUUd4cGJtVnpLU0IzYUdWdUlDaEFiR2x1WlhNK1BUSXBJSHRjY2x4dUlDQXRkMlZpYTJsMExXeHBibVV0WTJ4aGJYQTZJRUJzYVc1bGN6dGNjbHh1SUNCa2FYTndiR0Y1T2lCaWIzZzdYSEpjYmlBZ0xYZGxZbXRwZEMxaWIzZ3RiM0pwWlc1ME9pQjJaWEowYVdOaGJEdGNjbHh1SUNCMFpYaDBMVzkyWlhKbWJHOTNPaUJsYkd4cGNITnBjenRjY2x4dUlDQnZkbVZ5Wm14dmR6b2dhR2xrWkdWdU8xeHlYRzU5WEhKY2JpSmRmUT09ICovXG4iXSwiZmlsZSI6Im1lc3NhZ2UubWluLmNzcyJ9 */ diff --git a/message.min.js.map b/message.min.js.map deleted file mode 100644 index 77ac8c32..00000000 --- a/message.min.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"message.min.js","sources":["utils/types/isString.js","utils/lang/toString.js","utils/types/isFunction.js","utils/types/isObject.js","utils/types/isPlainObject.js","utils/types/isObjectLike.js","utils/lang/hasOwn.js","utils/lang/extend.js","utils/lang/later.js","utils/lang/stripScripts.js","utils/lang/encodeHTML.js","utils/types/isArray.js","utils/lang/cloneDeep.js","utils/lang/guid.js","utils/types/isElement.js","utils/types/isDOM.js","utils/types/isHTMLCollection.js","utils/types/isFragment.js","utils/types/isTextNode.js","utils/dom/hasClass.js","utils/dom/addClass.js","utils/dom/setAttribute.js","utils/dom/setAttributes.js","utils/dom/createElement.js","utils/dom/removeClass.js","utils/lang/trim.js","utils/icons/createElement.js","utils/types/isSVG.js","utils/icons/icon.js","utils/icons/symbols.js","utils/icons/defaults.js","utils/icons/getSymbols.js","utils/icons/getSymbol.js","utils/dom/matches.js","utils/dom/getParentOrHost.js","utils/event/enum.js","utils/event/_off.js","utils/event/_delete.js","utils/event/purgeElement.js","utils/event/getListeners.js","utils/event/off.js","utils/event/on.js","utils/event/getTarget.js","utils/dom/resolveTextNode.js","utils/dom/closest.js","utils/observer/_subscribers.js","utils/observer/_hasDirectSubscribersFor.js","utils/observer/has.js","utils/observer/_hasSubscribers.js","utils/observer/emit.js","utils/types/isTypedArray.js","utils/observer/_removeSubscriber.js","utils/observer/off.js","utils/observer/_removeSubscriberByToken.js","base.js","utils/observer/on.js","message.js","utils/icons/paint.js","utils/icons/add.js"],"sourcesContent":["/**\r\n * 检测数据是否为 String 类型\r\n * ========================================================================\r\n * @method isArray\r\n * @param {*} str\r\n * @returns {boolean}\r\n */\r\nconst isString = (str) => {\r\n return typeof str === 'string'\r\n}\r\n\r\nexport default isString\r\n","/**\r\n * Object 对象原型上的 toString 方法\r\n * ========================================================================\r\n * @method toString\r\n * @param {*} val\r\n * @returns {string}\r\n */\r\nconst toString = (val) => {\r\n return Object.prototype.toString.apply(val)\r\n}\r\n\r\nexport default toString\r\n","import toString from '../lang/toString'\r\n\r\n/**\r\n * 检测测试数据是否为 Function 类型\r\n * ========================================================================\r\n * @method isFunction\r\n * @param {*} val - (必须)待检测的数据\r\n * @returns {boolean} 'val' 是 Function 类型返回 true,否则返回 false\r\n */\r\nconst isFunction = (val) => {\r\n return typeof val === 'function' || toString(val) === '[object Function]'\r\n}\r\n\r\nexport default isFunction\r\n","import toString from '../lang/toString'\r\nimport isFunction from './isFunction'\r\n\r\n/**\r\n * 检测数据是否为 Object 类型\r\n * ========================================================================\r\n * @method isObject\r\n * @param {*} o\r\n * @returns {boolean}\r\n */\r\nconst isObject = (o) => {\r\n return (\r\n (toString(o) === '[object Object]' ||\r\n typeof o === 'object' ||\r\n isFunction(o)) &&\r\n o !== null\r\n )\r\n}\r\n\r\nexport default isObject\r\n","import isObjectLike from './isObjectLike'\r\n\r\n/**\r\n * 检测测试数据是否为普通对象\r\n * ========================================================================\r\n * @method isPlainObject\r\n * @param {Object} val - 要检测的数据\r\n * @returns {Boolean} 'val' 是普通对象,返回 true,否则返回 false\r\n */\r\nconst isPlainObject = (val) => {\r\n const getPrototypeOf = Object.getPrototypeOf\r\n let proto\r\n\r\n // Detect obvious negatives\r\n if (!isObjectLike(val)) {\r\n return false\r\n }\r\n\r\n proto = val.prototype\r\n\r\n // JavaScript 对象分为两种:普通对象和函数对象\r\n // 普通对象:原型是 __proto__,没有 prototype 原型(属性)\r\n // 函数对象:原型是 prototype ,prototype 只存在于函数对象上\r\n if (!proto) {\r\n return true\r\n }\r\n\r\n proto = val\r\n\r\n while (getPrototypeOf(proto) !== null) {\r\n proto = getPrototypeOf(proto)\r\n }\r\n\r\n return getPrototypeOf(val) === proto\r\n}\r\n\r\nexport default isPlainObject\r\n","import isObject from './isObject'\r\n\r\n/**\r\n * 检测测试数据是否为类似 Object 类型\r\n * ========================================================================\r\n * @method isObjectLike\r\n * @param {Object} val - 要检测的数据\r\n * @returns {Boolean} 'val' 是类似 Object 类型,返回 true,否则返回 false\r\n */\r\nconst isObjectLike = (val) => {\r\n return isObject(val) && val !== null\r\n}\r\n\r\nexport default isObjectLike\r\n","/**\r\n * 检测对象自身属性中是否具有指定的属性。\r\n * ========================================================================\r\n * @method hasOwn\r\n * @param {Object} obj - (必须)检测的目标对象\r\n * @param {String} prop - (必须)属性名\r\n * @returns {Boolean}\r\n */\r\nconst hasOwn = (obj, prop) => {\r\n const hasOwnProperty = Object.prototype.hasOwnProperty\r\n return obj && hasOwnProperty.call(obj, prop)\r\n}\r\n\r\nexport default hasOwn\r\n","import hasOwn from './hasOwn'\r\n\r\n/**\r\n * 扩展对象\r\n * ========================================================================\r\n * @method extend\r\n * @param {Object} origin\r\n * @param {Object} source\r\n */\r\nconst extend = (origin, source) => {\r\n const keys = Object.keys(source)\r\n\r\n keys.forEach((prop) => {\r\n if (hasOwn(source, prop)) {\r\n origin[prop] = source[prop]\r\n }\r\n })\r\n}\r\n\r\nexport default extend\r\n","import isFunction from '../types/isFunction'\r\n\r\n/**\r\n * later - 延迟执行方法\r\n * ========================================================================\r\n * @method later\r\n * @param {Function} fn\r\n * @param {Number} [delay]\r\n * @returns {number|boolean}\r\n */\r\nconst later = (fn, delay = 300) => {\r\n if (!isFunction(fn)) {\r\n return false\r\n }\r\n\r\n return setTimeout(() => {\r\n fn()\r\n }, delay)\r\n}\r\n\r\nexport default later\r\n","/**\r\n * 移除字符串中的 JavaScript 代码\r\n * ====================================================\r\n * @param {String} str\r\n * @returns {String}\r\n */\r\nconst stripScripts = (str) => {\r\n return str.replace(/]*>.*?<\\/script>/gi, '')\r\n}\r\n\r\nexport default stripScripts\r\n","/**\r\n * 转义字符串中的 HTML 标签\r\n * ========================================================================\r\n * @param {String} str - 需要转义的字符串\r\n * @returns {String}\r\n */\r\nconst encodeHTML = (str) => {\r\n const CHARTS = {\r\n '&': '&',\r\n '<': '<',\r\n '>': '>',\r\n \"'\": ''',\r\n '\"': '"'\r\n }\r\n\r\n return str.replace(/[&<>'\"]/g, (tag) => {\r\n return CHARTS[tag] || tag\r\n })\r\n}\r\n\r\nexport default encodeHTML\r\n","import toString from '../lang/toString'\r\n\r\n/**\r\n * 检测数据是否为 Array 类型\r\n * ========================================================================\r\n * @method isArray\r\n * @param {*} o\r\n * @returns {boolean}\r\n */\r\nconst isArray = (o) => {\r\n if (Array.isArray) {\r\n return Array.isArray(o)\r\n } else {\r\n return toString(o) === '[object Array]'\r\n }\r\n}\r\n\r\nexport default isArray\r\n","import isObject from '../types/isObject'\r\nimport isArray from '../types/isArray'\r\n\r\n/**\r\n * 深拷贝对象函数\r\n * ========================================================================\r\n * @methods cloneDeep\r\n * @param {Object} obj - 深拷贝的对象\r\n * @returns {Array|Object|*}\r\n *\r\n * @example\r\n * const arr = cloneDeep([2,3,4,6])\r\n * => [2,3,4,6]\r\n */\r\nconst cloneDeep = (obj) => {\r\n let clone = {}\r\n\r\n if (obj === null) {\r\n return null\r\n }\r\n\r\n if (isArray(obj)) {\r\n clone = Array.from(obj)\r\n } else {\r\n clone = Object.assign({}, obj)\r\n Object.keys(clone).forEach((key) => {\r\n return (clone[key] = isObject(obj[key]) ? cloneDeep(obj[key]) : obj[key])\r\n })\r\n }\r\n\r\n return clone\r\n}\r\n\r\nexport default cloneDeep\r\n","/**\r\n * 生成唯一 id 字符串的函数\r\n * ========================================================================\r\n * @method guid\r\n * @param {String} [prefix] - 生成 id 的前缀字符串\r\n * @return {String} 返回一个表示唯一 id 的字符串\r\n */\r\nconst guid = (() => {\r\n let uuid = 0\r\n\r\n return (prefix) => {\r\n uuid += 1\r\n\r\n return prefix ? prefix + '-' + uuid : 'guid-' + uuid\r\n }\r\n})()\r\n\r\nexport default guid\r\n","import isObject from './isObject'\r\n\r\n/**\r\n * 检测数据是否为 HTMLElement DOM 节点\r\n * ========================================================================\r\n * @method isElement\r\n * @param {*} o\r\n * @returns {boolean}\r\n */\r\nconst isElement = (o) => {\r\n return !!(isObject(o) && o.nodeName && o.tagName && o.nodeType === 1)\r\n}\r\n\r\nexport default isElement\r\n","import isObject from './isObject'\r\nimport isElement from './isElement'\r\nimport isHTMLCollection from './isHTMLCollection'\r\nimport isFragment from './isFragment'\r\nimport isTextNode from './isTextNode'\r\n\r\nconst isDOM = (el) => {\r\n return !!(\r\n isObject(el) &&\r\n (isElement(el) || isHTMLCollection(el) || isFragment(el) || isTextNode(el))\r\n )\r\n}\r\n\r\nexport default isDOM\r\n","import toString from '../lang/toString'\r\nimport isObject from './isObject'\r\n\r\nconst isHTMLCollection = (el) => {\r\n return !!(isObject(el) && toString(el) === '[object NodeList]')\r\n}\r\n\r\nexport default isHTMLCollection\r\n","import toString from '../lang/toString'\r\nimport isObject from './isObject'\r\n\r\nconst isFragment = (fragment) => {\r\n return !!(\r\n isObject(fragment) && toString(fragment) === '[object DocumentFragment]'\r\n )\r\n}\r\n\r\nexport default isFragment\r\n","import toString from '../lang/toString'\r\nimport isObject from './isObject'\r\n\r\nconst isTextNode = (el) => {\r\n return !!(\r\n isObject(el) &&\r\n (toString(el) === '[object Text]' || (el.tagName && el.nodeType === 3))\r\n )\r\n}\r\n\r\nexport default isTextNode\r\n","import isElement from '../types/isElement'\r\n/**\r\n * 检测 DOM 节点是否包含名为 className 的样式\r\n * ========================================================================\r\n * @method hasClass\r\n * @param {HTMLElement} el - DOM 节点\r\n * @param {String} className - 样式名称\r\n * @returns {Boolean}\r\n */\r\nconst hasClass = (el, className) => {\r\n const pattern = new RegExp('(\\\\s|^)' + className + '(\\\\s|$)')\r\n let allClass\r\n let classList\r\n\r\n if (!isElement(el)) {\r\n return false\r\n }\r\n\r\n allClass = el.className\r\n\r\n if (!allClass) {\r\n return false\r\n }\r\n\r\n classList = el.classList\r\n\r\n if (classList && classList.contains) {\r\n return el.classList.contains(className)\r\n }\r\n\r\n return !!pattern.exec(allClass)\r\n}\r\n\r\nexport default hasClass\r\n","import hasClass from './hasClass'\r\n\r\n/**\r\n * 给 DOM 节点添加名为 className 的样式\r\n * ========================================================================\r\n * @method addClass\r\n * @param {HTMLElement} el - DOM 节点\r\n * @param {String} className - 样式名称\r\n * @returns {Boolean}\r\n */\r\nconst addClass = (el, className) => {\r\n let classList\r\n let allClass\r\n\r\n if (hasClass(el, className)) {\r\n return false\r\n }\r\n\r\n classList = el.classList\r\n\r\n if (classList?.add) {\r\n if (className.indexOf(' ') > -1) {\r\n className.split(' ').forEach((name) => {\r\n classList.add(name)\r\n })\r\n } else {\r\n classList.add(className)\r\n }\r\n } else {\r\n allClass = el.className\r\n allClass += allClass.length > 0 ? ' ' + className : className\r\n el.className = allClass\r\n }\r\n}\r\n\r\nexport default addClass\r\n","import addClass from './addClass.js'\r\n\r\n/**\r\n * 给 DOM 节点设置属性/值\r\n * ========================================================================\r\n * @method setAttribute\r\n * @param {HTMLElement} el - DOM 节点\r\n * @param {String} attr - 属性名称\r\n * @param {String|Number|Boolean} value - 属性值\r\n */\r\nconst setAttribute = (el, attr, value) => {\r\n let tagName = el.tagName.toLowerCase()\r\n\r\n switch (attr) {\r\n case 'style':\r\n el.style.cssText = value\r\n break\r\n case 'value':\r\n if (tagName === 'input' || tagName === 'textarea') {\r\n el.value = value\r\n } else {\r\n el.setAttribute(attr, value)\r\n }\r\n break\r\n case 'htmlFor':\r\n el.setAttribute('for', value)\r\n break\r\n case 'className':\r\n addClass(el, value)\r\n break\r\n case 'innerHTML':\r\n el.innerHTML = value\r\n break\r\n case 'innerText':\r\n el.innerText = value\r\n break\r\n default:\r\n el.setAttribute(attr, value)\r\n break\r\n }\r\n}\r\n\r\nexport default setAttribute\r\n","import isObject from '../types/isObject'\r\nimport hasOwn from '../lang/hasOwn'\r\nimport setAttribute from './setAttribute'\r\n\r\nconst setAttributes = (el, attrs) => {\r\n if (!el || !isObject(attrs)) {\r\n return false\r\n }\r\n\r\n Object.keys(attrs).forEach((attr) => {\r\n const value = attrs[attr]\r\n if (hasOwn(attrs, attr)) {\r\n setAttribute(el, attr, value)\r\n }\r\n })\r\n}\r\n\r\nexport default setAttributes\r\n","import isObject from '../types/isObject'\r\nimport isString from '../types/isString'\r\nimport isArray from '../types/isArray'\r\nimport isDOM from '../types/isDOM'\r\nimport setAttributes from './setAttributes'\r\n\r\n/**\r\n * 创建 DOM 节点,并添加属性和子节点\r\n * ========================================================================\r\n * @method createElement\r\n * @param {String} tagName - 标签名称\r\n * @param {Object|Array|HTMLElement|DocumentFragment|String} attrs - 属性对象或者子节点\r\n * @param {Array|HTMLElement|DocumentFragment|String} [children] - 子节点数组\r\n * @returns {HTMLElement}\r\n */\r\nconst createElement = (tagName, attrs, children) => {\r\n const $fragment = document.createDocumentFragment()\r\n const $el = document.createElement(tagName)\r\n const isValidChild = (child) => {\r\n return isDOM(child) || isString(child)\r\n }\r\n const append = (child) => {\r\n let $child\r\n\r\n if (!isValidChild(child)) {\r\n return false\r\n }\r\n\r\n if (isDOM(child)) {\r\n $child = child\r\n } else if (isString(child)) {\r\n $child = document.createTextNode(child)\r\n }\r\n\r\n $fragment.appendChild($child)\r\n }\r\n\r\n if (isObject(attrs)) {\r\n setAttributes($el, attrs)\r\n } else if (isArray(attrs) && attrs.every((attr) => isValidChild(attr))) {\r\n attrs.forEach((child) => {\r\n append(child)\r\n })\r\n } else if (isDOM(attrs)) {\r\n append(attrs)\r\n } else if (isString(attrs)) {\r\n append(document.createTextNode(attrs))\r\n }\r\n\r\n if (isArray(children)) {\r\n children.forEach((child) => {\r\n append(child)\r\n })\r\n } else {\r\n append(children)\r\n }\r\n\r\n $el.appendChild($fragment)\r\n\r\n return $el\r\n}\r\n\r\nexport default createElement\r\n","import trim from '../lang/trim'\r\nimport hasClass from './hasClass'\r\n\r\n/**\r\n * 移除 DOM 节点的 className 样式\r\n * ========================================================================\r\n * @method removeClass\r\n * @param {HTMLElement} el - DOM 节点\r\n * @param {String} className - 样式名称\r\n * @returns {Boolean}\r\n */\r\nconst removeClass = (el, className) => {\r\n let allClass = el.className\r\n let classList\r\n\r\n if (!allClass || !hasClass(el, className)) {\r\n return false\r\n }\r\n\r\n classList = el.classList\r\n\r\n if (classList?.remove) {\r\n classList.remove(className)\r\n } else {\r\n allClass = trim(allClass.replace(className, ''))\r\n el.className = allClass\r\n }\r\n}\r\n\r\nexport default removeClass\r\n","import isString from '../types/isString'\r\n\r\n/**\r\n * 清楚字符串起始位置所有的空格\r\n * ========================================================================\r\n * @method trim\r\n * @param {string} str\r\n * @returns {string|Boolean}\r\n */\r\nconst trim = (str) => {\r\n if (!isString(str)) {\r\n return false\r\n }\r\n return str.replace(/(^\\s+)|(\\s+$)/g, '')\r\n}\r\n\r\nexport default trim\r\n","import isArray from '../types/isArray'\r\nimport isString from '../types/isString'\r\nimport isSVG from '../types/isSVG'\r\nimport setAttributes from '../dom/setAttributes'\r\n\r\n/**\r\n * 创建 SVG 图标 DOM 元素\r\n * ========================================================================\r\n * @method createElement\r\n * @param {String} name\r\n * @param {Object} [options]\r\n * @param {Number|Array} [options.size]\r\n * @param {String} [options.color]\r\n * @param {String} [options.iconSet]\r\n * @param {Object} [options.attrs]\r\n * @returns {HTMLElement}\r\n */\r\nconst createElement = (name, options = {}) => {\r\n const ICON = 'outline-icon'\r\n const size = options.size || 0\r\n const color = options.color || ''\r\n const iconSet = options.iconSet || ''\r\n const width = isArray(size) ? size[0] : size\r\n const height = isArray(size) ? size[1] : size\r\n const defaultRules = size ? `width:${width}px;height:${height}px;` : ''\r\n const cssRules = color ? defaultRules + `color:${color}` : defaultRules\r\n const attrs = options.attrs || {}\r\n const $icon = document.createElement('i')\r\n let binds = ''\r\n let svg = ''\r\n let $svg\r\n\r\n if (!isString(name)) {\r\n return null\r\n }\r\n\r\n if (isSVG(name)) {\r\n svg = name\r\n } else {\r\n binds =\r\n iconSet && iconSet !== 'icon'\r\n ? `xlink:href=\"#${iconSet}-icon-${name}\"`\r\n : `xlink:href=\"#icon-${name}\"`\r\n svg = ``\r\n }\r\n\r\n $icon.innerHTML = svg\r\n\r\n if (attrs.className) {\r\n attrs.className = `${ICON} ${attrs.className}`\r\n } else {\r\n attrs.className = ICON\r\n }\r\n\r\n setAttributes($icon, attrs)\r\n\r\n $svg = $icon.querySelector('svg')\r\n setAttributes($svg, {\r\n 'aria-hidden': true,\r\n xmlns: 'http://www.w3.org/2000/svg',\r\n class: 'outline-icon__svg',\r\n width: 200,\r\n height: 200,\r\n style: cssRules\r\n })\r\n\r\n return $icon\r\n}\r\n\r\nexport default createElement\r\n","import isString from './isString'\r\n\r\nconst isSVG = (str) => {\r\n const declaration = '(?:<\\\\?xml[^>]*>\\\\s*)?'\r\n const doctype =\r\n '(?:<\\\\!doctype svg[^>]*\\\\s*(?:\\\\[?(?:\\\\s*]*>\\\\s*)*\\\\]?)*[^>]*>\\\\s*)?'\r\n const content = ']*>[^]*<\\\\/svg>\\\\s*$'\r\n const svg = `^\\\\s*${declaration}${doctype}${content}\\\\s*$`\r\n const pattern = new RegExp(svg, 'i')\r\n\r\n return isString(str) && pattern.test(str)\r\n}\r\n\r\nexport default isSVG\r\n","import createElement from './createElement'\r\n\r\n/**\r\n * 创建 SVG 图标 DOM 元素\r\n * ========================================================================\r\n * @method icon\r\n * @alias createElement\r\n * @see createElement\r\n * @param {String} name\r\n * @param {Object} [options]\r\n * @param {Number|Array} [options.size]\r\n * @param {String} [options.color]\r\n * @param {String} [options.iconSet]\r\n * @returns {HTMLElement}\r\n */\r\nconst icon = (name, options = {}) => {\r\n return createElement(name, options)\r\n}\r\n\r\nexport default icon\r\n","import DEFAULTS from './defaults'\r\n\r\nconst SYMBOLS = [...DEFAULTS]\r\n\r\nexport default SYMBOLS\r\n","const DEFAULTS = [\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n ''\r\n]\r\n\r\nexport default DEFAULTS\r\n","import isString from '../types/isString'\r\nimport getSymbol from './getSymbol'\r\nimport SYMBOLS from './symbols'\r\n\r\n/**\r\n *\r\n * @method getSymbols\r\n * @param {String} [name]\r\n * @param {String} [iconSet]\r\n * @returns {string[]|*}\r\n */\r\nconst getSymbols = (name, iconSet = 'icon') => {\r\n if (isString(name)) {\r\n return getSymbol(name, iconSet)\r\n }\r\n\r\n return [...SYMBOLS]\r\n}\r\n\r\nexport default getSymbols\r\n","import SYMBOLS from './symbols'\r\n\r\n/**\r\n * @method getSymbol\r\n * @param {String} name\r\n * @param {String} [iconSet]\r\n * @returns {String}\r\n */\r\nconst getSymbol = (name, iconSet = 'icon') => {\r\n const patternName = /id=\"(.*?)\"/\r\n const patternSet = /^(\\w+)-/\r\n const symbols = SYMBOLS\r\n\r\n return symbols.find((symbol) => {\r\n const names = patternName.exec(symbol)\r\n const fullName = names[1]\r\n const sets = patternSet.exec(fullName)\r\n const setName = sets[1]\r\n const iconName =\r\n iconSet === 'icon' ? `${iconSet}-${name}` : `${iconSet}-icon-${name}`\r\n\r\n return setName === iconSet && fullName === iconName\r\n })\r\n}\r\n\r\nexport default getSymbol\r\n","/**\r\n * 获取 options 节点下匹配 selector 选择器的 DOM 节点\r\n * ========================================================================\r\n * Element.matches() 方法可以用来判断 DOM 元素是否与给定的选择器匹配,事件代理判断是\r\n * 否触发绑定的代理事件回调函数,关键就是使用 Element.matches() 辨别当前事件触发的目\r\n * 标 DOM 元素是否为事件代理所期望触发的目标。\r\n * ========================================================================\r\n * @method matches\r\n * @see https://developer.mozilla.org/en-US/docs/web/api/element/matches\r\n * @param {HTMLElement} el - (必须)DOM 元素\r\n * @param {String} selector - (必须)匹配 DOM 元素的选择器\r\n * @returns {Boolean}\r\n */\r\nconst matches = (el, selector = '') => {\r\n const sel = selector.replace(/^>/i, '')\r\n\r\n if (!selector || !sel || !el) {\r\n return false\r\n }\r\n\r\n /* istanbul ignore else */\r\n if (el.matches) {\r\n return el.matches(sel)\r\n } else if (el.msMatchesSelector) {\r\n return el.msMatchesSelector(sel)\r\n } else {\r\n return false\r\n }\r\n}\r\n\r\nexport default matches\r\n","/**\r\n * 获取 DOM 元素的父节点\r\n * ========================================================================\r\n * @method getParentOrHost\r\n * @param {*|HTMLElement} el - (必须)要获取父节点的 DOM 元素\r\n * @returns {*|HTMLElement}\r\n */\r\nconst getParentOrHost = (el) => {\r\n return el.host && el !== document && el.host.nodeType\r\n ? el.host\r\n : el.parentNode\r\n}\r\n\r\nexport default getParentOrHost\r\n","export const CAPTURE_EVENTS = [\r\n 'focusout',\r\n 'blur',\r\n 'focusin',\r\n 'focus',\r\n 'load',\r\n 'unload',\r\n 'mouseenter',\r\n 'mouseleave'\r\n]\r\n","import { CAPTURE_EVENTS } from './enum'\r\nimport _delete from './_delete'\r\n\r\n/**\r\n * (私有方法)取消 type 类型的代理事件绑定\r\n * ========================================================================\r\n * 如果没有设置 handler,则销毁 this.$options 绑定的所有符合 type 事件类型的事件绑定\r\n * ========================================================================\r\n * @method _off\r\n * @param {HTMLElement} el - (必须)取消事件绑定的 DOM 元素\r\n * @param {String} type - (必须)事件类型\r\n * @param {Function} fn - (必须)事件处理器回调函数\r\n * @private\r\n */\r\nconst _off = (el, type, fn) => {\r\n const capture = CAPTURE_EVENTS.indexOf(type) > -1\r\n\r\n /* istanbul ignore else */\r\n if (fn._delegateListener) {\r\n fn = fn._delegateListener\r\n delete fn._delegateListener\r\n }\r\n\r\n // 移除缓存的 _listeners 数据\r\n _delete(el, type, fn)\r\n\r\n el.removeEventListener(type, fn, capture)\r\n}\r\n\r\nexport default _off\r\n","/**\r\n * 删除 DOM 元素缓存的 _listeners 数据\r\n * ========================================================================\r\n * @method _delete\r\n * @param {HTMLElement} el - 要删除 listener 的 DOM 元素\r\n * @param {String} type - 事件类型(名称)\r\n * @param {Function} [fn] - 事件处理器回调函数\r\n */\r\nconst _delete = function (el, type, fn) {\r\n const listeners = el._listeners\r\n let index = -1\r\n\r\n if (listeners.length < 1) {\r\n return false\r\n }\r\n\r\n // 移除缓存的 _listeners 数据\r\n listeners.forEach((listener, i) => {\r\n const handler = listener.fn\r\n\r\n if (type === listener.type) {\r\n index = i\r\n\r\n if (handler === fn) {\r\n index = i\r\n }\r\n }\r\n })\r\n\r\n /* istanbul ignore else */\r\n if (index > -1) {\r\n listeners.splice(index, 1)\r\n }\r\n}\r\n\r\nexport default _delete\r\n","import isString from '../types/isString'\r\nimport isElement from '../types/isElement'\r\nimport getListeners from './getListeners'\r\nimport _off from './_off'\r\n\r\n/**\r\n * 销毁(type 类型的)代理事件绑定\r\n * ========================================================================\r\n * 1. 设置了事件类型 type,则销毁指定类型的事件绑定,否则清除所有代理事件绑定\r\n * 2. recurse 设置为 true,递归销毁子节点全部事件绑定\r\n * ========================================================================\r\n * @method purgeElement\r\n * @param {HTMLElement|String} el - (必须)DOM 元素或者其选择器\r\n * @param {String|Boolean} type - (必须)事件类型\r\n * @param {Boolean} [recurse] - (可选)是否递归销毁子节点所有事件绑定\r\n */\r\nconst purgeElement = function (el, type, recurse = false) {\r\n const $element = isString(el) ? document.querySelector(el) : el\r\n const $children = $element.childNodes\r\n const listeners = getListeners($element, type)\r\n\r\n listeners.forEach((listener) => {\r\n _off($element, listener.type, listener.fn)\r\n })\r\n\r\n if (\r\n (recurse || type === true || arguments.length === 1) &&\r\n $element &&\r\n $children\r\n ) {\r\n $children.forEach(($child) => {\r\n if (isElement($child)) {\r\n purgeElement($child, type, recurse)\r\n }\r\n })\r\n }\r\n}\r\n\r\nexport default purgeElement\r\n","import isString from '../types/isString'\r\n\r\n/**\r\n * 获取 DOM 元素(type 事件类型)事件绑定信息\r\n * ========================================================================\r\n * 如果设置了事件类型 type, 则返回指定类型的事件绑定信息,否则返回所有事件绑定信息\r\n * ========================================================================\r\n * @methods getListeners\r\n * @param {HTMLElement} el - (必须)要获取事件绑定信息的 DOM 元素\r\n * @param {String} [type] - (可选)事件类型\r\n * @returns {Array} - 已绑定的事件信息\r\n */\r\nconst getListeners = (el, type) => {\r\n let listeners = el._listeners || []\r\n\r\n if (isString(type) && type) {\r\n listeners = listeners.filter((listener) => {\r\n return listener.type === type\r\n })\r\n }\r\n\r\n return listeners\r\n}\r\n\r\nexport default getListeners\r\n","import purgeElement from './purgeElement'\r\nimport isFunction from '../types/isFunction'\r\nimport _off from './_off'\r\n\r\n/**\r\n * 取消 type 类型的代理事件绑定\r\n * ========================================================================\r\n * 如果没有设置 handler,则销毁 this.$options 绑定的所有符合 type 事件类型的事件绑定\r\n * ========================================================================\r\n * @method off\r\n * @param {HTMLElement|Object} el - (必须)取消事件绑定的 DOM 元素\r\n * @param {String} type - (必须)事件类型\r\n * @param {Function} [fn] - (可选)事件处理器回调函数\r\n */\r\nconst off = (el, type, fn) => {\r\n // 如果不设置 fn 参数,默认清除 el 元素上绑定的所有事件处理器\r\n if (!isFunction(fn)) {\r\n purgeElement(el, type)\r\n return false\r\n }\r\n\r\n _off(el, type, fn)\r\n}\r\n\r\nexport default off\r\n","import closest from '../dom/closest'\r\nimport off from './off'\r\nimport getTarget from './getTarget'\r\n\r\nimport { CAPTURE_EVENTS } from './enum'\r\n\r\n/**\r\n * 绑定代理事件\r\n * ========================================================================\r\n * @method on\r\n * @param {HTMLElement|String|Object} el - (必须)绑定代理事件的 DOM 节点\r\n * @param {String} selector - (必须)事件代理目标 DOM 元素的选择器\r\n * @param {String|Function} type - (必须)事件类型或者事件处理器回调函数\r\n * @param {Function|Object} fn - (可选) 事件处理器回调函数或者传递给事件处理器回调函数的数据对象\r\n * @param {Object|Boolean} [data] - (可选)传递给事件处理器回调函数的数据对象或者事件处理器回调函数的 this 上下文指向,\r\n * @param {Object|Boolean} [context] - (可选)事件处理器回调函数的 this 上下文指向,或者是否仅触发一次\r\n * 当设置为 true 时,则事件处理器回调函数的 this 上下文指向为 data 对象\r\n * @param {Boolean} once - (可选)是否仅触发一次\r\n */\r\nconst on = (el, selector, type, fn, data, context, once = false) => {\r\n // CAPTURE_EVENTS 中的特殊事件,采用事件捕获模型\r\n const capture = CAPTURE_EVENTS.indexOf(type) > -1\r\n\r\n const listener = function (evt) {\r\n const target = getTarget(evt)\r\n // 通过 Element.matches 方法获得点击的目标元素\r\n const delegateTarget = closest(target, selector, el)\r\n let overrideContext = context || el\r\n\r\n evt.delegateTarget = delegateTarget\r\n\r\n // 当设置为 true 时,则事件处理器回调函数的\r\n // this 上下文指向为 data 对象\r\n if (context === true) {\r\n overrideContext = data\r\n }\r\n\r\n /* istanbul ignore else */\r\n if (delegateTarget) {\r\n // 仅触发一次\r\n /* istanbul ignore else */\r\n if (once === true) {\r\n off(el, type, listener)\r\n }\r\n\r\n fn.call(overrideContext, evt, data)\r\n }\r\n }\r\n\r\n if (!el) {\r\n return false\r\n }\r\n\r\n if (!el._listeners) {\r\n el._listeners = []\r\n }\r\n\r\n // 缓存 options 元素绑定的事件处理器\r\n el._listeners.push({\r\n el,\r\n selector,\r\n type,\r\n fn: listener,\r\n data,\r\n context,\r\n capture\r\n })\r\n\r\n // 缓存包装后的事件处理器\r\n fn._delegateListener = listener\r\n\r\n el.addEventListener(type, listener, capture)\r\n}\r\n\r\nexport default on\r\n","import resolveTextNode from '../dom/resolveTextNode'\r\n\r\n/**\r\n * 返回触发事件的 target DOM 元素\r\n * ========================================================================\r\n * @method getTarget\r\n * @param {Event} evt - Event 对象\r\n * @return {HTMLElement} - Event 对象的 target DOM 元素\r\n */\r\nconst getTarget = function (evt) {\r\n const target = evt.target\r\n\r\n return resolveTextNode(target)\r\n}\r\n\r\nexport default getTarget\r\n","/**\r\n * 在某些情况下,某些浏览器(例如:Safari 浏览器)会返回实际的目标元素内部的文本节点。\r\n * resolveTextNode() 方法则会返回实际的目标节点。\r\n * ========================================================================\r\n * @method resolveTextNode\r\n * @param {HTMLElement|Text} el - 要解析的节点\r\n * @return {*|HTMLElement} - 实际的目标 DOM 节点\r\n */\r\nconst resolveTextNode = function (el) {\r\n if (el && el.nodeType === 3) {\r\n return el.parentNode\r\n }\r\n\r\n return el\r\n}\r\n\r\nexport default resolveTextNode\r\n","import matches from './matches'\r\nimport getParentOrHost from './getParentOrHost'\r\n\r\n/**\r\n * 获取 options 元素父元素最近的包含 selector 选择器的元素\r\n * ========================================================================\r\n * @method closest\r\n * @param {HTMLElement} el - (必须)DOM 元素\r\n * @param {String} selector - (必须)DOM 元素的选择其\r\n * @param {HTMLElement} [ctx] - (必须)比对的 DOM 元素\r\n * @param {Boolean} [includeCTX] - (必须)是否包含 context DOM 元素\r\n * @returns {null|HTMLElement} - 返回最接近的 DOM 元素\r\n */\r\nconst closest = (el, selector, ctx, includeCTX) => {\r\n const context = ctx || document\r\n\r\n if (!el) {\r\n return null\r\n }\r\n\r\n do {\r\n /* istanbul ignore else */\r\n if (\r\n (selector != null &&\r\n (selector.startsWith('>')\r\n ? el.parentNode === context && matches(el, selector)\r\n : matches(el, selector))) ||\r\n (includeCTX && el === context)\r\n ) {\r\n return el\r\n }\r\n\r\n /* istanbul ignore else */\r\n if (el === context) {\r\n break\r\n }\r\n\r\n /* jshint boss:true */\r\n } while ((el = getParentOrHost(el)))\r\n}\r\n\r\nexport default closest\r\n","/**\r\n * 存储订阅者(主题和处理器的)私有对象\r\n * ========================================================================\r\n * @type {{}}\r\n * @private\r\n */\r\nconst _subscribers = {}\r\n\r\nexport default _subscribers\r\n","import _subscribers from './_subscribers'\r\nimport hasOwn from '../lang/hasOwn'\r\n\r\n/**\r\n * 判断是否存在与给定 topic 完全匹配的订阅者信息\r\n * ========================================================================\r\n * @method _hasDirectSubscribersFor\r\n * @param {String} topic - (必须)订阅主题字符串\r\n * @returns {Boolean}\r\n */\r\nconst _hasDirectSubscribersFor = (topic) => {\r\n return hasOwn(_subscribers, topic) && _subscribers[topic].length > 0\r\n}\r\n\r\nexport default _hasDirectSubscribersFor\r\n","import _hasDirectSubscribersFor from './_hasDirectSubscribersFor'\r\nimport _hasSubscribers from './_hasSubscribers'\r\n\r\n/**\r\n * 判断是否存在包含 topic 指定的订阅者信息\r\n * ========================================================================\r\n * @method has\r\n * @param {String} topic - (必须)主题名称\r\n * @param {Boolean} [isDirect] - (可选)是否为直接的主题,默认值:true\r\n * @returns {Boolean}\r\n */\r\nconst has = (topic, isDirect = true) => {\r\n return isDirect ? _hasDirectSubscribersFor(topic) : _hasSubscribers(topic)\r\n}\r\n\r\nexport default has\r\n","import _hasDirectSubscribersFor from './_hasDirectSubscribersFor'\r\n\r\n/**\r\n * 判断是否存在包含给定 topic 相关的订阅者信息\r\n * ========================================================================\r\n * @method _hasSubscribers\r\n * @param {String} topic - (必须)订阅主题字符串\r\n * @returns {Boolean}\r\n */\r\nconst _hasSubscribers = (topic) => {\r\n let found = _hasDirectSubscribersFor(topic)\r\n let position = topic.lastIndexOf('.')\r\n\r\n while (!found && position !== -1) {\r\n topic = topic.substring(0, position)\r\n position = topic.lastIndexOf('.')\r\n found = _hasDirectSubscribersFor(topic)\r\n }\r\n\r\n return found\r\n}\r\n\r\nexport default _hasSubscribers\r\n","import isTypedArray from '../types/isTypedArray'\r\nimport _subscribers from './_subscribers'\r\nimport has from './has'\r\nimport _hasDirectSubscribersFor from './_hasDirectSubscribersFor'\r\n\r\n/**\r\n * (异步)发布订阅主题信息\r\n * ========================================================================\r\n * 主题默认是异步发布的。确保在消费者处理主题时,主题的发起者不会被阻止。\r\n * ========================================================================\r\n * @method emit\r\n * @param {String} topic - (必须)主题名称\r\n * @param {Object} [data] - (可选)数据对象\r\n * @param {Boolean} [async] - (可选) 是否异步发布\r\n */\r\nconst emit = (topic, data, async = true) => {\r\n const execute = (topic) => {\r\n if (!_hasDirectSubscribersFor(topic)) {\r\n return false\r\n }\r\n\r\n _subscribers[topic].forEach((subscriber) => {\r\n // 针对 mqtt 消息服务返回的 Uint8Array 类似的 typed arrays 格式的数据\r\n // 采用 toString() 方法转化为普通(JSON)字符串\r\n const message = isTypedArray(data) ? data.toString() : data\r\n\r\n subscriber.callback.call(subscriber.context || subscriber, message)\r\n })\r\n }\r\n const deliver = () => {\r\n let subscriber = topic\r\n let position = topic.lastIndexOf('.')\r\n\r\n while (position !== -1) {\r\n subscriber = subscriber.substring(0, position)\r\n position = subscriber.lastIndexOf('.')\r\n\r\n execute(subscriber)\r\n }\r\n\r\n // 执行 topic 对应的处理器\r\n execute(topic)\r\n // 执行特殊 topic:'*'(监听全部消息的发布)\r\n execute('*')\r\n }\r\n\r\n if (!has(topic)) {\r\n return false\r\n }\r\n\r\n if (async) {\r\n setTimeout(deliver, 10)\r\n } else {\r\n deliver()\r\n }\r\n}\r\n\r\nexport default emit\r\n","import toString from '../lang/toString'\r\n/**\r\n * 判断检测数据是否为 Typed Arrays 类型的数据\r\n * ========================================================================\r\n * @param {*} val\r\n * @returns {boolean}\r\n */\r\nconst isTypedArray = (val) => {\r\n const TYPES = [\r\n '[object Int8Array]',\r\n '[object Uint8Array]',\r\n '[object Uint8ClampedArray]',\r\n '[object Int16Array]',\r\n '[object Uint16Array]',\r\n '[object Int32Array]',\r\n '[object Uint32Array]',\r\n '[object Float32Array]',\r\n '[object Float64Array]',\r\n '[object BigInt64Array]',\r\n '[object BigUint64Array]'\r\n ]\r\n\r\n return TYPES.indexOf(toString(val)) > -1\r\n}\r\n\r\nexport default isTypedArray\r\n","import _subscribers from './_subscribers'\r\nimport hasOwn from '../lang/hasOwn'\r\n\r\n/**\r\n * 删除与给定 topic 相同的订阅者信息\r\n * ========================================================================\r\n * @method _removeSubscriber\r\n * @param {String} topic - (必须)订阅主题字符串\r\n * @returns {Boolean}\r\n */\r\nconst _removeSubscriber = (topic) => {\r\n if (!hasOwn(_subscribers, topic)) {\r\n return false\r\n }\r\n\r\n delete _subscribers[topic]\r\n}\r\n\r\nexport default _removeSubscriber\r\n","import has from './has'\r\nimport _removeSubscriber from './_removeSubscriber'\r\nimport _removeSubscriberByToken from './_removeSubscriberByToken'\r\n\r\n/**\r\n * 取消订阅主题\r\n * ========================================================================\r\n * @method off\r\n * @param {String} topic - (必须)订阅的主题\r\n * @param {Function|String} [token] - (可选)订阅主题的处理器函数或者唯一 Id 值\r\n */\r\nconst off = (topic, token) => {\r\n if (!has(topic)) {\r\n return false\r\n }\r\n\r\n if (token) {\r\n _removeSubscriberByToken(token)\r\n } else {\r\n _removeSubscriber(topic)\r\n }\r\n}\r\n\r\nexport default off\r\n","import _subscribers from './_subscribers'\r\nimport _removeSubscriber from './_removeSubscriber'\r\n\r\n/**\r\n * 通过订阅者 token 值删除订阅者信息\r\n * ========================================================================\r\n * @method _removeSubscriberByToken\r\n * @param {String} token - 订阅者 token 字符串\r\n * @returns {boolean}\r\n * @private\r\n */\r\nconst _removeSubscriberByToken = (token) => {\r\n const keys = Object.keys(_subscribers)\r\n let index = -1\r\n\r\n if (!token || keys.length < 1) {\r\n return false\r\n }\r\n\r\n keys.forEach((subject) => {\r\n const subscriber = _subscribers[subject]\r\n let topic\r\n\r\n subscriber.forEach((execution, j) => {\r\n if (execution.callback === token || execution.token === token) {\r\n topic = execution.topic\r\n subscriber.splice(index, j)\r\n }\r\n })\r\n\r\n /* istanbul ignore else */\r\n if (subscriber.length < 1) {\r\n _removeSubscriber(topic)\r\n }\r\n })\r\n}\r\n\r\nexport default _removeSubscriberByToken\r\n","import isString from './utils/types/isString'\r\nimport hasOwn from './utils/lang/hasOwn'\r\nimport isObject from './utils/types/isObject'\r\nimport extend from './utils/lang/extend'\r\nimport publish from './utils/observer/emit'\r\nimport subscribe from './utils/observer/on'\r\nimport unsubscribe from './utils/observer/off'\r\n\r\nclass Base {\r\n constructor(options) {\r\n this.attrs = {}\r\n\r\n if (options) {\r\n this.initialize(options)\r\n }\r\n }\r\n\r\n initialize(options) {\r\n this.attr(options).render().addListeners()\r\n return this\r\n }\r\n\r\n attr(prop, value) {\r\n const attrs = this.attrs\r\n\r\n if (isString(prop)) {\r\n // 只能扩展 attrs 中已有的属性\r\n if (value && hasOwn(attrs, prop)) {\r\n // 更新单个配置信息\r\n attrs[prop] = value\r\n return this\r\n }\r\n\r\n // 只传递 prop 参数,则返回对应的属性值\r\n return attrs[prop]\r\n } else if (isObject(prop)) {\r\n // 批量更新配置信息\r\n extend(attrs, prop)\r\n\r\n return this\r\n } else if (arguments.length === 0) {\r\n // 不传递参数,直接返回整个\r\n return attrs\r\n }\r\n\r\n return this\r\n }\r\n\r\n render() {\r\n return this\r\n }\r\n\r\n refresh() {\r\n return this\r\n }\r\n\r\n destroy() {\r\n this.removeListeners()\r\n return this\r\n }\r\n\r\n reload(options) {\r\n let attrs = this.attr()\r\n\r\n if (options) {\r\n attrs = this.attr(options)\r\n }\r\n\r\n this.destroy().initialize(attrs)\r\n\r\n return this\r\n }\r\n\r\n $emit(event, data) {\r\n publish(event, data)\r\n return this\r\n }\r\n\r\n $on(event, callback) {\r\n subscribe(event, callback, this)\r\n return this\r\n }\r\n\r\n $off(event, callback) {\r\n unsubscribe(event, callback)\r\n return this\r\n }\r\n\r\n addListeners() {\r\n return this\r\n }\r\n\r\n removeListeners() {\r\n return this\r\n }\r\n}\r\n\r\nexport default Base\r\n","import _subscribers from './_subscribers'\r\nimport isFunction from '../types/isFunction'\r\nimport guid from '../lang/guid'\r\n\r\n/**\r\n * 订阅主题,并给出处理器函数\r\n * ========================================================================\r\n * @method on\r\n * @param {String} topic - (必须)主题名称\r\n * @param {Function} handler - (必须)主题的处理器函数\r\n * @param {Object} [context] - (可选)指定 this 执行上下文\r\n * @return {String} - 唯一的 token 字符串,例如:'guid-1'。\r\n */\r\nconst on = (topic, handler, context = null) => {\r\n const token = guid()\r\n let subject = typeof topic === 'symbol' ? topic.toString() : topic\r\n\r\n if (!isFunction(handler)) {\r\n return ''\r\n }\r\n\r\n /* istanbul ignore else */\r\n if (!_subscribers[subject]) {\r\n _subscribers[subject] = []\r\n }\r\n\r\n _subscribers[subject].push({\r\n topic: subject,\r\n callback: handler,\r\n context,\r\n token\r\n })\r\n\r\n return token\r\n}\r\n\r\nexport default on\r\n","import isString from './utils/types/isString'\r\nimport isPlainObject from './utils/types/isPlainObject'\r\nimport isFunction from './utils/types/isFunction'\r\n\r\nimport extend from './utils/lang/extend'\r\nimport later from './utils/lang/later'\r\nimport stripScripts from './utils/lang/stripScripts'\r\nimport encodeHTML from './utils/lang/encodeHTML'\r\nimport cloneDeep from './utils/lang/cloneDeep'\r\nimport guid from './utils/lang/guid'\r\n\r\nimport createElement from './utils/dom/createElement'\r\nimport addClass from './utils/dom/addClass'\r\nimport removeClass from './utils/dom/removeClass'\r\nimport setAttribute from './utils/dom/setAttribute'\r\nimport setAttributes from './utils/dom/setAttributes'\r\n\r\nimport icon from './utils/icons/icon'\r\nimport paint from './utils/icons/paint'\r\nimport on from './utils/event/on'\r\nimport off from './utils/event/off'\r\n\r\nimport Base from './base'\r\n\r\nconst TYPES = ['info', 'success', 'warning', 'error']\r\nconst instances = []\r\nlet instance\r\n\r\npaint()\r\n\r\nclass Message extends Base {\r\n constructor(options) {\r\n super()\r\n\r\n this._default()\r\n\r\n if (options) {\r\n this.initialize(options)\r\n }\r\n }\r\n\r\n _default() {\r\n this.attrs = cloneDeep(Message.DEFAULTS)\r\n\r\n this.$el = null\r\n this.id = ''\r\n this.closed = false\r\n this.visible = false\r\n this.offset = -50\r\n this.timer = null\r\n this.destroyed = false\r\n\r\n return this\r\n }\r\n\r\n initialize(options) {\r\n this.attr(options)\r\n this.id = this.attr('id')\r\n this.offset = this.attr('offset') || -50\r\n\r\n this.$emit('created', { ...this.attr() })\r\n\r\n this.render().addListeners()\r\n\r\n if (this.attr('visible')) {\r\n this.open()\r\n }\r\n\r\n return this\r\n }\r\n\r\n isClosed() {\r\n return this.closed\r\n }\r\n\r\n isDestroyed() {\r\n return this.destroyed\r\n }\r\n\r\n _getClassName() {\r\n const type = this.attr('type')\r\n const effect = this.attr('effect')\r\n const round = this.attr('round')\r\n const closable = this.attr('closable')\r\n const visible = this.attr('visible')\r\n const customClass = this.attr('customClass')\r\n const className = [\r\n 'outline-message',\r\n `outline-message_${type}`,\r\n `outline-message_${effect}`\r\n ]\r\n\r\n if (round) {\r\n className.push('outline-message_round')\r\n }\r\n\r\n if (!closable) {\r\n className.push('outline-message_full-width')\r\n }\r\n\r\n if (visible) {\r\n className.push('outline-message_visible')\r\n }\r\n\r\n if (customClass) {\r\n className.push(customClass)\r\n }\r\n\r\n return className\r\n }\r\n\r\n render() {\r\n const type = this.attr('type')\r\n const message = this.attr('message')\r\n const effect = this.attr('effect')\r\n const round = this.attr('round')\r\n const closable = this.attr('closable')\r\n const dangerouslyUseHTMLString = this.attr('dangerouslyUseHTMLString')\r\n const className = this._getClassName()\r\n const iconName = effect === 'light' ? `circle-${type}` : type\r\n const children = []\r\n let iconSize = 20\r\n let $type\r\n let $message\r\n let $text\r\n let $close\r\n let $el\r\n\r\n if (round && effect === 'default') {\r\n iconSize = 12\r\n }\r\n\r\n if (effect !== 'plain') {\r\n $type = icon(iconName, {\r\n iconSet: 'outline',\r\n size: iconSize\r\n })\r\n addClass($type, 'outline-message__icon')\r\n children.push($type)\r\n }\r\n\r\n if (!dangerouslyUseHTMLString) {\r\n $text = document.createTextNode(encodeHTML(stripScripts(message)))\r\n } else {\r\n $text = document.createDocumentFragment()\r\n $text.innerHTML = message\r\n }\r\n $message = createElement(\r\n 'p',\r\n {\r\n className: 'outline-message__content'\r\n },\r\n [$text]\r\n )\r\n children.push($message)\r\n\r\n if (closable) {\r\n $close = icon('close', {\r\n iconSet: 'outline',\r\n size: 18\r\n })\r\n addClass($close, 'outline-message__close')\r\n children.push($close)\r\n }\r\n\r\n $el = createElement(\r\n 'div',\r\n {\r\n className: className.join(' ')\r\n },\r\n children\r\n )\r\n $el.style.cssText = `top:-50px;`\r\n this.$el = $el\r\n document.body.appendChild(this.$el)\r\n\r\n this.$emit('mounted')\r\n\r\n return this\r\n }\r\n\r\n _refreshIcon() {\r\n const HIDDEN = '.outline-message_hidden'\r\n const $el = this.$el\r\n let iconSize = 20\r\n let type\r\n let effect\r\n let round\r\n let iconName\r\n let $icon\r\n let $svg\r\n let $use\r\n\r\n if (this.isDestroyed()) {\r\n return this\r\n }\r\n\r\n $icon = $el.querySelector('.outline-icon')\r\n\r\n if (!$icon) {\r\n return this\r\n }\r\n\r\n type = this.attr('type')\r\n effect = this.attr('effect')\r\n round = this.attr('round')\r\n\r\n if (effect === 'plain') {\r\n addClass($icon, HIDDEN)\r\n } else {\r\n removeClass($icon, HIDDEN)\r\n\r\n if (round && effect === 'default') {\r\n iconSize = 12\r\n }\r\n }\r\n\r\n $svg = $icon.querySelector('.outline-icon__svg')\r\n setAttributes($svg, {\r\n style: `width:${iconSize}px;height:${iconSize}px;`\r\n })\r\n\r\n $use = $svg.querySelector('use')\r\n iconName = effect === 'light' ? `circle-${type}` : type\r\n setAttribute($use, 'xlink:href', `#outline-icon-${iconName}`)\r\n\r\n return this\r\n }\r\n\r\n _refreshMessage() {\r\n const $el = this.$el\r\n let $message\r\n let dangerouslyUseHTMLString\r\n let message\r\n let text\r\n\r\n if (this.isDestroyed()) {\r\n return this\r\n }\r\n\r\n $message = $el.querySelector('.outline-message__content')\r\n dangerouslyUseHTMLString = this.attr('dangerouslyUseHTMLString')\r\n message = this.attr('message')\r\n\r\n if (!dangerouslyUseHTMLString) {\r\n text = encodeHTML(stripScripts(message))\r\n } else {\r\n text = message\r\n }\r\n\r\n $message.innerHTML = text\r\n\r\n return this\r\n }\r\n\r\n _refreshClose() {\r\n const HIDDEN = '.outline-message_hidden'\r\n const $el = this.$el\r\n let $close\r\n let closable\r\n\r\n if (this.isDestroyed()) {\r\n return this\r\n }\r\n\r\n $close = $el.querySelector('.outline-message__close')\r\n closable = this.attr('closable')\r\n\r\n if ($close) {\r\n if (closable) {\r\n addClass($close, HIDDEN)\r\n } else {\r\n removeClass($close, HIDDEN)\r\n }\r\n }\r\n\r\n return this\r\n }\r\n\r\n _refreshEl() {\r\n const $el = this.$el\r\n let className\r\n\r\n if (this.isDestroyed()) {\r\n return this\r\n }\r\n\r\n className = this._getClassName()\r\n setAttribute($el, 'className', className.join(' '))\r\n\r\n return this\r\n }\r\n\r\n refresh(options) {\r\n if (!isPlainObject(options)) {\r\n return this\r\n }\r\n\r\n this.attr(options)\r\n ._refreshIcon()\r\n ._refreshMessage()\r\n ._refreshClose()\r\n ._refreshEl()\r\n\r\n return this\r\n }\r\n\r\n clearTimer() {\r\n if (this.isDestroyed()) {\r\n return this\r\n }\r\n\r\n if (this.timer) {\r\n clearTimeout(this.timer)\r\n this.timer = null\r\n }\r\n\r\n return this\r\n }\r\n\r\n startTimer(duration) {\r\n if (this.isDestroyed()) {\r\n return this\r\n }\r\n\r\n this.timer = later(() => {\r\n this.$emit('opened')\r\n this.close()\r\n }, duration * 1000)\r\n\r\n return this\r\n }\r\n\r\n open(options) {\r\n const $el = this.$el\r\n let offset\r\n let duration\r\n let top\r\n let cssRules\r\n\r\n if (this.isDestroyed()) {\r\n return this\r\n }\r\n\r\n if (this.isClosed()) {\r\n this.refresh(options)\r\n }\r\n\r\n offset = this.attr('offset')\r\n duration = this.attr('duration')\r\n top = offset && offset >= this.offset ? offset : this.offset\r\n cssRules = `top:${top}px;`\r\n\r\n this.clearTimer()\r\n\r\n this.$emit('beforeOpen')\r\n\r\n later(() => {\r\n this.visible = true\r\n\r\n addClass($el, 'outline-message_visible')\r\n $el.style.cssText = cssRules\r\n\r\n if (duration > 0) {\r\n this.startTimer(duration)\r\n }\r\n }, 100)\r\n\r\n return this\r\n }\r\n\r\n close() {\r\n const $el = this.$el\r\n const cssRules = `top:-50px;`\r\n let destroyAfterClosed\r\n let beforeClose\r\n\r\n if (this.isDestroyed()) {\r\n return this\r\n }\r\n\r\n destroyAfterClosed = this.attr('destroyAfterClosed')\r\n beforeClose = this.attr('beforeClose')\r\n\r\n if (isFunction(beforeClose)) {\r\n beforeClose.call(this)\r\n }\r\n\r\n $el.style.cssText = cssRules\r\n removeClass($el, 'outline-message_visible')\r\n\r\n this.visible = false\r\n this.closed = true\r\n\r\n later(() => {\r\n this.$emit('closed')\r\n\r\n if (destroyAfterClosed) {\r\n this.destroy()\r\n }\r\n }, 500)\r\n\r\n return this\r\n }\r\n\r\n destroy() {\r\n this.$emit('beforeDestroy')\r\n\r\n if (this.isDestroyed()) {\r\n return this\r\n }\r\n\r\n this.removeListeners()\r\n\r\n document.body.removeChild(this.$el)\r\n\r\n clearTimeout(this.timer)\r\n this._default()\r\n\r\n this.$emit('afterDestroy')\r\n\r\n return this\r\n }\r\n\r\n onMouseEnter() {\r\n this.clearTimer()\r\n return this\r\n }\r\n\r\n onMouseLeave() {\r\n const duration = this.attr('duration')\r\n const delay = this.attr('delay')\r\n\r\n if (duration <= 0) {\r\n return this\r\n }\r\n\r\n this.startTimer(delay)\r\n\r\n return this\r\n }\r\n\r\n onClose() {\r\n this.clearTimer()\r\n this.close()\r\n return this\r\n }\r\n\r\n addListeners() {\r\n const $el = this.$el\r\n\r\n on(\r\n $el,\r\n '.outline-message__content',\r\n 'mouseenter',\r\n this.onMouseEnter,\r\n this,\r\n true\r\n )\r\n on(\r\n $el,\r\n '.outline-message__content',\r\n 'mouseleave',\r\n this.onMouseLeave,\r\n this,\r\n true\r\n )\r\n on($el, '.outline-message__close', 'click', this.onClose, this, true)\r\n\r\n return this\r\n }\r\n\r\n removeListeners() {\r\n const $el = this.$el\r\n\r\n off($el, 'mouseenter', this.onMouseEnter)\r\n off($el, 'mouseleave', this.onMouseLeave)\r\n off($el, 'click', this.onClose)\r\n\r\n return this\r\n }\r\n}\r\n\r\nMessage.DEFAULTS = (() => {\r\n const OPTIONS = {\r\n id: '',\r\n type: 'info',\r\n effect: 'default',\r\n round: false,\r\n offset: 30,\r\n duration: 3,\r\n delay: 2,\r\n message: '',\r\n customClass: '',\r\n closable: true,\r\n visible: true,\r\n dangerouslyUseHTMLString: false,\r\n destroyAfterClosed: true,\r\n beforeClose: null\r\n }\r\n\r\n return cloneDeep(OPTIONS)\r\n})()\r\n\r\nTYPES.forEach((type) => {\r\n Message[type] = (options) => {\r\n const config = {}\r\n const id = guid(`outline-message-`)\r\n const beforeClose = options.beforeClose || null\r\n let offset = options.offset || 30\r\n\r\n if (isString(options)) {\r\n config.message = options\r\n } else {\r\n if (isPlainObject(options)) {\r\n extend(config, options)\r\n }\r\n }\r\n config.id = id\r\n config.type = type\r\n config.offset = offset\r\n config.visible = false\r\n config.beforeClose = () => {\r\n Message.close(id, beforeClose)\r\n }\r\n\r\n instance = new Message(config)\r\n instances.forEach((item) => {\r\n offset += item.$el.offsetHeight + 16\r\n })\r\n instance.offset = offset\r\n instance.open()\r\n instances.push(instance)\r\n\r\n return instance\r\n }\r\n})\r\n\r\n// 关闭指定 id 消息的静态方法\r\nMessage.close = (id, beforeClose) => {\r\n const len = instances.length\r\n let index = -1\r\n let i\r\n let offsetHeight\r\n\r\n instances.forEach((instance, i) => {\r\n // 在 instances 中通过 id 找到要关闭的消息\r\n if (id === instance.id) {\r\n offsetHeight = instance.$el.offsetHeight\r\n index = i\r\n\r\n // 关闭消息\r\n if (isFunction(beforeClose)) {\r\n beforeClose.call(instance)\r\n }\r\n\r\n instances.splice(i, 1)\r\n }\r\n })\r\n\r\n if (len <= 1 || index === -1 || index > instances.length - 1) {\r\n return false\r\n }\r\n\r\n i = index\r\n\r\n // 界面中的消息逐个向上收起\r\n for (; i < len - 1; i += 1) {\r\n const dom = instances[i].$el\r\n\r\n dom.style['top'] = parseInt(dom.style['top'], 10) - offsetHeight - 16 + 'px'\r\n }\r\n}\r\n\r\n// 关闭所有消息的静态方法\r\nMessage.clear = () => {\r\n let i = instances.length - 1\r\n for (; i >= 0; i -= 1) {\r\n instances[i].close()\r\n }\r\n}\r\n\r\nexport default Message\r\n","import add from './add'\r\nimport getSymbols from './getSymbols'\r\n\r\n/**\r\n * 绘制 SVG 图标集\r\n * ========================================================================\r\n * @method paint\r\n * @param {String|Array} symbol\r\n */\r\nconst paint = (symbol = '') => {\r\n const $body = document.body\r\n let $icons = document.querySelector('#outline-icons')\r\n let symbols = []\r\n\r\n add(symbol)\r\n symbols = getSymbols()\r\n\r\n if ($icons) {\r\n $icons.innerHTML = symbols.join('')\r\n } else {\r\n $icons = document.createElement('div')\r\n $icons.innerHTML =\r\n ``\r\n $body.insertBefore($icons.firstChild, $body.firstChild)\r\n }\r\n}\r\n\r\nexport default paint\r\n","import isArray from '../types/isArray'\r\nimport isString from '../types/isString'\r\nimport SYMBOLS from './symbols'\r\n\r\n/**\r\n * @method add\r\n * @param {Array|String} symbols\r\n * @return {Boolean}\r\n */\r\nconst add = (symbols) => {\r\n if (!symbols) {\r\n return false\r\n }\r\n\r\n if (isArray(symbols) && symbols.length > 0) {\r\n symbols.forEach((symbol) => {\r\n /* istanbul ignore else */\r\n if (SYMBOLS.indexOf(symbol) === -1 && isString(symbol)) {\r\n SYMBOLS.push(symbol)\r\n }\r\n })\r\n } else {\r\n /* istanbul ignore else */\r\n if (isString(symbols)) {\r\n SYMBOLS.push(symbols)\r\n }\r\n }\r\n}\r\n\r\nexport default add\r\n"],"names":["isString","str","toString","val","Object","prototype","apply","isFunction","isObject","o","isPlainObject","getPrototypeOf","proto","isObjectLike","hasOwn","obj","prop","hasOwnProperty","call","extend","origin","source","keys","forEach","later","fn","delay","setTimeout","stripScripts","replace","encodeHTML","CHARTS","tag","isArray","Array","cloneDeep","clone","from","assign","key","guid","uuid","prefix","isElement","nodeName","tagName","nodeType","isDOM","el","isHTMLCollection","fragment","isTextNode","hasClass","className","pattern","RegExp","allClass","classList","contains","exec","addClass","_classList","add","indexOf","split","name","length","setAttribute","attr","value","toLowerCase","style","cssText","innerHTML","innerText","setAttributes","attrs","createElement","children","$fragment","document","createDocumentFragment","$el","isValidChild","child","append","$child","createTextNode","appendChild","every","removeClass","remove","options","ICON","size","color","iconSet","width","height","defaultRules","cssRules","$icon","$svg","binds","svg","test","isSVG","querySelector","xmlns","class","icon","SYMBOLS","_maybeArrayLike","_toConsumableArray","getSymbols","getSymbol","patternName","patternSet","find","symbol","fullName","matches","selector","sel","msMatchesSelector","getParentOrHost","host","parentNode","CAPTURE_EVENTS","_off","type","capture","_delegateListener","listeners","_listeners","index","listener","i","handler","splice","_delete","removeEventListener","purgeElement","recurse","$element","$children","childNodes","getListeners","filter","arguments","off","on","data","context","once","evt","target","getTarget","delegateTarget","closest","ctx","includeCTX","startsWith","overrideContext","push","addEventListener","_subscribers","_hasDirectSubscribersFor","topic","has","isDirect","found","position","lastIndexOf","substring","_hasSubscribers","emit","async","execute","subscriber","message","callback","deliver","_removeSubscriber","token","subject","execution","j","_removeSubscriberByToken","Base","constructor","this","initialize","render","addListeners","refresh","destroy","removeListeners","reload","$emit","event","publish","$on","subscribe","$off","unsubscribe","instances","instance","paint","$body","body","$icons","symbols","join","insertBefore","firstChild","Message","super","_default","DEFAULTS","id","closed","visible","offset","timer","destroyed","_objectSpread","open","isClosed","isDestroyed","_getClassName","effect","round","closable","customClass","dangerouslyUseHTMLString","$type","$message","$text","$close","iconSize","_refreshIcon","HIDDEN","iconName","$use","_refreshMessage","text","_refreshClose","_refreshEl","clearTimer","clearTimeout","startTimer","duration","close","top","destroyAfterClosed","beforeClose","removeChild","onMouseEnter","onMouseLeave","onClose","config","item","offsetHeight","len","dom","parseInt","clear"],"mappings":"ouDAOA,MAAMA,EAAYC,GACM,iBAARA,ECDVC,EAAYC,GACTC,OAAOC,UAAUH,SAASI,MAAMH,GCCnCI,EAAcJ,GACI,mBAARA,GAAwC,sBAAlBD,EAASC,GCAzCK,EAAYC,IAEG,oBAAhBP,EAASO,IACK,iBAANA,GACPF,EAAWE,KACP,OAANA,ECNEC,EAAiBP,IACrB,MAAMQ,EAAiBP,OAAOO,eAC9B,IAAIC,EAGJ,ICLoBT,IACbK,EAASL,IAAgB,OAARA,EDInBU,CAAaV,GAChB,OAAO,EAQT,GALAS,EAAQT,EAAIE,WAKPO,EACH,OAAO,EAKT,IAFAA,EAAQT,EAEyB,OAA1BQ,EAAeC,IACpBA,EAAQD,EAAeC,GAGzB,OAAOD,EAAeR,KAASS,CAAK,EEzBhCE,EAASA,CAACC,EAAKC,KACnB,MAAMC,EAAiBb,OAAOC,UAAUY,eACxC,OAAOF,GAAOE,EAAeC,KAAKH,EAAKC,EAAK,ECDxCG,EAASA,CAACC,EAAQC,KACTjB,OAAOkB,KAAKD,GAEpBE,SAASP,IACRF,EAAOO,EAAQL,KACjBI,EAAOJ,GAAQK,EAAOL,GACxB,GACA,ECNEQ,EAAQA,CAACC,EAAIC,EAAQ,QACpBnB,EAAWkB,IAITE,YAAW,KAChBF,GAAI,GACHC,GCXCE,EAAgB3B,GACbA,EAAI4B,QAAQ,+BAAgC,ICD/CC,EAAc7B,IAClB,MAAM8B,EAAS,CACb,IAAK,QACL,IAAK,OACL,IAAK,OACL,IAAK,QACL,IAAK,UAGP,OAAO9B,EAAI4B,QAAQ,YAAaG,GACvBD,EAAOC,IAAQA,GACtB,ECREC,EAAWxB,GACXyB,MAAMD,QACDC,MAAMD,QAAQxB,GAEE,mBAAhBP,EAASO,GCCd0B,EAAapB,IACjB,IAAIqB,EAAQ,CAAA,EAEZ,OAAY,OAARrB,EACK,MAGLkB,EAAQlB,GACVqB,EAAQF,MAAMG,KAAKtB,IAEnBqB,EAAQhC,OAAOkC,OAAO,CAAE,EAAEvB,GAC1BX,OAAOkB,KAAKc,GAAOb,SAASgB,GAClBH,EAAMG,GAAO/B,EAASO,EAAIwB,IAAQJ,EAAUpB,EAAIwB,IAAQxB,EAAIwB,MAIjEH,EAAK,ECvBRI,EAAO,MACX,IAAIC,EAAO,EAEX,OAAQC,IACND,GAAQ,EAEDC,EAASA,EAAS,IAAMD,EAAO,QAAUA,EAEnD,EARY,GCEPE,EAAalC,MACPD,EAASC,IAAMA,EAAEmC,UAAYnC,EAAEoC,SAA0B,IAAfpC,EAAEqC,UCJlDC,EAASC,IACb,SACExC,EAASwC,MACRL,EAAUK,ICNWA,OACdxC,EAASwC,IAAwB,sBAAjB9C,EAAS8C,IDKfC,CAAiBD,KENnBE,EFMqCF,EEJrDxC,EAAS0C,IAAoC,8BAAvBhD,EAASgD,KCFfF,OAEhBxC,EAASwC,MACS,kBAAjB9C,EAAS8C,IAA4BA,EAAGH,SAA2B,IAAhBG,EAAGF,WHGKK,CAAWH,KENvDE,KFOjB,EIDGE,EAAWA,CAACJ,EAAIK,KACpB,MAAMC,EAAU,IAAIC,OAAO,UAAYF,EAAY,WACnD,IAAIG,EACAC,EAEJ,QAAKd,EAAUK,KAIfQ,EAAWR,EAAGK,YAETG,IAILC,EAAYT,EAAGS,UAEXA,GAAaA,EAAUC,SAClBV,EAAGS,UAAUC,SAASL,KAGtBC,EAAQK,KAAKH,IAAS,ECpB3BI,EAAWA,CAACZ,EAAIK,KAAc,IAAAQ,EAClC,IAAIJ,EACAD,EAEJ,GAAIJ,EAASJ,EAAIK,GACf,OAAO,EAGTI,EAAYT,EAAGS,UAEF,QAAbI,EAAIJ,SAAAI,IAASA,GAATA,EAAWC,IACTT,EAAUU,QAAQ,MAAQ,EAC5BV,EAAUW,MAAM,KAAKzC,SAAS0C,IAC5BR,EAAUK,IAAIG,EAAK,IAGrBR,EAAUK,IAAIT,IAGhBG,EAAWR,EAAGK,UACdG,GAAYA,EAASU,OAAS,EAAI,IAAMb,EAAYA,EACpDL,EAAGK,UAAYG,EACjB,ECtBIW,EAAeA,CAACnB,EAAIoB,EAAMC,KAC9B,IAAIxB,EAAUG,EAAGH,QAAQyB,cAEzB,OAAQF,GACN,IAAK,QACHpB,EAAGuB,MAAMC,QAAUH,EACnB,MACF,IAAK,QACa,UAAZxB,GAAmC,aAAZA,EACzBG,EAAGqB,MAAQA,EAEXrB,EAAGmB,aAAaC,EAAMC,GAExB,MACF,IAAK,UACHrB,EAAGmB,aAAa,MAAOE,GACvB,MACF,IAAK,YACHT,EAASZ,EAAIqB,GACb,MACF,IAAK,YACHrB,EAAGyB,UAAYJ,EACf,MACF,IAAK,YACHrB,EAAG0B,UAAYL,EACf,MACF,QACErB,EAAGmB,aAAaC,EAAMC,GAE1B,ECnCIM,EAAgBA,CAAC3B,EAAI4B,KACzB,IAAK5B,IAAOxC,EAASoE,GACnB,OAAO,EAGTxE,OAAOkB,KAAKsD,GAAOrD,SAAS6C,IAC1B,MAAMC,EAAQO,EAAMR,GAChBtD,EAAO8D,EAAOR,IAChBD,EAAanB,EAAIoB,EAAMC,EACzB,GACA,ECCEQ,EAAgBA,CAAChC,EAAS+B,EAAOE,KACrC,MAAMC,EAAYC,SAASC,yBACrBC,EAAMF,SAASH,cAAchC,GAC7BsC,EAAgBC,GACbrC,EAAMqC,IAAUpF,EAASoF,GAE5BC,EAAUD,IACd,IAAIE,EAEJ,IAAKH,EAAaC,GAChB,OAAO,EAGLrC,EAAMqC,GACRE,EAASF,EACApF,EAASoF,KAClBE,EAASN,SAASO,eAAeH,IAGnCL,EAAUS,YAAYF,EAAO,EAyB/B,OAtBI9E,EAASoE,GACXD,EAAcO,EAAKN,GACV3C,EAAQ2C,IAAUA,EAAMa,OAAOrB,GAASe,EAAaf,KAC9DQ,EAAMrD,SAAS6D,IACbC,EAAOD,EAAM,IAENrC,EAAM6B,GACfS,EAAOT,GACE5E,EAAS4E,IAClBS,EAAOL,SAASO,eAAeX,IAG7B3C,EAAQ6C,GACVA,EAASvD,SAAS6D,IAChBC,EAAOD,EAAM,IAGfC,EAAOP,GAGTI,EAAIM,YAAYT,GAETG,CAAG,EChDNQ,EAAcA,CAAC1C,EAAIK,KAAc,IAAAQ,EACrC,IACIJ,EADAD,EAAWR,EAAGK,UAGlB,IAAKG,IAAaJ,EAASJ,EAAIK,GAC7B,OAAO,ECPGpD,MDUZwD,EAAYT,EAAGS,UAEF,QAAbI,EAAIJ,SAAAI,IAASA,GAATA,EAAW8B,OACblC,EAAUkC,OAAOtC,ICbPpD,EDeMuD,EAAS3B,QAAQwB,EAAW,IAA5CG,ICdGxD,EAASC,IAGPA,EAAI4B,QAAQ,iBAAkB,IDYnCmB,EAAGK,UAAYG,EACjB,EETIqB,EAAgBA,CAACZ,EAAM2B,EAAU,MACrC,MAAMC,EAAO,eACPC,EAAOF,EAAQE,MAAQ,EACvBC,EAAQH,EAAQG,OAAS,GACzBC,EAAUJ,EAAQI,SAAW,GAC7BC,EAAQhE,EAAQ6D,GAAQA,EAAK,GAAKA,EAClCI,EAASjE,EAAQ6D,GAAQA,EAAK,GAAKA,EACnCK,EAAeL,EAAO,SAASG,cAAkBC,OAAc,GAC/DE,EAAWL,EAAQI,EAAe,SAASJ,IAAUI,EACrDvB,EAAQgB,EAAQhB,OAAS,GACzByB,EAAQrB,SAASH,cAAc,KACrC,IAEIyB,EAFAC,EAAQ,GACRC,EAAM,GAGV,OAAKxG,EAASiE,IC9BDhE,KACb,MAKMqD,EAAU,IAAIC,OADR,uIACoB,KAEhC,OAAOvD,EAASC,IAAQqD,EAAQmD,KAAKxG,EAAI,ED0BrCyG,CAAMzC,GACRuC,EAAMvC,GAENsC,EACEP,GAAuB,SAAZA,EACP,gBAAgBA,UAAgB/B,KAChC,qBAAqBA,KAC3BuC,EAAM,aAAaD,kBAGrBF,EAAM5B,UAAY+B,EAEd5B,EAAMvB,UACRuB,EAAMvB,UAAY,GAAGwC,KAAQjB,EAAMvB,YAEnCuB,EAAMvB,UAAYwC,EAGpBlB,EAAc0B,EAAOzB,GAErB0B,EAAOD,EAAMM,cAAc,OAC3BhC,EAAc2B,EAAM,CAClB,eAAe,EACfM,MAAO,6BACPC,MAAO,oBACPZ,MAAO,IACPC,OAAQ,IACR3B,MAAO6B,IAGFC,GAjCE,IAiCG,EEnDRS,EAAOA,CAAC7C,EAAM2B,EAAU,KACrBf,EAAcZ,EAAM2B,GCdvBmB,EAAOC,EAAAC,ECFI,CACf,gbACA,2bACA,+MACA,0UACA,yqBACA,4UACA,kqBACA,q4DACA,0wBACA,uvBACA,iYACA,+SACA,oTACA,4QACA,kNACA,8wBACA,uwBACA,2gBACA,suBACA,kyBCTIC,EAAaA,CAACjD,EAAM+B,EAAU,SAC9BhG,EAASiE,GCJGkD,EAAClD,EAAM+B,EAAU,UACjC,MAAMoB,EAAc,aACdC,EAAa,UAGnB,OAFgBN,EAEDO,MAAMC,IACnB,MACMC,EADQJ,EAAYzD,KAAK4D,GACR,GAMvB,OALaF,EAAW1D,KAAK6D,GACR,KAIFxB,GAAWwB,KAFhB,SAAZxB,EAAqB,GAAGA,KAAW/B,IAAS,GAAG+B,UAAgB/B,IAEd,GACnD,EDTOkD,CAAUlD,EAAM+B,GAGzBgB,EAAAC,EAAWF,GEHPU,EAAUA,CAACzE,EAAI0E,EAAW,MAC9B,MAAMC,EAAMD,EAAS7F,QAAQ,MAAO,IAEpC,SAAK6F,GAAaC,GAAQ3E,KAKtBA,EAAGyE,QACEzE,EAAGyE,QAAQE,KACT3E,EAAG4E,mBACL5E,EAAG4E,kBAAkBD,GAG9B,ECpBIE,EAAmB7E,GAChBA,EAAG8E,MAAQ9E,IAAOgC,UAAYhC,EAAG8E,KAAKhF,SACzCE,EAAG8E,KACH9E,EAAG+E,WCVIC,EAAiB,CAC5B,WACA,OACA,UACA,QACA,OACA,SACA,aACA,cCMIC,EAAOA,CAACjF,EAAIkF,EAAMzG,KACtB,MAAM0G,EAAUH,EAAejE,QAAQmE,IAAS,EAG5CzG,EAAG2G,0BACL3G,EAAKA,EAAG2G,mBACEA,kBCZE,SAAUpF,EAAIkF,EAAMzG,GAClC,MAAM4G,EAAYrF,EAAGsF,WACrB,IAAIC,GAAS,EAEb,GAAIF,EAAUnE,OAAS,EACrB,OAAO,EAITmE,EAAU9G,SAAQ,CAACiH,EAAUC,KAC3B,MAAMC,EAAUF,EAAS/G,GAErByG,IAASM,EAASN,OACpBK,EAAQE,EAEJC,IAAYjH,IACd8G,EAAQE,GAEZ,IAIEF,GAAS,GACXF,EAAUM,OAAOJ,EAAO,EAE5B,CDTEK,CAAQ5F,EAAIkF,EAAMzG,GAElBuB,EAAG6F,oBAAoBX,EAAMzG,EAAI0G,EAAQ,EEVrCW,EAAe,SAAU9F,EAAIkF,EAAMa,GAAU,GACjD,MAAMC,EAAWhJ,EAASgD,GAAMgC,SAAS2B,cAAc3D,GAAMA,EACvDiG,EAAYD,EAASE,WACrBb,ECPac,EAACnG,EAAIkF,KACxB,IAAIG,EAAYrF,EAAGsF,YAAc,GAQjC,OANItI,EAASkI,IAASA,IACpBG,EAAYA,EAAUe,QAAQZ,GACrBA,EAASN,OAASA,KAItBG,CAAS,EDFEc,CAAaH,EAAUd,GAEzCG,EAAU9G,SAASiH,IACjBP,EAAKe,EAAUR,EAASN,KAAMM,EAAS/G,GAAG,KAIzCsH,IAAoB,IAATb,GAAsC,IAArBmB,UAAUnF,SACvC8E,GACAC,GAEAA,EAAU1H,SAAS+D,IACb3C,EAAU2C,IACZwD,EAAaxD,EAAQ4C,EAAMa,EAC7B,GAGN,EEtBMO,EAAMA,CAACtG,EAAIkF,EAAMzG,KAErB,IAAKlB,EAAWkB,GAEd,OADAqH,EAAa9F,EAAIkF,IACV,EAGTD,EAAKjF,EAAIkF,EAAMzG,EAAG,ECFd8H,EAAKA,CAACvG,EAAI0E,EAAUQ,EAAMzG,EAAI+H,EAAMC,EAASC,GAAO,KAExD,MAAMvB,EAAUH,EAAejE,QAAQmE,IAAS,EAE1CM,EAAW,SAAUmB,GACzB,MAAMC,ECfQ,SAAUD,GAC1B,MAAMC,EAASD,EAAIC,OAEnB,OCJgC5G,EDIT4G,ICHG,IAAhB5G,EAAGF,SACJE,EAAG+E,WAGL/E,EALe,IAAUA,CDKlC,CDWmB6G,CAAUF,GAEnBG,EGbMC,EAAC/G,EAAI0E,EAAUsC,EAAKC,KAClC,MAAMR,EAAUO,GAAOhF,SAEvB,IAAKhC,EACH,OAAO,KAGT,EAAG,CAED,GACe,MAAZ0E,IACEA,EAASwC,WAAW,KACjBlH,EAAG+E,aAAe0B,GAAWhC,EAAQzE,EAAI0E,GACzCD,EAAQzE,EAAI0E,KACjBuC,GAAcjH,IAAOyG,EAEtB,OAAOzG,EAIT,GAAIA,IAAOyG,EACT,KAIJ,OAAUzG,EAAK6E,EAAgB7E,GAAG,EHZT+G,CAAQH,EAAQlC,EAAU1E,GACjD,IAAImH,EAAkBV,GAAWzG,EAEjC2G,EAAIG,eAAiBA,GAIL,IAAZL,IACFU,EAAkBX,GAIhBM,KAGW,IAATJ,GACFJ,EAAItG,EAAIkF,EAAMM,GAGhB/G,EAAGP,KAAKiJ,EAAiBR,EAAKH,KAIlC,IAAKxG,EACH,OAAO,EAGJA,EAAGsF,aACNtF,EAAGsF,WAAa,IAIlBtF,EAAGsF,WAAW8B,KAAK,CACjBpH,KACA0E,WACAQ,OACAzG,GAAI+G,EACJgB,OACAC,UACAtB,YAIF1G,EAAG2G,kBAAoBI,EAEvBxF,EAAGqH,iBAAiBnC,EAAMM,EAAUL,EAAQ,EIjExCmC,EAAe,CAAE,ECIjBC,EAA4BC,GACzB1J,EAAOwJ,EAAcE,IAAUF,EAAaE,GAAOtG,OAAS,ECA/DuG,EAAMA,CAACD,EAAOE,GAAW,IACtBA,EAAWH,EAAyBC,GCHpBA,KACvB,IAAIG,EAAQJ,EAAyBC,GACjCI,EAAWJ,EAAMK,YAAY,KAEjC,MAAQF,IAAuB,IAAdC,GAEfA,GADAJ,EAAQA,EAAMM,UAAU,EAAGF,IACVC,YAAY,KAC7BF,EAAQJ,EAAyBC,GAGnC,OAAOG,CAAK,EDPwCI,CAAgBP,GEGhEQ,EAAOA,CAACR,EAAOhB,EAAMyB,GAAQ,KACjC,MAAMC,EAAWV,IACf,IAAKD,EAAyBC,GAC5B,OAAO,EAGTF,EAAaE,GAAOjJ,SAAS4J,IAG3B,MAAMC,EChBI,CACZ,qBACA,sBACA,6BACA,sBACA,uBACA,sBACA,uBACA,wBACA,wBACA,yBACA,2BAGWrH,QAAQ7D,EDEYsJ,KCFM,EDEEA,EAAKtJ,WAAasJ,EAEvD2B,EAAWE,SAASnK,KAAKiK,EAAW1B,SAAW0B,EAAYC,EAAQ,GACnE,EAEEE,EAAUA,KACd,IAAIH,EAAaX,EACbI,EAAWJ,EAAMK,YAAY,KAEjC,MAAqB,IAAdD,GACLO,EAAaA,EAAWL,UAAU,EAAGF,GACrCA,EAAWO,EAAWN,YAAY,KAElCK,EAAQC,GAIVD,EAAQV,GAERU,EAAQ,IAAI,EAGd,IAAKT,EAAID,GACP,OAAO,EAGLS,EACFtJ,WAAW2J,EAAS,IAEpBA,GACF,EE5CIC,EAAqBf,IACzB,IAAK1J,EAAOwJ,EAAcE,GACxB,OAAO,SAGFF,EAAaE,EAAM,ECJtBlB,EAAMA,CAACkB,EAAOgB,KAClB,IAAKf,EAAID,GACP,OAAO,EAGLgB,ECL4BA,KAChC,MAAMlK,EAAOlB,OAAOkB,KAAKgJ,GAGzB,IAAKkB,GAASlK,EAAK4C,OAAS,EAC1B,OAAO,EAGT5C,EAAKC,SAASkK,IACZ,MAAMN,EAAab,EAAamB,GAChC,IAAIjB,EAEJW,EAAW5J,SAAQ,CAACmK,EAAWC,KACzBD,EAAUL,WAAaG,GAASE,EAAUF,QAAUA,IACtDhB,EAAQkB,EAAUlB,MAClBW,EAAWxC,QAbL,EAamBgD,GAC3B,IAIER,EAAWjH,OAAS,GACtBqH,EAAkBf,EACpB,GACA,EDjBAoB,CAAyBJ,GAEzBD,EAAkBf,EACpB,EEZF,MAAMqB,EACJC,WAAAA,CAAYlG,GACVmG,KAAKnH,MAAQ,GAETgB,GACFmG,KAAKC,WAAWpG,EAEpB,CAEAoG,UAAAA,CAAWpG,GAET,OADAmG,KAAK3H,KAAKwB,GAASqG,SAASC,eACrBH,IACT,CAEA3H,IAAAA,CAAKpD,EAAMqD,GACT,MAAMO,EAAQmH,KAAKnH,MAEnB,OAAI5E,EAASgB,GAEPqD,GAASvD,EAAO8D,EAAO5D,IAEzB4D,EAAM5D,GAAQqD,EACP0H,MAIFnH,EAAM5D,GACJR,EAASQ,IAElBG,EAAOyD,EAAO5D,GAEP+K,MACuB,IAArB1C,UAAUnF,OAEZU,EAGFmH,IACT,CAEAE,MAAAA,GACE,OAAOF,IACT,CAEAI,OAAAA,GACE,OAAOJ,IACT,CAEAK,OAAAA,GAEE,OADAL,KAAKM,kBACEN,IACT,CAEAO,MAAAA,CAAO1G,GACL,IAAIhB,EAAQmH,KAAK3H,OAQjB,OANIwB,IACFhB,EAAQmH,KAAK3H,KAAKwB,IAGpBmG,KAAKK,UAAUJ,WAAWpH,GAEnBmH,IACT,CAEAQ,KAAAA,CAAMC,EAAOhD,GAEX,OADAiD,EAAQD,EAAOhD,GACRuC,IACT,CAEAW,GAAAA,CAAIF,EAAOnB,GAET,MCnEO9B,EAACiB,EAAO9B,EAASe,EAAU,QACpC,MAAM+B,EAAQhJ,IACd,IAAIiJ,EAA2B,iBAAVjB,EAAqBA,EAAMtK,WAAasK,EAExDjK,EAAWmI,KAKX4B,EAAamB,KAChBnB,EAAamB,GAAW,IAG1BnB,EAAamB,GAASrB,KAAK,CACzBI,MAAOiB,EACPJ,SAAU3C,EACVe,UACA+B,UAGU,ED8CVmB,CAAUH,EAAOnB,EAAUU,MACpBA,IACT,CAEAa,IAAAA,CAAKJ,EAAOnB,GAEV,OADAwB,EAAYL,EAAOnB,GACZU,IACT,CAEAG,YAAAA,GACE,OAAOH,IACT,CAEAM,eAAAA,GACE,OAAON,IACT,EEtEF,MACMe,EAAY,GAClB,IAAIC,ECjBUC,EAACzF,EAAS,MACtB,MAAM0F,EAAQjI,SAASkI,KACvB,IAAIC,EAASnI,SAAS2B,cAAc,kBAChCyG,EAAU,GCHHA,KACX,IAAKA,EACH,OAAO,EAGLnL,EAAQmL,IAAYA,EAAQlJ,OAAS,EACvCkJ,EAAQ7L,SAASgG,KAEkB,IAA7BR,EAAQhD,QAAQwD,IAAkBvH,EAASuH,IAC7CR,EAAQqD,KAAK7C,EACf,IAIEvH,EAASoN,IACXrG,EAAQqD,KAAKgD,EAEjB,EDZAtJ,CAAIyD,GACJ6F,EAAUlG,IAENiG,EACFA,EAAO1I,UAAY2I,EAAQC,KAAK,KAEhCF,EAASnI,SAASH,cAAc,OAChCsI,EAAO1I,UAEL,uHAAG2I,EAAQC,KAAK,YAElBJ,EAAMK,aAAaH,EAAOI,WAAYN,EAAMM,YAC9C,EDEFP,GAEA,MAAMQ,UAAgB3B,EACpBC,WAAAA,CAAYlG,GACV6H,QAEA1B,KAAK2B,WAED9H,GACFmG,KAAKC,WAAWpG,EAEpB,CAEA8H,QAAAA,GAWE,OAVA3B,KAAKnH,MAAQzC,EAAUqL,EAAQG,UAE/B5B,KAAK7G,IAAM,KACX6G,KAAK6B,GAAK,GACV7B,KAAK8B,QAAS,EACd9B,KAAK+B,SAAU,EACf/B,KAAKgC,QAAU,GACfhC,KAAKiC,MAAQ,KACbjC,KAAKkC,WAAY,EAEVlC,IACT,CAEAC,UAAAA,CAAWpG,GAaT,OAZAmG,KAAK3H,KAAKwB,GACVmG,KAAK6B,GAAK7B,KAAK3H,KAAK,MACpB2H,KAAKgC,OAAShC,KAAK3H,KAAK,YAAc,GAEtC2H,KAAKQ,MAAM,yWAAS2B,CAAO,CAAA,EAAAnC,KAAK3H,SAEhC2H,KAAKE,SAASC,eAEVH,KAAK3H,KAAK,YACZ2H,KAAKoC,OAGApC,IACT,CAEAqC,QAAAA,GACE,OAAOrC,KAAK8B,MACd,CAEAQ,WAAAA,GACE,OAAOtC,KAAKkC,SACd,CAEAK,aAAAA,GACE,MAAMpG,EAAO6D,KAAK3H,KAAK,QACjBmK,EAASxC,KAAK3H,KAAK,UACnBoK,EAAQzC,KAAK3H,KAAK,SAClBqK,EAAW1C,KAAK3H,KAAK,YACrB0J,EAAU/B,KAAK3H,KAAK,WACpBsK,EAAc3C,KAAK3H,KAAK,eACxBf,EAAY,CAChB,kBACA,mBAAmB6E,IACnB,mBAAmBqG,KAmBrB,OAhBIC,GACFnL,EAAU+G,KAAK,yBAGZqE,GACHpL,EAAU+G,KAAK,8BAGb0D,GACFzK,EAAU+G,KAAK,2BAGbsE,GACFrL,EAAU+G,KAAKsE,GAGVrL,CACT,CAEA4I,MAAAA,GACE,MAAM/D,EAAO6D,KAAK3H,KAAK,QACjBgH,EAAUW,KAAK3H,KAAK,WACpBmK,EAASxC,KAAK3H,KAAK,UACnBoK,EAAQzC,KAAK3H,KAAK,SAClBqK,EAAW1C,KAAK3H,KAAK,YACrBuK,EAA2B5C,KAAK3H,KAAK,4BACrCf,EAAY0I,KAAKuC,gBAEjBxJ,EAAW,GACjB,IACI8J,EACAC,EACAC,EACAC,EACA7J,EALA8J,EAAW,GAyDf,OAlDIR,GAAoB,YAAXD,IACXS,EAAW,IAGE,UAAXT,IACFK,EAAQ9H,EAdkB,UAAXyH,EAAqB,UAAUrG,IAASA,EAchC,CACrBlC,QAAS,UACTF,KAAMkJ,IAERpL,EAASgL,EAAO,yBAChB9J,EAASsF,KAAKwE,IAGXD,GAGHG,EAAQ9J,SAASC,yBACjB6J,EAAMrK,UAAY2G,GAHlB0D,EAAQ9J,SAASO,eAAezD,EAAWF,EAAawJ,KAK1DyD,EAAWhK,EACT,IACA,CACExB,UAAW,4BAEb,CAACyL,IAEHhK,EAASsF,KAAKyE,GAEVJ,IACFM,EAASjI,EAAK,QAAS,CACrBd,QAAS,UACTF,KAAM,KAERlC,EAASmL,EAAQ,0BACjBjK,EAASsF,KAAK2E,IAGhB7J,EAAML,EACJ,MACA,CACExB,UAAWA,EAAUgK,KAAK,MAE5BvI,GAEFI,EAAIX,MAAMC,QAAU,aACpBuH,KAAK7G,IAAMA,EACXF,SAASkI,KAAK1H,YAAYuG,KAAK7G,KAE/B6G,KAAKQ,MAAM,WAEJR,IACT,CAEAkD,YAAAA,GACE,MAAMC,EAAS,0BACThK,EAAM6G,KAAK7G,IACjB,IACIgD,EACAqG,EACAC,EACAW,EACA9I,EACAC,EACA8I,EAPAJ,EAAW,GASf,OAAIjD,KAAKsC,cACAtC,MAGT1F,EAAQnB,EAAIyB,cAAc,iBAErBN,GAIL6B,EAAO6D,KAAK3H,KAAK,QACjBmK,EAASxC,KAAK3H,KAAK,UACnBoK,EAAQzC,KAAK3H,KAAK,SAEH,UAAXmK,EACF3K,EAASyC,EAAO6I,IAEhBxJ,EAAYW,EAAO6I,GAEfV,GAAoB,YAAXD,IACXS,EAAW,KAIf1I,EAAOD,EAAMM,cAAc,sBAC3BhC,EAAc2B,EAAM,CAClB/B,MAAO,SAASyK,cAAqBA,SAGvCI,EAAO9I,EAAKK,cAAc,OAC1BwI,EAAsB,UAAXZ,EAAqB,UAAUrG,IAASA,EACnD/D,EAAaiL,EAAM,aAAc,iBAAiBD,KAE3CpD,MA1BEA,KA2BX,CAEAsD,eAAAA,GACE,MAAMnK,EAAM6G,KAAK7G,IACjB,IAAI2J,EACAF,EACAvD,EACAkE,EAEJ,OAAIvD,KAAKsC,gBAITQ,EAAW3J,EAAIyB,cAAc,6BAC7BgI,EAA2B5C,KAAK3H,KAAK,4BACrCgH,EAAUW,KAAK3H,KAAK,WAKlBkL,EAHGX,EAGIvD,EAFAtJ,EAAWF,EAAawJ,IAKjCyD,EAASpK,UAAY6K,GAbZvD,IAgBX,CAEAwD,aAAAA,GACE,MAAML,EAAS,0BACThK,EAAM6G,KAAK7G,IACjB,IAAI6J,EACAN,EAEJ,OAAI1C,KAAKsC,gBAITU,EAAS7J,EAAIyB,cAAc,2BAC3B8H,EAAW1C,KAAK3H,KAAK,YAEjB2K,IACEN,EACF7K,EAASmL,EAAQG,GAEjBxJ,EAAYqJ,EAAQG,KAVfnD,IAeX,CAEAyD,UAAAA,GACE,MAAMtK,EAAM6G,KAAK7G,IACjB,IAAI7B,EAEJ,OAAI0I,KAAKsC,gBAIThL,EAAY0I,KAAKuC,gBACjBnK,EAAae,EAAK,YAAa7B,EAAUgK,KAAK,OAJrCtB,IAOX,CAEAI,OAAAA,CAAQvG,GACN,OAAKlF,EAAckF,IAInBmG,KAAK3H,KAAKwB,GACPqJ,eACAI,kBACAE,gBACAC,aAEIzD,MATEA,IAUX,CAEA0D,UAAAA,GACE,OAAI1D,KAAKsC,eAILtC,KAAKiC,QACP0B,aAAa3D,KAAKiC,OAClBjC,KAAKiC,MAAQ,MALNjC,IASX,CAEA4D,UAAAA,CAAWC,GACT,OAAI7D,KAAKsC,gBAITtC,KAAKiC,MAAQxM,GAAM,KACjBuK,KAAKQ,MAAM,UACXR,KAAK8D,OAAO,GACA,IAAXD,IANM7D,IASX,CAEAoC,IAAAA,CAAKvI,GACH,MAAMV,EAAM6G,KAAK7G,IACjB,IAAI6I,EACA6B,EACAE,EACA1J,EAEJ,OAAI2F,KAAKsC,gBAILtC,KAAKqC,YACPrC,KAAKI,QAAQvG,GAGfmI,EAAShC,KAAK3H,KAAK,UACnBwL,EAAW7D,KAAK3H,KAAK,YACrB0L,EAAM/B,GAAUA,GAAUhC,KAAKgC,OAASA,EAAShC,KAAKgC,OACtD3H,EAAW,OAAO0J,OAElB/D,KAAK0D,aAEL1D,KAAKQ,MAAM,cAEX/K,GAAM,KACJuK,KAAK+B,SAAU,EAEflK,EAASsB,EAAK,2BACdA,EAAIX,MAAMC,QAAU4B,EAEhBwJ,EAAW,GACb7D,KAAK4D,WAAWC,EAClB,GACC,MAzBM7D,IA4BX,CAEA8D,KAAAA,GACE,MAAM3K,EAAM6G,KAAK7G,IAEjB,IAAI6K,EACAC,EAEJ,OAAIjE,KAAKsC,gBAIT0B,EAAqBhE,KAAK3H,KAAK,sBAC/B4L,EAAcjE,KAAK3H,KAAK,eAEpB7D,EAAWyP,IACbA,EAAY9O,KAAK6K,MAGnB7G,EAAIX,MAAMC,QAfO,aAgBjBkB,EAAYR,EAAK,2BAEjB6G,KAAK+B,SAAU,EACf/B,KAAK8B,QAAS,EAEdrM,GAAM,KACJuK,KAAKQ,MAAM,UAEPwD,GACFhE,KAAKK,SACP,GACC,MAtBML,IAyBX,CAEAK,OAAAA,GAGE,OAFAL,KAAKQ,MAAM,iBAEPR,KAAKsC,gBAITtC,KAAKM,kBAELrH,SAASkI,KAAK+C,YAAYlE,KAAK7G,KAE/BwK,aAAa3D,KAAKiC,OAClBjC,KAAK2B,WAEL3B,KAAKQ,MAAM,iBAVFR,IAaX,CAEAmE,YAAAA,GAEE,OADAnE,KAAK0D,aACE1D,IACT,CAEAoE,YAAAA,GACE,MAAMP,EAAW7D,KAAK3H,KAAK,YACrB1C,EAAQqK,KAAK3H,KAAK,SAExB,OAAIwL,GAAY,GAIhB7D,KAAK4D,WAAWjO,GAHPqK,IAMX,CAEAqE,OAAAA,GAGE,OAFArE,KAAK0D,aACL1D,KAAK8D,QACE9D,IACT,CAEAG,YAAAA,GACE,MAAMhH,EAAM6G,KAAK7G,IAoBjB,OAlBAqE,EACErE,EACA,4BACA,aACA6G,KAAKmE,aACLnE,MACA,GAEFxC,EACErE,EACA,4BACA,aACA6G,KAAKoE,aACLpE,MACA,GAEFxC,EAAGrE,EAAK,0BAA2B,QAAS6G,KAAKqE,QAASrE,MAAM,GAEzDA,IACT,CAEAM,eAAAA,GACE,MAAMnH,EAAM6G,KAAK7G,IAMjB,OAJAoE,EAAIpE,EAAK,aAAc6G,KAAKmE,cAC5B5G,EAAIpE,EAAK,aAAc6G,KAAKoE,cAC5B7G,EAAIpE,EAAK,QAAS6G,KAAKqE,SAEhBrE,IACT,SAGFyB,EAAQG,SAkBCxL,EAjBS,CACdyL,GAAI,GACJ1F,KAAM,OACNqG,OAAQ,UACRC,OAAO,EACPT,OAAQ,GACR6B,SAAU,EACVlO,MAAO,EACP0J,QAAS,GACTsD,YAAa,GACbD,UAAU,EACVX,SAAS,EACTa,0BAA0B,EAC1BoB,oBAAoB,EACpBC,YAAa,OA1dH,CAAC,OAAQ,UAAW,UAAW,SAgevCzO,SAAS2G,IACbsF,EAAQtF,GAAStC,IACf,MAAMyK,EAAS,CAAA,EACTzC,EAAKpL,EAAK,oBACVwN,EAAcpK,EAAQoK,aAAe,KAC3C,IAAIjC,EAASnI,EAAQmI,QAAU,GAyB/B,OAvBI/N,EAAS4F,GACXyK,EAAOjF,QAAUxF,EAEblF,EAAckF,IAChBzE,EAAOkP,EAAQzK,GAGnByK,EAAOzC,GAAKA,EACZyC,EAAOnI,KAAOA,EACdmI,EAAOtC,OAASA,EAChBsC,EAAOvC,SAAU,EACjBuC,EAAOL,YAAc,KACnBxC,EAAQqC,MAAMjC,EAAIoC,EAAY,EAGhCjD,EAAW,IAAIS,EAAQ6C,GACvBvD,EAAUvL,SAAS+O,IACjBvC,GAAUuC,EAAKpL,IAAIqL,aAAe,EAAE,IAEtCxD,EAASgB,OAASA,EAClBhB,EAASoB,OACTrB,EAAU1C,KAAK2C,GAERA,CAAQ,CAChB,IAIHS,EAAQqC,MAAQ,CAACjC,EAAIoC,KACnB,MAAMQ,EAAM1D,EAAU5I,OACtB,IACIuE,EACA8H,EAFAhI,GAAS,EAmBb,GAfAuE,EAAUvL,SAAQ,CAACwL,EAAUtE,KAEvBmF,IAAOb,EAASa,KAClB2C,EAAexD,EAAS7H,IAAIqL,aAC5BhI,EAAQE,EAGJlI,EAAWyP,IACbA,EAAY9O,KAAK6L,GAGnBD,EAAUnE,OAAOF,EAAG,GACtB,IAGE+H,GAAO,IAAgB,IAAXjI,GAAgBA,EAAQuE,EAAU5I,OAAS,EACzD,OAAO,EAMT,IAHAuE,EAAIF,EAGGE,EAAI+H,EAAM,EAAG/H,GAAK,EAAG,CAC1B,MAAMgI,EAAM3D,EAAUrE,GAAGvD,IAEzBuL,EAAIlM,MAAW,IAAImM,SAASD,EAAIlM,MAAW,IAAG,IAAMgM,EAAe,GAAK,IAC1E,GAIF/C,EAAQmD,MAAQ,KACd,IAAIlI,EAAIqE,EAAU5I,OAAS,EAC3B,KAAOuE,GAAK,EAAGA,GAAK,EAClBqE,EAAUrE,GAAGoH,OACf"} \ No newline at end of file diff --git a/message/message.css b/message/message.css new file mode 100644 index 00000000..3fdfd715 --- /dev/null +++ b/message/message.css @@ -0,0 +1 @@ +.outline-icon{display:inline-block;position:relative;vertical-align:middle;z-index:1}.outline-icon,.outline-icon__svg{height:1em;overflow:hidden;width:1em}.outline-icon__svg{left:50%;position:absolute;top:50%;z-index:2;fill:currentcolor;transform:translate(-50%,-50%)}.outline-icon_hidden{display:none}.outline-message{background-color:#fff;border-radius:3px;box-shadow:0 0 6px 1px #dcdfe6;left:50%;opacity:.1;padding:0 50px;position:fixed;top:-50px;transform:translateX(-50%);transition:all .5s ease-in-out;z-index:9999}.outline-message,.outline-message__content{color:#666;font-size:13px;height:40px;line-height:40px;margin:0;overflow:hidden}.outline-message__content{max-width:700px;text-overflow:ellipsis;white-space:nowrap}.outline-message__close,.outline-message__icon{height:40px;line-height:40px;overflow:hidden;position:absolute;text-align:center;top:0;width:40px;z-index:2}.outline-message__icon{color:#fff;left:0}.outline-message__icon .outline-icon{left:50%;position:absolute;top:50%;transform:translate(-50%,-50%);z-index:2}.outline-message__close{color:#999;cursor:pointer;right:0}.outline-message__close .outline-icon{left:50%;position:absolute;top:50%;transform:translate(-50%,-50%);z-index:2}.outline-message__close:hover{color:#666}.outline-message_info .outline-message__icon{background-color:#507afe}.outline-message_warning .outline-message__icon{background-color:#ff9901}.outline-message_success .outline-message__icon{background-color:#058942}.outline-message_error .outline-message__icon{background-color:#ff5d5d}.outline-message_plain{min-width:190px;padding:0 50px 0 15px}.outline-message_plain.outline-message_info{background-color:#ecf8ff;border-left:5px solid #507afe}.outline-message_plain.outline-message_warning{background-color:#fffbe6;border-left:5px solid #ff9901}.outline-message_plain.outline-message_success{background-color:#e1f6eb;border-left:5px solid #058942}.outline-message_plain.outline-message_error{background-color:#fff1f0;border-left:5px solid #ff5d5d}.outline-message_plain .outline-message__icon{display:none;width:0}.outline-message_plain .outline-message__icon .outline-icon{display:none}.outline-message_light{min-width:180px;padding:0 40px}.outline-message_light.outline-message_info .outline-message__icon{color:#507afe}.outline-message_light.outline-message_warning .outline-message__icon{color:#ff9901}.outline-message_light.outline-message_success .outline-message__icon{color:#058942}.outline-message_light.outline-message_error .outline-message__icon{color:#ff5d5d}.outline-message_light .outline-message__icon{background-color:#fff}.outline-message_round{border-radius:20px}.outline-message_round.outline-message_default{min-width:180px;padding:0 40px}.outline-message_round.outline-message_default .outline-message__icon{border-radius:10px;height:20px;left:10px;line-height:20px;top:10px;width:20px}.outline-message_round.outline-message_default.outline-message_full-width{min-width:200px;padding:0 20px 0 40px}.outline-message_round.outline-message_plain{min-width:195px;padding:0 40px 0 20px}.outline-message_round.outline-message_plain.outline-message_full-width{min-width:215px;padding:0 20px}.outline-message_full-width{min-width:200px;padding:0 10px 0 50px}.outline-message_full-width.outline-message_plain{min-width:230px;padding:0 10px 0 15px}.outline-message_full-width.outline-message_light{min-width:210px;padding:0 10px 0 40px}.outline-message_visible{opacity:1}.outline-message_hidden{display:none} \ No newline at end of file diff --git a/message.js b/message/message.js similarity index 87% rename from message.js rename to message/message.js index d866612d..8549ccbc 100644 --- a/message.js +++ b/message/message.js @@ -1,583 +1,586 @@ -import isString from './utils/types/isString' -import isPlainObject from './utils/types/isPlainObject' -import isFunction from './utils/types/isFunction' - -import extend from './utils/lang/extend' -import later from './utils/lang/later' -import stripScripts from './utils/lang/stripScripts' -import encodeHTML from './utils/lang/encodeHTML' -import cloneDeep from './utils/lang/cloneDeep' -import guid from './utils/lang/guid' - -import createElement from './utils/dom/createElement' -import addClass from './utils/dom/addClass' -import removeClass from './utils/dom/removeClass' -import setAttribute from './utils/dom/setAttribute' -import setAttributes from './utils/dom/setAttributes' - -import icon from './utils/icons/icon' -import paint from './utils/icons/paint' -import on from './utils/event/on' -import off from './utils/event/off' - -import Base from './base' - -const TYPES = ['info', 'success', 'warning', 'error'] -const instances = [] -let instance - -paint() - -class Message extends Base { - constructor(options) { - super() - - this._default() - - if (options) { - this.initialize(options) - } - } - - _default() { - this.attrs = cloneDeep(Message.DEFAULTS) - - this.$el = null - this.id = '' - this.closed = false - this.visible = false - this.offset = -50 - this.timer = null - this.destroyed = false - - return this - } - - initialize(options) { - this.attr(options) - this.id = this.attr('id') - this.offset = this.attr('offset') || -50 - - this.$emit('created', { ...this.attr() }) - - this.render().addListeners() - - if (this.attr('visible')) { - this.open() - } - - return this - } - - isClosed() { - return this.closed - } - - isDestroyed() { - return this.destroyed - } - - _getClassName() { - const type = this.attr('type') - const effect = this.attr('effect') - const round = this.attr('round') - const closable = this.attr('closable') - const visible = this.attr('visible') - const customClass = this.attr('customClass') - const className = [ - 'outline-message', - `outline-message_${type}`, - `outline-message_${effect}` - ] - - if (round) { - className.push('outline-message_round') - } - - if (!closable) { - className.push('outline-message_full-width') - } - - if (visible) { - className.push('outline-message_visible') - } - - if (customClass) { - className.push(customClass) - } - - return className - } - - render() { - const type = this.attr('type') - const message = this.attr('message') - const effect = this.attr('effect') - const round = this.attr('round') - const closable = this.attr('closable') - const dangerouslyUseHTMLString = this.attr('dangerouslyUseHTMLString') - const className = this._getClassName() - const iconName = effect === 'light' ? `circle-${type}` : type - const children = [] - let iconSize = 20 - let $type - let $message - let $text - let $close - let $el - - if (round && effect === 'default') { - iconSize = 12 - } - - if (effect !== 'plain') { - $type = icon(iconName, { - iconSet: 'outline', - size: iconSize - }) - addClass($type, 'outline-message__icon') - children.push($type) - } - - if (!dangerouslyUseHTMLString) { - $text = document.createTextNode(encodeHTML(stripScripts(message))) - } else { - $text = document.createDocumentFragment() - $text.innerHTML = message - } - $message = createElement( - 'p', - { - className: 'outline-message__content' - }, - [$text] - ) - children.push($message) - - if (closable) { - $close = icon('close', { - iconSet: 'outline', - size: 18 - }) - addClass($close, 'outline-message__close') - children.push($close) - } - - $el = createElement( - 'div', - { - className: className.join(' ') - }, - children - ) - $el.style.cssText = `top:-50px;` - this.$el = $el - document.body.appendChild(this.$el) - - this.$emit('mounted') - - return this - } - - _refreshIcon() { - const HIDDEN = '.outline-message_hidden' - const $el = this.$el - let iconSize = 20 - let type - let effect - let round - let iconName - let $icon - let $svg - let $use - - if (this.isDestroyed()) { - return this - } - - $icon = $el.querySelector('.outline-icon') - - if (!$icon) { - return this - } - - type = this.attr('type') - effect = this.attr('effect') - round = this.attr('round') - - if (effect === 'plain') { - addClass($icon, HIDDEN) - } else { - removeClass($icon, HIDDEN) - - if (round && effect === 'default') { - iconSize = 12 - } - } - - $svg = $icon.querySelector('.outline-icon__svg') - setAttributes($svg, { - style: `width:${iconSize}px;height:${iconSize}px;` - }) - - $use = $svg.querySelector('use') - iconName = effect === 'light' ? `circle-${type}` : type - setAttribute($use, 'xlink:href', `#outline-icon-${iconName}`) - - return this - } - - _refreshMessage() { - const $el = this.$el - let $message - let dangerouslyUseHTMLString - let message - let text - - if (this.isDestroyed()) { - return this - } - - $message = $el.querySelector('.outline-message__content') - dangerouslyUseHTMLString = this.attr('dangerouslyUseHTMLString') - message = this.attr('message') - - if (!dangerouslyUseHTMLString) { - text = encodeHTML(stripScripts(message)) - } else { - text = message - } - - $message.innerHTML = text - - return this - } - - _refreshClose() { - const HIDDEN = '.outline-message_hidden' - const $el = this.$el - let $close - let closable - - if (this.isDestroyed()) { - return this - } - - $close = $el.querySelector('.outline-message__close') - closable = this.attr('closable') - - if ($close) { - if (closable) { - addClass($close, HIDDEN) - } else { - removeClass($close, HIDDEN) - } - } - - return this - } - - _refreshEl() { - const $el = this.$el - let className - - if (this.isDestroyed()) { - return this - } - - className = this._getClassName() - setAttribute($el, 'className', className.join(' ')) - - return this - } - - refresh(options) { - if (!isPlainObject(options)) { - return this - } - - this.attr(options) - ._refreshIcon() - ._refreshMessage() - ._refreshClose() - ._refreshEl() - - return this - } - - clearTimer() { - if (this.isDestroyed()) { - return this - } - - if (this.timer) { - clearTimeout(this.timer) - this.timer = null - } - - return this - } - - startTimer(duration) { - if (this.isDestroyed()) { - return this - } - - this.timer = later(() => { - this.$emit('opened') - this.close() - }, duration * 1000) - - return this - } - - open(options) { - const $el = this.$el - let offset - let duration - let top - let cssRules - - if (this.isDestroyed()) { - return this - } - - if (this.isClosed()) { - this.refresh(options) - } - - offset = this.attr('offset') - duration = this.attr('duration') - top = offset && offset >= this.offset ? offset : this.offset - cssRules = `top:${top}px;` - - this.clearTimer() - - this.$emit('beforeOpen') - - later(() => { - this.visible = true - - addClass($el, 'outline-message_visible') - $el.style.cssText = cssRules - - if (duration > 0) { - this.startTimer(duration) - } - }, 100) - - return this - } - - close() { - const $el = this.$el - const cssRules = `top:-50px;` - let destroyAfterClosed - let beforeClose - - if (this.isDestroyed()) { - return this - } - - destroyAfterClosed = this.attr('destroyAfterClosed') - beforeClose = this.attr('beforeClose') - - if (isFunction(beforeClose)) { - beforeClose.call(this) - } - - $el.style.cssText = cssRules - removeClass($el, 'outline-message_visible') - - this.visible = false - this.closed = true - - later(() => { - this.$emit('closed') - - if (destroyAfterClosed) { - this.destroy() - } - }, 500) - - return this - } - - destroy() { - this.$emit('beforeDestroy') - - if (this.isDestroyed()) { - return this - } - - this.removeListeners() - - document.body.removeChild(this.$el) - - clearTimeout(this.timer) - this._default() - - this.$emit('afterDestroy') - - return this - } - - onMouseEnter() { - this.clearTimer() - return this - } - - onMouseLeave() { - const duration = this.attr('duration') - const delay = this.attr('delay') - - if (duration <= 0) { - return this - } - - this.startTimer(delay) - - return this - } - - onClose() { - this.clearTimer() - this.close() - return this - } - - addListeners() { - const $el = this.$el - - on( - $el, - '.outline-message__content', - 'mouseenter', - this.onMouseEnter, - this, - true - ) - on( - $el, - '.outline-message__content', - 'mouseleave', - this.onMouseLeave, - this, - true - ) - on($el, '.outline-message__close', 'click', this.onClose, this, true) - - return this - } - - removeListeners() { - const $el = this.$el - - off($el, 'mouseenter', this.onMouseEnter) - off($el, 'mouseleave', this.onMouseLeave) - off($el, 'click', this.onClose) - - return this - } -} - -Message.DEFAULTS = (() => { - const OPTIONS = { - id: '', - type: 'info', - effect: 'default', - round: false, - offset: 30, - duration: 3, - delay: 2, - message: '', - customClass: '', - closable: true, - visible: true, - dangerouslyUseHTMLString: false, - destroyAfterClosed: true, - beforeClose: null - } - - return cloneDeep(OPTIONS) -})() - -TYPES.forEach((type) => { - Message[type] = (options) => { - const config = {} - const id = guid(`outline-message-`) - const beforeClose = options.beforeClose || null - let offset = options.offset || 30 - - if (isString(options)) { - config.message = options - } else { - if (isPlainObject(options)) { - extend(config, options) - } - } - config.id = id - config.type = type - config.offset = offset - config.visible = false - config.beforeClose = () => { - Message.close(id, beforeClose) - } - - instance = new Message(config) - instances.forEach((item) => { - offset += item.$el.offsetHeight + 16 - }) - instance.offset = offset - instance.open() - instances.push(instance) - - return instance - } -}) - -// 关闭指定 id 消息的静态方法 -Message.close = (id, beforeClose) => { - const len = instances.length - let index = -1 - let i - let offsetHeight - - instances.forEach((instance, i) => { - // 在 instances 中通过 id 找到要关闭的消息 - if (id === instance.id) { - offsetHeight = instance.$el.offsetHeight - index = i - - // 关闭消息 - if (isFunction(beforeClose)) { - beforeClose.call(instance) - } - - instances.splice(i, 1) - } - }) - - if (len <= 1 || index === -1 || index > instances.length - 1) { - return false - } - - i = index - - // 界面中的消息逐个向上收起 - for (; i < len - 1; i += 1) { - const dom = instances[i].$el - - dom.style['top'] = parseInt(dom.style['top'], 10) - offsetHeight - 16 + 'px' - } -} - -// 关闭所有消息的静态方法 -Message.clear = () => { - let i = instances.length - 1 - for (; i >= 0; i -= 1) { - instances[i].close() - } -} - -export default Message +import isString from '@/utils/types/isString' +import isPlainObject from '@/utils/types/isPlainObject' +import isFunction from '@/utils/types/isFunction' + +import extend from '@/utils/lang/extend' +import later from '@/utils/lang/later' +import stripScripts from '@/utils/lang/stripScripts' +import encodeHTML from '@/utils/lang/encodeHTML' +import cloneDeep from '@/utils/lang/cloneDeep' +import guid from '@/utils/lang/guid' + +import createElement from '@/utils/dom/createElement' +import addClass from '@/utils/dom/addClass' +import removeClass from '@/utils/dom/removeClass' +import setAttribute from '@/utils/dom/setAttribute' +import setAttributes from '@/utils/dom/setAttributes' + +import icon from '@/utils/icons/icon' +import paint from '@/utils/icons/paint' + +import on from '@/utils/event/on' +import off from '@/utils/event/off' + +import Component from '@/component' + +import './message.less' + +const TYPES = ['info', 'success', 'warning', 'error'] +const instances = [] +let instance + +paint() + +class Message extends Component { + constructor(options) { + super() + + this._default() + + if (options) { + this.initialize(options) + } + } + + _default() { + this.attrs = cloneDeep(Message.DEFAULTS) + + this.$el = null + this.id = '' + this.closed = false + this.visible = false + this.offset = -50 + this.timer = null + this.destroyed = false + + return this + } + + initialize(options) { + this.attr(options) + this.id = this.attr('id') + this.offset = this.attr('offset') || -50 + + this.$emit('created', { ...this.attr() }) + + this.render().addListeners() + + if (this.attr('visible')) { + this.open() + } + + return this + } + + isClosed() { + return this.closed + } + + isDestroyed() { + return this.destroyed + } + + _getClassName() { + const type = this.attr('type') + const effect = this.attr('effect') + const round = this.attr('round') + const closable = this.attr('closable') + const visible = this.attr('visible') + const customClass = this.attr('customClass') + const className = [ + 'outline-message', + `outline-message_${type}`, + `outline-message_${effect}` + ] + + if (round) { + className.push('outline-message_round') + } + + if (!closable) { + className.push('outline-message_full-width') + } + + if (visible) { + className.push('outline-message_visible') + } + + if (customClass) { + className.push(customClass) + } + + return className + } + + render() { + const type = this.attr('type') + const message = this.attr('message') + const effect = this.attr('effect') + const round = this.attr('round') + const closable = this.attr('closable') + const dangerouslyUseHTMLString = this.attr('dangerouslyUseHTMLString') + const className = this._getClassName() + const iconName = effect === 'light' ? `circle-${type}` : type + const children = [] + let iconSize = 20 + let $type + let $message + let $text + let $close + let $el + + if (round && effect === 'default') { + iconSize = 12 + } + + if (effect !== 'plain') { + $type = icon(iconName, { + iconSet: 'outline', + size: iconSize + }) + addClass($type, 'outline-message__icon') + children.push($type) + } + + if (!dangerouslyUseHTMLString) { + $text = document.createTextNode(encodeHTML(stripScripts(message))) + } else { + $text = document.createDocumentFragment() + $text.innerHTML = message + } + $message = createElement( + 'p', + { + className: 'outline-message__content' + }, + [$text] + ) + children.push($message) + + if (closable) { + $close = icon('close', { + iconSet: 'outline', + size: 18 + }) + addClass($close, 'outline-message__close') + children.push($close) + } + + $el = createElement( + 'div', + { + className: className.join(' ') + }, + children + ) + $el.style.cssText = `top:-50px;` + this.$el = $el + document.body.appendChild(this.$el) + + this.$emit('mounted') + + return this + } + + _refreshIcon() { + const HIDDEN = '.outline-message_hidden' + const $el = this.$el + let iconSize = 20 + let type + let effect + let round + let iconName + let $icon + let $svg + let $use + + if (this.isDestroyed()) { + return this + } + + $icon = $el.querySelector('.outline-icon') + + if (!$icon) { + return this + } + + type = this.attr('type') + effect = this.attr('effect') + round = this.attr('round') + + if (effect === 'plain') { + addClass($icon, HIDDEN) + } else { + removeClass($icon, HIDDEN) + + if (round && effect === 'default') { + iconSize = 12 + } + } + + $svg = $icon.querySelector('.outline-icon__svg') + setAttributes($svg, { + style: `width:${iconSize}px;height:${iconSize}px;` + }) + + $use = $svg.querySelector('use') + iconName = effect === 'light' ? `circle-${type}` : type + setAttribute($use, 'xlink:href', `#outline-icon-${iconName}`) + + return this + } + + _refreshMessage() { + const $el = this.$el + let $message + let dangerouslyUseHTMLString + let message + let text + + if (this.isDestroyed()) { + return this + } + + $message = $el.querySelector('.outline-message__content') + dangerouslyUseHTMLString = this.attr('dangerouslyUseHTMLString') + message = this.attr('message') + + if (!dangerouslyUseHTMLString) { + text = encodeHTML(stripScripts(message)) + } else { + text = message + } + + $message.innerHTML = text + + return this + } + + _refreshClose() { + const HIDDEN = '.outline-message_hidden' + const $el = this.$el + let $close + let closable + + if (this.isDestroyed()) { + return this + } + + $close = $el.querySelector('.outline-message__close') + closable = this.attr('closable') + + if ($close) { + if (closable) { + addClass($close, HIDDEN) + } else { + removeClass($close, HIDDEN) + } + } + + return this + } + + _refreshEl() { + const $el = this.$el + let className + + if (this.isDestroyed()) { + return this + } + + className = this._getClassName() + setAttribute($el, 'className', className.join(' ')) + + return this + } + + refresh(options) { + if (!isPlainObject(options)) { + return this + } + + this.attr(options) + ._refreshIcon() + ._refreshMessage() + ._refreshClose() + ._refreshEl() + + return this + } + + clearTimer() { + if (this.isDestroyed()) { + return this + } + + if (this.timer) { + clearTimeout(this.timer) + this.timer = null + } + + return this + } + + startTimer(duration) { + if (this.isDestroyed()) { + return this + } + + this.timer = later(() => { + this.$emit('opened') + this.close() + }, duration * 1000) + + return this + } + + open(options) { + const $el = this.$el + let offset + let duration + let top + let cssRules + + if (this.isDestroyed()) { + return this + } + + if (this.isClosed()) { + this.refresh(options) + } + + offset = this.attr('offset') + duration = this.attr('duration') + top = offset && offset >= this.offset ? offset : this.offset + cssRules = `top:${top}px;` + + this.clearTimer() + + this.$emit('beforeOpen') + + later(() => { + this.visible = true + + addClass($el, 'outline-message_visible') + $el.style.cssText = cssRules + + if (duration > 0) { + this.startTimer(duration) + } + }, 100) + + return this + } + + close() { + const $el = this.$el + const cssRules = `top:-50px;` + let destroyAfterClosed + let beforeClose + + if (this.isDestroyed()) { + return this + } + + destroyAfterClosed = this.attr('destroyAfterClosed') + beforeClose = this.attr('beforeClose') + + if (isFunction(beforeClose)) { + beforeClose.call(this) + } + + $el.style.cssText = cssRules + removeClass($el, 'outline-message_visible') + + this.visible = false + this.closed = true + + later(() => { + this.$emit('closed') + + if (destroyAfterClosed) { + this.destroy() + } + }, 500) + + return this + } + + destroy() { + this.$emit('beforeDestroy') + + if (this.isDestroyed()) { + return this + } + + this.removeListeners() + + document.body.removeChild(this.$el) + + clearTimeout(this.timer) + this._default() + + this.$emit('afterDestroy') + + return this + } + + onMouseEnter() { + this.clearTimer() + return this + } + + onMouseLeave() { + const duration = this.attr('duration') + const delay = this.attr('delay') + + if (duration <= 0) { + return this + } + + this.startTimer(delay) + + return this + } + + onClose() { + this.clearTimer() + this.close() + return this + } + + addListeners() { + const $el = this.$el + + on( + $el, + '.outline-message__content', + 'mouseenter', + this.onMouseEnter, + this, + true + ) + on( + $el, + '.outline-message__content', + 'mouseleave', + this.onMouseLeave, + this, + true + ) + on($el, '.outline-message__close', 'click', this.onClose, this, true) + + return this + } + + removeListeners() { + const $el = this.$el + + off($el, 'mouseenter', this.onMouseEnter) + off($el, 'mouseleave', this.onMouseLeave) + off($el, 'click', this.onClose) + + return this + } +} + +Message.DEFAULTS = (() => { + const OPTIONS = { + id: '', + type: 'info', + effect: 'default', + round: false, + offset: 30, + duration: 3, + delay: 2, + message: '', + customClass: '', + closable: true, + visible: true, + dangerouslyUseHTMLString: false, + destroyAfterClosed: true, + beforeClose: null + } + + return cloneDeep(OPTIONS) +})() + +TYPES.forEach((type) => { + Message[type] = (options) => { + const config = {} + const id = guid(`outline-message-`) + const beforeClose = options.beforeClose || null + let offset = options.offset || 30 + + if (isString(options)) { + config.message = options + } else { + if (isPlainObject(options)) { + extend(config, options) + } + } + config.id = id + config.type = type + config.offset = offset + config.visible = false + config.beforeClose = () => { + Message.close(id, beforeClose) + } + + instance = new Message(config) + instances.forEach((item) => { + offset += item.$el.offsetHeight + 16 + }) + instance.offset = offset + instance.open() + instances.push(instance) + + return instance + } +}) + +// 关闭指定 id 消息的静态方法 +Message.close = (id, beforeClose) => { + const len = instances.length + let index = -1 + let i + let offsetHeight + + instances.forEach((instance, i) => { + // 在 instances 中通过 id 找到要关闭的消息 + if (id === instance.id) { + offsetHeight = instance.$el.offsetHeight + index = i + + // 关闭消息 + if (isFunction(beforeClose)) { + beforeClose.call(instance) + } + + instances.splice(i, 1) + } + }) + + if (len <= 1 || index === -1 || index > instances.length - 1) { + return false + } + + i = index + + // 界面中的消息逐个向上收起 + for (; i < len - 1; i += 1) { + const dom = instances[i].$el + + dom.style['top'] = parseInt(dom.style['top'], 10) - offsetHeight - 16 + 'px' + } +} + +// 关闭所有消息的静态方法 +Message.clear = () => { + let i = instances.length - 1 + for (; i >= 0; i -= 1) { + instances[i].close() + } +} + +export default Message diff --git a/message/message.less b/message/message.less new file mode 100644 index 00000000..0cde5947 --- /dev/null +++ b/message/message.less @@ -0,0 +1,233 @@ +@import '../theme/colors'; +@import '../theme/font'; +@import '../theme/icons'; +@import '../theme/mixins'; + +.outline-message { + .radius_small(); + .shadow_light_regular(); + position: fixed; + z-index: 9999; + opacity: 0.1; + top: -50px; + left: 50%; + height: 40px; + margin: 0; + padding: 0 50px; + line-height: 40px; + font-size: @font_size_small; + background-color: @white; + color: @third_text_color; + transition: all 0.5s ease-in-out; + transform: translateX(-50%); + overflow: hidden; + + &__content { + .ellipsis(1); + margin: 0; + max-width: 700px; + height: 40px; + line-height: 40px; + font-size: 13px; + color: @third_text_color; + overflow: hidden; + } + + &__close, + &__icon { + position: absolute; + z-index: 2; + top: 0; + width: 40px; + height: 40px; + line-height: 40px; + text-align: center; + overflow: hidden; + } + + &__icon { + left: 0; + color: @white; + + .outline-icon { + position: absolute; + z-index: 2; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + } + } + + &__close { + right: 0; + cursor: pointer; + color: @fourth_text_color; + + .outline-icon { + position: absolute; + z-index: 2; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + } + + &:hover { + color: @third_text_color; + } + } + + &_info { + .outline-message__icon { + background-color: @primary_color; + } + } + + &_warning { + .outline-message__icon { + background-color: @warning_color; + } + } + + &_success { + .outline-message__icon { + background-color: @success_color; + } + } + + &_error { + .outline-message__icon { + background-color: @danger_color; + } + } + + &_plain { + min-width: 190px; + padding: 0 50px 0 15px; + + &.outline-message { + &_info { + border-left: 5px solid @primary_color; + background-color: @info_tip_bg_color; + } + + &_warning { + border-left: 5px solid @warning_color; + background-color: @warning_tip_bg_color; + } + + &_success { + border-left: 5px solid @success_color; + background-color: @success_tip_bg_color; + } + + &_error { + border-left: 5px solid @danger_color; + background-color: @danger_tip_bg_color; + } + } + + .outline-message__icon { + width: 0; + display: none; + + .outline-icon { + display: none; + } + } + } + + &_light { + min-width: 180px; + padding: 0 40px; + + &.outline-message { + &_info { + .outline-message__icon { + color: @primary_color; + } + } + + &_warning { + .outline-message__icon { + color: @warning_color; + } + } + + &_success { + .outline-message__icon { + color: @success_color; + } + } + + &_error { + .outline-message__icon { + color: @danger_color; + } + } + } + + .outline-message__icon { + background-color: @white; + } + } + + &_round { + .radius(20px); + + &.outline-message { + &_default { + min-width: 180px; + padding: 0 40px; + + .outline-message__icon { + .radius(10px); + top: 10px; + left: 10px; + width: 20px; + height: 20px; + line-height: 20px; + } + + &.outline-message_full-width { + min-width: 200px; + padding: 0 20px 0 40px; + } + } + + &_plain { + min-width: 195px; + padding: 0 40px 0 20px; + + &.outline-message_full-width { + min-width: 215px; + padding: 0 20px; + } + } + } + } + + &_full-width { + min-width: 200px; + padding: 0 10px 0 50px; + + &.outline-message { + &_plain { + min-width: 230px; + padding: 0 10px 0 15px; + } + + &_light { + min-width: 210px; + padding: 0 10px 0 40px; + } + } + } + + &_visible { + opacity: 1; + } + + &_hidden { + display: none; + } +} diff --git a/message/message.min.css b/message/message.min.css new file mode 100644 index 00000000..01389cc3 --- /dev/null +++ b/message/message.min.css @@ -0,0 +1,6 @@ +.outline-heading{overflow:hidden;position:relative;z-index:1}.outline-heading__anchor{display:none}.outline-heading__anchor:hover,.outline-heading__anchor:link,.outline-heading__anchor:visited{color:#999;text-decoration:none}.outline-heading__anchor:hover{color:#507afe}.outline-heading:hover .outline-heading__anchor{display:inline-block}.outline-heading_start:hover{overflow:visible}.outline-heading_start .outline-heading__anchor{left:-1em;position:absolute;top:50%;transform:translateY(-50%);z-index:2} +:root{--outline-zIndex:2000;--outline-sticky-height:100%;--outline-navigator-width:100%}.outline-navigator{margin:0;overflow:auto;position:relative;width:var(--outline-navigator-width);z-index:1}.outline-navigator-parent{transition:.3s ease-in-out}.outline-navigator__title{border-bottom:1px solid #dcdfe6;font-size:16px;font-weight:400;height:40px;line-height:40px;margin:0 16px;overflow:hidden;padding:0 16px}.outline-navigator__main{margin:0;overflow:hidden;position:relative;z-index:1}.outline-navigator__item,.outline-navigator__list,.outline-navigator__subject{list-style-type:none;margin:0;overflow:hidden;padding:0;position:relative;z-index:2}.outline-navigator__list{padding:.5em 0}.outline-navigator__subject{padding-left:1em}.outline-navigator__item{font-size:13px;line-height:30px;margin:0;overflow:hidden}.outline-navigator__placeholder{background-color:#f7f8f9;border-left:2px solid #058942;box-sizing:border-box;height:30px;left:0;overflow:hidden;position:absolute;top:0;transition-duration:.2s;width:100%;z-index:1}.outline-navigator__anchor{display:block;overflow:hidden;padding:0 1.5em;text-overflow:ellipsis;white-space:nowrap}.outline-navigator__anchor:hover,.outline-navigator__anchor:link,.outline-navigator__anchor:visited{color:#555;text-decoration:none}.outline-navigator__anchor:hover{color:#058942}.outline-navigator__code{padding-right:.5em}.outline-navigator_highlight.outline-navigator__anchor:hover,.outline-navigator_highlight.outline-navigator__anchor:link,.outline-navigator_highlight.outline-navigator__anchor:visited{color:#058942;font-weight:700}.outline-navigator_fixed,.outline-navigator_sticky{display:flex;flex-direction:column;flex-wrap:nowrap;overflow:hidden;top:0;z-index:var(--outline-zIndex)}.outline-navigator_fixed .outline-navigator__main,.outline-navigator_fixed .outline-navigator__title,.outline-navigator_sticky .outline-navigator__main,.outline-navigator_sticky .outline-navigator__title{box-sizing:border-box}.outline-navigator_fixed .outline-navigator__title,.outline-navigator_sticky .outline-navigator__title{flex-shrink:0}.outline-navigator_fixed .outline-navigator__main,.outline-navigator_sticky .outline-navigator__main{flex:1;overflow:auto}.outline-navigator_sticky{max-height:var(--outline-sticky-height);position:sticky}.outline-navigator_fixed{max-height:100%;position:fixed}.outline-navigator_hidden{display:none}.outline-navigator_folded{overflow:hidden;width:0} +:root{--outline-zIndex:2000;--outline-sticky-height:100%;--outline-navigator-width:100%}.outline-drawer{box-sizing:border-box;height:100%;left:0;margin:0;overflow:hidden;position:relative;top:0;visibility:hidden;width:100%;z-index:-1}.outline-drawer__modal{background-color:#fff;box-shadow:0 0 6px 1px #dcdfe6;display:flex;flex-direction:column;flex-wrap:nowrap;height:100%;overflow:hidden;position:absolute;transition-duration:.4s;z-index:21}.outline-drawer__footer,.outline-drawer__header,.outline-drawer__main{box-sizing:border-box;width:100%}.outline-drawer__footer,.outline-drawer__header{flex-shrink:0}.outline-drawer__footer,.outline-drawer__main,.outline-drawer__title{padding:0 16px}.outline-drawer__header,.outline-drawer__title{height:52px;line-height:52px;margin:0 auto;overflow:hidden;position:relative;z-index:1}.outline-drawer__title{border-bottom:1px solid #dcdfe6;box-sizing:border-box;font-size:16px;font-weight:400;margin:0 16px}.outline-drawer__close{color:#999;cursor:pointer;font-size:20px;height:20px;line-height:20px;overflow:hidden;position:absolute;right:12px;text-align:center;top:50%;transform:translateY(-50%);width:20px;z-index:2}.outline-drawer__close .outline-icon{left:0;position:absolute;top:0;z-index:2}.outline-drawer__close:hover{color:#666}.outline-drawer__main{flex:1;overflow:auto}.outline-drawer__main.overflow-hidden{overflow:hidden}.outline-drawer__footer{margin:0 auto;overflow:hidden;text-align:right}.outline-drawer__overlay{background-color:#fff;content:"";height:100%;left:0;opacity:.1;overflow:hidden;position:relative;top:0;width:100%;z-index:1}.outline-drawer_ltr.outline-drawer_tiny,.outline-drawer_rtl.outline-drawer_tiny{width:280px}.outline-drawer_ltr.outline-drawer_mini,.outline-drawer_rtl.outline-drawer_mini{width:480px}.outline-drawer_ltr.outline-drawer_small,.outline-drawer_rtl.outline-drawer_small{width:540px}.outline-drawer_ltr.outline-drawer_regular,.outline-drawer_rtl.outline-drawer_regular{width:680px}.outline-drawer_ltr.outline-drawer_medium,.outline-drawer_rtl.outline-drawer_medium{width:720px}.outline-drawer_ltr.outline-drawer_large,.outline-drawer_rtl.outline-drawer_large{width:960px}.outline-drawer_rtl{border-left:1px solid #dcdfe6}.outline-drawer_rtl.outline-drawer_tiny.outline-drawer_closed{right:-290px}.outline-drawer_rtl.outline-drawer_mini.outline-drawer_closed{right:-490px}.outline-drawer_rtl.outline-drawer_small.outline-drawer_closed{right:-550px}.outline-drawer_rtl.outline-drawer_regular.outline-drawer_closed{right:-690px}.outline-drawer_rtl.outline-drawer_medium.outline-drawer_closed{right:-730px}.outline-drawer_rtl.outline-drawer_large.outline-drawer_closed{right:-970px}.outline-drawer_ltr{border-right:1px solid #dcdfe6}.outline-drawer_ltr.outline-drawer_tiny.outline-drawer_closed{left:-290px}.outline-drawer_ltr.outline-drawer_mini.outline-drawer_closed{left:-490px}.outline-drawer_ltr.outline-drawer_small.outline-drawer_closed{left:-550px}.outline-drawer_ltr.outline-drawer_regular.outline-drawer_closed{left:-690px}.outline-drawer_ltr.outline-drawer_medium.outline-drawer_closed{left:-730px}.outline-drawer_ltr.outline-drawer_large.outline-drawer_closed{left:-970px}.outline-drawer_btt,.outline-drawer_ttb{left:0;width:100%}.outline-drawer_btt.outline-drawer_tiny,.outline-drawer_ttb.outline-drawer_tiny{height:240px}.outline-drawer_btt.outline-drawer_mini,.outline-drawer_ttb.outline-drawer_mini{height:320px}.outline-drawer_btt.outline-drawer_small,.outline-drawer_ttb.outline-drawer_small{height:360px}.outline-drawer_btt.outline-drawer_regular,.outline-drawer_ttb.outline-drawer_regular{height:400px}.outline-drawer_btt.outline-drawer_medium,.outline-drawer_ttb.outline-drawer_medium{height:440px}.outline-drawer_btt.outline-drawer_large,.outline-drawer_ttb.outline-drawer_large{height:480px}.outline-drawer_ttb{border-bottom:1px solid #dcdfe6}.outline-drawer_ttb.outline-drawer_tiny.outline-drawer_closed{top:-250px}.outline-drawer_ttb.outline-drawer_mini.outline-drawer_closed{top:-330px}.outline-drawer_ttb.outline-drawer_small.outline-drawer_closed{top:-370px}.outline-drawer_ttb.outline-drawer_regular.outline-drawer_closed{top:-410px}.outline-drawer_ttb.outline-drawer_medium.outline-drawer_closed{top:-450px}.outline-drawer_ttb.outline-drawer_large.outline-drawer_closed{top:-490px}.outline-drawer_btt{border-top:1px solid #dcdfe6;top:auto}.outline-drawer_btt.outline-drawer_tiny.outline-drawer_closed{bottom:-250px}.outline-drawer_btt.outline-drawer_mini.outline-drawer_closed{bottom:-330px}.outline-drawer_btt.outline-drawer_small.outline-drawer_closed{bottom:-370px}.outline-drawer_btt.outline-drawer_regular.outline-drawer_closed{bottom:-410px}.outline-drawer_btt.outline-drawer_medium.outline-drawer_closed{bottom:-450px}.outline-drawer_btt.outline-drawer_large.outline-drawer_closed{bottom:-490px}.outline-drawer_opened{visibility:visible;z-index:var(--outline-zIndex)}.outline-drawer_opened.outline-drawer{position:fixed}.outline-drawer_opened.outline-drawer_rtl{right:0}.outline-drawer_opened.outline-drawer_ltr{left:0}.outline-drawer_opened.outline-drawer_ttb{top:0}.outline-drawer_opened.outline-drawer_btt{bottom:0}.outline-drawer_offset.outline-drawer_ltr,.outline-drawer_offset.outline-drawer_rtl{height:calc(100% - 4em);top:50%;transform:translateY(-50%)}.outline-drawer_offset.outline-drawer_btt,.outline-drawer_offset.outline-drawer_ttb{left:50%;transform:translateX(-50%);width:calc(100% - 4em)}.outline-drawer_offset.outline-drawer_opened.outline-drawer_rtl{right:2em}.outline-drawer_offset.outline-drawer_opened.outline-drawer_ltr{left:2em}.outline-drawer_offset.outline-drawer_opened.outline-drawer_ttb{top:2em}.outline-drawer_offset.outline-drawer_opened.outline-drawer_btt{bottom:2em}.outline-drawer_auto.outline-drawer_ltr,.outline-drawer_auto.outline-drawer_rtl{height:auto;max-height:calc(100% - 4em)}.outline-drawer_full{padding:0} +.outline-toolbar{margin:0;overflow:hidden;position:fixed;transition-duration:.3s;z-index:99999}.outline-toolbar__button{background-color:#fff;border:1px solid #dcdfe6;border-radius:3px;box-shadow:0 0 6px 1px #dcdfe6;box-sizing:border-box;color:#999;cursor:pointer;height:36px;margin:10px;overflow:hidden;position:relative;text-align:center;transition:all .3s ease-in-out .1s;width:36px;z-index:1}.outline-toolbar__button:hover{border-color:#058942;color:#058942;transform:scale(1.35)}.outline-toolbar__button.hide{display:none}.outline-toolbar__anchor:hover,.outline-toolbar__anchor:link,.outline-toolbar__anchor:visited{color:#999;text-decoration:none}.outline-toolbar__anchor:hover{color:#058942}.outline-toolbar__icon{height:20px;left:50%;position:absolute;top:50%;transform:translate(-50%,-50%);width:20px;z-index:2;fill:currentcolor;overflow:hidden}.outline-toolbar_active.outline-toolbar__button{background-color:#058942;border-color:#058942;color:#fff}.outline-toolbar_active.outline-toolbar__button:hover{color:#fff}.outline-toolbar_active .outline-toolbar__anchor:hover,.outline-toolbar_active .outline-toolbar__anchor:link,.outline-toolbar_active .outline-toolbar__anchor:visited{color:#fff}.outline-toolbar_rounded.outline-toolbar__button{border-radius:18px}.outline-toolbar_disabled .outline-toolbar__anchor:hover,.outline-toolbar_disabled .outline-toolbar__anchor:link,.outline-toolbar_disabled .outline-toolbar__anchor:visited,.outline-toolbar_disabled .outline-toolbar__button,.outline-toolbar_disabled.outline-toolbar__anchor:hover,.outline-toolbar_disabled.outline-toolbar__anchor:link,.outline-toolbar_disabled.outline-toolbar__anchor:visited,.outline-toolbar_disabled.outline-toolbar__button{border-color:#999;color:#999;cursor:not-allowed}.outline-toolbar_disabled .outline-toolbar__anchor:hover:hover,.outline-toolbar_disabled .outline-toolbar__anchor:link:hover,.outline-toolbar_disabled .outline-toolbar__anchor:visited:hover,.outline-toolbar_disabled .outline-toolbar__button:hover,.outline-toolbar_disabled.outline-toolbar__anchor:hover:hover,.outline-toolbar_disabled.outline-toolbar__anchor:link:hover,.outline-toolbar_disabled.outline-toolbar__anchor:visited:hover,.outline-toolbar_disabled.outline-toolbar__button:hover{border-color:#999;color:#999}.outline-toolbar_disabled .outline-toolbar__button,.outline-toolbar_disabled.outline-toolbar__button{background-color:#f5f5f5}.outline-toolbar_btt,.outline-toolbar_ttb{left:50%;transform:translateX(-50%)}.outline-toolbar_btt .outline-toolbar__button,.outline-toolbar_ttb .outline-toolbar__button{display:inline-block}.outline-toolbar_ttb{top:12px}.outline-toolbar_ttb.outline-toolbar_hidden{top:-56px}.outline-toolbar_btt{bottom:12px}.outline-toolbar_btt.outline-toolbar_hidden{bottom:-56px}.outline-toolbar_ltr,.outline-toolbar_rtl{transform:translateY(-50%);width:56px}.outline-toolbar_rtl{right:12px;top:50%}.outline-toolbar_rtl.outline-toolbar_hidden{right:-86px}.outline-toolbar_ltr{left:12px;top:50%}.outline-toolbar_ltr.outline-toolbar_hidden{left:-86px}.outline-toolbar_btt .outline-toolbar__button.outline-toolbar_hidden,.outline-toolbar_ltr .outline-toolbar__button.outline-toolbar_hidden,.outline-toolbar_rtl .outline-toolbar__button.outline-toolbar_hidden,.outline-toolbar_ttb .outline-toolbar__button.outline-toolbar_hidden{display:none} +.outline-reader__progress{animation:outline-reader-progress linear;background-color:#507afe;height:4px;left:0;position:fixed;scale:0 1;top:0;transform-origin:left;width:100%;z-index:3;animation-timeline:--ProgressTimeline}.outline-reader__paper{background-color:#fff;box-shadow:0 0 6px 1px #ddd;box-sizing:border-box;margin:2em auto;max-width:1200px;overflow:hidden;padding:3.2em}.outline-reader__title{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Helvetica Neue,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Helvetica,Arial,sans-serif;font-size:4.2em;font-weight:400;line-height:1.3em;margin:.67em 0;overflow:hidden;text-align:center}.outline-reader__article .outline-reader__progress,.outline-reader_hidden{display:none}.outline-reader_hidden.outline-reader_sibling{display:none!important}.outline-reader_hidden.outline-reader_sibling.wrapper.post{display:none}.outline-reader--reading{background-color:#fafafa;box-sizing:border-box;display:block;height:100%;left:0;margin:0;padding:3em 4em;position:fixed;top:0;width:100%;z-index:2;scroll-timeline-name:--ProgressTimeline;overflow:scroll}@keyframes outline-reader-progress{to{scale:1 1}}@media (max-width:500px){.outline-reader{overflow:hidden}.outline-reader .outline-toolbar{align-items:center;align-self:auto;background-color:#fff;border-top:1px solid #ddd;box-sizing:border-box;display:flex;flex-direction:row;flex-wrap:nowrap;height:48px;padding:0 16px;right:0;top:100%;transform:translateY(-48px);width:100%}.outline-reader .outline-toolbar__button{border:none;border-radius:0;box-shadow:none;flex:1}.outline-reader--reading{background-color:#fff;box-sizing:border-box;padding:0}.outline-reader__paper{box-shadow:none;height:100%;margin:0;overflow:hidden;padding:0;position:relative;z-index:1}.outline-reader__title{background-color:#fff;border-bottom:1px solid #ddd;font-size:1.8em;font-weight:400;height:48px;left:0;line-height:48px;margin:0;overflow:hidden;position:absolute;text-overflow:ellipsis;top:0;white-space:nowrap;width:100%;z-index:3}.outline-reader__article{height:calc(100% - 96px);margin:48px 0;padding:0 1.25em;scroll-timeline-name:--MobileProgressTimeline;overflow-x:hidden;overflow-y:scroll}.outline-reader__article .outline-reader__progress{animation:outline-reader-progress linear;z-index:4;animation-timeline:--MobileProgressTimeline;display:block}}@media print{body,html{background-color:#fff;color:#333;font-size:12pt;height:auto!important}a:hover,a:link,a:visited{color:#507afe;text-decoration:underline!important}audio,video{display:none!important}table{border-collapse:collapse;width:100%}td,th{border:1px solid #dcdfe6;padding:8px 20px}.outline-message,.outline-toolbar{display:none!important}.outline-reader{display:block!important;overflow:hidden}.outline-reader__title{font-size:32pt!important;margin:13.4pt 0 28pt!important;text-align:center!important}.outline-reader--reading{background-color:#fff;height:auto!important;overflow:hidden!important;padding:0!important;position:relative!important}.outline-reader__progress{display:none!important}.outline-reader__paper{box-shadow:none}.outline-reader pre{border:1px solid #ddd!important;border-radius:4px!important;padding:1em!important}.outline-reader code,.outline-reader pre{background-color:#fff!important}.outline-reader img,.outline-reader svg,.outline-reader table{break-inside:avoid}.outline-reader_sibling{display:none!important}} +.outline-icon{display:inline-block;position:relative;vertical-align:middle;z-index:1}.outline-icon,.outline-icon__svg{height:1em;overflow:hidden;width:1em}.outline-icon__svg{left:50%;position:absolute;top:50%;z-index:2;fill:currentcolor;transform:translate(-50%,-50%)}.outline-icon_hidden{display:none}.outline-message{background-color:#fff;border-radius:3px;box-shadow:0 0 6px 1px #dcdfe6;left:50%;opacity:.1;padding:0 50px;position:fixed;top:-50px;transform:translateX(-50%);transition:all .5s ease-in-out;z-index:9999}.outline-message,.outline-message__content{color:#666;font-size:13px;height:40px;line-height:40px;margin:0;overflow:hidden}.outline-message__content{max-width:700px;text-overflow:ellipsis;white-space:nowrap}.outline-message__close,.outline-message__icon{height:40px;line-height:40px;overflow:hidden;position:absolute;text-align:center;top:0;width:40px;z-index:2}.outline-message__icon{color:#fff;left:0}.outline-message__icon .outline-icon{left:50%;position:absolute;top:50%;transform:translate(-50%,-50%);z-index:2}.outline-message__close{color:#999;cursor:pointer;right:0}.outline-message__close .outline-icon{left:50%;position:absolute;top:50%;transform:translate(-50%,-50%);z-index:2}.outline-message__close:hover{color:#666}.outline-message_info .outline-message__icon{background-color:#507afe}.outline-message_warning .outline-message__icon{background-color:#ff9901}.outline-message_success .outline-message__icon{background-color:#058942}.outline-message_error .outline-message__icon{background-color:#ff5d5d}.outline-message_plain{min-width:190px;padding:0 50px 0 15px}.outline-message_plain.outline-message_info{background-color:#ecf8ff;border-left:5px solid #507afe}.outline-message_plain.outline-message_warning{background-color:#fffbe6;border-left:5px solid #ff9901}.outline-message_plain.outline-message_success{background-color:#e1f6eb;border-left:5px solid #058942}.outline-message_plain.outline-message_error{background-color:#fff1f0;border-left:5px solid #ff5d5d}.outline-message_plain .outline-message__icon{display:none;width:0}.outline-message_plain .outline-message__icon .outline-icon{display:none}.outline-message_light{min-width:180px;padding:0 40px}.outline-message_light.outline-message_info .outline-message__icon{color:#507afe}.outline-message_light.outline-message_warning .outline-message__icon{color:#ff9901}.outline-message_light.outline-message_success .outline-message__icon{color:#058942}.outline-message_light.outline-message_error .outline-message__icon{color:#ff5d5d}.outline-message_light .outline-message__icon{background-color:#fff}.outline-message_round{border-radius:20px}.outline-message_round.outline-message_default{min-width:180px;padding:0 40px}.outline-message_round.outline-message_default .outline-message__icon{border-radius:10px;height:20px;left:10px;line-height:20px;top:10px;width:20px}.outline-message_round.outline-message_default.outline-message_full-width{min-width:200px;padding:0 20px 0 40px}.outline-message_round.outline-message_plain{min-width:195px;padding:0 40px 0 20px}.outline-message_round.outline-message_plain.outline-message_full-width{min-width:215px;padding:0 20px}.outline-message_full-width{min-width:200px;padding:0 10px 0 50px}.outline-message_full-width.outline-message_plain{min-width:230px;padding:0 10px 0 15px}.outline-message_full-width.outline-message_light{min-width:210px;padding:0 10px 0 40px}.outline-message_visible{opacity:1}.outline-message_hidden{display:none} \ No newline at end of file diff --git a/message.min.js b/message/message.min.js similarity index 72% rename from message.min.js rename to message/message.min.js index 164f7aff..7de6263b 100644 --- a/message.min.js +++ b/message/message.min.js @@ -1,2 +1,2 @@ -!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e="undefined"!=typeof globalThis?globalThis:e||self).Message=t()}(this,(function(){"use strict";function e(e,t){(null==t||t>e.length)&&(t=e.length);for(var s=0,r=Array(t);s"string"==typeof e,n=e=>Object.prototype.toString.apply(e),l=e=>"function"==typeof e||"[object Function]"===n(e),c=e=>("[object Object]"===n(e)||"object"==typeof e||l(e))&&null!==e,a=e=>{const t=Object.getPrototypeOf;let s;if(!(e=>c(e)&&null!==e)(e))return!1;if(s=e.prototype,!s)return!0;for(s=e;null!==t(s);)s=t(s);return t(e)===s},h=(e,t)=>{const s=Object.prototype.hasOwnProperty;return e&&s.call(e,t)},u=(e,t)=>{Object.keys(t).forEach((s=>{h(t,s)&&(e[s]=t[s])}))},d=(e,t=300)=>!!l(e)&&setTimeout((()=>{e()}),t),f=e=>e.replace(/]*>.*?<\/script>/gi,""),m=e=>{const t={"&":"&","<":"<",">":">","'":"'",'"':"""};return e.replace(/[&<>'"]/g,(e=>t[e]||e))},p=e=>Array.isArray?Array.isArray(e):"[object Array]"===n(e),y=e=>{let t={};return null===e?null:(p(e)?t=Array.from(e):(t=Object.assign({},e),Object.keys(t).forEach((s=>t[s]=c(e[s])?y(e[s]):e[s]))),t)},b=(()=>{let e=0;return t=>(e+=1,t?t+"-"+e:"guid-"+e)})(),g=e=>!!(c(e)&&e.nodeName&&e.tagName&&1===e.nodeType),v=e=>{return!(!c(e)||!(g(e)||(e=>!(!c(e)||"[object NodeList]"!==n(e)))(e)||(t=e,c(t)&&"[object DocumentFragment]"===n(t))||(e=>!(!c(e)||!("[object Text]"===n(e)||e.tagName&&3===e.nodeType)))(e)));var t},M=(e,t)=>{const s=new RegExp("(\\s|^)"+t+"(\\s|$)");let r,i;return!!g(e)&&(r=e.className,!!r&&(i=e.classList,i&&i.contains?e.classList.contains(t):!!s.exec(r)))},z=(e,t)=>{var s;let r,i;if(M(e,t))return!1;r=e.classList,null!==(s=r)&&void 0!==s&&s.add?t.indexOf(" ")>-1?t.split(" ").forEach((e=>{r.add(e)})):r.add(t):(i=e.className,i+=i.length>0?" "+t:t,e.className=i)},x=(e,t,s)=>{let r=e.tagName.toLowerCase();switch(t){case"style":e.style.cssText=s;break;case"value":"input"===r||"textarea"===r?e.value=s:e.setAttribute(t,s);break;case"htmlFor":e.setAttribute("for",s);break;case"className":z(e,s);break;case"innerHTML":e.innerHTML=s;break;case"innerText":e.innerText=s;break;default:e.setAttribute(t,s)}},w=(e,t)=>{if(!e||!c(t))return!1;Object.keys(t).forEach((s=>{const r=t[s];h(t,s)&&x(e,s,r)}))},$=(e,t,s)=>{const r=document.createDocumentFragment(),i=document.createElement(e),n=e=>v(e)||o(e),l=e=>{let t;if(!n(e))return!1;v(e)?t=e:o(e)&&(t=document.createTextNode(e)),r.appendChild(t)};return c(t)?w(i,t):p(t)&&t.every((e=>n(e)))?t.forEach((e=>{l(e)})):v(t)?l(t):o(t)&&l(document.createTextNode(t)),p(s)?s.forEach((e=>{l(e)})):l(s),i.appendChild(r),i},_=(e,t)=>{var s;let r,i=e.className;if(!i||!M(e,t))return!1;var n;r=e.classList,null!==(s=r)&&void 0!==s&&s.remove?r.remove(t):(n=i.replace(t,""),i=!!o(n)&&n.replace(/(^\s+)|(\s+$)/g,""),e.className=i)},L=(e,t={})=>{const s="outline-icon",r=t.size||0,i=t.color||"",n=t.iconSet||"",l=p(r)?r[0]:r,c=p(r)?r[1]:r,a=r?`width:${l}px;height:${c}px;`:"",h=i?a+`color:${i}`:a,u=t.attrs||{},d=document.createElement("i");let f,m="",y="";return o(e)?((e=>{const t=new RegExp("^\\s*(?:<\\?xml[^>]*>\\s*)?(?:<\\!doctype svg[^>]*\\s*(?:\\[?(?:\\s*]*>\\s*)*\\]?)*[^>]*>\\s*)?]*>[^]*<\\/svg>\\s*$\\s*$","i");return o(e)&&t.test(e)})(e)?y=e:(m=n&&"icon"!==n?`xlink:href="#${n}-icon-${e}"`:`xlink:href="#icon-${e}"`,y=``),d.innerHTML=y,u.className?u.className=`${s} ${u.className}`:u.className=s,w(d,u),f=d.querySelector("svg"),w(f,{"aria-hidden":!0,xmlns:"http://www.w3.org/2000/svg",class:"outline-icon__svg",width:200,height:200,style:h}),d):null},j=(e,t={})=>L(e,t),T=s(i,['','','','','','','','','','','','','','','','','','','','']),O=(e,t="icon")=>o(e)?((e,t="icon")=>{const s=/id="(.*?)"/,r=/^(\w+)-/;return T.find((i=>{const o=s.exec(i)[1];return r.exec(o)[1]===t&&o===("icon"===t?`${t}-${e}`:`${t}-icon-${e}`)}))})(e,t):s(i,T),A=(e,t="")=>{const s=t.replace(/^>/i,"");return!!(t&&s&&e)&&(e.matches?e.matches(s):!!e.msMatchesSelector&&e.msMatchesSelector(s))},C=e=>e.host&&e!==document&&e.host.nodeType?e.host:e.parentNode,S=["focusout","blur","focusin","focus","load","unload","mouseenter","mouseleave"],E=(e,t,s)=>{const r=S.indexOf(t)>-1;s._delegateListener&&delete(s=s._delegateListener)._delegateListener,function(e,t,s){const r=e._listeners;let i=-1;if(r.length<1)return!1;r.forEach(((e,r)=>{const o=e.fn;t===e.type&&(i=r,o===s&&(i=r))})),i>-1&&r.splice(i,1)}(e,t,s),e.removeEventListener(t,s,r)},N=function(e,t,s=!1){const r=o(e)?document.querySelector(e):e,i=r.childNodes,n=((e,t)=>{let s=e._listeners||[];return o(t)&&t&&(s=s.filter((e=>e.type===t))),s})(r,t);n.forEach((e=>{E(r,e.type,e.fn)})),(s||!0===t||1===arguments.length)&&r&&i&&i.forEach((e=>{g(e)&&N(e,t,s)}))},B=(e,t,s)=>{if(!l(s))return N(e,t),!1;E(e,t,s)},H=(e,t,s,r,i,o,n=!1)=>{const l=S.indexOf(s)>-1,c=function(l){const a=function(e){const t=e.target;return(s=t)&&3===s.nodeType?s.parentNode:s;var s}(l),h=((e,t,s,r)=>{const i=s||document;if(!e)return null;do{if(null!=t&&(t.startsWith(">")?e.parentNode===i&&A(e,t):A(e,t))||r&&e===i)return e;if(e===i)break}while(e=C(e))})(a,t,e);let u=o||e;l.delegateTarget=h,!0===o&&(u=i),h&&(!0===n&&B(e,s,c),r.call(u,l,i))};if(!e)return!1;e._listeners||(e._listeners=[]),e._listeners.push({el:e,selector:t,type:s,fn:c,data:i,context:o,capture:l}),r._delegateListener=c,e.addEventListener(s,c,l)},k={},D=e=>h(k,e)&&k[e].length>0,I=(e,t=!0)=>t?D(e):(e=>{let t=D(e),s=e.lastIndexOf(".");for(;!t&&-1!==s;)s=(e=e.substring(0,s)).lastIndexOf("."),t=D(e);return t})(e),P=(e,t,s=!0)=>{const r=e=>{if(!D(e))return!1;k[e].forEach((e=>{const s=["[object Int8Array]","[object Uint8Array]","[object Uint8ClampedArray]","[object Int16Array]","[object Uint16Array]","[object Int32Array]","[object Uint32Array]","[object Float32Array]","[object Float64Array]","[object BigInt64Array]","[object BigUint64Array]"].indexOf(n(t))>-1?t.toString():t;e.callback.call(e.context||e,s)}))},i=()=>{let t=e,s=e.lastIndexOf(".");for(;-1!==s;)t=t.substring(0,s),s=t.lastIndexOf("."),r(t);r(e),r("*")};if(!I(e))return!1;s?setTimeout(i,10):i()},q=e=>{if(!h(k,e))return!1;delete k[e]},U=(e,t)=>{if(!I(e))return!1;t?(e=>{const t=Object.keys(k);if(!e||t.length<1)return!1;t.forEach((t=>{const s=k[t];let r;s.forEach(((t,i)=>{t.callback!==e&&t.token!==e||(r=t.topic,s.splice(-1,i))})),s.length<1&&q(r)}))})(t):q(e)};class V{constructor(e){this.attrs={},e&&this.initialize(e)}initialize(e){return this.attr(e).render().addListeners(),this}attr(e,t){const s=this.attrs;return o(e)?t&&h(s,e)?(s[e]=t,this):s[e]:c(e)?(u(s,e),this):0===arguments.length?s:this}render(){return this}refresh(){return this}destroy(){return this.removeListeners(),this}reload(e){let t=this.attr();return e&&(t=this.attr(e)),this.destroy().initialize(t),this}$emit(e,t){return P(e,t),this}$on(e,t){return((e,t,s=null)=>{const r=b();let i="symbol"==typeof e?e.toString():e;l(t)&&(k[i]||(k[i]=[]),k[i].push({topic:i,callback:t,context:s,token:r}))})(e,t,this),this}$off(e,t){return U(e,t),this}addListeners(){return this}removeListeners(){return this}}const F=[];let R;((e="")=>{const t=document.body;let s=document.querySelector("#outline-icons"),r=[];(e=>{if(!e)return!1;p(e)&&e.length>0?e.forEach((e=>{-1===T.indexOf(e)&&o(e)&&T.push(e)})):o(e)&&T.push(e)})(e),r=O(),s?s.innerHTML=r.join(""):(s=document.createElement("div"),s.innerHTML=``,t.insertBefore(s.firstChild,t.firstChild))})();class W extends V{constructor(e){super(),this._default(),e&&this.initialize(e)}_default(){return this.attrs=y(W.DEFAULTS),this.$el=null,this.id="",this.closed=!1,this.visible=!1,this.offset=-50,this.timer=null,this.destroyed=!1,this}initialize(e){return this.attr(e),this.id=this.attr("id"),this.offset=this.attr("offset")||-50,this.$emit("created",function(e){for(var s=1;s{this.$emit("opened"),this.close()}),1e3*e)),this}open(e){const t=this.$el;let s,r,i,o;return this.isDestroyed()||(this.isClosed()&&this.refresh(e),s=this.attr("offset"),r=this.attr("duration"),i=s&&s>=this.offset?s:this.offset,o=`top:${i}px;`,this.clearTimer(),this.$emit("beforeOpen"),d((()=>{this.visible=!0,z(t,"outline-message_visible"),t.style.cssText=o,r>0&&this.startTimer(r)}),100)),this}close(){const e=this.$el;let t,s;return this.isDestroyed()||(t=this.attr("destroyAfterClosed"),s=this.attr("beforeClose"),l(s)&&s.call(this),e.style.cssText="top:-50px;",_(e,"outline-message_visible"),this.visible=!1,this.closed=!0,d((()=>{this.$emit("closed"),t&&this.destroy()}),500)),this}destroy(){return this.$emit("beforeDestroy"),this.isDestroyed()||(this.removeListeners(),document.body.removeChild(this.$el),clearTimeout(this.timer),this._default(),this.$emit("afterDestroy")),this}onMouseEnter(){return this.clearTimer(),this}onMouseLeave(){const e=this.attr("duration"),t=this.attr("delay");return e<=0||this.startTimer(t),this}onClose(){return this.clearTimer(),this.close(),this}addListeners(){const e=this.$el;return H(e,".outline-message__content","mouseenter",this.onMouseEnter,this,!0),H(e,".outline-message__content","mouseleave",this.onMouseLeave,this,!0),H(e,".outline-message__close","click",this.onClose,this,!0),this}removeListeners(){const e=this.$el;return B(e,"mouseenter",this.onMouseEnter),B(e,"mouseleave",this.onMouseLeave),B(e,"click",this.onClose),this}}return W.DEFAULTS=y({id:"",type:"info",effect:"default",round:!1,offset:30,duration:3,delay:2,message:"",customClass:"",closable:!0,visible:!0,dangerouslyUseHTMLString:!1,destroyAfterClosed:!0,beforeClose:null}),["info","success","warning","error"].forEach((e=>{W[e]=t=>{const s={},r=b("outline-message-"),i=t.beforeClose||null;let n=t.offset||30;return o(t)?s.message=t:a(t)&&u(s,t),s.id=r,s.type=e,s.offset=n,s.visible=!1,s.beforeClose=()=>{W.close(r,i)},R=new W(s),F.forEach((e=>{n+=e.$el.offsetHeight+16})),R.offset=n,R.open(),F.push(R),R}})),W.close=(e,t)=>{const s=F.length;let r,i,o=-1;if(F.forEach(((s,r)=>{e===s.id&&(i=s.$el.offsetHeight,o=r,l(t)&&t.call(s),F.splice(r,1))})),s<=1||-1===o||o>F.length-1)return!1;for(r=o;r{let e=F.length-1;for(;e>=0;e-=1)F[e].close()},W})); +!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e="undefined"!=typeof globalThis?globalThis:e||self).Message=t()}(this,(function(){"use strict";function e(e,t){(null==t||t>e.length)&&(t=e.length);for(var s=0,r=Array(t);s"string"==typeof e,n=e=>Object.prototype.toString.apply(e),l=e=>"function"==typeof e||"[object Function]"===n(e),c=e=>("[object Object]"===n(e)||"object"==typeof e||l(e))&&null!==e,a=e=>{const t=Object.getPrototypeOf;let s;if(!(e=>c(e)&&null!==e)(e))return!1;if(s=e.prototype,!s)return!0;for(s=e;null!==t(s);)s=t(s);return t(e)===s},h=(e,t)=>{const s=Object.prototype.hasOwnProperty;return e&&s.call(e,t)},u=(e,t)=>{Object.keys(t).forEach((s=>{h(t,s)&&(e[s]=t[s])}))},d=(e,t=300)=>!!l(e)&&setTimeout((()=>{e()}),t),m=e=>e.replace(/]*>.*?<\/script>/gi,""),f=e=>{const t={"&":"&","<":"<",">":">","'":"'",'"':"""};return e.replace(/[&<>'"]/g,(e=>t[e]||e))},p=e=>Array.isArray?Array.isArray(e):"[object Array]"===n(e),y=e=>{let t={};return null===e?null:(p(e)?t=Array.from(e):(t=Object.assign({},e),Object.keys(t).forEach((s=>t[s]=c(e[s])?y(e[s]):e[s]))),t)},b=(()=>{let e=0;return t=>(e+=1,t?t+"-"+e:"guid-"+e)})(),g=e=>!!(c(e)&&e.nodeName&&e.tagName&&1===e.nodeType),v=e=>{return!(!c(e)||!(g(e)||(e=>!(!c(e)||"[object NodeList]"!==n(e)))(e)||(t=e,c(t)&&"[object DocumentFragment]"===n(t))||(e=>!(!c(e)||!("[object Text]"===n(e)||e.tagName&&3===e.nodeType)))(e)));var t},M=(e,t)=>{const s=new RegExp("(\\s|^)"+t+"(\\s|$)");let r,i;return!!g(e)&&(r=e.className,!!r&&(i=e.classList,i&&i.contains?e.classList.contains(t):!!s.exec(r)))},z=(e,t)=>{var s;let r,i;if(M(e,t))return!1;r=e.classList,null!==(s=r)&&void 0!==s&&s.add?t.indexOf(" ")>-1?t.split(" ").forEach((e=>{r.add(e)})):r.add(t):(i=e.className,i+=i.length>0?" "+t:t,e.className=i)},x=(e,t,s)=>{let r=e.tagName.toLowerCase();switch(t){case"style":e.style.cssText=s;break;case"value":"input"===r||"textarea"===r?e.value=s:e.setAttribute(t,s);break;case"htmlFor":e.setAttribute("for",s);break;case"className":z(e,s);break;case"innerHTML":e.innerHTML=s;break;case"innerText":e.innerText=s;break;default:e.setAttribute(t,s)}},w=(e,t)=>{if(!e||!c(t))return!1;Object.keys(t).forEach((s=>{const r=t[s];h(t,s)&&x(e,s,r)}))},$=(e,t,s)=>{const r=document.createDocumentFragment(),i=document.createElement(e),n=e=>v(e)||o(e),l=e=>{let t;if(!n(e))return!1;v(e)?t=e:o(e)&&(t=document.createTextNode(e)),r.appendChild(t)};return c(t)?w(i,t):p(t)&&t.every((e=>n(e)))?t.forEach((e=>{l(e)})):v(t)?l(t):o(t)&&l(document.createTextNode(t)),p(s)?s.forEach((e=>{l(e)})):l(s),i.appendChild(r),i},_=(e,t)=>{var s;let r,i=e.className;if(!i||!M(e,t))return!1;var n;r=e.classList,null!==(s=r)&&void 0!==s&&s.remove?r.remove(t):(n=i.replace(t,""),i=!!o(n)&&n.replace(/(^\s+)|(\s+$)/g,""),e.className=i)},L=(e,t={})=>{const s="outline-icon",r=t.size||0,i=t.color||"",n=t.iconSet||"",l=p(r)?r[0]:r,c=p(r)?r[1]:r,a=r?`width:${l}px;height:${c}px;`:"",h=i?a+`color:${i}`:a,u=t.attrs||{},d=document.createElement("i");let m,f="",y="";return o(e)?((e=>{const t=new RegExp("^\\s*(?:<\\?xml[^>]*>\\s*)?(?:<\\!doctype svg[^>]*\\s*(?:\\[?(?:\\s*]*>\\s*)*\\]?)*[^>]*>\\s*)?]*>[^]*<\\/svg>\\s*$\\s*$","i");return o(e)&&t.test(e)})(e)?y=e:(f=n&&"icon"!==n?`xlink:href="#${n}-icon-${e}"`:`xlink:href="#icon-${e}"`,y=``),d.innerHTML=y,u.className?u.className=`${s} ${u.className}`:u.className=s,w(d,u),m=d.querySelector("svg"),w(m,{"aria-hidden":!0,xmlns:"http://www.w3.org/2000/svg",class:"outline-icon__svg",width:200,height:200,style:h}),d):null},j=(e,t={})=>L(e,t),T=s(i,['','','','','','','','','','','','','','','','','','','','']),O=(e,t="icon")=>o(e)?((e,t="icon")=>{const s=/id="(.*?)"/,r=/^(\w+)-/;return T.find((i=>{const o=s.exec(i)[1];return r.exec(o)[1]===t&&o===("icon"===t?`${t}-${e}`:`${t}-icon-${e}`)}))})(e,t):s(i,T),A=(e,t="")=>{const s=t.replace(/^>/i,"");return!!(t&&s&&e)&&(e.matches?e.matches(s):!!e.msMatchesSelector&&e.msMatchesSelector(s))},C=e=>e.host&&e!==document&&e.host.nodeType?e.host:e.parentNode,S=["focusout","blur","focusin","focus","load","unload","mouseenter","mouseleave"],E=(e,t,s)=>{const r=S.indexOf(t)>-1;s._delegateListener&&delete(s=s._delegateListener)._delegateListener,function(e,t,s){const r=e._listeners;let i=-1;if(r.length<1)return!1;r.forEach(((e,r)=>{const o=e.fn;t===e.type&&(i=r,o===s&&(i=r))})),i>-1&&r.splice(i,1)}(e,t,s),e.removeEventListener(t,s,r)},N=function(e,t,s=!1){const r=o(e)?document.querySelector(e):e,i=r.childNodes,n=((e,t)=>{let s=e._listeners||[];return o(t)&&t&&(s=s.filter((e=>e.type===t))),s})(r,t);n.forEach((e=>{E(r,e.type,e.fn)})),(s||!0===t||1===arguments.length)&&r&&i&&i.forEach((e=>{g(e)&&N(e,t,s)}))},B=(e,t,s)=>{if(!l(s))return N(e,t),!1;E(e,t,s)},H=(e,t,s,r,i,o,n=!1)=>{const l=S.indexOf(s)>-1,c=function(l){const a=function(e){const t=e.target;return(s=t)&&3===s.nodeType?s.parentNode:s;var s}(l),h=((e,t,s,r)=>{const i=s||document;if(!e)return null;do{if(null!=t&&(t.startsWith(">")?e.parentNode===i&&A(e,t):A(e,t))||r&&e===i)return e;if(e===i)break}while(e=C(e))})(a,t,e);let u=o||e;l.delegateTarget=h,!0===o&&(u=i),h&&(!0===n&&B(e,s,c),r.call(u,l,i))};if(!e)return!1;e._listeners||(e._listeners=[]),e._listeners.push({el:e,selector:t,type:s,fn:c,data:i,context:o,capture:l}),r._delegateListener=c,e.addEventListener(s,c,l)},k={},D=e=>h(k,e)&&k[e].length>0,I=(e,t=!0)=>t?D(e):(e=>{let t=D(e),s=e.lastIndexOf(".");for(;!t&&-1!==s;)s=(e=e.substring(0,s)).lastIndexOf("."),t=D(e);return t})(e),P=(e,t,s=!0)=>{const r=e=>{if(!D(e))return!1;k[e].forEach((e=>{const s=["[object Int8Array]","[object Uint8Array]","[object Uint8ClampedArray]","[object Int16Array]","[object Uint16Array]","[object Int32Array]","[object Uint32Array]","[object Float32Array]","[object Float64Array]","[object BigInt64Array]","[object BigUint64Array]"].indexOf(n(t))>-1?t.toString():t;e.callback.call(e.context||e,s)}))},i=()=>{let t=e,s=e.lastIndexOf(".");for(;-1!==s;)t=t.substring(0,s),s=t.lastIndexOf("."),r(t);r(e),r("*")};if(!I(e))return!1;s?setTimeout(i,10):i()},q=e=>{if(!h(k,e))return!1;delete k[e]},U=(e,t)=>{if(!I(e))return!1;t?(e=>{const t=Object.keys(k);if(!e||t.length<1)return!1;t.forEach((t=>{const s=k[t];let r;s.forEach(((t,i)=>{t.callback!==e&&t.token!==e||(r=t.topic,s.splice(-1,i))})),s.length<1&&q(r)}))})(t):q(e)};class V{constructor(e){this.attrs={},this.name="component",e&&this.initialize(e)}initialize(e){return this.attr(e).render().addListeners(),this}attr(e,t){const s=this.attrs;return o(e)?t&&h(s,e)?(s[e]=t,this):s[e]:c(e)?(u(s,e),this):0===arguments.length?s:this}render(){return this}refresh(){return this}destroy(){return this.removeListeners(),this}reload(e){let t=this.attr();return e&&(t=this.attr(e)),this.destroy().initialize(t),this}$emit(e,t){return P(e,t),this}$on(e,t){return((e,t,s=null)=>{const r=b();let i="symbol"==typeof e?e.toString():e;l(t)&&(k[i]||(k[i]=[]),k[i].push({topic:i,callback:t,context:s,token:r}))})(e,t,this),this}$off(e,t){return U(e,t),this}addListeners(){return this}removeListeners(){return this}}const F=[];let R;((e="")=>{const t=document.body;let s=document.querySelector("#outline-icons"),r=[];(e=>{if(!e)return!1;p(e)&&e.length>0?e.forEach((e=>{-1===T.indexOf(e)&&o(e)&&T.push(e)})):o(e)&&T.push(e)})(e),r=O(),s?s.innerHTML=r.join(""):(s=document.createElement("div"),s.innerHTML=``,t.insertBefore(s.firstChild,t.firstChild))})();class W extends V{constructor(e){super(),this._default(),e&&this.initialize(e)}_default(){return this.attrs=y(W.DEFAULTS),this.$el=null,this.id="",this.closed=!1,this.visible=!1,this.offset=-50,this.timer=null,this.destroyed=!1,this}initialize(e){return this.attr(e),this.id=this.attr("id"),this.offset=this.attr("offset")||-50,this.$emit("created",function(e){for(var s=1;s{this.$emit("opened"),this.close()}),1e3*e)),this}open(e){const t=this.$el;let s,r,i,o;return this.isDestroyed()||(this.isClosed()&&this.refresh(e),s=this.attr("offset"),r=this.attr("duration"),i=s&&s>=this.offset?s:this.offset,o=`top:${i}px;`,this.clearTimer(),this.$emit("beforeOpen"),d((()=>{this.visible=!0,z(t,"outline-message_visible"),t.style.cssText=o,r>0&&this.startTimer(r)}),100)),this}close(){const e=this.$el;let t,s;return this.isDestroyed()||(t=this.attr("destroyAfterClosed"),s=this.attr("beforeClose"),l(s)&&s.call(this),e.style.cssText="top:-50px;",_(e,"outline-message_visible"),this.visible=!1,this.closed=!0,d((()=>{this.$emit("closed"),t&&this.destroy()}),500)),this}destroy(){return this.$emit("beforeDestroy"),this.isDestroyed()||(this.removeListeners(),document.body.removeChild(this.$el),clearTimeout(this.timer),this._default(),this.$emit("afterDestroy")),this}onMouseEnter(){return this.clearTimer(),this}onMouseLeave(){const e=this.attr("duration"),t=this.attr("delay");return e<=0||this.startTimer(t),this}onClose(){return this.clearTimer(),this.close(),this}addListeners(){const e=this.$el;return H(e,".outline-message__content","mouseenter",this.onMouseEnter,this,!0),H(e,".outline-message__content","mouseleave",this.onMouseLeave,this,!0),H(e,".outline-message__close","click",this.onClose,this,!0),this}removeListeners(){const e=this.$el;return B(e,"mouseenter",this.onMouseEnter),B(e,"mouseleave",this.onMouseLeave),B(e,"click",this.onClose),this}}return W.DEFAULTS=y({id:"",type:"info",effect:"default",round:!1,offset:30,duration:3,delay:2,message:"",customClass:"",closable:!0,visible:!0,dangerouslyUseHTMLString:!1,destroyAfterClosed:!0,beforeClose:null}),["info","success","warning","error"].forEach((e=>{W[e]=t=>{const s={},r=b("outline-message-"),i=t.beforeClose||null;let n=t.offset||30;return o(t)?s.message=t:a(t)&&u(s,t),s.id=r,s.type=e,s.offset=n,s.visible=!1,s.beforeClose=()=>{W.close(r,i)},R=new W(s),F.forEach((e=>{n+=e.$el.offsetHeight+16})),R.offset=n,R.open(),F.push(R),R}})),W.close=(e,t)=>{const s=F.length;let r,i,o=-1;if(F.forEach(((s,r)=>{e===s.id&&(i=s.$el.offsetHeight,o=r,l(t)&&t.call(s),F.splice(r,1))})),s<=1||-1===o||o>F.length-1)return!1;for(r=o;r{let e=F.length-1;for(;e>=0;e-=1)F[e].close()},W})); //# sourceMappingURL=message.min.js.map diff --git a/message/message.min.js.map b/message/message.min.js.map new file mode 100644 index 00000000..91e8a914 --- /dev/null +++ b/message/message.min.js.map @@ -0,0 +1 @@ +{"version":3,"file":"message.min.js","sources":["../utils/types/isString.js","../utils/lang/toString.js","../utils/types/isFunction.js","../utils/types/isObject.js","../utils/types/isPlainObject.js","../utils/types/isObjectLike.js","../utils/lang/hasOwn.js","../utils/lang/extend.js","../utils/lang/later.js","../utils/lang/stripScripts.js","../utils/lang/encodeHTML.js","../utils/types/isArray.js","../utils/lang/cloneDeep.js","../utils/lang/guid.js","../utils/types/isElement.js","../utils/types/isDOM.js","../utils/types/isHTMLCollection.js","../utils/types/isFragment.js","../utils/types/isTextNode.js","../utils/dom/hasClass.js","../utils/dom/addClass.js","../utils/dom/setAttribute.js","../utils/dom/setAttributes.js","../utils/dom/createElement.js","../utils/dom/removeClass.js","../utils/lang/trim.js","../utils/icons/createElement.js","../utils/types/isSVG.js","../utils/icons/icon.js","../utils/icons/symbols.js","../utils/icons/defaults.js","../utils/icons/getSymbols.js","../utils/icons/getSymbol.js","../utils/dom/matches.js","../utils/dom/getParentOrHost.js","../utils/event/enum.js","../utils/event/_off.js","../utils/event/_delete.js","../utils/event/purgeElement.js","../utils/event/getListeners.js","../utils/event/off.js","../utils/event/on.js","../utils/event/getTarget.js","../utils/dom/resolveTextNode.js","../utils/dom/closest.js","../utils/observer/_subscribers.js","../utils/observer/_hasDirectSubscribersFor.js","../utils/observer/has.js","../utils/observer/_hasSubscribers.js","../utils/observer/emit.js","../utils/types/isTypedArray.js","../utils/observer/_removeSubscriber.js","../utils/observer/off.js","../utils/observer/_removeSubscriberByToken.js","../component.js","../utils/observer/on.js","message.js","../utils/icons/paint.js","../utils/icons/add.js"],"sourcesContent":["/**\r\n * 检测数据是否为 String 类型\r\n * ========================================================================\r\n * @method isArray\r\n * @param {*} str\r\n * @returns {boolean}\r\n */\r\nconst isString = (str) => {\r\n return typeof str === 'string'\r\n}\r\n\r\nexport default isString\r\n","/**\r\n * Object 对象原型上的 toString 方法\r\n * ========================================================================\r\n * @method toString\r\n * @param {*} val\r\n * @returns {string}\r\n */\r\nconst toString = (val) => {\r\n return Object.prototype.toString.apply(val)\r\n}\r\n\r\nexport default toString\r\n","import toString from '@/utils/lang/toString'\r\n\r\n/**\r\n * 检测测试数据是否为 Function 类型\r\n * ========================================================================\r\n * @method isFunction\r\n * @param {*} val - (必须)待检测的数据\r\n * @returns {boolean} 'val' 是 Function 类型返回 true,否则返回 false\r\n */\r\nconst isFunction = (val) => {\r\n return typeof val === 'function' || toString(val) === '[object Function]'\r\n}\r\n\r\nexport default isFunction\r\n","import toString from '../lang/toString'\r\nimport isFunction from './isFunction'\r\n\r\n/**\r\n * 检测数据是否为 Object 类型\r\n * ========================================================================\r\n * @method isObject\r\n * @param {*} o\r\n * @returns {boolean}\r\n */\r\nconst isObject = (o) => {\r\n return (\r\n (toString(o) === '[object Object]' ||\r\n typeof o === 'object' ||\r\n isFunction(o)) &&\r\n o !== null\r\n )\r\n}\r\n\r\nexport default isObject\r\n","import isObjectLike from './isObjectLike'\r\n\r\n/**\r\n * 检测测试数据是否为普通对象\r\n * ========================================================================\r\n * @method isPlainObject\r\n * @param {Object} val - 要检测的数据\r\n * @returns {Boolean} 'val' 是普通对象,返回 true,否则返回 false\r\n */\r\nconst isPlainObject = (val) => {\r\n const getPrototypeOf = Object.getPrototypeOf\r\n let proto\r\n\r\n // Detect obvious negatives\r\n if (!isObjectLike(val)) {\r\n return false\r\n }\r\n\r\n proto = val.prototype\r\n\r\n // JavaScript 对象分为两种:普通对象和函数对象\r\n // 普通对象:原型是 __proto__,没有 prototype 原型(属性)\r\n // 函数对象:原型是 prototype ,prototype 只存在于函数对象上\r\n if (!proto) {\r\n return true\r\n }\r\n\r\n proto = val\r\n\r\n while (getPrototypeOf(proto) !== null) {\r\n proto = getPrototypeOf(proto)\r\n }\r\n\r\n return getPrototypeOf(val) === proto\r\n}\r\n\r\nexport default isPlainObject\r\n","import isObject from './isObject'\r\n\r\n/**\r\n * 检测测试数据是否为类似 Object 类型\r\n * ========================================================================\r\n * @method isObjectLike\r\n * @param {Object} val - 要检测的数据\r\n * @returns {Boolean} 'val' 是类似 Object 类型,返回 true,否则返回 false\r\n */\r\nconst isObjectLike = (val) => {\r\n return isObject(val) && val !== null\r\n}\r\n\r\nexport default isObjectLike\r\n","/**\r\n * 检测对象自身属性中是否具有指定的属性。\r\n * ========================================================================\r\n * @method hasOwn\r\n * @param {Object} obj - (必须)检测的目标对象\r\n * @param {String} prop - (必须)属性名\r\n * @returns {Boolean}\r\n */\r\nconst hasOwn = (obj, prop) => {\r\n const hasOwnProperty = Object.prototype.hasOwnProperty\r\n return obj && hasOwnProperty.call(obj, prop)\r\n}\r\n\r\nexport default hasOwn\r\n","import hasOwn from './hasOwn'\r\n\r\n/**\r\n * 扩展对象\r\n * ========================================================================\r\n * @method extend\r\n * @param {Object} origin\r\n * @param {Object} source\r\n */\r\nconst extend = (origin, source) => {\r\n const keys = Object.keys(source)\r\n\r\n keys.forEach((prop) => {\r\n if (hasOwn(source, prop)) {\r\n origin[prop] = source[prop]\r\n }\r\n })\r\n}\r\n\r\nexport default extend\r\n","import isFunction from '@/utils/types/isFunction'\r\n\r\n/**\r\n * later - 延迟执行方法\r\n * ========================================================================\r\n * @method later\r\n * @param {Function} fn\r\n * @param {Number} [delay]\r\n * @returns {number|boolean}\r\n */\r\nconst later = (fn, delay = 300) => {\r\n if (!isFunction(fn)) {\r\n return false\r\n }\r\n\r\n return setTimeout(() => {\r\n fn()\r\n }, delay)\r\n}\r\n\r\nexport default later\r\n","/**\r\n * 移除字符串中的 JavaScript 代码\r\n * ====================================================\r\n * @param {String} str\r\n * @returns {String}\r\n */\r\nconst stripScripts = (str) => {\r\n return str.replace(/]*>.*?<\\/script>/gi, '')\r\n}\r\n\r\nexport default stripScripts\r\n","/**\r\n * 转义字符串中的 HTML 标签\r\n * ========================================================================\r\n * @param {String} str - 需要转义的字符串\r\n * @returns {String}\r\n */\r\nconst encodeHTML = (str) => {\r\n const CHARTS = {\r\n '&': '&',\r\n '<': '<',\r\n '>': '>',\r\n \"'\": ''',\r\n '\"': '"'\r\n }\r\n\r\n return str.replace(/[&<>'\"]/g, (tag) => {\r\n return CHARTS[tag] || tag\r\n })\r\n}\r\n\r\nexport default encodeHTML\r\n","import toString from '@/utils/lang/toString'\r\n\r\n/**\r\n * 检测数据是否为 Array 类型\r\n * ========================================================================\r\n * @method isArray\r\n * @param {*} o\r\n * @returns {boolean}\r\n */\r\nconst isArray = (o) => {\r\n if (Array.isArray) {\r\n return Array.isArray(o)\r\n } else {\r\n return toString(o) === '[object Array]'\r\n }\r\n}\r\n\r\nexport default isArray\r\n","import isObject from '@/utils/types/isObject'\r\nimport isArray from '@/utils/types/isArray'\r\n\r\n/**\r\n * 深拷贝对象函数\r\n * ========================================================================\r\n * @methods cloneDeep\r\n * @param {Object} obj - 深拷贝的对象\r\n * @returns {Array|Object|*}\r\n *\r\n * @example\r\n * const arr = cloneDeep([2,3,4,6])\r\n * => [2,3,4,6]\r\n */\r\nconst cloneDeep = (obj) => {\r\n let clone = {}\r\n\r\n if (obj === null) {\r\n return null\r\n }\r\n\r\n if (isArray(obj)) {\r\n clone = Array.from(obj)\r\n } else {\r\n clone = Object.assign({}, obj)\r\n Object.keys(clone).forEach((key) => {\r\n return (clone[key] = isObject(obj[key]) ? cloneDeep(obj[key]) : obj[key])\r\n })\r\n }\r\n\r\n return clone\r\n}\r\n\r\nexport default cloneDeep\r\n","/**\r\n * 生成唯一 id 字符串的函数\r\n * ========================================================================\r\n * @method guid\r\n * @param {String} [prefix] - 生成 id 的前缀字符串\r\n * @return {String} 返回一个表示唯一 id 的字符串\r\n */\r\nconst guid = (() => {\r\n let uuid = 0\r\n\r\n return (prefix) => {\r\n uuid += 1\r\n\r\n return prefix ? prefix + '-' + uuid : 'guid-' + uuid\r\n }\r\n})()\r\n\r\nexport default guid\r\n","import isObject from './isObject'\r\n\r\n/**\r\n * 检测数据是否为 HTMLElement DOM 节点\r\n * ========================================================================\r\n * @method isElement\r\n * @param {*} o\r\n * @returns {boolean}\r\n */\r\nconst isElement = (o) => {\r\n return !!(isObject(o) && o.nodeName && o.tagName && o.nodeType === 1)\r\n}\r\n\r\nexport default isElement\r\n","import isObject from './isObject'\r\nimport isElement from './isElement'\r\nimport isHTMLCollection from './isHTMLCollection'\r\nimport isFragment from './isFragment'\r\nimport isTextNode from './isTextNode'\r\n\r\nconst isDOM = (el) => {\r\n return !!(\r\n isObject(el) &&\r\n (isElement(el) || isHTMLCollection(el) || isFragment(el) || isTextNode(el))\r\n )\r\n}\r\n\r\nexport default isDOM\r\n","import toString from '@/utils/lang/toString'\r\nimport isObject from './isObject'\r\n\r\nconst isHTMLCollection = (el) => {\r\n return !!(isObject(el) && toString(el) === '[object NodeList]')\r\n}\r\n\r\nexport default isHTMLCollection\r\n","import toString from '@/utils/lang/toString'\r\nimport isObject from './isObject'\r\n\r\nconst isFragment = (fragment) => {\r\n return !!(\r\n isObject(fragment) && toString(fragment) === '[object DocumentFragment]'\r\n )\r\n}\r\n\r\nexport default isFragment\r\n","import toString from '@/utils/lang/toString'\r\nimport isObject from './isObject'\r\n\r\nconst isTextNode = (el) => {\r\n return !!(\r\n isObject(el) &&\r\n (toString(el) === '[object Text]' || (el.tagName && el.nodeType === 3))\r\n )\r\n}\r\n\r\nexport default isTextNode\r\n","import isElement from '../types/isElement'\r\n/**\r\n * 检测 DOM 节点是否包含名为 className 的样式\r\n * ========================================================================\r\n * @method hasClass\r\n * @param {HTMLElement} el - DOM 节点\r\n * @param {String} className - 样式名称\r\n * @returns {Boolean}\r\n */\r\nconst hasClass = (el, className) => {\r\n const pattern = new RegExp('(\\\\s|^)' + className + '(\\\\s|$)')\r\n let allClass\r\n let classList\r\n\r\n if (!isElement(el)) {\r\n return false\r\n }\r\n\r\n allClass = el.className\r\n\r\n if (!allClass) {\r\n return false\r\n }\r\n\r\n classList = el.classList\r\n\r\n if (classList && classList.contains) {\r\n return el.classList.contains(className)\r\n }\r\n\r\n return !!pattern.exec(allClass)\r\n}\r\n\r\nexport default hasClass\r\n","import hasClass from './hasClass'\r\n\r\n/**\r\n * 给 DOM 节点添加名为 className 的样式\r\n * ========================================================================\r\n * @method addClass\r\n * @param {HTMLElement} el - DOM 节点\r\n * @param {String} className - 样式名称\r\n * @returns {Boolean}\r\n */\r\nconst addClass = (el, className) => {\r\n let classList\r\n let allClass\r\n\r\n if (hasClass(el, className)) {\r\n return false\r\n }\r\n\r\n classList = el.classList\r\n\r\n if (classList?.add) {\r\n if (className.indexOf(' ') > -1) {\r\n className.split(' ').forEach((name) => {\r\n classList.add(name)\r\n })\r\n } else {\r\n classList.add(className)\r\n }\r\n } else {\r\n allClass = el.className\r\n allClass += allClass.length > 0 ? ' ' + className : className\r\n el.className = allClass\r\n }\r\n}\r\n\r\nexport default addClass\r\n","import addClass from './addClass.js'\r\n\r\n/**\r\n * 给 DOM 节点设置属性/值\r\n * ========================================================================\r\n * @method setAttribute\r\n * @param {HTMLElement} el - DOM 节点\r\n * @param {String} attr - 属性名称\r\n * @param {String|Number|Boolean} value - 属性值\r\n */\r\nconst setAttribute = (el, attr, value) => {\r\n let tagName = el.tagName.toLowerCase()\r\n\r\n switch (attr) {\r\n case 'style':\r\n el.style.cssText = value\r\n break\r\n case 'value':\r\n if (tagName === 'input' || tagName === 'textarea') {\r\n el.value = value\r\n } else {\r\n el.setAttribute(attr, value)\r\n }\r\n break\r\n case 'htmlFor':\r\n el.setAttribute('for', value)\r\n break\r\n case 'className':\r\n addClass(el, value)\r\n break\r\n case 'innerHTML':\r\n el.innerHTML = value\r\n break\r\n case 'innerText':\r\n el.innerText = value\r\n break\r\n default:\r\n el.setAttribute(attr, value)\r\n break\r\n }\r\n}\r\n\r\nexport default setAttribute\r\n","import isObject from '../types/isObject'\r\nimport hasOwn from '../lang/hasOwn'\r\nimport setAttribute from './setAttribute'\r\n\r\nconst setAttributes = (el, attrs) => {\r\n if (!el || !isObject(attrs)) {\r\n return false\r\n }\r\n\r\n Object.keys(attrs).forEach((attr) => {\r\n const value = attrs[attr]\r\n if (hasOwn(attrs, attr)) {\r\n setAttribute(el, attr, value)\r\n }\r\n })\r\n}\r\n\r\nexport default setAttributes\r\n","import isObject from '../types/isObject'\r\nimport isString from '../types/isString'\r\nimport isArray from '../types/isArray'\r\nimport isDOM from '../types/isDOM'\r\nimport setAttributes from './setAttributes'\r\n\r\n/**\r\n * 创建 DOM 节点,并添加属性和子节点\r\n * ========================================================================\r\n * @method createElement\r\n * @param {String} tagName - 标签名称\r\n * @param {Object|Array|HTMLElement|DocumentFragment|String} attrs - 属性对象或者子节点\r\n * @param {Array|HTMLElement|DocumentFragment|String} [children] - 子节点数组\r\n * @returns {HTMLElement}\r\n */\r\nconst createElement = (tagName, attrs, children) => {\r\n const $fragment = document.createDocumentFragment()\r\n const $el = document.createElement(tagName)\r\n const isValidChild = (child) => {\r\n return isDOM(child) || isString(child)\r\n }\r\n const append = (child) => {\r\n let $child\r\n\r\n if (!isValidChild(child)) {\r\n return false\r\n }\r\n\r\n if (isDOM(child)) {\r\n $child = child\r\n } else if (isString(child)) {\r\n $child = document.createTextNode(child)\r\n }\r\n\r\n $fragment.appendChild($child)\r\n }\r\n\r\n if (isObject(attrs)) {\r\n setAttributes($el, attrs)\r\n } else if (isArray(attrs) && attrs.every((attr) => isValidChild(attr))) {\r\n attrs.forEach((child) => {\r\n append(child)\r\n })\r\n } else if (isDOM(attrs)) {\r\n append(attrs)\r\n } else if (isString(attrs)) {\r\n append(document.createTextNode(attrs))\r\n }\r\n\r\n if (isArray(children)) {\r\n children.forEach((child) => {\r\n append(child)\r\n })\r\n } else {\r\n append(children)\r\n }\r\n\r\n $el.appendChild($fragment)\r\n\r\n return $el\r\n}\r\n\r\nexport default createElement\r\n","import trim from '../lang/trim'\r\nimport hasClass from './hasClass'\r\n\r\n/**\r\n * 移除 DOM 节点的 className 样式\r\n * ========================================================================\r\n * @method removeClass\r\n * @param {HTMLElement} el - DOM 节点\r\n * @param {String} className - 样式名称\r\n * @returns {Boolean}\r\n */\r\nconst removeClass = (el, className) => {\r\n let allClass = el.className\r\n let classList\r\n\r\n if (!allClass || !hasClass(el, className)) {\r\n return false\r\n }\r\n\r\n classList = el.classList\r\n\r\n if (classList?.remove) {\r\n classList.remove(className)\r\n } else {\r\n allClass = trim(allClass.replace(className, ''))\r\n el.className = allClass\r\n }\r\n}\r\n\r\nexport default removeClass\r\n","import isString from '@/utils/types/isString'\r\n\r\n/**\r\n * 清楚字符串起始位置所有的空格\r\n * ========================================================================\r\n * @method trim\r\n * @param {string} str\r\n * @returns {string|Boolean}\r\n */\r\nconst trim = (str) => {\r\n if (!isString(str)) {\r\n return false\r\n }\r\n return str.replace(/(^\\s+)|(\\s+$)/g, '')\r\n}\r\n\r\nexport default trim\r\n","import isArray from '@/utils/types/isArray'\r\nimport isString from '@/utils/types/isString'\r\nimport isSVG from '@/utils/types/isSVG'\r\nimport setAttributes from '@/utils/dom/setAttributes'\r\n\r\n/**\r\n * 创建 SVG 图标 DOM 元素\r\n * ========================================================================\r\n * @method createElement\r\n * @param {String} name\r\n * @param {Object} [options]\r\n * @param {Number|Array} [options.size]\r\n * @param {String} [options.color]\r\n * @param {String} [options.iconSet]\r\n * @param {Object} [options.attrs]\r\n * @returns {HTMLElement}\r\n */\r\nconst createElement = (name, options = {}) => {\r\n const ICON = 'outline-icon'\r\n const size = options.size || 0\r\n const color = options.color || ''\r\n const iconSet = options.iconSet || ''\r\n const width = isArray(size) ? size[0] : size\r\n const height = isArray(size) ? size[1] : size\r\n const defaultRules = size ? `width:${width}px;height:${height}px;` : ''\r\n const cssRules = color ? defaultRules + `color:${color}` : defaultRules\r\n const attrs = options.attrs || {}\r\n const $icon = document.createElement('i')\r\n let binds = ''\r\n let svg = ''\r\n let $svg\r\n\r\n if (!isString(name)) {\r\n return null\r\n }\r\n\r\n if (isSVG(name)) {\r\n svg = name\r\n } else {\r\n binds =\r\n iconSet && iconSet !== 'icon'\r\n ? `xlink:href=\"#${iconSet}-icon-${name}\"`\r\n : `xlink:href=\"#icon-${name}\"`\r\n svg = ``\r\n }\r\n\r\n $icon.innerHTML = svg\r\n\r\n if (attrs.className) {\r\n attrs.className = `${ICON} ${attrs.className}`\r\n } else {\r\n attrs.className = ICON\r\n }\r\n\r\n setAttributes($icon, attrs)\r\n\r\n $svg = $icon.querySelector('svg')\r\n setAttributes($svg, {\r\n 'aria-hidden': true,\r\n xmlns: 'http://www.w3.org/2000/svg',\r\n class: 'outline-icon__svg',\r\n width: 200,\r\n height: 200,\r\n style: cssRules\r\n })\r\n\r\n return $icon\r\n}\r\n\r\nexport default createElement\r\n","import isString from './isString'\r\n\r\nconst isSVG = (str) => {\r\n const declaration = '(?:<\\\\?xml[^>]*>\\\\s*)?'\r\n const doctype =\r\n '(?:<\\\\!doctype svg[^>]*\\\\s*(?:\\\\[?(?:\\\\s*]*>\\\\s*)*\\\\]?)*[^>]*>\\\\s*)?'\r\n const content = ']*>[^]*<\\\\/svg>\\\\s*$'\r\n const svg = `^\\\\s*${declaration}${doctype}${content}\\\\s*$`\r\n const pattern = new RegExp(svg, 'i')\r\n\r\n return isString(str) && pattern.test(str)\r\n}\r\n\r\nexport default isSVG\r\n","import createElement from './createElement'\r\n\r\n/**\r\n * 创建 SVG 图标 DOM 元素\r\n * ========================================================================\r\n * @method icon\r\n * @alias createElement\r\n * @see createElement\r\n * @param {String} name\r\n * @param {Object} [options]\r\n * @param {Number|Array} [options.size]\r\n * @param {String} [options.color]\r\n * @param {String} [options.iconSet]\r\n * @returns {HTMLElement}\r\n */\r\nconst icon = (name, options = {}) => {\r\n return createElement(name, options)\r\n}\r\n\r\nexport default icon\r\n","import DEFAULTS from './defaults'\r\n\r\nconst SYMBOLS = [...DEFAULTS]\r\n\r\nexport default SYMBOLS\r\n","const DEFAULTS = [\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n ''\r\n]\r\n\r\nexport default DEFAULTS\r\n","import isString from '@/utils/types/isString'\r\nimport getSymbol from './getSymbol'\r\nimport SYMBOLS from './symbols'\r\n\r\n/**\r\n *\r\n * @method getSymbols\r\n * @param {String} [name]\r\n * @param {String} [iconSet]\r\n * @returns {string[]|*}\r\n */\r\nconst getSymbols = (name, iconSet = 'icon') => {\r\n if (isString(name)) {\r\n return getSymbol(name, iconSet)\r\n }\r\n\r\n return [...SYMBOLS]\r\n}\r\n\r\nexport default getSymbols\r\n","import SYMBOLS from './symbols'\r\n\r\n/**\r\n * @method getSymbol\r\n * @param {String} name\r\n * @param {String} [iconSet]\r\n * @returns {String}\r\n */\r\nconst getSymbol = (name, iconSet = 'icon') => {\r\n const patternName = /id=\"(.*?)\"/\r\n const patternSet = /^(\\w+)-/\r\n const symbols = SYMBOLS\r\n\r\n return symbols.find((symbol) => {\r\n const names = patternName.exec(symbol)\r\n const fullName = names[1]\r\n const sets = patternSet.exec(fullName)\r\n const setName = sets[1]\r\n const iconName =\r\n iconSet === 'icon' ? `${iconSet}-${name}` : `${iconSet}-icon-${name}`\r\n\r\n return setName === iconSet && fullName === iconName\r\n })\r\n}\r\n\r\nexport default getSymbol\r\n","/**\r\n * 获取 options 节点下匹配 selector 选择器的 DOM 节点\r\n * ========================================================================\r\n * Element.matches() 方法可以用来判断 DOM 元素是否与给定的选择器匹配,事件代理判断是\r\n * 否触发绑定的代理事件回调函数,关键就是使用 Element.matches() 辨别当前事件触发的目\r\n * 标 DOM 元素是否为事件代理所期望触发的目标。\r\n * ========================================================================\r\n * @method matches\r\n * @see https://developer.mozilla.org/en-US/docs/web/api/element/matches\r\n * @param {HTMLElement} el - (必须)DOM 元素\r\n * @param {String} selector - (必须)匹配 DOM 元素的选择器\r\n * @returns {Boolean}\r\n */\r\nconst matches = (el, selector = '') => {\r\n const sel = selector.replace(/^>/i, '')\r\n\r\n if (!selector || !sel || !el) {\r\n return false\r\n }\r\n\r\n /* istanbul ignore else */\r\n if (el.matches) {\r\n return el.matches(sel)\r\n } else if (el.msMatchesSelector) {\r\n return el.msMatchesSelector(sel)\r\n } else {\r\n return false\r\n }\r\n}\r\n\r\nexport default matches\r\n","/**\r\n * 获取 DOM 元素的父节点\r\n * ========================================================================\r\n * @method getParentOrHost\r\n * @param {*|HTMLElement} el - (必须)要获取父节点的 DOM 元素\r\n * @returns {*|HTMLElement}\r\n */\r\nconst getParentOrHost = (el) => {\r\n return el.host && el !== document && el.host.nodeType\r\n ? el.host\r\n : el.parentNode\r\n}\r\n\r\nexport default getParentOrHost\r\n","export const CAPTURE_EVENTS = [\r\n 'focusout',\r\n 'blur',\r\n 'focusin',\r\n 'focus',\r\n 'load',\r\n 'unload',\r\n 'mouseenter',\r\n 'mouseleave'\r\n]\r\n","import { CAPTURE_EVENTS } from './enum'\r\nimport _delete from './_delete'\r\n\r\n/**\r\n * (私有方法)取消 type 类型的代理事件绑定\r\n * ========================================================================\r\n * 如果没有设置 handler,则销毁 this.$options 绑定的所有符合 type 事件类型的事件绑定\r\n * ========================================================================\r\n * @method _off\r\n * @param {HTMLElement} el - (必须)取消事件绑定的 DOM 元素\r\n * @param {String} type - (必须)事件类型\r\n * @param {Function} fn - (必须)事件处理器回调函数\r\n * @private\r\n */\r\nconst _off = (el, type, fn) => {\r\n const capture = CAPTURE_EVENTS.indexOf(type) > -1\r\n\r\n /* istanbul ignore else */\r\n if (fn._delegateListener) {\r\n fn = fn._delegateListener\r\n delete fn._delegateListener\r\n }\r\n\r\n // 移除缓存的 _listeners 数据\r\n _delete(el, type, fn)\r\n\r\n el.removeEventListener(type, fn, capture)\r\n}\r\n\r\nexport default _off\r\n","/**\r\n * 删除 DOM 元素缓存的 _listeners 数据\r\n * ========================================================================\r\n * @method _delete\r\n * @param {HTMLElement} el - 要删除 listener 的 DOM 元素\r\n * @param {String} type - 事件类型(名称)\r\n * @param {Function} [fn] - 事件处理器回调函数\r\n */\r\nconst _delete = function (el, type, fn) {\r\n const listeners = el._listeners\r\n let index = -1\r\n\r\n if (listeners.length < 1) {\r\n return false\r\n }\r\n\r\n // 移除缓存的 _listeners 数据\r\n listeners.forEach((listener, i) => {\r\n const handler = listener.fn\r\n\r\n if (type === listener.type) {\r\n index = i\r\n\r\n if (handler === fn) {\r\n index = i\r\n }\r\n }\r\n })\r\n\r\n /* istanbul ignore else */\r\n if (index > -1) {\r\n listeners.splice(index, 1)\r\n }\r\n}\r\n\r\nexport default _delete\r\n","import isString from '@/utils/types/isString'\r\nimport isElement from '@/utils/types/isElement'\r\nimport getListeners from './getListeners'\r\nimport _off from './_off'\r\n\r\n/**\r\n * 销毁(type 类型的)代理事件绑定\r\n * ========================================================================\r\n * 1. 设置了事件类型 type,则销毁指定类型的事件绑定,否则清除所有代理事件绑定\r\n * 2. recurse 设置为 true,递归销毁子节点全部事件绑定\r\n * ========================================================================\r\n * @method purgeElement\r\n * @param {HTMLElement|String} el - (必须)DOM 元素或者其选择器\r\n * @param {String|Boolean} type - (必须)事件类型\r\n * @param {Boolean} [recurse] - (可选)是否递归销毁子节点所有事件绑定\r\n */\r\nconst purgeElement = function (el, type, recurse = false) {\r\n const $element = isString(el) ? document.querySelector(el) : el\r\n const $children = $element.childNodes\r\n const listeners = getListeners($element, type)\r\n\r\n listeners.forEach((listener) => {\r\n _off($element, listener.type, listener.fn)\r\n })\r\n\r\n if (\r\n (recurse || type === true || arguments.length === 1) &&\r\n $element &&\r\n $children\r\n ) {\r\n $children.forEach(($child) => {\r\n if (isElement($child)) {\r\n purgeElement($child, type, recurse)\r\n }\r\n })\r\n }\r\n}\r\n\r\nexport default purgeElement\r\n","import isString from '@/utils/types/isString'\r\n\r\n/**\r\n * 获取 DOM 元素(type 事件类型)事件绑定信息\r\n * ========================================================================\r\n * 如果设置了事件类型 type, 则返回指定类型的事件绑定信息,否则返回所有事件绑定信息\r\n * ========================================================================\r\n * @methods getListeners\r\n * @param {HTMLElement} el - (必须)要获取事件绑定信息的 DOM 元素\r\n * @param {String} [type] - (可选)事件类型\r\n * @returns {Array} - 已绑定的事件信息\r\n */\r\nconst getListeners = (el, type) => {\r\n let listeners = el._listeners || []\r\n\r\n if (isString(type) && type) {\r\n listeners = listeners.filter((listener) => {\r\n return listener.type === type\r\n })\r\n }\r\n\r\n return listeners\r\n}\r\n\r\nexport default getListeners\r\n","import purgeElement from './purgeElement'\r\nimport isFunction from '../types/isFunction'\r\nimport _off from './_off'\r\n\r\n/**\r\n * 取消 type 类型的代理事件绑定\r\n * ========================================================================\r\n * 如果没有设置 handler,则销毁 this.$options 绑定的所有符合 type 事件类型的事件绑定\r\n * ========================================================================\r\n * @method off\r\n * @param {HTMLElement|Object} el - (必须)取消事件绑定的 DOM 元素\r\n * @param {String} type - (必须)事件类型\r\n * @param {Function} [fn] - (可选)事件处理器回调函数\r\n */\r\nconst off = (el, type, fn) => {\r\n // 如果不设置 fn 参数,默认清除 el 元素上绑定的所有事件处理器\r\n if (!isFunction(fn)) {\r\n purgeElement(el, type)\r\n return false\r\n }\r\n\r\n _off(el, type, fn)\r\n}\r\n\r\nexport default off\r\n","import closest from '@/utils/dom/closest'\r\nimport off from './off'\r\nimport getTarget from './getTarget'\r\n\r\nimport { CAPTURE_EVENTS } from './enum'\r\n\r\n/**\r\n * 绑定代理事件\r\n * ========================================================================\r\n * @method on\r\n * @param {HTMLElement|String|Object} el - (必须)绑定代理事件的 DOM 节点\r\n * @param {String} selector - (必须)事件代理目标 DOM 元素的选择器\r\n * @param {String|Function} type - (必须)事件类型或者事件处理器回调函数\r\n * @param {Function|Object} fn - (可选) 事件处理器回调函数或者传递给事件处理器回调函数的数据对象\r\n * @param {Object|Boolean} [data] - (可选)传递给事件处理器回调函数的数据对象或者事件处理器回调函数的 this 上下文指向,\r\n * @param {Object|Boolean} [context] - (可选)事件处理器回调函数的 this 上下文指向,或者是否仅触发一次\r\n * 当设置为 true 时,则事件处理器回调函数的 this 上下文指向为 data 对象\r\n * @param {Boolean} once - (可选)是否仅触发一次\r\n */\r\nconst on = (el, selector, type, fn, data, context, once = false) => {\r\n // CAPTURE_EVENTS 中的特殊事件,采用事件捕获模型\r\n const capture = CAPTURE_EVENTS.indexOf(type) > -1\r\n\r\n const listener = function (evt) {\r\n const target = getTarget(evt)\r\n // 通过 Element.matches 方法获得点击的目标元素\r\n const delegateTarget = closest(target, selector, el)\r\n let overrideContext = context || el\r\n\r\n evt.delegateTarget = delegateTarget\r\n\r\n // 当设置为 true 时,则事件处理器回调函数的\r\n // this 上下文指向为 data 对象\r\n if (context === true) {\r\n overrideContext = data\r\n }\r\n\r\n /* istanbul ignore else */\r\n if (delegateTarget) {\r\n // 仅触发一次\r\n /* istanbul ignore else */\r\n if (once === true) {\r\n off(el, type, listener)\r\n }\r\n\r\n fn.call(overrideContext, evt, data)\r\n }\r\n }\r\n\r\n if (!el) {\r\n return false\r\n }\r\n\r\n if (!el._listeners) {\r\n el._listeners = []\r\n }\r\n\r\n // 缓存 options 元素绑定的事件处理器\r\n el._listeners.push({\r\n el,\r\n selector,\r\n type,\r\n fn: listener,\r\n data,\r\n context,\r\n capture\r\n })\r\n\r\n // 缓存包装后的事件处理器\r\n fn._delegateListener = listener\r\n\r\n el.addEventListener(type, listener, capture)\r\n}\r\n\r\nexport default on\r\n","import resolveTextNode from '@/utils/dom/resolveTextNode'\r\n\r\n/**\r\n * 返回触发事件的 target DOM 元素\r\n * ========================================================================\r\n * @method getTarget\r\n * @param {Event} evt - Event 对象\r\n * @return {HTMLElement} - Event 对象的 target DOM 元素\r\n */\r\nconst getTarget = function (evt) {\r\n const target = evt.target\r\n\r\n return resolveTextNode(target)\r\n}\r\n\r\nexport default getTarget\r\n","/**\r\n * 在某些情况下,某些浏览器(例如:Safari 浏览器)会返回实际的目标元素内部的文本节点。\r\n * resolveTextNode() 方法则会返回实际的目标节点。\r\n * ========================================================================\r\n * @method resolveTextNode\r\n * @param {HTMLElement|Text} el - 要解析的节点\r\n * @return {*|HTMLElement} - 实际的目标 DOM 节点\r\n */\r\nconst resolveTextNode = function (el) {\r\n if (el && el.nodeType === 3) {\r\n return el.parentNode\r\n }\r\n\r\n return el\r\n}\r\n\r\nexport default resolveTextNode\r\n","import matches from './matches'\r\nimport getParentOrHost from './getParentOrHost'\r\n\r\n/**\r\n * 获取 options 元素父元素最近的包含 selector 选择器的元素\r\n * ========================================================================\r\n * @method closest\r\n * @param {HTMLElement} el - (必须)DOM 元素\r\n * @param {String} selector - (必须)DOM 元素的选择其\r\n * @param {HTMLElement} [ctx] - (必须)比对的 DOM 元素\r\n * @param {Boolean} [includeCTX] - (必须)是否包含 context DOM 元素\r\n * @returns {null|HTMLElement} - 返回最接近的 DOM 元素\r\n */\r\nconst closest = (el, selector, ctx, includeCTX) => {\r\n const context = ctx || document\r\n\r\n if (!el) {\r\n return null\r\n }\r\n\r\n do {\r\n /* istanbul ignore else */\r\n if (\r\n (selector != null &&\r\n (selector.startsWith('>')\r\n ? el.parentNode === context && matches(el, selector)\r\n : matches(el, selector))) ||\r\n (includeCTX && el === context)\r\n ) {\r\n return el\r\n }\r\n\r\n /* istanbul ignore else */\r\n if (el === context) {\r\n break\r\n }\r\n\r\n /* jshint boss:true */\r\n } while ((el = getParentOrHost(el)))\r\n}\r\n\r\nexport default closest\r\n","/**\r\n * 存储订阅者(主题和处理器的)私有对象\r\n * ========================================================================\r\n * @type {{}}\r\n * @private\r\n */\r\nconst _subscribers = {}\r\n\r\nexport default _subscribers\r\n","import hasOwn from '@/utils/lang/hasOwn'\r\nimport _subscribers from './_subscribers'\r\n\r\n/**\r\n * 判断是否存在与给定 topic 完全匹配的订阅者信息\r\n * ========================================================================\r\n * @method _hasDirectSubscribersFor\r\n * @param {String} topic - (必须)订阅主题字符串\r\n * @returns {Boolean}\r\n */\r\nconst _hasDirectSubscribersFor = (topic) => {\r\n return hasOwn(_subscribers, topic) && _subscribers[topic].length > 0\r\n}\r\n\r\nexport default _hasDirectSubscribersFor\r\n","import _hasDirectSubscribersFor from './_hasDirectSubscribersFor'\r\nimport _hasSubscribers from './_hasSubscribers'\r\n\r\n/**\r\n * 判断是否存在包含 topic 指定的订阅者信息\r\n * ========================================================================\r\n * @method has\r\n * @param {String} topic - (必须)主题名称\r\n * @param {Boolean} [isDirect] - (可选)是否为直接的主题,默认值:true\r\n * @returns {Boolean}\r\n */\r\nconst has = (topic, isDirect = true) => {\r\n return isDirect ? _hasDirectSubscribersFor(topic) : _hasSubscribers(topic)\r\n}\r\n\r\nexport default has\r\n","import _hasDirectSubscribersFor from './_hasDirectSubscribersFor'\r\n\r\n/**\r\n * 判断是否存在包含给定 topic 相关的订阅者信息\r\n * ========================================================================\r\n * @method _hasSubscribers\r\n * @param {String} topic - (必须)订阅主题字符串\r\n * @returns {Boolean}\r\n */\r\nconst _hasSubscribers = (topic) => {\r\n let found = _hasDirectSubscribersFor(topic)\r\n let position = topic.lastIndexOf('.')\r\n\r\n while (!found && position !== -1) {\r\n topic = topic.substring(0, position)\r\n position = topic.lastIndexOf('.')\r\n found = _hasDirectSubscribersFor(topic)\r\n }\r\n\r\n return found\r\n}\r\n\r\nexport default _hasSubscribers\r\n","import isTypedArray from '@/utils/types/isTypedArray'\r\nimport has from './has'\r\nimport _hasDirectSubscribersFor from './_hasDirectSubscribersFor'\r\nimport _subscribers from './_subscribers'\r\n\r\n/**\r\n * (异步)发布订阅主题信息\r\n * ========================================================================\r\n * 主题默认是异步发布的。确保在消费者处理主题时,主题的发起者不会被阻止。\r\n * ========================================================================\r\n * @method emit\r\n * @param {String} topic - (必须)主题名称\r\n * @param {Object} [data] - (可选)数据对象\r\n * @param {Boolean} [async] - (可选) 是否异步发布\r\n */\r\nconst emit = (topic, data, async = true) => {\r\n const execute = (topic) => {\r\n if (!_hasDirectSubscribersFor(topic)) {\r\n return false\r\n }\r\n\r\n _subscribers[topic].forEach((subscriber) => {\r\n // 针对 mqtt 消息服务返回的 Uint8Array 类似的 typed arrays 格式的数据\r\n // 采用 toString() 方法转化为普通(JSON)字符串\r\n const message = isTypedArray(data) ? data.toString() : data\r\n\r\n subscriber.callback.call(subscriber.context || subscriber, message)\r\n })\r\n }\r\n const deliver = () => {\r\n let subscriber = topic\r\n let position = topic.lastIndexOf('.')\r\n\r\n while (position !== -1) {\r\n subscriber = subscriber.substring(0, position)\r\n position = subscriber.lastIndexOf('.')\r\n\r\n execute(subscriber)\r\n }\r\n\r\n // 执行 topic 对应的处理器\r\n execute(topic)\r\n // 执行特殊 topic:'*'(监听全部消息的发布)\r\n execute('*')\r\n }\r\n\r\n if (!has(topic)) {\r\n return false\r\n }\r\n\r\n if (async) {\r\n setTimeout(deliver, 10)\r\n } else {\r\n deliver()\r\n }\r\n}\r\n\r\nexport default emit\r\n","import toString from '@/utils/lang/toString'\r\n/**\r\n * 判断检测数据是否为 Typed Arrays 类型的数据\r\n * ========================================================================\r\n * @param {*} val\r\n * @returns {boolean}\r\n */\r\nconst isTypedArray = (val) => {\r\n const TYPES = [\r\n '[object Int8Array]',\r\n '[object Uint8Array]',\r\n '[object Uint8ClampedArray]',\r\n '[object Int16Array]',\r\n '[object Uint16Array]',\r\n '[object Int32Array]',\r\n '[object Uint32Array]',\r\n '[object Float32Array]',\r\n '[object Float64Array]',\r\n '[object BigInt64Array]',\r\n '[object BigUint64Array]'\r\n ]\r\n\r\n return TYPES.indexOf(toString(val)) > -1\r\n}\r\n\r\nexport default isTypedArray\r\n","import hasOwn from '@/utils/lang/hasOwn'\r\nimport _subscribers from './_subscribers'\r\n\r\n/**\r\n * 删除与给定 topic 相同的订阅者信息\r\n * ========================================================================\r\n * @method _removeSubscriber\r\n * @param {String} topic - (必须)订阅主题字符串\r\n * @returns {Boolean}\r\n */\r\nconst _removeSubscriber = (topic) => {\r\n if (!hasOwn(_subscribers, topic)) {\r\n return false\r\n }\r\n\r\n delete _subscribers[topic]\r\n}\r\n\r\nexport default _removeSubscriber\r\n","import has from './has'\r\nimport _removeSubscriber from './_removeSubscriber'\r\nimport _removeSubscriberByToken from './_removeSubscriberByToken'\r\n\r\n/**\r\n * 取消订阅主题\r\n * ========================================================================\r\n * @method off\r\n * @param {String} topic - (必须)订阅的主题\r\n * @param {Function|String} [token] - (可选)订阅主题的处理器函数或者唯一 Id 值\r\n */\r\nconst off = (topic, token) => {\r\n if (!has(topic)) {\r\n return false\r\n }\r\n\r\n if (token) {\r\n _removeSubscriberByToken(token)\r\n } else {\r\n _removeSubscriber(topic)\r\n }\r\n}\r\n\r\nexport default off\r\n","import _subscribers from './_subscribers'\r\nimport _removeSubscriber from './_removeSubscriber'\r\n\r\n/**\r\n * 通过订阅者 token 值删除订阅者信息\r\n * ========================================================================\r\n * @method _removeSubscriberByToken\r\n * @param {String} token - 订阅者 token 字符串\r\n * @returns {boolean}\r\n * @private\r\n */\r\nconst _removeSubscriberByToken = (token) => {\r\n const keys = Object.keys(_subscribers)\r\n let index = -1\r\n\r\n if (!token || keys.length < 1) {\r\n return false\r\n }\r\n\r\n keys.forEach((subject) => {\r\n const subscriber = _subscribers[subject]\r\n let topic\r\n\r\n subscriber.forEach((execution, j) => {\r\n if (execution.callback === token || execution.token === token) {\r\n topic = execution.topic\r\n subscriber.splice(index, j)\r\n }\r\n })\r\n\r\n /* istanbul ignore else */\r\n if (subscriber.length < 1) {\r\n _removeSubscriber(topic)\r\n }\r\n })\r\n}\r\n\r\nexport default _removeSubscriberByToken\r\n","import isString from './utils/types/isString'\r\n\r\nimport extend from './utils/lang/extend'\r\nimport hasOwn from './utils/lang/hasOwn'\r\n\r\nimport isObject from './utils/types/isObject'\r\n\r\nimport publish from './utils/observer/emit'\r\nimport subscribe from './utils/observer/on'\r\nimport unsubscribe from './utils/observer/off'\r\n\r\nclass Component {\r\n constructor(options) {\r\n this.attrs = {}\r\n this.name = 'component'\r\n\r\n if (options) {\r\n this.initialize(options)\r\n }\r\n }\r\n\r\n initialize(options) {\r\n this.attr(options).render().addListeners()\r\n return this\r\n }\r\n\r\n attr(prop, value) {\r\n const attrs = this.attrs\r\n\r\n if (isString(prop)) {\r\n // 只能扩展 attrs 中已有的属性\r\n if (value && hasOwn(attrs, prop)) {\r\n // 更新单个配置信息\r\n attrs[prop] = value\r\n return this\r\n }\r\n\r\n // 只传递 prop 参数,则返回对应的属性值\r\n return attrs[prop]\r\n } else if (isObject(prop)) {\r\n // 批量更新配置信息\r\n extend(attrs, prop)\r\n\r\n return this\r\n } else if (arguments.length === 0) {\r\n // 不传递参数,直接返回整个\r\n return attrs\r\n }\r\n\r\n return this\r\n }\r\n\r\n render() {\r\n return this\r\n }\r\n\r\n refresh() {\r\n return this\r\n }\r\n\r\n destroy() {\r\n this.removeListeners()\r\n return this\r\n }\r\n\r\n reload(options) {\r\n let attrs = this.attr()\r\n\r\n if (options) {\r\n attrs = this.attr(options)\r\n }\r\n\r\n this.destroy().initialize(attrs)\r\n\r\n return this\r\n }\r\n\r\n $emit(event, data) {\r\n publish(event, data)\r\n return this\r\n }\r\n\r\n $on(event, callback) {\r\n subscribe(event, callback, this)\r\n return this\r\n }\r\n\r\n $off(event, callback) {\r\n unsubscribe(event, callback)\r\n return this\r\n }\r\n\r\n addListeners() {\r\n return this\r\n }\r\n\r\n removeListeners() {\r\n return this\r\n }\r\n}\r\n\r\nexport default Component\r\n","import isFunction from '@/utils/types/isFunction'\r\nimport guid from '@/utils/lang/guid'\r\n\r\nimport _subscribers from './_subscribers'\r\n\r\n/**\r\n * 订阅主题,并给出处理器函数\r\n * ========================================================================\r\n * @method on\r\n * @param {String} topic - (必须)主题名称\r\n * @param {Function} handler - (必须)主题的处理器函数\r\n * @param {Object} [context] - (可选)指定 this 执行上下文\r\n * @return {String} - 唯一的 token 字符串,例如:'guid-1'。\r\n */\r\nconst on = (topic, handler, context = null) => {\r\n const token = guid()\r\n let subject = typeof topic === 'symbol' ? topic.toString() : topic\r\n\r\n if (!isFunction(handler)) {\r\n return ''\r\n }\r\n\r\n /* istanbul ignore else */\r\n if (!_subscribers[subject]) {\r\n _subscribers[subject] = []\r\n }\r\n\r\n _subscribers[subject].push({\r\n topic: subject,\r\n callback: handler,\r\n context,\r\n token\r\n })\r\n\r\n return token\r\n}\r\n\r\nexport default on\r\n","import isString from '@/utils/types/isString'\r\nimport isPlainObject from '@/utils/types/isPlainObject'\r\nimport isFunction from '@/utils/types/isFunction'\r\n\r\nimport extend from '@/utils/lang/extend'\r\nimport later from '@/utils/lang/later'\r\nimport stripScripts from '@/utils/lang/stripScripts'\r\nimport encodeHTML from '@/utils/lang/encodeHTML'\r\nimport cloneDeep from '@/utils/lang/cloneDeep'\r\nimport guid from '@/utils/lang/guid'\r\n\r\nimport createElement from '@/utils/dom/createElement'\r\nimport addClass from '@/utils/dom/addClass'\r\nimport removeClass from '@/utils/dom/removeClass'\r\nimport setAttribute from '@/utils/dom/setAttribute'\r\nimport setAttributes from '@/utils/dom/setAttributes'\r\n\r\nimport icon from '@/utils/icons/icon'\r\nimport paint from '@/utils/icons/paint'\r\n\r\nimport on from '@/utils/event/on'\r\nimport off from '@/utils/event/off'\r\n\r\nimport Component from '@/component'\r\n\r\nimport './message.less'\r\n\r\nconst TYPES = ['info', 'success', 'warning', 'error']\r\nconst instances = []\r\nlet instance\r\n\r\npaint()\r\n\r\nclass Message extends Component {\r\n constructor(options) {\r\n super()\r\n\r\n this._default()\r\n\r\n if (options) {\r\n this.initialize(options)\r\n }\r\n }\r\n\r\n _default() {\r\n this.attrs = cloneDeep(Message.DEFAULTS)\r\n\r\n this.$el = null\r\n this.id = ''\r\n this.closed = false\r\n this.visible = false\r\n this.offset = -50\r\n this.timer = null\r\n this.destroyed = false\r\n\r\n return this\r\n }\r\n\r\n initialize(options) {\r\n this.attr(options)\r\n this.id = this.attr('id')\r\n this.offset = this.attr('offset') || -50\r\n\r\n this.$emit('created', { ...this.attr() })\r\n\r\n this.render().addListeners()\r\n\r\n if (this.attr('visible')) {\r\n this.open()\r\n }\r\n\r\n return this\r\n }\r\n\r\n isClosed() {\r\n return this.closed\r\n }\r\n\r\n isDestroyed() {\r\n return this.destroyed\r\n }\r\n\r\n _getClassName() {\r\n const type = this.attr('type')\r\n const effect = this.attr('effect')\r\n const round = this.attr('round')\r\n const closable = this.attr('closable')\r\n const visible = this.attr('visible')\r\n const customClass = this.attr('customClass')\r\n const className = [\r\n 'outline-message',\r\n `outline-message_${type}`,\r\n `outline-message_${effect}`\r\n ]\r\n\r\n if (round) {\r\n className.push('outline-message_round')\r\n }\r\n\r\n if (!closable) {\r\n className.push('outline-message_full-width')\r\n }\r\n\r\n if (visible) {\r\n className.push('outline-message_visible')\r\n }\r\n\r\n if (customClass) {\r\n className.push(customClass)\r\n }\r\n\r\n return className\r\n }\r\n\r\n render() {\r\n const type = this.attr('type')\r\n const message = this.attr('message')\r\n const effect = this.attr('effect')\r\n const round = this.attr('round')\r\n const closable = this.attr('closable')\r\n const dangerouslyUseHTMLString = this.attr('dangerouslyUseHTMLString')\r\n const className = this._getClassName()\r\n const iconName = effect === 'light' ? `circle-${type}` : type\r\n const children = []\r\n let iconSize = 20\r\n let $type\r\n let $message\r\n let $text\r\n let $close\r\n let $el\r\n\r\n if (round && effect === 'default') {\r\n iconSize = 12\r\n }\r\n\r\n if (effect !== 'plain') {\r\n $type = icon(iconName, {\r\n iconSet: 'outline',\r\n size: iconSize\r\n })\r\n addClass($type, 'outline-message__icon')\r\n children.push($type)\r\n }\r\n\r\n if (!dangerouslyUseHTMLString) {\r\n $text = document.createTextNode(encodeHTML(stripScripts(message)))\r\n } else {\r\n $text = document.createDocumentFragment()\r\n $text.innerHTML = message\r\n }\r\n $message = createElement(\r\n 'p',\r\n {\r\n className: 'outline-message__content'\r\n },\r\n [$text]\r\n )\r\n children.push($message)\r\n\r\n if (closable) {\r\n $close = icon('close', {\r\n iconSet: 'outline',\r\n size: 18\r\n })\r\n addClass($close, 'outline-message__close')\r\n children.push($close)\r\n }\r\n\r\n $el = createElement(\r\n 'div',\r\n {\r\n className: className.join(' ')\r\n },\r\n children\r\n )\r\n $el.style.cssText = `top:-50px;`\r\n this.$el = $el\r\n document.body.appendChild(this.$el)\r\n\r\n this.$emit('mounted')\r\n\r\n return this\r\n }\r\n\r\n _refreshIcon() {\r\n const HIDDEN = '.outline-message_hidden'\r\n const $el = this.$el\r\n let iconSize = 20\r\n let type\r\n let effect\r\n let round\r\n let iconName\r\n let $icon\r\n let $svg\r\n let $use\r\n\r\n if (this.isDestroyed()) {\r\n return this\r\n }\r\n\r\n $icon = $el.querySelector('.outline-icon')\r\n\r\n if (!$icon) {\r\n return this\r\n }\r\n\r\n type = this.attr('type')\r\n effect = this.attr('effect')\r\n round = this.attr('round')\r\n\r\n if (effect === 'plain') {\r\n addClass($icon, HIDDEN)\r\n } else {\r\n removeClass($icon, HIDDEN)\r\n\r\n if (round && effect === 'default') {\r\n iconSize = 12\r\n }\r\n }\r\n\r\n $svg = $icon.querySelector('.outline-icon__svg')\r\n setAttributes($svg, {\r\n style: `width:${iconSize}px;height:${iconSize}px;`\r\n })\r\n\r\n $use = $svg.querySelector('use')\r\n iconName = effect === 'light' ? `circle-${type}` : type\r\n setAttribute($use, 'xlink:href', `#outline-icon-${iconName}`)\r\n\r\n return this\r\n }\r\n\r\n _refreshMessage() {\r\n const $el = this.$el\r\n let $message\r\n let dangerouslyUseHTMLString\r\n let message\r\n let text\r\n\r\n if (this.isDestroyed()) {\r\n return this\r\n }\r\n\r\n $message = $el.querySelector('.outline-message__content')\r\n dangerouslyUseHTMLString = this.attr('dangerouslyUseHTMLString')\r\n message = this.attr('message')\r\n\r\n if (!dangerouslyUseHTMLString) {\r\n text = encodeHTML(stripScripts(message))\r\n } else {\r\n text = message\r\n }\r\n\r\n $message.innerHTML = text\r\n\r\n return this\r\n }\r\n\r\n _refreshClose() {\r\n const HIDDEN = '.outline-message_hidden'\r\n const $el = this.$el\r\n let $close\r\n let closable\r\n\r\n if (this.isDestroyed()) {\r\n return this\r\n }\r\n\r\n $close = $el.querySelector('.outline-message__close')\r\n closable = this.attr('closable')\r\n\r\n if ($close) {\r\n if (closable) {\r\n addClass($close, HIDDEN)\r\n } else {\r\n removeClass($close, HIDDEN)\r\n }\r\n }\r\n\r\n return this\r\n }\r\n\r\n _refreshEl() {\r\n const $el = this.$el\r\n let className\r\n\r\n if (this.isDestroyed()) {\r\n return this\r\n }\r\n\r\n className = this._getClassName()\r\n setAttribute($el, 'className', className.join(' '))\r\n\r\n return this\r\n }\r\n\r\n refresh(options) {\r\n if (!isPlainObject(options)) {\r\n return this\r\n }\r\n\r\n this.attr(options)\r\n ._refreshIcon()\r\n ._refreshMessage()\r\n ._refreshClose()\r\n ._refreshEl()\r\n\r\n return this\r\n }\r\n\r\n clearTimer() {\r\n if (this.isDestroyed()) {\r\n return this\r\n }\r\n\r\n if (this.timer) {\r\n clearTimeout(this.timer)\r\n this.timer = null\r\n }\r\n\r\n return this\r\n }\r\n\r\n startTimer(duration) {\r\n if (this.isDestroyed()) {\r\n return this\r\n }\r\n\r\n this.timer = later(() => {\r\n this.$emit('opened')\r\n this.close()\r\n }, duration * 1000)\r\n\r\n return this\r\n }\r\n\r\n open(options) {\r\n const $el = this.$el\r\n let offset\r\n let duration\r\n let top\r\n let cssRules\r\n\r\n if (this.isDestroyed()) {\r\n return this\r\n }\r\n\r\n if (this.isClosed()) {\r\n this.refresh(options)\r\n }\r\n\r\n offset = this.attr('offset')\r\n duration = this.attr('duration')\r\n top = offset && offset >= this.offset ? offset : this.offset\r\n cssRules = `top:${top}px;`\r\n\r\n this.clearTimer()\r\n\r\n this.$emit('beforeOpen')\r\n\r\n later(() => {\r\n this.visible = true\r\n\r\n addClass($el, 'outline-message_visible')\r\n $el.style.cssText = cssRules\r\n\r\n if (duration > 0) {\r\n this.startTimer(duration)\r\n }\r\n }, 100)\r\n\r\n return this\r\n }\r\n\r\n close() {\r\n const $el = this.$el\r\n const cssRules = `top:-50px;`\r\n let destroyAfterClosed\r\n let beforeClose\r\n\r\n if (this.isDestroyed()) {\r\n return this\r\n }\r\n\r\n destroyAfterClosed = this.attr('destroyAfterClosed')\r\n beforeClose = this.attr('beforeClose')\r\n\r\n if (isFunction(beforeClose)) {\r\n beforeClose.call(this)\r\n }\r\n\r\n $el.style.cssText = cssRules\r\n removeClass($el, 'outline-message_visible')\r\n\r\n this.visible = false\r\n this.closed = true\r\n\r\n later(() => {\r\n this.$emit('closed')\r\n\r\n if (destroyAfterClosed) {\r\n this.destroy()\r\n }\r\n }, 500)\r\n\r\n return this\r\n }\r\n\r\n destroy() {\r\n this.$emit('beforeDestroy')\r\n\r\n if (this.isDestroyed()) {\r\n return this\r\n }\r\n\r\n this.removeListeners()\r\n\r\n document.body.removeChild(this.$el)\r\n\r\n clearTimeout(this.timer)\r\n this._default()\r\n\r\n this.$emit('afterDestroy')\r\n\r\n return this\r\n }\r\n\r\n onMouseEnter() {\r\n this.clearTimer()\r\n return this\r\n }\r\n\r\n onMouseLeave() {\r\n const duration = this.attr('duration')\r\n const delay = this.attr('delay')\r\n\r\n if (duration <= 0) {\r\n return this\r\n }\r\n\r\n this.startTimer(delay)\r\n\r\n return this\r\n }\r\n\r\n onClose() {\r\n this.clearTimer()\r\n this.close()\r\n return this\r\n }\r\n\r\n addListeners() {\r\n const $el = this.$el\r\n\r\n on(\r\n $el,\r\n '.outline-message__content',\r\n 'mouseenter',\r\n this.onMouseEnter,\r\n this,\r\n true\r\n )\r\n on(\r\n $el,\r\n '.outline-message__content',\r\n 'mouseleave',\r\n this.onMouseLeave,\r\n this,\r\n true\r\n )\r\n on($el, '.outline-message__close', 'click', this.onClose, this, true)\r\n\r\n return this\r\n }\r\n\r\n removeListeners() {\r\n const $el = this.$el\r\n\r\n off($el, 'mouseenter', this.onMouseEnter)\r\n off($el, 'mouseleave', this.onMouseLeave)\r\n off($el, 'click', this.onClose)\r\n\r\n return this\r\n }\r\n}\r\n\r\nMessage.DEFAULTS = (() => {\r\n const OPTIONS = {\r\n id: '',\r\n type: 'info',\r\n effect: 'default',\r\n round: false,\r\n offset: 30,\r\n duration: 3,\r\n delay: 2,\r\n message: '',\r\n customClass: '',\r\n closable: true,\r\n visible: true,\r\n dangerouslyUseHTMLString: false,\r\n destroyAfterClosed: true,\r\n beforeClose: null\r\n }\r\n\r\n return cloneDeep(OPTIONS)\r\n})()\r\n\r\nTYPES.forEach((type) => {\r\n Message[type] = (options) => {\r\n const config = {}\r\n const id = guid(`outline-message-`)\r\n const beforeClose = options.beforeClose || null\r\n let offset = options.offset || 30\r\n\r\n if (isString(options)) {\r\n config.message = options\r\n } else {\r\n if (isPlainObject(options)) {\r\n extend(config, options)\r\n }\r\n }\r\n config.id = id\r\n config.type = type\r\n config.offset = offset\r\n config.visible = false\r\n config.beforeClose = () => {\r\n Message.close(id, beforeClose)\r\n }\r\n\r\n instance = new Message(config)\r\n instances.forEach((item) => {\r\n offset += item.$el.offsetHeight + 16\r\n })\r\n instance.offset = offset\r\n instance.open()\r\n instances.push(instance)\r\n\r\n return instance\r\n }\r\n})\r\n\r\n// 关闭指定 id 消息的静态方法\r\nMessage.close = (id, beforeClose) => {\r\n const len = instances.length\r\n let index = -1\r\n let i\r\n let offsetHeight\r\n\r\n instances.forEach((instance, i) => {\r\n // 在 instances 中通过 id 找到要关闭的消息\r\n if (id === instance.id) {\r\n offsetHeight = instance.$el.offsetHeight\r\n index = i\r\n\r\n // 关闭消息\r\n if (isFunction(beforeClose)) {\r\n beforeClose.call(instance)\r\n }\r\n\r\n instances.splice(i, 1)\r\n }\r\n })\r\n\r\n if (len <= 1 || index === -1 || index > instances.length - 1) {\r\n return false\r\n }\r\n\r\n i = index\r\n\r\n // 界面中的消息逐个向上收起\r\n for (; i < len - 1; i += 1) {\r\n const dom = instances[i].$el\r\n\r\n dom.style['top'] = parseInt(dom.style['top'], 10) - offsetHeight - 16 + 'px'\r\n }\r\n}\r\n\r\n// 关闭所有消息的静态方法\r\nMessage.clear = () => {\r\n let i = instances.length - 1\r\n for (; i >= 0; i -= 1) {\r\n instances[i].close()\r\n }\r\n}\r\n\r\nexport default Message\r\n","import add from './add'\r\nimport getSymbols from './getSymbols'\r\n\r\n/**\r\n * 绘制 SVG 图标集\r\n * ========================================================================\r\n * @method paint\r\n * @param {String|Array} symbol\r\n */\r\nconst paint = (symbol = '') => {\r\n const $body = document.body\r\n let $icons = document.querySelector('#outline-icons')\r\n let symbols = []\r\n\r\n add(symbol)\r\n symbols = getSymbols()\r\n\r\n if ($icons) {\r\n $icons.innerHTML = symbols.join('')\r\n } else {\r\n $icons = document.createElement('div')\r\n $icons.innerHTML =\r\n ``\r\n $body.insertBefore($icons.firstChild, $body.firstChild)\r\n }\r\n}\r\n\r\nexport default paint\r\n","import isArray from '@/utils/types/isArray'\r\nimport isString from '@/utils/types/isString'\r\nimport SYMBOLS from './symbols'\r\n\r\n/**\r\n * @method add\r\n * @param {Array|String} symbols\r\n * @return {Boolean}\r\n */\r\nconst add = (symbols) => {\r\n if (!symbols) {\r\n return false\r\n }\r\n\r\n if (isArray(symbols) && symbols.length > 0) {\r\n symbols.forEach((symbol) => {\r\n /* istanbul ignore else */\r\n if (SYMBOLS.indexOf(symbol) === -1 && isString(symbol)) {\r\n SYMBOLS.push(symbol)\r\n }\r\n })\r\n } else {\r\n /* istanbul ignore else */\r\n if (isString(symbols)) {\r\n SYMBOLS.push(symbols)\r\n }\r\n }\r\n}\r\n\r\nexport default add\r\n"],"names":["isString","str","toString","val","Object","prototype","apply","isFunction","isObject","o","isPlainObject","getPrototypeOf","proto","isObjectLike","hasOwn","obj","prop","hasOwnProperty","call","extend","origin","source","keys","forEach","later","fn","delay","setTimeout","stripScripts","replace","encodeHTML","CHARTS","tag","isArray","Array","cloneDeep","clone","from","assign","key","guid","uuid","prefix","isElement","nodeName","tagName","nodeType","isDOM","el","isHTMLCollection","fragment","isTextNode","hasClass","className","pattern","RegExp","allClass","classList","contains","exec","addClass","_classList","add","indexOf","split","name","length","setAttribute","attr","value","toLowerCase","style","cssText","innerHTML","innerText","setAttributes","attrs","createElement","children","$fragment","document","createDocumentFragment","$el","isValidChild","child","append","$child","createTextNode","appendChild","every","removeClass","remove","options","ICON","size","color","iconSet","width","height","defaultRules","cssRules","$icon","$svg","binds","svg","test","isSVG","querySelector","xmlns","class","icon","SYMBOLS","_maybeArrayLike","_toConsumableArray","getSymbols","getSymbol","patternName","patternSet","find","symbol","fullName","matches","selector","sel","msMatchesSelector","getParentOrHost","host","parentNode","CAPTURE_EVENTS","_off","type","capture","_delegateListener","listeners","_listeners","index","listener","i","handler","splice","_delete","removeEventListener","purgeElement","recurse","$element","$children","childNodes","getListeners","filter","arguments","off","on","data","context","once","evt","target","getTarget","delegateTarget","closest","ctx","includeCTX","startsWith","overrideContext","push","addEventListener","_subscribers","_hasDirectSubscribersFor","topic","has","isDirect","found","position","lastIndexOf","substring","_hasSubscribers","emit","async","execute","subscriber","message","callback","deliver","_removeSubscriber","token","subject","execution","j","_removeSubscriberByToken","Component","constructor","this","initialize","render","addListeners","refresh","destroy","removeListeners","reload","$emit","event","publish","$on","subscribe","$off","unsubscribe","instances","instance","paint","$body","body","$icons","symbols","join","insertBefore","firstChild","Message","super","_default","DEFAULTS","id","closed","visible","offset","timer","destroyed","_objectSpread","open","isClosed","isDestroyed","_getClassName","effect","round","closable","customClass","dangerouslyUseHTMLString","$type","$message","$text","$close","iconSize","_refreshIcon","HIDDEN","iconName","$use","_refreshMessage","text","_refreshClose","_refreshEl","clearTimer","clearTimeout","startTimer","duration","close","top","destroyAfterClosed","beforeClose","removeChild","onMouseEnter","onMouseLeave","onClose","config","item","offsetHeight","len","dom","parseInt","clear"],"mappings":"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"} \ No newline at end of file diff --git a/navigator.css b/navigator.css deleted file mode 100644 index a1779c6e..00000000 --- a/navigator.css +++ /dev/null @@ -1,153 +0,0 @@ -:root { - --outline-zIndex: 2000; - --outline-sticky-height: 100%; - --outline-navigator-width: 100%; -} -/* ========== colors.theme - 基础颜色变量集合 ========== */ -/** - * ellipsis.less - 文本省略 mixinx 函数 - * ============================================================= - * Created By: Yaohaixiao - * Update: 2022.3.11 - */ -/* ====== 文本省略函数 ====== */ -.outline-navigator { - position: relative; - z-index: 1; - margin: 0; - width: var(--outline-navigator-width); - overflow: auto; -} -.outline-navigator-parent { - -webkit-transition: 0.3s ease-in-out; - transition: 0.3s ease-in-out; -} -.outline-navigator__title { - margin: 0 16px; - height: 40px; - line-height: 40px; - padding: 0 16px; - border-bottom: 1px solid #dcdfe6; - font-size: 16px; - font-weight: 400; - overflow: hidden; -} -.outline-navigator__main { - position: relative; - z-index: 1; - margin: 0; - overflow: hidden; -} -.outline-navigator__list, -.outline-navigator__subject, -.outline-navigator__item { - position: relative; - z-index: 2; - margin: 0; - padding: 0; - list-style-type: none; - overflow: hidden; -} -.outline-navigator__list { - padding: 0.5em 0; -} -.outline-navigator__subject { - padding-left: 1em; -} -.outline-navigator__item { - margin: 0; - line-height: 30px; - font-size: 13px; - overflow: hidden; -} -.outline-navigator__placeholder { - position: absolute; - z-index: 1; - top: 0; - left: 0; - width: 100%; - height: 30px; - background-color: #f7f8f9; - border-left: 2px solid #058942; - -webkit-transition-duration: 0.2s; - transition-duration: 0.2s; - -webkit-box-sizing: border-box; - box-sizing: border-box; - overflow: hidden; -} -.outline-navigator__anchor { - white-space: nowrap; - text-overflow: ellipsis; - overflow: hidden; - display: block; - padding: 0 1.5em; -} -.outline-navigator__anchor:link, -.outline-navigator__anchor:visited, -.outline-navigator__anchor:hover { - text-decoration: none; - color: #555; -} -.outline-navigator__anchor:hover { - color: #058942; -} -.outline-navigator__code { - padding-right: 0.5em; -} -.outline-navigator_highlight.outline-navigator__anchor:link, -.outline-navigator_highlight.outline-navigator__anchor:visited, -.outline-navigator_highlight.outline-navigator__anchor:hover { - color: #058942; - font-weight: bold; -} -.outline-navigator_sticky, -.outline-navigator_fixed { - display: -webkit-box; - display: -ms-flexbox; - display: flex; - -ms-flex-wrap: nowrap; - flex-wrap: nowrap; - -webkit-box-orient: vertical; - -webkit-box-direction: normal; - -ms-flex-direction: column; - flex-direction: column; - z-index: var(--outline-zIndex); - top: 0; - overflow: hidden; -} -.outline-navigator_sticky .outline-navigator__title, -.outline-navigator_fixed .outline-navigator__title, -.outline-navigator_sticky .outline-navigator__main, -.outline-navigator_fixed .outline-navigator__main { - -webkit-box-sizing: border-box; - box-sizing: border-box; -} -.outline-navigator_sticky .outline-navigator__title, -.outline-navigator_fixed .outline-navigator__title { - -ms-flex-negative: 0; - flex-shrink: 0; -} -.outline-navigator_sticky .outline-navigator__main, -.outline-navigator_fixed .outline-navigator__main { - -webkit-box-flex: 1; - -ms-flex: 1; - flex: 1; - overflow: auto; -} -.outline-navigator_sticky { - position: sticky; - max-height: var(--outline-sticky-height); -} -.outline-navigator_fixed { - position: fixed; - max-height: 100%; -} -.outline-navigator_hidden { - display: none; -} -.outline-navigator_folded { - width: 0; - overflow: hidden; -} - -/*# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInZhcmlhYmxlcy5sZXNzIiwiLi4vPGlucHV0IGNzcyAyPiIsIm5hdmlnYXRvci5sZXNzIiwiZWxsaXBzaXMubGVzcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtFQUNFLHVCQUFBO0VBQ0EsOEJBQUE7RUFDQSxnQ0FBQTtDQ0NEO0FBQ0QsbURBQW1EO0FBQ25EOzs7OztHQUtHO0FBQ0gsMEJBQTBCO0FDUjFCO0VBQ0UsbUJBQUE7RUFDQSxXQUFBO0VBQ0EsVUFBQTtFQUNBLHNDQUFBO0VBQ0EsZUFBQTtDRFVEO0FDUkM7RUFDRSxxQ0FBQTtFQUFBLDZCQUFBO0NEVUg7QUNQQztFQUNFLGVBQUE7RUFDQSxhQUFBO0VBQ0Esa0JBQUE7RUFDQSxnQkFBQTtFQUNBLGlDQUFBO0VBQ0EsZ0JBQUE7RUFDQSxpQkFBQTtFQUNBLGlCQUFBO0NEU0g7QUNOQztFQUNFLG1CQUFBO0VBQ0EsV0FBQTtFQUNBLFVBQUE7RUFDQSxpQkFBQTtDRFFIO0FDTEM7OztFQUdFLG1CQUFBO0VBQ0EsV0FBQTtFQUNBLFVBQUE7RUFDQSxXQUFBO0VBQ0Esc0JBQUE7RUFDQSxpQkFBQTtDRE9IO0FDSkM7RUFDRSxpQkFBQTtDRE1IO0FDSEM7RUFDRSxrQkFBQTtDREtIO0FDRkM7RUFDRSxVQUFBO0VBQ0Esa0JBQUE7RUFDQSxnQkFBQTtFQUNBLGlCQUFBO0NESUg7QUNEQztFQUNFLG1CQUFBO0VBQ0EsV0FBQTtFQUNBLE9BQUE7RUFDQSxRQUFBO0VBQ0EsWUFBQTtFQUNBLGFBQUE7RUFDQSwwQkFBQTtFQUNBLCtCQUFBO0VBQ0Esa0NBQUE7VUFBQSwwQkFBQTtFQUNBLCtCQUFBO1VBQUEsdUJBQUE7RUFDQSxpQkFBQTtDREdIO0FDQUM7RUNoRUEsb0JBQUE7RUFDQSx3QkFBQTtFQUNBLGlCQUFBO0VEZ0VFLGVBQUE7RUFDQSxpQkFBQTtDRElIO0FDRkc7OztFQUdFLHNCQUFBO0VBQ0EsWUFBQTtDRElMO0FDREc7RUFDRSxlQUFBO0NER0w7QUNDQztFQUNFLHFCQUFBO0NEQ0g7QUNJSzs7O0VBR0UsZUFBQTtFQUNBLGtCQUFBO0NERlA7QUNPQzs7RUFFRSxxQkFBQTtFQUFBLHFCQUFBO0VBQUEsY0FBQTtFQUNBLHNCQUFBO01BQUEsa0JBQUE7RUFDQSw2QkFBQTtFQUFBLDhCQUFBO01BQUEsMkJBQUE7VUFBQSx1QkFBQTtFQUNBLCtCQUFBO0VBQ0EsT0FBQTtFQUNBLGlCQUFBO0NETEg7QUNRSzs7OztFQUVFLCtCQUFBO1VBQUEsdUJBQUE7Q0RKUDtBQ09LOztFQUNFLHFCQUFBO01BQUEsZUFBQTtDREpQO0FDT0s7O0VBQ0Usb0JBQUE7TUFBQSxZQUFBO1VBQUEsUUFBQTtFQUNBLGVBQUE7Q0RKUDtBQ1NDO0VBQ0UsaUJBQUE7RUFDQSx5Q0FBQTtDRFBIO0FDVUM7RUFDRSxnQkFBQTtFQUNBLGlCQUFBO0NEUkg7QUNXQztFQUNFLGNBQUE7Q0RUSDtBQ1lDO0VBQ0UsU0FBQTtFQUNBLGlCQUFBO0NEVkgiLCJmaWxlIjoibmF2aWdhdG9yLmNzcyIsInNvdXJjZXNDb250ZW50IjpbIjpyb290IHtcclxuICAtLW91dGxpbmUtekluZGV4OiAyMDAwO1xyXG4gIC0tb3V0bGluZS1zdGlja3ktaGVpZ2h0OiAxMDAlO1xyXG4gIC0tb3V0bGluZS1uYXZpZ2F0b3Itd2lkdGg6IDEwMCU7XHJcbn1cclxuIiwiOnJvb3Qge1xuICAtLW91dGxpbmUtekluZGV4OiAyMDAwO1xuICAtLW91dGxpbmUtc3RpY2t5LWhlaWdodDogMTAwJTtcbiAgLS1vdXRsaW5lLW5hdmlnYXRvci13aWR0aDogMTAwJTtcbn1cbi8qID09PT09PT09PT0gY29sb3JzLnRoZW1lIC0g5Z+656GA6aKc6Imy5Y+Y6YeP6ZuG5ZCIID09PT09PT09PT0gKi9cbi8qKlxuICogZWxsaXBzaXMubGVzcyAtIOaWh+acrOecgeeVpSBtaXhpbngg5Ye95pWwXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBDcmVhdGVkIEJ5OiBZYW9oYWl4aWFvXG4gKiBVcGRhdGU6IDIwMjIuMy4xMVxuICovXG4vKiA9PT09PT0g5paH5pys55yB55Wl5Ye95pWwID09PT09PSAqL1xuLm91dGxpbmUtbmF2aWdhdG9yIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICB6LWluZGV4OiAxO1xuICBtYXJnaW46IDA7XG4gIHdpZHRoOiB2YXIoLS1vdXRsaW5lLW5hdmlnYXRvci13aWR0aCk7XG4gIG92ZXJmbG93OiBhdXRvO1xufVxuLm91dGxpbmUtbmF2aWdhdG9yLXBhcmVudCB7XG4gIHRyYW5zaXRpb246IDAuM3MgZWFzZS1pbi1vdXQ7XG59XG4ub3V0bGluZS1uYXZpZ2F0b3JfX3RpdGxlIHtcbiAgbWFyZ2luOiAwIDE2cHg7XG4gIGhlaWdodDogNDBweDtcbiAgbGluZS1oZWlnaHQ6IDQwcHg7XG4gIHBhZGRpbmc6IDAgMTZweDtcbiAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNkY2RmZTY7XG4gIGZvbnQtc2l6ZTogMTZweDtcbiAgZm9udC13ZWlnaHQ6IDQwMDtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi5vdXRsaW5lLW5hdmlnYXRvcl9fbWFpbiB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgei1pbmRleDogMTtcbiAgbWFyZ2luOiAwO1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLm91dGxpbmUtbmF2aWdhdG9yX19saXN0LFxuLm91dGxpbmUtbmF2aWdhdG9yX19zdWJqZWN0LFxuLm91dGxpbmUtbmF2aWdhdG9yX19pdGVtIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICB6LWluZGV4OiAyO1xuICBtYXJnaW46IDA7XG4gIHBhZGRpbmc6IDA7XG4gIGxpc3Qtc3R5bGUtdHlwZTogbm9uZTtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi5vdXRsaW5lLW5hdmlnYXRvcl9fbGlzdCB7XG4gIHBhZGRpbmc6IDAuNWVtIDA7XG59XG4ub3V0bGluZS1uYXZpZ2F0b3JfX3N1YmplY3Qge1xuICBwYWRkaW5nLWxlZnQ6IDFlbTtcbn1cbi5vdXRsaW5lLW5hdmlnYXRvcl9faXRlbSB7XG4gIG1hcmdpbjogMDtcbiAgbGluZS1oZWlnaHQ6IDMwcHg7XG4gIGZvbnQtc2l6ZTogMTNweDtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi5vdXRsaW5lLW5hdmlnYXRvcl9fcGxhY2Vob2xkZXIge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHotaW5kZXg6IDE7XG4gIHRvcDogMDtcbiAgbGVmdDogMDtcbiAgd2lkdGg6IDEwMCU7XG4gIGhlaWdodDogMzBweDtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2Y3ZjhmOTtcbiAgYm9yZGVyLWxlZnQ6IDJweCBzb2xpZCAjMDU4OTQyO1xuICB0cmFuc2l0aW9uLWR1cmF0aW9uOiAwLjJzO1xuICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLm91dGxpbmUtbmF2aWdhdG9yX19hbmNob3Ige1xuICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpcztcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgZGlzcGxheTogYmxvY2s7XG4gIHBhZGRpbmc6IDAgMS41ZW07XG59XG4ub3V0bGluZS1uYXZpZ2F0b3JfX2FuY2hvcjpsaW5rLFxuLm91dGxpbmUtbmF2aWdhdG9yX19hbmNob3I6dmlzaXRlZCxcbi5vdXRsaW5lLW5hdmlnYXRvcl9fYW5jaG9yOmhvdmVyIHtcbiAgdGV4dC1kZWNvcmF0aW9uOiBub25lO1xuICBjb2xvcjogIzU1NTtcbn1cbi5vdXRsaW5lLW5hdmlnYXRvcl9fYW5jaG9yOmhvdmVyIHtcbiAgY29sb3I6ICMwNTg5NDI7XG59XG4ub3V0bGluZS1uYXZpZ2F0b3JfX2NvZGUge1xuICBwYWRkaW5nLXJpZ2h0OiAwLjVlbTtcbn1cbi5vdXRsaW5lLW5hdmlnYXRvcl9oaWdobGlnaHQub3V0bGluZS1uYXZpZ2F0b3JfX2FuY2hvcjpsaW5rLFxuLm91dGxpbmUtbmF2aWdhdG9yX2hpZ2hsaWdodC5vdXRsaW5lLW5hdmlnYXRvcl9fYW5jaG9yOnZpc2l0ZWQsXG4ub3V0bGluZS1uYXZpZ2F0b3JfaGlnaGxpZ2h0Lm91dGxpbmUtbmF2aWdhdG9yX19hbmNob3I6aG92ZXIge1xuICBjb2xvcjogIzA1ODk0MjtcbiAgZm9udC13ZWlnaHQ6IGJvbGQ7XG59XG4ub3V0bGluZS1uYXZpZ2F0b3Jfc3RpY2t5LFxuLm91dGxpbmUtbmF2aWdhdG9yX2ZpeGVkIHtcbiAgZGlzcGxheTogZmxleDtcbiAgZmxleC13cmFwOiBub3dyYXA7XG4gIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gIHotaW5kZXg6IHZhcigtLW91dGxpbmUtekluZGV4KTtcbiAgdG9wOiAwO1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLm91dGxpbmUtbmF2aWdhdG9yX3N0aWNreSAub3V0bGluZS1uYXZpZ2F0b3JfX3RpdGxlLFxuLm91dGxpbmUtbmF2aWdhdG9yX2ZpeGVkIC5vdXRsaW5lLW5hdmlnYXRvcl9fdGl0bGUsXG4ub3V0bGluZS1uYXZpZ2F0b3Jfc3RpY2t5IC5vdXRsaW5lLW5hdmlnYXRvcl9fbWFpbixcbi5vdXRsaW5lLW5hdmlnYXRvcl9maXhlZCAub3V0bGluZS1uYXZpZ2F0b3JfX21haW4ge1xuICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xufVxuLm91dGxpbmUtbmF2aWdhdG9yX3N0aWNreSAub3V0bGluZS1uYXZpZ2F0b3JfX3RpdGxlLFxuLm91dGxpbmUtbmF2aWdhdG9yX2ZpeGVkIC5vdXRsaW5lLW5hdmlnYXRvcl9fdGl0bGUge1xuICBmbGV4LXNocmluazogMDtcbn1cbi5vdXRsaW5lLW5hdmlnYXRvcl9zdGlja3kgLm91dGxpbmUtbmF2aWdhdG9yX19tYWluLFxuLm91dGxpbmUtbmF2aWdhdG9yX2ZpeGVkIC5vdXRsaW5lLW5hdmlnYXRvcl9fbWFpbiB7XG4gIGZsZXg6IDE7XG4gIG92ZXJmbG93OiBhdXRvO1xufVxuLm91dGxpbmUtbmF2aWdhdG9yX3N0aWNreSB7XG4gIHBvc2l0aW9uOiBzdGlja3k7XG4gIG1heC1oZWlnaHQ6IHZhcigtLW91dGxpbmUtc3RpY2t5LWhlaWdodCk7XG59XG4ub3V0bGluZS1uYXZpZ2F0b3JfZml4ZWQge1xuICBwb3NpdGlvbjogZml4ZWQ7XG4gIG1heC1oZWlnaHQ6IDEwMCU7XG59XG4ub3V0bGluZS1uYXZpZ2F0b3JfaGlkZGVuIHtcbiAgZGlzcGxheTogbm9uZTtcbn1cbi5vdXRsaW5lLW5hdmlnYXRvcl9mb2xkZWQge1xuICB3aWR0aDogMDtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbiIsIkBpbXBvcnQgJy4vdmFyaWFibGVzJztcclxuQGltcG9ydCAnLi9jb2xvcnMnO1xyXG5AaW1wb3J0ICcuL2VsbGlwc2lzJztcclxuXHJcbi5vdXRsaW5lLW5hdmlnYXRvciB7XHJcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xyXG4gIHotaW5kZXg6IDE7XHJcbiAgbWFyZ2luOiAwO1xyXG4gIHdpZHRoOiB2YXIoLS1vdXRsaW5lLW5hdmlnYXRvci13aWR0aCk7XHJcbiAgb3ZlcmZsb3c6IGF1dG87XHJcblxyXG4gICYtcGFyZW50IHtcclxuICAgIHRyYW5zaXRpb246IDAuM3MgZWFzZS1pbi1vdXQ7XHJcbiAgfVxyXG5cclxuICAmX190aXRsZSB7XHJcbiAgICBtYXJnaW46IDAgMTZweDtcclxuICAgIGhlaWdodDogNDBweDtcclxuICAgIGxpbmUtaGVpZ2h0OiA0MHB4O1xyXG4gICAgcGFkZGluZzogMCAxNnB4O1xyXG4gICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIEBwcmltYXJ5X2JvcmRlcl9jb2xvcjtcclxuICAgIGZvbnQtc2l6ZTogMTZweDtcclxuICAgIGZvbnQtd2VpZ2h0OiA0MDA7XHJcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xyXG4gIH1cclxuXHJcbiAgJl9fbWFpbiB7XHJcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XHJcbiAgICB6LWluZGV4OiAxO1xyXG4gICAgbWFyZ2luOiAwO1xyXG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcclxuICB9XHJcblxyXG4gICZfX2xpc3QsXHJcbiAgJl9fc3ViamVjdCxcclxuICAmX19pdGVtIHtcclxuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcclxuICAgIHotaW5kZXg6IDI7XHJcbiAgICBtYXJnaW46IDA7XHJcbiAgICBwYWRkaW5nOiAwO1xyXG4gICAgbGlzdC1zdHlsZS10eXBlOiBub25lO1xyXG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcclxuICB9XHJcblxyXG4gICZfX2xpc3Qge1xyXG4gICAgcGFkZGluZzogMC41ZW0gMDtcclxuICB9XHJcblxyXG4gICZfX3N1YmplY3Qge1xyXG4gICAgcGFkZGluZy1sZWZ0OiAxZW07XHJcbiAgfVxyXG5cclxuICAmX19pdGVtIHtcclxuICAgIG1hcmdpbjogMDtcclxuICAgIGxpbmUtaGVpZ2h0OiAzMHB4O1xyXG4gICAgZm9udC1zaXplOiAxM3B4O1xyXG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcclxuICB9XHJcblxyXG4gICZfX3BsYWNlaG9sZGVyIHtcclxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcclxuICAgIHotaW5kZXg6IDE7XHJcbiAgICB0b3A6IDA7XHJcbiAgICBsZWZ0OiAwO1xyXG4gICAgd2lkdGg6IDEwMCU7XHJcbiAgICBoZWlnaHQ6IDMwcHg7XHJcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAaG92ZXJfYmdfY29sb3I7XHJcbiAgICBib3JkZXItbGVmdDogMnB4IHNvbGlkIEBzdWNjZXNzX2NvbG9yO1xyXG4gICAgdHJhbnNpdGlvbi1kdXJhdGlvbjogMC4ycztcclxuICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XHJcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xyXG4gIH1cclxuXHJcbiAgJl9fYW5jaG9yIHtcclxuICAgIC5lbGxpcHNpcygxKTtcclxuICAgIGRpc3BsYXk6IGJsb2NrO1xyXG4gICAgcGFkZGluZzogMCAxLjVlbTtcclxuXHJcbiAgICAmOmxpbmssXHJcbiAgICAmOnZpc2l0ZWQsXHJcbiAgICAmOmhvdmVyIHtcclxuICAgICAgdGV4dC1kZWNvcmF0aW9uOiBub25lO1xyXG4gICAgICBjb2xvcjogQHNlY29uZGFyeV90ZXh0X2NvbG9yO1xyXG4gICAgfVxyXG5cclxuICAgICY6aG92ZXIge1xyXG4gICAgICBjb2xvcjogQHN1Y2Nlc3NfY29sb3I7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAmX19jb2RlIHtcclxuICAgIHBhZGRpbmctcmlnaHQ6IDAuNWVtO1xyXG4gIH1cclxuXHJcbiAgJl9oaWdobGlnaHQge1xyXG4gICAgJi5vdXRsaW5lLW5hdmlnYXRvcl9fYW5jaG9yIHtcclxuICAgICAgJjpsaW5rLFxyXG4gICAgICAmOnZpc2l0ZWQsXHJcbiAgICAgICY6aG92ZXIge1xyXG4gICAgICAgIGNvbG9yOiBAc3VjY2Vzc19jb2xvcjtcclxuICAgICAgICBmb250LXdlaWdodDogYm9sZDtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgJl9zdGlja3ksXHJcbiAgJl9maXhlZCB7XHJcbiAgICBkaXNwbGF5OiBmbGV4O1xyXG4gICAgZmxleC13cmFwOiBub3dyYXA7XHJcbiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xyXG4gICAgei1pbmRleDogdmFyKC0tb3V0bGluZS16SW5kZXgpO1xyXG4gICAgdG9wOiAwO1xyXG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcclxuXHJcbiAgICAub3V0bGluZS1uYXZpZ2F0b3Ige1xyXG4gICAgICAmX190aXRsZSxcclxuICAgICAgJl9fbWFpbiB7XHJcbiAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcclxuICAgICAgfVxyXG5cclxuICAgICAgJl9fdGl0bGUge1xyXG4gICAgICAgIGZsZXgtc2hyaW5rOiAwO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAmX19tYWluIHtcclxuICAgICAgICBmbGV4OiAxO1xyXG4gICAgICAgIG92ZXJmbG93OiBhdXRvO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAmX3N0aWNreSB7XHJcbiAgICBwb3NpdGlvbjogc3RpY2t5O1xyXG4gICAgbWF4LWhlaWdodDogdmFyKC0tb3V0bGluZS1zdGlja3ktaGVpZ2h0KTtcclxuICB9XHJcblxyXG4gICZfZml4ZWQge1xyXG4gICAgcG9zaXRpb246IGZpeGVkO1xyXG4gICAgbWF4LWhlaWdodDogMTAwJTtcclxuICB9XHJcblxyXG4gICZfaGlkZGVuIHtcclxuICAgIGRpc3BsYXk6IG5vbmU7XHJcbiAgfVxyXG5cclxuICAmX2ZvbGRlZCB7XHJcbiAgICB3aWR0aDogMDtcclxuICAgIG92ZXJmbG93OiBoaWRkZW47XHJcbiAgfVxyXG59XHJcbiIsIi8qKlxyXG4gKiBlbGxpcHNpcy5sZXNzIC0g5paH5pys55yB55WlIG1peGlueCDlh73mlbBcclxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxyXG4gKiBDcmVhdGVkIEJ5OiBZYW9oYWl4aWFvXHJcbiAqIFVwZGF0ZTogMjAyMi4zLjExXHJcbiAqL1xyXG5cclxuLyogPT09PT09IOaWh+acrOecgeeVpeWHveaVsCA9PT09PT0gKi9cclxuLmVsbGlwc2lzIChAbGluZXMpIHdoZW4gKEBsaW5lcz0xKSB7XHJcbiAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcclxuICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpcztcclxuICBvdmVyZmxvdzogaGlkZGVuO1xyXG59XHJcblxyXG4uZWxsaXBzaXMgKEBsaW5lcykgd2hlbiAoQGxpbmVzPj0yKSB7XHJcbiAgLXdlYmtpdC1saW5lLWNsYW1wOiBAbGluZXM7XHJcbiAgZGlzcGxheTogYm94O1xyXG4gIC13ZWJraXQtYm94LW9yaWVudDogdmVydGljYWw7XHJcbiAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7XHJcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcclxufVxyXG4iXX0= */ diff --git a/navigator.min.css b/navigator.min.css deleted file mode 100644 index 6e0ef198..00000000 --- a/navigator.min.css +++ /dev/null @@ -1,2 +0,0 @@ -:root{--outline-zIndex:2000;--outline-sticky-height:100%;--outline-navigator-width:100%}.outline-navigator{position:relative;z-index:1;margin:0;width:var(--outline-navigator-width);overflow:auto}.outline-navigator-parent{-webkit-transition:.3s ease-in-out;transition:.3s ease-in-out}.outline-navigator__title{margin:0 16px;height:40px;line-height:40px;padding:0 16px;border-bottom:1px solid #dcdfe6;font-size:16px;font-weight:400;overflow:hidden}.outline-navigator__main{position:relative;z-index:1;margin:0;overflow:hidden}.outline-navigator__item,.outline-navigator__list,.outline-navigator__subject{position:relative;z-index:2;margin:0;padding:0;list-style-type:none;overflow:hidden}.outline-navigator__list{padding:.5em 0}.outline-navigator__subject{padding-left:1em}.outline-navigator__item{margin:0;line-height:30px;font-size:13px;overflow:hidden}.outline-navigator__placeholder{position:absolute;z-index:1;top:0;left:0;width:100%;height:30px;background-color:#f7f8f9;border-left:2px solid #058942;-webkit-transition-duration:.2s;transition-duration:.2s;-webkit-box-sizing:border-box;box-sizing:border-box;overflow:hidden}.outline-navigator__anchor{white-space:nowrap;text-overflow:ellipsis;overflow:hidden;display:block;padding:0 1.5em}.outline-navigator__anchor:hover,.outline-navigator__anchor:link,.outline-navigator__anchor:visited{text-decoration:none;color:#555}.outline-navigator__anchor:hover{color:#058942}.outline-navigator__code{padding-right:.5em}.outline-navigator_highlight.outline-navigator__anchor:hover,.outline-navigator_highlight.outline-navigator__anchor:link,.outline-navigator_highlight.outline-navigator__anchor:visited{color:#058942;font-weight:700}.outline-navigator_fixed,.outline-navigator_sticky{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;z-index:var(--outline-zIndex);top:0;overflow:hidden}.outline-navigator_fixed .outline-navigator__main,.outline-navigator_fixed .outline-navigator__title,.outline-navigator_sticky .outline-navigator__main,.outline-navigator_sticky .outline-navigator__title{-webkit-box-sizing:border-box;box-sizing:border-box}.outline-navigator_fixed .outline-navigator__title,.outline-navigator_sticky .outline-navigator__title{-ms-flex-negative:0;flex-shrink:0}.outline-navigator_fixed .outline-navigator__main,.outline-navigator_sticky .outline-navigator__main{-webkit-box-flex:1;-ms-flex:1;flex:1;overflow:auto}.outline-navigator_sticky{position:sticky;max-height:var(--outline-sticky-height)}.outline-navigator_fixed{position:fixed;max-height:100%}.outline-navigator_hidden{display:none}.outline-navigator_folded{width:0;overflow:hidden} -/*# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlcyI6WyJuYXZpZ2F0b3IuY3NzIl0sInNvdXJjZXNDb250ZW50IjpbIjpyb290IHtcbiAgLS1vdXRsaW5lLXpJbmRleDogMjAwMDtcbiAgLS1vdXRsaW5lLXN0aWNreS1oZWlnaHQ6IDEwMCU7XG4gIC0tb3V0bGluZS1uYXZpZ2F0b3Itd2lkdGg6IDEwMCU7XG59XG4vKiA9PT09PT09PT09IGNvbG9ycy50aGVtZSAtIOWfuuehgOminOiJsuWPmOmHj+mbhuWQiCA9PT09PT09PT09ICovXG4vKipcbiAqIGVsbGlwc2lzLmxlc3MgLSDmlofmnKznnIHnlaUgbWl4aW54IOWHveaVsFxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogQ3JlYXRlZCBCeTogWWFvaGFpeGlhb1xuICogVXBkYXRlOiAyMDIyLjMuMTFcbiAqL1xuLyogPT09PT09IOaWh+acrOecgeeVpeWHveaVsCA9PT09PT0gKi9cbi5vdXRsaW5lLW5hdmlnYXRvciB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgei1pbmRleDogMTtcbiAgbWFyZ2luOiAwO1xuICB3aWR0aDogdmFyKC0tb3V0bGluZS1uYXZpZ2F0b3Itd2lkdGgpO1xuICBvdmVyZmxvdzogYXV0bztcbn1cbi5vdXRsaW5lLW5hdmlnYXRvci1wYXJlbnQge1xuICAtd2Via2l0LXRyYW5zaXRpb246IDAuM3MgZWFzZS1pbi1vdXQ7XG4gIHRyYW5zaXRpb246IDAuM3MgZWFzZS1pbi1vdXQ7XG59XG4ub3V0bGluZS1uYXZpZ2F0b3JfX3RpdGxlIHtcbiAgbWFyZ2luOiAwIDE2cHg7XG4gIGhlaWdodDogNDBweDtcbiAgbGluZS1oZWlnaHQ6IDQwcHg7XG4gIHBhZGRpbmc6IDAgMTZweDtcbiAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNkY2RmZTY7XG4gIGZvbnQtc2l6ZTogMTZweDtcbiAgZm9udC13ZWlnaHQ6IDQwMDtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi5vdXRsaW5lLW5hdmlnYXRvcl9fbWFpbiB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgei1pbmRleDogMTtcbiAgbWFyZ2luOiAwO1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLm91dGxpbmUtbmF2aWdhdG9yX19saXN0LFxuLm91dGxpbmUtbmF2aWdhdG9yX19zdWJqZWN0LFxuLm91dGxpbmUtbmF2aWdhdG9yX19pdGVtIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICB6LWluZGV4OiAyO1xuICBtYXJnaW46IDA7XG4gIHBhZGRpbmc6IDA7XG4gIGxpc3Qtc3R5bGUtdHlwZTogbm9uZTtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi5vdXRsaW5lLW5hdmlnYXRvcl9fbGlzdCB7XG4gIHBhZGRpbmc6IDAuNWVtIDA7XG59XG4ub3V0bGluZS1uYXZpZ2F0b3JfX3N1YmplY3Qge1xuICBwYWRkaW5nLWxlZnQ6IDFlbTtcbn1cbi5vdXRsaW5lLW5hdmlnYXRvcl9faXRlbSB7XG4gIG1hcmdpbjogMDtcbiAgbGluZS1oZWlnaHQ6IDMwcHg7XG4gIGZvbnQtc2l6ZTogMTNweDtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi5vdXRsaW5lLW5hdmlnYXRvcl9fcGxhY2Vob2xkZXIge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHotaW5kZXg6IDE7XG4gIHRvcDogMDtcbiAgbGVmdDogMDtcbiAgd2lkdGg6IDEwMCU7XG4gIGhlaWdodDogMzBweDtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2Y3ZjhmOTtcbiAgYm9yZGVyLWxlZnQ6IDJweCBzb2xpZCAjMDU4OTQyO1xuICAtd2Via2l0LXRyYW5zaXRpb24tZHVyYXRpb246IDAuMnM7XG4gICAgICAgICAgdHJhbnNpdGlvbi1kdXJhdGlvbjogMC4ycztcbiAgLXdlYmtpdC1ib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4ub3V0bGluZS1uYXZpZ2F0b3JfX2FuY2hvciB7XG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzO1xuICBvdmVyZmxvdzogaGlkZGVuO1xuICBkaXNwbGF5OiBibG9jaztcbiAgcGFkZGluZzogMCAxLjVlbTtcbn1cbi5vdXRsaW5lLW5hdmlnYXRvcl9fYW5jaG9yOmxpbmssXG4ub3V0bGluZS1uYXZpZ2F0b3JfX2FuY2hvcjp2aXNpdGVkLFxuLm91dGxpbmUtbmF2aWdhdG9yX19hbmNob3I6aG92ZXIge1xuICB0ZXh0LWRlY29yYXRpb246IG5vbmU7XG4gIGNvbG9yOiAjNTU1O1xufVxuLm91dGxpbmUtbmF2aWdhdG9yX19hbmNob3I6aG92ZXIge1xuICBjb2xvcjogIzA1ODk0Mjtcbn1cbi5vdXRsaW5lLW5hdmlnYXRvcl9fY29kZSB7XG4gIHBhZGRpbmctcmlnaHQ6IDAuNWVtO1xufVxuLm91dGxpbmUtbmF2aWdhdG9yX2hpZ2hsaWdodC5vdXRsaW5lLW5hdmlnYXRvcl9fYW5jaG9yOmxpbmssXG4ub3V0bGluZS1uYXZpZ2F0b3JfaGlnaGxpZ2h0Lm91dGxpbmUtbmF2aWdhdG9yX19hbmNob3I6dmlzaXRlZCxcbi5vdXRsaW5lLW5hdmlnYXRvcl9oaWdobGlnaHQub3V0bGluZS1uYXZpZ2F0b3JfX2FuY2hvcjpob3ZlciB7XG4gIGNvbG9yOiAjMDU4OTQyO1xuICBmb250LXdlaWdodDogYm9sZDtcbn1cbi5vdXRsaW5lLW5hdmlnYXRvcl9zdGlja3ksXG4ub3V0bGluZS1uYXZpZ2F0b3JfZml4ZWQge1xuICBkaXNwbGF5OiAtd2Via2l0LWJveDtcbiAgZGlzcGxheTogLW1zLWZsZXhib3g7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIC1tcy1mbGV4LXdyYXA6IG5vd3JhcDtcbiAgICAgIGZsZXgtd3JhcDogbm93cmFwO1xuICAtd2Via2l0LWJveC1vcmllbnQ6IHZlcnRpY2FsO1xuICAtd2Via2l0LWJveC1kaXJlY3Rpb246IG5vcm1hbDtcbiAgICAgIC1tcy1mbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gIHotaW5kZXg6IHZhcigtLW91dGxpbmUtekluZGV4KTtcbiAgdG9wOiAwO1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLm91dGxpbmUtbmF2aWdhdG9yX3N0aWNreSAub3V0bGluZS1uYXZpZ2F0b3JfX3RpdGxlLFxuLm91dGxpbmUtbmF2aWdhdG9yX2ZpeGVkIC5vdXRsaW5lLW5hdmlnYXRvcl9fdGl0bGUsXG4ub3V0bGluZS1uYXZpZ2F0b3Jfc3RpY2t5IC5vdXRsaW5lLW5hdmlnYXRvcl9fbWFpbixcbi5vdXRsaW5lLW5hdmlnYXRvcl9maXhlZCAub3V0bGluZS1uYXZpZ2F0b3JfX21haW4ge1xuICAtd2Via2l0LWJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbn1cbi5vdXRsaW5lLW5hdmlnYXRvcl9zdGlja3kgLm91dGxpbmUtbmF2aWdhdG9yX190aXRsZSxcbi5vdXRsaW5lLW5hdmlnYXRvcl9maXhlZCAub3V0bGluZS1uYXZpZ2F0b3JfX3RpdGxlIHtcbiAgLW1zLWZsZXgtbmVnYXRpdmU6IDA7XG4gICAgICBmbGV4LXNocmluazogMDtcbn1cbi5vdXRsaW5lLW5hdmlnYXRvcl9zdGlja3kgLm91dGxpbmUtbmF2aWdhdG9yX19tYWluLFxuLm91dGxpbmUtbmF2aWdhdG9yX2ZpeGVkIC5vdXRsaW5lLW5hdmlnYXRvcl9fbWFpbiB7XG4gIC13ZWJraXQtYm94LWZsZXg6IDE7XG4gICAgICAtbXMtZmxleDogMTtcbiAgICAgICAgICBmbGV4OiAxO1xuICBvdmVyZmxvdzogYXV0bztcbn1cbi5vdXRsaW5lLW5hdmlnYXRvcl9zdGlja3kge1xuICBwb3NpdGlvbjogc3RpY2t5O1xuICBtYXgtaGVpZ2h0OiB2YXIoLS1vdXRsaW5lLXN0aWNreS1oZWlnaHQpO1xufVxuLm91dGxpbmUtbmF2aWdhdG9yX2ZpeGVkIHtcbiAgcG9zaXRpb246IGZpeGVkO1xuICBtYXgtaGVpZ2h0OiAxMDAlO1xufVxuLm91dGxpbmUtbmF2aWdhdG9yX2hpZGRlbiB7XG4gIGRpc3BsYXk6IG5vbmU7XG59XG4ub3V0bGluZS1uYXZpZ2F0b3JfZm9sZGVkIHtcbiAgd2lkdGg6IDA7XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG5cbi8qIyBzb3VyY2VNYXBwaW5nVVJMPWRhdGE6YXBwbGljYXRpb24vanNvbjtjaGFyc2V0PXV0Zjg7YmFzZTY0LGV5SjJaWEp6YVc5dUlqb3pMQ0p6YjNWeVkyVnpJanBiSW5aaGNtbGhZbXhsY3k1c1pYTnpJaXdpTGk0dlBHbHVjSFYwSUdOemN5QXlQaUlzSW01aGRtbG5ZWFJ2Y2k1c1pYTnpJaXdpWld4c2FYQnphWE11YkdWemN5SmRMQ0p1WVcxbGN5STZXMTBzSW0xaGNIQnBibWR6SWpvaVFVRkJRVHRGUVVORkxIVkNRVUZCTzBWQlEwRXNPRUpCUVVFN1JVRkRRU3huUTBGQlFUdERRME5FTzBGQlEwUXNiVVJCUVcxRU8wRkJRMjVFT3pzN096dEhRVXRITzBGQlEwZ3NNRUpCUVRCQ08wRkRVakZDTzBWQlEwVXNiVUpCUVVFN1JVRkRRU3hYUVVGQk8wVkJRMEVzVlVGQlFUdEZRVU5CTEhORFFVRkJPMFZCUTBFc1pVRkJRVHREUkZWRU8wRkRVa003UlVGRFJTeHhRMEZCUVR0RlFVRkJMRFpDUVVGQk8wTkVWVWc3UVVOUVF6dEZRVU5GTEdWQlFVRTdSVUZEUVN4aFFVRkJPMFZCUTBFc2EwSkJRVUU3UlVGRFFTeG5Ra0ZCUVR0RlFVTkJMR2xEUVVGQk8wVkJRMEVzWjBKQlFVRTdSVUZEUVN4cFFrRkJRVHRGUVVOQkxHbENRVUZCTzBORVUwZzdRVU5PUXp0RlFVTkZMRzFDUVVGQk8wVkJRMEVzVjBGQlFUdEZRVU5CTEZWQlFVRTdSVUZEUVN4cFFrRkJRVHREUkZGSU8wRkRURU03T3p0RlFVZEZMRzFDUVVGQk8wVkJRMEVzVjBGQlFUdEZRVU5CTEZWQlFVRTdSVUZEUVN4WFFVRkJPMFZCUTBFc2MwSkJRVUU3UlVGRFFTeHBRa0ZCUVR0RFJFOUlPMEZEU2tNN1JVRkRSU3hwUWtGQlFUdERSRTFJTzBGRFNFTTdSVUZEUlN4clFrRkJRVHREUkV0SU8wRkRSa003UlVGRFJTeFZRVUZCTzBWQlEwRXNhMEpCUVVFN1JVRkRRU3huUWtGQlFUdEZRVU5CTEdsQ1FVRkJPME5FU1VnN1FVTkVRenRGUVVORkxHMUNRVUZCTzBWQlEwRXNWMEZCUVR0RlFVTkJMRTlCUVVFN1JVRkRRU3hSUVVGQk8wVkJRMEVzV1VGQlFUdEZRVU5CTEdGQlFVRTdSVUZEUVN3d1FrRkJRVHRGUVVOQkxDdENRVUZCTzBWQlEwRXNhME5CUVVFN1ZVRkJRU3d3UWtGQlFUdEZRVU5CTEN0Q1FVRkJPMVZCUVVFc2RVSkJRVUU3UlVGRFFTeHBRa0ZCUVR0RFJFZElPMEZEUVVNN1JVTm9SVUVzYjBKQlFVRTdSVUZEUVN4M1FrRkJRVHRGUVVOQkxHbENRVUZCTzBWRVowVkZMR1ZCUVVFN1JVRkRRU3hwUWtGQlFUdERSRWxJTzBGRFJrYzdPenRGUVVkRkxITkNRVUZCTzBWQlEwRXNXVUZCUVR0RFJFbE1PMEZEUkVjN1JVRkRSU3hsUVVGQk8wTkVSMHc3UVVORFF6dEZRVU5GTEhGQ1FVRkJPME5FUTBnN1FVTkpTenM3TzBWQlIwVXNaVUZCUVR0RlFVTkJMR3RDUVVGQk8wTkVSbEE3UVVOUFF6czdSVUZGUlN4eFFrRkJRVHRGUVVGQkxIRkNRVUZCTzBWQlFVRXNZMEZCUVR0RlFVTkJMSE5DUVVGQk8wMUJRVUVzYTBKQlFVRTdSVUZEUVN3MlFrRkJRVHRGUVVGQkxEaENRVUZCTzAxQlFVRXNNa0pCUVVFN1ZVRkJRU3gxUWtGQlFUdEZRVU5CTEN0Q1FVRkJPMFZCUTBFc1QwRkJRVHRGUVVOQkxHbENRVUZCTzBORVRFZzdRVU5SU3pzN096dEZRVVZGTEN0Q1FVRkJPMVZCUVVFc2RVSkJRVUU3UTBSS1VEdEJRMDlMT3p0RlFVTkZMSEZDUVVGQk8wMUJRVUVzWlVGQlFUdERSRXBRTzBGRFQwczdPMFZCUTBVc2IwSkJRVUU3VFVGQlFTeFpRVUZCTzFWQlFVRXNVVUZCUVR0RlFVTkJMR1ZCUVVFN1EwUktVRHRCUTFORE8wVkJRMFVzYVVKQlFVRTdSVUZEUVN4NVEwRkJRVHREUkZCSU8wRkRWVU03UlVGRFJTeG5Ra0ZCUVR0RlFVTkJMR2xDUVVGQk8wTkVVa2c3UVVOWFF6dEZRVU5GTEdOQlFVRTdRMFJVU0R0QlExbERPMFZCUTBVc1UwRkJRVHRGUVVOQkxHbENRVUZCTzBORVZrZ2lMQ0ptYVd4bElqb2libUYyYVdkaGRHOXlMbU56Y3lJc0luTnZkWEpqWlhORGIyNTBaVzUwSWpwYklqcHliMjkwSUh0Y2NseHVJQ0F0TFc5MWRHeHBibVV0ZWtsdVpHVjRPaUF5TURBd08xeHlYRzRnSUMwdGIzVjBiR2x1WlMxemRHbGphM2t0YUdWcFoyaDBPaUF4TURBbE8xeHlYRzRnSUMwdGIzVjBiR2x1WlMxdVlYWnBaMkYwYjNJdGQybGtkR2c2SURFd01DVTdYSEpjYm4xY2NseHVJaXdpT25KdmIzUWdlMXh1SUNBdExXOTFkR3hwYm1VdGVrbHVaR1Y0T2lBeU1EQXdPMXh1SUNBdExXOTFkR3hwYm1VdGMzUnBZMnQ1TFdobGFXZG9kRG9nTVRBd0pUdGNiaUFnTFMxdmRYUnNhVzVsTFc1aGRtbG5ZWFJ2Y2kxM2FXUjBhRG9nTVRBd0pUdGNibjFjYmk4cUlEMDlQVDA5UFQwOVBUMGdZMjlzYjNKekxuUm9aVzFsSUMwZzVaKzY1NkdBNmFLYzZJbXk1WStZNlllUDZadUc1WkNJSUQwOVBUMDlQVDA5UFQwZ0tpOWNiaThxS2x4dUlDb2daV3hzYVhCemFYTXViR1Z6Y3lBdElPYVdoK2Fjck9lY2dlZVZwU0J0YVhocGJuZ2c1WWU5NXBXd1hHNGdLaUE5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlYRzRnS2lCRGNtVmhkR1ZrSUVKNU9pQlpZVzlvWVdsNGFXRnZYRzRnS2lCVmNHUmhkR1U2SURJd01qSXVNeTR4TVZ4dUlDb3ZYRzR2S2lBOVBUMDlQVDBnNXBhSDVweXM1NXlCNTVXbDVZZTk1cFd3SUQwOVBUMDlQU0FxTDF4dUxtOTFkR3hwYm1VdGJtRjJhV2RoZEc5eUlIdGNiaUFnY0c5emFYUnBiMjQ2SUhKbGJHRjBhWFpsTzF4dUlDQjZMV2x1WkdWNE9pQXhPMXh1SUNCdFlYSm5hVzQ2SURBN1hHNGdJSGRwWkhSb09pQjJZWElvTFMxdmRYUnNhVzVsTFc1aGRtbG5ZWFJ2Y2kxM2FXUjBhQ2s3WEc0Z0lHOTJaWEptYkc5M09pQmhkWFJ2TzF4dWZWeHVMbTkxZEd4cGJtVXRibUYyYVdkaGRHOXlMWEJoY21WdWRDQjdYRzRnSUhSeVlXNXphWFJwYjI0NklEQXVNM01nWldGelpTMXBiaTF2ZFhRN1hHNTlYRzR1YjNWMGJHbHVaUzF1WVhacFoyRjBiM0pmWDNScGRHeGxJSHRjYmlBZ2JXRnlaMmx1T2lBd0lERTJjSGc3WEc0Z0lHaGxhV2RvZERvZ05EQndlRHRjYmlBZ2JHbHVaUzFvWldsbmFIUTZJRFF3Y0hnN1hHNGdJSEJoWkdScGJtYzZJREFnTVRad2VEdGNiaUFnWW05eVpHVnlMV0p2ZEhSdmJUb2dNWEI0SUhOdmJHbGtJQ05rWTJSbVpUWTdYRzRnSUdadmJuUXRjMmw2WlRvZ01UWndlRHRjYmlBZ1ptOXVkQzEzWldsbmFIUTZJRFF3TUR0Y2JpQWdiM1psY21ac2IzYzZJR2hwWkdSbGJqdGNibjFjYmk1dmRYUnNhVzVsTFc1aGRtbG5ZWFJ2Y2w5ZmJXRnBiaUI3WEc0Z0lIQnZjMmwwYVc5dU9pQnlaV3hoZEdsMlpUdGNiaUFnZWkxcGJtUmxlRG9nTVR0Y2JpQWdiV0Z5WjJsdU9pQXdPMXh1SUNCdmRtVnlabXh2ZHpvZ2FHbGtaR1Z1TzF4dWZWeHVMbTkxZEd4cGJtVXRibUYyYVdkaGRHOXlYMTlzYVhOMExGeHVMbTkxZEd4cGJtVXRibUYyYVdkaGRHOXlYMTl6ZFdKcVpXTjBMRnh1TG05MWRHeHBibVV0Ym1GMmFXZGhkRzl5WDE5cGRHVnRJSHRjYmlBZ2NHOXphWFJwYjI0NklISmxiR0YwYVhabE8xeHVJQ0I2TFdsdVpHVjRPaUF5TzF4dUlDQnRZWEpuYVc0NklEQTdYRzRnSUhCaFpHUnBibWM2SURBN1hHNGdJR3hwYzNRdGMzUjViR1V0ZEhsd1pUb2dibTl1WlR0Y2JpQWdiM1psY21ac2IzYzZJR2hwWkdSbGJqdGNibjFjYmk1dmRYUnNhVzVsTFc1aGRtbG5ZWFJ2Y2w5ZmJHbHpkQ0I3WEc0Z0lIQmhaR1JwYm1jNklEQXVOV1Z0SURBN1hHNTlYRzR1YjNWMGJHbHVaUzF1WVhacFoyRjBiM0pmWDNOMVltcGxZM1FnZTF4dUlDQndZV1JrYVc1bkxXeGxablE2SURGbGJUdGNibjFjYmk1dmRYUnNhVzVsTFc1aGRtbG5ZWFJ2Y2w5ZmFYUmxiU0I3WEc0Z0lHMWhjbWRwYmpvZ01EdGNiaUFnYkdsdVpTMW9aV2xuYUhRNklETXdjSGc3WEc0Z0lHWnZiblF0YzJsNlpUb2dNVE53ZUR0Y2JpQWdiM1psY21ac2IzYzZJR2hwWkdSbGJqdGNibjFjYmk1dmRYUnNhVzVsTFc1aGRtbG5ZWFJ2Y2w5ZmNHeGhZMlZvYjJ4a1pYSWdlMXh1SUNCd2IzTnBkR2x2YmpvZ1lXSnpiMngxZEdVN1hHNGdJSG90YVc1a1pYZzZJREU3WEc0Z0lIUnZjRG9nTUR0Y2JpQWdiR1ZtZERvZ01EdGNiaUFnZDJsa2RHZzZJREV3TUNVN1hHNGdJR2hsYVdkb2REb2dNekJ3ZUR0Y2JpQWdZbUZqYTJkeWIzVnVaQzFqYjJ4dmNqb2dJMlkzWmpobU9UdGNiaUFnWW05eVpHVnlMV3hsWm5RNklESndlQ0J6YjJ4cFpDQWpNRFU0T1RReU8xeHVJQ0IwY21GdWMybDBhVzl1TFdSMWNtRjBhVzl1T2lBd0xqSnpPMXh1SUNCaWIzZ3RjMmw2YVc1bk9pQmliM0prWlhJdFltOTRPMXh1SUNCdmRtVnlabXh2ZHpvZ2FHbGtaR1Z1TzF4dWZWeHVMbTkxZEd4cGJtVXRibUYyYVdkaGRHOXlYMTloYm1Ob2IzSWdlMXh1SUNCM2FHbDBaUzF6Y0dGalpUb2dibTkzY21Gd08xeHVJQ0IwWlhoMExXOTJaWEptYkc5M09pQmxiR3hwY0hOcGN6dGNiaUFnYjNabGNtWnNiM2M2SUdocFpHUmxianRjYmlBZ1pHbHpjR3hoZVRvZ1lteHZZMnM3WEc0Z0lIQmhaR1JwYm1jNklEQWdNUzQxWlcwN1hHNTlYRzR1YjNWMGJHbHVaUzF1WVhacFoyRjBiM0pmWDJGdVkyaHZjanBzYVc1ckxGeHVMbTkxZEd4cGJtVXRibUYyYVdkaGRHOXlYMTloYm1Ob2IzSTZkbWx6YVhSbFpDeGNiaTV2ZFhSc2FXNWxMVzVoZG1sbllYUnZjbDlmWVc1amFHOXlPbWh2ZG1WeUlIdGNiaUFnZEdWNGRDMWtaV052Y21GMGFXOXVPaUJ1YjI1bE8xeHVJQ0JqYjJ4dmNqb2dJelUxTlR0Y2JuMWNiaTV2ZFhSc2FXNWxMVzVoZG1sbllYUnZjbDlmWVc1amFHOXlPbWh2ZG1WeUlIdGNiaUFnWTI5c2IzSTZJQ013TlRnNU5ESTdYRzU5WEc0dWIzVjBiR2x1WlMxdVlYWnBaMkYwYjNKZlgyTnZaR1VnZTF4dUlDQndZV1JrYVc1bkxYSnBaMmgwT2lBd0xqVmxiVHRjYm4xY2JpNXZkWFJzYVc1bExXNWhkbWxuWVhSdmNsOW9hV2RvYkdsbmFIUXViM1YwYkdsdVpTMXVZWFpwWjJGMGIzSmZYMkZ1WTJodmNqcHNhVzVyTEZ4dUxtOTFkR3hwYm1VdGJtRjJhV2RoZEc5eVgyaHBaMmhzYVdkb2RDNXZkWFJzYVc1bExXNWhkbWxuWVhSdmNsOWZZVzVqYUc5eU9uWnBjMmwwWldRc1hHNHViM1YwYkdsdVpTMXVZWFpwWjJGMGIzSmZhR2xuYUd4cFoyaDBMbTkxZEd4cGJtVXRibUYyYVdkaGRHOXlYMTloYm1Ob2IzSTZhRzkyWlhJZ2UxeHVJQ0JqYjJ4dmNqb2dJekExT0RrME1qdGNiaUFnWm05dWRDMTNaV2xuYUhRNklHSnZiR1E3WEc1OVhHNHViM1YwYkdsdVpTMXVZWFpwWjJGMGIzSmZjM1JwWTJ0NUxGeHVMbTkxZEd4cGJtVXRibUYyYVdkaGRHOXlYMlpwZUdWa0lIdGNiaUFnWkdsemNHeGhlVG9nWm14bGVEdGNiaUFnWm14bGVDMTNjbUZ3T2lCdWIzZHlZWEE3WEc0Z0lHWnNaWGd0WkdseVpXTjBhVzl1T2lCamIyeDFiVzQ3WEc0Z0lIb3RhVzVrWlhnNklIWmhjaWd0TFc5MWRHeHBibVV0ZWtsdVpHVjRLVHRjYmlBZ2RHOXdPaUF3TzF4dUlDQnZkbVZ5Wm14dmR6b2dhR2xrWkdWdU8xeHVmVnh1TG05MWRHeHBibVV0Ym1GMmFXZGhkRzl5WDNOMGFXTnJlU0F1YjNWMGJHbHVaUzF1WVhacFoyRjBiM0pmWDNScGRHeGxMRnh1TG05MWRHeHBibVV0Ym1GMmFXZGhkRzl5WDJacGVHVmtJQzV2ZFhSc2FXNWxMVzVoZG1sbllYUnZjbDlmZEdsMGJHVXNYRzR1YjNWMGJHbHVaUzF1WVhacFoyRjBiM0pmYzNScFkydDVJQzV2ZFhSc2FXNWxMVzVoZG1sbllYUnZjbDlmYldGcGJpeGNiaTV2ZFhSc2FXNWxMVzVoZG1sbllYUnZjbDltYVhobFpDQXViM1YwYkdsdVpTMXVZWFpwWjJGMGIzSmZYMjFoYVc0Z2UxeHVJQ0JpYjNndGMybDZhVzVuT2lCaWIzSmtaWEl0WW05NE8xeHVmVnh1TG05MWRHeHBibVV0Ym1GMmFXZGhkRzl5WDNOMGFXTnJlU0F1YjNWMGJHbHVaUzF1WVhacFoyRjBiM0pmWDNScGRHeGxMRnh1TG05MWRHeHBibVV0Ym1GMmFXZGhkRzl5WDJacGVHVmtJQzV2ZFhSc2FXNWxMVzVoZG1sbllYUnZjbDlmZEdsMGJHVWdlMXh1SUNCbWJHVjRMWE5vY21sdWF6b2dNRHRjYm4xY2JpNXZkWFJzYVc1bExXNWhkbWxuWVhSdmNsOXpkR2xqYTNrZ0xtOTFkR3hwYm1VdGJtRjJhV2RoZEc5eVgxOXRZV2x1TEZ4dUxtOTFkR3hwYm1VdGJtRjJhV2RoZEc5eVgyWnBlR1ZrSUM1dmRYUnNhVzVsTFc1aGRtbG5ZWFJ2Y2w5ZmJXRnBiaUI3WEc0Z0lHWnNaWGc2SURFN1hHNGdJRzkyWlhKbWJHOTNPaUJoZFhSdk8xeHVmVnh1TG05MWRHeHBibVV0Ym1GMmFXZGhkRzl5WDNOMGFXTnJlU0I3WEc0Z0lIQnZjMmwwYVc5dU9pQnpkR2xqYTNrN1hHNGdJRzFoZUMxb1pXbG5hSFE2SUhaaGNpZ3RMVzkxZEd4cGJtVXRjM1JwWTJ0NUxXaGxhV2RvZENrN1hHNTlYRzR1YjNWMGJHbHVaUzF1WVhacFoyRjBiM0pmWm1sNFpXUWdlMXh1SUNCd2IzTnBkR2x2YmpvZ1ptbDRaV1E3WEc0Z0lHMWhlQzFvWldsbmFIUTZJREV3TUNVN1hHNTlYRzR1YjNWMGJHbHVaUzF1WVhacFoyRjBiM0pmYUdsa1pHVnVJSHRjYmlBZ1pHbHpjR3hoZVRvZ2JtOXVaVHRjYm4xY2JpNXZkWFJzYVc1bExXNWhkbWxuWVhSdmNsOW1iMnhrWldRZ2UxeHVJQ0IzYVdSMGFEb2dNRHRjYmlBZ2IzWmxjbVpzYjNjNklHaHBaR1JsYmp0Y2JuMWNiaUlzSWtCcGJYQnZjblFnSnk0dmRtRnlhV0ZpYkdWekp6dGNjbHh1UUdsdGNHOXlkQ0FuTGk5amIyeHZjbk1uTzF4eVhHNUFhVzF3YjNKMElDY3VMMlZzYkdsd2MybHpKenRjY2x4dVhISmNiaTV2ZFhSc2FXNWxMVzVoZG1sbllYUnZjaUI3WEhKY2JpQWdjRzl6YVhScGIyNDZJSEpsYkdGMGFYWmxPMXh5WEc0Z0lIb3RhVzVrWlhnNklERTdYSEpjYmlBZ2JXRnlaMmx1T2lBd08xeHlYRzRnSUhkcFpIUm9PaUIyWVhJb0xTMXZkWFJzYVc1bExXNWhkbWxuWVhSdmNpMTNhV1IwYUNrN1hISmNiaUFnYjNabGNtWnNiM2M2SUdGMWRHODdYSEpjYmx4eVhHNGdJQ1l0Y0dGeVpXNTBJSHRjY2x4dUlDQWdJSFJ5WVc1emFYUnBiMjQ2SURBdU0zTWdaV0Z6WlMxcGJpMXZkWFE3WEhKY2JpQWdmVnh5WEc1Y2NseHVJQ0FtWDE5MGFYUnNaU0I3WEhKY2JpQWdJQ0J0WVhKbmFXNDZJREFnTVRad2VEdGNjbHh1SUNBZ0lHaGxhV2RvZERvZ05EQndlRHRjY2x4dUlDQWdJR3hwYm1VdGFHVnBaMmgwT2lBME1IQjRPMXh5WEc0Z0lDQWdjR0ZrWkdsdVp6b2dNQ0F4Tm5CNE8xeHlYRzRnSUNBZ1ltOXlaR1Z5TFdKdmRIUnZiVG9nTVhCNElITnZiR2xrSUVCd2NtbHRZWEo1WDJKdmNtUmxjbDlqYjJ4dmNqdGNjbHh1SUNBZ0lHWnZiblF0YzJsNlpUb2dNVFp3ZUR0Y2NseHVJQ0FnSUdadmJuUXRkMlZwWjJoME9pQTBNREE3WEhKY2JpQWdJQ0J2ZG1WeVpteHZkem9nYUdsa1pHVnVPMXh5WEc0Z0lIMWNjbHh1WEhKY2JpQWdKbDlmYldGcGJpQjdYSEpjYmlBZ0lDQndiM05wZEdsdmJqb2djbVZzWVhScGRtVTdYSEpjYmlBZ0lDQjZMV2x1WkdWNE9pQXhPMXh5WEc0Z0lDQWdiV0Z5WjJsdU9pQXdPMXh5WEc0Z0lDQWdiM1psY21ac2IzYzZJR2hwWkdSbGJqdGNjbHh1SUNCOVhISmNibHh5WEc0Z0lDWmZYMnhwYzNRc1hISmNiaUFnSmw5ZmMzVmlhbVZqZEN4Y2NseHVJQ0FtWDE5cGRHVnRJSHRjY2x4dUlDQWdJSEJ2YzJsMGFXOXVPaUJ5Wld4aGRHbDJaVHRjY2x4dUlDQWdJSG90YVc1a1pYZzZJREk3WEhKY2JpQWdJQ0J0WVhKbmFXNDZJREE3WEhKY2JpQWdJQ0J3WVdSa2FXNW5PaUF3TzF4eVhHNGdJQ0FnYkdsemRDMXpkSGxzWlMxMGVYQmxPaUJ1YjI1bE8xeHlYRzRnSUNBZ2IzWmxjbVpzYjNjNklHaHBaR1JsYmp0Y2NseHVJQ0I5WEhKY2JseHlYRzRnSUNaZlgyeHBjM1FnZTF4eVhHNGdJQ0FnY0dGa1pHbHVaem9nTUM0MVpXMGdNRHRjY2x4dUlDQjlYSEpjYmx4eVhHNGdJQ1pmWDNOMVltcGxZM1FnZTF4eVhHNGdJQ0FnY0dGa1pHbHVaeTFzWldaME9pQXhaVzA3WEhKY2JpQWdmVnh5WEc1Y2NseHVJQ0FtWDE5cGRHVnRJSHRjY2x4dUlDQWdJRzFoY21kcGJqb2dNRHRjY2x4dUlDQWdJR3hwYm1VdGFHVnBaMmgwT2lBek1IQjRPMXh5WEc0Z0lDQWdabTl1ZEMxemFYcGxPaUF4TTNCNE8xeHlYRzRnSUNBZ2IzWmxjbVpzYjNjNklHaHBaR1JsYmp0Y2NseHVJQ0I5WEhKY2JseHlYRzRnSUNaZlgzQnNZV05sYUc5c1pHVnlJSHRjY2x4dUlDQWdJSEJ2YzJsMGFXOXVPaUJoWW5OdmJIVjBaVHRjY2x4dUlDQWdJSG90YVc1a1pYZzZJREU3WEhKY2JpQWdJQ0IwYjNBNklEQTdYSEpjYmlBZ0lDQnNaV1owT2lBd08xeHlYRzRnSUNBZ2QybGtkR2c2SURFd01DVTdYSEpjYmlBZ0lDQm9aV2xuYUhRNklETXdjSGc3WEhKY2JpQWdJQ0JpWVdOclozSnZkVzVrTFdOdmJHOXlPaUJBYUc5MlpYSmZZbWRmWTI5c2IzSTdYSEpjYmlBZ0lDQmliM0prWlhJdGJHVm1kRG9nTW5CNElITnZiR2xrSUVCemRXTmpaWE56WDJOdmJHOXlPMXh5WEc0Z0lDQWdkSEpoYm5OcGRHbHZiaTFrZFhKaGRHbHZiam9nTUM0eWN6dGNjbHh1SUNBZ0lHSnZlQzF6YVhwcGJtYzZJR0p2Y21SbGNpMWliM2c3WEhKY2JpQWdJQ0J2ZG1WeVpteHZkem9nYUdsa1pHVnVPMXh5WEc0Z0lIMWNjbHh1WEhKY2JpQWdKbDlmWVc1amFHOXlJSHRjY2x4dUlDQWdJQzVsYkd4cGNITnBjeWd4S1R0Y2NseHVJQ0FnSUdScGMzQnNZWGs2SUdKc2IyTnJPMXh5WEc0Z0lDQWdjR0ZrWkdsdVp6b2dNQ0F4TGpWbGJUdGNjbHh1WEhKY2JpQWdJQ0FtT214cGJtc3NYSEpjYmlBZ0lDQW1PblpwYzJsMFpXUXNYSEpjYmlBZ0lDQW1PbWh2ZG1WeUlIdGNjbHh1SUNBZ0lDQWdkR1Y0ZEMxa1pXTnZjbUYwYVc5dU9pQnViMjVsTzF4eVhHNGdJQ0FnSUNCamIyeHZjam9nUUhObFkyOXVaR0Z5ZVY5MFpYaDBYMk52Ykc5eU8xeHlYRzRnSUNBZ2ZWeHlYRzVjY2x4dUlDQWdJQ1k2YUc5MlpYSWdlMXh5WEc0Z0lDQWdJQ0JqYjJ4dmNqb2dRSE4xWTJObGMzTmZZMjlzYjNJN1hISmNiaUFnSUNCOVhISmNiaUFnZlZ4eVhHNWNjbHh1SUNBbVgxOWpiMlJsSUh0Y2NseHVJQ0FnSUhCaFpHUnBibWN0Y21sbmFIUTZJREF1TldWdE8xeHlYRzRnSUgxY2NseHVYSEpjYmlBZ0psOW9hV2RvYkdsbmFIUWdlMXh5WEc0Z0lDQWdKaTV2ZFhSc2FXNWxMVzVoZG1sbllYUnZjbDlmWVc1amFHOXlJSHRjY2x4dUlDQWdJQ0FnSmpwc2FXNXJMRnh5WEc0Z0lDQWdJQ0FtT25acGMybDBaV1FzWEhKY2JpQWdJQ0FnSUNZNmFHOTJaWElnZTF4eVhHNGdJQ0FnSUNBZ0lHTnZiRzl5T2lCQWMzVmpZMlZ6YzE5amIyeHZjanRjY2x4dUlDQWdJQ0FnSUNCbWIyNTBMWGRsYVdkb2REb2dZbTlzWkR0Y2NseHVJQ0FnSUNBZ2ZWeHlYRzRnSUNBZ2ZWeHlYRzRnSUgxY2NseHVYSEpjYmlBZ0psOXpkR2xqYTNrc1hISmNiaUFnSmw5bWFYaGxaQ0I3WEhKY2JpQWdJQ0JrYVhOd2JHRjVPaUJtYkdWNE8xeHlYRzRnSUNBZ1pteGxlQzEzY21Gd09pQnViM2R5WVhBN1hISmNiaUFnSUNCbWJHVjRMV1JwY21WamRHbHZiam9nWTI5c2RXMXVPMXh5WEc0Z0lDQWdlaTFwYm1SbGVEb2dkbUZ5S0MwdGIzVjBiR2x1WlMxNlNXNWtaWGdwTzF4eVhHNGdJQ0FnZEc5d09pQXdPMXh5WEc0Z0lDQWdiM1psY21ac2IzYzZJR2hwWkdSbGJqdGNjbHh1WEhKY2JpQWdJQ0F1YjNWMGJHbHVaUzF1WVhacFoyRjBiM0lnZTF4eVhHNGdJQ0FnSUNBbVgxOTBhWFJzWlN4Y2NseHVJQ0FnSUNBZ0psOWZiV0ZwYmlCN1hISmNiaUFnSUNBZ0lDQWdZbTk0TFhOcGVtbHVaem9nWW05eVpHVnlMV0p2ZUR0Y2NseHVJQ0FnSUNBZ2ZWeHlYRzVjY2x4dUlDQWdJQ0FnSmw5ZmRHbDBiR1VnZTF4eVhHNGdJQ0FnSUNBZ0lHWnNaWGd0YzJoeWFXNXJPaUF3TzF4eVhHNGdJQ0FnSUNCOVhISmNibHh5WEc0Z0lDQWdJQ0FtWDE5dFlXbHVJSHRjY2x4dUlDQWdJQ0FnSUNCbWJHVjRPaUF4TzF4eVhHNGdJQ0FnSUNBZ0lHOTJaWEptYkc5M09pQmhkWFJ2TzF4eVhHNGdJQ0FnSUNCOVhISmNiaUFnSUNCOVhISmNiaUFnZlZ4eVhHNWNjbHh1SUNBbVgzTjBhV05yZVNCN1hISmNiaUFnSUNCd2IzTnBkR2x2YmpvZ2MzUnBZMnQ1TzF4eVhHNGdJQ0FnYldGNExXaGxhV2RvZERvZ2RtRnlLQzB0YjNWMGJHbHVaUzF6ZEdsamEza3RhR1ZwWjJoMEtUdGNjbHh1SUNCOVhISmNibHh5WEc0Z0lDWmZabWw0WldRZ2UxeHlYRzRnSUNBZ2NHOXphWFJwYjI0NklHWnBlR1ZrTzF4eVhHNGdJQ0FnYldGNExXaGxhV2RvZERvZ01UQXdKVHRjY2x4dUlDQjlYSEpjYmx4eVhHNGdJQ1pmYUdsa1pHVnVJSHRjY2x4dUlDQWdJR1JwYzNCc1lYazZJRzV2Ym1VN1hISmNiaUFnZlZ4eVhHNWNjbHh1SUNBbVgyWnZiR1JsWkNCN1hISmNiaUFnSUNCM2FXUjBhRG9nTUR0Y2NseHVJQ0FnSUc5MlpYSm1iRzkzT2lCb2FXUmtaVzQ3WEhKY2JpQWdmVnh5WEc1OVhISmNiaUlzSWk4cUtseHlYRzRnS2lCbGJHeHBjSE5wY3k1c1pYTnpJQzBnNXBhSDVweXM1NXlCNTVXbElHMXBlR2x1ZUNEbGg3M21sYkJjY2x4dUlDb2dQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBWeHlYRzRnS2lCRGNtVmhkR1ZrSUVKNU9pQlpZVzlvWVdsNGFXRnZYSEpjYmlBcUlGVndaR0YwWlRvZ01qQXlNaTR6TGpFeFhISmNiaUFxTDF4eVhHNWNjbHh1THlvZ1BUMDlQVDA5SU9hV2grYWNyT2VjZ2VlVnBlV0h2ZWFWc0NBOVBUMDlQVDBnS2k5Y2NseHVMbVZzYkdsd2MybHpJQ2hBYkdsdVpYTXBJSGRvWlc0Z0tFQnNhVzVsY3oweEtTQjdYSEpjYmlBZ2QyaHBkR1V0YzNCaFkyVTZJRzV2ZDNKaGNEdGNjbHh1SUNCMFpYaDBMVzkyWlhKbWJHOTNPaUJsYkd4cGNITnBjenRjY2x4dUlDQnZkbVZ5Wm14dmR6b2dhR2xrWkdWdU8xeHlYRzU5WEhKY2JseHlYRzR1Wld4c2FYQnphWE1nS0VCc2FXNWxjeWtnZDJobGJpQW9RR3hwYm1WelBqMHlLU0I3WEhKY2JpQWdMWGRsWW10cGRDMXNhVzVsTFdOc1lXMXdPaUJBYkdsdVpYTTdYSEpjYmlBZ1pHbHpjR3hoZVRvZ1ltOTRPMXh5WEc0Z0lDMTNaV0pyYVhRdFltOTRMVzl5YVdWdWREb2dkbVZ5ZEdsallXdzdYSEpjYmlBZ2RHVjRkQzF2ZG1WeVpteHZkem9nWld4c2FYQnphWE03WEhKY2JpQWdiM1psY21ac2IzYzZJR2hwWkdSbGJqdGNjbHh1ZlZ4eVhHNGlYWDA9ICovXG4iXSwiZmlsZSI6Im5hdmlnYXRvci5taW4uY3NzIn0= */ diff --git a/navigator.min.js b/navigator.min.js deleted file mode 100644 index c2ef0eca..00000000 --- a/navigator.min.js +++ /dev/null @@ -1,2 +0,0 @@ -!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(t="undefined"!=typeof globalThis?globalThis:t||self).Navigator=e()}(this,(function(){"use strict";const t=t=>"string"==typeof t,e=t=>Object.prototype.toString.apply(t),i=t=>"function"==typeof t||"[object Function]"===e(t),s=t=>("[object Object]"===e(t)||"object"==typeof t||i(t))&&null!==t,r=t=>!!(s(t)&&t.nodeName&&t.tagName&&1===t.nodeType),n=(t,e=300)=>!!i(t)&&setTimeout((()=>{t()}),e),o=["focusout","blur","focusin","focus","load","unload","mouseenter","mouseleave"],l=(t,e,i)=>{const s=o.indexOf(e)>-1;i._delegateListener&&delete(i=i._delegateListener)._delegateListener,function(t,e,i){const s=t._listeners;let r=-1;if(s.length<1)return!1;s.forEach(((t,s)=>{const n=t.fn;e===t.type&&(r=s,n===i&&(r=s))})),r>-1&&s.splice(r,1)}(t,e,i),t.removeEventListener(e,i,s)},a=function(e,i,s=!1){const n=t(e)?document.querySelector(e):e,o=n.childNodes,h=((e,i)=>{let s=e._listeners||[];return t(i)&&i&&(s=s.filter((t=>t.type===i))),s})(n,i);h.forEach((t=>{l(n,t.type,t.fn)})),(s||!0===i||1===arguments.length)&&n&&o&&o.forEach((t=>{r(t)&&a(t,i,s)}))},h=(t,e,s)=>{if(!i(s))return a(t,e),!1;l(t,e,s)},c=(t,e,s,r,n,l=!1)=>{const a=o.indexOf(e)>-1,c=function(i){let o=n||t;!0===n&&(o=r),!0===l&&h(t,e,c),s.call(o,i,r)};if(!i(s))return!1;t._listeners||(t._listeners=[]),t._listeners.push({el:t,type:e,fn:c,data:r,context:n,capture:a}),s._delegateListener=c,t.addEventListener(e,c,a)},u=(t,e="")=>{const i=e.replace(/^>/i,"");return!!(e&&i&&t)&&(t.matches?t.matches(i):!!t.msMatchesSelector&&t.msMatchesSelector(i))},d=t=>t.host&&t!==document&&t.host.nodeType?t.host:t.parentNode,f=(t,e,i,s,r,n,l=!1)=>{const a=o.indexOf(i)>-1,c=function(o){const a=function(t){const e=t.target;return(i=e)&&3===i.nodeType?i.parentNode:i;var i}(o),f=((t,e,i,s)=>{const r=i||document;if(!t)return null;do{if(null!=e&&(e.startsWith(">")?t.parentNode===r&&u(t,e):u(t,e))||s&&t===r)return t;if(t===r)break}while(t=d(t))})(a,e,t);let p=n||t;o.delegateTarget=f,!0===n&&(p=r),f&&(!0===l&&h(t,i,c),s.call(p,o,r))};if(!t)return!1;t._listeners||(t._listeners=[]),t._listeners.push({el:t,selector:e,type:i,fn:c,data:r,context:n,capture:a}),s._delegateListener=c,t.addEventListener(i,c,a)},p=t=>Array.isArray?Array.isArray(t):"[object Array]"===e(t),m=t=>{return!(!s(t)||!(r(t)||(t=>!(!s(t)||"[object NodeList]"!==e(t)))(t)||(i=t,s(i)&&"[object DocumentFragment]"===e(i))||(t=>!(!s(t)||!("[object Text]"===e(t)||t.tagName&&3===t.nodeType)))(t)));var i},g=(t,e)=>{const i=Object.prototype.hasOwnProperty;return t&&i.call(t,e)},y=(t,e)=>{const i=new RegExp("(\\s|^)"+e+"(\\s|$)");let s,n;return!!r(t)&&(s=t.className,!!s&&(n=t.classList,n&&n.contains?t.classList.contains(e):!!i.exec(s)))},v=(t,e)=>{var i;let s,r;if(y(t,e))return!1;s=t.classList,null!==(i=s)&&void 0!==i&&i.add?e.indexOf(" ")>-1?e.split(" ").forEach((t=>{s.add(t)})):s.add(e):(r=t.className,r+=r.length>0?" "+e:e,t.className=r)},b=(t,e)=>{if(!t||!s(e))return!1;Object.keys(e).forEach((i=>{const s=e[i];g(e,i)&&((t,e,i)=>{let s=t.tagName.toLowerCase();switch(e){case"style":t.style.cssText=i;break;case"value":"input"===s||"textarea"===s?t.value=i:t.setAttribute(e,i);break;case"htmlFor":t.setAttribute("for",i);break;case"className":v(t,i);break;case"innerHTML":t.innerHTML=i;break;case"innerText":t.innerText=i;break;default:t.setAttribute(e,i)}})(t,i,s)}))},$=(e,i,r)=>{const n=document.createDocumentFragment(),o=document.createElement(e),l=e=>m(e)||t(e),a=e=>{let i;if(!l(e))return!1;m(e)?i=e:t(e)&&(i=document.createTextNode(e)),n.appendChild(i)};return s(i)?b(o,i):p(i)&&i.every((t=>l(t)))?i.forEach((t=>{a(t)})):m(i)?a(i):t(i)&&a(document.createTextNode(i)),p(r)?r.forEach((t=>{a(t)})):a(r),o.appendChild(n),o},T=t=>t*t,_=(e=null)=>{let i,s;return e?t(e)?s=document.querySelector(e):r(e)&&(s=e):(i=document.querySelectorAll("html,body"),s=i[0].scrollTop-i[1].scrollTop>=0?i[0]:i[1]),s},E=(t,e,s)=>{const r=_(t);let n=r.scrollTop,o=0;const l=e-n,a=r.scrollHeight,h=e-a<=0?e:a,c=t=>(i(s)&&s(t),!1),u=()=>{if(o+=1,l<0){if(n-=T(o),r.scrollTop=n,console.log("$scrollElement up",t,r,n,r.scrollTop),n<=e)return r.scrollTop=e,c(e)}else if(n+=T(o),r.scrollTop=n,console.log("$scrollElement down",t,r,n,r.scrollTop),n>=h)return r.scrollTop=h,c(h);requestAnimationFrame(u)};requestAnimationFrame(u)},x=(e,i)=>{var s;let r,n=e.className;if(!n||!y(e,i))return!1;var o;r=e.classList,null!==(s=r)&&void 0!==s&&s.remove?r.remove(i):(o=n.replace(i,""),n=!!t(o)&&o.replace(/(^\s+)|(\s+$)/g,""),e.className=n)},S=t=>{let e=t.offsetTop;return null!==t.offsetParent&&(e+=S(t.offsetParent)),e},k=(t,e)=>getComputedStyle(t)[e],A=(t,e)=>{document.documentElement.style.setProperty(t,e)},w=t=>{let e={};return null===t?null:(p(t)?e=Array.from(t):(e=Object.assign({},t),Object.keys(e).forEach((i=>e[i]=s(t[i])?w(t[i]):t[i]))),e)};function O(t,e){(null==e||e>t.length)&&(e=t.length);for(var i=0,s=Array(e);i0&&j.length;){const t=j.shift();if(!i(t))return!1;t()}j.length?N=requestIdleCallback(L):(N=0,i(I)&&(I(),I=null))}void 0===window.requestIdleCallback&&(window.requestIdleCallback=function(t){const e=Date.now();return n((function(){t({didTimeout:!1,timeRemaining:function(){return Math.max(0,50-(Date.now()-e))}})}),10)},window.cancelIdleCallback=function(t){clearTimeout(t)});const q=(t,e=null)=>{j.push(t),i(e)&&(I=e),N||requestIdleCallback(L)},z=(t,e,i=!1)=>{const s=e.length,r=function(t,e,i){if(e&&!Array.isArray(e)&&"number"==typeof e.length){var s=e.length;return O(e,void 0!==i&&i{const s=e=>t.querySelector(`#${e}`);e.forEach((e=>{const r=e.pid,n=e.id,o=e.code,l=e.rel,a=[],h=$("span",{className:"outline-navigator__text"},e.text);let c,u,d,f,p;i&&(u=$("span",{className:"outline-navigator__code","data-id":n},e.code),a.push(u)),a.push(h),c=$("a",{id:`chapter__anchor-${n}`,className:"outline-navigator__anchor",href:"#"+l,rel:l,"data-id":n,"data-code":o},a),d=$("li",{id:`chapter-${n}`,className:"outline-navigator__item","data-id":n,"data-code":o},c),-1===r?t.appendChild(d):(p=s(`chapter-${r}`),f=s(`subject-${r}`),f?f.appendChild(d):(f=$("ul",{id:"subject-"+r,className:"outline-navigator__subject"},d),p.appendChild(f)))}))};if(s>400)for(n(r.splice(0,400));r.length>0;){const t=r.splice(0,400);q((()=>{n(t)}))}else n(r)},F={},H=t=>g(F,t)&&F[t].length>0,D=(t,e=!0)=>e?H(t):(t=>{let e=H(t),i=t.lastIndexOf(".");for(;!e&&-1!==i;)i=(t=t.substring(0,i)).lastIndexOf("."),e=H(t);return e})(t),R=(t,i,s=!0)=>{const r=t=>{if(!H(t))return!1;F[t].forEach((t=>{const s=["[object Int8Array]","[object Uint8Array]","[object Uint8ClampedArray]","[object Int16Array]","[object Uint16Array]","[object Int32Array]","[object Uint32Array]","[object Float32Array]","[object Float64Array]","[object BigInt64Array]","[object BigUint64Array]"].indexOf(e(i))>-1?i.toString():i;t.callback.call(t.context||t,s)}))},n=()=>{let e=t,i=t.lastIndexOf(".");for(;-1!==i;)e=e.substring(0,i),i=e.lastIndexOf("."),r(e);r(t),r("*")};if(!D(t))return!1;s?setTimeout(n,10):n()},M=(()=>{let t=0;return e=>(t+=1,e?e+"-"+t:"guid-"+t)})(),P=t=>{if(!g(F,t))return!1;delete F[t]},U=(t,e)=>{if(!D(t))return!1;e?(t=>{const e=Object.keys(F);if(!t||e.length<1)return!1;e.forEach((e=>{const i=F[e];let s;i.forEach(((e,r)=>{e.callback!==t&&e.token!==t||(s=e.topic,i.splice(-1,r))})),i.length<1&&P(s)}))})(e):P(t)};class W{constructor(t){this.attrs={},t&&this.initialize(t)}initialize(t){return this.attr(t).render().addListeners(),this}attr(e,i){const r=this.attrs;return t(e)?i&&g(r,e)?(r[e]=i,this):r[e]:s(e)?(n=r,o=e,Object.keys(o).forEach((t=>{g(o,t)&&(n[t]=o[t])})),this):0===arguments.length?r:this;var n,o}render(){return this}refresh(){return this}destroy(){return this.removeListeners(),this}reload(t){let e=this.attr();return t&&(e=this.attr(t)),this.destroy().initialize(e),this}$emit(t,e){return R(t,e),this}$on(t,e){return((t,e,s=null)=>{const r=M();let n="symbol"==typeof t?t.toString():t;i(e)&&(F[n]||(F[n]=[]),F[n].push({topic:n,callback:e,context:s,token:r}))})(t,e,this),this}$off(t,e){return U(t,e),this}addListeners(){return this}removeListeners(){return this}}const B="outline-navigator_hidden",Y="outline-navigator_expanded",G="outline-navigator_folded";class J extends W{constructor(t){super(),this._default(),this.scrollTimer=null,this.resizeTimer=null,this.observerTimer=null,this.Observer=null,t&&this.initialize(t)}_default(){return this.attrs=w(J.DEFAULTS),this.$el=null,this.$title=null,this.$main=null,this.$list=null,this.$placeholder=null,this.$parentElement=null,this.$scrollElement=null,this.$active=null,this.chapters=[],this.active=0,this.offsetWidth=0,this.offsetTop=0,this.playing=!1,this.closed=!1,this}initialize(e){let s,n,o,l;return this.attr(e),s=this.attr("created"),n=this.attr("parentElement"),o=this.attr("scrollElement"),t(n)?l=document.querySelector(n):r(n)&&(l=n),this.$parentElement=l,this.$scrollElement=_(o),this.chapters=this.attr("chapters"),this.closed=this.attr("closed"),this.active=this.attr("active"),i(s)&&s.call(this),this.chapters.length<1||(this.render().addListeners(),this.$active=document.querySelector(`#chapter-${this.active}`)),this}isClosed(){return this.closed}isSticky(){return"sticky"===this.attr("position")}isFixed(){return"fixed"===this.attr("position")}isInside(){return this.isFixed()||this.isSticky()}isOutside(){return!this.isInside()}count(){return this.chapters.length}_paintEdge(){const t=document.createDocumentFragment(),e=this.attr("title"),i=this.attr("animationCurrent"),s=this.attr("customClass"),r=this.$parentElement,n=[],o=[];let l,a,h,c,u=null;return r?(this.isInside()&&e&&(u=$("h2",{className:"outline-navigator__title"},e),this.$title=u,o.push(u)),h=$("ul",{className:"outline-navigator__list"}),this.$list=h,n.push(h),i&&(c=$("div",{className:"outline-navigator__placeholder"}),this.$placeholder=c,n.push(c)),a=$("div",{className:"outline-navigator__main"},n),this.$main=a,o.push(a),l=$("nav",{id:"outline-navigator",className:`outline-navigator ${B}`},o),this.$el=l,this.isSticky()&&(this.calculateStickyHeight(),v(l,"outline-navigator_sticky")),s&&v(l,s),t.appendChild(l),r.appendChild(t),this):this}render(){const t=this.attr("mounted"),e=this.$parentElement,s=this.chapters,r=this.count();let o;return!e||s.length<1||(this.isInside()&&v(e,"outline-navigator-parent"),this._paintEdge(),o=this.$el,this._paint(s),n((()=>{this.highlight(this.active)}),60),this.offsetTop=S(o),this.offsetWidth=o.offsetWidth,this.isFixed()&&(this.sticky(),A("--outline-navigator-width",`${this.offsetWidth}px`)),i(t)&&t.call(this),r<400&&this.onObserver()),this}erase(){return this.$list.innerHTML="",this}_paint(t){const e=this.attr("showCode"),i=this.$el,s=this.$list;return z(s,t,e),x(i,B),v(i,Y),this}_remove(){return this.$parentElement.removeChild(this.$el),this}refresh(t){const e=this.$el;return x(e,B),this.erase()._paint(t),this}_getPlaceholderOffset(t){const e=this.$main,i=this.$list,s=i.querySelector(".outline-navigator__anchor"),r=parseInt(k(e,"padding-top"),10),n=parseInt(k(e,"border-top-width"),10),o=parseInt(k(i,"padding-top"),10),l=parseInt(k(i,"margin-top"),10),a=parseInt(k(i,"border-top-width"),10);let h,c=0;return r&&(c+=r),o&&(c+=o),l&&(c+=l),n&&(c+=n),a&&(c+=a),h=s.offsetHeight*t,c+h}positionPlaceholder(t){const e=this.$list,i=this.$placeholder,s=e.querySelector(".outline-navigator__anchor"),r=this.attr("animationCurrent"),n=s.offsetHeight;let o=0;return r?(o=this._getPlaceholderOffset(t),i.style.cssText=`transform: translateY(${o}px);height:${n}px;`,this):this}highlight(t){const e=this.$el,i=this.attr("animationCurrent"),s="outline-navigator_active",o="outline-navigator_highlight";let l="relative"===this.attr("position")?this.$parentElement:this.$main,a=null,h=0;return e?(a=e.querySelector(`#chapter__anchor-${t}`),a?(this.active=parseInt(a.getAttribute("data-id"),10),this.$active&&(x(this.$active,o),x(this.$active,s)),this.$active=a,v(this.$active,s),i?this.positionPlaceholder(this.active):v(this.$active,o),n((()=>{((t,e)=>{let i,s,n=!1;return r(t)&&r(e)?(i=e.getBoundingClientRect(),s=t.getBoundingClientRect(),n=!!(s.top>=i.top&&s.right<=i.right&&s.bottom<=i.bottom&&s.left>=i.left),n):n})(this.$active,l)||(h=this._getPlaceholderOffset(this.active),E(l,h))})),this):this):this}sticky(){const t=this.attr("afterSticky"),e="outline-navigator_fixed",s=this.$el,r=this.offsetTop,n=this.$scrollElement.scrollTop;let o;return this.isFixed()?(o=n>=r,o?v(s,e):x(s,e),i(t)&&t.call(this,this.isClosed(),o),this):this}calculateStickyHeight(){const t=document.documentElement,e=Math.max(t.clientHeight||0,window.innerHeight||0);return A("--outline-sticky-height",`${e}px`),this}scrollTo(t,e){const i=this.$scrollElement;return E(i,t,e),this}show(){const t=this.attr("afterOpened"),e=this.count(),s=this.$el,r=this.$parentElement;return this.isInside()?e>800?x(r,B):(x(r,B),n((()=>{x(r,G),v(r,Y)}),30)):x(s,B),this.closed=!1,i(t)&&t.call(this),this}hide(){const t=this.attr("afterClosed"),e=this.count(),s=this.$el,r=this.$parentElement;return this.isInside()?e>800?v(r,B):(v(r,G),x(r,Y),n((()=>{v(r,B)}))):v(s,B),this.closed=!0,i(t)&&t.call(this),this}toggle(){const t=this.attr("afterToggle"),e=this.offsetTop,s=this.$scrollElement.scrollTop;let r;return this.isClosed()?this.show():this.hide(),i(t)&&n((()=>{r=s>=e,t.call(this,this.isClosed(),r)})),this}destroy(){const t=this.attr("beforeDestroy"),e=this.attr("afterDestroy");return i(t)&&t.call(this),this.removeListeners()._remove()._default(),this.scrollTimer&&(clearTimeout(this.scrollTimer),this.scrollTimer=null),this.resizeTimer&&(clearTimeout(this.resizeTimer),this.resizeTimer=null),this.observerTimer&&(clearTimeout(this.observerTimer),this.observerTimer=null),this.Observer&&(this.Observer=null),i(e)&&e.call(this),this}onObserver(){const t=this.attr("selector");return this.Observer=((t,e={})=>{const s=e.root||null,n=e.selector||".outline-heading",o=e.context||null,l={rootMargin:e.rootMargin||"0px 0px -90% 0px"},a=new IntersectionObserver((e=>{e.forEach((e=>{e.intersectionRatio>0&&i(t)&&t.call(o||e.target,e.target)}))}),l),h=r(s)?s:document;return s&&(l.root=s),h.querySelectorAll(n).forEach((t=>{a.observe(t)})),a})((t=>{const e=t.getAttribute("data-id");if(this.playing)return!1;this.observerTimer&&clearTimeout(this.observerTimer),this.observerTimer=n((()=>{this.highlight(e)}),100)}),{selector:t,context:this}),this}onSelect(t){const e=this.attr("stickyHeight"),s=t.delegateTarget,r=s.getAttribute("data-id"),o=s.href.split("#")[1],l=document.querySelector(`#${o}`),a=S(l)-(e+10),h=this.$scrollElement.scrollHeight,c=this.attr("afterScroll"),u=()=>{i(c)&&c.call(this,"chapter"),n((()=>{this.playing=!1,this.$emit("toolbar:update",{top:a,min:0,max:h})}))};return this.playing=!0,this.isFixed()?(this.sticky(),n((()=>{this.scrollTo(a,u),this.highlight(r)}),10)):(this.scrollTo(a,u),this.highlight(r)),function(t){t.stopPropagation(),t.preventDefault()}(t),this}onScroll(){const t=this.$scrollElement;return this.scrollTimer&&clearTimeout(this.scrollTimer),this.scrollTimer=n((()=>{const e=t.scrollTop,i=t.scrollHeight-t.clientHeight;this.isFixed()&&this.sticky(),this.$emit("toolbar:update",{top:e,min:0,max:i})}),100),this}onResize(){return this.isSticky()?(this.resizeTimer&&clearTimeout(this.resizeTimer),this.resizeTimer=n((()=>{this.calculateStickyHeight()})),this):this}onRefresh(t){return this.refresh(t),this}addListeners(){const t=this.$el,e=this.$scrollElement,i=e.tagName.toLowerCase();let s=e;return this.count()<1||("html"!==i&&"body"!==i||(s=window),f(t,".outline-navigator__anchor","click",this.onSelect,this,!0),c(s,"scroll",this.onScroll,this,!0),this.isSticky()&&c(window,"resize",this.onResize,this,!0),this.$on("anchors:all:paint",this.onObserver,this),this.$on("navigator:refresh",this.onRefresh,this)),this}removeListeners(){const t=this.attr("selector"),e=this.$el,i=this.$scrollElement,s=i.tagName.toLowerCase();let r=i;return this.count()<1||("html"!==s&&"body"!==s||(r=window),h(e,"click",this.onSelect),h(r,"scroll",this.onScroll),this.isSticky()&&h(window,"resize",this.onResize),this.$off("anchors:all:paint"),this.$off("navigator:refresh"),this.Observer&&document.querySelectorAll(t).forEach((t=>{this.Observer.unobserve(t)}))),this}}return J.DEFAULTS=w({parentElement:"",scrollElement:"",selector:".outline-heading",active:0,closed:!1,showCode:!0,animationCurrent:!0,position:"relative",stickyHeight:0,chapters:[],created:null,mounted:null,afterClosed:null,afterOpened:null,afterScroll:null,beforeDestroy:null,afterDestroy:null,afterSticky:null}),J})); -//# sourceMappingURL=navigator.min.js.map diff --git a/navigator.min.js.map b/navigator.min.js.map deleted file mode 100644 index 36a78094..00000000 --- a/navigator.min.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"navigator.min.js","sources":["utils/types/isString.js","utils/lang/toString.js","utils/types/isFunction.js","utils/types/isObject.js","utils/types/isElement.js","utils/lang/later.js","utils/event/enum.js","utils/event/_off.js","utils/event/_delete.js","utils/event/purgeElement.js","utils/event/getListeners.js","utils/event/off.js","utils/event/at.js","utils/dom/matches.js","utils/dom/getParentOrHost.js","utils/event/on.js","utils/event/getTarget.js","utils/dom/resolveTextNode.js","utils/dom/closest.js","utils/types/isArray.js","utils/types/isDOM.js","utils/types/isHTMLCollection.js","utils/types/isFragment.js","utils/types/isTextNode.js","utils/lang/hasOwn.js","utils/dom/hasClass.js","utils/dom/addClass.js","utils/dom/setAttributes.js","utils/dom/setAttribute.js","utils/dom/createElement.js","utils/lang/easeInQuad.js","utils/dom/_getScrollElement.js","utils/dom/scrollTo.js","utils/dom/removeClass.js","utils/lang/trim.js","utils/dom/offsetTop.js","utils/dom/getStyle.js","utils/dom/setProperty.js","utils/lang/cloneDeep.js","utils/lang/timeSlice.js","_paintChapters.js","utils/observer/_subscribers.js","utils/observer/_hasDirectSubscribersFor.js","utils/observer/has.js","utils/observer/_hasSubscribers.js","utils/observer/emit.js","utils/types/isTypedArray.js","utils/lang/guid.js","utils/observer/_removeSubscriber.js","utils/observer/off.js","utils/observer/_removeSubscriberByToken.js","base.js","utils/lang/extend.js","utils/observer/on.js","navigator.js","utils/dom/inBounding.js","utils/dom/intersection.js","utils/event/stop.js"],"sourcesContent":["/**\r\n * 检测数据是否为 String 类型\r\n * ========================================================================\r\n * @method isArray\r\n * @param {*} str\r\n * @returns {boolean}\r\n */\r\nconst isString = (str) => {\r\n return typeof str === 'string'\r\n}\r\n\r\nexport default isString\r\n","/**\r\n * Object 对象原型上的 toString 方法\r\n * ========================================================================\r\n * @method toString\r\n * @param {*} val\r\n * @returns {string}\r\n */\r\nconst toString = (val) => {\r\n return Object.prototype.toString.apply(val)\r\n}\r\n\r\nexport default toString\r\n","import toString from '../lang/toString'\r\n\r\n/**\r\n * 检测测试数据是否为 Function 类型\r\n * ========================================================================\r\n * @method isFunction\r\n * @param {*} val - (必须)待检测的数据\r\n * @returns {boolean} 'val' 是 Function 类型返回 true,否则返回 false\r\n */\r\nconst isFunction = (val) => {\r\n return typeof val === 'function' || toString(val) === '[object Function]'\r\n}\r\n\r\nexport default isFunction\r\n","import toString from '../lang/toString'\r\nimport isFunction from './isFunction'\r\n\r\n/**\r\n * 检测数据是否为 Object 类型\r\n * ========================================================================\r\n * @method isObject\r\n * @param {*} o\r\n * @returns {boolean}\r\n */\r\nconst isObject = (o) => {\r\n return (\r\n (toString(o) === '[object Object]' ||\r\n typeof o === 'object' ||\r\n isFunction(o)) &&\r\n o !== null\r\n )\r\n}\r\n\r\nexport default isObject\r\n","import isObject from './isObject'\r\n\r\n/**\r\n * 检测数据是否为 HTMLElement DOM 节点\r\n * ========================================================================\r\n * @method isElement\r\n * @param {*} o\r\n * @returns {boolean}\r\n */\r\nconst isElement = (o) => {\r\n return !!(isObject(o) && o.nodeName && o.tagName && o.nodeType === 1)\r\n}\r\n\r\nexport default isElement\r\n","import isFunction from '../types/isFunction'\r\n\r\n/**\r\n * later - 延迟执行方法\r\n * ========================================================================\r\n * @method later\r\n * @param {Function} fn\r\n * @param {Number} [delay]\r\n * @returns {number|boolean}\r\n */\r\nconst later = (fn, delay = 300) => {\r\n if (!isFunction(fn)) {\r\n return false\r\n }\r\n\r\n return setTimeout(() => {\r\n fn()\r\n }, delay)\r\n}\r\n\r\nexport default later\r\n","export const CAPTURE_EVENTS = [\r\n 'focusout',\r\n 'blur',\r\n 'focusin',\r\n 'focus',\r\n 'load',\r\n 'unload',\r\n 'mouseenter',\r\n 'mouseleave'\r\n]\r\n","import { CAPTURE_EVENTS } from './enum'\r\nimport _delete from './_delete'\r\n\r\n/**\r\n * (私有方法)取消 type 类型的代理事件绑定\r\n * ========================================================================\r\n * 如果没有设置 handler,则销毁 this.$options 绑定的所有符合 type 事件类型的事件绑定\r\n * ========================================================================\r\n * @method _off\r\n * @param {HTMLElement} el - (必须)取消事件绑定的 DOM 元素\r\n * @param {String} type - (必须)事件类型\r\n * @param {Function} fn - (必须)事件处理器回调函数\r\n * @private\r\n */\r\nconst _off = (el, type, fn) => {\r\n const capture = CAPTURE_EVENTS.indexOf(type) > -1\r\n\r\n /* istanbul ignore else */\r\n if (fn._delegateListener) {\r\n fn = fn._delegateListener\r\n delete fn._delegateListener\r\n }\r\n\r\n // 移除缓存的 _listeners 数据\r\n _delete(el, type, fn)\r\n\r\n el.removeEventListener(type, fn, capture)\r\n}\r\n\r\nexport default _off\r\n","/**\r\n * 删除 DOM 元素缓存的 _listeners 数据\r\n * ========================================================================\r\n * @method _delete\r\n * @param {HTMLElement} el - 要删除 listener 的 DOM 元素\r\n * @param {String} type - 事件类型(名称)\r\n * @param {Function} [fn] - 事件处理器回调函数\r\n */\r\nconst _delete = function (el, type, fn) {\r\n const listeners = el._listeners\r\n let index = -1\r\n\r\n if (listeners.length < 1) {\r\n return false\r\n }\r\n\r\n // 移除缓存的 _listeners 数据\r\n listeners.forEach((listener, i) => {\r\n const handler = listener.fn\r\n\r\n if (type === listener.type) {\r\n index = i\r\n\r\n if (handler === fn) {\r\n index = i\r\n }\r\n }\r\n })\r\n\r\n /* istanbul ignore else */\r\n if (index > -1) {\r\n listeners.splice(index, 1)\r\n }\r\n}\r\n\r\nexport default _delete\r\n","import isString from '../types/isString'\r\nimport isElement from '../types/isElement'\r\nimport getListeners from './getListeners'\r\nimport _off from './_off'\r\n\r\n/**\r\n * 销毁(type 类型的)代理事件绑定\r\n * ========================================================================\r\n * 1. 设置了事件类型 type,则销毁指定类型的事件绑定,否则清除所有代理事件绑定\r\n * 2. recurse 设置为 true,递归销毁子节点全部事件绑定\r\n * ========================================================================\r\n * @method purgeElement\r\n * @param {HTMLElement|String} el - (必须)DOM 元素或者其选择器\r\n * @param {String|Boolean} type - (必须)事件类型\r\n * @param {Boolean} [recurse] - (可选)是否递归销毁子节点所有事件绑定\r\n */\r\nconst purgeElement = function (el, type, recurse = false) {\r\n const $element = isString(el) ? document.querySelector(el) : el\r\n const $children = $element.childNodes\r\n const listeners = getListeners($element, type)\r\n\r\n listeners.forEach((listener) => {\r\n _off($element, listener.type, listener.fn)\r\n })\r\n\r\n if (\r\n (recurse || type === true || arguments.length === 1) &&\r\n $element &&\r\n $children\r\n ) {\r\n $children.forEach(($child) => {\r\n if (isElement($child)) {\r\n purgeElement($child, type, recurse)\r\n }\r\n })\r\n }\r\n}\r\n\r\nexport default purgeElement\r\n","import isString from '../types/isString'\r\n\r\n/**\r\n * 获取 DOM 元素(type 事件类型)事件绑定信息\r\n * ========================================================================\r\n * 如果设置了事件类型 type, 则返回指定类型的事件绑定信息,否则返回所有事件绑定信息\r\n * ========================================================================\r\n * @methods getListeners\r\n * @param {HTMLElement} el - (必须)要获取事件绑定信息的 DOM 元素\r\n * @param {String} [type] - (可选)事件类型\r\n * @returns {Array} - 已绑定的事件信息\r\n */\r\nconst getListeners = (el, type) => {\r\n let listeners = el._listeners || []\r\n\r\n if (isString(type) && type) {\r\n listeners = listeners.filter((listener) => {\r\n return listener.type === type\r\n })\r\n }\r\n\r\n return listeners\r\n}\r\n\r\nexport default getListeners\r\n","import purgeElement from './purgeElement'\r\nimport isFunction from '../types/isFunction'\r\nimport _off from './_off'\r\n\r\n/**\r\n * 取消 type 类型的代理事件绑定\r\n * ========================================================================\r\n * 如果没有设置 handler,则销毁 this.$options 绑定的所有符合 type 事件类型的事件绑定\r\n * ========================================================================\r\n * @method off\r\n * @param {HTMLElement|Object} el - (必须)取消事件绑定的 DOM 元素\r\n * @param {String} type - (必须)事件类型\r\n * @param {Function} [fn] - (可选)事件处理器回调函数\r\n */\r\nconst off = (el, type, fn) => {\r\n // 如果不设置 fn 参数,默认清除 el 元素上绑定的所有事件处理器\r\n if (!isFunction(fn)) {\r\n purgeElement(el, type)\r\n return false\r\n }\r\n\r\n _off(el, type, fn)\r\n}\r\n\r\nexport default off\r\n","import isFunction from '../types/isFunction'\r\nimport off from './off'\r\n\r\nimport { CAPTURE_EVENTS } from './enum'\r\n\r\n/**\r\n * 绑定事件\r\n * ========================================================================\r\n * @method at\r\n * @param {HTMLElement|String|Object} el - (必须)绑定代理事件的 DOM 节点\r\n * @param {String|Function} type - (必须)事件类型或者事件处理器回调函数\r\n * @param {Function|Object} fn - (必须) 事件处理器回调函数或者传递给事件处理器回调函数的数据对象\r\n * @param {Object|Boolean} [data] - (可选)传递给事件处理器回调函数的数据对象或者事件处理器回调函数的 this 上下文指向,\r\n * @param {Object|Boolean} [context] - (可选)事件处理器回调函数的 this 上下文指向,或者是否仅触发一次\r\n * 当设置为 true 时,则事件处理器回调函数的 this 上下文指向为 data 对象\r\n * @param {Boolean} once - (可选)是否仅触发一次\r\n */\r\nconst at = (el, type, fn, data, context, once = false) => {\r\n // CAPTURE_EVENTS 中的特殊事件,采用事件捕获模型\r\n const capture = CAPTURE_EVENTS.indexOf(type) > -1\r\n const listener = function (evt) {\r\n let overrideContext = context || el\r\n\r\n // 当设置为 true 时,则事件处理器回调函数的\r\n // this 上下文指向为 data 对象\r\n if (context === true) {\r\n overrideContext = data\r\n }\r\n\r\n // 仅触发一次\r\n /* istanbul ignore else */\r\n if (once === true) {\r\n off(el, type, listener)\r\n }\r\n\r\n fn.call(overrideContext, evt, data)\r\n }\r\n\r\n if (!isFunction(fn)) {\r\n return false\r\n }\r\n\r\n if (!el._listeners) {\r\n el._listeners = []\r\n }\r\n\r\n // 缓存 options 元素绑定的事件处理器\r\n el._listeners.push({\r\n el,\r\n type,\r\n fn: listener,\r\n data,\r\n context,\r\n capture\r\n })\r\n\r\n // 缓存包装后的事件处理器\r\n fn._delegateListener = listener\r\n\r\n el.addEventListener(type, listener, capture)\r\n}\r\n\r\nexport default at\r\n","/**\r\n * 获取 options 节点下匹配 selector 选择器的 DOM 节点\r\n * ========================================================================\r\n * Element.matches() 方法可以用来判断 DOM 元素是否与给定的选择器匹配,事件代理判断是\r\n * 否触发绑定的代理事件回调函数,关键就是使用 Element.matches() 辨别当前事件触发的目\r\n * 标 DOM 元素是否为事件代理所期望触发的目标。\r\n * ========================================================================\r\n * @method matches\r\n * @see https://developer.mozilla.org/en-US/docs/web/api/element/matches\r\n * @param {HTMLElement} el - (必须)DOM 元素\r\n * @param {String} selector - (必须)匹配 DOM 元素的选择器\r\n * @returns {Boolean}\r\n */\r\nconst matches = (el, selector = '') => {\r\n const sel = selector.replace(/^>/i, '')\r\n\r\n if (!selector || !sel || !el) {\r\n return false\r\n }\r\n\r\n /* istanbul ignore else */\r\n if (el.matches) {\r\n return el.matches(sel)\r\n } else if (el.msMatchesSelector) {\r\n return el.msMatchesSelector(sel)\r\n } else {\r\n return false\r\n }\r\n}\r\n\r\nexport default matches\r\n","/**\r\n * 获取 DOM 元素的父节点\r\n * ========================================================================\r\n * @method getParentOrHost\r\n * @param {*|HTMLElement} el - (必须)要获取父节点的 DOM 元素\r\n * @returns {*|HTMLElement}\r\n */\r\nconst getParentOrHost = (el) => {\r\n return el.host && el !== document && el.host.nodeType\r\n ? el.host\r\n : el.parentNode\r\n}\r\n\r\nexport default getParentOrHost\r\n","import closest from '../dom/closest'\r\nimport off from './off'\r\nimport getTarget from './getTarget'\r\n\r\nimport { CAPTURE_EVENTS } from './enum'\r\n\r\n/**\r\n * 绑定代理事件\r\n * ========================================================================\r\n * @method on\r\n * @param {HTMLElement|String|Object} el - (必须)绑定代理事件的 DOM 节点\r\n * @param {String} selector - (必须)事件代理目标 DOM 元素的选择器\r\n * @param {String|Function} type - (必须)事件类型或者事件处理器回调函数\r\n * @param {Function|Object} fn - (可选) 事件处理器回调函数或者传递给事件处理器回调函数的数据对象\r\n * @param {Object|Boolean} [data] - (可选)传递给事件处理器回调函数的数据对象或者事件处理器回调函数的 this 上下文指向,\r\n * @param {Object|Boolean} [context] - (可选)事件处理器回调函数的 this 上下文指向,或者是否仅触发一次\r\n * 当设置为 true 时,则事件处理器回调函数的 this 上下文指向为 data 对象\r\n * @param {Boolean} once - (可选)是否仅触发一次\r\n */\r\nconst on = (el, selector, type, fn, data, context, once = false) => {\r\n // CAPTURE_EVENTS 中的特殊事件,采用事件捕获模型\r\n const capture = CAPTURE_EVENTS.indexOf(type) > -1\r\n\r\n const listener = function (evt) {\r\n const target = getTarget(evt)\r\n // 通过 Element.matches 方法获得点击的目标元素\r\n const delegateTarget = closest(target, selector, el)\r\n let overrideContext = context || el\r\n\r\n evt.delegateTarget = delegateTarget\r\n\r\n // 当设置为 true 时,则事件处理器回调函数的\r\n // this 上下文指向为 data 对象\r\n if (context === true) {\r\n overrideContext = data\r\n }\r\n\r\n /* istanbul ignore else */\r\n if (delegateTarget) {\r\n // 仅触发一次\r\n /* istanbul ignore else */\r\n if (once === true) {\r\n off(el, type, listener)\r\n }\r\n\r\n fn.call(overrideContext, evt, data)\r\n }\r\n }\r\n\r\n if (!el) {\r\n return false\r\n }\r\n\r\n if (!el._listeners) {\r\n el._listeners = []\r\n }\r\n\r\n // 缓存 options 元素绑定的事件处理器\r\n el._listeners.push({\r\n el,\r\n selector,\r\n type,\r\n fn: listener,\r\n data,\r\n context,\r\n capture\r\n })\r\n\r\n // 缓存包装后的事件处理器\r\n fn._delegateListener = listener\r\n\r\n el.addEventListener(type, listener, capture)\r\n}\r\n\r\nexport default on\r\n","import resolveTextNode from '../dom/resolveTextNode'\r\n\r\n/**\r\n * 返回触发事件的 target DOM 元素\r\n * ========================================================================\r\n * @method getTarget\r\n * @param {Event} evt - Event 对象\r\n * @return {HTMLElement} - Event 对象的 target DOM 元素\r\n */\r\nconst getTarget = function (evt) {\r\n const target = evt.target\r\n\r\n return resolveTextNode(target)\r\n}\r\n\r\nexport default getTarget\r\n","/**\r\n * 在某些情况下,某些浏览器(例如:Safari 浏览器)会返回实际的目标元素内部的文本节点。\r\n * resolveTextNode() 方法则会返回实际的目标节点。\r\n * ========================================================================\r\n * @method resolveTextNode\r\n * @param {HTMLElement|Text} el - 要解析的节点\r\n * @return {*|HTMLElement} - 实际的目标 DOM 节点\r\n */\r\nconst resolveTextNode = function (el) {\r\n if (el && el.nodeType === 3) {\r\n return el.parentNode\r\n }\r\n\r\n return el\r\n}\r\n\r\nexport default resolveTextNode\r\n","import matches from './matches'\r\nimport getParentOrHost from './getParentOrHost'\r\n\r\n/**\r\n * 获取 options 元素父元素最近的包含 selector 选择器的元素\r\n * ========================================================================\r\n * @method closest\r\n * @param {HTMLElement} el - (必须)DOM 元素\r\n * @param {String} selector - (必须)DOM 元素的选择其\r\n * @param {HTMLElement} [ctx] - (必须)比对的 DOM 元素\r\n * @param {Boolean} [includeCTX] - (必须)是否包含 context DOM 元素\r\n * @returns {null|HTMLElement} - 返回最接近的 DOM 元素\r\n */\r\nconst closest = (el, selector, ctx, includeCTX) => {\r\n const context = ctx || document\r\n\r\n if (!el) {\r\n return null\r\n }\r\n\r\n do {\r\n /* istanbul ignore else */\r\n if (\r\n (selector != null &&\r\n (selector.startsWith('>')\r\n ? el.parentNode === context && matches(el, selector)\r\n : matches(el, selector))) ||\r\n (includeCTX && el === context)\r\n ) {\r\n return el\r\n }\r\n\r\n /* istanbul ignore else */\r\n if (el === context) {\r\n break\r\n }\r\n\r\n /* jshint boss:true */\r\n } while ((el = getParentOrHost(el)))\r\n}\r\n\r\nexport default closest\r\n","import toString from '../lang/toString'\r\n\r\n/**\r\n * 检测数据是否为 Array 类型\r\n * ========================================================================\r\n * @method isArray\r\n * @param {*} o\r\n * @returns {boolean}\r\n */\r\nconst isArray = (o) => {\r\n if (Array.isArray) {\r\n return Array.isArray(o)\r\n } else {\r\n return toString(o) === '[object Array]'\r\n }\r\n}\r\n\r\nexport default isArray\r\n","import isObject from './isObject'\r\nimport isElement from './isElement'\r\nimport isHTMLCollection from './isHTMLCollection'\r\nimport isFragment from './isFragment'\r\nimport isTextNode from './isTextNode'\r\n\r\nconst isDOM = (el) => {\r\n return !!(\r\n isObject(el) &&\r\n (isElement(el) || isHTMLCollection(el) || isFragment(el) || isTextNode(el))\r\n )\r\n}\r\n\r\nexport default isDOM\r\n","import toString from '../lang/toString'\r\nimport isObject from './isObject'\r\n\r\nconst isHTMLCollection = (el) => {\r\n return !!(isObject(el) && toString(el) === '[object NodeList]')\r\n}\r\n\r\nexport default isHTMLCollection\r\n","import toString from '../lang/toString'\r\nimport isObject from './isObject'\r\n\r\nconst isFragment = (fragment) => {\r\n return !!(\r\n isObject(fragment) && toString(fragment) === '[object DocumentFragment]'\r\n )\r\n}\r\n\r\nexport default isFragment\r\n","import toString from '../lang/toString'\r\nimport isObject from './isObject'\r\n\r\nconst isTextNode = (el) => {\r\n return !!(\r\n isObject(el) &&\r\n (toString(el) === '[object Text]' || (el.tagName && el.nodeType === 3))\r\n )\r\n}\r\n\r\nexport default isTextNode\r\n","/**\r\n * 检测对象自身属性中是否具有指定的属性。\r\n * ========================================================================\r\n * @method hasOwn\r\n * @param {Object} obj - (必须)检测的目标对象\r\n * @param {String} prop - (必须)属性名\r\n * @returns {Boolean}\r\n */\r\nconst hasOwn = (obj, prop) => {\r\n const hasOwnProperty = Object.prototype.hasOwnProperty\r\n return obj && hasOwnProperty.call(obj, prop)\r\n}\r\n\r\nexport default hasOwn\r\n","import isElement from '../types/isElement'\r\n/**\r\n * 检测 DOM 节点是否包含名为 className 的样式\r\n * ========================================================================\r\n * @method hasClass\r\n * @param {HTMLElement} el - DOM 节点\r\n * @param {String} className - 样式名称\r\n * @returns {Boolean}\r\n */\r\nconst hasClass = (el, className) => {\r\n const pattern = new RegExp('(\\\\s|^)' + className + '(\\\\s|$)')\r\n let allClass\r\n let classList\r\n\r\n if (!isElement(el)) {\r\n return false\r\n }\r\n\r\n allClass = el.className\r\n\r\n if (!allClass) {\r\n return false\r\n }\r\n\r\n classList = el.classList\r\n\r\n if (classList && classList.contains) {\r\n return el.classList.contains(className)\r\n }\r\n\r\n return !!pattern.exec(allClass)\r\n}\r\n\r\nexport default hasClass\r\n","import hasClass from './hasClass'\r\n\r\n/**\r\n * 给 DOM 节点添加名为 className 的样式\r\n * ========================================================================\r\n * @method addClass\r\n * @param {HTMLElement} el - DOM 节点\r\n * @param {String} className - 样式名称\r\n * @returns {Boolean}\r\n */\r\nconst addClass = (el, className) => {\r\n let classList\r\n let allClass\r\n\r\n if (hasClass(el, className)) {\r\n return false\r\n }\r\n\r\n classList = el.classList\r\n\r\n if (classList?.add) {\r\n if (className.indexOf(' ') > -1) {\r\n className.split(' ').forEach((name) => {\r\n classList.add(name)\r\n })\r\n } else {\r\n classList.add(className)\r\n }\r\n } else {\r\n allClass = el.className\r\n allClass += allClass.length > 0 ? ' ' + className : className\r\n el.className = allClass\r\n }\r\n}\r\n\r\nexport default addClass\r\n","import isObject from '../types/isObject'\r\nimport hasOwn from '../lang/hasOwn'\r\nimport setAttribute from './setAttribute'\r\n\r\nconst setAttributes = (el, attrs) => {\r\n if (!el || !isObject(attrs)) {\r\n return false\r\n }\r\n\r\n Object.keys(attrs).forEach((attr) => {\r\n const value = attrs[attr]\r\n if (hasOwn(attrs, attr)) {\r\n setAttribute(el, attr, value)\r\n }\r\n })\r\n}\r\n\r\nexport default setAttributes\r\n","import addClass from './addClass.js'\r\n\r\n/**\r\n * 给 DOM 节点设置属性/值\r\n * ========================================================================\r\n * @method setAttribute\r\n * @param {HTMLElement} el - DOM 节点\r\n * @param {String} attr - 属性名称\r\n * @param {String|Number|Boolean} value - 属性值\r\n */\r\nconst setAttribute = (el, attr, value) => {\r\n let tagName = el.tagName.toLowerCase()\r\n\r\n switch (attr) {\r\n case 'style':\r\n el.style.cssText = value\r\n break\r\n case 'value':\r\n if (tagName === 'input' || tagName === 'textarea') {\r\n el.value = value\r\n } else {\r\n el.setAttribute(attr, value)\r\n }\r\n break\r\n case 'htmlFor':\r\n el.setAttribute('for', value)\r\n break\r\n case 'className':\r\n addClass(el, value)\r\n break\r\n case 'innerHTML':\r\n el.innerHTML = value\r\n break\r\n case 'innerText':\r\n el.innerText = value\r\n break\r\n default:\r\n el.setAttribute(attr, value)\r\n break\r\n }\r\n}\r\n\r\nexport default setAttribute\r\n","import isObject from '../types/isObject'\r\nimport isString from '../types/isString'\r\nimport isArray from '../types/isArray'\r\nimport isDOM from '../types/isDOM'\r\nimport setAttributes from './setAttributes'\r\n\r\n/**\r\n * 创建 DOM 节点,并添加属性和子节点\r\n * ========================================================================\r\n * @method createElement\r\n * @param {String} tagName - 标签名称\r\n * @param {Object|Array|HTMLElement|DocumentFragment|String} attrs - 属性对象或者子节点\r\n * @param {Array|HTMLElement|DocumentFragment|String} [children] - 子节点数组\r\n * @returns {HTMLElement}\r\n */\r\nconst createElement = (tagName, attrs, children) => {\r\n const $fragment = document.createDocumentFragment()\r\n const $el = document.createElement(tagName)\r\n const isValidChild = (child) => {\r\n return isDOM(child) || isString(child)\r\n }\r\n const append = (child) => {\r\n let $child\r\n\r\n if (!isValidChild(child)) {\r\n return false\r\n }\r\n\r\n if (isDOM(child)) {\r\n $child = child\r\n } else if (isString(child)) {\r\n $child = document.createTextNode(child)\r\n }\r\n\r\n $fragment.appendChild($child)\r\n }\r\n\r\n if (isObject(attrs)) {\r\n setAttributes($el, attrs)\r\n } else if (isArray(attrs) && attrs.every((attr) => isValidChild(attr))) {\r\n attrs.forEach((child) => {\r\n append(child)\r\n })\r\n } else if (isDOM(attrs)) {\r\n append(attrs)\r\n } else if (isString(attrs)) {\r\n append(document.createTextNode(attrs))\r\n }\r\n\r\n if (isArray(children)) {\r\n children.forEach((child) => {\r\n append(child)\r\n })\r\n } else {\r\n append(children)\r\n }\r\n\r\n $el.appendChild($fragment)\r\n\r\n return $el\r\n}\r\n\r\nexport default createElement\r\n","/**\r\n * 返回给定值的平方值\r\n * ========================================================================\r\n * @method easeInQuad\r\n * @param {Number} x\r\n * @returns {number}\r\n */\r\nconst easeInQuad = (x) => {\r\n return x * x\r\n}\r\n\r\nexport default easeInQuad\r\n","import isString from '../types/isString'\r\nimport isElement from '../types/isElement'\r\n\r\n/**\r\n * 通过给的 scrollElement 参数,获取滚动 DOM 元素\r\n * ========================================================================\r\n * @method _getScrollElement\r\n * @param {String|HTMLElement} scrollElement\r\n * @returns {Element}\r\n * @private\r\n */\r\nconst _getScrollElement = (scrollElement = null) => {\r\n let $rootElements\r\n let $scrollElement\r\n\r\n if (!scrollElement) {\r\n $rootElements = document.querySelectorAll('html,body')\r\n $scrollElement =\r\n $rootElements[0].scrollTop - $rootElements[1].scrollTop >= 0\r\n ? $rootElements[0]\r\n : $rootElements[1]\r\n } else {\r\n if (isString(scrollElement)) {\r\n $scrollElement = document.querySelector(scrollElement)\r\n } else if (isElement(scrollElement)) {\r\n $scrollElement = scrollElement\r\n }\r\n }\r\n\r\n return $scrollElement\r\n}\r\n\r\nexport default _getScrollElement\r\n","import easeInQuad from '../lang/easeInQuad'\r\nimport isFunction from '../types/isFunction'\r\nimport _getScrollElement from './_getScrollElement'\r\n\r\n/**\r\n * 指定 rootElement DOM 节点滚动到指定 top 位置\r\n * ========================================================================\r\n * @method scrollTo\r\n * @param {HTMLElement|Object} [scrollElement] - (必须)要滚动的 DOM 节点\r\n * @param {Number} top - (必须)滚动的 scrollTop 数值\r\n * @param {Function} [afterStop] - (可选)滚动完成的回调函数\r\n */\r\nconst scrollTo = (scrollElement, top, afterStop) => {\r\n const $scrollElement = _getScrollElement(scrollElement)\r\n let scrollTop = $scrollElement.scrollTop\r\n let step = 0\r\n const distance = top - scrollTop\r\n const MAX_HEIGHT = $scrollElement.scrollHeight\r\n const MAX_TOP = top - MAX_HEIGHT <= 0 ? top : MAX_HEIGHT\r\n const stop = (top) => {\r\n if (isFunction(afterStop)) {\r\n afterStop(top)\r\n }\r\n\r\n return false\r\n }\r\n const play = () => {\r\n step += 1\r\n\r\n // 向上滚动\r\n if (distance < 0) {\r\n scrollTop -= easeInQuad(step)\r\n $scrollElement.scrollTop = scrollTop\r\n\r\n console.log(\r\n '$scrollElement up',\r\n scrollElement,\r\n $scrollElement,\r\n scrollTop,\r\n $scrollElement.scrollTop\r\n )\r\n\r\n if (scrollTop <= top) {\r\n $scrollElement.scrollTop = top\r\n return stop(top)\r\n }\r\n } else {\r\n scrollTop += easeInQuad(step)\r\n $scrollElement.scrollTop = scrollTop\r\n\r\n console.log(\r\n '$scrollElement down',\r\n scrollElement,\r\n $scrollElement,\r\n scrollTop,\r\n $scrollElement.scrollTop\r\n )\r\n\r\n if (scrollTop >= MAX_TOP) {\r\n $scrollElement.scrollTop = MAX_TOP\r\n return stop(MAX_TOP)\r\n }\r\n }\r\n\r\n // eslint-disable-next-line compat/compat\r\n requestAnimationFrame(play)\r\n }\r\n\r\n // eslint-disable-next-line compat/compat\r\n requestAnimationFrame(play)\r\n}\r\n\r\nexport default scrollTo\r\n","import trim from '../lang/trim'\r\nimport hasClass from './hasClass'\r\n\r\n/**\r\n * 移除 DOM 节点的 className 样式\r\n * ========================================================================\r\n * @method removeClass\r\n * @param {HTMLElement} el - DOM 节点\r\n * @param {String} className - 样式名称\r\n * @returns {Boolean}\r\n */\r\nconst removeClass = (el, className) => {\r\n let allClass = el.className\r\n let classList\r\n\r\n if (!allClass || !hasClass(el, className)) {\r\n return false\r\n }\r\n\r\n classList = el.classList\r\n\r\n if (classList?.remove) {\r\n classList.remove(className)\r\n } else {\r\n allClass = trim(allClass.replace(className, ''))\r\n el.className = allClass\r\n }\r\n}\r\n\r\nexport default removeClass\r\n","import isString from '../types/isString'\r\n\r\n/**\r\n * 清楚字符串起始位置所有的空格\r\n * ========================================================================\r\n * @method trim\r\n * @param {string} str\r\n * @returns {string|Boolean}\r\n */\r\nconst trim = (str) => {\r\n if (!isString(str)) {\r\n return false\r\n }\r\n return str.replace(/(^\\s+)|(\\s+$)/g, '')\r\n}\r\n\r\nexport default trim\r\n","/**\r\n * 获取 DOM 节点相对于窗口的 left (纵坐标)值\r\n * ========================================================================\r\n * @method offsetTop\r\n * @param {HTMLElement} el - DOM 节点\r\n * @returns {Number}\r\n */\r\nconst offsetTop = (el) => {\r\n let top = el.offsetTop\r\n\r\n if (el.offsetParent !== null) {\r\n top += offsetTop(el.offsetParent)\r\n }\r\n\r\n return top\r\n}\r\n\r\nexport default offsetTop\r\n","/**\r\n * 获取HTML元素的某个CSS样式值\r\n * ====================================================\r\n * @param el\r\n * @param ruleName\r\n * @returns {*}\r\n */\r\nconst getStyle = (el, ruleName) => {\r\n return getComputedStyle(el)[ruleName]\r\n}\r\n\r\nexport default getStyle\r\n","const setProperty = (prop, value) => {\r\n const documentElement = document.documentElement\r\n documentElement.style.setProperty(prop, value)\r\n}\r\n\r\nexport default setProperty\r\n","import isObject from '../types/isObject'\r\nimport isArray from '../types/isArray'\r\n\r\n/**\r\n * 深拷贝对象函数\r\n * ========================================================================\r\n * @methods cloneDeep\r\n * @param {Object} obj - 深拷贝的对象\r\n * @returns {Array|Object|*}\r\n *\r\n * @example\r\n * const arr = cloneDeep([2,3,4,6])\r\n * => [2,3,4,6]\r\n */\r\nconst cloneDeep = (obj) => {\r\n let clone = {}\r\n\r\n if (obj === null) {\r\n return null\r\n }\r\n\r\n if (isArray(obj)) {\r\n clone = Array.from(obj)\r\n } else {\r\n clone = Object.assign({}, obj)\r\n Object.keys(clone).forEach((key) => {\r\n return (clone[key] = isObject(obj[key]) ? cloneDeep(obj[key]) : obj[key])\r\n })\r\n }\r\n\r\n return clone\r\n}\r\n\r\nexport default cloneDeep\r\n","/**\r\n * timeSlice.js 时间切片功能函数\r\n * ====================================================\r\n * Created By: Yaohaixiao\r\n * Update: 2023.09.04\r\n */\r\nimport isFunction from '../types/isFunction'\r\nimport later from './later'\r\n\r\nconst queue = []\r\nlet isHandling\r\nlet done\r\n\r\n// Shim from https://developers.google.com/web/updates/2015/08/using-requestidlecallback\r\nif (typeof window.requestIdleCallback === 'undefined') {\r\n window.requestIdleCallback = function (cb) {\r\n const start = Date.now()\r\n return later(function () {\r\n cb({\r\n didTimeout: false,\r\n timeRemaining: function () {\r\n return Math.max(0, 50 - (Date.now() - start))\r\n }\r\n })\r\n }, 10)\r\n }\r\n\r\n window.cancelIdleCallback = function (id) {\r\n clearTimeout(id)\r\n }\r\n}\r\n\r\nfunction runIdle(idleDeadline) {\r\n while (idleDeadline.timeRemaining() > 0 && queue.length) {\r\n const fn = queue.shift()\r\n\r\n if (!isFunction(fn)) {\r\n return false\r\n }\r\n\r\n fn()\r\n }\r\n\r\n if (queue.length) {\r\n isHandling = requestIdleCallback(runIdle)\r\n } else {\r\n isHandling = 0\r\n\r\n if (isFunction(done)) {\r\n done()\r\n done = null\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * 时间切片功能函数:主要用于优化长时任务的性能,将长时任务分解成\r\n * 多个短时间任务\r\n * ====================================================\r\n * @param {Function} fn - 需要在空闲时执行的回调函数\r\n * @param {Function} afterComplete - queen 的\r\n * @return {(function(): (boolean|undefined))|*|boolean}\r\n */\r\nconst timeSlice = (fn, afterComplete = null) => {\r\n queue.push(fn)\r\n\r\n if (isFunction(afterComplete)) {\r\n done = afterComplete\r\n }\r\n\r\n if (!isHandling) {\r\n requestIdleCallback(runIdle)\r\n }\r\n}\r\n\r\nexport default timeSlice\r\n","import createElement from './utils/dom/createElement'\r\nimport timeSlice from './utils/lang/timeSlice'\r\n\r\nconst _paintChapters = ($list, chapters, showCode = false) => {\r\n const LIMIT = 400\r\n const count = chapters.length\r\n const clones = [...chapters]\r\n const paint = (parts) => {\r\n const byId = (id) => $list.querySelector(`#${id}`)\r\n parts.forEach((chapter) => {\r\n const pid = chapter.pid\r\n const id = chapter.id\r\n const code = chapter.code\r\n const rel = chapter.rel\r\n const children = []\r\n const $text = createElement(\r\n 'span',\r\n {\r\n className: 'outline-navigator__text'\r\n },\r\n chapter.text\r\n )\r\n let $link\r\n let $code\r\n let $li\r\n let $subject\r\n let $chapter\r\n\r\n if (showCode) {\r\n $code = createElement(\r\n 'span',\r\n {\r\n className: 'outline-navigator__code',\r\n 'data-id': id\r\n },\r\n chapter.code\r\n )\r\n\r\n children.push($code)\r\n }\r\n\r\n children.push($text)\r\n\r\n $link = createElement(\r\n 'a',\r\n {\r\n id: `chapter__anchor-${id}`,\r\n className: 'outline-navigator__anchor',\r\n href: '#' + rel,\r\n rel: rel,\r\n 'data-id': id,\r\n 'data-code': code\r\n },\r\n children\r\n )\r\n\r\n $li = createElement(\r\n 'li',\r\n {\r\n id: `chapter-${id}`,\r\n className: 'outline-navigator__item',\r\n 'data-id': id,\r\n 'data-code': code\r\n },\r\n $link\r\n )\r\n\r\n if (pid === -1) {\r\n $list.appendChild($li)\r\n } else {\r\n $chapter = byId(`chapter-${pid}`)\r\n $subject = byId(`subject-${pid}`)\r\n\r\n if (!$subject) {\r\n $subject = createElement(\r\n 'ul',\r\n {\r\n id: 'subject-' + pid,\r\n className: 'outline-navigator__subject'\r\n },\r\n $li\r\n )\r\n\r\n $chapter.appendChild($subject)\r\n } else {\r\n $subject.appendChild($li)\r\n }\r\n }\r\n })\r\n }\r\n\r\n // 在大量 DOM 菜单绘制的时候,使用 TIME SLICE 拆分绘制任务\r\n // 以避免一次绘制大量 DOM 导致占用资源过高,导致卡死\r\n if (count > LIMIT) {\r\n // 同步绘制\r\n paint(clones.splice(0, LIMIT))\r\n\r\n // 剩余的采用 timeSlice 机制绘制\r\n while (clones.length > 0) {\r\n const once = clones.splice(0, LIMIT)\r\n timeSlice(() => {\r\n paint(once)\r\n })\r\n }\r\n } else {\r\n paint(clones)\r\n }\r\n}\r\n\r\nexport default _paintChapters\r\n","/**\r\n * 存储订阅者(主题和处理器的)私有对象\r\n * ========================================================================\r\n * @type {{}}\r\n * @private\r\n */\r\nconst _subscribers = {}\r\n\r\nexport default _subscribers\r\n","import _subscribers from './_subscribers'\r\nimport hasOwn from '../lang/hasOwn'\r\n\r\n/**\r\n * 判断是否存在与给定 topic 完全匹配的订阅者信息\r\n * ========================================================================\r\n * @method _hasDirectSubscribersFor\r\n * @param {String} topic - (必须)订阅主题字符串\r\n * @returns {Boolean}\r\n */\r\nconst _hasDirectSubscribersFor = (topic) => {\r\n return hasOwn(_subscribers, topic) && _subscribers[topic].length > 0\r\n}\r\n\r\nexport default _hasDirectSubscribersFor\r\n","import _hasDirectSubscribersFor from './_hasDirectSubscribersFor'\r\nimport _hasSubscribers from './_hasSubscribers'\r\n\r\n/**\r\n * 判断是否存在包含 topic 指定的订阅者信息\r\n * ========================================================================\r\n * @method has\r\n * @param {String} topic - (必须)主题名称\r\n * @param {Boolean} [isDirect] - (可选)是否为直接的主题,默认值:true\r\n * @returns {Boolean}\r\n */\r\nconst has = (topic, isDirect = true) => {\r\n return isDirect ? _hasDirectSubscribersFor(topic) : _hasSubscribers(topic)\r\n}\r\n\r\nexport default has\r\n","import _hasDirectSubscribersFor from './_hasDirectSubscribersFor'\r\n\r\n/**\r\n * 判断是否存在包含给定 topic 相关的订阅者信息\r\n * ========================================================================\r\n * @method _hasSubscribers\r\n * @param {String} topic - (必须)订阅主题字符串\r\n * @returns {Boolean}\r\n */\r\nconst _hasSubscribers = (topic) => {\r\n let found = _hasDirectSubscribersFor(topic)\r\n let position = topic.lastIndexOf('.')\r\n\r\n while (!found && position !== -1) {\r\n topic = topic.substring(0, position)\r\n position = topic.lastIndexOf('.')\r\n found = _hasDirectSubscribersFor(topic)\r\n }\r\n\r\n return found\r\n}\r\n\r\nexport default _hasSubscribers\r\n","import isTypedArray from '../types/isTypedArray'\r\nimport _subscribers from './_subscribers'\r\nimport has from './has'\r\nimport _hasDirectSubscribersFor from './_hasDirectSubscribersFor'\r\n\r\n/**\r\n * (异步)发布订阅主题信息\r\n * ========================================================================\r\n * 主题默认是异步发布的。确保在消费者处理主题时,主题的发起者不会被阻止。\r\n * ========================================================================\r\n * @method emit\r\n * @param {String} topic - (必须)主题名称\r\n * @param {Object} [data] - (可选)数据对象\r\n * @param {Boolean} [async] - (可选) 是否异步发布\r\n */\r\nconst emit = (topic, data, async = true) => {\r\n const execute = (topic) => {\r\n if (!_hasDirectSubscribersFor(topic)) {\r\n return false\r\n }\r\n\r\n _subscribers[topic].forEach((subscriber) => {\r\n // 针对 mqtt 消息服务返回的 Uint8Array 类似的 typed arrays 格式的数据\r\n // 采用 toString() 方法转化为普通(JSON)字符串\r\n const message = isTypedArray(data) ? data.toString() : data\r\n\r\n subscriber.callback.call(subscriber.context || subscriber, message)\r\n })\r\n }\r\n const deliver = () => {\r\n let subscriber = topic\r\n let position = topic.lastIndexOf('.')\r\n\r\n while (position !== -1) {\r\n subscriber = subscriber.substring(0, position)\r\n position = subscriber.lastIndexOf('.')\r\n\r\n execute(subscriber)\r\n }\r\n\r\n // 执行 topic 对应的处理器\r\n execute(topic)\r\n // 执行特殊 topic:'*'(监听全部消息的发布)\r\n execute('*')\r\n }\r\n\r\n if (!has(topic)) {\r\n return false\r\n }\r\n\r\n if (async) {\r\n setTimeout(deliver, 10)\r\n } else {\r\n deliver()\r\n }\r\n}\r\n\r\nexport default emit\r\n","import toString from '../lang/toString'\r\n/**\r\n * 判断检测数据是否为 Typed Arrays 类型的数据\r\n * ========================================================================\r\n * @param {*} val\r\n * @returns {boolean}\r\n */\r\nconst isTypedArray = (val) => {\r\n const TYPES = [\r\n '[object Int8Array]',\r\n '[object Uint8Array]',\r\n '[object Uint8ClampedArray]',\r\n '[object Int16Array]',\r\n '[object Uint16Array]',\r\n '[object Int32Array]',\r\n '[object Uint32Array]',\r\n '[object Float32Array]',\r\n '[object Float64Array]',\r\n '[object BigInt64Array]',\r\n '[object BigUint64Array]'\r\n ]\r\n\r\n return TYPES.indexOf(toString(val)) > -1\r\n}\r\n\r\nexport default isTypedArray\r\n","/**\r\n * 生成唯一 id 字符串的函数\r\n * ========================================================================\r\n * @method guid\r\n * @param {String} [prefix] - 生成 id 的前缀字符串\r\n * @return {String} 返回一个表示唯一 id 的字符串\r\n */\r\nconst guid = (() => {\r\n let uuid = 0\r\n\r\n return (prefix) => {\r\n uuid += 1\r\n\r\n return prefix ? prefix + '-' + uuid : 'guid-' + uuid\r\n }\r\n})()\r\n\r\nexport default guid\r\n","import _subscribers from './_subscribers'\r\nimport hasOwn from '../lang/hasOwn'\r\n\r\n/**\r\n * 删除与给定 topic 相同的订阅者信息\r\n * ========================================================================\r\n * @method _removeSubscriber\r\n * @param {String} topic - (必须)订阅主题字符串\r\n * @returns {Boolean}\r\n */\r\nconst _removeSubscriber = (topic) => {\r\n if (!hasOwn(_subscribers, topic)) {\r\n return false\r\n }\r\n\r\n delete _subscribers[topic]\r\n}\r\n\r\nexport default _removeSubscriber\r\n","import has from './has'\r\nimport _removeSubscriber from './_removeSubscriber'\r\nimport _removeSubscriberByToken from './_removeSubscriberByToken'\r\n\r\n/**\r\n * 取消订阅主题\r\n * ========================================================================\r\n * @method off\r\n * @param {String} topic - (必须)订阅的主题\r\n * @param {Function|String} [token] - (可选)订阅主题的处理器函数或者唯一 Id 值\r\n */\r\nconst off = (topic, token) => {\r\n if (!has(topic)) {\r\n return false\r\n }\r\n\r\n if (token) {\r\n _removeSubscriberByToken(token)\r\n } else {\r\n _removeSubscriber(topic)\r\n }\r\n}\r\n\r\nexport default off\r\n","import _subscribers from './_subscribers'\r\nimport _removeSubscriber from './_removeSubscriber'\r\n\r\n/**\r\n * 通过订阅者 token 值删除订阅者信息\r\n * ========================================================================\r\n * @method _removeSubscriberByToken\r\n * @param {String} token - 订阅者 token 字符串\r\n * @returns {boolean}\r\n * @private\r\n */\r\nconst _removeSubscriberByToken = (token) => {\r\n const keys = Object.keys(_subscribers)\r\n let index = -1\r\n\r\n if (!token || keys.length < 1) {\r\n return false\r\n }\r\n\r\n keys.forEach((subject) => {\r\n const subscriber = _subscribers[subject]\r\n let topic\r\n\r\n subscriber.forEach((execution, j) => {\r\n if (execution.callback === token || execution.token === token) {\r\n topic = execution.topic\r\n subscriber.splice(index, j)\r\n }\r\n })\r\n\r\n /* istanbul ignore else */\r\n if (subscriber.length < 1) {\r\n _removeSubscriber(topic)\r\n }\r\n })\r\n}\r\n\r\nexport default _removeSubscriberByToken\r\n","import isString from './utils/types/isString'\r\nimport hasOwn from './utils/lang/hasOwn'\r\nimport isObject from './utils/types/isObject'\r\nimport extend from './utils/lang/extend'\r\nimport publish from './utils/observer/emit'\r\nimport subscribe from './utils/observer/on'\r\nimport unsubscribe from './utils/observer/off'\r\n\r\nclass Base {\r\n constructor(options) {\r\n this.attrs = {}\r\n\r\n if (options) {\r\n this.initialize(options)\r\n }\r\n }\r\n\r\n initialize(options) {\r\n this.attr(options).render().addListeners()\r\n return this\r\n }\r\n\r\n attr(prop, value) {\r\n const attrs = this.attrs\r\n\r\n if (isString(prop)) {\r\n // 只能扩展 attrs 中已有的属性\r\n if (value && hasOwn(attrs, prop)) {\r\n // 更新单个配置信息\r\n attrs[prop] = value\r\n return this\r\n }\r\n\r\n // 只传递 prop 参数,则返回对应的属性值\r\n return attrs[prop]\r\n } else if (isObject(prop)) {\r\n // 批量更新配置信息\r\n extend(attrs, prop)\r\n\r\n return this\r\n } else if (arguments.length === 0) {\r\n // 不传递参数,直接返回整个\r\n return attrs\r\n }\r\n\r\n return this\r\n }\r\n\r\n render() {\r\n return this\r\n }\r\n\r\n refresh() {\r\n return this\r\n }\r\n\r\n destroy() {\r\n this.removeListeners()\r\n return this\r\n }\r\n\r\n reload(options) {\r\n let attrs = this.attr()\r\n\r\n if (options) {\r\n attrs = this.attr(options)\r\n }\r\n\r\n this.destroy().initialize(attrs)\r\n\r\n return this\r\n }\r\n\r\n $emit(event, data) {\r\n publish(event, data)\r\n return this\r\n }\r\n\r\n $on(event, callback) {\r\n subscribe(event, callback, this)\r\n return this\r\n }\r\n\r\n $off(event, callback) {\r\n unsubscribe(event, callback)\r\n return this\r\n }\r\n\r\n addListeners() {\r\n return this\r\n }\r\n\r\n removeListeners() {\r\n return this\r\n }\r\n}\r\n\r\nexport default Base\r\n","import hasOwn from './hasOwn'\r\n\r\n/**\r\n * 扩展对象\r\n * ========================================================================\r\n * @method extend\r\n * @param {Object} origin\r\n * @param {Object} source\r\n */\r\nconst extend = (origin, source) => {\r\n const keys = Object.keys(source)\r\n\r\n keys.forEach((prop) => {\r\n if (hasOwn(source, prop)) {\r\n origin[prop] = source[prop]\r\n }\r\n })\r\n}\r\n\r\nexport default extend\r\n","import _subscribers from './_subscribers'\r\nimport isFunction from '../types/isFunction'\r\nimport guid from '../lang/guid'\r\n\r\n/**\r\n * 订阅主题,并给出处理器函数\r\n * ========================================================================\r\n * @method on\r\n * @param {String} topic - (必须)主题名称\r\n * @param {Function} handler - (必须)主题的处理器函数\r\n * @param {Object} [context] - (可选)指定 this 执行上下文\r\n * @return {String} - 唯一的 token 字符串,例如:'guid-1'。\r\n */\r\nconst on = (topic, handler, context = null) => {\r\n const token = guid()\r\n let subject = typeof topic === 'symbol' ? topic.toString() : topic\r\n\r\n if (!isFunction(handler)) {\r\n return ''\r\n }\r\n\r\n /* istanbul ignore else */\r\n if (!_subscribers[subject]) {\r\n _subscribers[subject] = []\r\n }\r\n\r\n _subscribers[subject].push({\r\n topic: subject,\r\n callback: handler,\r\n context,\r\n token\r\n })\r\n\r\n return token\r\n}\r\n\r\nexport default on\r\n","import isString from './utils/types/isString'\r\nimport isFunction from './utils/types/isFunction'\r\nimport isElement from './utils/types/isElement'\r\nimport later from './utils/lang/later'\r\nimport at from './utils/event/at'\r\nimport on from './utils/event/on'\r\nimport off from './utils/event/off'\r\nimport stop from './utils/event/stop'\r\nimport createElement from './utils/dom/createElement'\r\nimport scrollTo from './utils/dom/scrollTo'\r\nimport addClass from './utils/dom/addClass'\r\nimport intersection from './utils/dom/intersection'\r\nimport removeClass from './utils/dom/removeClass'\r\nimport offsetTop from './utils/dom/offsetTop'\r\nimport getStyle from './utils/dom/getStyle'\r\nimport setProperty from './utils/dom/setProperty'\r\nimport _getScrollElement from './utils/dom/_getScrollElement'\r\nimport cloneDeep from './utils/lang/cloneDeep'\r\n\r\nimport _paintChapters from './_paintChapters'\r\nimport inBounding from './utils/dom/inBounding'\r\n\r\nimport Base from './base'\r\n\r\nconst HIDDEN = 'outline-navigator_hidden'\r\nconst EXPANDED = 'outline-navigator_expanded'\r\nconst FOLDED = 'outline-navigator_folded'\r\n\r\nclass Navigator extends Base {\r\n constructor(options) {\r\n super()\r\n\r\n this._default()\r\n\r\n this.scrollTimer = null\r\n this.resizeTimer = null\r\n this.observerTimer = null\r\n this.Observer = null\r\n\r\n if (options) {\r\n this.initialize(options)\r\n }\r\n }\r\n\r\n _default() {\r\n this.attrs = cloneDeep(Navigator.DEFAULTS)\r\n\r\n this.$el = null\r\n this.$title = null\r\n this.$main = null\r\n this.$list = null\r\n this.$placeholder = null\r\n this.$parentElement = null\r\n this.$scrollElement = null\r\n this.$active = null\r\n\r\n this.chapters = []\r\n this.active = 0\r\n this.offsetWidth = 0\r\n this.offsetTop = 0\r\n this.playing = false\r\n this.closed = false\r\n\r\n return this\r\n }\r\n\r\n initialize(options) {\r\n let created\r\n let parentElement\r\n let scrollElement\r\n let $parent\r\n\r\n this.attr(options)\r\n\r\n created = this.attr('created')\r\n parentElement = this.attr('parentElement')\r\n scrollElement = this.attr('scrollElement')\r\n\r\n if (isString(parentElement)) {\r\n $parent = document.querySelector(parentElement)\r\n } else if (isElement(parentElement)) {\r\n $parent = parentElement\r\n }\r\n this.$parentElement = $parent\r\n this.$scrollElement = _getScrollElement(scrollElement)\r\n\r\n this.chapters = this.attr('chapters')\r\n this.closed = this.attr('closed')\r\n this.active = this.attr('active')\r\n\r\n if (isFunction(created)) {\r\n created.call(this)\r\n }\r\n\r\n if (this.chapters.length < 1) {\r\n return this\r\n }\r\n\r\n this.render().addListeners()\r\n\r\n this.$active = document.querySelector(`#chapter-${this.active}`)\r\n\r\n return this\r\n }\r\n\r\n isClosed() {\r\n return this.closed\r\n }\r\n\r\n isSticky() {\r\n const position = this.attr('position')\r\n return position === 'sticky'\r\n }\r\n\r\n isFixed() {\r\n const position = this.attr('position')\r\n return position === 'fixed'\r\n }\r\n\r\n isInside() {\r\n return this.isFixed() || this.isSticky()\r\n }\r\n\r\n isOutside() {\r\n return !this.isInside()\r\n }\r\n\r\n count() {\r\n return this.chapters.length\r\n }\r\n\r\n _paintEdge() {\r\n const $fragment = document.createDocumentFragment()\r\n const STICKY = 'outline-navigator_sticky'\r\n const title = this.attr('title')\r\n const animationCurrent = this.attr('animationCurrent')\r\n const customClass = this.attr('customClass')\r\n const $parentElement = this.$parentElement\r\n const children = []\r\n const contents = []\r\n let $title = null\r\n let $el\r\n let $main\r\n let $list\r\n let $placeholder\r\n\r\n if (!$parentElement) {\r\n return this\r\n }\r\n\r\n if (this.isInside() && title) {\r\n $title = createElement(\r\n 'h2',\r\n {\r\n className: 'outline-navigator__title'\r\n },\r\n title\r\n )\r\n this.$title = $title\r\n contents.push($title)\r\n }\r\n\r\n $list = createElement('ul', {\r\n // 为优化性能,添加了 _fixed 和 _hidden\r\n // fixed 为了让 $list 脱离流布局\r\n // hidden 让 $list 不可见\r\n className: `outline-navigator__list`\r\n })\r\n this.$list = $list\r\n children.push($list)\r\n\r\n if (animationCurrent) {\r\n $placeholder = createElement('div', {\r\n className: 'outline-navigator__placeholder'\r\n })\r\n this.$placeholder = $placeholder\r\n children.push($placeholder)\r\n }\r\n\r\n $main = createElement(\r\n 'div',\r\n {\r\n className: 'outline-navigator__main'\r\n },\r\n children\r\n )\r\n this.$main = $main\r\n contents.push($main)\r\n\r\n $el = createElement(\r\n 'nav',\r\n {\r\n id: 'outline-navigator',\r\n className: `outline-navigator ${HIDDEN}`\r\n },\r\n contents\r\n )\r\n this.$el = $el\r\n\r\n if (this.isSticky()) {\r\n this.calculateStickyHeight()\r\n addClass($el, STICKY)\r\n }\r\n\r\n if (customClass) {\r\n addClass($el, customClass)\r\n }\r\n $fragment.appendChild($el)\r\n $parentElement.appendChild($fragment)\r\n\r\n return this\r\n }\r\n\r\n render() {\r\n const mounted = this.attr('mounted')\r\n const $parentElement = this.$parentElement\r\n const chapters = this.chapters\r\n const count = this.count()\r\n let $el\r\n\r\n if (!$parentElement || chapters.length < 1) {\r\n return this\r\n }\r\n\r\n if (this.isInside()) {\r\n addClass($parentElement, 'outline-navigator-parent')\r\n }\r\n\r\n this._paintEdge()\r\n $el = this.$el\r\n\r\n this._paint(chapters)\r\n\r\n later(() => {\r\n this.highlight(this.active)\r\n }, 60)\r\n\r\n this.offsetTop = offsetTop($el)\r\n this.offsetWidth = $el.offsetWidth\r\n\r\n if (this.isFixed()) {\r\n this.sticky()\r\n setProperty('--outline-navigator-width', `${this.offsetWidth}px`)\r\n }\r\n\r\n if (isFunction(mounted)) {\r\n mounted.call(this)\r\n }\r\n\r\n if (count < 400) {\r\n this.onObserver()\r\n }\r\n\r\n return this\r\n }\r\n\r\n erase() {\r\n this.$list.innerHTML = ''\r\n\r\n return this\r\n }\r\n\r\n _paint(chapters) {\r\n const showCode = this.attr('showCode')\r\n const $el = this.$el\r\n const $list = this.$list\r\n\r\n _paintChapters($list, chapters, showCode)\r\n removeClass($el, HIDDEN)\r\n addClass($el, EXPANDED)\r\n\r\n return this\r\n }\r\n\r\n _remove() {\r\n this.$parentElement.removeChild(this.$el)\r\n return this\r\n }\r\n\r\n refresh(chapters) {\r\n const $el = this.$el\r\n\r\n removeClass($el, HIDDEN)\r\n this.erase()._paint(chapters)\r\n\r\n return this\r\n }\r\n\r\n _getPlaceholderOffset(index) {\r\n const $main = this.$main\r\n const $list = this.$list\r\n const $anchor = $list.querySelector('.outline-navigator__anchor')\r\n const mainPaddingTop = parseInt(getStyle($main, 'padding-top'), 10)\r\n const mainBorderTop = parseInt(getStyle($main, 'border-top-width'), 10)\r\n const placeholderPaddingTop = parseInt(getStyle($list, 'padding-top'), 10)\r\n const placeholderMarginTop = parseInt(getStyle($list, 'margin-top'), 10)\r\n const placeholderBorderTop = parseInt(\r\n getStyle($list, 'border-top-width'),\r\n 10\r\n )\r\n let height = $anchor.offsetHeight\r\n let offsetTop = 0\r\n let top\r\n\r\n if (mainPaddingTop) {\r\n offsetTop += mainPaddingTop\r\n }\r\n\r\n if (placeholderPaddingTop) {\r\n offsetTop += placeholderPaddingTop\r\n }\r\n\r\n if (placeholderMarginTop) {\r\n offsetTop += placeholderMarginTop\r\n }\r\n\r\n if (mainBorderTop) {\r\n offsetTop += mainBorderTop\r\n }\r\n\r\n if (placeholderBorderTop) {\r\n offsetTop += placeholderBorderTop\r\n }\r\n\r\n top = height * index\r\n\r\n return offsetTop + top\r\n }\r\n\r\n positionPlaceholder(index) {\r\n const $list = this.$list\r\n const $placeholder = this.$placeholder\r\n const $anchor = $list.querySelector('.outline-navigator__anchor')\r\n const animationCurrent = this.attr('animationCurrent')\r\n const height = $anchor.offsetHeight\r\n let offsetTop = 0\r\n\r\n if (!animationCurrent) {\r\n return this\r\n }\r\n\r\n offsetTop = this._getPlaceholderOffset(index)\r\n\r\n $placeholder.style.cssText = `transform: translateY(${offsetTop}px);height:${height}px;`\r\n\r\n return this\r\n }\r\n\r\n highlight(id) {\r\n const $el = this.$el\r\n const animationCurrent = this.attr('animationCurrent')\r\n const position = this.attr('position')\r\n const ACTIVE = 'outline-navigator_active'\r\n const HIGHLIGHT = 'outline-navigator_highlight'\r\n let $parent = position === 'relative' ? this.$parentElement : this.$main\r\n let $anchor = null\r\n let placeholderOffsetTop = 0\r\n\r\n if (!$el) {\r\n return this\r\n }\r\n\r\n $anchor = $el.querySelector(`#chapter__anchor-${id}`)\r\n\r\n if (!$anchor) {\r\n return this\r\n }\r\n\r\n this.active = parseInt($anchor.getAttribute('data-id'), 10)\r\n\r\n if (this.$active) {\r\n removeClass(this.$active, HIGHLIGHT)\r\n removeClass(this.$active, ACTIVE)\r\n }\r\n\r\n this.$active = $anchor\r\n addClass(this.$active, ACTIVE)\r\n\r\n if (animationCurrent) {\r\n this.positionPlaceholder(this.active)\r\n } else {\r\n addClass(this.$active, HIGHLIGHT)\r\n }\r\n\r\n later(() => {\r\n if (!inBounding(this.$active, $parent)) {\r\n placeholderOffsetTop = this._getPlaceholderOffset(this.active)\r\n scrollTo($parent, placeholderOffsetTop)\r\n }\r\n })\r\n\r\n return this\r\n }\r\n\r\n sticky() {\r\n const afterSticky = this.attr('afterSticky')\r\n const FIXED = 'outline-navigator_fixed'\r\n const $el = this.$el\r\n const top = this.offsetTop\r\n const scrollTop = this.$scrollElement.scrollTop\r\n let isStickying\r\n\r\n if (!this.isFixed()) {\r\n return this\r\n }\r\n\r\n isStickying = scrollTop >= top\r\n\r\n if (isStickying) {\r\n addClass($el, FIXED)\r\n } else {\r\n removeClass($el, FIXED)\r\n }\r\n\r\n if (isFunction(afterSticky)) {\r\n afterSticky.call(this, this.isClosed(), isStickying)\r\n }\r\n\r\n return this\r\n }\r\n\r\n calculateStickyHeight() {\r\n const documentElement = document.documentElement\r\n const height = Math.max(\r\n documentElement.clientHeight || 0,\r\n window.innerHeight || 0\r\n )\r\n setProperty('--outline-sticky-height', `${height}px`)\r\n return this\r\n }\r\n\r\n scrollTo(top, after) {\r\n const el = this.$scrollElement\r\n\r\n scrollTo(el, top, after)\r\n\r\n return this\r\n }\r\n\r\n show() {\r\n const opened = this.attr('afterOpened')\r\n const count = this.count()\r\n const $el = this.$el\r\n const $parent = this.$parentElement\r\n\r\n if (this.isInside()) {\r\n if (count > 800) {\r\n removeClass($parent, HIDDEN)\r\n } else {\r\n removeClass($parent, HIDDEN)\r\n later(() => {\r\n removeClass($parent, FOLDED)\r\n addClass($parent, EXPANDED)\r\n }, 30)\r\n }\r\n } else {\r\n removeClass($el, HIDDEN)\r\n }\r\n this.closed = false\r\n\r\n if (isFunction(opened)) {\r\n opened.call(this)\r\n }\r\n\r\n return this\r\n }\r\n\r\n hide() {\r\n const closed = this.attr('afterClosed')\r\n const count = this.count()\r\n const $el = this.$el\r\n const $parent = this.$parentElement\r\n\r\n if (this.isInside()) {\r\n if (count > 800) {\r\n addClass($parent, HIDDEN)\r\n } else {\r\n addClass($parent, FOLDED)\r\n removeClass($parent, EXPANDED)\r\n later(() => {\r\n addClass($parent, HIDDEN)\r\n })\r\n }\r\n } else {\r\n addClass($el, HIDDEN)\r\n }\r\n this.closed = true\r\n\r\n if (isFunction(closed)) {\r\n closed.call(this)\r\n }\r\n\r\n return this\r\n }\r\n\r\n toggle() {\r\n const afterToggle = this.attr('afterToggle')\r\n const top = this.offsetTop\r\n const scrollTop = this.$scrollElement.scrollTop\r\n let isStickying\r\n\r\n if (this.isClosed()) {\r\n this.show()\r\n } else {\r\n this.hide()\r\n }\r\n\r\n if (isFunction(afterToggle)) {\r\n later(() => {\r\n isStickying = scrollTop >= top\r\n afterToggle.call(this, this.isClosed(), isStickying)\r\n })\r\n }\r\n\r\n return this\r\n }\r\n\r\n destroy() {\r\n const beforeDestroy = this.attr('beforeDestroy')\r\n const afterDestroy = this.attr('afterDestroy')\r\n\r\n if (isFunction(beforeDestroy)) {\r\n beforeDestroy.call(this)\r\n }\r\n\r\n this.removeListeners()._remove()._default()\r\n\r\n if (this.scrollTimer) {\r\n clearTimeout(this.scrollTimer)\r\n this.scrollTimer = null\r\n }\r\n\r\n if (this.resizeTimer) {\r\n clearTimeout(this.resizeTimer)\r\n this.resizeTimer = null\r\n }\r\n\r\n if (this.observerTimer) {\r\n clearTimeout(this.observerTimer)\r\n this.observerTimer = null\r\n }\r\n\r\n if (this.Observer) {\r\n this.Observer = null\r\n }\r\n\r\n if (isFunction(afterDestroy)) {\r\n afterDestroy.call(this)\r\n }\r\n\r\n return this\r\n }\r\n\r\n onObserver() {\r\n const selector = this.attr('selector')\r\n\r\n this.Observer = intersection(\r\n ($heading) => {\r\n const id = $heading.getAttribute('data-id')\r\n\r\n if (this.playing) {\r\n return false\r\n }\r\n\r\n if (this.observerTimer) {\r\n clearTimeout(this.observerTimer)\r\n }\r\n\r\n this.observerTimer = later(() => {\r\n this.highlight(id)\r\n }, 100)\r\n },\r\n {\r\n selector,\r\n context: this\r\n }\r\n )\r\n\r\n return this\r\n }\r\n\r\n onSelect(evt) {\r\n const stickyHeight = this.attr('stickyHeight')\r\n const $anchor = evt.delegateTarget\r\n const id = $anchor.getAttribute('data-id')\r\n const headingId = $anchor.href.split('#')[1]\r\n const $heading = document.querySelector(`#${headingId}`)\r\n const top = offsetTop($heading) - (stickyHeight + 10)\r\n const min = 0\r\n const max = this.$scrollElement.scrollHeight\r\n const afterScroll = this.attr('afterScroll')\r\n const after = () => {\r\n if (isFunction(afterScroll)) {\r\n afterScroll.call(this, 'chapter')\r\n }\r\n\r\n later(() => {\r\n this.playing = false\r\n this.$emit('toolbar:update', {\r\n top,\r\n min,\r\n max\r\n })\r\n })\r\n }\r\n\r\n this.playing = true\r\n if (this.isFixed()) {\r\n this.sticky()\r\n later(() => {\r\n this.scrollTo(top, after)\r\n this.highlight(id)\r\n }, 10)\r\n } else {\r\n this.scrollTo(top, after)\r\n this.highlight(id)\r\n }\r\n\r\n stop(evt)\r\n\r\n return this\r\n }\r\n\r\n onScroll() {\r\n const $scrollElement = this.$scrollElement\r\n\r\n if (this.scrollTimer) {\r\n clearTimeout(this.scrollTimer)\r\n }\r\n\r\n this.scrollTimer = later(() => {\r\n const top = $scrollElement.scrollTop\r\n const min = 0\r\n const max = $scrollElement.scrollHeight - $scrollElement.clientHeight\r\n\r\n if (this.isFixed()) {\r\n this.sticky()\r\n }\r\n\r\n this.$emit('toolbar:update', {\r\n top,\r\n min,\r\n max\r\n })\r\n }, 100)\r\n\r\n return this\r\n }\r\n\r\n onResize() {\r\n // 添加判断\r\n if (!this.isSticky()) {\r\n return this\r\n }\r\n\r\n if (this.resizeTimer) {\r\n clearTimeout(this.resizeTimer)\r\n }\r\n\r\n this.resizeTimer = later(() => {\r\n this.calculateStickyHeight()\r\n })\r\n\r\n return this\r\n }\r\n\r\n onRefresh(chapters) {\r\n this.refresh(chapters)\r\n\r\n return this\r\n }\r\n\r\n addListeners() {\r\n const $el = this.$el\r\n const $scrollElement = this.$scrollElement\r\n const tagName = $scrollElement.tagName.toLowerCase()\r\n let $element = $scrollElement\r\n\r\n if (this.count() < 1) {\r\n return this\r\n }\r\n\r\n if (tagName === 'html' || tagName === 'body') {\r\n $element = window\r\n }\r\n\r\n on($el, '.outline-navigator__anchor', 'click', this.onSelect, this, true)\r\n at($element, 'scroll', this.onScroll, this, true)\r\n if (this.isSticky()) {\r\n at(window, 'resize', this.onResize, this, true)\r\n }\r\n\r\n this.$on('anchors:all:paint', this.onObserver, this)\r\n this.$on('navigator:refresh', this.onRefresh, this)\r\n\r\n return this\r\n }\r\n\r\n removeListeners() {\r\n const selector = this.attr('selector')\r\n const $el = this.$el\r\n const $scrollElement = this.$scrollElement\r\n const tagName = $scrollElement.tagName.toLowerCase()\r\n let $element = $scrollElement\r\n\r\n if (this.count() < 1) {\r\n return this\r\n }\r\n\r\n if (tagName === 'html' || tagName === 'body') {\r\n $element = window\r\n }\r\n\r\n off($el, 'click', this.onSelect)\r\n off($element, 'scroll', this.onScroll)\r\n if (this.isSticky()) {\r\n off(window, 'resize', this.onResize)\r\n }\r\n this.$off('anchors:all:paint')\r\n this.$off('navigator:refresh')\r\n\r\n if (this.Observer) {\r\n document.querySelectorAll(selector).forEach((section) => {\r\n this.Observer.unobserve(section)\r\n })\r\n }\r\n\r\n return this\r\n }\r\n}\r\n\r\nNavigator.DEFAULTS = (() => {\r\n const OPTIONS = {\r\n parentElement: '',\r\n scrollElement: '',\r\n selector: '.outline-heading',\r\n active: 0,\r\n closed: false,\r\n showCode: true,\r\n animationCurrent: true,\r\n position: 'relative',\r\n stickyHeight: 0,\r\n chapters: [],\r\n created: null,\r\n mounted: null,\r\n afterClosed: null,\r\n afterOpened: null,\r\n afterScroll: null,\r\n beforeDestroy: null,\r\n afterDestroy: null,\r\n afterSticky: null\r\n }\r\n\r\n return cloneDeep(OPTIONS)\r\n})()\r\n\r\nexport default Navigator\r\n","import isElement from '../types/isElement'\r\n\r\n/**\r\n * 检测某个 DOM 节点的位置是否在另个一个 DOM 节点范围内\r\n * ========================================================================\r\n * @method inBounding\r\n * @param {HTMLElement} child\r\n * @param {HTMLElement} parent\r\n * @return {Boolean}\r\n */\r\nconst inBounding = (child, parent) => {\r\n let isInBounding = false\r\n let parentRect\r\n let childRect\r\n\r\n if (!isElement(child) || !isElement(parent)) {\r\n return isInBounding\r\n }\r\n\r\n parentRect = parent.getBoundingClientRect()\r\n childRect = child.getBoundingClientRect()\r\n\r\n isInBounding = !!(\r\n childRect.top >= parentRect.top &&\r\n childRect.right <= parentRect.right &&\r\n childRect.bottom <= parentRect.bottom &&\r\n childRect.left >= parentRect.left\r\n )\r\n\r\n return isInBounding\r\n}\r\n\r\nexport default inBounding\r\n","import isFunction from '../types/isFunction'\r\nimport isElement from '../types/isElement'\r\n\r\n/**\r\n * 通用的 IntersectionObserver 观察者处理器\r\n * ========================================================================\r\n * @method intersection\r\n * @param {Function} fn\r\n * @param {Object} [props]\r\n * @param {Object|HTMLElement} [props.root]\r\n * @param {String} [props.selector]\r\n * @param {Object} [props.context]\r\n * @param {String} [props.attr]\r\n * @param {String} [props.rootMargin]\r\n */\r\nconst intersection = (fn, props = {}) => {\r\n const root = props.root || null\r\n const selector = props.selector || '.outline-heading'\r\n const context = props.context || null\r\n const rootMargin = props.rootMargin || '0px 0px -90% 0px'\r\n const options = {\r\n rootMargin: rootMargin\r\n }\r\n // eslint-disable-next-line compat/compat\r\n const Observer = new IntersectionObserver((entries) => {\r\n entries.forEach((entry) => {\r\n if (entry.intersectionRatio > 0) {\r\n if (isFunction(fn)) {\r\n fn.call(context || entry.target, entry.target)\r\n }\r\n }\r\n })\r\n }, options)\r\n const $root = isElement(root) ? root : document\r\n\r\n if (root) {\r\n options.root = root\r\n }\r\n\r\n $root.querySelectorAll(selector).forEach((section) => {\r\n Observer.observe(section)\r\n })\r\n\r\n return Observer\r\n}\r\n\r\nexport default intersection\r\n","/**\r\n * 停止事件(阻止默认行为和阻止事件的捕获或冒泡)\r\n * ========================================================================\r\n * @method stop\r\n * @param {Event} evt - 事件对象\r\n *\r\n * @example\r\n *
\r\n * Service\r\n * Help\r\n *
\r\n *\r\n * const $nav = document.querySelector('#nav')\r\n * const $service = document.querySelector('.anchor')\r\n *\r\n * on($nav, 'click', function(evt) {\r\n * console.log('你点击了导航栏')\r\n * })\r\n *\r\n * on($anchor, 'click', function(evt) {\r\n * console.log('tagName', this.tagName)\r\n *\r\n * // 工作台输出:'a'\r\n * // 不会触发事件冒泡,输出:'你点击了导航栏'\r\n * // 也不会切换到 href 属性的页面,阻止了点击链接的默认行为\r\n * stopEvent(evt)\r\n * })\r\n */\r\nconst stop = function (evt) {\r\n evt.stopPropagation()\r\n evt.preventDefault()\r\n}\r\n\r\nexport default stop\r\n"],"names":["isString","str","toString","val","Object","prototype","apply","isFunction","isObject","o","isElement","nodeName","tagName","nodeType","later","fn","delay","setTimeout","CAPTURE_EVENTS","_off","el","type","capture","indexOf","_delegateListener","listeners","_listeners","index","length","forEach","listener","i","handler","splice","_delete","removeEventListener","purgeElement","recurse","$element","document","querySelector","$children","childNodes","getListeners","filter","arguments","$child","off","at","data","context","once","evt","overrideContext","call","push","addEventListener","matches","selector","sel","replace","msMatchesSelector","getParentOrHost","host","parentNode","on","target","getTarget","delegateTarget","closest","ctx","includeCTX","startsWith","isArray","Array","isDOM","isHTMLCollection","fragment","isTextNode","hasOwn","obj","prop","hasOwnProperty","hasClass","className","pattern","RegExp","allClass","classList","contains","exec","addClass","_classList","add","split","name","setAttributes","attrs","keys","attr","value","setAttribute","toLowerCase","style","cssText","innerHTML","innerText","createElement","children","$fragment","createDocumentFragment","$el","isValidChild","child","append","createTextNode","appendChild","every","easeInQuad","x","_getScrollElement","scrollElement","$rootElements","$scrollElement","querySelectorAll","scrollTop","scrollTo","top","afterStop","step","distance","MAX_HEIGHT","scrollHeight","MAX_TOP","stop","play","console","log","requestAnimationFrame","removeClass","remove","offsetTop","offsetParent","getStyle","ruleName","getComputedStyle","setProperty","documentElement","cloneDeep","clone","from","assign","key","queue","isHandling","done","runIdle","idleDeadline","timeRemaining","shift","requestIdleCallback","window","cb","start","Date","now","didTimeout","Math","max","cancelIdleCallback","id","clearTimeout","timeSlice","afterComplete","_paintChapters","$list","chapters","showCode","count","clones","_maybeArrayLike","_toConsumableArray","paint","parts","byId","chapter","pid","code","rel","$text","text","$link","$code","$li","$subject","$chapter","href","_subscribers","_hasDirectSubscribersFor","topic","has","isDirect","found","position","lastIndexOf","substring","_hasSubscribers","emit","async","execute","subscriber","message","callback","deliver","guid","uuid","prefix","_removeSubscriber","token","subject","execution","j","_removeSubscriberByToken","Base","constructor","options","this","initialize","render","addListeners","origin","source","extend","refresh","destroy","removeListeners","reload","$emit","event","publish","$on","subscribe","$off","unsubscribe","HIDDEN","EXPANDED","FOLDED","Navigator","super","_default","scrollTimer","resizeTimer","observerTimer","Observer","DEFAULTS","$title","$main","$placeholder","$parentElement","$active","active","offsetWidth","playing","closed","created","parentElement","$parent","isClosed","isSticky","isFixed","isInside","isOutside","_paintEdge","title","animationCurrent","customClass","contents","calculateStickyHeight","mounted","_paint","highlight","sticky","onObserver","erase","_remove","removeChild","_getPlaceholderOffset","$anchor","mainPaddingTop","parseInt","mainBorderTop","placeholderPaddingTop","placeholderMarginTop","placeholderBorderTop","offsetHeight","positionPlaceholder","height","ACTIVE","HIGHLIGHT","placeholderOffsetTop","getAttribute","inBounding","parent","parentRect","childRect","isInBounding","getBoundingClientRect","right","bottom","left","afterSticky","FIXED","isStickying","clientHeight","innerHeight","after","show","opened","hide","toggle","afterToggle","beforeDestroy","afterDestroy","intersection","props","root","rootMargin","IntersectionObserver","entries","entry","intersectionRatio","$root","section","observe","$heading","onSelect","stickyHeight","headingId","afterScroll","min","stopPropagation","preventDefault","onScroll","onResize","onRefresh","unobserve","afterClosed","afterOpened"],"mappings":"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"} \ No newline at end of file diff --git a/navigator/navigator.css b/navigator/navigator.css new file mode 100644 index 00000000..1d5f3431 --- /dev/null +++ b/navigator/navigator.css @@ -0,0 +1 @@ +:root{--outline-zIndex:2000;--outline-sticky-height:100%;--outline-navigator-width:100%}.outline-navigator{margin:0;overflow:auto;position:relative;width:var(--outline-navigator-width);z-index:1}.outline-navigator-parent{transition:.3s ease-in-out}.outline-navigator__title{border-bottom:1px solid #dcdfe6;font-size:16px;font-weight:400;height:40px;line-height:40px;margin:0 16px;overflow:hidden;padding:0 16px}.outline-navigator__main{margin:0;overflow:hidden;position:relative;z-index:1}.outline-navigator__item,.outline-navigator__list,.outline-navigator__subject{list-style-type:none;margin:0;overflow:hidden;padding:0;position:relative;z-index:2}.outline-navigator__list{padding:.5em 0}.outline-navigator__subject{padding-left:1em}.outline-navigator__item{font-size:13px;line-height:30px;margin:0;overflow:hidden}.outline-navigator__placeholder{background-color:#f7f8f9;border-left:2px solid #058942;box-sizing:border-box;height:30px;left:0;overflow:hidden;position:absolute;top:0;transition-duration:.2s;width:100%;z-index:1}.outline-navigator__anchor{display:block;overflow:hidden;padding:0 1.5em;text-overflow:ellipsis;white-space:nowrap}.outline-navigator__anchor:hover,.outline-navigator__anchor:link,.outline-navigator__anchor:visited{color:#555;text-decoration:none}.outline-navigator__anchor:hover{color:#058942}.outline-navigator__code{padding-right:.5em}.outline-navigator_highlight.outline-navigator__anchor:hover,.outline-navigator_highlight.outline-navigator__anchor:link,.outline-navigator_highlight.outline-navigator__anchor:visited{color:#058942;font-weight:700}.outline-navigator_fixed,.outline-navigator_sticky{display:flex;flex-direction:column;flex-wrap:nowrap;overflow:hidden;top:0;z-index:var(--outline-zIndex)}.outline-navigator_fixed .outline-navigator__main,.outline-navigator_fixed .outline-navigator__title,.outline-navigator_sticky .outline-navigator__main,.outline-navigator_sticky .outline-navigator__title{box-sizing:border-box}.outline-navigator_fixed .outline-navigator__title,.outline-navigator_sticky .outline-navigator__title{flex-shrink:0}.outline-navigator_fixed .outline-navigator__main,.outline-navigator_sticky .outline-navigator__main{flex:1;overflow:auto}.outline-navigator_sticky{max-height:var(--outline-sticky-height);position:sticky}.outline-navigator_fixed{max-height:100%;position:fixed}.outline-navigator_hidden{display:none}.outline-navigator_folded{overflow:hidden;width:0} \ No newline at end of file diff --git a/navigator.js b/navigator/navigator.js similarity index 93% rename from navigator.js rename to navigator/navigator.js index 5a1b373a..4d6f7150 100644 --- a/navigator.js +++ b/navigator/navigator.js @@ -1,32 +1,36 @@ -import isString from './utils/types/isString' -import isFunction from './utils/types/isFunction' -import isElement from './utils/types/isElement' -import later from './utils/lang/later' -import at from './utils/event/at' -import on from './utils/event/on' -import off from './utils/event/off' -import stop from './utils/event/stop' -import createElement from './utils/dom/createElement' -import scrollTo from './utils/dom/scrollTo' -import addClass from './utils/dom/addClass' -import intersection from './utils/dom/intersection' -import removeClass from './utils/dom/removeClass' -import offsetTop from './utils/dom/offsetTop' -import getStyle from './utils/dom/getStyle' -import setProperty from './utils/dom/setProperty' -import _getScrollElement from './utils/dom/_getScrollElement' -import cloneDeep from './utils/lang/cloneDeep' - -import _paintChapters from './_paintChapters' -import inBounding from './utils/dom/inBounding' - -import Base from './base' +import isString from '@/utils/types/isString' +import isFunction from '@/utils/types/isFunction' +import isElement from '@/utils/types/isElement' +import later from '@/utils/lang/later' +import cloneDeep from '@/utils/lang/cloneDeep' + +import at from '@/utils/event/at' +import on from '@/utils/event/on' +import off from '@/utils/event/off' +import stop from '@/utils/event/stop' + +import createElement from '@/utils/dom/createElement' +import scrollTo from '@/utils/dom/scrollTo' +import addClass from '@/utils/dom/addClass' +import intersection from '@/utils/dom/intersection' +import removeClass from '@/utils/dom/removeClass' +import offsetTop from '@/utils/dom/offsetTop' +import getStyle from '@/utils/dom/getStyle' +import setProperty from '@/utils/dom/setProperty' +import inBounding from '@/utils/dom/inBounding' +import getScrollElement from '@/utils/dom/getScrollElement' + +import Component from '@/component' + +import _paintChapters from './utils/_paintChapters' + +import './navigator.less' const HIDDEN = 'outline-navigator_hidden' const EXPANDED = 'outline-navigator_expanded' const FOLDED = 'outline-navigator_folded' -class Navigator extends Base { +class Navigator extends Component { constructor(options) { super() @@ -82,7 +86,7 @@ class Navigator extends Base { $parent = parentElement } this.$parentElement = $parent - this.$scrollElement = _getScrollElement(scrollElement) + this.$scrollElement = getScrollElement(scrollElement) this.chapters = this.attr('chapters') this.closed = this.attr('closed') diff --git a/navigator/navigator.less b/navigator/navigator.less new file mode 100644 index 00000000..00e94e27 --- /dev/null +++ b/navigator/navigator.less @@ -0,0 +1,150 @@ +@import '../theme/variables'; +@import '../theme/colors'; +@import '../theme/ellipsis'; + +.outline-navigator { + position: relative; + z-index: 1; + margin: 0; + width: var(--outline-navigator-width); + overflow: auto; + + &-parent { + transition: 0.3s ease-in-out; + } + + &__title { + margin: 0 16px; + height: 40px; + line-height: 40px; + padding: 0 16px; + border-bottom: 1px solid @primary_border_color; + font-size: 16px; + font-weight: 400; + overflow: hidden; + } + + &__main { + position: relative; + z-index: 1; + margin: 0; + overflow: hidden; + } + + &__list, + &__subject, + &__item { + position: relative; + z-index: 2; + margin: 0; + padding: 0; + list-style-type: none; + overflow: hidden; + } + + &__list { + padding: 0.5em 0; + } + + &__subject { + padding-left: 1em; + } + + &__item { + margin: 0; + line-height: 30px; + font-size: 13px; + overflow: hidden; + } + + &__placeholder { + position: absolute; + z-index: 1; + top: 0; + left: 0; + width: 100%; + height: 30px; + background-color: @hover_bg_color; + border-left: 2px solid @success_color; + transition-duration: 0.2s; + box-sizing: border-box; + overflow: hidden; + } + + &__anchor { + .ellipsis(1); + display: block; + padding: 0 1.5em; + + &:link, + &:visited, + &:hover { + text-decoration: none; + color: @secondary_text_color; + } + + &:hover { + color: @success_color; + } + } + + &__code { + padding-right: 0.5em; + } + + &_highlight { + &.outline-navigator__anchor { + &:link, + &:visited, + &:hover { + color: @success_color; + font-weight: bold; + } + } + } + + &_sticky, + &_fixed { + display: flex; + flex-wrap: nowrap; + flex-direction: column; + z-index: var(--outline-zIndex); + top: 0; + overflow: hidden; + + .outline-navigator { + &__title, + &__main { + box-sizing: border-box; + } + + &__title { + flex-shrink: 0; + } + + &__main { + flex: 1; + overflow: auto; + } + } + } + + &_sticky { + position: sticky; + max-height: var(--outline-sticky-height); + } + + &_fixed { + position: fixed; + max-height: 100%; + } + + &_hidden { + display: none; + } + + &_folded { + width: 0; + overflow: hidden; + } +} diff --git a/navigator/navigator.min.css b/navigator/navigator.min.css new file mode 100644 index 00000000..1ac95e1f --- /dev/null +++ b/navigator/navigator.min.css @@ -0,0 +1,6 @@ +.outline-heading{overflow:hidden;position:relative;z-index:1}.outline-heading__anchor{display:none}.outline-heading__anchor:hover,.outline-heading__anchor:link,.outline-heading__anchor:visited{color:#999;text-decoration:none}.outline-heading__anchor:hover{color:#507afe}.outline-heading:hover .outline-heading__anchor{display:inline-block}.outline-heading_start:hover{overflow:visible}.outline-heading_start .outline-heading__anchor{left:-1em;position:absolute;top:50%;transform:translateY(-50%);z-index:2} +:root{--outline-zIndex:2000;--outline-sticky-height:100%;--outline-navigator-width:100%}.outline-drawer{box-sizing:border-box;height:100%;left:0;margin:0;overflow:hidden;position:relative;top:0;visibility:hidden;width:100%;z-index:-1}.outline-drawer__modal{background-color:#fff;box-shadow:0 0 6px 1px #dcdfe6;display:flex;flex-direction:column;flex-wrap:nowrap;height:100%;overflow:hidden;position:absolute;transition-duration:.4s;z-index:21}.outline-drawer__footer,.outline-drawer__header,.outline-drawer__main{box-sizing:border-box;width:100%}.outline-drawer__footer,.outline-drawer__header{flex-shrink:0}.outline-drawer__footer,.outline-drawer__main,.outline-drawer__title{padding:0 16px}.outline-drawer__header,.outline-drawer__title{height:52px;line-height:52px;margin:0 auto;overflow:hidden;position:relative;z-index:1}.outline-drawer__title{border-bottom:1px solid #dcdfe6;box-sizing:border-box;font-size:16px;font-weight:400;margin:0 16px}.outline-drawer__close{color:#999;cursor:pointer;font-size:20px;height:20px;line-height:20px;overflow:hidden;position:absolute;right:12px;text-align:center;top:50%;transform:translateY(-50%);width:20px;z-index:2}.outline-drawer__close .outline-icon{left:0;position:absolute;top:0;z-index:2}.outline-drawer__close:hover{color:#666}.outline-drawer__main{flex:1;overflow:auto}.outline-drawer__main.overflow-hidden{overflow:hidden}.outline-drawer__footer{margin:0 auto;overflow:hidden;text-align:right}.outline-drawer__overlay{background-color:#fff;content:"";height:100%;left:0;opacity:.1;overflow:hidden;position:relative;top:0;width:100%;z-index:1}.outline-drawer_ltr.outline-drawer_tiny,.outline-drawer_rtl.outline-drawer_tiny{width:280px}.outline-drawer_ltr.outline-drawer_mini,.outline-drawer_rtl.outline-drawer_mini{width:480px}.outline-drawer_ltr.outline-drawer_small,.outline-drawer_rtl.outline-drawer_small{width:540px}.outline-drawer_ltr.outline-drawer_regular,.outline-drawer_rtl.outline-drawer_regular{width:680px}.outline-drawer_ltr.outline-drawer_medium,.outline-drawer_rtl.outline-drawer_medium{width:720px}.outline-drawer_ltr.outline-drawer_large,.outline-drawer_rtl.outline-drawer_large{width:960px}.outline-drawer_rtl{border-left:1px solid #dcdfe6}.outline-drawer_rtl.outline-drawer_tiny.outline-drawer_closed{right:-290px}.outline-drawer_rtl.outline-drawer_mini.outline-drawer_closed{right:-490px}.outline-drawer_rtl.outline-drawer_small.outline-drawer_closed{right:-550px}.outline-drawer_rtl.outline-drawer_regular.outline-drawer_closed{right:-690px}.outline-drawer_rtl.outline-drawer_medium.outline-drawer_closed{right:-730px}.outline-drawer_rtl.outline-drawer_large.outline-drawer_closed{right:-970px}.outline-drawer_ltr{border-right:1px solid #dcdfe6}.outline-drawer_ltr.outline-drawer_tiny.outline-drawer_closed{left:-290px}.outline-drawer_ltr.outline-drawer_mini.outline-drawer_closed{left:-490px}.outline-drawer_ltr.outline-drawer_small.outline-drawer_closed{left:-550px}.outline-drawer_ltr.outline-drawer_regular.outline-drawer_closed{left:-690px}.outline-drawer_ltr.outline-drawer_medium.outline-drawer_closed{left:-730px}.outline-drawer_ltr.outline-drawer_large.outline-drawer_closed{left:-970px}.outline-drawer_btt,.outline-drawer_ttb{left:0;width:100%}.outline-drawer_btt.outline-drawer_tiny,.outline-drawer_ttb.outline-drawer_tiny{height:240px}.outline-drawer_btt.outline-drawer_mini,.outline-drawer_ttb.outline-drawer_mini{height:320px}.outline-drawer_btt.outline-drawer_small,.outline-drawer_ttb.outline-drawer_small{height:360px}.outline-drawer_btt.outline-drawer_regular,.outline-drawer_ttb.outline-drawer_regular{height:400px}.outline-drawer_btt.outline-drawer_medium,.outline-drawer_ttb.outline-drawer_medium{height:440px}.outline-drawer_btt.outline-drawer_large,.outline-drawer_ttb.outline-drawer_large{height:480px}.outline-drawer_ttb{border-bottom:1px solid #dcdfe6}.outline-drawer_ttb.outline-drawer_tiny.outline-drawer_closed{top:-250px}.outline-drawer_ttb.outline-drawer_mini.outline-drawer_closed{top:-330px}.outline-drawer_ttb.outline-drawer_small.outline-drawer_closed{top:-370px}.outline-drawer_ttb.outline-drawer_regular.outline-drawer_closed{top:-410px}.outline-drawer_ttb.outline-drawer_medium.outline-drawer_closed{top:-450px}.outline-drawer_ttb.outline-drawer_large.outline-drawer_closed{top:-490px}.outline-drawer_btt{border-top:1px solid #dcdfe6;top:auto}.outline-drawer_btt.outline-drawer_tiny.outline-drawer_closed{bottom:-250px}.outline-drawer_btt.outline-drawer_mini.outline-drawer_closed{bottom:-330px}.outline-drawer_btt.outline-drawer_small.outline-drawer_closed{bottom:-370px}.outline-drawer_btt.outline-drawer_regular.outline-drawer_closed{bottom:-410px}.outline-drawer_btt.outline-drawer_medium.outline-drawer_closed{bottom:-450px}.outline-drawer_btt.outline-drawer_large.outline-drawer_closed{bottom:-490px}.outline-drawer_opened{visibility:visible;z-index:var(--outline-zIndex)}.outline-drawer_opened.outline-drawer{position:fixed}.outline-drawer_opened.outline-drawer_rtl{right:0}.outline-drawer_opened.outline-drawer_ltr{left:0}.outline-drawer_opened.outline-drawer_ttb{top:0}.outline-drawer_opened.outline-drawer_btt{bottom:0}.outline-drawer_offset.outline-drawer_ltr,.outline-drawer_offset.outline-drawer_rtl{height:calc(100% - 4em);top:50%;transform:translateY(-50%)}.outline-drawer_offset.outline-drawer_btt,.outline-drawer_offset.outline-drawer_ttb{left:50%;transform:translateX(-50%);width:calc(100% - 4em)}.outline-drawer_offset.outline-drawer_opened.outline-drawer_rtl{right:2em}.outline-drawer_offset.outline-drawer_opened.outline-drawer_ltr{left:2em}.outline-drawer_offset.outline-drawer_opened.outline-drawer_ttb{top:2em}.outline-drawer_offset.outline-drawer_opened.outline-drawer_btt{bottom:2em}.outline-drawer_auto.outline-drawer_ltr,.outline-drawer_auto.outline-drawer_rtl{height:auto;max-height:calc(100% - 4em)}.outline-drawer_full{padding:0} +.outline-toolbar{margin:0;overflow:hidden;position:fixed;transition-duration:.3s;z-index:99999}.outline-toolbar__button{background-color:#fff;border:1px solid #dcdfe6;border-radius:3px;box-shadow:0 0 6px 1px #dcdfe6;box-sizing:border-box;color:#999;cursor:pointer;height:36px;margin:10px;overflow:hidden;position:relative;text-align:center;transition:all .3s ease-in-out .1s;width:36px;z-index:1}.outline-toolbar__button:hover{border-color:#058942;color:#058942;transform:scale(1.35)}.outline-toolbar__button.hide{display:none}.outline-toolbar__anchor:hover,.outline-toolbar__anchor:link,.outline-toolbar__anchor:visited{color:#999;text-decoration:none}.outline-toolbar__anchor:hover{color:#058942}.outline-toolbar__icon{height:20px;left:50%;position:absolute;top:50%;transform:translate(-50%,-50%);width:20px;z-index:2;fill:currentcolor;overflow:hidden}.outline-toolbar_active.outline-toolbar__button{background-color:#058942;border-color:#058942;color:#fff}.outline-toolbar_active.outline-toolbar__button:hover{color:#fff}.outline-toolbar_active .outline-toolbar__anchor:hover,.outline-toolbar_active .outline-toolbar__anchor:link,.outline-toolbar_active .outline-toolbar__anchor:visited{color:#fff}.outline-toolbar_rounded.outline-toolbar__button{border-radius:18px}.outline-toolbar_disabled .outline-toolbar__anchor:hover,.outline-toolbar_disabled .outline-toolbar__anchor:link,.outline-toolbar_disabled .outline-toolbar__anchor:visited,.outline-toolbar_disabled .outline-toolbar__button,.outline-toolbar_disabled.outline-toolbar__anchor:hover,.outline-toolbar_disabled.outline-toolbar__anchor:link,.outline-toolbar_disabled.outline-toolbar__anchor:visited,.outline-toolbar_disabled.outline-toolbar__button{border-color:#999;color:#999;cursor:not-allowed}.outline-toolbar_disabled .outline-toolbar__anchor:hover:hover,.outline-toolbar_disabled .outline-toolbar__anchor:link:hover,.outline-toolbar_disabled .outline-toolbar__anchor:visited:hover,.outline-toolbar_disabled .outline-toolbar__button:hover,.outline-toolbar_disabled.outline-toolbar__anchor:hover:hover,.outline-toolbar_disabled.outline-toolbar__anchor:link:hover,.outline-toolbar_disabled.outline-toolbar__anchor:visited:hover,.outline-toolbar_disabled.outline-toolbar__button:hover{border-color:#999;color:#999}.outline-toolbar_disabled .outline-toolbar__button,.outline-toolbar_disabled.outline-toolbar__button{background-color:#f5f5f5}.outline-toolbar_btt,.outline-toolbar_ttb{left:50%;transform:translateX(-50%)}.outline-toolbar_btt .outline-toolbar__button,.outline-toolbar_ttb .outline-toolbar__button{display:inline-block}.outline-toolbar_ttb{top:12px}.outline-toolbar_ttb.outline-toolbar_hidden{top:-56px}.outline-toolbar_btt{bottom:12px}.outline-toolbar_btt.outline-toolbar_hidden{bottom:-56px}.outline-toolbar_ltr,.outline-toolbar_rtl{transform:translateY(-50%);width:56px}.outline-toolbar_rtl{right:12px;top:50%}.outline-toolbar_rtl.outline-toolbar_hidden{right:-86px}.outline-toolbar_ltr{left:12px;top:50%}.outline-toolbar_ltr.outline-toolbar_hidden{left:-86px}.outline-toolbar_btt .outline-toolbar__button.outline-toolbar_hidden,.outline-toolbar_ltr .outline-toolbar__button.outline-toolbar_hidden,.outline-toolbar_rtl .outline-toolbar__button.outline-toolbar_hidden,.outline-toolbar_ttb .outline-toolbar__button.outline-toolbar_hidden{display:none} +.outline-reader__progress{animation:outline-reader-progress linear;background-color:#507afe;height:4px;left:0;position:fixed;scale:0 1;top:0;transform-origin:left;width:100%;z-index:3;animation-timeline:--ProgressTimeline}.outline-reader__paper{background-color:#fff;box-shadow:0 0 6px 1px #ddd;box-sizing:border-box;margin:2em auto;max-width:1200px;overflow:hidden;padding:3.2em}.outline-reader__title{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Helvetica Neue,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Helvetica,Arial,sans-serif;font-size:4.2em;font-weight:400;line-height:1.3em;margin:.67em 0;overflow:hidden;text-align:center}.outline-reader__article .outline-reader__progress,.outline-reader_hidden{display:none}.outline-reader_hidden.outline-reader_sibling{display:none!important}.outline-reader_hidden.outline-reader_sibling.wrapper.post{display:none}.outline-reader--reading{background-color:#fafafa;box-sizing:border-box;display:block;height:100%;left:0;margin:0;padding:3em 4em;position:fixed;top:0;width:100%;z-index:2;scroll-timeline-name:--ProgressTimeline;overflow:scroll}@keyframes outline-reader-progress{to{scale:1 1}}@media (max-width:500px){.outline-reader{overflow:hidden}.outline-reader .outline-toolbar{align-items:center;align-self:auto;background-color:#fff;border-top:1px solid #ddd;box-sizing:border-box;display:flex;flex-direction:row;flex-wrap:nowrap;height:48px;padding:0 16px;right:0;top:100%;transform:translateY(-48px);width:100%}.outline-reader .outline-toolbar__button{border:none;border-radius:0;box-shadow:none;flex:1}.outline-reader--reading{background-color:#fff;box-sizing:border-box;padding:0}.outline-reader__paper{box-shadow:none;height:100%;margin:0;overflow:hidden;padding:0;position:relative;z-index:1}.outline-reader__title{background-color:#fff;border-bottom:1px solid #ddd;font-size:1.8em;font-weight:400;height:48px;left:0;line-height:48px;margin:0;overflow:hidden;position:absolute;text-overflow:ellipsis;top:0;white-space:nowrap;width:100%;z-index:3}.outline-reader__article{height:calc(100% - 96px);margin:48px 0;padding:0 1.25em;scroll-timeline-name:--MobileProgressTimeline;overflow-x:hidden;overflow-y:scroll}.outline-reader__article .outline-reader__progress{animation:outline-reader-progress linear;z-index:4;animation-timeline:--MobileProgressTimeline;display:block}}@media print{body,html{background-color:#fff;color:#333;font-size:12pt;height:auto!important}a:hover,a:link,a:visited{color:#507afe;text-decoration:underline!important}audio,video{display:none!important}table{border-collapse:collapse;width:100%}td,th{border:1px solid #dcdfe6;padding:8px 20px}.outline-message,.outline-toolbar{display:none!important}.outline-reader{display:block!important;overflow:hidden}.outline-reader__title{font-size:32pt!important;margin:13.4pt 0 28pt!important;text-align:center!important}.outline-reader--reading{background-color:#fff;height:auto!important;overflow:hidden!important;padding:0!important;position:relative!important}.outline-reader__progress{display:none!important}.outline-reader__paper{box-shadow:none}.outline-reader pre{border:1px solid #ddd!important;border-radius:4px!important;padding:1em!important}.outline-reader code,.outline-reader pre{background-color:#fff!important}.outline-reader img,.outline-reader svg,.outline-reader table{break-inside:avoid}.outline-reader_sibling{display:none!important}} +.outline-icon{display:inline-block;position:relative;vertical-align:middle;z-index:1}.outline-icon,.outline-icon__svg{height:1em;overflow:hidden;width:1em}.outline-icon__svg{left:50%;position:absolute;top:50%;z-index:2;fill:currentcolor;transform:translate(-50%,-50%)}.outline-icon_hidden{display:none}.outline-message{background-color:#fff;border-radius:3px;box-shadow:0 0 6px 1px #dcdfe6;left:50%;opacity:.1;padding:0 50px;position:fixed;top:-50px;transform:translateX(-50%);transition:all .5s ease-in-out;z-index:9999}.outline-message,.outline-message__content{color:#666;font-size:13px;height:40px;line-height:40px;margin:0;overflow:hidden}.outline-message__content{max-width:700px;text-overflow:ellipsis;white-space:nowrap}.outline-message__close,.outline-message__icon{height:40px;line-height:40px;overflow:hidden;position:absolute;text-align:center;top:0;width:40px;z-index:2}.outline-message__icon{color:#fff;left:0}.outline-message__icon .outline-icon{left:50%;position:absolute;top:50%;transform:translate(-50%,-50%);z-index:2}.outline-message__close{color:#999;cursor:pointer;right:0}.outline-message__close .outline-icon{left:50%;position:absolute;top:50%;transform:translate(-50%,-50%);z-index:2}.outline-message__close:hover{color:#666}.outline-message_info .outline-message__icon{background-color:#507afe}.outline-message_warning .outline-message__icon{background-color:#ff9901}.outline-message_success .outline-message__icon{background-color:#058942}.outline-message_error .outline-message__icon{background-color:#ff5d5d}.outline-message_plain{min-width:190px;padding:0 50px 0 15px}.outline-message_plain.outline-message_info{background-color:#ecf8ff;border-left:5px solid #507afe}.outline-message_plain.outline-message_warning{background-color:#fffbe6;border-left:5px solid #ff9901}.outline-message_plain.outline-message_success{background-color:#e1f6eb;border-left:5px solid #058942}.outline-message_plain.outline-message_error{background-color:#fff1f0;border-left:5px solid #ff5d5d}.outline-message_plain .outline-message__icon{display:none;width:0}.outline-message_plain .outline-message__icon .outline-icon{display:none}.outline-message_light{min-width:180px;padding:0 40px}.outline-message_light.outline-message_info .outline-message__icon{color:#507afe}.outline-message_light.outline-message_warning .outline-message__icon{color:#ff9901}.outline-message_light.outline-message_success .outline-message__icon{color:#058942}.outline-message_light.outline-message_error .outline-message__icon{color:#ff5d5d}.outline-message_light .outline-message__icon{background-color:#fff}.outline-message_round{border-radius:20px}.outline-message_round.outline-message_default{min-width:180px;padding:0 40px}.outline-message_round.outline-message_default .outline-message__icon{border-radius:10px;height:20px;left:10px;line-height:20px;top:10px;width:20px}.outline-message_round.outline-message_default.outline-message_full-width{min-width:200px;padding:0 20px 0 40px}.outline-message_round.outline-message_plain{min-width:195px;padding:0 40px 0 20px}.outline-message_round.outline-message_plain.outline-message_full-width{min-width:215px;padding:0 20px}.outline-message_full-width{min-width:200px;padding:0 10px 0 50px}.outline-message_full-width.outline-message_plain{min-width:230px;padding:0 10px 0 15px}.outline-message_full-width.outline-message_light{min-width:210px;padding:0 10px 0 40px}.outline-message_visible{opacity:1}.outline-message_hidden{display:none} +:root{--outline-zIndex:2000;--outline-sticky-height:100%;--outline-navigator-width:100%}.outline-navigator{margin:0;overflow:auto;position:relative;width:var(--outline-navigator-width);z-index:1}.outline-navigator-parent{transition:.3s ease-in-out}.outline-navigator__title{border-bottom:1px solid #dcdfe6;font-size:16px;font-weight:400;height:40px;line-height:40px;margin:0 16px;overflow:hidden;padding:0 16px}.outline-navigator__main{margin:0;overflow:hidden;position:relative;z-index:1}.outline-navigator__item,.outline-navigator__list,.outline-navigator__subject{list-style-type:none;margin:0;overflow:hidden;padding:0;position:relative;z-index:2}.outline-navigator__list{padding:.5em 0}.outline-navigator__subject{padding-left:1em}.outline-navigator__item{font-size:13px;line-height:30px;margin:0;overflow:hidden}.outline-navigator__placeholder{background-color:#f7f8f9;border-left:2px solid #058942;box-sizing:border-box;height:30px;left:0;overflow:hidden;position:absolute;top:0;transition-duration:.2s;width:100%;z-index:1}.outline-navigator__anchor{display:block;overflow:hidden;padding:0 1.5em;text-overflow:ellipsis;white-space:nowrap}.outline-navigator__anchor:hover,.outline-navigator__anchor:link,.outline-navigator__anchor:visited{color:#555;text-decoration:none}.outline-navigator__anchor:hover{color:#058942}.outline-navigator__code{padding-right:.5em}.outline-navigator_highlight.outline-navigator__anchor:hover,.outline-navigator_highlight.outline-navigator__anchor:link,.outline-navigator_highlight.outline-navigator__anchor:visited{color:#058942;font-weight:700}.outline-navigator_fixed,.outline-navigator_sticky{display:flex;flex-direction:column;flex-wrap:nowrap;overflow:hidden;top:0;z-index:var(--outline-zIndex)}.outline-navigator_fixed .outline-navigator__main,.outline-navigator_fixed .outline-navigator__title,.outline-navigator_sticky .outline-navigator__main,.outline-navigator_sticky .outline-navigator__title{box-sizing:border-box}.outline-navigator_fixed .outline-navigator__title,.outline-navigator_sticky .outline-navigator__title{flex-shrink:0}.outline-navigator_fixed .outline-navigator__main,.outline-navigator_sticky .outline-navigator__main{flex:1;overflow:auto}.outline-navigator_sticky{max-height:var(--outline-sticky-height);position:sticky}.outline-navigator_fixed{max-height:100%;position:fixed}.outline-navigator_hidden{display:none}.outline-navigator_folded{overflow:hidden;width:0} \ No newline at end of file diff --git a/navigator/navigator.min.js b/navigator/navigator.min.js new file mode 100644 index 00000000..812598f2 --- /dev/null +++ b/navigator/navigator.min.js @@ -0,0 +1,2 @@ +!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(t="undefined"!=typeof globalThis?globalThis:t||self).Navigator=e()}(this,(function(){"use strict";const t=t=>"string"==typeof t,e=t=>Object.prototype.toString.apply(t),i=t=>"function"==typeof t||"[object Function]"===e(t),r=t=>("[object Object]"===e(t)||"object"==typeof t||i(t))&&null!==t,s=t=>!!(r(t)&&t.nodeName&&t.tagName&&1===t.nodeType),n=(t,e=300)=>!!i(t)&&setTimeout((()=>{t()}),e),o=t=>Array.isArray?Array.isArray(t):"[object Array]"===e(t),l=t=>{let e={};return null===t?null:(o(t)?e=Array.from(t):(e=Object.assign({},t),Object.keys(e).forEach((i=>e[i]=r(t[i])?l(t[i]):t[i]))),e)},a=["focusout","blur","focusin","focus","load","unload","mouseenter","mouseleave"],h=(t,e,i)=>{const r=a.indexOf(e)>-1;i._delegateListener&&delete(i=i._delegateListener)._delegateListener,function(t,e,i){const r=t._listeners;let s=-1;if(r.length<1)return!1;r.forEach(((t,r)=>{const n=t.fn;e===t.type&&(s=r,n===i&&(s=r))})),s>-1&&r.splice(s,1)}(t,e,i),t.removeEventListener(e,i,r)},c=function(e,i,r=!1){const n=t(e)?document.querySelector(e):e,o=n.childNodes,l=((e,i)=>{let r=e._listeners||[];return t(i)&&i&&(r=r.filter((t=>t.type===i))),r})(n,i);l.forEach((t=>{h(n,t.type,t.fn)})),(r||!0===i||1===arguments.length)&&n&&o&&o.forEach((t=>{s(t)&&c(t,i,r)}))},u=(t,e,r)=>{if(!i(r))return c(t,e),!1;h(t,e,r)},d=(t,e,r,s,n,o=!1)=>{const l=a.indexOf(e)>-1,h=function(i){let l=n||t;!0===n&&(l=s),!0===o&&u(t,e,h),r.call(l,i,s)};if(!i(r))return!1;t._listeners||(t._listeners=[]),t._listeners.push({el:t,type:e,fn:h,data:s,context:n,capture:l}),r._delegateListener=h,t.addEventListener(e,h,l)},f=(t,e="")=>{const i=e.replace(/^>/i,"");return!!(e&&i&&t)&&(t.matches?t.matches(i):!!t.msMatchesSelector&&t.msMatchesSelector(i))},m=t=>t.host&&t!==document&&t.host.nodeType?t.host:t.parentNode,p=(t,e,i,r,s,n,o=!1)=>{const l=a.indexOf(i)>-1,h=function(l){const a=function(t){const e=t.target;return(i=e)&&3===i.nodeType?i.parentNode:i;var i}(l),c=((t,e,i,r)=>{const s=i||document;if(!t)return null;do{if(null!=e&&(e.startsWith(">")?t.parentNode===s&&f(t,e):f(t,e))||r&&t===s)return t;if(t===s)break}while(t=m(t))})(a,e,t);let d=n||t;l.delegateTarget=c,!0===n&&(d=s),c&&(!0===o&&u(t,i,h),r.call(d,l,s))};if(!t)return!1;t._listeners||(t._listeners=[]),t._listeners.push({el:t,selector:e,type:i,fn:h,data:s,context:n,capture:l}),r._delegateListener=h,t.addEventListener(i,h,l)},g=t=>{return!(!r(t)||!(s(t)||(t=>!(!r(t)||"[object NodeList]"!==e(t)))(t)||(i=t,r(i)&&"[object DocumentFragment]"===e(i))||(t=>!(!r(t)||!("[object Text]"===e(t)||t.tagName&&3===t.nodeType)))(t)));var i},y=(t,e)=>{const i=Object.prototype.hasOwnProperty;return t&&i.call(t,e)},v=(t,e)=>{const i=new RegExp("(\\s|^)"+e+"(\\s|$)");let r,n;return!!s(t)&&(r=t.className,!!r&&(n=t.classList,n&&n.contains?t.classList.contains(e):!!i.exec(r)))},b=(t,e)=>{var i;let r,s;if(v(t,e))return!1;r=t.classList,null!==(i=r)&&void 0!==i&&i.add?e.indexOf(" ")>-1?e.split(" ").forEach((t=>{r.add(t)})):r.add(e):(s=t.className,s+=s.length>0?" "+e:e,t.className=s)},$=(t,e)=>{if(!t||!r(e))return!1;Object.keys(e).forEach((i=>{const r=e[i];y(e,i)&&((t,e,i)=>{let r=t.tagName.toLowerCase();switch(e){case"style":t.style.cssText=i;break;case"value":"input"===r||"textarea"===r?t.value=i:t.setAttribute(e,i);break;case"htmlFor":t.setAttribute("for",i);break;case"className":b(t,i);break;case"innerHTML":t.innerHTML=i;break;case"innerText":t.innerText=i;break;default:t.setAttribute(e,i)}})(t,i,r)}))},T=(e,i,s)=>{const n=document.createDocumentFragment(),l=document.createElement(e),a=e=>g(e)||t(e),h=e=>{let i;if(!a(e))return!1;g(e)?i=e:t(e)&&(i=document.createTextNode(e)),n.appendChild(i)};return r(i)?$(l,i):o(i)&&i.every((t=>a(t)))?i.forEach((t=>{h(t)})):g(i)?h(i):t(i)&&h(document.createTextNode(i)),o(s)?s.forEach((t=>{h(t)})):h(s),l.appendChild(n),l},_=t=>t*t,x=(e,r,n)=>{const o=((e=null)=>{let i,r;return e?t(e)?r=document.querySelector(e):s(e)&&(r=e):(i=document.querySelectorAll("html,body"),r=i[0].scrollTop-i[1].scrollTop>=0?i[0]:i[1]),r})(e);let l=o.scrollTop,a=0;const h=r-l,c=o.scrollHeight,u=r-c<=0?r:c,d=t=>(i(n)&&n(t),!1),f=()=>{if(a+=1,h<0){if(l-=_(a),o.scrollTop=l,l<=r)return o.scrollTop=r,d(r)}else if(l+=_(a),o.scrollTop=l,l>=u)return o.scrollTop=u,d(u);requestAnimationFrame(f)};requestAnimationFrame(f)},E=(e,i)=>{var r;let s,n=e.className;if(!n||!v(e,i))return!1;var o;s=e.classList,null!==(r=s)&&void 0!==r&&r.remove?s.remove(i):(o=n.replace(i,""),n=!!t(o)&&o.replace(/(^\s+)|(\s+$)/g,""),e.className=n)},S=t=>{let e=t.offsetTop;return null!==t.offsetParent&&(e+=S(t.offsetParent)),e},k=(t,e)=>getComputedStyle(t)[e],A=(t,e)=>{document.documentElement.style.setProperty(t,e)},w={},O=t=>y(w,t)&&w[t].length>0,C=(t,e=!0)=>e?O(t):(t=>{let e=O(t),i=t.lastIndexOf(".");for(;!e&&-1!==i;)i=(t=t.substring(0,i)).lastIndexOf("."),e=O(t);return e})(t),j=(t,i,r=!0)=>{const s=t=>{if(!O(t))return!1;w[t].forEach((t=>{const r=["[object Int8Array]","[object Uint8Array]","[object Uint8ClampedArray]","[object Int16Array]","[object Uint16Array]","[object Int32Array]","[object Uint32Array]","[object Float32Array]","[object Float64Array]","[object BigInt64Array]","[object BigUint64Array]"].indexOf(e(i))>-1?i.toString():i;t.callback.call(t.context||t,r)}))},n=()=>{let e=t,i=t.lastIndexOf(".");for(;-1!==i;)e=e.substring(0,i),i=e.lastIndexOf("."),s(e);s(t),s("*")};if(!C(t))return!1;r?setTimeout(n,10):n()},N=(()=>{let t=0;return e=>(t+=1,e?e+"-"+t:"guid-"+t)})(),I=t=>{if(!y(w,t))return!1;delete w[t]},L=(t,e)=>{if(!C(t))return!1;e?(t=>{const e=Object.keys(w);if(!t||e.length<1)return!1;e.forEach((e=>{const i=w[e];let r;i.forEach(((e,s)=>{e.callback!==t&&e.token!==t||(r=e.topic,i.splice(-1,s))})),i.length<1&&I(r)}))})(e):I(t)};class q{constructor(t){this.attrs={},this.name="component",t&&this.initialize(t)}initialize(t){return this.attr(t).render().addListeners(),this}attr(e,i){const s=this.attrs;return t(e)?i&&y(s,e)?(s[e]=i,this):s[e]:r(e)?(n=s,o=e,Object.keys(o).forEach((t=>{y(o,t)&&(n[t]=o[t])})),this):0===arguments.length?s:this;var n,o}render(){return this}refresh(){return this}destroy(){return this.removeListeners(),this}reload(t){let e=this.attr();return t&&(e=this.attr(t)),this.destroy().initialize(e),this}$emit(t,e){return j(t,e),this}$on(t,e){return((t,e,r=null)=>{const s=N();let n="symbol"==typeof t?t.toString():t;i(e)&&(w[n]||(w[n]=[]),w[n].push({topic:n,callback:e,context:r,token:s}))})(t,e,this),this}$off(t,e){return L(t,e),this}addListeners(){return this}removeListeners(){return this}}function z(t,e){(null==e||e>t.length)&&(e=t.length);for(var i=0,r=Array(e);i0&&H.length;){const t=H.shift();if(!i(t))return!1;t()}H.length?D=requestIdleCallback(M):(D=0,i(R)&&(R(),R=null))}void 0===window.requestIdleCallback&&(window.requestIdleCallback=function(t){const e=Date.now();return n((function(){t({didTimeout:!1,timeRemaining:function(){return Math.max(0,50-(Date.now()-e))}})}),10)},window.cancelIdleCallback=function(t){clearTimeout(t)});const P=(t,e=null)=>{H.push(t),i(e)&&(R=e),D||requestIdleCallback(M)},U=(t,e,i=!1)=>{const r=e.length,s=function(t,e,i){if(e&&!Array.isArray(e)&&"number"==typeof e.length){var r=e.length;return z(e,void 0!==i&&i{const r=e=>t.querySelector(`#${e}`);e.forEach((e=>{const s=e.pid,n=e.id,o=e.code,l=e.rel,a=[],h=T("span",{className:"outline-navigator__text"},e.text);let c,u,d,f,m;i&&(u=T("span",{className:"outline-navigator__code","data-id":n},e.code),a.push(u)),a.push(h),c=T("a",{id:`chapter__anchor-${n}`,className:"outline-navigator__anchor",href:"#"+l,rel:l,"data-id":n,"data-code":o},a),d=T("li",{id:`chapter-${n}`,className:"outline-navigator__item","data-id":n,"data-code":o},c),-1===s?t.appendChild(d):(m=r(`chapter-${s}`),f=r(`subject-${s}`),f?f.appendChild(d):(f=T("ul",{id:"subject-"+s,className:"outline-navigator__subject"},d),m.appendChild(f)))}))};if(r>400)for(n(s.splice(0,400));s.length>0;){const t=s.splice(0,400);P((()=>{n(t)}))}else n(s)},W="outline-navigator_hidden",B="outline-navigator_expanded",Y="outline-navigator_folded";class G extends q{constructor(t){super(),this._default(),this.scrollTimer=null,this.resizeTimer=null,this.observerTimer=null,this.Observer=null,t&&this.initialize(t)}_default(){return this.attrs=l(G.DEFAULTS),this.$el=null,this.$title=null,this.$main=null,this.$list=null,this.$placeholder=null,this.$parentElement=null,this.$scrollElement=null,this.$active=null,this.chapters=[],this.active=0,this.offsetWidth=0,this.offsetTop=0,this.playing=!1,this.closed=!1,this}initialize(e){let r,n,o,l;return this.attr(e),r=this.attr("created"),n=this.attr("parentElement"),o=this.attr("scrollElement"),t(n)?l=document.querySelector(n):s(n)&&(l=n),this.$parentElement=l,this.$scrollElement=((e=null)=>{let i,r;return e?t(e)?r=document.querySelector(e):s(e)&&(r=e):(i=document.querySelectorAll("html,body"),r=i[0].scrollTop-i[1].scrollTop>=0?i[0]:i[1]),r})(o),this.chapters=this.attr("chapters"),this.closed=this.attr("closed"),this.active=this.attr("active"),i(r)&&r.call(this),this.chapters.length<1||(this.render().addListeners(),this.$active=document.querySelector(`#chapter-${this.active}`)),this}isClosed(){return this.closed}isSticky(){return"sticky"===this.attr("position")}isFixed(){return"fixed"===this.attr("position")}isInside(){return this.isFixed()||this.isSticky()}isOutside(){return!this.isInside()}count(){return this.chapters.length}_paintEdge(){const t=document.createDocumentFragment(),e=this.attr("title"),i=this.attr("animationCurrent"),r=this.attr("customClass"),s=this.$parentElement,n=[],o=[];let l,a,h,c,u=null;return s?(this.isInside()&&e&&(u=T("h2",{className:"outline-navigator__title"},e),this.$title=u,o.push(u)),h=T("ul",{className:"outline-navigator__list"}),this.$list=h,n.push(h),i&&(c=T("div",{className:"outline-navigator__placeholder"}),this.$placeholder=c,n.push(c)),a=T("div",{className:"outline-navigator__main"},n),this.$main=a,o.push(a),l=T("nav",{id:"outline-navigator",className:`outline-navigator ${W}`},o),this.$el=l,this.isSticky()&&(this.calculateStickyHeight(),b(l,"outline-navigator_sticky")),r&&b(l,r),t.appendChild(l),s.appendChild(t),this):this}render(){const t=this.attr("mounted"),e=this.$parentElement,r=this.chapters,s=this.count();let o;return!e||r.length<1||(this.isInside()&&b(e,"outline-navigator-parent"),this._paintEdge(),o=this.$el,this._paint(r),n((()=>{this.highlight(this.active)}),60),this.offsetTop=S(o),this.offsetWidth=o.offsetWidth,this.isFixed()&&(this.sticky(),A("--outline-navigator-width",`${this.offsetWidth}px`)),i(t)&&t.call(this),s<400&&this.onObserver()),this}erase(){return this.$list.innerHTML="",this}_paint(t){const e=this.attr("showCode"),i=this.$el,r=this.$list;return U(r,t,e),E(i,W),b(i,B),this}_remove(){return this.$parentElement.removeChild(this.$el),this}refresh(t){const e=this.$el;return E(e,W),this.erase()._paint(t),this}_getPlaceholderOffset(t){const e=this.$main,i=this.$list,r=i.querySelector(".outline-navigator__anchor"),s=parseInt(k(e,"padding-top"),10),n=parseInt(k(e,"border-top-width"),10),o=parseInt(k(i,"padding-top"),10),l=parseInt(k(i,"margin-top"),10),a=parseInt(k(i,"border-top-width"),10);let h,c=0;return s&&(c+=s),o&&(c+=o),l&&(c+=l),n&&(c+=n),a&&(c+=a),h=r.offsetHeight*t,c+h}positionPlaceholder(t){const e=this.$list,i=this.$placeholder,r=e.querySelector(".outline-navigator__anchor"),s=this.attr("animationCurrent"),n=r.offsetHeight;let o=0;return s?(o=this._getPlaceholderOffset(t),i.style.cssText=`transform: translateY(${o}px);height:${n}px;`,this):this}highlight(t){const e=this.$el,i=this.attr("animationCurrent"),r="outline-navigator_active",o="outline-navigator_highlight";let l="relative"===this.attr("position")?this.$parentElement:this.$main,a=null,h=0;return e?(a=e.querySelector(`#chapter__anchor-${t}`),a?(this.active=parseInt(a.getAttribute("data-id"),10),this.$active&&(E(this.$active,o),E(this.$active,r)),this.$active=a,b(this.$active,r),i?this.positionPlaceholder(this.active):b(this.$active,o),n((()=>{((t,e)=>{let i,r,n=!1;return s(t)&&s(e)?(i=e.getBoundingClientRect(),r=t.getBoundingClientRect(),n=!!(r.top>=i.top&&r.right<=i.right&&r.bottom<=i.bottom&&r.left>=i.left),n):n})(this.$active,l)||(h=this._getPlaceholderOffset(this.active),x(l,h))})),this):this):this}sticky(){const t=this.attr("afterSticky"),e="outline-navigator_fixed",r=this.$el,s=this.offsetTop,n=this.$scrollElement.scrollTop;let o;return this.isFixed()?(o=n>=s,o?b(r,e):E(r,e),i(t)&&t.call(this,this.isClosed(),o),this):this}calculateStickyHeight(){const t=document.documentElement,e=Math.max(t.clientHeight||0,window.innerHeight||0);return A("--outline-sticky-height",`${e}px`),this}scrollTo(t,e){const i=this.$scrollElement;return x(i,t,e),this}show(){const t=this.attr("afterOpened"),e=this.count(),r=this.$el,s=this.$parentElement;return this.isInside()?e>800?E(s,W):(E(s,W),n((()=>{E(s,Y),b(s,B)}),30)):E(r,W),this.closed=!1,i(t)&&t.call(this),this}hide(){const t=this.attr("afterClosed"),e=this.count(),r=this.$el,s=this.$parentElement;return this.isInside()?e>800?b(s,W):(b(s,Y),E(s,B),n((()=>{b(s,W)}))):b(r,W),this.closed=!0,i(t)&&t.call(this),this}toggle(){const t=this.attr("afterToggle"),e=this.offsetTop,r=this.$scrollElement.scrollTop;let s;return this.isClosed()?this.show():this.hide(),i(t)&&n((()=>{s=r>=e,t.call(this,this.isClosed(),s)})),this}destroy(){const t=this.attr("beforeDestroy"),e=this.attr("afterDestroy");return i(t)&&t.call(this),this.removeListeners()._remove()._default(),this.scrollTimer&&(clearTimeout(this.scrollTimer),this.scrollTimer=null),this.resizeTimer&&(clearTimeout(this.resizeTimer),this.resizeTimer=null),this.observerTimer&&(clearTimeout(this.observerTimer),this.observerTimer=null),this.Observer&&(this.Observer=null),i(e)&&e.call(this),this}onObserver(){const t=this.attr("selector");return this.Observer=((t,e={})=>{const r=e.root||null,n=e.selector||".outline-heading",o=e.context||null,l={rootMargin:e.rootMargin||"0px 0px -90% 0px"},a=new IntersectionObserver((e=>{e.forEach((e=>{e.intersectionRatio>0&&i(t)&&t.call(o||e.target,e.target)}))}),l),h=s(r)?r:document;return r&&(l.root=r),h.querySelectorAll(n).forEach((t=>{a.observe(t)})),a})((t=>{const e=t.getAttribute("data-id");if(this.playing)return!1;this.observerTimer&&clearTimeout(this.observerTimer),this.observerTimer=n((()=>{this.highlight(e)}),100)}),{selector:t,context:this}),this}onSelect(t){const e=this.attr("stickyHeight"),r=t.delegateTarget,s=r.getAttribute("data-id"),o=r.href.split("#")[1],l=document.querySelector(`#${o}`),a=S(l)-(e+10),h=this.$scrollElement.scrollHeight,c=this.attr("afterScroll"),u=()=>{i(c)&&c.call(this,"chapter"),n((()=>{this.playing=!1,this.$emit("toolbar:update",{top:a,min:0,max:h})}))};return this.playing=!0,this.isFixed()?(this.sticky(),n((()=>{this.scrollTo(a,u),this.highlight(s)}),10)):(this.scrollTo(a,u),this.highlight(s)),function(t){t.stopPropagation(),t.preventDefault()}(t),this}onScroll(){const t=this.$scrollElement;return this.scrollTimer&&clearTimeout(this.scrollTimer),this.scrollTimer=n((()=>{const e=t.scrollTop,i=t.scrollHeight-t.clientHeight;this.isFixed()&&this.sticky(),this.$emit("toolbar:update",{top:e,min:0,max:i})}),100),this}onResize(){return this.isSticky()?(this.resizeTimer&&clearTimeout(this.resizeTimer),this.resizeTimer=n((()=>{this.calculateStickyHeight()})),this):this}onRefresh(t){return this.refresh(t),this}addListeners(){const t=this.$el,e=this.$scrollElement,i=e.tagName.toLowerCase();let r=e;return this.count()<1||("html"!==i&&"body"!==i||(r=window),p(t,".outline-navigator__anchor","click",this.onSelect,this,!0),d(r,"scroll",this.onScroll,this,!0),this.isSticky()&&d(window,"resize",this.onResize,this,!0),this.$on("anchors:all:paint",this.onObserver,this),this.$on("navigator:refresh",this.onRefresh,this)),this}removeListeners(){const t=this.attr("selector"),e=this.$el,i=this.$scrollElement,r=i.tagName.toLowerCase();let s=i;return this.count()<1||("html"!==r&&"body"!==r||(s=window),u(e,"click",this.onSelect),u(s,"scroll",this.onScroll),this.isSticky()&&u(window,"resize",this.onResize),this.$off("anchors:all:paint"),this.$off("navigator:refresh"),this.Observer&&document.querySelectorAll(t).forEach((t=>{this.Observer.unobserve(t)}))),this}}return G.DEFAULTS=l({parentElement:"",scrollElement:"",selector:".outline-heading",active:0,closed:!1,showCode:!0,animationCurrent:!0,position:"relative",stickyHeight:0,chapters:[],created:null,mounted:null,afterClosed:null,afterOpened:null,afterScroll:null,beforeDestroy:null,afterDestroy:null,afterSticky:null}),G})); +//# sourceMappingURL=navigator.min.js.map diff --git a/navigator/navigator.min.js.map b/navigator/navigator.min.js.map new file mode 100644 index 00000000..6fba01e3 --- /dev/null +++ b/navigator/navigator.min.js.map @@ -0,0 +1 @@ +{"version":3,"file":"navigator.min.js","sources":["../utils/types/isString.js","../utils/lang/toString.js","../utils/types/isFunction.js","../utils/types/isObject.js","../utils/types/isElement.js","../utils/lang/later.js","../utils/types/isArray.js","../utils/lang/cloneDeep.js","../utils/event/enum.js","../utils/event/_off.js","../utils/event/_delete.js","../utils/event/purgeElement.js","../utils/event/getListeners.js","../utils/event/off.js","../utils/event/at.js","../utils/dom/matches.js","../utils/dom/getParentOrHost.js","../utils/event/on.js","../utils/event/getTarget.js","../utils/dom/resolveTextNode.js","../utils/dom/closest.js","../utils/types/isDOM.js","../utils/types/isHTMLCollection.js","../utils/types/isFragment.js","../utils/types/isTextNode.js","../utils/lang/hasOwn.js","../utils/dom/hasClass.js","../utils/dom/addClass.js","../utils/dom/setAttributes.js","../utils/dom/setAttribute.js","../utils/dom/createElement.js","../utils/lang/easeInQuad.js","../utils/dom/scrollTo.js","utils/_getScrollElement.js","../utils/dom/removeClass.js","../utils/lang/trim.js","../utils/dom/offsetTop.js","../utils/dom/getStyle.js","../utils/dom/setProperty.js","../utils/observer/_subscribers.js","../utils/observer/_hasDirectSubscribersFor.js","../utils/observer/has.js","../utils/observer/_hasSubscribers.js","../utils/observer/emit.js","../utils/types/isTypedArray.js","../utils/lang/guid.js","../utils/observer/_removeSubscriber.js","../utils/observer/off.js","../utils/observer/_removeSubscriberByToken.js","../component.js","../utils/lang/extend.js","../utils/observer/on.js","../utils/lang/timeSlice.js","utils/_paintChapters.js","navigator.js","../utils/dom/getScrollElement.js","../utils/dom/inBounding.js","../utils/dom/intersection.js","../utils/event/stop.js"],"sourcesContent":["/**\r\n * 检测数据是否为 String 类型\r\n * ========================================================================\r\n * @method isArray\r\n * @param {*} str\r\n * @returns {boolean}\r\n */\r\nconst isString = (str) => {\r\n return typeof str === 'string'\r\n}\r\n\r\nexport default isString\r\n","/**\r\n * Object 对象原型上的 toString 方法\r\n * ========================================================================\r\n * @method toString\r\n * @param {*} val\r\n * @returns {string}\r\n */\r\nconst toString = (val) => {\r\n return Object.prototype.toString.apply(val)\r\n}\r\n\r\nexport default toString\r\n","import toString from '@/utils/lang/toString'\r\n\r\n/**\r\n * 检测测试数据是否为 Function 类型\r\n * ========================================================================\r\n * @method isFunction\r\n * @param {*} val - (必须)待检测的数据\r\n * @returns {boolean} 'val' 是 Function 类型返回 true,否则返回 false\r\n */\r\nconst isFunction = (val) => {\r\n return typeof val === 'function' || toString(val) === '[object Function]'\r\n}\r\n\r\nexport default isFunction\r\n","import toString from '../lang/toString'\r\nimport isFunction from './isFunction'\r\n\r\n/**\r\n * 检测数据是否为 Object 类型\r\n * ========================================================================\r\n * @method isObject\r\n * @param {*} o\r\n * @returns {boolean}\r\n */\r\nconst isObject = (o) => {\r\n return (\r\n (toString(o) === '[object Object]' ||\r\n typeof o === 'object' ||\r\n isFunction(o)) &&\r\n o !== null\r\n )\r\n}\r\n\r\nexport default isObject\r\n","import isObject from './isObject'\r\n\r\n/**\r\n * 检测数据是否为 HTMLElement DOM 节点\r\n * ========================================================================\r\n * @method isElement\r\n * @param {*} o\r\n * @returns {boolean}\r\n */\r\nconst isElement = (o) => {\r\n return !!(isObject(o) && o.nodeName && o.tagName && o.nodeType === 1)\r\n}\r\n\r\nexport default isElement\r\n","import isFunction from '@/utils/types/isFunction'\r\n\r\n/**\r\n * later - 延迟执行方法\r\n * ========================================================================\r\n * @method later\r\n * @param {Function} fn\r\n * @param {Number} [delay]\r\n * @returns {number|boolean}\r\n */\r\nconst later = (fn, delay = 300) => {\r\n if (!isFunction(fn)) {\r\n return false\r\n }\r\n\r\n return setTimeout(() => {\r\n fn()\r\n }, delay)\r\n}\r\n\r\nexport default later\r\n","import toString from '@/utils/lang/toString'\r\n\r\n/**\r\n * 检测数据是否为 Array 类型\r\n * ========================================================================\r\n * @method isArray\r\n * @param {*} o\r\n * @returns {boolean}\r\n */\r\nconst isArray = (o) => {\r\n if (Array.isArray) {\r\n return Array.isArray(o)\r\n } else {\r\n return toString(o) === '[object Array]'\r\n }\r\n}\r\n\r\nexport default isArray\r\n","import isObject from '@/utils/types/isObject'\r\nimport isArray from '@/utils/types/isArray'\r\n\r\n/**\r\n * 深拷贝对象函数\r\n * ========================================================================\r\n * @methods cloneDeep\r\n * @param {Object} obj - 深拷贝的对象\r\n * @returns {Array|Object|*}\r\n *\r\n * @example\r\n * const arr = cloneDeep([2,3,4,6])\r\n * => [2,3,4,6]\r\n */\r\nconst cloneDeep = (obj) => {\r\n let clone = {}\r\n\r\n if (obj === null) {\r\n return null\r\n }\r\n\r\n if (isArray(obj)) {\r\n clone = Array.from(obj)\r\n } else {\r\n clone = Object.assign({}, obj)\r\n Object.keys(clone).forEach((key) => {\r\n return (clone[key] = isObject(obj[key]) ? cloneDeep(obj[key]) : obj[key])\r\n })\r\n }\r\n\r\n return clone\r\n}\r\n\r\nexport default cloneDeep\r\n","export const CAPTURE_EVENTS = [\r\n 'focusout',\r\n 'blur',\r\n 'focusin',\r\n 'focus',\r\n 'load',\r\n 'unload',\r\n 'mouseenter',\r\n 'mouseleave'\r\n]\r\n","import { CAPTURE_EVENTS } from './enum'\r\nimport _delete from './_delete'\r\n\r\n/**\r\n * (私有方法)取消 type 类型的代理事件绑定\r\n * ========================================================================\r\n * 如果没有设置 handler,则销毁 this.$options 绑定的所有符合 type 事件类型的事件绑定\r\n * ========================================================================\r\n * @method _off\r\n * @param {HTMLElement} el - (必须)取消事件绑定的 DOM 元素\r\n * @param {String} type - (必须)事件类型\r\n * @param {Function} fn - (必须)事件处理器回调函数\r\n * @private\r\n */\r\nconst _off = (el, type, fn) => {\r\n const capture = CAPTURE_EVENTS.indexOf(type) > -1\r\n\r\n /* istanbul ignore else */\r\n if (fn._delegateListener) {\r\n fn = fn._delegateListener\r\n delete fn._delegateListener\r\n }\r\n\r\n // 移除缓存的 _listeners 数据\r\n _delete(el, type, fn)\r\n\r\n el.removeEventListener(type, fn, capture)\r\n}\r\n\r\nexport default _off\r\n","/**\r\n * 删除 DOM 元素缓存的 _listeners 数据\r\n * ========================================================================\r\n * @method _delete\r\n * @param {HTMLElement} el - 要删除 listener 的 DOM 元素\r\n * @param {String} type - 事件类型(名称)\r\n * @param {Function} [fn] - 事件处理器回调函数\r\n */\r\nconst _delete = function (el, type, fn) {\r\n const listeners = el._listeners\r\n let index = -1\r\n\r\n if (listeners.length < 1) {\r\n return false\r\n }\r\n\r\n // 移除缓存的 _listeners 数据\r\n listeners.forEach((listener, i) => {\r\n const handler = listener.fn\r\n\r\n if (type === listener.type) {\r\n index = i\r\n\r\n if (handler === fn) {\r\n index = i\r\n }\r\n }\r\n })\r\n\r\n /* istanbul ignore else */\r\n if (index > -1) {\r\n listeners.splice(index, 1)\r\n }\r\n}\r\n\r\nexport default _delete\r\n","import isString from '@/utils/types/isString'\r\nimport isElement from '@/utils/types/isElement'\r\nimport getListeners from './getListeners'\r\nimport _off from './_off'\r\n\r\n/**\r\n * 销毁(type 类型的)代理事件绑定\r\n * ========================================================================\r\n * 1. 设置了事件类型 type,则销毁指定类型的事件绑定,否则清除所有代理事件绑定\r\n * 2. recurse 设置为 true,递归销毁子节点全部事件绑定\r\n * ========================================================================\r\n * @method purgeElement\r\n * @param {HTMLElement|String} el - (必须)DOM 元素或者其选择器\r\n * @param {String|Boolean} type - (必须)事件类型\r\n * @param {Boolean} [recurse] - (可选)是否递归销毁子节点所有事件绑定\r\n */\r\nconst purgeElement = function (el, type, recurse = false) {\r\n const $element = isString(el) ? document.querySelector(el) : el\r\n const $children = $element.childNodes\r\n const listeners = getListeners($element, type)\r\n\r\n listeners.forEach((listener) => {\r\n _off($element, listener.type, listener.fn)\r\n })\r\n\r\n if (\r\n (recurse || type === true || arguments.length === 1) &&\r\n $element &&\r\n $children\r\n ) {\r\n $children.forEach(($child) => {\r\n if (isElement($child)) {\r\n purgeElement($child, type, recurse)\r\n }\r\n })\r\n }\r\n}\r\n\r\nexport default purgeElement\r\n","import isString from '@/utils/types/isString'\r\n\r\n/**\r\n * 获取 DOM 元素(type 事件类型)事件绑定信息\r\n * ========================================================================\r\n * 如果设置了事件类型 type, 则返回指定类型的事件绑定信息,否则返回所有事件绑定信息\r\n * ========================================================================\r\n * @methods getListeners\r\n * @param {HTMLElement} el - (必须)要获取事件绑定信息的 DOM 元素\r\n * @param {String} [type] - (可选)事件类型\r\n * @returns {Array} - 已绑定的事件信息\r\n */\r\nconst getListeners = (el, type) => {\r\n let listeners = el._listeners || []\r\n\r\n if (isString(type) && type) {\r\n listeners = listeners.filter((listener) => {\r\n return listener.type === type\r\n })\r\n }\r\n\r\n return listeners\r\n}\r\n\r\nexport default getListeners\r\n","import purgeElement from './purgeElement'\r\nimport isFunction from '../types/isFunction'\r\nimport _off from './_off'\r\n\r\n/**\r\n * 取消 type 类型的代理事件绑定\r\n * ========================================================================\r\n * 如果没有设置 handler,则销毁 this.$options 绑定的所有符合 type 事件类型的事件绑定\r\n * ========================================================================\r\n * @method off\r\n * @param {HTMLElement|Object} el - (必须)取消事件绑定的 DOM 元素\r\n * @param {String} type - (必须)事件类型\r\n * @param {Function} [fn] - (可选)事件处理器回调函数\r\n */\r\nconst off = (el, type, fn) => {\r\n // 如果不设置 fn 参数,默认清除 el 元素上绑定的所有事件处理器\r\n if (!isFunction(fn)) {\r\n purgeElement(el, type)\r\n return false\r\n }\r\n\r\n _off(el, type, fn)\r\n}\r\n\r\nexport default off\r\n","import isFunction from '@/utils/types/isFunction'\r\nimport off from './off'\r\n\r\nimport { CAPTURE_EVENTS } from './enum'\r\n\r\n/**\r\n * 绑定事件\r\n * ========================================================================\r\n * @method at\r\n * @param {HTMLElement|String|Object} el - (必须)绑定代理事件的 DOM 节点\r\n * @param {String|Function} type - (必须)事件类型或者事件处理器回调函数\r\n * @param {Function|Object} fn - (必须) 事件处理器回调函数或者传递给事件处理器回调函数的数据对象\r\n * @param {Object|Boolean} [data] - (可选)传递给事件处理器回调函数的数据对象或者事件处理器回调函数的 this 上下文指向,\r\n * @param {Object|Boolean} [context] - (可选)事件处理器回调函数的 this 上下文指向,或者是否仅触发一次\r\n * 当设置为 true 时,则事件处理器回调函数的 this 上下文指向为 data 对象\r\n * @param {Boolean} once - (可选)是否仅触发一次\r\n */\r\nconst at = (el, type, fn, data, context, once = false) => {\r\n // CAPTURE_EVENTS 中的特殊事件,采用事件捕获模型\r\n const capture = CAPTURE_EVENTS.indexOf(type) > -1\r\n const listener = function (evt) {\r\n let overrideContext = context || el\r\n\r\n // 当设置为 true 时,则事件处理器回调函数的\r\n // this 上下文指向为 data 对象\r\n if (context === true) {\r\n overrideContext = data\r\n }\r\n\r\n // 仅触发一次\r\n /* istanbul ignore else */\r\n if (once === true) {\r\n off(el, type, listener)\r\n }\r\n\r\n fn.call(overrideContext, evt, data)\r\n }\r\n\r\n if (!isFunction(fn)) {\r\n return false\r\n }\r\n\r\n if (!el._listeners) {\r\n el._listeners = []\r\n }\r\n\r\n // 缓存 options 元素绑定的事件处理器\r\n el._listeners.push({\r\n el,\r\n type,\r\n fn: listener,\r\n data,\r\n context,\r\n capture\r\n })\r\n\r\n // 缓存包装后的事件处理器\r\n fn._delegateListener = listener\r\n\r\n el.addEventListener(type, listener, capture)\r\n}\r\n\r\nexport default at\r\n","/**\r\n * 获取 options 节点下匹配 selector 选择器的 DOM 节点\r\n * ========================================================================\r\n * Element.matches() 方法可以用来判断 DOM 元素是否与给定的选择器匹配,事件代理判断是\r\n * 否触发绑定的代理事件回调函数,关键就是使用 Element.matches() 辨别当前事件触发的目\r\n * 标 DOM 元素是否为事件代理所期望触发的目标。\r\n * ========================================================================\r\n * @method matches\r\n * @see https://developer.mozilla.org/en-US/docs/web/api/element/matches\r\n * @param {HTMLElement} el - (必须)DOM 元素\r\n * @param {String} selector - (必须)匹配 DOM 元素的选择器\r\n * @returns {Boolean}\r\n */\r\nconst matches = (el, selector = '') => {\r\n const sel = selector.replace(/^>/i, '')\r\n\r\n if (!selector || !sel || !el) {\r\n return false\r\n }\r\n\r\n /* istanbul ignore else */\r\n if (el.matches) {\r\n return el.matches(sel)\r\n } else if (el.msMatchesSelector) {\r\n return el.msMatchesSelector(sel)\r\n } else {\r\n return false\r\n }\r\n}\r\n\r\nexport default matches\r\n","/**\r\n * 获取 DOM 元素的父节点\r\n * ========================================================================\r\n * @method getParentOrHost\r\n * @param {*|HTMLElement} el - (必须)要获取父节点的 DOM 元素\r\n * @returns {*|HTMLElement}\r\n */\r\nconst getParentOrHost = (el) => {\r\n return el.host && el !== document && el.host.nodeType\r\n ? el.host\r\n : el.parentNode\r\n}\r\n\r\nexport default getParentOrHost\r\n","import closest from '@/utils/dom/closest'\r\nimport off from './off'\r\nimport getTarget from './getTarget'\r\n\r\nimport { CAPTURE_EVENTS } from './enum'\r\n\r\n/**\r\n * 绑定代理事件\r\n * ========================================================================\r\n * @method on\r\n * @param {HTMLElement|String|Object} el - (必须)绑定代理事件的 DOM 节点\r\n * @param {String} selector - (必须)事件代理目标 DOM 元素的选择器\r\n * @param {String|Function} type - (必须)事件类型或者事件处理器回调函数\r\n * @param {Function|Object} fn - (可选) 事件处理器回调函数或者传递给事件处理器回调函数的数据对象\r\n * @param {Object|Boolean} [data] - (可选)传递给事件处理器回调函数的数据对象或者事件处理器回调函数的 this 上下文指向,\r\n * @param {Object|Boolean} [context] - (可选)事件处理器回调函数的 this 上下文指向,或者是否仅触发一次\r\n * 当设置为 true 时,则事件处理器回调函数的 this 上下文指向为 data 对象\r\n * @param {Boolean} once - (可选)是否仅触发一次\r\n */\r\nconst on = (el, selector, type, fn, data, context, once = false) => {\r\n // CAPTURE_EVENTS 中的特殊事件,采用事件捕获模型\r\n const capture = CAPTURE_EVENTS.indexOf(type) > -1\r\n\r\n const listener = function (evt) {\r\n const target = getTarget(evt)\r\n // 通过 Element.matches 方法获得点击的目标元素\r\n const delegateTarget = closest(target, selector, el)\r\n let overrideContext = context || el\r\n\r\n evt.delegateTarget = delegateTarget\r\n\r\n // 当设置为 true 时,则事件处理器回调函数的\r\n // this 上下文指向为 data 对象\r\n if (context === true) {\r\n overrideContext = data\r\n }\r\n\r\n /* istanbul ignore else */\r\n if (delegateTarget) {\r\n // 仅触发一次\r\n /* istanbul ignore else */\r\n if (once === true) {\r\n off(el, type, listener)\r\n }\r\n\r\n fn.call(overrideContext, evt, data)\r\n }\r\n }\r\n\r\n if (!el) {\r\n return false\r\n }\r\n\r\n if (!el._listeners) {\r\n el._listeners = []\r\n }\r\n\r\n // 缓存 options 元素绑定的事件处理器\r\n el._listeners.push({\r\n el,\r\n selector,\r\n type,\r\n fn: listener,\r\n data,\r\n context,\r\n capture\r\n })\r\n\r\n // 缓存包装后的事件处理器\r\n fn._delegateListener = listener\r\n\r\n el.addEventListener(type, listener, capture)\r\n}\r\n\r\nexport default on\r\n","import resolveTextNode from '@/utils/dom/resolveTextNode'\r\n\r\n/**\r\n * 返回触发事件的 target DOM 元素\r\n * ========================================================================\r\n * @method getTarget\r\n * @param {Event} evt - Event 对象\r\n * @return {HTMLElement} - Event 对象的 target DOM 元素\r\n */\r\nconst getTarget = function (evt) {\r\n const target = evt.target\r\n\r\n return resolveTextNode(target)\r\n}\r\n\r\nexport default getTarget\r\n","/**\r\n * 在某些情况下,某些浏览器(例如:Safari 浏览器)会返回实际的目标元素内部的文本节点。\r\n * resolveTextNode() 方法则会返回实际的目标节点。\r\n * ========================================================================\r\n * @method resolveTextNode\r\n * @param {HTMLElement|Text} el - 要解析的节点\r\n * @return {*|HTMLElement} - 实际的目标 DOM 节点\r\n */\r\nconst resolveTextNode = function (el) {\r\n if (el && el.nodeType === 3) {\r\n return el.parentNode\r\n }\r\n\r\n return el\r\n}\r\n\r\nexport default resolveTextNode\r\n","import matches from './matches'\r\nimport getParentOrHost from './getParentOrHost'\r\n\r\n/**\r\n * 获取 options 元素父元素最近的包含 selector 选择器的元素\r\n * ========================================================================\r\n * @method closest\r\n * @param {HTMLElement} el - (必须)DOM 元素\r\n * @param {String} selector - (必须)DOM 元素的选择其\r\n * @param {HTMLElement} [ctx] - (必须)比对的 DOM 元素\r\n * @param {Boolean} [includeCTX] - (必须)是否包含 context DOM 元素\r\n * @returns {null|HTMLElement} - 返回最接近的 DOM 元素\r\n */\r\nconst closest = (el, selector, ctx, includeCTX) => {\r\n const context = ctx || document\r\n\r\n if (!el) {\r\n return null\r\n }\r\n\r\n do {\r\n /* istanbul ignore else */\r\n if (\r\n (selector != null &&\r\n (selector.startsWith('>')\r\n ? el.parentNode === context && matches(el, selector)\r\n : matches(el, selector))) ||\r\n (includeCTX && el === context)\r\n ) {\r\n return el\r\n }\r\n\r\n /* istanbul ignore else */\r\n if (el === context) {\r\n break\r\n }\r\n\r\n /* jshint boss:true */\r\n } while ((el = getParentOrHost(el)))\r\n}\r\n\r\nexport default closest\r\n","import isObject from './isObject'\r\nimport isElement from './isElement'\r\nimport isHTMLCollection from './isHTMLCollection'\r\nimport isFragment from './isFragment'\r\nimport isTextNode from './isTextNode'\r\n\r\nconst isDOM = (el) => {\r\n return !!(\r\n isObject(el) &&\r\n (isElement(el) || isHTMLCollection(el) || isFragment(el) || isTextNode(el))\r\n )\r\n}\r\n\r\nexport default isDOM\r\n","import toString from '@/utils/lang/toString'\r\nimport isObject from './isObject'\r\n\r\nconst isHTMLCollection = (el) => {\r\n return !!(isObject(el) && toString(el) === '[object NodeList]')\r\n}\r\n\r\nexport default isHTMLCollection\r\n","import toString from '@/utils/lang/toString'\r\nimport isObject from './isObject'\r\n\r\nconst isFragment = (fragment) => {\r\n return !!(\r\n isObject(fragment) && toString(fragment) === '[object DocumentFragment]'\r\n )\r\n}\r\n\r\nexport default isFragment\r\n","import toString from '@/utils/lang/toString'\r\nimport isObject from './isObject'\r\n\r\nconst isTextNode = (el) => {\r\n return !!(\r\n isObject(el) &&\r\n (toString(el) === '[object Text]' || (el.tagName && el.nodeType === 3))\r\n )\r\n}\r\n\r\nexport default isTextNode\r\n","/**\r\n * 检测对象自身属性中是否具有指定的属性。\r\n * ========================================================================\r\n * @method hasOwn\r\n * @param {Object} obj - (必须)检测的目标对象\r\n * @param {String} prop - (必须)属性名\r\n * @returns {Boolean}\r\n */\r\nconst hasOwn = (obj, prop) => {\r\n const hasOwnProperty = Object.prototype.hasOwnProperty\r\n return obj && hasOwnProperty.call(obj, prop)\r\n}\r\n\r\nexport default hasOwn\r\n","import isElement from '../types/isElement'\r\n/**\r\n * 检测 DOM 节点是否包含名为 className 的样式\r\n * ========================================================================\r\n * @method hasClass\r\n * @param {HTMLElement} el - DOM 节点\r\n * @param {String} className - 样式名称\r\n * @returns {Boolean}\r\n */\r\nconst hasClass = (el, className) => {\r\n const pattern = new RegExp('(\\\\s|^)' + className + '(\\\\s|$)')\r\n let allClass\r\n let classList\r\n\r\n if (!isElement(el)) {\r\n return false\r\n }\r\n\r\n allClass = el.className\r\n\r\n if (!allClass) {\r\n return false\r\n }\r\n\r\n classList = el.classList\r\n\r\n if (classList && classList.contains) {\r\n return el.classList.contains(className)\r\n }\r\n\r\n return !!pattern.exec(allClass)\r\n}\r\n\r\nexport default hasClass\r\n","import hasClass from './hasClass'\r\n\r\n/**\r\n * 给 DOM 节点添加名为 className 的样式\r\n * ========================================================================\r\n * @method addClass\r\n * @param {HTMLElement} el - DOM 节点\r\n * @param {String} className - 样式名称\r\n * @returns {Boolean}\r\n */\r\nconst addClass = (el, className) => {\r\n let classList\r\n let allClass\r\n\r\n if (hasClass(el, className)) {\r\n return false\r\n }\r\n\r\n classList = el.classList\r\n\r\n if (classList?.add) {\r\n if (className.indexOf(' ') > -1) {\r\n className.split(' ').forEach((name) => {\r\n classList.add(name)\r\n })\r\n } else {\r\n classList.add(className)\r\n }\r\n } else {\r\n allClass = el.className\r\n allClass += allClass.length > 0 ? ' ' + className : className\r\n el.className = allClass\r\n }\r\n}\r\n\r\nexport default addClass\r\n","import isObject from '../types/isObject'\r\nimport hasOwn from '../lang/hasOwn'\r\nimport setAttribute from './setAttribute'\r\n\r\nconst setAttributes = (el, attrs) => {\r\n if (!el || !isObject(attrs)) {\r\n return false\r\n }\r\n\r\n Object.keys(attrs).forEach((attr) => {\r\n const value = attrs[attr]\r\n if (hasOwn(attrs, attr)) {\r\n setAttribute(el, attr, value)\r\n }\r\n })\r\n}\r\n\r\nexport default setAttributes\r\n","import addClass from './addClass.js'\r\n\r\n/**\r\n * 给 DOM 节点设置属性/值\r\n * ========================================================================\r\n * @method setAttribute\r\n * @param {HTMLElement} el - DOM 节点\r\n * @param {String} attr - 属性名称\r\n * @param {String|Number|Boolean} value - 属性值\r\n */\r\nconst setAttribute = (el, attr, value) => {\r\n let tagName = el.tagName.toLowerCase()\r\n\r\n switch (attr) {\r\n case 'style':\r\n el.style.cssText = value\r\n break\r\n case 'value':\r\n if (tagName === 'input' || tagName === 'textarea') {\r\n el.value = value\r\n } else {\r\n el.setAttribute(attr, value)\r\n }\r\n break\r\n case 'htmlFor':\r\n el.setAttribute('for', value)\r\n break\r\n case 'className':\r\n addClass(el, value)\r\n break\r\n case 'innerHTML':\r\n el.innerHTML = value\r\n break\r\n case 'innerText':\r\n el.innerText = value\r\n break\r\n default:\r\n el.setAttribute(attr, value)\r\n break\r\n }\r\n}\r\n\r\nexport default setAttribute\r\n","import isObject from '../types/isObject'\r\nimport isString from '../types/isString'\r\nimport isArray from '../types/isArray'\r\nimport isDOM from '../types/isDOM'\r\nimport setAttributes from './setAttributes'\r\n\r\n/**\r\n * 创建 DOM 节点,并添加属性和子节点\r\n * ========================================================================\r\n * @method createElement\r\n * @param {String} tagName - 标签名称\r\n * @param {Object|Array|HTMLElement|DocumentFragment|String} attrs - 属性对象或者子节点\r\n * @param {Array|HTMLElement|DocumentFragment|String} [children] - 子节点数组\r\n * @returns {HTMLElement}\r\n */\r\nconst createElement = (tagName, attrs, children) => {\r\n const $fragment = document.createDocumentFragment()\r\n const $el = document.createElement(tagName)\r\n const isValidChild = (child) => {\r\n return isDOM(child) || isString(child)\r\n }\r\n const append = (child) => {\r\n let $child\r\n\r\n if (!isValidChild(child)) {\r\n return false\r\n }\r\n\r\n if (isDOM(child)) {\r\n $child = child\r\n } else if (isString(child)) {\r\n $child = document.createTextNode(child)\r\n }\r\n\r\n $fragment.appendChild($child)\r\n }\r\n\r\n if (isObject(attrs)) {\r\n setAttributes($el, attrs)\r\n } else if (isArray(attrs) && attrs.every((attr) => isValidChild(attr))) {\r\n attrs.forEach((child) => {\r\n append(child)\r\n })\r\n } else if (isDOM(attrs)) {\r\n append(attrs)\r\n } else if (isString(attrs)) {\r\n append(document.createTextNode(attrs))\r\n }\r\n\r\n if (isArray(children)) {\r\n children.forEach((child) => {\r\n append(child)\r\n })\r\n } else {\r\n append(children)\r\n }\r\n\r\n $el.appendChild($fragment)\r\n\r\n return $el\r\n}\r\n\r\nexport default createElement\r\n","/**\r\n * 返回给定值的平方值\r\n * ========================================================================\r\n * @method easeInQuad\r\n * @param {Number} x\r\n * @returns {number}\r\n */\r\nconst easeInQuad = (x) => {\r\n return x * x\r\n}\r\n\r\nexport default easeInQuad\r\n","import easeInQuad from '../lang/easeInQuad'\r\nimport isFunction from '../types/isFunction'\r\nimport _getScrollElement from '../../navigator/utils/_getScrollElement'\r\n\r\n/**\r\n * 指定 rootElement DOM 节点滚动到指定 top 位置\r\n * ========================================================================\r\n * @method scrollTo\r\n * @param {HTMLElement|Object} [scrollElement] - (必须)要滚动的 DOM 节点\r\n * @param {Number} top - (必须)滚动的 scrollTop 数值\r\n * @param {Function} [afterStop] - (可选)滚动完成的回调函数\r\n */\r\nconst scrollTo = (scrollElement, top, afterStop) => {\r\n const $scrollElement = _getScrollElement(scrollElement)\r\n let scrollTop = $scrollElement.scrollTop\r\n let step = 0\r\n const distance = top - scrollTop\r\n const MAX_HEIGHT = $scrollElement.scrollHeight\r\n const MAX_TOP = top - MAX_HEIGHT <= 0 ? top : MAX_HEIGHT\r\n const stop = (top) => {\r\n if (isFunction(afterStop)) {\r\n afterStop(top)\r\n }\r\n\r\n return false\r\n }\r\n const play = () => {\r\n step += 1\r\n\r\n // 向上滚动\r\n if (distance < 0) {\r\n scrollTop -= easeInQuad(step)\r\n $scrollElement.scrollTop = scrollTop\r\n\r\n if (scrollTop <= top) {\r\n $scrollElement.scrollTop = top\r\n return stop(top)\r\n }\r\n } else {\r\n scrollTop += easeInQuad(step)\r\n $scrollElement.scrollTop = scrollTop\r\n\r\n if (scrollTop >= MAX_TOP) {\r\n $scrollElement.scrollTop = MAX_TOP\r\n return stop(MAX_TOP)\r\n }\r\n }\r\n\r\n // eslint-disable-next-line compat/compat\r\n requestAnimationFrame(play)\r\n }\r\n\r\n // eslint-disable-next-line compat/compat\r\n requestAnimationFrame(play)\r\n}\r\n\r\nexport default scrollTo\r\n","import isString from '../../utils/types/isString'\r\nimport isElement from '../../utils/types/isElement'\r\n\r\n/**\r\n * 通过给的 scrollElement 参数,获取滚动 DOM 元素\r\n * ========================================================================\r\n * @method _getScrollElement\r\n * @param {String|HTMLElement} scrollElement\r\n * @returns {Element}\r\n * @private\r\n */\r\nconst _getScrollElement = (scrollElement = null) => {\r\n let $rootElements\r\n let $scrollElement\r\n\r\n if (!scrollElement) {\r\n $rootElements = document.querySelectorAll('html,body')\r\n $scrollElement =\r\n $rootElements[0].scrollTop - $rootElements[1].scrollTop >= 0\r\n ? $rootElements[0]\r\n : $rootElements[1]\r\n } else {\r\n if (isString(scrollElement)) {\r\n $scrollElement = document.querySelector(scrollElement)\r\n } else if (isElement(scrollElement)) {\r\n $scrollElement = scrollElement\r\n }\r\n }\r\n\r\n return $scrollElement\r\n}\r\n\r\nexport default _getScrollElement\r\n","import trim from '../lang/trim'\r\nimport hasClass from './hasClass'\r\n\r\n/**\r\n * 移除 DOM 节点的 className 样式\r\n * ========================================================================\r\n * @method removeClass\r\n * @param {HTMLElement} el - DOM 节点\r\n * @param {String} className - 样式名称\r\n * @returns {Boolean}\r\n */\r\nconst removeClass = (el, className) => {\r\n let allClass = el.className\r\n let classList\r\n\r\n if (!allClass || !hasClass(el, className)) {\r\n return false\r\n }\r\n\r\n classList = el.classList\r\n\r\n if (classList?.remove) {\r\n classList.remove(className)\r\n } else {\r\n allClass = trim(allClass.replace(className, ''))\r\n el.className = allClass\r\n }\r\n}\r\n\r\nexport default removeClass\r\n","import isString from '@/utils/types/isString'\r\n\r\n/**\r\n * 清楚字符串起始位置所有的空格\r\n * ========================================================================\r\n * @method trim\r\n * @param {string} str\r\n * @returns {string|Boolean}\r\n */\r\nconst trim = (str) => {\r\n if (!isString(str)) {\r\n return false\r\n }\r\n return str.replace(/(^\\s+)|(\\s+$)/g, '')\r\n}\r\n\r\nexport default trim\r\n","/**\r\n * 获取 DOM 节点相对于窗口的 left (纵坐标)值\r\n * ========================================================================\r\n * @method offsetTop\r\n * @param {HTMLElement} el - DOM 节点\r\n * @returns {Number}\r\n */\r\nconst offsetTop = (el) => {\r\n let top = el.offsetTop\r\n\r\n if (el.offsetParent !== null) {\r\n top += offsetTop(el.offsetParent)\r\n }\r\n\r\n return top\r\n}\r\n\r\nexport default offsetTop\r\n","/**\r\n * 获取HTML元素的某个CSS样式值\r\n * ====================================================\r\n * @param el\r\n * @param ruleName\r\n * @returns {*}\r\n */\r\nconst getStyle = (el, ruleName) => {\r\n return getComputedStyle(el)[ruleName]\r\n}\r\n\r\nexport default getStyle\r\n","const setProperty = (prop, value) => {\r\n const documentElement = document.documentElement\r\n documentElement.style.setProperty(prop, value)\r\n}\r\n\r\nexport default setProperty\r\n","/**\r\n * 存储订阅者(主题和处理器的)私有对象\r\n * ========================================================================\r\n * @type {{}}\r\n * @private\r\n */\r\nconst _subscribers = {}\r\n\r\nexport default _subscribers\r\n","import hasOwn from '@/utils/lang/hasOwn'\r\nimport _subscribers from './_subscribers'\r\n\r\n/**\r\n * 判断是否存在与给定 topic 完全匹配的订阅者信息\r\n * ========================================================================\r\n * @method _hasDirectSubscribersFor\r\n * @param {String} topic - (必须)订阅主题字符串\r\n * @returns {Boolean}\r\n */\r\nconst _hasDirectSubscribersFor = (topic) => {\r\n return hasOwn(_subscribers, topic) && _subscribers[topic].length > 0\r\n}\r\n\r\nexport default _hasDirectSubscribersFor\r\n","import _hasDirectSubscribersFor from './_hasDirectSubscribersFor'\r\nimport _hasSubscribers from './_hasSubscribers'\r\n\r\n/**\r\n * 判断是否存在包含 topic 指定的订阅者信息\r\n * ========================================================================\r\n * @method has\r\n * @param {String} topic - (必须)主题名称\r\n * @param {Boolean} [isDirect] - (可选)是否为直接的主题,默认值:true\r\n * @returns {Boolean}\r\n */\r\nconst has = (topic, isDirect = true) => {\r\n return isDirect ? _hasDirectSubscribersFor(topic) : _hasSubscribers(topic)\r\n}\r\n\r\nexport default has\r\n","import _hasDirectSubscribersFor from './_hasDirectSubscribersFor'\r\n\r\n/**\r\n * 判断是否存在包含给定 topic 相关的订阅者信息\r\n * ========================================================================\r\n * @method _hasSubscribers\r\n * @param {String} topic - (必须)订阅主题字符串\r\n * @returns {Boolean}\r\n */\r\nconst _hasSubscribers = (topic) => {\r\n let found = _hasDirectSubscribersFor(topic)\r\n let position = topic.lastIndexOf('.')\r\n\r\n while (!found && position !== -1) {\r\n topic = topic.substring(0, position)\r\n position = topic.lastIndexOf('.')\r\n found = _hasDirectSubscribersFor(topic)\r\n }\r\n\r\n return found\r\n}\r\n\r\nexport default _hasSubscribers\r\n","import isTypedArray from '@/utils/types/isTypedArray'\r\nimport has from './has'\r\nimport _hasDirectSubscribersFor from './_hasDirectSubscribersFor'\r\nimport _subscribers from './_subscribers'\r\n\r\n/**\r\n * (异步)发布订阅主题信息\r\n * ========================================================================\r\n * 主题默认是异步发布的。确保在消费者处理主题时,主题的发起者不会被阻止。\r\n * ========================================================================\r\n * @method emit\r\n * @param {String} topic - (必须)主题名称\r\n * @param {Object} [data] - (可选)数据对象\r\n * @param {Boolean} [async] - (可选) 是否异步发布\r\n */\r\nconst emit = (topic, data, async = true) => {\r\n const execute = (topic) => {\r\n if (!_hasDirectSubscribersFor(topic)) {\r\n return false\r\n }\r\n\r\n _subscribers[topic].forEach((subscriber) => {\r\n // 针对 mqtt 消息服务返回的 Uint8Array 类似的 typed arrays 格式的数据\r\n // 采用 toString() 方法转化为普通(JSON)字符串\r\n const message = isTypedArray(data) ? data.toString() : data\r\n\r\n subscriber.callback.call(subscriber.context || subscriber, message)\r\n })\r\n }\r\n const deliver = () => {\r\n let subscriber = topic\r\n let position = topic.lastIndexOf('.')\r\n\r\n while (position !== -1) {\r\n subscriber = subscriber.substring(0, position)\r\n position = subscriber.lastIndexOf('.')\r\n\r\n execute(subscriber)\r\n }\r\n\r\n // 执行 topic 对应的处理器\r\n execute(topic)\r\n // 执行特殊 topic:'*'(监听全部消息的发布)\r\n execute('*')\r\n }\r\n\r\n if (!has(topic)) {\r\n return false\r\n }\r\n\r\n if (async) {\r\n setTimeout(deliver, 10)\r\n } else {\r\n deliver()\r\n }\r\n}\r\n\r\nexport default emit\r\n","import toString from '@/utils/lang/toString'\r\n/**\r\n * 判断检测数据是否为 Typed Arrays 类型的数据\r\n * ========================================================================\r\n * @param {*} val\r\n * @returns {boolean}\r\n */\r\nconst isTypedArray = (val) => {\r\n const TYPES = [\r\n '[object Int8Array]',\r\n '[object Uint8Array]',\r\n '[object Uint8ClampedArray]',\r\n '[object Int16Array]',\r\n '[object Uint16Array]',\r\n '[object Int32Array]',\r\n '[object Uint32Array]',\r\n '[object Float32Array]',\r\n '[object Float64Array]',\r\n '[object BigInt64Array]',\r\n '[object BigUint64Array]'\r\n ]\r\n\r\n return TYPES.indexOf(toString(val)) > -1\r\n}\r\n\r\nexport default isTypedArray\r\n","/**\r\n * 生成唯一 id 字符串的函数\r\n * ========================================================================\r\n * @method guid\r\n * @param {String} [prefix] - 生成 id 的前缀字符串\r\n * @return {String} 返回一个表示唯一 id 的字符串\r\n */\r\nconst guid = (() => {\r\n let uuid = 0\r\n\r\n return (prefix) => {\r\n uuid += 1\r\n\r\n return prefix ? prefix + '-' + uuid : 'guid-' + uuid\r\n }\r\n})()\r\n\r\nexport default guid\r\n","import hasOwn from '@/utils/lang/hasOwn'\r\nimport _subscribers from './_subscribers'\r\n\r\n/**\r\n * 删除与给定 topic 相同的订阅者信息\r\n * ========================================================================\r\n * @method _removeSubscriber\r\n * @param {String} topic - (必须)订阅主题字符串\r\n * @returns {Boolean}\r\n */\r\nconst _removeSubscriber = (topic) => {\r\n if (!hasOwn(_subscribers, topic)) {\r\n return false\r\n }\r\n\r\n delete _subscribers[topic]\r\n}\r\n\r\nexport default _removeSubscriber\r\n","import has from './has'\r\nimport _removeSubscriber from './_removeSubscriber'\r\nimport _removeSubscriberByToken from './_removeSubscriberByToken'\r\n\r\n/**\r\n * 取消订阅主题\r\n * ========================================================================\r\n * @method off\r\n * @param {String} topic - (必须)订阅的主题\r\n * @param {Function|String} [token] - (可选)订阅主题的处理器函数或者唯一 Id 值\r\n */\r\nconst off = (topic, token) => {\r\n if (!has(topic)) {\r\n return false\r\n }\r\n\r\n if (token) {\r\n _removeSubscriberByToken(token)\r\n } else {\r\n _removeSubscriber(topic)\r\n }\r\n}\r\n\r\nexport default off\r\n","import _subscribers from './_subscribers'\r\nimport _removeSubscriber from './_removeSubscriber'\r\n\r\n/**\r\n * 通过订阅者 token 值删除订阅者信息\r\n * ========================================================================\r\n * @method _removeSubscriberByToken\r\n * @param {String} token - 订阅者 token 字符串\r\n * @returns {boolean}\r\n * @private\r\n */\r\nconst _removeSubscriberByToken = (token) => {\r\n const keys = Object.keys(_subscribers)\r\n let index = -1\r\n\r\n if (!token || keys.length < 1) {\r\n return false\r\n }\r\n\r\n keys.forEach((subject) => {\r\n const subscriber = _subscribers[subject]\r\n let topic\r\n\r\n subscriber.forEach((execution, j) => {\r\n if (execution.callback === token || execution.token === token) {\r\n topic = execution.topic\r\n subscriber.splice(index, j)\r\n }\r\n })\r\n\r\n /* istanbul ignore else */\r\n if (subscriber.length < 1) {\r\n _removeSubscriber(topic)\r\n }\r\n })\r\n}\r\n\r\nexport default _removeSubscriberByToken\r\n","import isString from './utils/types/isString'\r\n\r\nimport extend from './utils/lang/extend'\r\nimport hasOwn from './utils/lang/hasOwn'\r\n\r\nimport isObject from './utils/types/isObject'\r\n\r\nimport publish from './utils/observer/emit'\r\nimport subscribe from './utils/observer/on'\r\nimport unsubscribe from './utils/observer/off'\r\n\r\nclass Component {\r\n constructor(options) {\r\n this.attrs = {}\r\n this.name = 'component'\r\n\r\n if (options) {\r\n this.initialize(options)\r\n }\r\n }\r\n\r\n initialize(options) {\r\n this.attr(options).render().addListeners()\r\n return this\r\n }\r\n\r\n attr(prop, value) {\r\n const attrs = this.attrs\r\n\r\n if (isString(prop)) {\r\n // 只能扩展 attrs 中已有的属性\r\n if (value && hasOwn(attrs, prop)) {\r\n // 更新单个配置信息\r\n attrs[prop] = value\r\n return this\r\n }\r\n\r\n // 只传递 prop 参数,则返回对应的属性值\r\n return attrs[prop]\r\n } else if (isObject(prop)) {\r\n // 批量更新配置信息\r\n extend(attrs, prop)\r\n\r\n return this\r\n } else if (arguments.length === 0) {\r\n // 不传递参数,直接返回整个\r\n return attrs\r\n }\r\n\r\n return this\r\n }\r\n\r\n render() {\r\n return this\r\n }\r\n\r\n refresh() {\r\n return this\r\n }\r\n\r\n destroy() {\r\n this.removeListeners()\r\n return this\r\n }\r\n\r\n reload(options) {\r\n let attrs = this.attr()\r\n\r\n if (options) {\r\n attrs = this.attr(options)\r\n }\r\n\r\n this.destroy().initialize(attrs)\r\n\r\n return this\r\n }\r\n\r\n $emit(event, data) {\r\n publish(event, data)\r\n return this\r\n }\r\n\r\n $on(event, callback) {\r\n subscribe(event, callback, this)\r\n return this\r\n }\r\n\r\n $off(event, callback) {\r\n unsubscribe(event, callback)\r\n return this\r\n }\r\n\r\n addListeners() {\r\n return this\r\n }\r\n\r\n removeListeners() {\r\n return this\r\n }\r\n}\r\n\r\nexport default Component\r\n","import hasOwn from './hasOwn'\r\n\r\n/**\r\n * 扩展对象\r\n * ========================================================================\r\n * @method extend\r\n * @param {Object} origin\r\n * @param {Object} source\r\n */\r\nconst extend = (origin, source) => {\r\n const keys = Object.keys(source)\r\n\r\n keys.forEach((prop) => {\r\n if (hasOwn(source, prop)) {\r\n origin[prop] = source[prop]\r\n }\r\n })\r\n}\r\n\r\nexport default extend\r\n","import isFunction from '@/utils/types/isFunction'\r\nimport guid from '@/utils/lang/guid'\r\n\r\nimport _subscribers from './_subscribers'\r\n\r\n/**\r\n * 订阅主题,并给出处理器函数\r\n * ========================================================================\r\n * @method on\r\n * @param {String} topic - (必须)主题名称\r\n * @param {Function} handler - (必须)主题的处理器函数\r\n * @param {Object} [context] - (可选)指定 this 执行上下文\r\n * @return {String} - 唯一的 token 字符串,例如:'guid-1'。\r\n */\r\nconst on = (topic, handler, context = null) => {\r\n const token = guid()\r\n let subject = typeof topic === 'symbol' ? topic.toString() : topic\r\n\r\n if (!isFunction(handler)) {\r\n return ''\r\n }\r\n\r\n /* istanbul ignore else */\r\n if (!_subscribers[subject]) {\r\n _subscribers[subject] = []\r\n }\r\n\r\n _subscribers[subject].push({\r\n topic: subject,\r\n callback: handler,\r\n context,\r\n token\r\n })\r\n\r\n return token\r\n}\r\n\r\nexport default on\r\n","/**\r\n * timeSlice.js 时间切片功能函数\r\n * ====================================================\r\n * Created By: Yaohaixiao\r\n * Update: 2023.09.04\r\n */\r\nimport isFunction from '@/utils/types/isFunction'\r\nimport later from './later'\r\n\r\nconst queue = []\r\nlet isHandling\r\nlet done\r\n\r\n// Shim from https://developers.google.com/web/updates/2015/08/using-requestidlecallback\r\nif (typeof window.requestIdleCallback === 'undefined') {\r\n window.requestIdleCallback = function (cb) {\r\n const start = Date.now()\r\n return later(function () {\r\n cb({\r\n didTimeout: false,\r\n timeRemaining: function () {\r\n return Math.max(0, 50 - (Date.now() - start))\r\n }\r\n })\r\n }, 10)\r\n }\r\n\r\n window.cancelIdleCallback = function (id) {\r\n clearTimeout(id)\r\n }\r\n}\r\n\r\nfunction runIdle(idleDeadline) {\r\n while (idleDeadline.timeRemaining() > 0 && queue.length) {\r\n const fn = queue.shift()\r\n\r\n if (!isFunction(fn)) {\r\n return false\r\n }\r\n\r\n fn()\r\n }\r\n\r\n if (queue.length) {\r\n isHandling = requestIdleCallback(runIdle)\r\n } else {\r\n isHandling = 0\r\n\r\n if (isFunction(done)) {\r\n done()\r\n done = null\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * 时间切片功能函数:主要用于优化长时任务的性能,将长时任务分解成\r\n * 多个短时间任务\r\n * ====================================================\r\n * @param {Function} fn - 需要在空闲时执行的回调函数\r\n * @param {Function} afterComplete - queen 的\r\n * @return {(function(): (boolean|undefined))|*|boolean}\r\n */\r\nconst timeSlice = (fn, afterComplete = null) => {\r\n queue.push(fn)\r\n\r\n if (isFunction(afterComplete)) {\r\n done = afterComplete\r\n }\r\n\r\n if (!isHandling) {\r\n requestIdleCallback(runIdle)\r\n }\r\n}\r\n\r\nexport default timeSlice\r\n","import createElement from '@/utils/dom/createElement'\r\nimport timeSlice from '@/utils/lang/timeSlice'\r\n\r\nconst _paintChapters = ($list, chapters, showCode = false) => {\r\n const LIMIT = 400\r\n const count = chapters.length\r\n const clones = [...chapters]\r\n const paint = (parts) => {\r\n const byId = (id) => $list.querySelector(`#${id}`)\r\n parts.forEach((chapter) => {\r\n const pid = chapter.pid\r\n const id = chapter.id\r\n const code = chapter.code\r\n const rel = chapter.rel\r\n const children = []\r\n const $text = createElement(\r\n 'span',\r\n {\r\n className: 'outline-navigator__text'\r\n },\r\n chapter.text\r\n )\r\n let $link\r\n let $code\r\n let $li\r\n let $subject\r\n let $chapter\r\n\r\n if (showCode) {\r\n $code = createElement(\r\n 'span',\r\n {\r\n className: 'outline-navigator__code',\r\n 'data-id': id\r\n },\r\n chapter.code\r\n )\r\n\r\n children.push($code)\r\n }\r\n\r\n children.push($text)\r\n\r\n $link = createElement(\r\n 'a',\r\n {\r\n id: `chapter__anchor-${id}`,\r\n className: 'outline-navigator__anchor',\r\n href: '#' + rel,\r\n rel: rel,\r\n 'data-id': id,\r\n 'data-code': code\r\n },\r\n children\r\n )\r\n\r\n $li = createElement(\r\n 'li',\r\n {\r\n id: `chapter-${id}`,\r\n className: 'outline-navigator__item',\r\n 'data-id': id,\r\n 'data-code': code\r\n },\r\n $link\r\n )\r\n\r\n if (pid === -1) {\r\n $list.appendChild($li)\r\n } else {\r\n $chapter = byId(`chapter-${pid}`)\r\n $subject = byId(`subject-${pid}`)\r\n\r\n if (!$subject) {\r\n $subject = createElement(\r\n 'ul',\r\n {\r\n id: 'subject-' + pid,\r\n className: 'outline-navigator__subject'\r\n },\r\n $li\r\n )\r\n\r\n $chapter.appendChild($subject)\r\n } else {\r\n $subject.appendChild($li)\r\n }\r\n }\r\n })\r\n }\r\n\r\n // 在大量 DOM 菜单绘制的时候,使用 TIME SLICE 拆分绘制任务\r\n // 以避免一次绘制大量 DOM 导致占用资源过高,导致卡死\r\n if (count > LIMIT) {\r\n // 同步绘制\r\n paint(clones.splice(0, LIMIT))\r\n\r\n // 剩余的采用 timeSlice 机制绘制\r\n while (clones.length > 0) {\r\n const once = clones.splice(0, LIMIT)\r\n timeSlice(() => {\r\n paint(once)\r\n })\r\n }\r\n } else {\r\n paint(clones)\r\n }\r\n}\r\n\r\nexport default _paintChapters\r\n","import isString from '@/utils/types/isString'\r\nimport isFunction from '@/utils/types/isFunction'\r\nimport isElement from '@/utils/types/isElement'\r\nimport later from '@/utils/lang/later'\r\nimport cloneDeep from '@/utils/lang/cloneDeep'\r\n\r\nimport at from '@/utils/event/at'\r\nimport on from '@/utils/event/on'\r\nimport off from '@/utils/event/off'\r\nimport stop from '@/utils/event/stop'\r\n\r\nimport createElement from '@/utils/dom/createElement'\r\nimport scrollTo from '@/utils/dom/scrollTo'\r\nimport addClass from '@/utils/dom/addClass'\r\nimport intersection from '@/utils/dom/intersection'\r\nimport removeClass from '@/utils/dom/removeClass'\r\nimport offsetTop from '@/utils/dom/offsetTop'\r\nimport getStyle from '@/utils/dom/getStyle'\r\nimport setProperty from '@/utils/dom/setProperty'\r\nimport inBounding from '@/utils/dom/inBounding'\r\nimport getScrollElement from '@/utils/dom/getScrollElement'\r\n\r\nimport Component from '@/component'\r\n\r\nimport _paintChapters from './utils/_paintChapters'\r\n\r\nimport './navigator.less'\r\n\r\nconst HIDDEN = 'outline-navigator_hidden'\r\nconst EXPANDED = 'outline-navigator_expanded'\r\nconst FOLDED = 'outline-navigator_folded'\r\n\r\nclass Navigator extends Component {\r\n constructor(options) {\r\n super()\r\n\r\n this._default()\r\n\r\n this.scrollTimer = null\r\n this.resizeTimer = null\r\n this.observerTimer = null\r\n this.Observer = null\r\n\r\n if (options) {\r\n this.initialize(options)\r\n }\r\n }\r\n\r\n _default() {\r\n this.attrs = cloneDeep(Navigator.DEFAULTS)\r\n\r\n this.$el = null\r\n this.$title = null\r\n this.$main = null\r\n this.$list = null\r\n this.$placeholder = null\r\n this.$parentElement = null\r\n this.$scrollElement = null\r\n this.$active = null\r\n\r\n this.chapters = []\r\n this.active = 0\r\n this.offsetWidth = 0\r\n this.offsetTop = 0\r\n this.playing = false\r\n this.closed = false\r\n\r\n return this\r\n }\r\n\r\n initialize(options) {\r\n let created\r\n let parentElement\r\n let scrollElement\r\n let $parent\r\n\r\n this.attr(options)\r\n\r\n created = this.attr('created')\r\n parentElement = this.attr('parentElement')\r\n scrollElement = this.attr('scrollElement')\r\n\r\n if (isString(parentElement)) {\r\n $parent = document.querySelector(parentElement)\r\n } else if (isElement(parentElement)) {\r\n $parent = parentElement\r\n }\r\n this.$parentElement = $parent\r\n this.$scrollElement = getScrollElement(scrollElement)\r\n\r\n this.chapters = this.attr('chapters')\r\n this.closed = this.attr('closed')\r\n this.active = this.attr('active')\r\n\r\n if (isFunction(created)) {\r\n created.call(this)\r\n }\r\n\r\n if (this.chapters.length < 1) {\r\n return this\r\n }\r\n\r\n this.render().addListeners()\r\n\r\n this.$active = document.querySelector(`#chapter-${this.active}`)\r\n\r\n return this\r\n }\r\n\r\n isClosed() {\r\n return this.closed\r\n }\r\n\r\n isSticky() {\r\n const position = this.attr('position')\r\n return position === 'sticky'\r\n }\r\n\r\n isFixed() {\r\n const position = this.attr('position')\r\n return position === 'fixed'\r\n }\r\n\r\n isInside() {\r\n return this.isFixed() || this.isSticky()\r\n }\r\n\r\n isOutside() {\r\n return !this.isInside()\r\n }\r\n\r\n count() {\r\n return this.chapters.length\r\n }\r\n\r\n _paintEdge() {\r\n const $fragment = document.createDocumentFragment()\r\n const STICKY = 'outline-navigator_sticky'\r\n const title = this.attr('title')\r\n const animationCurrent = this.attr('animationCurrent')\r\n const customClass = this.attr('customClass')\r\n const $parentElement = this.$parentElement\r\n const children = []\r\n const contents = []\r\n let $title = null\r\n let $el\r\n let $main\r\n let $list\r\n let $placeholder\r\n\r\n if (!$parentElement) {\r\n return this\r\n }\r\n\r\n if (this.isInside() && title) {\r\n $title = createElement(\r\n 'h2',\r\n {\r\n className: 'outline-navigator__title'\r\n },\r\n title\r\n )\r\n this.$title = $title\r\n contents.push($title)\r\n }\r\n\r\n $list = createElement('ul', {\r\n // 为优化性能,添加了 _fixed 和 _hidden\r\n // fixed 为了让 $list 脱离流布局\r\n // hidden 让 $list 不可见\r\n className: `outline-navigator__list`\r\n })\r\n this.$list = $list\r\n children.push($list)\r\n\r\n if (animationCurrent) {\r\n $placeholder = createElement('div', {\r\n className: 'outline-navigator__placeholder'\r\n })\r\n this.$placeholder = $placeholder\r\n children.push($placeholder)\r\n }\r\n\r\n $main = createElement(\r\n 'div',\r\n {\r\n className: 'outline-navigator__main'\r\n },\r\n children\r\n )\r\n this.$main = $main\r\n contents.push($main)\r\n\r\n $el = createElement(\r\n 'nav',\r\n {\r\n id: 'outline-navigator',\r\n className: `outline-navigator ${HIDDEN}`\r\n },\r\n contents\r\n )\r\n this.$el = $el\r\n\r\n if (this.isSticky()) {\r\n this.calculateStickyHeight()\r\n addClass($el, STICKY)\r\n }\r\n\r\n if (customClass) {\r\n addClass($el, customClass)\r\n }\r\n $fragment.appendChild($el)\r\n $parentElement.appendChild($fragment)\r\n\r\n return this\r\n }\r\n\r\n render() {\r\n const mounted = this.attr('mounted')\r\n const $parentElement = this.$parentElement\r\n const chapters = this.chapters\r\n const count = this.count()\r\n let $el\r\n\r\n if (!$parentElement || chapters.length < 1) {\r\n return this\r\n }\r\n\r\n if (this.isInside()) {\r\n addClass($parentElement, 'outline-navigator-parent')\r\n }\r\n\r\n this._paintEdge()\r\n $el = this.$el\r\n\r\n this._paint(chapters)\r\n\r\n later(() => {\r\n this.highlight(this.active)\r\n }, 60)\r\n\r\n this.offsetTop = offsetTop($el)\r\n this.offsetWidth = $el.offsetWidth\r\n\r\n if (this.isFixed()) {\r\n this.sticky()\r\n setProperty('--outline-navigator-width', `${this.offsetWidth}px`)\r\n }\r\n\r\n if (isFunction(mounted)) {\r\n mounted.call(this)\r\n }\r\n\r\n if (count < 400) {\r\n this.onObserver()\r\n }\r\n\r\n return this\r\n }\r\n\r\n erase() {\r\n this.$list.innerHTML = ''\r\n\r\n return this\r\n }\r\n\r\n _paint(chapters) {\r\n const showCode = this.attr('showCode')\r\n const $el = this.$el\r\n const $list = this.$list\r\n\r\n _paintChapters($list, chapters, showCode)\r\n removeClass($el, HIDDEN)\r\n addClass($el, EXPANDED)\r\n\r\n return this\r\n }\r\n\r\n _remove() {\r\n this.$parentElement.removeChild(this.$el)\r\n return this\r\n }\r\n\r\n refresh(chapters) {\r\n const $el = this.$el\r\n\r\n removeClass($el, HIDDEN)\r\n this.erase()._paint(chapters)\r\n\r\n return this\r\n }\r\n\r\n _getPlaceholderOffset(index) {\r\n const $main = this.$main\r\n const $list = this.$list\r\n const $anchor = $list.querySelector('.outline-navigator__anchor')\r\n const mainPaddingTop = parseInt(getStyle($main, 'padding-top'), 10)\r\n const mainBorderTop = parseInt(getStyle($main, 'border-top-width'), 10)\r\n const placeholderPaddingTop = parseInt(getStyle($list, 'padding-top'), 10)\r\n const placeholderMarginTop = parseInt(getStyle($list, 'margin-top'), 10)\r\n const placeholderBorderTop = parseInt(\r\n getStyle($list, 'border-top-width'),\r\n 10\r\n )\r\n let height = $anchor.offsetHeight\r\n let offsetTop = 0\r\n let top\r\n\r\n if (mainPaddingTop) {\r\n offsetTop += mainPaddingTop\r\n }\r\n\r\n if (placeholderPaddingTop) {\r\n offsetTop += placeholderPaddingTop\r\n }\r\n\r\n if (placeholderMarginTop) {\r\n offsetTop += placeholderMarginTop\r\n }\r\n\r\n if (mainBorderTop) {\r\n offsetTop += mainBorderTop\r\n }\r\n\r\n if (placeholderBorderTop) {\r\n offsetTop += placeholderBorderTop\r\n }\r\n\r\n top = height * index\r\n\r\n return offsetTop + top\r\n }\r\n\r\n positionPlaceholder(index) {\r\n const $list = this.$list\r\n const $placeholder = this.$placeholder\r\n const $anchor = $list.querySelector('.outline-navigator__anchor')\r\n const animationCurrent = this.attr('animationCurrent')\r\n const height = $anchor.offsetHeight\r\n let offsetTop = 0\r\n\r\n if (!animationCurrent) {\r\n return this\r\n }\r\n\r\n offsetTop = this._getPlaceholderOffset(index)\r\n\r\n $placeholder.style.cssText = `transform: translateY(${offsetTop}px);height:${height}px;`\r\n\r\n return this\r\n }\r\n\r\n highlight(id) {\r\n const $el = this.$el\r\n const animationCurrent = this.attr('animationCurrent')\r\n const position = this.attr('position')\r\n const ACTIVE = 'outline-navigator_active'\r\n const HIGHLIGHT = 'outline-navigator_highlight'\r\n let $parent = position === 'relative' ? this.$parentElement : this.$main\r\n let $anchor = null\r\n let placeholderOffsetTop = 0\r\n\r\n if (!$el) {\r\n return this\r\n }\r\n\r\n $anchor = $el.querySelector(`#chapter__anchor-${id}`)\r\n\r\n if (!$anchor) {\r\n return this\r\n }\r\n\r\n this.active = parseInt($anchor.getAttribute('data-id'), 10)\r\n\r\n if (this.$active) {\r\n removeClass(this.$active, HIGHLIGHT)\r\n removeClass(this.$active, ACTIVE)\r\n }\r\n\r\n this.$active = $anchor\r\n addClass(this.$active, ACTIVE)\r\n\r\n if (animationCurrent) {\r\n this.positionPlaceholder(this.active)\r\n } else {\r\n addClass(this.$active, HIGHLIGHT)\r\n }\r\n\r\n later(() => {\r\n if (!inBounding(this.$active, $parent)) {\r\n placeholderOffsetTop = this._getPlaceholderOffset(this.active)\r\n scrollTo($parent, placeholderOffsetTop)\r\n }\r\n })\r\n\r\n return this\r\n }\r\n\r\n sticky() {\r\n const afterSticky = this.attr('afterSticky')\r\n const FIXED = 'outline-navigator_fixed'\r\n const $el = this.$el\r\n const top = this.offsetTop\r\n const scrollTop = this.$scrollElement.scrollTop\r\n let isStickying\r\n\r\n if (!this.isFixed()) {\r\n return this\r\n }\r\n\r\n isStickying = scrollTop >= top\r\n\r\n if (isStickying) {\r\n addClass($el, FIXED)\r\n } else {\r\n removeClass($el, FIXED)\r\n }\r\n\r\n if (isFunction(afterSticky)) {\r\n afterSticky.call(this, this.isClosed(), isStickying)\r\n }\r\n\r\n return this\r\n }\r\n\r\n calculateStickyHeight() {\r\n const documentElement = document.documentElement\r\n const height = Math.max(\r\n documentElement.clientHeight || 0,\r\n window.innerHeight || 0\r\n )\r\n setProperty('--outline-sticky-height', `${height}px`)\r\n return this\r\n }\r\n\r\n scrollTo(top, after) {\r\n const el = this.$scrollElement\r\n\r\n scrollTo(el, top, after)\r\n\r\n return this\r\n }\r\n\r\n show() {\r\n const opened = this.attr('afterOpened')\r\n const count = this.count()\r\n const $el = this.$el\r\n const $parent = this.$parentElement\r\n\r\n if (this.isInside()) {\r\n if (count > 800) {\r\n removeClass($parent, HIDDEN)\r\n } else {\r\n removeClass($parent, HIDDEN)\r\n later(() => {\r\n removeClass($parent, FOLDED)\r\n addClass($parent, EXPANDED)\r\n }, 30)\r\n }\r\n } else {\r\n removeClass($el, HIDDEN)\r\n }\r\n this.closed = false\r\n\r\n if (isFunction(opened)) {\r\n opened.call(this)\r\n }\r\n\r\n return this\r\n }\r\n\r\n hide() {\r\n const closed = this.attr('afterClosed')\r\n const count = this.count()\r\n const $el = this.$el\r\n const $parent = this.$parentElement\r\n\r\n if (this.isInside()) {\r\n if (count > 800) {\r\n addClass($parent, HIDDEN)\r\n } else {\r\n addClass($parent, FOLDED)\r\n removeClass($parent, EXPANDED)\r\n later(() => {\r\n addClass($parent, HIDDEN)\r\n })\r\n }\r\n } else {\r\n addClass($el, HIDDEN)\r\n }\r\n this.closed = true\r\n\r\n if (isFunction(closed)) {\r\n closed.call(this)\r\n }\r\n\r\n return this\r\n }\r\n\r\n toggle() {\r\n const afterToggle = this.attr('afterToggle')\r\n const top = this.offsetTop\r\n const scrollTop = this.$scrollElement.scrollTop\r\n let isStickying\r\n\r\n if (this.isClosed()) {\r\n this.show()\r\n } else {\r\n this.hide()\r\n }\r\n\r\n if (isFunction(afterToggle)) {\r\n later(() => {\r\n isStickying = scrollTop >= top\r\n afterToggle.call(this, this.isClosed(), isStickying)\r\n })\r\n }\r\n\r\n return this\r\n }\r\n\r\n destroy() {\r\n const beforeDestroy = this.attr('beforeDestroy')\r\n const afterDestroy = this.attr('afterDestroy')\r\n\r\n if (isFunction(beforeDestroy)) {\r\n beforeDestroy.call(this)\r\n }\r\n\r\n this.removeListeners()._remove()._default()\r\n\r\n if (this.scrollTimer) {\r\n clearTimeout(this.scrollTimer)\r\n this.scrollTimer = null\r\n }\r\n\r\n if (this.resizeTimer) {\r\n clearTimeout(this.resizeTimer)\r\n this.resizeTimer = null\r\n }\r\n\r\n if (this.observerTimer) {\r\n clearTimeout(this.observerTimer)\r\n this.observerTimer = null\r\n }\r\n\r\n if (this.Observer) {\r\n this.Observer = null\r\n }\r\n\r\n if (isFunction(afterDestroy)) {\r\n afterDestroy.call(this)\r\n }\r\n\r\n return this\r\n }\r\n\r\n onObserver() {\r\n const selector = this.attr('selector')\r\n\r\n this.Observer = intersection(\r\n ($heading) => {\r\n const id = $heading.getAttribute('data-id')\r\n\r\n if (this.playing) {\r\n return false\r\n }\r\n\r\n if (this.observerTimer) {\r\n clearTimeout(this.observerTimer)\r\n }\r\n\r\n this.observerTimer = later(() => {\r\n this.highlight(id)\r\n }, 100)\r\n },\r\n {\r\n selector,\r\n context: this\r\n }\r\n )\r\n\r\n return this\r\n }\r\n\r\n onSelect(evt) {\r\n const stickyHeight = this.attr('stickyHeight')\r\n const $anchor = evt.delegateTarget\r\n const id = $anchor.getAttribute('data-id')\r\n const headingId = $anchor.href.split('#')[1]\r\n const $heading = document.querySelector(`#${headingId}`)\r\n const top = offsetTop($heading) - (stickyHeight + 10)\r\n const min = 0\r\n const max = this.$scrollElement.scrollHeight\r\n const afterScroll = this.attr('afterScroll')\r\n const after = () => {\r\n if (isFunction(afterScroll)) {\r\n afterScroll.call(this, 'chapter')\r\n }\r\n\r\n later(() => {\r\n this.playing = false\r\n this.$emit('toolbar:update', {\r\n top,\r\n min,\r\n max\r\n })\r\n })\r\n }\r\n\r\n this.playing = true\r\n if (this.isFixed()) {\r\n this.sticky()\r\n later(() => {\r\n this.scrollTo(top, after)\r\n this.highlight(id)\r\n }, 10)\r\n } else {\r\n this.scrollTo(top, after)\r\n this.highlight(id)\r\n }\r\n\r\n stop(evt)\r\n\r\n return this\r\n }\r\n\r\n onScroll() {\r\n const $scrollElement = this.$scrollElement\r\n\r\n if (this.scrollTimer) {\r\n clearTimeout(this.scrollTimer)\r\n }\r\n\r\n this.scrollTimer = later(() => {\r\n const top = $scrollElement.scrollTop\r\n const min = 0\r\n const max = $scrollElement.scrollHeight - $scrollElement.clientHeight\r\n\r\n if (this.isFixed()) {\r\n this.sticky()\r\n }\r\n\r\n this.$emit('toolbar:update', {\r\n top,\r\n min,\r\n max\r\n })\r\n }, 100)\r\n\r\n return this\r\n }\r\n\r\n onResize() {\r\n // 添加判断\r\n if (!this.isSticky()) {\r\n return this\r\n }\r\n\r\n if (this.resizeTimer) {\r\n clearTimeout(this.resizeTimer)\r\n }\r\n\r\n this.resizeTimer = later(() => {\r\n this.calculateStickyHeight()\r\n })\r\n\r\n return this\r\n }\r\n\r\n onRefresh(chapters) {\r\n this.refresh(chapters)\r\n\r\n return this\r\n }\r\n\r\n addListeners() {\r\n const $el = this.$el\r\n const $scrollElement = this.$scrollElement\r\n const tagName = $scrollElement.tagName.toLowerCase()\r\n let $element = $scrollElement\r\n\r\n if (this.count() < 1) {\r\n return this\r\n }\r\n\r\n if (tagName === 'html' || tagName === 'body') {\r\n $element = window\r\n }\r\n\r\n on($el, '.outline-navigator__anchor', 'click', this.onSelect, this, true)\r\n at($element, 'scroll', this.onScroll, this, true)\r\n if (this.isSticky()) {\r\n at(window, 'resize', this.onResize, this, true)\r\n }\r\n\r\n this.$on('anchors:all:paint', this.onObserver, this)\r\n this.$on('navigator:refresh', this.onRefresh, this)\r\n\r\n return this\r\n }\r\n\r\n removeListeners() {\r\n const selector = this.attr('selector')\r\n const $el = this.$el\r\n const $scrollElement = this.$scrollElement\r\n const tagName = $scrollElement.tagName.toLowerCase()\r\n let $element = $scrollElement\r\n\r\n if (this.count() < 1) {\r\n return this\r\n }\r\n\r\n if (tagName === 'html' || tagName === 'body') {\r\n $element = window\r\n }\r\n\r\n off($el, 'click', this.onSelect)\r\n off($element, 'scroll', this.onScroll)\r\n if (this.isSticky()) {\r\n off(window, 'resize', this.onResize)\r\n }\r\n this.$off('anchors:all:paint')\r\n this.$off('navigator:refresh')\r\n\r\n if (this.Observer) {\r\n document.querySelectorAll(selector).forEach((section) => {\r\n this.Observer.unobserve(section)\r\n })\r\n }\r\n\r\n return this\r\n }\r\n}\r\n\r\nNavigator.DEFAULTS = (() => {\r\n const OPTIONS = {\r\n parentElement: '',\r\n scrollElement: '',\r\n selector: '.outline-heading',\r\n active: 0,\r\n closed: false,\r\n showCode: true,\r\n animationCurrent: true,\r\n position: 'relative',\r\n stickyHeight: 0,\r\n chapters: [],\r\n created: null,\r\n mounted: null,\r\n afterClosed: null,\r\n afterOpened: null,\r\n afterScroll: null,\r\n beforeDestroy: null,\r\n afterDestroy: null,\r\n afterSticky: null\r\n }\r\n\r\n return cloneDeep(OPTIONS)\r\n})()\r\n\r\nexport default Navigator\r\n","import isString from '../types/isString'\r\nimport isElement from '../types/isElement'\r\n\r\n/**\r\n * 通过给的 scrollElement 参数,获取滚动 DOM 元素\r\n * ========================================================================\r\n * @method getScrollElement\r\n * @param {String|HTMLElement} scrollElement\r\n * @returns {Element}\r\n * @private\r\n */\r\nconst getScrollElement = (scrollElement = null) => {\r\n let $rootElements\r\n let $scrollElement\r\n\r\n if (!scrollElement) {\r\n $rootElements = document.querySelectorAll('html,body')\r\n $scrollElement =\r\n $rootElements[0].scrollTop - $rootElements[1].scrollTop >= 0\r\n ? $rootElements[0]\r\n : $rootElements[1]\r\n } else {\r\n if (isString(scrollElement)) {\r\n $scrollElement = document.querySelector(scrollElement)\r\n } else if (isElement(scrollElement)) {\r\n $scrollElement = scrollElement\r\n }\r\n }\r\n\r\n return $scrollElement\r\n}\r\n\r\nexport default getScrollElement\r\n","import isElement from '../types/isElement'\r\n\r\n/**\r\n * 检测某个 DOM 节点的位置是否在另个一个 DOM 节点范围内\r\n * ========================================================================\r\n * @method inBounding\r\n * @param {HTMLElement} child\r\n * @param {HTMLElement} parent\r\n * @return {Boolean}\r\n */\r\nconst inBounding = (child, parent) => {\r\n let isInBounding = false\r\n let parentRect\r\n let childRect\r\n\r\n if (!isElement(child) || !isElement(parent)) {\r\n return isInBounding\r\n }\r\n\r\n parentRect = parent.getBoundingClientRect()\r\n childRect = child.getBoundingClientRect()\r\n\r\n isInBounding = !!(\r\n childRect.top >= parentRect.top &&\r\n childRect.right <= parentRect.right &&\r\n childRect.bottom <= parentRect.bottom &&\r\n childRect.left >= parentRect.left\r\n )\r\n\r\n return isInBounding\r\n}\r\n\r\nexport default inBounding\r\n","import isFunction from '../types/isFunction'\r\nimport isElement from '../types/isElement'\r\n\r\n/**\r\n * 通用的 IntersectionObserver 观察者处理器\r\n * ========================================================================\r\n * @method intersection\r\n * @param {Function} fn\r\n * @param {Object} [props]\r\n * @param {Object|HTMLElement} [props.root]\r\n * @param {String} [props.selector]\r\n * @param {Object} [props.context]\r\n * @param {String} [props.attr]\r\n * @param {String} [props.rootMargin]\r\n */\r\nconst intersection = (fn, props = {}) => {\r\n const root = props.root || null\r\n const selector = props.selector || '.outline-heading'\r\n const context = props.context || null\r\n const rootMargin = props.rootMargin || '0px 0px -90% 0px'\r\n const options = {\r\n rootMargin: rootMargin\r\n }\r\n // eslint-disable-next-line compat/compat\r\n const Observer = new IntersectionObserver((entries) => {\r\n entries.forEach((entry) => {\r\n if (entry.intersectionRatio > 0) {\r\n if (isFunction(fn)) {\r\n fn.call(context || entry.target, entry.target)\r\n }\r\n }\r\n })\r\n }, options)\r\n const $root = isElement(root) ? root : document\r\n\r\n if (root) {\r\n options.root = root\r\n }\r\n\r\n $root.querySelectorAll(selector).forEach((section) => {\r\n Observer.observe(section)\r\n })\r\n\r\n return Observer\r\n}\r\n\r\nexport default intersection\r\n","/**\r\n * 停止事件(阻止默认行为和阻止事件的捕获或冒泡)\r\n * ========================================================================\r\n * @method stop\r\n * @param {Event} evt - 事件对象\r\n *\r\n * @example\r\n *
\r\n * Service\r\n * Help\r\n *
\r\n *\r\n * const $nav = document.querySelector('#nav')\r\n * const $service = document.querySelector('.anchor')\r\n *\r\n * on($nav, 'click', function(evt) {\r\n * console.log('你点击了导航栏')\r\n * })\r\n *\r\n * on($anchor, 'click', function(evt) {\r\n * console.log('tagName', this.tagName)\r\n *\r\n * // 工作台输出:'a'\r\n * // 不会触发事件冒泡,输出:'你点击了导航栏'\r\n * // 也不会切换到 href 属性的页面,阻止了点击链接的默认行为\r\n * stopEvent(evt)\r\n * })\r\n */\r\nconst stop = function (evt) {\r\n evt.stopPropagation()\r\n evt.preventDefault()\r\n}\r\n\r\nexport default stop\r\n"],"names":["isString","str","toString","val","Object","prototype","apply","isFunction","isObject","o","isElement","nodeName","tagName","nodeType","later","fn","delay","setTimeout","isArray","Array","cloneDeep","obj","clone","from","assign","keys","forEach","key","CAPTURE_EVENTS","_off","el","type","capture","indexOf","_delegateListener","listeners","_listeners","index","length","listener","i","handler","splice","_delete","removeEventListener","purgeElement","recurse","$element","document","querySelector","$children","childNodes","getListeners","filter","arguments","$child","off","at","data","context","once","evt","overrideContext","call","push","addEventListener","matches","selector","sel","replace","msMatchesSelector","getParentOrHost","host","parentNode","on","target","getTarget","delegateTarget","closest","ctx","includeCTX","startsWith","isDOM","isHTMLCollection","fragment","isTextNode","hasOwn","prop","hasOwnProperty","hasClass","className","pattern","RegExp","allClass","classList","contains","exec","addClass","_classList","add","split","name","setAttributes","attrs","attr","value","setAttribute","toLowerCase","style","cssText","innerHTML","innerText","createElement","children","$fragment","createDocumentFragment","$el","isValidChild","child","append","createTextNode","appendChild","every","easeInQuad","x","scrollTo","scrollElement","top","afterStop","$scrollElement","_getScrollElement","$rootElements","querySelectorAll","scrollTop","step","distance","MAX_HEIGHT","scrollHeight","MAX_TOP","stop","play","requestAnimationFrame","removeClass","remove","offsetTop","offsetParent","getStyle","ruleName","getComputedStyle","setProperty","documentElement","_subscribers","_hasDirectSubscribersFor","topic","has","isDirect","found","position","lastIndexOf","substring","_hasSubscribers","emit","async","execute","subscriber","message","callback","deliver","guid","uuid","prefix","_removeSubscriber","token","subject","execution","j","_removeSubscriberByToken","Component","constructor","options","this","initialize","render","addListeners","origin","source","extend","refresh","destroy","removeListeners","reload","$emit","event","publish","$on","subscribe","$off","unsubscribe","queue","isHandling","done","runIdle","idleDeadline","timeRemaining","shift","requestIdleCallback","window","cb","start","Date","now","didTimeout","Math","max","cancelIdleCallback","id","clearTimeout","timeSlice","afterComplete","_paintChapters","$list","chapters","showCode","count","clones","_maybeArrayLike","_toConsumableArray","paint","parts","byId","chapter","pid","code","rel","$text","text","$link","$code","$li","$subject","$chapter","href","HIDDEN","EXPANDED","FOLDED","Navigator","super","_default","scrollTimer","resizeTimer","observerTimer","Observer","DEFAULTS","$title","$main","$placeholder","$parentElement","$active","active","offsetWidth","playing","closed","created","parentElement","$parent","getScrollElement","isClosed","isSticky","isFixed","isInside","isOutside","_paintEdge","title","animationCurrent","customClass","contents","calculateStickyHeight","mounted","_paint","highlight","sticky","onObserver","erase","_remove","removeChild","_getPlaceholderOffset","$anchor","mainPaddingTop","parseInt","mainBorderTop","placeholderPaddingTop","placeholderMarginTop","placeholderBorderTop","offsetHeight","positionPlaceholder","height","ACTIVE","HIGHLIGHT","placeholderOffsetTop","getAttribute","inBounding","parent","parentRect","childRect","isInBounding","getBoundingClientRect","right","bottom","left","afterSticky","FIXED","isStickying","clientHeight","innerHeight","after","show","opened","hide","toggle","afterToggle","beforeDestroy","afterDestroy","intersection","props","root","rootMargin","IntersectionObserver","entries","entry","intersectionRatio","$root","section","observe","$heading","onSelect","stickyHeight","headingId","afterScroll","min","stopPropagation","preventDefault","onScroll","onResize","onRefresh","unobserve","afterClosed","afterOpened"],"mappings":"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"} \ No newline at end of file diff --git a/utils/dom/_getScrollElement.js b/navigator/utils/_getScrollElement.js similarity index 89% rename from utils/dom/_getScrollElement.js rename to navigator/utils/_getScrollElement.js index c7a60e38..f2c6b970 100644 --- a/utils/dom/_getScrollElement.js +++ b/navigator/utils/_getScrollElement.js @@ -1,5 +1,5 @@ -import isString from '../types/isString' -import isElement from '../types/isElement' +import isString from '../../utils/types/isString' +import isElement from '../../utils/types/isElement' /** * 通过给的 scrollElement 参数,获取滚动 DOM 元素 diff --git a/_paintChapters.js b/navigator/utils/_paintChapters.js similarity index 95% rename from _paintChapters.js rename to navigator/utils/_paintChapters.js index 24695ddb..b3de2333 100644 --- a/_paintChapters.js +++ b/navigator/utils/_paintChapters.js @@ -1,5 +1,5 @@ -import createElement from './utils/dom/createElement' -import timeSlice from './utils/lang/timeSlice' +import createElement from '@/utils/dom/createElement' +import timeSlice from '@/utils/lang/timeSlice' const _paintChapters = ($list, chapters, showCode = false) => { const LIMIT = 400 diff --git a/outline.css b/outline.css index cdf23f8f..51f1bc48 100644 --- a/outline.css +++ b/outline.css @@ -1,1141 +1,6 @@ -:root { - --outline-zIndex: 2000; - --outline-sticky-height: 100%; - --outline-navigator-width: 100%; -} -/* ========== colors.theme - 基础颜色变量集合 ========== */ -/** - * ellipsis.less - 文本省略 mixinx 函数 - * ============================================================= - * Created By: Yaohaixiao - * Update: 2022.3.11 - */ -/* ====== 文本省略函数 ====== */ -/** - * shadow.less - 阴影样式设置 mixinx 函数 - * ============================================================= - * Created By: Yaohaixiao - * Update: 2022.3.20 - */ -/* ====== 阴影样式设置函数 ====== */ -/* ========== icon.theme - svg 图标的样式 ========== */ -.outline-icon { - position: relative; - z-index: 1; - display: inline-block; - vertical-align: middle; - width: 1em; - height: 1em; - overflow: hidden; -} -.outline-icon__svg { - position: absolute; - z-index: 2; - top: 50%; - left: 50%; - width: 1em; - height: 1em; - fill: currentcolor; - -webkit-transform: translate(-50%, -50%); - transform: translate(-50%, -50%); - overflow: hidden; -} -.outline-icon_hidden { - display: none; -} -.outline-heading { - position: relative; - z-index: 1; - overflow: hidden; -} -.outline-heading__anchor { - display: none; -} -.outline-heading__anchor:link, -.outline-heading__anchor:visited, -.outline-heading__anchor:hover { - color: #999; - text-decoration: none; -} -.outline-heading__anchor:hover { - color: #507afe; -} -.outline-heading:hover .outline-heading__anchor { - display: inline-block; -} -.outline-heading_start:hover { - overflow: visible; -} -.outline-heading_start .outline-heading__anchor { - position: absolute; - z-index: 2; - top: 50%; - -webkit-transform: translateY(-50%); - transform: translateY(-50%); - left: -1em; -} -.outline-drawer { - position: relative; - z-index: -1; - top: 0; - left: 0; - margin: 0; - width: 100%; - height: 100%; - -webkit-box-sizing: border-box; - box-sizing: border-box; - visibility: hidden; - overflow: hidden; -} -.outline-drawer__modal { - -webkit-box-shadow: 0 0 6px 1px #dcdfe6; - box-shadow: 0 0 6px 1px #dcdfe6; - display: -webkit-box; - display: -ms-flexbox; - display: flex; - -webkit-box-orient: vertical; - -webkit-box-direction: normal; - -ms-flex-direction: column; - flex-direction: column; - -ms-flex-wrap: nowrap; - flex-wrap: nowrap; - position: absolute; - z-index: 21; - height: 100%; - background-color: #fff; - -webkit-transition-duration: 0.4s; - transition-duration: 0.4s; - overflow: hidden; -} -.outline-drawer__header, -.outline-drawer__main, -.outline-drawer__footer { - width: 100%; - -webkit-box-sizing: border-box; - box-sizing: border-box; -} -.outline-drawer__header, -.outline-drawer__footer { - -ms-flex-negative: 0; - flex-shrink: 0; -} -.outline-drawer__title, -.outline-drawer__main, -.outline-drawer__footer { - padding: 0 16px; -} -.outline-drawer__header, -.outline-drawer__title { - position: relative; - z-index: 1; - margin: 0 auto; - height: 52px; - line-height: 52px; - overflow: hidden; -} -.outline-drawer__title { - font-size: 16px; - font-weight: 400; - margin: 0 16px; - -webkit-box-sizing: border-box; - box-sizing: border-box; - border-bottom: 1px solid #dcdfe6; -} -.outline-drawer__close { - position: absolute; - z-index: 2; - top: 50%; - right: 12px; - width: 20px; - height: 20px; - line-height: 20px; - color: #999; - font-size: 20px; - text-align: center; - cursor: pointer; - -webkit-transform: translateY(-50%); - transform: translateY(-50%); - overflow: hidden; -} -.outline-drawer__close .outline-icon { - position: absolute; - z-index: 2; - top: 0; - left: 0; -} -.outline-drawer__close:hover { - color: #666; -} -.outline-drawer__main { - -webkit-box-flex: 1; - -ms-flex: 1; - flex: 1; - overflow: auto; -} -.outline-drawer__main.overflow-hidden { - overflow: hidden; -} -.outline-drawer__footer { - margin: 0 auto; - text-align: right; - overflow: hidden; -} -.outline-drawer__overlay { - content: ''; - position: relative; - z-index: 1; - top: 0; - left: 0; - width: 100%; - height: 100%; - background-color: #fff; - opacity: 0.1; - overflow: hidden; -} -.outline-drawer_rtl.outline-drawer_tiny, -.outline-drawer_ltr.outline-drawer_tiny { - width: 280px; -} -.outline-drawer_rtl.outline-drawer_mini, -.outline-drawer_ltr.outline-drawer_mini { - width: 480px; -} -.outline-drawer_rtl.outline-drawer_small, -.outline-drawer_ltr.outline-drawer_small { - width: 540px; -} -.outline-drawer_rtl.outline-drawer_regular, -.outline-drawer_ltr.outline-drawer_regular { - width: 680px; -} -.outline-drawer_rtl.outline-drawer_medium, -.outline-drawer_ltr.outline-drawer_medium { - width: 720px; -} -.outline-drawer_rtl.outline-drawer_large, -.outline-drawer_ltr.outline-drawer_large { - width: 960px; -} -.outline-drawer_rtl { - border-left: 1px solid #dcdfe6; -} -.outline-drawer_rtl.outline-drawer_tiny.outline-drawer_closed { - right: -290px; -} -.outline-drawer_rtl.outline-drawer_mini.outline-drawer_closed { - right: -490px; -} -.outline-drawer_rtl.outline-drawer_small.outline-drawer_closed { - right: -550px; -} -.outline-drawer_rtl.outline-drawer_regular.outline-drawer_closed { - right: -690px; -} -.outline-drawer_rtl.outline-drawer_medium.outline-drawer_closed { - right: -730px; -} -.outline-drawer_rtl.outline-drawer_large.outline-drawer_closed { - right: -970px; -} -.outline-drawer_ltr { - border-right: 1px solid #dcdfe6; -} -.outline-drawer_ltr.outline-drawer_tiny.outline-drawer_closed { - left: -290px; -} -.outline-drawer_ltr.outline-drawer_mini.outline-drawer_closed { - left: -490px; -} -.outline-drawer_ltr.outline-drawer_small.outline-drawer_closed { - left: -550px; -} -.outline-drawer_ltr.outline-drawer_regular.outline-drawer_closed { - left: -690px; -} -.outline-drawer_ltr.outline-drawer_medium.outline-drawer_closed { - left: -730px; -} -.outline-drawer_ltr.outline-drawer_large.outline-drawer_closed { - left: -970px; -} -.outline-drawer_ttb, -.outline-drawer_btt { - left: 0; - width: 100%; -} -.outline-drawer_ttb.outline-drawer_tiny, -.outline-drawer_btt.outline-drawer_tiny { - height: 240px; -} -.outline-drawer_ttb.outline-drawer_mini, -.outline-drawer_btt.outline-drawer_mini { - height: 320px; -} -.outline-drawer_ttb.outline-drawer_small, -.outline-drawer_btt.outline-drawer_small { - height: 360px; -} -.outline-drawer_ttb.outline-drawer_regular, -.outline-drawer_btt.outline-drawer_regular { - height: 400px; -} -.outline-drawer_ttb.outline-drawer_medium, -.outline-drawer_btt.outline-drawer_medium { - height: 440px; -} -.outline-drawer_ttb.outline-drawer_large, -.outline-drawer_btt.outline-drawer_large { - height: 480px; -} -.outline-drawer_ttb { - border-bottom: 1px solid #dcdfe6; -} -.outline-drawer_ttb.outline-drawer_tiny.outline-drawer_closed { - top: -250px; -} -.outline-drawer_ttb.outline-drawer_mini.outline-drawer_closed { - top: -330px; -} -.outline-drawer_ttb.outline-drawer_small.outline-drawer_closed { - top: -370px; -} -.outline-drawer_ttb.outline-drawer_regular.outline-drawer_closed { - top: -410px; -} -.outline-drawer_ttb.outline-drawer_medium.outline-drawer_closed { - top: -450px; -} -.outline-drawer_ttb.outline-drawer_large.outline-drawer_closed { - top: -490px; -} -.outline-drawer_btt { - top: initial; - border-top: 1px solid #dcdfe6; -} -.outline-drawer_btt.outline-drawer_tiny.outline-drawer_closed { - bottom: -250px; -} -.outline-drawer_btt.outline-drawer_mini.outline-drawer_closed { - bottom: -330px; -} -.outline-drawer_btt.outline-drawer_small.outline-drawer_closed { - bottom: -370px; -} -.outline-drawer_btt.outline-drawer_regular.outline-drawer_closed { - bottom: -410px; -} -.outline-drawer_btt.outline-drawer_medium.outline-drawer_closed { - bottom: -450px; -} -.outline-drawer_btt.outline-drawer_large.outline-drawer_closed { - bottom: -490px; -} -.outline-drawer_opened { - visibility: visible; - z-index: var(--outline-zIndex); -} -.outline-drawer_opened.outline-drawer { - position: fixed; -} -.outline-drawer_opened.outline-drawer_rtl { - right: 0; -} -.outline-drawer_opened.outline-drawer_ltr { - left: 0; -} -.outline-drawer_opened.outline-drawer_ttb { - top: 0; -} -.outline-drawer_opened.outline-drawer_btt { - bottom: 0; -} -.outline-drawer_offset.outline-drawer_rtl, -.outline-drawer_offset.outline-drawer_ltr { - height: calc(100% - 4em); - top: 50%; - -webkit-transform: translateY(-50%); - transform: translateY(-50%); -} -.outline-drawer_offset.outline-drawer_ttb, -.outline-drawer_offset.outline-drawer_btt { - width: calc(100% - 4em); - left: 50%; - -webkit-transform: translateX(-50%); - transform: translateX(-50%); -} -.outline-drawer_offset.outline-drawer_opened.outline-drawer_rtl { - right: 2em; -} -.outline-drawer_offset.outline-drawer_opened.outline-drawer_ltr { - left: 2em; -} -.outline-drawer_offset.outline-drawer_opened.outline-drawer_ttb { - top: 2em; -} -.outline-drawer_offset.outline-drawer_opened.outline-drawer_btt { - bottom: 2em; -} -.outline-drawer_auto.outline-drawer_rtl, -.outline-drawer_auto.outline-drawer_ltr { - height: auto; - max-height: calc(100% - 4em); -} -.outline-drawer_full { - padding: 0; -} -.outline-navigator { - position: relative; - z-index: 1; - margin: 0; - width: var(--outline-navigator-width); - overflow: auto; -} -.outline-navigator-parent { - -webkit-transition: 0.3s ease-in-out; - transition: 0.3s ease-in-out; -} -.outline-navigator__title { - margin: 0 16px; - height: 40px; - line-height: 40px; - padding: 0 16px; - border-bottom: 1px solid #dcdfe6; - font-size: 16px; - font-weight: 400; - overflow: hidden; -} -.outline-navigator__main { - position: relative; - z-index: 1; - margin: 0; - overflow: hidden; -} -.outline-navigator__list, -.outline-navigator__subject, -.outline-navigator__item { - position: relative; - z-index: 2; - margin: 0; - padding: 0; - list-style-type: none; - overflow: hidden; -} -.outline-navigator__list { - padding: 0.5em 0; -} -.outline-navigator__subject { - padding-left: 1em; -} -.outline-navigator__item { - margin: 0; - line-height: 30px; - font-size: 13px; - overflow: hidden; -} -.outline-navigator__placeholder { - position: absolute; - z-index: 1; - top: 0; - left: 0; - width: 100%; - height: 30px; - background-color: #f7f8f9; - border-left: 2px solid #058942; - -webkit-transition-duration: 0.2s; - transition-duration: 0.2s; - -webkit-box-sizing: border-box; - box-sizing: border-box; - overflow: hidden; -} -.outline-navigator__anchor { - white-space: nowrap; - text-overflow: ellipsis; - overflow: hidden; - display: block; - padding: 0 1.5em; -} -.outline-navigator__anchor:link, -.outline-navigator__anchor:visited, -.outline-navigator__anchor:hover { - text-decoration: none; - color: #555; -} -.outline-navigator__anchor:hover { - color: #058942; -} -.outline-navigator__code { - padding-right: 0.5em; -} -.outline-navigator_highlight.outline-navigator__anchor:link, -.outline-navigator_highlight.outline-navigator__anchor:visited, -.outline-navigator_highlight.outline-navigator__anchor:hover { - color: #058942; - font-weight: bold; -} -.outline-navigator_sticky, -.outline-navigator_fixed { - display: -webkit-box; - display: -ms-flexbox; - display: flex; - -ms-flex-wrap: nowrap; - flex-wrap: nowrap; - -webkit-box-orient: vertical; - -webkit-box-direction: normal; - -ms-flex-direction: column; - flex-direction: column; - z-index: var(--outline-zIndex); - top: 0; - overflow: hidden; -} -.outline-navigator_sticky .outline-navigator__title, -.outline-navigator_fixed .outline-navigator__title, -.outline-navigator_sticky .outline-navigator__main, -.outline-navigator_fixed .outline-navigator__main { - -webkit-box-sizing: border-box; - box-sizing: border-box; -} -.outline-navigator_sticky .outline-navigator__title, -.outline-navigator_fixed .outline-navigator__title { - -ms-flex-negative: 0; - flex-shrink: 0; -} -.outline-navigator_sticky .outline-navigator__main, -.outline-navigator_fixed .outline-navigator__main { - -webkit-box-flex: 1; - -ms-flex: 1; - flex: 1; - overflow: auto; -} -.outline-navigator_sticky { - position: sticky; - max-height: var(--outline-sticky-height); -} -.outline-navigator_fixed { - position: fixed; - max-height: 100%; -} -.outline-navigator_hidden { - display: none; -} -.outline-navigator_folded { - width: 0; - overflow: hidden; -} -/** - * font.less - 字体相关样式 - * ============================================================= - * Created By: Yaohaixiao - * Update: 2022.3.16 - */ -/* ====== 字体 ====== */ -/* ====== 字重 ====== */ -/* ====== 字号 ====== */ -/** - * mixins.less - 工具函数 - * ============================================================= - * Created By: Yaohaixiao - * Update: 2022.3.11 - */ -/** - * radius.less - 圆角设置 mixinx 函数 - * ============================================================= - * Created By: Yaohaixiao - * Update: 2024.4.16 - */ -/* ====== 圆角样式设置函数 ====== */ -.outline-reader__progress { - position: fixed; - top: 0; - left: 0; - z-index: 3; - height: 4px; - width: 100%; - background-color: #507afe; - scale: 0 1; - -webkit-transform-origin: left; - transform-origin: left; - -webkit-animation: outline-reader-progress linear; - animation: outline-reader-progress linear; - animation-timeline: --ProgressTimeline; -} -.outline-reader__paper { - -webkit-box-shadow: 0 0 6px 1px #ddd; - box-shadow: 0 0 6px 1px #ddd; - margin: 2em auto; - max-width: 1200px; - padding: 3.2em; - -webkit-box-sizing: border-box; - box-sizing: border-box; - background-color: #fff; - overflow: hidden; -} -.outline-reader__title { - margin: 0.67em 0; - text-align: center; - font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'PingFang SC', 'Hiragino Sans GB', 'Microsoft YaHei', 'Helvetica Neue', 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', Helvetica, Arial, sans-serif; - font-weight: normal; - line-height: 1.3em; - font-size: 4.2em; - overflow: hidden; -} -.outline-reader__article .outline-reader__progress { - display: none; -} -.outline-reader_hidden { - display: none; -} -.outline-reader_hidden.outline-reader_sibling { - display: none !important; -} -.outline-reader_hidden.outline-reader_sibling.wrapper.post { - display: none; -} -.outline-reader--reading { - display: block; - position: fixed; - z-index: 2; - top: 0; - left: 0; - width: 100%; - height: 100%; - margin: 0; - -webkit-box-sizing: border-box; - box-sizing: border-box; - padding: 3em 4em; - background-color: #fafafa; - scroll-timeline-name: --ProgressTimeline; - overflow: scroll; -} -@-webkit-keyframes outline-reader-progress { - to { - scale: 1 1; - } -} -@keyframes outline-reader-progress { - to { - scale: 1 1; - } -} -@media (max-width: 500px) { - .outline-reader { - overflow: hidden; - } - .outline-reader .outline-toolbar { - display: -webkit-box; - display: -ms-flexbox; - display: flex; - -webkit-box-orient: horizontal; - -webkit-box-direction: normal; - -ms-flex-direction: row; - flex-direction: row; - -ms-flex-wrap: nowrap; - flex-wrap: nowrap; - -webkit-box-align: center; - -ms-flex-align: center; - align-items: center; - -ms-flex-item-align: auto; - align-self: auto; - top: 100%; - right: 0; - -webkit-transform: translateY(-48px); - transform: translateY(-48px); - width: 100%; - height: 48px; - -webkit-box-sizing: border-box; - box-sizing: border-box; - border-top: 1px solid #ddd; - background-color: #fff; - padding: 0 16px; - } - .outline-reader .outline-toolbar__button { - border-radius: 0; - -webkit-box-flex: 1; - -ms-flex: 1; - flex: 1; - border: none; - -webkit-box-shadow: none; - box-shadow: none; - } - .outline-reader--reading { - padding: 0; - background-color: #fff; - -webkit-box-sizing: border-box; - box-sizing: border-box; - } - .outline-reader__paper { - position: relative; - z-index: 1; - margin: 0; - padding: 0; - height: 100%; - -webkit-box-shadow: none; - box-shadow: none; - overflow: hidden; - } - .outline-reader__title { - white-space: nowrap; - text-overflow: ellipsis; - position: absolute; - z-index: 3; - top: 0; - left: 0; - margin: 0; - width: 100%; - height: 48px; - line-height: 48px; - border-bottom: 1px solid #ddd; - font-size: 1.8em; - font-weight: 400; - background-color: #fff; - overflow: hidden; - } - .outline-reader__article { - margin: 48px 0; - height: calc(100% - 96px); - padding: 0 1.25em; - scroll-timeline-name: --MobileProgressTimeline; - overflow-x: hidden; - overflow-y: scroll; - } - .outline-reader__article .outline-reader__progress { - z-index: 4; - -webkit-animation: outline-reader-progress linear; - animation: outline-reader-progress linear; - animation-timeline: --MobileProgressTimeline; - display: block; - } -} -@media print { - html, - body { - /* 打印的基础字体大小 */ - font-size: 12pt; - /* 显示设置文字颜色和背景颜色 */ - background-color: #fff; - color: #333; - height: initial !important; - } - /* 设置链接样式 */ - a:link, - a:visited, - a:hover { - text-decoration: underline !important; - color: #507afe; - } - /* 隐藏媒体标签 */ - video, - audio { - display: none !important; - } - /* 确保表格在打印时的边框和对齐方式清晰 */ - table { - width: 100%; - border-collapse: collapse; - } - th, - td { - border: 1px solid #dcdfe6; - padding: 8px 20px; - } - .outline-message, - .outline-toolbar { - /* 隐藏了工具栏和信息提示框 */ - display: none !important; - } - .outline-reader { - display: block !important; - overflow: hidden; - /* 取消了绝对定位 */ - /* 隐藏阅读进度条 */ - /* 打印时不显示正文 DOM 的阴影效果 */ - /* 所有文章内容 DOM 相关的邻居节点都隐藏了 */ - } - .outline-reader__title { - margin: 13.4pt 0 28pt !important; - text-align: center !important; - font-size: 32pt !important; - } - .outline-reader--reading { - position: relative !important; - height: auto !important; - padding: 0 !important; - background-color: #fff; - overflow: hidden !important; - } - .outline-reader__progress { - display: none !important; - } - .outline-reader__paper { - -webkit-box-shadow: none; - box-shadow: none; - } - .outline-reader pre { - padding: 1em !important; - border: 1px solid #ddd !important; - border-radius: 4px !important; - } - .outline-reader pre, - .outline-reader code { - background-color: #fff !important; - } - .outline-reader table, - .outline-reader img, - .outline-reader svg { - -webkit-column-break-inside: avoid; - -moz-column-break-inside: avoid; - break-inside: avoid; - } - .outline-reader_sibling { - display: none !important; - } -} -/* ========== buttons.theme - 按钮导航样式 ========== */ -.outline-toolbar { - position: fixed; - z-index: 99999; - margin: 0; - -webkit-transition-duration: 0.3s; - transition-duration: 0.3s; - overflow: hidden; -} -.outline-toolbar__button { - -webkit-box-shadow: 0 0 6px 1px #dcdfe6; - box-shadow: 0 0 6px 1px #dcdfe6; - position: relative; - z-index: 1; - margin: 10px; - width: 36px; - height: 36px; - border: 1px solid #dcdfe6; - border-radius: 3px; - -webkit-box-sizing: border-box; - box-sizing: border-box; - background-color: #fff; - cursor: pointer; - text-align: center; - color: #999; - -webkit-transition: all 0.3s 0.1s ease-in-out; - transition: all 0.3s 0.1s ease-in-out; - overflow: hidden; -} -.outline-toolbar__button:hover { - color: #058942; - border-color: #058942; - -webkit-transform: scale(1.35); - transform: scale(1.35); -} -.outline-toolbar__button.hide { - display: none; -} -.outline-toolbar__anchor:link, -.outline-toolbar__anchor:visited, -.outline-toolbar__anchor:hover { - color: #999; - text-decoration: none; -} -.outline-toolbar__anchor:hover { - color: #058942; -} -.outline-toolbar__icon { - position: absolute; - z-index: 2; - top: 50%; - left: 50%; - width: 20px; - height: 20px; - -webkit-transform: translate(-50%, -50%); - transform: translate(-50%, -50%); - fill: currentcolor; - overflow: hidden; -} -.outline-toolbar_active.outline-toolbar__button { - color: #fff; - background-color: #058942; - border-color: #058942; -} -.outline-toolbar_active.outline-toolbar__button:hover { - color: #fff; -} -.outline-toolbar_active .outline-toolbar__anchor:link, -.outline-toolbar_active .outline-toolbar__anchor:visited, -.outline-toolbar_active .outline-toolbar__anchor:hover { - color: #fff; -} -.outline-toolbar_rounded.outline-toolbar__button { - border-radius: 18px; -} -.outline-toolbar_disabled.outline-toolbar__anchor:link, -.outline-toolbar_disabled .outline-toolbar__anchor:link, -.outline-toolbar_disabled.outline-toolbar__anchor:visited, -.outline-toolbar_disabled .outline-toolbar__anchor:visited, -.outline-toolbar_disabled.outline-toolbar__anchor:hover, -.outline-toolbar_disabled .outline-toolbar__anchor:hover, -.outline-toolbar_disabled.outline-toolbar__button, -.outline-toolbar_disabled .outline-toolbar__button { - cursor: not-allowed; - color: #999; - border-color: #999; -} -.outline-toolbar_disabled.outline-toolbar__anchor:link:hover, -.outline-toolbar_disabled .outline-toolbar__anchor:link:hover, -.outline-toolbar_disabled.outline-toolbar__anchor:visited:hover, -.outline-toolbar_disabled .outline-toolbar__anchor:visited:hover, -.outline-toolbar_disabled.outline-toolbar__anchor:hover:hover, -.outline-toolbar_disabled .outline-toolbar__anchor:hover:hover, -.outline-toolbar_disabled.outline-toolbar__button:hover, -.outline-toolbar_disabled .outline-toolbar__button:hover { - color: #999; - border-color: #999; -} -.outline-toolbar_disabled.outline-toolbar__button, -.outline-toolbar_disabled .outline-toolbar__button { - background-color: #f5f5f5; -} -.outline-toolbar_ttb, -.outline-toolbar_btt { - left: 50%; - -webkit-transform: translateX(-50%); - transform: translateX(-50%); -} -.outline-toolbar_ttb .outline-toolbar__button, -.outline-toolbar_btt .outline-toolbar__button { - display: inline-block; -} -.outline-toolbar_ttb { - top: 12px; -} -.outline-toolbar_ttb.outline-toolbar_hidden { - top: -56px; -} -.outline-toolbar_btt { - bottom: 12px; -} -.outline-toolbar_btt.outline-toolbar_hidden { - bottom: -56px; -} -.outline-toolbar_rtl, -.outline-toolbar_ltr { - -webkit-transform: translateY(-50%); - transform: translateY(-50%); - width: 56px; -} -.outline-toolbar_rtl { - top: 50%; - right: 12px; -} -.outline-toolbar_rtl.outline-toolbar_hidden { - right: -86px; -} -.outline-toolbar_ltr { - top: 50%; - left: 12px; -} -.outline-toolbar_ltr.outline-toolbar_hidden { - left: -86px; -} -.outline-toolbar_ttb .outline-toolbar__button.outline-toolbar_hidden, -.outline-toolbar_rtl .outline-toolbar__button.outline-toolbar_hidden, -.outline-toolbar_btt .outline-toolbar__button.outline-toolbar_hidden, -.outline-toolbar_ltr .outline-toolbar__button.outline-toolbar_hidden { - display: none; -} -.outline-message { - border-radius: 3px; - -webkit-box-shadow: 0 0 6px 1px #dcdfe6; - box-shadow: 0 0 6px 1px #dcdfe6; - position: fixed; - z-index: 9999; - opacity: 0.1; - top: -50px; - left: 50%; - height: 40px; - margin: 0; - padding: 0 50px; - line-height: 40px; - font-size: 13px; - background-color: #fff; - color: #666; - -webkit-transition: all 0.5s ease-in-out; - transition: all 0.5s ease-in-out; - -webkit-transform: translateX(-50%); - transform: translateX(-50%); - overflow: hidden; -} -.outline-message__content { - white-space: nowrap; - text-overflow: ellipsis; - margin: 0; - max-width: 700px; - height: 40px; - line-height: 40px; - font-size: 13px; - color: #666; - overflow: hidden; -} -.outline-message__close, -.outline-message__icon { - position: absolute; - z-index: 2; - top: 0; - width: 40px; - height: 40px; - line-height: 40px; - text-align: center; - overflow: hidden; -} -.outline-message__icon { - left: 0; - color: #fff; -} -.outline-message__icon .outline-icon { - position: absolute; - z-index: 2; - top: 50%; - left: 50%; - -webkit-transform: translate(-50%, -50%); - transform: translate(-50%, -50%); -} -.outline-message__close { - right: 0; - cursor: pointer; - color: #999; -} -.outline-message__close .outline-icon { - position: absolute; - z-index: 2; - top: 50%; - left: 50%; - -webkit-transform: translate(-50%, -50%); - transform: translate(-50%, -50%); -} -.outline-message__close:hover { - color: #666; -} -.outline-message_info .outline-message__icon { - background-color: #507afe; -} -.outline-message_warning .outline-message__icon { - background-color: #ff9901; -} -.outline-message_success .outline-message__icon { - background-color: #058942; -} -.outline-message_error .outline-message__icon { - background-color: #ff5d5d; -} -.outline-message_plain { - min-width: 190px; - padding: 0 50px 0 15px; -} -.outline-message_plain.outline-message_info { - border-left: 5px solid #507afe; - background-color: #ecf8ff; -} -.outline-message_plain.outline-message_warning { - border-left: 5px solid #ff9901; - background-color: #fffbe6; -} -.outline-message_plain.outline-message_success { - border-left: 5px solid #058942; - background-color: #e1f6eb; -} -.outline-message_plain.outline-message_error { - border-left: 5px solid #ff5d5d; - background-color: #fff1f0; -} -.outline-message_plain .outline-message__icon { - width: 0; - display: none; -} -.outline-message_plain .outline-message__icon .outline-icon { - display: none; -} -.outline-message_light { - min-width: 180px; - padding: 0 40px; -} -.outline-message_light.outline-message_info .outline-message__icon { - color: #507afe; -} -.outline-message_light.outline-message_warning .outline-message__icon { - color: #ff9901; -} -.outline-message_light.outline-message_success .outline-message__icon { - color: #058942; -} -.outline-message_light.outline-message_error .outline-message__icon { - color: #ff5d5d; -} -.outline-message_light .outline-message__icon { - background-color: #fff; -} -.outline-message_round { - border-radius: 20px; -} -.outline-message_round.outline-message_default { - min-width: 180px; - padding: 0 40px; -} -.outline-message_round.outline-message_default .outline-message__icon { - border-radius: 10px; - top: 10px; - left: 10px; - width: 20px; - height: 20px; - line-height: 20px; -} -.outline-message_round.outline-message_default.outline-message_full-width { - min-width: 200px; - padding: 0 20px 0 40px; -} -.outline-message_round.outline-message_plain { - min-width: 195px; - padding: 0 40px 0 20px; -} -.outline-message_round.outline-message_plain.outline-message_full-width { - min-width: 215px; - padding: 0 20px; -} -.outline-message_full-width { - min-width: 200px; - padding: 0 10px 0 50px; -} -.outline-message_full-width.outline-message_plain { - min-width: 230px; - padding: 0 10px 0 15px; -} -.outline-message_full-width.outline-message_light { - min-width: 210px; - padding: 0 10px 0 40px; -} -.outline-message_visible { - opacity: 1; -} -.outline-message_hidden { - display: none; -} -/* ===== Scrollbar ===== */ -::-webkit-scrollbar { - width: 7px; - height: 7px; - -webkit-border-radius: 5px; -} -::-webkit-scrollbar-track-piece { - -webkit-border-radius: 5px; -} -::-webkit-scrollbar-thumb:vertical { - background-color: rgba(0, 0, 0, 0.25); - -webkit-border-radius: 5px; -} -::-webkit-scrollbar-thumb:horizontal { - background-color: rgba(0, 0, 0, 0.25); - -webkit-border-radius: 5px; -} -::-webkit-scrollbar-thumb:hover { - background-color: rgba(0, 0, 0, 0.35); -} -::-webkit-scrollbar:hover { - background-color: rgba(0, 0, 0, 0.15); -} - -/*# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInZhcmlhYmxlcy5sZXNzIiwiLi4vPGlucHV0IGNzcyA2PiIsImljb25zLmxlc3MiLCJhbmNob3JzLmxlc3MiLCJkcmF3ZXIubGVzcyIsInNoYWRvdy5sZXNzIiwibmF2aWdhdG9yLmxlc3MiLCJlbGxpcHNpcy5sZXNzIiwicmVhZGVyLmxlc3MiLCJyYWRpdXMubGVzcyIsInRvb2xiYXIubGVzcyIsIm1lc3NhZ2UubGVzcyIsInNjcm9sbGJhci5sZXNzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0VBQ0MsdUJBQUE7RUFDRCw4QkFBQTtFQUFpQyxnQ0FBQTtDQ0VoQztBQUNELG1EQUFtRDtBQUNuRDs7Ozs7R0FLRztBQUNILDBCQUEwQjtBQUMxQjs7Ozs7R0FLRztBQUNILDRCQUE0QjtBQUM1QixrREFBa0Q7QUNwQkM7RUFFbkQsbUJBQUE7RUFBc0IsV0FBQTtFQUNULHNCQUFBO0VBQ1UsdUJBQUE7RUFDQSxXQUFBO0VBQ2IsWUFBQTtFQUNBLGlCQUFBO0NEc0JUO0FDckJjO0VBRVYsbUJBQUE7RUFDWSxXQUFBO0VBQ1QsU0FBQTtFQUNILFVBQUE7RUFDQSxXQUFBO0VBQ0EsWUFBQTtFQUNBLG1CQUFBO0VBQ00seUNBQUE7VUFBQSxpQ0FBQTtFQUNhLGlCQUFBO0NEc0J2QjtBQ3JCUztFQUNSLGNBQUE7Q0R1QkQ7QUV6Q0Q7RUFDRSxtQkFBQTtFQUNBLFdBQUE7RUFDQSxpQkFBQTtDRjJDRDtBRXpDQztFQUNFLGNBQUE7Q0YyQ0g7QUV6Q0c7OztFQUdFLFlBQUE7RUFDQSxzQkFBQTtDRjJDTDtBRXhDRztFQUNFLGVBQUE7Q0YwQ0w7QUV0Q0M7RUFFSSxzQkFBQTtDRnVDTDtBRWxDRztFQUNFLGtCQUFBO0NGb0NMO0FFdENDO0VBTUksbUJBQUE7RUFDQSxXQUFBO0VBQ0EsU0FBQTtFQUNBLG9DQUFBO1VBQUEsNEJBQUE7RUFDQSxXQUFBO0NGbUNMO0FHckVEO0VBQ0UsbUJBQUE7RUFDQSxZQUFBO0VBQ0EsT0FBQTtFQUNBLFFBQUE7RUFDQSxVQUFB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QUFBO0NWNnpCVDtBVXQxQkM7RUErQkksdUJBQUE7Q1YwekJMO0FVdHpCQztFRnBLQSxvQkFBQTtDUjY5QkQ7QVVyekJLO0VBQ0UsaUJBQUE7RUFDQSxnQkFBQTtDVnV6QlA7QVV6ekJLO0VGeEtKLG9CQUFBO0VFOEtRLFVBQUE7RUFDQSxXQUFBO0VBQ0EsWUFBQTtFQUNBLGFBQUE7RUFDQSxrQkFBQTtDVnV6QlQ7QVVwekJPO0VBQ0UsaUJBQUE7RUFDQSx1QkFBQTtDVnN6QlQ7QVVsekJLO0VBQ0UsaUJBQUE7RUFDQSx1QkFBQTtDVm96QlA7QVVsekJPO0VBQ0UsaUJBQUE7RUFDQSxnQkFBQTtDVm96QlQ7QVU5eUJDO0VBQ0UsaUJBQUE7RUFDQSx1QkFBQTtDVmd6Qkg7QVU3eUJLO0VBQ0UsaUJBQUE7RUFDQSx1QkFBQTtDVit5QlA7QVU1eUJLO0VBQ0UsaUJBQUE7RUFDQSx1QkFBQTtDVjh5QlA7QVV6eUJDO0VBQ0UsV0FBQTtDVjJ5Qkg7QVV4eUJDO0VBQ0UsY0FBQTtDVjB5Qkg7QUFDRCwyQkFBMkI7QVdoaEMzQjtFQUNFLFdBQUE7RUFDQSxZQUFBO0VBQ0EsMkJBQUE7Q1hraENEO0FXaGhDQztFQUNFLDJCQUFBO0NYa2hDSDtBVzlnQ0c7RUFDRSxzQ0FBQTtFQUNBLDJCQUFBO0NYZ2hDTDtBVzdnQ0c7RUFDRSxzQ0FBQTtFQUNBLDJCQUFBO0NYK2dDTDtBVzVnQ0c7RUFDRSxzQ0FBQTtDWDhnQ0w7QVcxZ0NDO0VBQ0Usc0NBQUE7Q1g0Z0NIIiwiZmlsZSI6Im91dGxpbmUuY3NzIiwic291cmNlc0NvbnRlbnQiOlsiOnJvb3Qge1xyXG4gIC0tb3V0bGluZS16SW5kZXg6IDIwMDA7XHJcbiAgLS1vdXRsaW5lLXN0aWNreS1oZWlnaHQ6IDEwMCU7XHJcbiAgLS1vdXRsaW5lLW5hdmlnYXRvci13aWR0aDogMTAwJTtcclxufVxyXG4iLCI6cm9vdCB7XG4gIC0tb3V0bGluZS16SW5kZXg6IDIwMDA7XG4gIC0tb3V0bGluZS1zdGlja3ktaGVpZ2h0OiAxMDAlO1xuICAtLW91dGxpbmUtbmF2aWdhdG9yLXdpZHRoOiAxMDAlO1xufVxuLyogPT09PT09PT09PSBjb2xvcnMudGhlbWUgLSDln7rnoYDpopzoibLlj5jph4/pm4blkIggPT09PT09PT09PSAqL1xuLyoqXG4gKiBlbGxpcHNpcy5sZXNzIC0g5paH5pys55yB55WlIG1peGlueCDlh73mlbBcbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIENyZWF0ZWQgQnk6IFlhb2hhaXhpYW9cbiAqIFVwZGF0ZTogMjAyMi4zLjExXG4gKi9cbi8qID09PT09PSDmlofmnKznnIHnlaXlh73mlbAgPT09PT09ICovXG4vKipcbiAqIHNoYWRvdy5sZXNzIC0g6Zi05b2x5qC35byP6K6+572uIG1peGlueCDlh73mlbBcbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIENyZWF0ZWQgQnk6IFlhb2hhaXhpYW9cbiAqIFVwZGF0ZTogMjAyMi4zLjIwXG4gKi9cbi8qID09PT09PSDpmLTlvbHmoLflvI/orr7nva7lh73mlbAgPT09PT09ICovXG4vKiA9PT09PT09PT09IGljb24udGhlbWUgLSBzdmcg5Zu+5qCH55qE5qC35byPID09PT09PT09PT0gKi9cbi5vdXRsaW5lLWljb24ge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIHotaW5kZXg6IDE7XG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgdmVydGljYWwtYWxpZ246IG1pZGRsZTtcbiAgd2lkdGg6IDFlbTtcbiAgaGVpZ2h0OiAxZW07XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4ub3V0bGluZS1pY29uX19zdmcge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHotaW5kZXg6IDI7XG4gIHRvcDogNTAlO1xuICBsZWZ0OiA1MCU7XG4gIHdpZHRoOiAxZW07XG4gIGhlaWdodDogMWVtO1xuICBmaWxsOiBjdXJyZW50Y29sb3I7XG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIC01MCUpO1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLm91dGxpbmUtaWNvbl9oaWRkZW4ge1xuICBkaXNwbGF5OiBub25lO1xufVxuLm91dGxpbmUtaGVhZGluZyB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgei1pbmRleDogMTtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi5vdXRsaW5lLWhlYWRpbmdfX2FuY2hvciB7XG4gIGRpc3BsYXk6IG5vbmU7XG59XG4ub3V0bGluZS1oZWFkaW5nX19hbmNob3I6bGluayxcbi5vdXRsaW5lLWhlYWRpbmdfX2FuY2hvcjp2aXNpdGVkLFxuLm91dGxpbmUtaGVhZGluZ19fYW5jaG9yOmhvdmVyIHtcbiAgY29sb3I6ICM5OTk7XG4gIHRleHQtZGVjb3JhdGlvbjogbm9uZTtcbn1cbi5vdXRsaW5lLWhlYWRpbmdfX2FuY2hvcjpob3ZlciB7XG4gIGNvbG9yOiAjNTA3YWZlO1xufVxuLm91dGxpbmUtaGVhZGluZzpob3ZlciAub3V0bGluZS1oZWFkaW5nX19hbmNob3Ige1xuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG59XG4ub3V0bGluZS1oZWFkaW5nX3N0YXJ0OmhvdmVyIHtcbiAgb3ZlcmZsb3c6IHZpc2libGU7XG59XG4ub3V0bGluZS1oZWFkaW5nX3N0YXJ0IC5vdXRsaW5lLWhlYWRpbmdfX2FuY2hvciB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgei1pbmRleDogMjtcbiAgdG9wOiA1MCU7XG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtNTAlKTtcbiAgbGVmdDogLTFlbTtcbn1cbi5vdXRsaW5lLWRyYXdlciB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgei1pbmRleDogLTE7XG4gIHRvcDogMDtcbiAgbGVmdDogMDtcbiAgbWFyZ2luOiAwO1xuICB3aWR0aDogMTAwJTtcbiAgaGVpZ2h0OiAxMDAlO1xuICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICB2aXNpYmlsaXR5OiBoaWRkZW47XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4ub3V0bGluZS1kcmF3ZXJfX21vZGFsIHtcbiAgYm94LXNoYWRvdzogMCAwIDZweCAxcHggI2RjZGZlNjtcbiAgZGlzcGxheTogZmxleDtcbiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgZmxleC13cmFwOiBub3dyYXA7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgei1pbmRleDogMjE7XG4gIGhlaWdodDogMTAwJTtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjtcbiAgdHJhbnNpdGlvbi1kdXJhdGlvbjogMC40cztcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi5vdXRsaW5lLWRyYXdlcl9faGVhZGVyLFxuLm91dGxpbmUtZHJhd2VyX19tYWluLFxuLm91dGxpbmUtZHJhd2VyX19mb290ZXIge1xuICB3aWR0aDogMTAwJTtcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbn1cbi5vdXRsaW5lLWRyYXdlcl9faGVhZGVyLFxuLm91dGxpbmUtZHJhd2VyX19mb290ZXIge1xuICBmbGV4LXNocmluazogMDtcbn1cbi5vdXRsaW5lLWRyYXdlcl9fdGl0bGUsXG4ub3V0bGluZS1kcmF3ZXJfX21haW4sXG4ub3V0bGluZS1kcmF3ZXJfX2Zvb3RlciB7XG4gIHBhZGRpbmc6IDAgMTZweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl9faGVhZGVyLFxuLm91dGxpbmUtZHJhd2VyX190aXRsZSB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgei1pbmRleDogMTtcbiAgbWFyZ2luOiAwIGF1dG87XG4gIGhlaWdodDogNTJweDtcbiAgbGluZS1oZWlnaHQ6IDUycHg7XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4ub3V0bGluZS1kcmF3ZXJfX3RpdGxlIHtcbiAgZm9udC1zaXplOiAxNnB4O1xuICBmb250LXdlaWdodDogNDAwO1xuICBtYXJnaW46IDAgMTZweDtcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNkY2RmZTY7XG59XG4ub3V0bGluZS1kcmF3ZXJfX2Nsb3NlIHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB6LWluZGV4OiAyO1xuICB0b3A6IDUwJTtcbiAgcmlnaHQ6IDEycHg7XG4gIHdpZHRoOiAyMHB4O1xuICBoZWlnaHQ6IDIwcHg7XG4gIGxpbmUtaGVpZ2h0OiAyMHB4O1xuICBjb2xvcjogIzk5OTtcbiAgZm9udC1zaXplOiAyMHB4O1xuICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gIGN1cnNvcjogcG9pbnRlcjtcbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC01MCUpO1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLm91dGxpbmUtZHJhd2VyX19jbG9zZSAub3V0bGluZS1pY29uIHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB6LWluZGV4OiAyO1xuICB0b3A6IDA7XG4gIGxlZnQ6IDA7XG59XG4ub3V0bGluZS1kcmF3ZXJfX2Nsb3NlOmhvdmVyIHtcbiAgY29sb3I6ICM2NjY7XG59XG4ub3V0bGluZS1kcmF3ZXJfX21haW4ge1xuICBmbGV4OiAxO1xuICBvdmVyZmxvdzogYXV0bztcbn1cbi5vdXRsaW5lLWRyYXdlcl9fbWFpbi5vdmVyZmxvdy1oaWRkZW4ge1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLm91dGxpbmUtZHJhd2VyX19mb290ZXIge1xuICBtYXJnaW46IDAgYXV0bztcbiAgdGV4dC1hbGlnbjogcmlnaHQ7XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4ub3V0bGluZS1kcmF3ZXJfX292ZXJsYXkge1xuICBjb250ZW50OiAnJztcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICB6LWluZGV4OiAxO1xuICB0b3A6IDA7XG4gIGxlZnQ6IDA7XG4gIHdpZHRoOiAxMDAlO1xuICBoZWlnaHQ6IDEwMCU7XG4gIGJhY2tncm91bmQtY29sb3I6ICNmZmY7XG4gIG9wYWNpdHk6IDAuMTtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi5vdXRsaW5lLWRyYXdlcl9ydGwub3V0bGluZS1kcmF3ZXJfdGlueSxcbi5vdXRsaW5lLWRyYXdlcl9sdHIub3V0bGluZS1kcmF3ZXJfdGlueSB7XG4gIHdpZHRoOiAyODBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl9ydGwub3V0bGluZS1kcmF3ZXJfbWluaSxcbi5vdXRsaW5lLWRyYXdlcl9sdHIub3V0bGluZS1kcmF3ZXJfbWluaSB7XG4gIHdpZHRoOiA0ODBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl9ydGwub3V0bGluZS1kcmF3ZXJfc21hbGwsXG4ub3V0bGluZS1kcmF3ZXJfbHRyLm91dGxpbmUtZHJhd2VyX3NtYWxsIHtcbiAgd2lkdGg6IDU0MHB4O1xufVxuLm91dGxpbmUtZHJhd2VyX3J0bC5vdXRsaW5lLWRyYXdlcl9yZWd1bGFyLFxuLm91dGxpbmUtZHJhd2VyX2x0ci5vdXRsaW5lLWRyYXdlcl9yZWd1bGFyIHtcbiAgd2lkdGg6IDY4MHB4O1xufVxuLm91dGxpbmUtZHJhd2VyX3J0bC5vdXRsaW5lLWRyYXdlcl9tZWRpdW0sXG4ub3V0bGluZS1kcmF3ZXJfbHRyLm91dGxpbmUtZHJhd2VyX21lZGl1bSB7XG4gIHdpZHRoOiA3MjBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl9ydGwub3V0bGluZS1kcmF3ZXJfbGFyZ2UsXG4ub3V0bGluZS1kcmF3ZXJfbHRyLm91dGxpbmUtZHJhd2VyX2xhcmdlIHtcbiAgd2lkdGg6IDk2MHB4O1xufVxuLm91dGxpbmUtZHJhd2VyX3J0bCB7XG4gIGJvcmRlci1sZWZ0OiAxcHggc29saWQgI2RjZGZlNjtcbn1cbi5vdXRsaW5lLWRyYXdlcl9ydGwub3V0bGluZS1kcmF3ZXJfdGlueS5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xuICByaWdodDogLTI5MHB4O1xufVxuLm91dGxpbmUtZHJhd2VyX3J0bC5vdXRsaW5lLWRyYXdlcl9taW5pLm91dGxpbmUtZHJhd2VyX2Nsb3NlZCB7XG4gIHJpZ2h0OiAtNDkwcHg7XG59XG4ub3V0bGluZS1kcmF3ZXJfcnRsLm91dGxpbmUtZHJhd2VyX3NtYWxsLm91dGxpbmUtZHJhd2VyX2Nsb3NlZCB7XG4gIHJpZ2h0OiAtNTUwcHg7XG59XG4ub3V0bGluZS1kcmF3ZXJfcnRsLm91dGxpbmUtZHJhd2VyX3JlZ3VsYXIub3V0bGluZS1kcmF3ZXJfY2xvc2VkIHtcbiAgcmlnaHQ6IC02OTBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl9ydGwub3V0bGluZS1kcmF3ZXJfbWVkaXVtLm91dGxpbmUtZHJhd2VyX2Nsb3NlZCB7XG4gIHJpZ2h0OiAtNzMwcHg7XG59XG4ub3V0bGluZS1kcmF3ZXJfcnRsLm91dGxpbmUtZHJhd2VyX2xhcmdlLm91dGxpbmUtZHJhd2VyX2Nsb3NlZCB7XG4gIHJpZ2h0OiAtOTcwcHg7XG59XG4ub3V0bGluZS1kcmF3ZXJfbHRyIHtcbiAgYm9yZGVyLXJpZ2h0OiAxcHggc29saWQgI2RjZGZlNjtcbn1cbi5vdXRsaW5lLWRyYXdlcl9sdHIub3V0bGluZS1kcmF3ZXJfdGlueS5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xuICBsZWZ0OiAtMjkwcHg7XG59XG4ub3V0bGluZS1kcmF3ZXJfbHRyLm91dGxpbmUtZHJhd2VyX21pbmkub3V0bGluZS1kcmF3ZXJfY2xvc2VkIHtcbiAgbGVmdDogLTQ5MHB4O1xufVxuLm91dGxpbmUtZHJhd2VyX2x0ci5vdXRsaW5lLWRyYXdlcl9zbWFsbC5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xuICBsZWZ0OiAtNTUwcHg7XG59XG4ub3V0bGluZS1kcmF3ZXJfbHRyLm91dGxpbmUtZHJhd2VyX3JlZ3VsYXIub3V0bGluZS1kcmF3ZXJfY2xvc2VkIHtcbiAgbGVmdDogLTY5MHB4O1xufVxuLm91dGxpbmUtZHJhd2VyX2x0ci5vdXRsaW5lLWRyYXdlcl9tZWRpdW0ub3V0bGluZS1kcmF3ZXJfY2xvc2VkIHtcbiAgbGVmdDogLTczMHB4O1xufVxuLm91dGxpbmUtZHJhd2VyX2x0ci5vdXRsaW5lLWRyYXdlcl9sYXJnZS5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xuICBsZWZ0OiAtOTcwcHg7XG59XG4ub3V0bGluZS1kcmF3ZXJfdHRiLFxuLm91dGxpbmUtZHJhd2VyX2J0dCB7XG4gIGxlZnQ6IDA7XG4gIHdpZHRoOiAxMDAlO1xufVxuLm91dGxpbmUtZHJhd2VyX3R0Yi5vdXRsaW5lLWRyYXdlcl90aW55LFxuLm91dGxpbmUtZHJhd2VyX2J0dC5vdXRsaW5lLWRyYXdlcl90aW55IHtcbiAgaGVpZ2h0OiAyNDBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl90dGIub3V0bGluZS1kcmF3ZXJfbWluaSxcbi5vdXRsaW5lLWRyYXdlcl9idHQub3V0bGluZS1kcmF3ZXJfbWluaSB7XG4gIGhlaWdodDogMzIwcHg7XG59XG4ub3V0bGluZS1kcmF3ZXJfdHRiLm91dGxpbmUtZHJhd2VyX3NtYWxsLFxuLm91dGxpbmUtZHJhd2VyX2J0dC5vdXRsaW5lLWRyYXdlcl9zbWFsbCB7XG4gIGhlaWdodDogMzYwcHg7XG59XG4ub3V0bGluZS1kcmF3ZXJfdHRiLm91dGxpbmUtZHJhd2VyX3JlZ3VsYXIsXG4ub3V0bGluZS1kcmF3ZXJfYnR0Lm91dGxpbmUtZHJhd2VyX3JlZ3VsYXIge1xuICBoZWlnaHQ6IDQwMHB4O1xufVxuLm91dGxpbmUtZHJhd2VyX3R0Yi5vdXRsaW5lLWRyYXdlcl9tZWRpdW0sXG4ub3V0bGluZS1kcmF3ZXJfYnR0Lm91dGxpbmUtZHJhd2VyX21lZGl1bSB7XG4gIGhlaWdodDogNDQwcHg7XG59XG4ub3V0bGluZS1kcmF3ZXJfdHRiLm91dGxpbmUtZHJhd2VyX2xhcmdlLFxuLm91dGxpbmUtZHJhd2VyX2J0dC5vdXRsaW5lLWRyYXdlcl9sYXJnZSB7XG4gIGhlaWdodDogNDgwcHg7XG59XG4ub3V0bGluZS1kcmF3ZXJfdHRiIHtcbiAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNkY2RmZTY7XG59XG4ub3V0bGluZS1kcmF3ZXJfdHRiLm91dGxpbmUtZHJhd2VyX3Rpbnkub3V0bGluZS1kcmF3ZXJfY2xvc2VkIHtcbiAgdG9wOiAtMjUwcHg7XG59XG4ub3V0bGluZS1kcmF3ZXJfdHRiLm91dGxpbmUtZHJhd2VyX21pbmkub3V0bGluZS1kcmF3ZXJfY2xvc2VkIHtcbiAgdG9wOiAtMzMwcHg7XG59XG4ub3V0bGluZS1kcmF3ZXJfdHRiLm91dGxpbmUtZHJhd2VyX3NtYWxsLm91dGxpbmUtZHJhd2VyX2Nsb3NlZCB7XG4gIHRvcDogLTM3MHB4O1xufVxuLm91dGxpbmUtZHJhd2VyX3R0Yi5vdXRsaW5lLWRyYXdlcl9yZWd1bGFyLm91dGxpbmUtZHJhd2VyX2Nsb3NlZCB7XG4gIHRvcDogLTQxMHB4O1xufVxuLm91dGxpbmUtZHJhd2VyX3R0Yi5vdXRsaW5lLWRyYXdlcl9tZWRpdW0ub3V0bGluZS1kcmF3ZXJfY2xvc2VkIHtcbiAgdG9wOiAtNDUwcHg7XG59XG4ub3V0bGluZS1kcmF3ZXJfdHRiLm91dGxpbmUtZHJhd2VyX2xhcmdlLm91dGxpbmUtZHJhd2VyX2Nsb3NlZCB7XG4gIHRvcDogLTQ5MHB4O1xufVxuLm91dGxpbmUtZHJhd2VyX2J0dCB7XG4gIHRvcDogaW5pdGlhbDtcbiAgYm9yZGVyLXRvcDogMXB4IHNvbGlkICNkY2RmZTY7XG59XG4ub3V0bGluZS1kcmF3ZXJfYnR0Lm91dGxpbmUtZHJhd2VyX3Rpbnkub3V0bGluZS1kcmF3ZXJfY2xvc2VkIHtcbiAgYm90dG9tOiAtMjUwcHg7XG59XG4ub3V0bGluZS1kcmF3ZXJfYnR0Lm91dGxpbmUtZHJhd2VyX21pbmkub3V0bGluZS1kcmF3ZXJfY2xvc2VkIHtcbiAgYm90dG9tOiAtMzMwcHg7XG59XG4ub3V0bGluZS1kcmF3ZXJfYnR0Lm91dGxpbmUtZHJhd2VyX3NtYWxsLm91dGxpbmUtZHJhd2VyX2Nsb3NlZCB7XG4gIGJvdHRvbTogLTM3MHB4O1xufVxuLm91dGxpbmUtZHJhd2VyX2J0dC5vdXRsaW5lLWRyYXdlcl9yZWd1bGFyLm91dGxpbmUtZHJhd2VyX2Nsb3NlZCB7XG4gIGJvdHRvbTogLTQxMHB4O1xufVxuLm91dGxpbmUtZHJhd2VyX2J0dC5vdXRsaW5lLWRyYXdlcl9tZWRpdW0ub3V0bGluZS1kcmF3ZXJfY2xvc2VkIHtcbiAgYm90dG9tOiAtNDUwcHg7XG59XG4ub3V0bGluZS1kcmF3ZXJfYnR0Lm91dGxpbmUtZHJhd2VyX2xhcmdlLm91dGxpbmUtZHJhd2VyX2Nsb3NlZCB7XG4gIGJvdHRvbTogLTQ5MHB4O1xufVxuLm91dGxpbmUtZHJhd2VyX29wZW5lZCB7XG4gIHZpc2liaWxpdHk6IHZpc2libGU7XG4gIHotaW5kZXg6IHZhcigtLW91dGxpbmUtekluZGV4KTtcbn1cbi5vdXRsaW5lLWRyYXdlcl9vcGVuZWQub3V0bGluZS1kcmF3ZXIge1xuICBwb3NpdGlvbjogZml4ZWQ7XG59XG4ub3V0bGluZS1kcmF3ZXJfb3BlbmVkLm91dGxpbmUtZHJhd2VyX3J0bCB7XG4gIHJpZ2h0OiAwO1xufVxuLm91dGxpbmUtZHJhd2VyX29wZW5lZC5vdXRsaW5lLWRyYXdlcl9sdHIge1xuICBsZWZ0OiAwO1xufVxuLm91dGxpbmUtZHJhd2VyX29wZW5lZC5vdXRsaW5lLWRyYXdlcl90dGIge1xuICB0b3A6IDA7XG59XG4ub3V0bGluZS1kcmF3ZXJfb3BlbmVkLm91dGxpbmUtZHJhd2VyX2J0dCB7XG4gIGJvdHRvbTogMDtcbn1cbi5vdXRsaW5lLWRyYXdlcl9vZmZzZXQub3V0bGluZS1kcmF3ZXJfcnRsLFxuLm91dGxpbmUtZHJhd2VyX29mZnNldC5vdXRsaW5lLWRyYXdlcl9sdHIge1xuICBoZWlnaHQ6IGNhbGMoMTAwJSAtIDRlbSk7XG4gIHRvcDogNTAlO1xuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTUwJSk7XG59XG4ub3V0bGluZS1kcmF3ZXJfb2Zmc2V0Lm91dGxpbmUtZHJhd2VyX3R0Yixcbi5vdXRsaW5lLWRyYXdlcl9vZmZzZXQub3V0bGluZS1kcmF3ZXJfYnR0IHtcbiAgd2lkdGg6IGNhbGMoMTAwJSAtIDRlbSk7XG4gIGxlZnQ6IDUwJTtcbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC01MCUpO1xufVxuLm91dGxpbmUtZHJhd2VyX29mZnNldC5vdXRsaW5lLWRyYXdlcl9vcGVuZWQub3V0bGluZS1kcmF3ZXJfcnRsIHtcbiAgcmlnaHQ6IDJlbTtcbn1cbi5vdXRsaW5lLWRyYXdlcl9vZmZzZXQub3V0bGluZS1kcmF3ZXJfb3BlbmVkLm91dGxpbmUtZHJhd2VyX2x0ciB7XG4gIGxlZnQ6IDJlbTtcbn1cbi5vdXRsaW5lLWRyYXdlcl9vZmZzZXQub3V0bGluZS1kcmF3ZXJfb3BlbmVkLm91dGxpbmUtZHJhd2VyX3R0YiB7XG4gIHRvcDogMmVtO1xufVxuLm91dGxpbmUtZHJhd2VyX29mZnNldC5vdXRsaW5lLWRyYXdlcl9vcGVuZWQub3V0bGluZS1kcmF3ZXJfYnR0IHtcbiAgYm90dG9tOiAyZW07XG59XG4ub3V0bGluZS1kcmF3ZXJfYXV0by5vdXRsaW5lLWRyYXdlcl9ydGwsXG4ub3V0bGluZS1kcmF3ZXJfYXV0by5vdXRsaW5lLWRyYXdlcl9sdHIge1xuICBoZWlnaHQ6IGF1dG87XG4gIG1heC1oZWlnaHQ6IGNhbGMoMTAwJSAtIDRlbSk7XG59XG4ub3V0bGluZS1kcmF3ZXJfZnVsbCB7XG4gIHBhZGRpbmc6IDA7XG59XG4ub3V0bGluZS1uYXZpZ2F0b3Ige1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIHotaW5kZXg6IDE7XG4gIG1hcmdpbjogMDtcbiAgd2lkdGg6IHZhcigtLW91dGxpbmUtbmF2aWdhdG9yLXdpZHRoKTtcbiAgb3ZlcmZsb3c6IGF1dG87XG59XG4ub3V0bGluZS1uYXZpZ2F0b3ItcGFyZW50IHtcbiAgdHJhbnNpdGlvbjogMC4zcyBlYXNlLWluLW91dDtcbn1cbi5vdXRsaW5lLW5hdmlnYXRvcl9fdGl0bGUge1xuICBtYXJnaW46IDAgMTZweDtcbiAgaGVpZ2h0OiA0MHB4O1xuICBsaW5lLWhlaWdodDogNDBweDtcbiAgcGFkZGluZzogMCAxNnB4O1xuICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI2RjZGZlNjtcbiAgZm9udC1zaXplOiAxNnB4O1xuICBmb250LXdlaWdodDogNDAwO1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLm91dGxpbmUtbmF2aWdhdG9yX19tYWluIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICB6LWluZGV4OiAxO1xuICBtYXJnaW46IDA7XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4ub3V0bGluZS1uYXZpZ2F0b3JfX2xpc3QsXG4ub3V0bGluZS1uYXZpZ2F0b3JfX3N1YmplY3QsXG4ub3V0bGluZS1uYXZpZ2F0b3JfX2l0ZW0ge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIHotaW5kZXg6IDI7XG4gIG1hcmdpbjogMDtcbiAgcGFkZGluZzogMDtcbiAgbGlzdC1zdHlsZS10eXBlOiBub25lO1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLm91dGxpbmUtbmF2aWdhdG9yX19saXN0IHtcbiAgcGFkZGluZzogMC41ZW0gMDtcbn1cbi5vdXRsaW5lLW5hdmlnYXRvcl9fc3ViamVjdCB7XG4gIHBhZGRpbmctbGVmdDogMWVtO1xufVxuLm91dGxpbmUtbmF2aWdhdG9yX19pdGVtIHtcbiAgbWFyZ2luOiAwO1xuICBsaW5lLWhlaWdodDogMzBweDtcbiAgZm9udC1zaXplOiAxM3B4O1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLm91dGxpbmUtbmF2aWdhdG9yX19wbGFjZWhvbGRlciB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgei1pbmRleDogMTtcbiAgdG9wOiAwO1xuICBsZWZ0OiAwO1xuICB3aWR0aDogMTAwJTtcbiAgaGVpZ2h0OiAzMHB4O1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjdmOGY5O1xuICBib3JkZXItbGVmdDogMnB4IHNvbGlkICMwNTg5NDI7XG4gIHRyYW5zaXRpb24tZHVyYXRpb246IDAuMnM7XG4gIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4ub3V0bGluZS1uYXZpZ2F0b3JfX2FuY2hvciB7XG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzO1xuICBvdmVyZmxvdzogaGlkZGVuO1xuICBkaXNwbGF5OiBibG9jaztcbiAgcGFkZGluZzogMCAxLjVlbTtcbn1cbi5vdXRsaW5lLW5hdmlnYXRvcl9fYW5jaG9yOmxpbmssXG4ub3V0bGluZS1uYXZpZ2F0b3JfX2FuY2hvcjp2aXNpdGVkLFxuLm91dGxpbmUtbmF2aWdhdG9yX19hbmNob3I6aG92ZXIge1xuICB0ZXh0LWRlY29yYXRpb246IG5vbmU7XG4gIGNvbG9yOiAjNTU1O1xufVxuLm91dGxpbmUtbmF2aWdhdG9yX19hbmNob3I6aG92ZXIge1xuICBjb2xvcjogIzA1ODk0Mjtcbn1cbi5vdXRsaW5lLW5hdmlnYXRvcl9fY29kZSB7XG4gIHBhZGRpbmctcmlnaHQ6IDAuNWVtO1xufVxuLm91dGxpbmUtbmF2aWdhdG9yX2hpZ2hsaWdodC5vdXRsaW5lLW5hdmlnYXRvcl9fYW5jaG9yOmxpbmssXG4ub3V0bGluZS1uYXZpZ2F0b3JfaGlnaGxpZ2h0Lm91dGxpbmUtbmF2aWdhdG9yX19hbmNob3I6dmlzaXRlZCxcbi5vdXRsaW5lLW5hdmlnYXRvcl9oaWdobGlnaHQub3V0bGluZS1uYXZpZ2F0b3JfX2FuY2hvcjpob3ZlciB7XG4gIGNvbG9yOiAjMDU4OTQyO1xuICBmb250LXdlaWdodDogYm9sZDtcbn1cbi5vdXRsaW5lLW5hdmlnYXRvcl9zdGlja3ksXG4ub3V0bGluZS1uYXZpZ2F0b3JfZml4ZWQge1xuICBkaXNwbGF5OiBmbGV4O1xuICBmbGV4LXdyYXA6IG5vd3JhcDtcbiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgei1pbmRleDogdmFyKC0tb3V0bGluZS16SW5kZXgpO1xuICB0b3A6IDA7XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4ub3V0bGluZS1uYXZpZ2F0b3Jfc3RpY2t5IC5vdXRsaW5lLW5hdmlnYXRvcl9fdGl0bGUsXG4ub3V0bGluZS1uYXZpZ2F0b3JfZml4ZWQgLm91dGxpbmUtbmF2aWdhdG9yX190aXRsZSxcbi5vdXRsaW5lLW5hdmlnYXRvcl9zdGlja3kgLm91dGxpbmUtbmF2aWdhdG9yX19tYWluLFxuLm91dGxpbmUtbmF2aWdhdG9yX2ZpeGVkIC5vdXRsaW5lLW5hdmlnYXRvcl9fbWFpbiB7XG4gIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG59XG4ub3V0bGluZS1uYXZpZ2F0b3Jfc3RpY2t5IC5vdXRsaW5lLW5hdmlnYXRvcl9fdGl0bGUsXG4ub3V0bGluZS1uYXZpZ2F0b3JfZml4ZWQgLm91dGxpbmUtbmF2aWdhdG9yX190aXRsZSB7XG4gIGZsZXgtc2hyaW5rOiAwO1xufVxuLm91dGxpbmUtbmF2aWdhdG9yX3N0aWNreSAub3V0bGluZS1uYXZpZ2F0b3JfX21haW4sXG4ub3V0bGluZS1uYXZpZ2F0b3JfZml4ZWQgLm91dGxpbmUtbmF2aWdhdG9yX19tYWluIHtcbiAgZmxleDogMTtcbiAgb3ZlcmZsb3c6IGF1dG87XG59XG4ub3V0bGluZS1uYXZpZ2F0b3Jfc3RpY2t5IHtcbiAgcG9zaXRpb246IHN0aWNreTtcbiAgbWF4LWhlaWdodDogdmFyKC0tb3V0bGluZS1zdGlja3ktaGVpZ2h0KTtcbn1cbi5vdXRsaW5lLW5hdmlnYXRvcl9maXhlZCB7XG4gIHBvc2l0aW9uOiBmaXhlZDtcbiAgbWF4LWhlaWdodDogMTAwJTtcbn1cbi5vdXRsaW5lLW5hdmlnYXRvcl9oaWRkZW4ge1xuICBkaXNwbGF5OiBub25lO1xufVxuLm91dGxpbmUtbmF2aWdhdG9yX2ZvbGRlZCB7XG4gIHdpZHRoOiAwO1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLyoqXG4gKiBmb250Lmxlc3MgLSDlrZfkvZPnm7jlhbPmoLflvI9cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIENyZWF0ZWQgQnk6IFlhb2hhaXhpYW9cbiAqIFVwZGF0ZTogMjAyMi4zLjE2XG4gKi9cbi8qID09PT09PSDlrZfkvZMgPT09PT09ICovXG4vKiA9PT09PT0g5a2X6YeNID09PT09PSAqL1xuLyogPT09PT09IOWtl+WPtyA9PT09PT0gKi9cbi8qKlxuICogbWl4aW5zLmxlc3MgLSDlt6Xlhbflh73mlbBcbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIENyZWF0ZWQgQnk6IFlhb2hhaXhpYW9cbiAqIFVwZGF0ZTogMjAyMi4zLjExXG4gKi9cbi8qKlxuICogcmFkaXVzLmxlc3MgLSDlnIbop5Lorr7nva4gbWl4aW54IOWHveaVsFxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogQ3JlYXRlZCBCeTogWWFvaGFpeGlhb1xuICogVXBkYXRlOiAyMDI0LjQuMTZcbiAqL1xuLyogPT09PT09IOWchuinkuagt+W8j+iuvue9ruWHveaVsCA9PT09PT0gKi9cbi5vdXRsaW5lLXJlYWRlcl9fcHJvZ3Jlc3Mge1xuICBwb3NpdGlvbjogZml4ZWQ7XG4gIHRvcDogMDtcbiAgbGVmdDogMDtcbiAgei1pbmRleDogMztcbiAgaGVpZ2h0OiA0cHg7XG4gIHdpZHRoOiAxMDAlO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjNTA3YWZlO1xuICBzY2FsZTogMCAxO1xuICB0cmFuc2Zvcm0tb3JpZ2luOiBsZWZ0O1xuICBhbmltYXRpb246IG91dGxpbmUtcmVhZGVyLXByb2dyZXNzIGxpbmVhcjtcbiAgYW5pbWF0aW9uLXRpbWVsaW5lOiAtLVByb2dyZXNzVGltZWxpbmU7XG59XG4ub3V0bGluZS1yZWFkZXJfX3BhcGVyIHtcbiAgYm94LXNoYWRvdzogMCAwIDZweCAxcHggI2RkZDtcbiAgbWFyZ2luOiAyZW0gYXV0bztcbiAgbWF4LXdpZHRoOiAxMjAwcHg7XG4gIHBhZGRpbmc6IDMuMmVtO1xuICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmO1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLm91dGxpbmUtcmVhZGVyX190aXRsZSB7XG4gIG1hcmdpbjogMC42N2VtIDA7XG4gIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgZm9udC1mYW1pbHk6IC1hcHBsZS1zeXN0ZW0sIEJsaW5rTWFjU3lzdGVtRm9udCwgJ1NlZ29lIFVJJywgJ1BpbmdGYW5nIFNDJywgJ0hpcmFnaW5vIFNhbnMgR0InLCAnTWljcm9zb2Z0IFlhSGVpJywgJ0hlbHZldGljYSBOZXVlJywgJ0FwcGxlIENvbG9yIEVtb2ppJywgJ1NlZ29lIFVJIEVtb2ppJywgJ1NlZ29lIFVJIFN5bWJvbCcsIEhlbHZldGljYSwgQXJpYWwsIHNhbnMtc2VyaWY7XG4gIGZvbnQtd2VpZ2h0OiBub3JtYWw7XG4gIGxpbmUtaGVpZ2h0OiAxLjNlbTtcbiAgZm9udC1zaXplOiA0LjJlbTtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi5vdXRsaW5lLXJlYWRlcl9fYXJ0aWNsZSAub3V0bGluZS1yZWFkZXJfX3Byb2dyZXNzIHtcbiAgZGlzcGxheTogbm9uZTtcbn1cbi5vdXRsaW5lLXJlYWRlcl9oaWRkZW4ge1xuICBkaXNwbGF5OiBub25lO1xufVxuLm91dGxpbmUtcmVhZGVyX2hpZGRlbi5vdXRsaW5lLXJlYWRlcl9zaWJsaW5nIHtcbiAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50O1xufVxuLm91dGxpbmUtcmVhZGVyX2hpZGRlbi5vdXRsaW5lLXJlYWRlcl9zaWJsaW5nLndyYXBwZXIucG9zdCB7XG4gIGRpc3BsYXk6IG5vbmU7XG59XG4ub3V0bGluZS1yZWFkZXItLXJlYWRpbmcge1xuICBkaXNwbGF5OiBibG9jaztcbiAgcG9zaXRpb246IGZpeGVkO1xuICB6LWluZGV4OiAyO1xuICB0b3A6IDA7XG4gIGxlZnQ6IDA7XG4gIHdpZHRoOiAxMDAlO1xuICBoZWlnaHQ6IDEwMCU7XG4gIG1hcmdpbjogMDtcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgcGFkZGluZzogM2VtIDRlbTtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ZhZmFmYTtcbiAgc2Nyb2xsLXRpbWVsaW5lLW5hbWU6IC0tUHJvZ3Jlc3NUaW1lbGluZTtcbiAgb3ZlcmZsb3c6IHNjcm9sbDtcbn1cbkBrZXlmcmFtZXMgb3V0bGluZS1yZWFkZXItcHJvZ3Jlc3Mge1xuICB0byB7XG4gICAgc2NhbGU6IDEgMTtcbiAgfVxufVxuQG1lZGlhIChtYXgtd2lkdGg6IDUwMHB4KSB7XG4gIC5vdXRsaW5lLXJlYWRlciB7XG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgfVxuICAub3V0bGluZS1yZWFkZXIgLm91dGxpbmUtdG9vbGJhciB7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBmbGV4LWRpcmVjdGlvbjogcm93O1xuICAgIGZsZXgtd3JhcDogbm93cmFwO1xuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgYWxpZ24tc2VsZjogYXV0bztcbiAgICB0b3A6IDEwMCU7XG4gICAgcmlnaHQ6IDA7XG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC00OHB4KTtcbiAgICB3aWR0aDogMTAwJTtcbiAgICBoZWlnaHQ6IDQ4cHg7XG4gICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICBib3JkZXItdG9wOiAxcHggc29saWQgI2RkZDtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmO1xuICAgIHBhZGRpbmc6IDAgMTZweDtcbiAgfVxuICAub3V0bGluZS1yZWFkZXIgLm91dGxpbmUtdG9vbGJhcl9fYnV0dG9uIHtcbiAgICBib3JkZXItcmFkaXVzOiAwO1xuICAgIGZsZXg6IDE7XG4gICAgYm9yZGVyOiBub25lO1xuICAgIGJveC1zaGFkb3c6IG5vbmU7XG4gIH1cbiAgLm91dGxpbmUtcmVhZGVyLS1yZWFkaW5nIHtcbiAgICBwYWRkaW5nOiAwO1xuICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmY7XG4gICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgfVxuICAub3V0bGluZS1yZWFkZXJfX3BhcGVyIHtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgei1pbmRleDogMTtcbiAgICBtYXJnaW46IDA7XG4gICAgcGFkZGluZzogMDtcbiAgICBoZWlnaHQ6IDEwMCU7XG4gICAgYm94LXNoYWRvdzogbm9uZTtcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xuICB9XG4gIC5vdXRsaW5lLXJlYWRlcl9fdGl0bGUge1xuICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIHotaW5kZXg6IDM7XG4gICAgdG9wOiAwO1xuICAgIGxlZnQ6IDA7XG4gICAgbWFyZ2luOiAwO1xuICAgIHdpZHRoOiAxMDAlO1xuICAgIGhlaWdodDogNDhweDtcbiAgICBsaW5lLWhlaWdodDogNDhweDtcbiAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI2RkZDtcbiAgICBmb250LXNpemU6IDEuOGVtO1xuICAgIGZvbnQtd2VpZ2h0OiA0MDA7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjtcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xuICB9XG4gIC5vdXRsaW5lLXJlYWRlcl9fYXJ0aWNsZSB7XG4gICAgbWFyZ2luOiA0OHB4IDA7XG4gICAgaGVpZ2h0OiBjYWxjKDEwMCUgLSA5NnB4KTtcbiAgICBwYWRkaW5nOiAwIDEuMjVlbTtcbiAgICBzY3JvbGwtdGltZWxpbmUtbmFtZTogLS1Nb2JpbGVQcm9ncmVzc1RpbWVsaW5lO1xuICAgIG92ZXJmbG93LXg6IGhpZGRlbjtcbiAgICBvdmVyZmxvdy15OiBzY3JvbGw7XG4gIH1cbiAgLm91dGxpbmUtcmVhZGVyX19hcnRpY2xlIC5vdXRsaW5lLXJlYWRlcl9fcHJvZ3Jlc3Mge1xuICAgIHotaW5kZXg6IDQ7XG4gICAgYW5pbWF0aW9uOiBvdXRsaW5lLXJlYWRlci1wcm9ncmVzcyBsaW5lYXI7XG4gICAgYW5pbWF0aW9uLXRpbWVsaW5lOiAtLU1vYmlsZVByb2dyZXNzVGltZWxpbmU7XG4gICAgZGlzcGxheTogYmxvY2s7XG4gIH1cbn1cbkBtZWRpYSBwcmludCB7XG4gIGh0bWwsXG4gIGJvZHkge1xuICAgIC8qIOaJk+WNsOeahOWfuuehgOWtl+S9k+Wkp+WwjyAqL1xuICAgIGZvbnQtc2l6ZTogMTJwdDtcbiAgICAvKiDmmL7npLrorr7nva7mloflrZfpopzoibLlkozog4zmma/popzoibIgKi9cbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmO1xuICAgIGNvbG9yOiAjMzMzO1xuICAgIGhlaWdodDogaW5pdGlhbCAhaW1wb3J0YW50O1xuICB9XG4gIC8qIOiuvue9rumTvuaOpeagt+W8jyAqL1xuICBhOmxpbmssXG4gIGE6dmlzaXRlZCxcbiAgYTpob3ZlciB7XG4gICAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmUgIWltcG9ydGFudDtcbiAgICBjb2xvcjogIzUwN2FmZTtcbiAgfVxuICAvKiDpmpDol4/lqpLkvZPmoIfnrb4gKi9cbiAgdmlkZW8sXG4gIGF1ZGlvIHtcbiAgICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7XG4gIH1cbiAgLyog56Gu5L+d6KGo5qC85Zyo5omT5Y2w5pe255qE6L655qGG5ZKM5a+56b2Q5pa55byP5riF5pmwICovXG4gIHRhYmxlIHtcbiAgICB3aWR0aDogMTAwJTtcbiAgICBib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlO1xuICB9XG4gIHRoLFxuICB0ZCB7XG4gICAgYm9yZGVyOiAxcHggc29saWQgI2RjZGZlNjtcbiAgICBwYWRkaW5nOiA4cHggMjBweDtcbiAgfVxuICAub3V0bGluZS1tZXNzYWdlLFxuICAub3V0bGluZS10b29sYmFyIHtcbiAgICAvKiDpmpDol4/kuoblt6XlhbfmoI/lkozkv6Hmga/mj5DnpLrmoYYgKi9cbiAgICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7XG4gIH1cbiAgLm91dGxpbmUtcmVhZGVyIHtcbiAgICBkaXNwbGF5OiBibG9jayAhaW1wb3J0YW50O1xuICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgLyog5Y+W5raI5LqG57ud5a+55a6a5L2NICovXG4gICAgLyog6ZqQ6JeP6ZiF6K+76L+b5bqm5p2hICovXG4gICAgLyog5omT5Y2w5pe25LiN5pi+56S65q2j5paHIERPTSDnmoTpmLTlvbHmlYjmnpwgKi9cbiAgICAvKiDmiYDmnInmlofnq6DlhoXlrrkgRE9NIOebuOWFs+eahOmCu+WxheiKgueCuemDvemakOiXj+S6hiAqL1xuICB9XG4gIC5vdXRsaW5lLXJlYWRlcl9fdGl0bGUge1xuICAgIG1hcmdpbjogMTMuNHB0IDAgMjhwdCAhaW1wb3J0YW50O1xuICAgIHRleHQtYWxpZ246IGNlbnRlciAhaW1wb3J0YW50O1xuICAgIGZvbnQtc2l6ZTogMzJwdCAhaW1wb3J0YW50O1xuICB9XG4gIC5vdXRsaW5lLXJlYWRlci0tcmVhZGluZyB7XG4gICAgcG9zaXRpb246IHJlbGF0aXZlICFpbXBvcnRhbnQ7XG4gICAgaGVpZ2h0OiBhdXRvICFpbXBvcnRhbnQ7XG4gICAgcGFkZGluZzogMCAhaW1wb3J0YW50O1xuICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmY7XG4gICAgb3ZlcmZsb3c6IGhpZGRlbiAhaW1wb3J0YW50O1xuICB9XG4gIC5vdXRsaW5lLXJlYWRlcl9fcHJvZ3Jlc3Mge1xuICAgIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDtcbiAgfVxuICAub3V0bGluZS1yZWFkZXJfX3BhcGVyIHtcbiAgICBib3gtc2hhZG93OiBub25lO1xuICB9XG4gIC5vdXRsaW5lLXJlYWRlciBwcmUge1xuICAgIHBhZGRpbmc6IDFlbSAhaW1wb3J0YW50O1xuICAgIGJvcmRlcjogMXB4IHNvbGlkICNkZGQgIWltcG9ydGFudDtcbiAgICBib3JkZXItcmFkaXVzOiA0cHggIWltcG9ydGFudDtcbiAgfVxuICAub3V0bGluZS1yZWFkZXIgcHJlLFxuICAub3V0bGluZS1yZWFkZXIgY29kZSB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZiAhaW1wb3J0YW50O1xuICB9XG4gIC5vdXRsaW5lLXJlYWRlciB0YWJsZSxcbiAgLm91dGxpbmUtcmVhZGVyIGltZyxcbiAgLm91dGxpbmUtcmVhZGVyIHN2ZyB7XG4gICAgYnJlYWstaW5zaWRlOiBhdm9pZDtcbiAgfVxuICAub3V0bGluZS1yZWFkZXJfc2libGluZyB7XG4gICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50O1xuICB9XG59XG4vKiA9PT09PT09PT09IGJ1dHRvbnMudGhlbWUgLSDmjInpkq7lr7zoiKrmoLflvI8gPT09PT09PT09PSAqL1xuLm91dGxpbmUtdG9vbGJhciB7XG4gIHBvc2l0aW9uOiBmaXhlZDtcbiAgei1pbmRleDogOTk5OTk7XG4gIG1hcmdpbjogMDtcbiAgdHJhbnNpdGlvbi1kdXJhdGlvbjogMC4zcztcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi5vdXRsaW5lLXRvb2xiYXJfX2J1dHRvbiB7XG4gIGJveC1zaGFkb3c6IDAgMCA2cHggMXB4ICNkY2RmZTY7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgei1pbmRleDogMTtcbiAgbWFyZ2luOiAxMHB4O1xuICB3aWR0aDogMzZweDtcbiAgaGVpZ2h0OiAzNnB4O1xuICBib3JkZXI6IDFweCBzb2xpZCAjZGNkZmU2O1xuICBib3JkZXItcmFkaXVzOiAzcHg7XG4gIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gIGJhY2tncm91bmQtY29sb3I6ICNmZmY7XG4gIGN1cnNvcjogcG9pbnRlcjtcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xuICBjb2xvcjogIzk5OTtcbiAgdHJhbnNpdGlvbjogYWxsIDAuM3MgMC4xcyBlYXNlLWluLW91dDtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi5vdXRsaW5lLXRvb2xiYXJfX2J1dHRvbjpob3ZlciB7XG4gIGNvbG9yOiAjMDU4OTQyO1xuICBib3JkZXItY29sb3I6ICMwNTg5NDI7XG4gIHRyYW5zZm9ybTogc2NhbGUoMS4zNSk7XG59XG4ub3V0bGluZS10b29sYmFyX19idXR0b24uaGlkZSB7XG4gIGRpc3BsYXk6IG5vbmU7XG59XG4ub3V0bGluZS10b29sYmFyX19hbmNob3I6bGluayxcbi5vdXRsaW5lLXRvb2xiYXJfX2FuY2hvcjp2aXNpdGVkLFxuLm91dGxpbmUtdG9vbGJhcl9fYW5jaG9yOmhvdmVyIHtcbiAgY29sb3I6ICM5OTk7XG4gIHRleHQtZGVjb3JhdGlvbjogbm9uZTtcbn1cbi5vdXRsaW5lLXRvb2xiYXJfX2FuY2hvcjpob3ZlciB7XG4gIGNvbG9yOiAjMDU4OTQyO1xufVxuLm91dGxpbmUtdG9vbGJhcl9faWNvbiB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgei1pbmRleDogMjtcbiAgdG9wOiA1MCU7XG4gIGxlZnQ6IDUwJTtcbiAgd2lkdGg6IDIwcHg7XG4gIGhlaWdodDogMjBweDtcbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgLTUwJSk7XG4gIGZpbGw6IGN1cnJlbnRjb2xvcjtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi5vdXRsaW5lLXRvb2xiYXJfYWN0aXZlLm91dGxpbmUtdG9vbGJhcl9fYnV0dG9uIHtcbiAgY29sb3I6ICNmZmY7XG4gIGJhY2tncm91bmQtY29sb3I6ICMwNTg5NDI7XG4gIGJvcmRlci1jb2xvcjogIzA1ODk0Mjtcbn1cbi5vdXRsaW5lLXRvb2xiYXJfYWN0aXZlLm91dGxpbmUtdG9vbGJhcl9fYnV0dG9uOmhvdmVyIHtcbiAgY29sb3I6ICNmZmY7XG59XG4ub3V0bGluZS10b29sYmFyX2FjdGl2ZSAub3V0bGluZS10b29sYmFyX19hbmNob3I6bGluayxcbi5vdXRsaW5lLXRvb2xiYXJfYWN0aXZlIC5vdXRsaW5lLXRvb2xiYXJfX2FuY2hvcjp2aXNpdGVkLFxuLm91dGxpbmUtdG9vbGJhcl9hY3RpdmUgLm91dGxpbmUtdG9vbGJhcl9fYW5jaG9yOmhvdmVyIHtcbiAgY29sb3I6ICNmZmY7XG59XG4ub3V0bGluZS10b29sYmFyX3JvdW5kZWQub3V0bGluZS10b29sYmFyX19idXR0b24ge1xuICBib3JkZXItcmFkaXVzOiAxOHB4O1xufVxuLm91dGxpbmUtdG9vbGJhcl9kaXNhYmxlZC5vdXRsaW5lLXRvb2xiYXJfX2FuY2hvcjpsaW5rLFxuLm91dGxpbmUtdG9vbGJhcl9kaXNhYmxlZCAub3V0bGluZS10b29sYmFyX19hbmNob3I6bGluayxcbi5vdXRsaW5lLXRvb2xiYXJfZGlzYWJsZWQub3V0bGluZS10b29sYmFyX19hbmNob3I6dmlzaXRlZCxcbi5vdXRsaW5lLXRvb2xiYXJfZGlzYWJsZWQgLm91dGxpbmUtdG9vbGJhcl9fYW5jaG9yOnZpc2l0ZWQsXG4ub3V0bGluZS10b29sYmFyX2Rpc2FibGVkLm91dGxpbmUtdG9vbGJhcl9fYW5jaG9yOmhvdmVyLFxuLm91dGxpbmUtdG9vbGJhcl9kaXNhYmxlZCAub3V0bGluZS10b29sYmFyX19hbmNob3I6aG92ZXIsXG4ub3V0bGluZS10b29sYmFyX2Rpc2FibGVkLm91dGxpbmUtdG9vbGJhcl9fYnV0dG9uLFxuLm91dGxpbmUtdG9vbGJhcl9kaXNhYmxlZCAub3V0bGluZS10b29sYmFyX19idXR0b24ge1xuICBjdXJzb3I6IG5vdC1hbGxvd2VkO1xuICBjb2xvcjogIzk5OTtcbiAgYm9yZGVyLWNvbG9yOiAjOTk5O1xufVxuLm91dGxpbmUtdG9vbGJhcl9kaXNhYmxlZC5vdXRsaW5lLXRvb2xiYXJfX2FuY2hvcjpsaW5rOmhvdmVyLFxuLm91dGxpbmUtdG9vbGJhcl9kaXNhYmxlZCAub3V0bGluZS10b29sYmFyX19hbmNob3I6bGluazpob3Zlcixcbi5vdXRsaW5lLXRvb2xiYXJfZGlzYWJsZWQub3V0bGluZS10b29sYmFyX19hbmNob3I6dmlzaXRlZDpob3Zlcixcbi5vdXRsaW5lLXRvb2xiYXJfZGlzYWJsZWQgLm91dGxpbmUtdG9vbGJhcl9fYW5jaG9yOnZpc2l0ZWQ6aG92ZXIsXG4ub3V0bGluZS10b29sYmFyX2Rpc2FibGVkLm91dGxpbmUtdG9vbGJhcl9fYW5jaG9yOmhvdmVyOmhvdmVyLFxuLm91dGxpbmUtdG9vbGJhcl9kaXNhYmxlZCAub3V0bGluZS10b29sYmFyX19hbmNob3I6aG92ZXI6aG92ZXIsXG4ub3V0bGluZS10b29sYmFyX2Rpc2FibGVkLm91dGxpbmUtdG9vbGJhcl9fYnV0dG9uOmhvdmVyLFxuLm91dGxpbmUtdG9vbGJhcl9kaXNhYmxlZCAub3V0bGluZS10b29sYmFyX19idXR0b246aG92ZXIge1xuICBjb2xvcjogIzk5OTtcbiAgYm9yZGVyLWNvbG9yOiAjOTk5O1xufVxuLm91dGxpbmUtdG9vbGJhcl9kaXNhYmxlZC5vdXRsaW5lLXRvb2xiYXJfX2J1dHRvbixcbi5vdXRsaW5lLXRvb2xiYXJfZGlzYWJsZWQgLm91dGxpbmUtdG9vbGJhcl9fYnV0dG9uIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2Y1ZjVmNTtcbn1cbi5vdXRsaW5lLXRvb2xiYXJfdHRiLFxuLm91dGxpbmUtdG9vbGJhcl9idHQge1xuICBsZWZ0OiA1MCU7XG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgtNTAlKTtcbn1cbi5vdXRsaW5lLXRvb2xiYXJfdHRiIC5vdXRsaW5lLXRvb2xiYXJfX2J1dHRvbixcbi5vdXRsaW5lLXRvb2xiYXJfYnR0IC5vdXRsaW5lLXRvb2xiYXJfX2J1dHRvbiB7XG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbn1cbi5vdXRsaW5lLXRvb2xiYXJfdHRiIHtcbiAgdG9wOiAxMnB4O1xufVxuLm91dGxpbmUtdG9vbGJhcl90dGIub3V0bGluZS10b29sYmFyX2hpZGRlbiB7XG4gIHRvcDogLTU2cHg7XG59XG4ub3V0bGluZS10b29sYmFyX2J0dCB7XG4gIGJvdHRvbTogMTJweDtcbn1cbi5vdXRsaW5lLXRvb2xiYXJfYnR0Lm91dGxpbmUtdG9vbGJhcl9oaWRkZW4ge1xuICBib3R0b206IC01NnB4O1xufVxuLm91dGxpbmUtdG9vbGJhcl9ydGwsXG4ub3V0bGluZS10b29sYmFyX2x0ciB7XG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtNTAlKTtcbiAgd2lkdGg6IDU2cHg7XG59XG4ub3V0bGluZS10b29sYmFyX3J0bCB7XG4gIHRvcDogNTAlO1xuICByaWdodDogMTJweDtcbn1cbi5vdXRsaW5lLXRvb2xiYXJfcnRsLm91dGxpbmUtdG9vbGJhcl9oaWRkZW4ge1xuICByaWdodDogLTg2cHg7XG59XG4ub3V0bGluZS10b29sYmFyX2x0ciB7XG4gIHRvcDogNTAlO1xuICBsZWZ0OiAxMnB4O1xufVxuLm91dGxpbmUtdG9vbGJhcl9sdHIub3V0bGluZS10b29sYmFyX2hpZGRlbiB7XG4gIGxlZnQ6IC04NnB4O1xufVxuLm91dGxpbmUtdG9vbGJhcl90dGIgLm91dGxpbmUtdG9vbGJhcl9fYnV0dG9uLm91dGxpbmUtdG9vbGJhcl9oaWRkZW4sXG4ub3V0bGluZS10b29sYmFyX3J0bCAub3V0bGluZS10b29sYmFyX19idXR0b24ub3V0bGluZS10b29sYmFyX2hpZGRlbixcbi5vdXRsaW5lLXRvb2xiYXJfYnR0IC5vdXRsaW5lLXRvb2xiYXJfX2J1dHRvbi5vdXRsaW5lLXRvb2xiYXJfaGlkZGVuLFxuLm91dGxpbmUtdG9vbGJhcl9sdHIgLm91dGxpbmUtdG9vbGJhcl9fYnV0dG9uLm91dGxpbmUtdG9vbGJhcl9oaWRkZW4ge1xuICBkaXNwbGF5OiBub25lO1xufVxuLm91dGxpbmUtbWVzc2FnZSB7XG4gIGJvcmRlci1yYWRpdXM6IDNweDtcbiAgYm94LXNoYWRvdzogMCAwIDZweCAxcHggI2RjZGZlNjtcbiAgcG9zaXRpb246IGZpeGVkO1xuICB6LWluZGV4OiA5OTk5O1xuICBvcGFjaXR5OiAwLjE7XG4gIHRvcDogLTUwcHg7XG4gIGxlZnQ6IDUwJTtcbiAgaGVpZ2h0OiA0MHB4O1xuICBtYXJnaW46IDA7XG4gIHBhZGRpbmc6IDAgNTBweDtcbiAgbGluZS1oZWlnaHQ6IDQwcHg7XG4gIGZvbnQtc2l6ZTogMTNweDtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjtcbiAgY29sb3I6ICM2NjY7XG4gIHRyYW5zaXRpb246IGFsbCAwLjVzIGVhc2UtaW4tb3V0O1xuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTUwJSk7XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4ub3V0bGluZS1tZXNzYWdlX19jb250ZW50IHtcbiAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbiAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7XG4gIG1hcmdpbjogMDtcbiAgbWF4LXdpZHRoOiA3MDBweDtcbiAgaGVpZ2h0OiA0MHB4O1xuICBsaW5lLWhlaWdodDogNDBweDtcbiAgZm9udC1zaXplOiAxM3B4O1xuICBjb2xvcjogIzY2NjtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi5vdXRsaW5lLW1lc3NhZ2VfX2Nsb3NlLFxuLm91dGxpbmUtbWVzc2FnZV9faWNvbiB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgei1pbmRleDogMjtcbiAgdG9wOiAwO1xuICB3aWR0aDogNDBweDtcbiAgaGVpZ2h0OiA0MHB4O1xuICBsaW5lLWhlaWdodDogNDBweDtcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLm91dGxpbmUtbWVzc2FnZV9faWNvbiB7XG4gIGxlZnQ6IDA7XG4gIGNvbG9yOiAjZmZmO1xufVxuLm91dGxpbmUtbWVzc2FnZV9faWNvbiAub3V0bGluZS1pY29uIHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB6LWluZGV4OiAyO1xuICB0b3A6IDUwJTtcbiAgbGVmdDogNTAlO1xuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCAtNTAlKTtcbn1cbi5vdXRsaW5lLW1lc3NhZ2VfX2Nsb3NlIHtcbiAgcmlnaHQ6IDA7XG4gIGN1cnNvcjogcG9pbnRlcjtcbiAgY29sb3I6ICM5OTk7XG59XG4ub3V0bGluZS1tZXNzYWdlX19jbG9zZSAub3V0bGluZS1pY29uIHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB6LWluZGV4OiAyO1xuICB0b3A6IDUwJTtcbiAgbGVmdDogNTAlO1xuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCAtNTAlKTtcbn1cbi5vdXRsaW5lLW1lc3NhZ2VfX2Nsb3NlOmhvdmVyIHtcbiAgY29sb3I6ICM2NjY7XG59XG4ub3V0bGluZS1tZXNzYWdlX2luZm8gLm91dGxpbmUtbWVzc2FnZV9faWNvbiB7XG4gIGJhY2tncm91bmQtY29sb3I6ICM1MDdhZmU7XG59XG4ub3V0bGluZS1tZXNzYWdlX3dhcm5pbmcgLm91dGxpbmUtbWVzc2FnZV9faWNvbiB7XG4gIGJhY2tncm91bmQtY29sb3I6ICNmZjk5MDE7XG59XG4ub3V0bGluZS1tZXNzYWdlX3N1Y2Nlc3MgLm91dGxpbmUtbWVzc2FnZV9faWNvbiB7XG4gIGJhY2tncm91bmQtY29sb3I6ICMwNTg5NDI7XG59XG4ub3V0bGluZS1tZXNzYWdlX2Vycm9yIC5vdXRsaW5lLW1lc3NhZ2VfX2ljb24ge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmY1ZDVkO1xufVxuLm91dGxpbmUtbWVzc2FnZV9wbGFpbiB7XG4gIG1pbi13aWR0aDogMTkwcHg7XG4gIHBhZGRpbmc6IDAgNTBweCAwIDE1cHg7XG59XG4ub3V0bGluZS1tZXNzYWdlX3BsYWluLm91dGxpbmUtbWVzc2FnZV9pbmZvIHtcbiAgYm9yZGVyLWxlZnQ6IDVweCBzb2xpZCAjNTA3YWZlO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZWNmOGZmO1xufVxuLm91dGxpbmUtbWVzc2FnZV9wbGFpbi5vdXRsaW5lLW1lc3NhZ2Vfd2FybmluZyB7XG4gIGJvcmRlci1sZWZ0OiA1cHggc29saWQgI2ZmOTkwMTtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZmJlNjtcbn1cbi5vdXRsaW5lLW1lc3NhZ2VfcGxhaW4ub3V0bGluZS1tZXNzYWdlX3N1Y2Nlc3Mge1xuICBib3JkZXItbGVmdDogNXB4IHNvbGlkICMwNTg5NDI7XG4gIGJhY2tncm91bmQtY29sb3I6ICNlMWY2ZWI7XG59XG4ub3V0bGluZS1tZXNzYWdlX3BsYWluLm91dGxpbmUtbWVzc2FnZV9lcnJvciB7XG4gIGJvcmRlci1sZWZ0OiA1cHggc29saWQgI2ZmNWQ1ZDtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjFmMDtcbn1cbi5vdXRsaW5lLW1lc3NhZ2VfcGxhaW4gLm91dGxpbmUtbWVzc2FnZV9faWNvbiB7XG4gIHdpZHRoOiAwO1xuICBkaXNwbGF5OiBub25lO1xufVxuLm91dGxpbmUtbWVzc2FnZV9wbGFpbiAub3V0bGluZS1tZXNzYWdlX19pY29uIC5vdXRsaW5lLWljb24ge1xuICBkaXNwbGF5OiBub25lO1xufVxuLm91dGxpbmUtbWVzc2FnZV9saWdodCB7XG4gIG1pbi13aWR0aDogMTgwcHg7XG4gIHBhZGRpbmc6IDAgNDBweDtcbn1cbi5vdXRsaW5lLW1lc3NhZ2VfbGlnaHQub3V0bGluZS1tZXNzYWdlX2luZm8gLm91dGxpbmUtbWVzc2FnZV9faWNvbiB7XG4gIGNvbG9yOiAjNTA3YWZlO1xufVxuLm91dGxpbmUtbWVzc2FnZV9saWdodC5vdXRsaW5lLW1lc3NhZ2Vfd2FybmluZyAub3V0bGluZS1tZXNzYWdlX19pY29uIHtcbiAgY29sb3I6ICNmZjk5MDE7XG59XG4ub3V0bGluZS1tZXNzYWdlX2xpZ2h0Lm91dGxpbmUtbWVzc2FnZV9zdWNjZXNzIC5vdXRsaW5lLW1lc3NhZ2VfX2ljb24ge1xuICBjb2xvcjogIzA1ODk0Mjtcbn1cbi5vdXRsaW5lLW1lc3NhZ2VfbGlnaHQub3V0bGluZS1tZXNzYWdlX2Vycm9yIC5vdXRsaW5lLW1lc3NhZ2VfX2ljb24ge1xuICBjb2xvcjogI2ZmNWQ1ZDtcbn1cbi5vdXRsaW5lLW1lc3NhZ2VfbGlnaHQgLm91dGxpbmUtbWVzc2FnZV9faWNvbiB7XG4gIGJhY2tncm91bmQtY29sb3I6ICNmZmY7XG59XG4ub3V0bGluZS1tZXNzYWdlX3JvdW5kIHtcbiAgYm9yZGVyLXJhZGl1czogMjBweDtcbn1cbi5vdXRsaW5lLW1lc3NhZ2Vfcm91bmQub3V0bGluZS1tZXNzYWdlX2RlZmF1bHQge1xuICBtaW4td2lkdGg6IDE4MHB4O1xuICBwYWRkaW5nOiAwIDQwcHg7XG59XG4ub3V0bGluZS1tZXNzYWdlX3JvdW5kLm91dGxpbmUtbWVzc2FnZV9kZWZhdWx0IC5vdXRsaW5lLW1lc3NhZ2VfX2ljb24ge1xuICBib3JkZXItcmFkaXVzOiAxMHB4O1xuICB0b3A6IDEwcHg7XG4gIGxlZnQ6IDEwcHg7XG4gIHdpZHRoOiAyMHB4O1xuICBoZWlnaHQ6IDIwcHg7XG4gIGxpbmUtaGVpZ2h0OiAyMHB4O1xufVxuLm91dGxpbmUtbWVzc2FnZV9yb3VuZC5vdXRsaW5lLW1lc3NhZ2VfZGVmYXVsdC5vdXRsaW5lLW1lc3NhZ2VfZnVsbC13aWR0aCB7XG4gIG1pbi13aWR0aDogMjAwcHg7XG4gIHBhZGRpbmc6IDAgMjBweCAwIDQwcHg7XG59XG4ub3V0bGluZS1tZXNzYWdlX3JvdW5kLm91dGxpbmUtbWVzc2FnZV9wbGFpbiB7XG4gIG1pbi13aWR0aDogMTk1cHg7XG4gIHBhZGRpbmc6IDAgNDBweCAwIDIwcHg7XG59XG4ub3V0bGluZS1tZXNzYWdlX3JvdW5kLm91dGxpbmUtbWVzc2FnZV9wbGFpbi5vdXRsaW5lLW1lc3NhZ2VfZnVsbC13aWR0aCB7XG4gIG1pbi13aWR0aDogMjE1cHg7XG4gIHBhZGRpbmc6IDAgMjBweDtcbn1cbi5vdXRsaW5lLW1lc3NhZ2VfZnVsbC13aWR0aCB7XG4gIG1pbi13aWR0aDogMjAwcHg7XG4gIHBhZGRpbmc6IDAgMTBweCAwIDUwcHg7XG59XG4ub3V0bGluZS1tZXNzYWdlX2Z1bGwtd2lkdGgub3V0bGluZS1tZXNzYWdlX3BsYWluIHtcbiAgbWluLXdpZHRoOiAyMzBweDtcbiAgcGFkZGluZzogMCAxMHB4IDAgMTVweDtcbn1cbi5vdXRsaW5lLW1lc3NhZ2VfZnVsbC13aWR0aC5vdXRsaW5lLW1lc3NhZ2VfbGlnaHQge1xuICBtaW4td2lkdGg6IDIxMHB4O1xuICBwYWRkaW5nOiAwIDEwcHggMCA0MHB4O1xufVxuLm91dGxpbmUtbWVzc2FnZV92aXNpYmxlIHtcbiAgb3BhY2l0eTogMTtcbn1cbi5vdXRsaW5lLW1lc3NhZ2VfaGlkZGVuIHtcbiAgZGlzcGxheTogbm9uZTtcbn1cbi8qID09PT09IFNjcm9sbGJhciA9PT09PSAqL1xuOjotd2Via2l0LXNjcm9sbGJhciB7XG4gIHdpZHRoOiA3cHg7XG4gIGhlaWdodDogN3B4O1xuICAtd2Via2l0LWJvcmRlci1yYWRpdXM6IDVweDtcbn1cbjo6LXdlYmtpdC1zY3JvbGxiYXItdHJhY2stcGllY2Uge1xuICAtd2Via2l0LWJvcmRlci1yYWRpdXM6IDVweDtcbn1cbjo6LXdlYmtpdC1zY3JvbGxiYXItdGh1bWI6dmVydGljYWwge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuMjUpO1xuICAtd2Via2l0LWJvcmRlci1yYWRpdXM6IDVweDtcbn1cbjo6LXdlYmtpdC1zY3JvbGxiYXItdGh1bWI6aG9yaXpvbnRhbCB7XG4gIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMCwgMCwgMCwgMC4yNSk7XG4gIC13ZWJraXQtYm9yZGVyLXJhZGl1czogNXB4O1xufVxuOjotd2Via2l0LXNjcm9sbGJhci10aHVtYjpob3ZlciB7XG4gIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMCwgMCwgMCwgMC4zNSk7XG59XG46Oi13ZWJraXQtc2Nyb2xsYmFyOmhvdmVyIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjE1KTtcbn1cbiIsIi8qID09PT09PT09PT0gaWNvbi50aGVtZSAtIHN2ZyDlm77moIfnmoTmoLflvI8gPT09PT09PT09PSAqL1xyXG4ub3V0bGluZS1pY29uIHtcclxuICBwb3NpdGlvbjogcmVsYXRpdmU7XHJcbiAgei1pbmRleDogMTtcclxuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XHJcbiAgdmVydGljYWwtYWxpZ246IG1pZGRsZTtcclxuICB3aWR0aDogMWVtO1xyXG4gIGhlaWdodDogMWVtO1xyXG4gIG92ZXJmbG93OiBoaWRkZW47XHJcblxyXG4gICZfX3N2ZyB7XHJcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XHJcbiAgICB6LWluZGV4OiAyO1xyXG4gICAgdG9wOiA1MCU7XHJcbiAgICBsZWZ0OiA1MCU7XHJcbiAgICB3aWR0aDogMWVtO1xyXG4gICAgaGVpZ2h0OiAxZW07XHJcbiAgICBmaWxsOiBjdXJyZW50Y29sb3I7XHJcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCAtNTAlKTtcclxuICAgIG92ZXJmbG93OiBoaWRkZW47XHJcbiAgfVxyXG5cclxuICAmX2hpZGRlbiB7XHJcbiAgICBkaXNwbGF5OiBub25lO1xyXG4gIH1cclxufVxyXG4iLCJAaW1wb3J0ICdjb2xvcnMnO1xyXG5cclxuLm91dGxpbmUtaGVhZGluZyB7XHJcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xyXG4gIHotaW5kZXg6IDE7XHJcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcclxuXHJcbiAgJl9fYW5jaG9yIHtcclxuICAgIGRpc3BsYXk6IG5vbmU7XHJcblxyXG4gICAgJjpsaW5rLFxyXG4gICAgJjp2aXNpdGVkLFxyXG4gICAgJjpob3ZlciB7XHJcbiAgICAgIGNvbG9yOiBAZm91cnRoX3RleHRfY29sb3I7XHJcbiAgICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTtcclxuICAgIH1cclxuXHJcbiAgICAmOmhvdmVyIHtcclxuICAgICAgY29sb3I6IEBwcmltYXJ5X2NvbG9yO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgJjpob3ZlciB7XHJcbiAgICAub3V0bGluZS1oZWFkaW5nX19hbmNob3Ige1xyXG4gICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAmX3N0YXJ0IHtcclxuICAgICY6aG92ZXIge1xyXG4gICAgICBvdmVyZmxvdzogdmlzaWJsZTtcclxuICAgIH1cclxuXHJcbiAgICAub3V0bGluZS1oZWFkaW5nX19hbmNob3Ige1xyXG4gICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XHJcbiAgICAgIHotaW5kZXg6IDI7XHJcbiAgICAgIHRvcDogNTAlO1xyXG4gICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTUwJSk7XHJcbiAgICAgIGxlZnQ6IC0xZW07XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbiIsIkBpbXBvcnQgJy4vdmFyaWFibGVzJztcclxuQGltcG9ydCAnLi9jb2xvcnMnO1xyXG5AaW1wb3J0ICcuL3NoYWRvdyc7XHJcblxyXG4ub3V0bGluZS1kcmF3ZXIge1xyXG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcclxuICB6LWluZGV4OiAtMTtcclxuICB0b3A6IDA7XHJcbiAgbGVmdDogMDtcclxuICBtYXJnaW46IDA7XHJcbiAgd2lkdGg6IDEwMCU7XHJcbiAgaGVpZ2h0OiAxMDAlO1xyXG4gIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XHJcbiAgdmlzaWJpbGl0eTogaGlkZGVuO1xyXG4gIG92ZXJmbG93OiBoaWRkZW47XHJcblxyXG4gICZfX21vZGFsIHtcclxuICAgIC5zaGFkb3dfbGlnaHRfcmVndWxhcigpO1xyXG4gICAgZGlzcGxheTogZmxleDtcclxuICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XHJcbiAgICBmbGV4LXdyYXA6IG5vd3JhcDtcclxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcclxuICAgIHotaW5kZXg6IDIxO1xyXG4gICAgaGVpZ2h0OiAxMDAlO1xyXG4gICAgYmFja2dyb3VuZC1jb2xvcjogQHdoaXRlO1xyXG4gICAgdHJhbnNpdGlvbi1kdXJhdGlvbjogMC40cztcclxuICAgIG92ZXJmbG93OiBoaWRkZW47XHJcbiAgfVxyXG5cclxuICAmX19oZWFkZXIsXHJcbiAgJl9fbWFpbixcclxuICAmX19mb290ZXIge1xyXG4gICAgd2lkdGg6IDEwMCU7XHJcbiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xyXG4gIH1cclxuXHJcbiAgJl9faGVhZGVyLFxyXG4gICZfX2Zvb3RlciB7XHJcbiAgICBmbGV4LXNocmluazogMDtcclxuICB9XHJcblxyXG4gICZfX3RpdGxlLFxyXG4gICZfX21haW4sXHJcbiAgJl9fZm9vdGVyIHtcclxuICAgIHBhZGRpbmc6IDAgMTZweDtcclxuICB9XHJcblxyXG4gICZfX2hlYWRlcixcclxuICAmX190aXRsZSB7XHJcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XHJcbiAgICB6LWluZGV4OiAxO1xyXG4gICAgbWFyZ2luOiAwIGF1dG87XHJcbiAgICBoZWlnaHQ6IDUycHg7XHJcbiAgICBsaW5lLWhlaWdodDogNTJweDtcclxuICAgIG92ZXJmbG93OiBoaWRkZW47XHJcbiAgfVxyXG5cclxuICAmX190aXRsZSB7XHJcbiAgICBmb250LXNpemU6IDE2cHg7XHJcbiAgICBmb250LXdlaWdodDogNDAwO1xyXG4gICAgbWFyZ2luOiAwIDE2cHg7XHJcbiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xyXG4gICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIEBwcmltYXJ5X2JvcmRlcl9jb2xvcjtcclxuICB9XHJcblxyXG4gICZfX2Nsb3NlIHtcclxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcclxuICAgIHotaW5kZXg6IDI7XHJcbiAgICB0b3A6IDUwJTtcclxuICAgIHJpZ2h0OiAxMnB4O1xyXG4gICAgd2lkdGg6IDIwcHg7XHJcbiAgICBoZWlnaHQ6IDIwcHg7XHJcbiAgICBsaW5lLWhlaWdodDogMjBweDtcclxuICAgIGNvbG9yOiBAZm91cnRoX3RleHRfY29sb3I7XHJcbiAgICBmb250LXNpemU6IDIwcHg7XHJcbiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XHJcbiAgICBjdXJzb3I6IHBvaW50ZXI7XHJcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTUwJSk7XHJcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xyXG5cclxuICAgIC5vdXRsaW5lLWljb24ge1xyXG4gICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XHJcbiAgICAgIHotaW5kZXg6IDI7XHJcbiAgICAgIHRvcDogMDtcclxuICAgICAgbGVmdDogMDtcclxuICAgIH1cclxuXHJcbiAgICAmOmhvdmVyIHtcclxuICAgICAgY29sb3I6IEB0aGlyZF90ZXh0X2NvbG9yO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgJl9fbWFpbiB7XHJcbiAgICBmbGV4OiAxO1xyXG4gICAgb3ZlcmZsb3c6IGF1dG87XHJcblxyXG4gICAgJi5vdmVyZmxvdy1oaWRkZW4ge1xyXG4gICAgICBvdmVyZmxvdzogaGlkZGVuO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgJl9fZm9vdGVyIHtcclxuICAgIG1hcmdpbjogMCBhdXRvO1xyXG4gICAgdGV4dC1hbGlnbjogcmlnaHQ7XHJcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xyXG4gIH1cclxuXHJcbiAgJl9fb3ZlcmxheSB7XHJcbiAgICBjb250ZW50OiAnJztcclxuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcclxuICAgIHotaW5kZXg6IDE7XHJcbiAgICB0b3A6IDA7XHJcbiAgICBsZWZ0OiAwO1xyXG4gICAgd2lkdGg6IDEwMCU7XHJcbiAgICBoZWlnaHQ6IDEwMCU7XHJcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAd2hpdGU7XHJcbiAgICBvcGFjaXR5OiAwLjE7XHJcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xyXG4gIH1cclxuXHJcbiAgJl9ydGwsXHJcbiAgJl9sdHIge1xyXG4gICAgJi5vdXRsaW5lLWRyYXdlciB7XHJcbiAgICAgICZfdGlueSB7XHJcbiAgICAgICAgd2lkdGg6IDI4MHB4O1xyXG4gICAgICB9XHJcblxyXG4gICAgICAmX21pbmkge1xyXG4gICAgICAgIHdpZHRoOiA0ODBweDtcclxuICAgICAgfVxyXG5cclxuICAgICAgJl9zbWFsbCB7XHJcbiAgICAgICAgd2lkdGg6IDU0MHB4O1xyXG4gICAgICB9XHJcblxyXG4gICAgICAmX3JlZ3VsYXIge1xyXG4gICAgICAgIHdpZHRoOiA2ODBweDtcclxuICAgICAgfVxyXG5cclxuICAgICAgJl9tZWRpdW0ge1xyXG4gICAgICAgIHdpZHRoOiA3MjBweDtcclxuICAgICAgfVxyXG5cclxuICAgICAgJl9sYXJnZSB7XHJcbiAgICAgICAgd2lkdGg6IDk2MHB4O1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAmX3J0bCB7XHJcbiAgICBib3JkZXItbGVmdDogMXB4IHNvbGlkIEBwcmltYXJ5X2JvcmRlcl9jb2xvcjtcclxuXHJcbiAgICAmLm91dGxpbmUtZHJhd2VyIHtcclxuICAgICAgJl90aW55IHtcclxuICAgICAgICAmLm91dGxpbmUtZHJhd2VyX2Nsb3NlZCB7XHJcbiAgICAgICAgICByaWdodDogLTI5MHB4O1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgJl9taW5pIHtcclxuICAgICAgICAmLm91dGxpbmUtZHJhd2VyX2Nsb3NlZCB7XHJcbiAgICAgICAgICByaWdodDogLTQ5MHB4O1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgJl9zbWFsbCB7XHJcbiAgICAgICAgJi5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xyXG4gICAgICAgICAgcmlnaHQ6IC01NTBweDtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgICZfcmVndWxhciB7XHJcbiAgICAgICAgJi5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xyXG4gICAgICAgICAgcmlnaHQ6IC02OTBweDtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgICZfbWVkaXVtIHtcclxuICAgICAgICAmLm91dGxpbmUtZHJhd2VyX2Nsb3NlZCB7XHJcbiAgICAgICAgICByaWdodDogLTczMHB4O1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgJl9sYXJnZSB7XHJcbiAgICAgICAgJi5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xyXG4gICAgICAgICAgcmlnaHQ6IC05NzBweDtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gICZfbHRyIHtcclxuICAgIGJvcmRlci1yaWdodDogMXB4IHNvbGlkIEBwcmltYXJ5X2JvcmRlcl9jb2xvcjtcclxuXHJcbiAgICAmLm91dGxpbmUtZHJhd2VyIHtcclxuICAgICAgJl90aW55IHtcclxuICAgICAgICAmLm91dGxpbmUtZHJhd2VyX2Nsb3NlZCB7XHJcbiAgICAgICAgICBsZWZ0OiAtMjkwcHg7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICAmX21pbmkge1xyXG4gICAgICAgICYub3V0bGluZS1kcmF3ZXJfY2xvc2VkIHtcclxuICAgICAgICAgIGxlZnQ6IC00OTBweDtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgICZfc21hbGwge1xyXG4gICAgICAgICYub3V0bGluZS1kcmF3ZXJfY2xvc2VkIHtcclxuICAgICAgICAgIGxlZnQ6IC01NTBweDtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgICZfcmVndWxhciB7XHJcbiAgICAgICAgJi5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xyXG4gICAgICAgICAgbGVmdDogLTY5MHB4O1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgJl9tZWRpdW0ge1xyXG4gICAgICAgICYub3V0bGluZS1kcmF3ZXJfY2xvc2VkIHtcclxuICAgICAgICAgIGxlZnQ6IC03MzBweDtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgICZfbGFyZ2Uge1xyXG4gICAgICAgICYub3V0bGluZS1kcmF3ZXJfY2xvc2VkIHtcclxuICAgICAgICAgIGxlZnQ6IC05NzBweDtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gICZfdHRiLFxyXG4gICZfYnR0IHtcclxuICAgIGxlZnQ6IDA7XHJcbiAgICB3aWR0aDogMTAwJTtcclxuXHJcbiAgICAmLm91dGxpbmUtZHJhd2VyIHtcclxuICAgICAgJl90aW55IHtcclxuICAgICAgICBoZWlnaHQ6IDI0MHB4O1xyXG4gICAgICB9XHJcblxyXG4gICAgICAmX21pbmkge1xyXG4gICAgICAgIGhlaWdodDogMzIwcHg7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgICZfc21hbGwge1xyXG4gICAgICAgIGhlaWdodDogMzYwcHg7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgICZfcmVndWxhciB7XHJcbiAgICAgICAgaGVpZ2h0OiA0MDBweDtcclxuICAgICAgfVxyXG5cclxuICAgICAgJl9tZWRpdW0ge1xyXG4gICAgICAgIGhlaWdodDogNDQwcHg7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgICZfbGFyZ2Uge1xyXG4gICAgICAgIGhlaWdodDogNDgwcHg7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gICZfdHRiIHtcclxuICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCBAcHJpbWFyeV9ib3JkZXJfY29sb3I7XHJcblxyXG4gICAgJi5vdXRsaW5lLWRyYXdlciB7XHJcbiAgICAgICZfdGlueSB7XHJcbiAgICAgICAgJi5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xyXG4gICAgICAgICAgdG9wOiAtMjUwcHg7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICAmX21pbmkge1xyXG4gICAgICAgICYub3V0bGluZS1kcmF3ZXJfY2xvc2VkIHtcclxuICAgICAgICAgIHRvcDogLTMzMHB4O1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgJl9zbWFsbCB7XHJcbiAgICAgICAgJi5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xyXG4gICAgICAgICAgdG9wOiAtMzcwcHg7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICAmX3JlZ3VsYXIge1xyXG4gICAgICAgICYub3V0bGluZS1kcmF3ZXJfY2xvc2VkIHtcclxuICAgICAgICAgIHRvcDogLTQxMHB4O1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgJl9tZWRpdW0ge1xyXG4gICAgICAgICYub3V0bGluZS1kcmF3ZXJfY2xvc2VkIHtcclxuICAgICAgICAgIHRvcDogLTQ1MHB4O1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgJl9sYXJnZSB7XHJcbiAgICAgICAgJi5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xyXG4gICAgICAgICAgdG9wOiAtNDkwcHg7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAmX2J0dCB7XHJcbiAgICB0b3A6IGluaXRpYWw7XHJcbiAgICBib3JkZXItdG9wOiAxcHggc29saWQgQHByaW1hcnlfYm9yZGVyX2NvbG9yO1xyXG5cclxuICAgICYub3V0bGluZS1kcmF3ZXIge1xyXG4gICAgICAmX3Rpbnkge1xyXG4gICAgICAgICYub3V0bGluZS1kcmF3ZXJfY2xvc2VkIHtcclxuICAgICAgICAgIGJvdHRvbTogLTI1MHB4O1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgJl9taW5pIHtcclxuICAgICAgICAmLm91dGxpbmUtZHJhd2VyX2Nsb3NlZCB7XHJcbiAgICAgICAgICBib3R0b206IC0zMzBweDtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgICZfc21hbGwge1xyXG4gICAgICAgICYub3V0bGluZS1kcmF3ZXJfY2xvc2VkIHtcclxuICAgICAgICAgIGJvdHRvbTogLTM3MHB4O1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgJl9yZWd1bGFyIHtcclxuICAgICAgICAmLm91dGxpbmUtZHJhd2VyX2Nsb3NlZCB7XHJcbiAgICAgICAgICBib3R0b206IC00MTBweDtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgICZfbWVkaXVtIHtcclxuICAgICAgICAmLm91dGxpbmUtZHJhd2VyX2Nsb3NlZCB7XHJcbiAgICAgICAgICBib3R0b206IC00NTBweDtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgICZfbGFyZ2Uge1xyXG4gICAgICAgICYub3V0bGluZS1kcmF3ZXJfY2xvc2VkIHtcclxuICAgICAgICAgIGJvdHRvbTogLTQ5MHB4O1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgJl9vcGVuZWQge1xyXG4gICAgdmlzaWJpbGl0eTogdmlzaWJsZTtcclxuICAgIHotaW5kZXg6IHZhcigtLW91dGxpbmUtekluZGV4KTtcclxuXHJcbiAgICAmLm91dGxpbmUtZHJhd2VyIHtcclxuICAgICAgcG9zaXRpb246IGZpeGVkO1xyXG5cclxuICAgICAgJl9ydGwge1xyXG4gICAgICAgIHJpZ2h0OiAwO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAmX2x0ciB7XHJcbiAgICAgICAgbGVmdDogMDtcclxuICAgICAgfVxyXG5cclxuICAgICAgJl90dGIge1xyXG4gICAgICAgIHRvcDogMDtcclxuICAgICAgfVxyXG5cclxuICAgICAgJl9idHQge1xyXG4gICAgICAgIGJvdHRvbTogMDtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgJl9vZmZzZXQge1xyXG4gICAgJi5vdXRsaW5lLWRyYXdlciB7XHJcbiAgICAgICZfcnRsLFxyXG4gICAgICAmX2x0ciB7XHJcbiAgICAgICAgaGVpZ2h0OiBjYWxjKDEwMCUgLSA0ZW0pO1xyXG4gICAgICAgIHRvcDogNTAlO1xyXG4gICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtNTAlKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgJl90dGIsXHJcbiAgICAgICZfYnR0IHtcclxuICAgICAgICB3aWR0aDogY2FsYygxMDAlIC0gNGVtKTtcclxuICAgICAgICBsZWZ0OiA1MCU7XHJcbiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC01MCUpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAmX29wZW5lZCB7XHJcbiAgICAgICAgJi5vdXRsaW5lLWRyYXdlciB7XHJcbiAgICAgICAgICAmX3J0bCB7XHJcbiAgICAgICAgICAgIHJpZ2h0OiAyZW07XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgJl9sdHIge1xyXG4gICAgICAgICAgICBsZWZ0OiAyZW07XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgJl90dGIge1xyXG4gICAgICAgICAgICB0b3A6IDJlbTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAmX2J0dCB7XHJcbiAgICAgICAgICAgIGJvdHRvbTogMmVtO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgJl9hdXRvIHtcclxuICAgICYub3V0bGluZS1kcmF3ZXIge1xyXG4gICAgICAmX3J0bCxcclxuICAgICAgJl9sdHIge1xyXG4gICAgICAgIGhlaWdodDogYXV0bztcclxuICAgICAgICBtYXgtaGVpZ2h0OiBjYWxjKDEwMCUgLSA0ZW0pO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAmX2Z1bGwge1xyXG4gICAgcGFkZGluZzogMDtcclxuICB9XHJcbn1cclxuIiwiLyoqXHJcbiAqIHNoYWRvdy5sZXNzIC0g6Zi05b2x5qC35byP6K6+572uIG1peGlueCDlh73mlbBcclxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxyXG4gKiBDcmVhdGVkIEJ5OiBZYW9oYWl4aWFvXHJcbiAqIFVwZGF0ZTogMjAyMi4zLjIwXHJcbiAqL1xyXG5AaW1wb3J0ICcuL2NvbG9ycyc7XHJcblxyXG4vKiA9PT09PT0g6Zi05b2x5qC35byP6K6+572u5Ye95pWwID09PT09PSAqL1xyXG4uc2hhZG93KEBvZmZzZXQ6IDAgMCA2cHggMXB4LCBAY29sb3I6IEBwcmltYXJ5X2JvcmRlcl9jb2xvcikge1xyXG4gIGJveC1zaGFkb3c6IEBvZmZzZXQgQGNvbG9yO1xyXG59XHJcblxyXG4uc2hhZG93X3JlZ3VsYXIoQGNvbG9yOiBAcHJpbWFyeV9ib3JkZXJfY29sb3IpIHtcclxuICAuc2hhZG93KDAgMCA2cHggMXB4LCBAY29sb3IpO1xyXG59XHJcblxyXG4uc2hhZG93X2xhcmdlKEBjb2xvcjogQHByaW1hcnlfYm9yZGVyX2NvbG9yKSB7XHJcbiAgLnNoYWRvdygwIDAgMTJweCAxcHgsIEBjb2xvcik7XHJcbn1cclxuXHJcbi5zaGFkb3dfbGlnaHRfcmVndWxhcigpIHtcclxuICAuc2hhZG93X3JlZ3VsYXIoKTtcclxufVxyXG5cclxuLnNoYWRvd19saWdodF9sYXJnZSgpIHtcclxuICAuc2hhZG93X2xhcmdlKCk7XHJcbn1cclxuXHJcbi5zaGFkb3dfZGFya19yZWd1bGFyKCkge1xyXG4gIC5zaGFkb3dfcmVndWxhcihAc2Vjb25kYXJ5X2JvcmRlcl9jb2xvcik7XHJcbn1cclxuXHJcbi5zaGFkb3dfZGFya19sYXJnZSgpIHtcclxuICAuc2hhZG93X2xhcmdlKEBzZWNvbmRhcnlfYm9yZGVyX2NvbG9yKTtcclxufVxyXG4iLCJAaW1wb3J0ICcuL3ZhcmlhYmxlcyc7XHJcbkBpbXBvcnQgJy4vY29sb3JzJztcclxuQGltcG9ydCAnLi9lbGxpcHNpcyc7XHJcblxyXG4ub3V0bGluZS1uYXZpZ2F0b3Ige1xyXG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcclxuICB6LWluZGV4OiAxO1xyXG4gIG1hcmdpbjogMDtcclxuICB3aWR0aDogdmFyKC0tb3V0bGluZS1uYXZpZ2F0b3Itd2lkdGgpO1xyXG4gIG92ZXJmbG93OiBhdXRvO1xyXG5cclxuICAmLXBhcmVudCB7XHJcbiAgICB0cmFuc2l0aW9uOiAwLjNzIGVhc2UtaW4tb3V0O1xyXG4gIH1cclxuXHJcbiAgJl9fdGl0bGUge1xyXG4gICAgbWFyZ2luOiAwIDE2cHg7XHJcbiAgICBoZWlnaHQ6IDQwcHg7XHJcbiAgICBsaW5lLWhlaWdodDogNDBweDtcclxuICAgIHBhZGRpbmc6IDAgMTZweDtcclxuICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCBAcHJpbWFyeV9ib3JkZXJfY29sb3I7XHJcbiAgICBmb250LXNpemU6IDE2cHg7XHJcbiAgICBmb250LXdlaWdodDogNDAwO1xyXG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcclxuICB9XHJcblxyXG4gICZfX21haW4ge1xyXG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xyXG4gICAgei1pbmRleDogMTtcclxuICAgIG1hcmdpbjogMDtcclxuICAgIG92ZXJmbG93OiBoaWRkZW47XHJcbiAgfVxyXG5cclxuICAmX19saXN0LFxyXG4gICZfX3N1YmplY3QsXHJcbiAgJl9faXRlbSB7XHJcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XHJcbiAgICB6LWluZGV4OiAyO1xyXG4gICAgbWFyZ2luOiAwO1xyXG4gICAgcGFkZGluZzogMDtcclxuICAgIGxpc3Qtc3R5bGUtdHlwZTogbm9uZTtcclxuICAgIG92ZXJmbG93OiBoaWRkZW47XHJcbiAgfVxyXG5cclxuICAmX19saXN0IHtcclxuICAgIHBhZGRpbmc6IDAuNWVtIDA7XHJcbiAgfVxyXG5cclxuICAmX19zdWJqZWN0IHtcclxuICAgIHBhZGRpbmctbGVmdDogMWVtO1xyXG4gIH1cclxuXHJcbiAgJl9faXRlbSB7XHJcbiAgICBtYXJnaW46IDA7XHJcbiAgICBsaW5lLWhlaWdodDogMzBweDtcclxuICAgIGZvbnQtc2l6ZTogMTNweDtcclxuICAgIG92ZXJmbG93OiBoaWRkZW47XHJcbiAgfVxyXG5cclxuICAmX19wbGFjZWhvbGRlciB7XHJcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XHJcbiAgICB6LWluZGV4OiAxO1xyXG4gICAgdG9wOiAwO1xyXG4gICAgbGVmdDogMDtcclxuICAgIHdpZHRoOiAxMDAlO1xyXG4gICAgaGVpZ2h0OiAzMHB4O1xyXG4gICAgYmFja2dyb3VuZC1jb2xvcjogQGhvdmVyX2JnX2NvbG9yO1xyXG4gICAgYm9yZGVyLWxlZnQ6IDJweCBzb2xpZCBAc3VjY2Vzc19jb2xvcjtcclxuICAgIHRyYW5zaXRpb24tZHVyYXRpb246IDAuMnM7XHJcbiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xyXG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcclxuICB9XHJcblxyXG4gICZfX2FuY2hvciB7XHJcbiAgICAuZWxsaXBzaXMoMSk7XHJcbiAgICBkaXNwbGF5OiBibG9jaztcclxuICAgIHBhZGRpbmc6IDAgMS41ZW07XHJcblxyXG4gICAgJjpsaW5rLFxyXG4gICAgJjp2aXNpdGVkLFxyXG4gICAgJjpob3ZlciB7XHJcbiAgICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTtcclxuICAgICAgY29sb3I6IEBzZWNvbmRhcnlfdGV4dF9jb2xvcjtcclxuICAgIH1cclxuXHJcbiAgICAmOmhvdmVyIHtcclxuICAgICAgY29sb3I6IEBzdWNjZXNzX2NvbG9yO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgJl9fY29kZSB7XHJcbiAgICBwYWRkaW5nLXJpZ2h0OiAwLjVlbTtcclxuICB9XHJcblxyXG4gICZfaGlnaGxpZ2h0IHtcclxuICAgICYub3V0bGluZS1uYXZpZ2F0b3JfX2FuY2hvciB7XHJcbiAgICAgICY6bGluayxcclxuICAgICAgJjp2aXNpdGVkLFxyXG4gICAgICAmOmhvdmVyIHtcclxuICAgICAgICBjb2xvcjogQHN1Y2Nlc3NfY29sb3I7XHJcbiAgICAgICAgZm9udC13ZWlnaHQ6IGJvbGQ7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gICZfc3RpY2t5LFxyXG4gICZfZml4ZWQge1xyXG4gICAgZGlzcGxheTogZmxleDtcclxuICAgIGZsZXgtd3JhcDogbm93cmFwO1xyXG4gICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcclxuICAgIHotaW5kZXg6IHZhcigtLW91dGxpbmUtekluZGV4KTtcclxuICAgIHRvcDogMDtcclxuICAgIG92ZXJmbG93OiBoaWRkZW47XHJcblxyXG4gICAgLm91dGxpbmUtbmF2aWdhdG9yIHtcclxuICAgICAgJl9fdGl0bGUsXHJcbiAgICAgICZfX21haW4ge1xyXG4gICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgICZfX3RpdGxlIHtcclxuICAgICAgICBmbGV4LXNocmluazogMDtcclxuICAgICAgfVxyXG5cclxuICAgICAgJl9fbWFpbiB7XHJcbiAgICAgICAgZmxleDogMTtcclxuICAgICAgICBvdmVyZmxvdzogYXV0bztcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgJl9zdGlja3kge1xyXG4gICAgcG9zaXRpb246IHN0aWNreTtcclxuICAgIG1heC1oZWlnaHQ6IHZhcigtLW91dGxpbmUtc3RpY2t5LWhlaWdodCk7XHJcbiAgfVxyXG5cclxuICAmX2ZpeGVkIHtcclxuICAgIHBvc2l0aW9uOiBmaXhlZDtcclxuICAgIG1heC1oZWlnaHQ6IDEwMCU7XHJcbiAgfVxyXG5cclxuICAmX2hpZGRlbiB7XHJcbiAgICBkaXNwbGF5OiBub25lO1xyXG4gIH1cclxuXHJcbiAgJl9mb2xkZWQge1xyXG4gICAgd2lkdGg6IDA7XHJcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xyXG4gIH1cclxufVxyXG4iLCIvKipcclxuICogZWxsaXBzaXMubGVzcyAtIOaWh+acrOecgeeVpSBtaXhpbngg5Ye95pWwXHJcbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cclxuICogQ3JlYXRlZCBCeTogWWFvaGFpeGlhb1xyXG4gKiBVcGRhdGU6IDIwMjIuMy4xMVxyXG4gKi9cclxuXHJcbi8qID09PT09PSDmlofmnKznnIHnlaXlh73mlbAgPT09PT09ICovXHJcbi5lbGxpcHNpcyAoQGxpbmVzKSB3aGVuIChAbGluZXM9MSkge1xyXG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7XHJcbiAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7XHJcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcclxufVxyXG5cclxuLmVsbGlwc2lzIChAbGluZXMpIHdoZW4gKEBsaW5lcz49Mikge1xyXG4gIC13ZWJraXQtbGluZS1jbGFtcDogQGxpbmVzO1xyXG4gIGRpc3BsYXk6IGJveDtcclxuICAtd2Via2l0LWJveC1vcmllbnQ6IHZlcnRpY2FsO1xyXG4gIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzO1xyXG4gIG92ZXJmbG93OiBoaWRkZW47XHJcbn1cclxuIiwiQGltcG9ydCAnLi9jb2xvcnMnO1xyXG5AaW1wb3J0ICcuL2ZvbnQnO1xyXG5AaW1wb3J0ICcuL21peGlucyc7XHJcblxyXG4ub3V0bGluZS1yZWFkZXIge1xyXG4gICZfX3Byb2dyZXNzIHtcclxuICAgIHBvc2l0aW9uOiBmaXhlZDtcclxuICAgIHRvcDogMDtcclxuICAgIGxlZnQ6IDA7XHJcbiAgICB6LWluZGV4OiAzO1xyXG4gICAgaGVpZ2h0OiA0cHg7XHJcbiAgICB3aWR0aDogMTAwJTtcclxuICAgIGJhY2tncm91bmQtY29sb3I6IEBwcmltYXJ5X2NvbG9yO1xyXG4gICAgc2NhbGU6IDAgMTtcclxuICAgIHRyYW5zZm9ybS1vcmlnaW46IGxlZnQ7XHJcbiAgICBhbmltYXRpb246IG91dGxpbmUtcmVhZGVyLXByb2dyZXNzIGxpbmVhcjtcclxuICAgIGFuaW1hdGlvbi10aW1lbGluZTogLS1Qcm9ncmVzc1RpbWVsaW5lO1xyXG4gIH1cclxuXHJcbiAgJl9fcGFwZXIge1xyXG4gICAgLnNoYWRvd19kYXJrX3JlZ3VsYXIoKTtcclxuICAgIG1hcmdpbjogMmVtIGF1dG87XHJcbiAgICBtYXgtd2lkdGg6IDEyMDBweDtcclxuICAgIHBhZGRpbmc6IDMuMmVtO1xyXG4gICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcclxuICAgIGJhY2tncm91bmQtY29sb3I6IEB3aGl0ZTtcclxuICAgIG92ZXJmbG93OiBoaWRkZW47XHJcbiAgfVxyXG5cclxuICAmX190aXRsZSB7XHJcbiAgICBtYXJnaW46IDAuNjdlbSAwO1xyXG4gICAgdGV4dC1hbGlnbjogY2VudGVyO1xyXG4gICAgZm9udC1mYW1pbHk6IEBmb250X3RleHRfZmFtaWx5O1xyXG4gICAgZm9udC13ZWlnaHQ6IG5vcm1hbDtcclxuICAgIGxpbmUtaGVpZ2h0OiAxLjNlbTtcclxuICAgIGZvbnQtc2l6ZTogNC4yZW07XHJcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xyXG4gIH1cclxuXHJcbiAgJl9fYXJ0aWNsZSB7XHJcbiAgICAub3V0bGluZS1yZWFkZXJfX3Byb2dyZXNzIHtcclxuICAgICAgZGlzcGxheTogbm9uZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gICZfaGlkZGVuIHtcclxuICAgIGRpc3BsYXk6IG5vbmU7XHJcblxyXG4gICAgJi5vdXRsaW5lLXJlYWRlcl9zaWJsaW5nIHtcclxuICAgICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50O1xyXG5cclxuICAgICAgJi53cmFwcGVyIHtcclxuICAgICAgICAmLnBvc3Qge1xyXG4gICAgICAgICAgZGlzcGxheTogbm9uZTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gICYtLXJlYWRpbmcge1xyXG4gICAgZGlzcGxheTogYmxvY2s7XHJcbiAgICBwb3NpdGlvbjogZml4ZWQ7XHJcbiAgICB6LWluZGV4OiAyO1xyXG4gICAgdG9wOiAwO1xyXG4gICAgbGVmdDogMDtcclxuICAgIHdpZHRoOiAxMDAlO1xyXG4gICAgaGVpZ2h0OiAxMDAlO1xyXG4gICAgbWFyZ2luOiAwO1xyXG4gICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcclxuICAgIHBhZGRpbmc6IDNlbSA0ZW07XHJcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAYmdfY29sb3I7XHJcbiAgICBzY3JvbGwtdGltZWxpbmUtbmFtZTogLS1Qcm9ncmVzc1RpbWVsaW5lO1xyXG4gICAgb3ZlcmZsb3c6IHNjcm9sbDtcclxuICB9XHJcbn1cclxuXHJcbkBrZXlmcmFtZXMgb3V0bGluZS1yZWFkZXItcHJvZ3Jlc3Mge1xyXG4gIHRvIHtcclxuICAgIHNjYWxlOiAxIDE7XHJcbiAgfVxyXG59XHJcblxyXG5AbWVkaWEgKG1heC13aWR0aDogNTAwcHgpIHtcclxuICAub3V0bGluZSB7XHJcbiAgICAmLXJlYWRlciB7XHJcbiAgICAgIG92ZXJmbG93OiBoaWRkZW47XHJcblxyXG4gICAgICAub3V0bGluZS10b29sYmFyIHtcclxuICAgICAgICBkaXNwbGF5OiBmbGV4O1xyXG4gICAgICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7XHJcbiAgICAgICAgZmxleC13cmFwOiBub3dyYXA7XHJcbiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcclxuICAgICAgICBhbGlnbi1zZWxmOiBhdXRvO1xyXG4gICAgICAgIHRvcDogMTAwJTtcclxuICAgICAgICByaWdodDogMDtcclxuICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTQ4cHgpO1xyXG4gICAgICAgIHdpZHRoOiAxMDAlO1xyXG4gICAgICAgIGhlaWdodDogNDhweDtcclxuICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xyXG4gICAgICAgIGJvcmRlci10b3A6IDFweCBzb2xpZCBAYm9yZGVyX2NvbG9yO1xyXG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6IEB3aGl0ZTtcclxuICAgICAgICBwYWRkaW5nOiAwIDE2cHg7XHJcblxyXG4gICAgICAgICZfX2J1dHRvbiB7XHJcbiAgICAgICAgICAucmFkaXVzX25vbmUoKTtcclxuICAgICAgICAgIGZsZXg6IDE7XHJcbiAgICAgICAgICBib3JkZXI6IG5vbmU7XHJcbiAgICAgICAgICBib3gtc2hhZG93OiBub25lO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgJi0tcmVhZGluZyB7XHJcbiAgICAgICAgcGFkZGluZzogMDtcclxuICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAd2hpdGU7XHJcbiAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcclxuICAgICAgfVxyXG5cclxuICAgICAgJl9fcGFwZXIge1xyXG4gICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcclxuICAgICAgICB6LWluZGV4OiAxO1xyXG4gICAgICAgIG1hcmdpbjogMDtcclxuICAgICAgICBwYWRkaW5nOiAwO1xyXG4gICAgICAgIGhlaWdodDogMTAwJTtcclxuICAgICAgICBib3gtc2hhZG93OiBub25lO1xyXG4gICAgICAgIG92ZXJmbG93OiBoaWRkZW47XHJcbiAgICAgIH1cclxuXHJcbiAgICAgICZfX3RpdGxlIHtcclxuICAgICAgICAuZWxsaXBzaXMoMSk7XHJcbiAgICAgICAgcG9zaXRpb246IGFic29sdXRlO1xyXG4gICAgICAgIHotaW5kZXg6IDM7XHJcbiAgICAgICAgdG9wOiAwO1xyXG4gICAgICAgIGxlZnQ6IDA7XHJcbiAgICAgICAgbWFyZ2luOiAwO1xyXG4gICAgICAgIHdpZHRoOiAxMDAlO1xyXG4gICAgICAgIGhlaWdodDogNDhweDtcclxuICAgICAgICBsaW5lLWhlaWdodDogNDhweDtcclxuICAgICAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgQGJvcmRlcl9jb2xvcjtcclxuICAgICAgICBmb250LXNpemU6IDEuOGVtO1xyXG4gICAgICAgIGZvbnQtd2VpZ2h0OiA0MDA7XHJcbiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogQHdoaXRlO1xyXG4gICAgICAgIG92ZXJmbG93OiBoaWRkZW47XHJcbiAgICAgIH1cclxuXHJcbiAgICAgICZfX2FydGljbGUge1xyXG4gICAgICAgIG1hcmdpbjogNDhweCAwO1xyXG4gICAgICAgIGhlaWdodDogY2FsYygxMDAlIC0gOTZweCk7XHJcbiAgICAgICAgcGFkZGluZzogMCAxLjI1ZW07XHJcbiAgICAgICAgc2Nyb2xsLXRpbWVsaW5lLW5hbWU6IC0tTW9iaWxlUHJvZ3Jlc3NUaW1lbGluZTtcclxuICAgICAgICBvdmVyZmxvdy14OiBoaWRkZW47XHJcbiAgICAgICAgb3ZlcmZsb3cteTogc2Nyb2xsO1xyXG5cclxuICAgICAgICAub3V0bGluZS1yZWFkZXJfX3Byb2dyZXNzIHtcclxuICAgICAgICAgIHotaW5kZXg6IDQ7XHJcbiAgICAgICAgICBhbmltYXRpb246IG91dGxpbmUtcmVhZGVyLXByb2dyZXNzIGxpbmVhcjtcclxuICAgICAgICAgIGFuaW1hdGlvbi10aW1lbGluZTogLS1Nb2JpbGVQcm9ncmVzc1RpbWVsaW5lO1xyXG4gICAgICAgICAgZGlzcGxheTogYmxvY2s7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcblxyXG5AbWVkaWEgcHJpbnQge1xyXG4gIGh0bWwsXHJcbiAgYm9keSB7XHJcbiAgICAvKiDmiZPljbDnmoTln7rnoYDlrZfkvZPlpKflsI8gKi9cclxuICAgIGZvbnQtc2l6ZTogMTJwdDtcclxuICAgIC8qIOaYvuekuuiuvue9ruaWh+Wtl+minOiJsuWSjOiDjOaZr+minOiJsiAqL1xyXG4gICAgYmFja2dyb3VuZC1jb2xvcjogQHdoaXRlO1xyXG4gICAgY29sb3I6IEBwcmltYXJ5X3RleHRfY29sb3I7XHJcbiAgICBoZWlnaHQ6IGluaXRpYWwgIWltcG9ydGFudDtcclxuICB9XHJcblxyXG4gIC8qIOiuvue9rumTvuaOpeagt+W8jyAqL1xyXG4gIGE6bGluayxcclxuICBhOnZpc2l0ZWQsXHJcbiAgYTpob3ZlciB7XHJcbiAgICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZSAhaW1wb3J0YW50O1xyXG4gICAgY29sb3I6IEBwcmltYXJ5X2NvbG9yO1xyXG4gIH1cclxuXHJcbiAgLyog6ZqQ6JeP5aqS5L2T5qCH562+ICovXHJcbiAgdmlkZW8sXHJcbiAgYXVkaW8ge1xyXG4gICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50O1xyXG4gIH1cclxuXHJcbiAgLyog56Gu5L+d6KGo5qC85Zyo5omT5Y2w5pe255qE6L655qGG5ZKM5a+56b2Q5pa55byP5riF5pmwICovXHJcbiAgdGFibGUge1xyXG4gICAgd2lkdGg6IDEwMCU7XHJcbiAgICBib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlO1xyXG4gIH1cclxuICB0aCxcclxuICB0ZCB7XHJcbiAgICBib3JkZXI6IDFweCBzb2xpZCBAcHJpbWFyeV9ib3JkZXJfY29sb3I7XHJcbiAgICBwYWRkaW5nOiA4cHggMjBweDtcclxuICB9XHJcblxyXG4gIC5vdXRsaW5lIHtcclxuICAgICYtbWVzc2FnZSxcclxuICAgICYtdG9vbGJhciB7XHJcbiAgICAgIC8qIOmakOiXj+S6huW3peWFt+agj+WSjOS/oeaBr+aPkOekuuahhiAqL1xyXG4gICAgICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7XHJcbiAgICB9XHJcblxyXG4gICAgJi1yZWFkZXIge1xyXG4gICAgICBkaXNwbGF5OiBibG9jayAhaW1wb3J0YW50O1xyXG4gICAgICBvdmVyZmxvdzogaGlkZGVuO1xyXG5cclxuICAgICAgJl9fdGl0bGUge1xyXG4gICAgICAgIG1hcmdpbjogMTMuNHB0IDAgMjhwdCAhaW1wb3J0YW50O1xyXG4gICAgICAgIHRleHQtYWxpZ246IGNlbnRlciAhaW1wb3J0YW50O1xyXG4gICAgICAgIGZvbnQtc2l6ZTogMzJwdCAhaW1wb3J0YW50O1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvKiDlj5bmtojkuobnu53lr7nlrprkvY0gKi9cclxuICAgICAgJi0tcmVhZGluZyB7XHJcbiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlICFpbXBvcnRhbnQ7XHJcbiAgICAgICAgaGVpZ2h0OiBhdXRvICFpbXBvcnRhbnQ7XHJcbiAgICAgICAgcGFkZGluZzogMCAhaW1wb3J0YW50O1xyXG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6IEB3aGl0ZTtcclxuICAgICAgICBvdmVyZmxvdzogaGlkZGVuICFpbXBvcnRhbnQ7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8qIOmakOiXj+mYheivu+i/m+W6puadoSAqL1xyXG4gICAgICAmX19wcm9ncmVzcyB7XHJcbiAgICAgICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50O1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvKiDmiZPljbDml7bkuI3mmL7npLrmraPmlocgRE9NIOeahOmYtOW9seaViOaenCAqL1xyXG4gICAgICAmX19wYXBlciB7XHJcbiAgICAgICAgYm94LXNoYWRvdzogbm9uZTtcclxuICAgICAgfVxyXG5cclxuICAgICAgcHJlIHtcclxuICAgICAgICBwYWRkaW5nOiAxZW0gIWltcG9ydGFudDtcclxuICAgICAgICBib3JkZXI6IDFweCBzb2xpZCBAYm9yZGVyX2NvbG9yICFpbXBvcnRhbnQ7XHJcbiAgICAgICAgYm9yZGVyLXJhZGl1czogNHB4ICFpbXBvcnRhbnQ7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHByZSxcclxuICAgICAgY29kZSB7XHJcbiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogQHdoaXRlICFpbXBvcnRhbnQ7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRhYmxlLFxyXG4gICAgICBpbWcsXHJcbiAgICAgIHN2ZyB7XHJcbiAgICAgICAgYnJlYWstaW5zaWRlOiBhdm9pZDtcclxuICAgICAgfVxyXG5cclxuICAgICAgLyog5omA5pyJ5paH56ug5YaF5a65IERPTSDnm7jlhbPnmoTpgrvlsYXoioLngrnpg73pmpDol4/kuoYgKi9cclxuICAgICAgJl9zaWJsaW5nIHtcclxuICAgICAgICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcbn1cclxuIiwiLyoqXHJcbiAqIHJhZGl1cy5sZXNzIC0g5ZyG6KeS6K6+572uIG1peGlueCDlh73mlbBcclxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxyXG4gKiBDcmVhdGVkIEJ5OiBZYW9oYWl4aWFvXHJcbiAqIFVwZGF0ZTogMjAyNC40LjE2XHJcbiAqL1xyXG5cclxuLyogPT09PT09IOWchuinkuagt+W8j+iuvue9ruWHveaVsCA9PT09PT0gKi9cclxuLnJhZGl1cyhAbnVtOiAycHgpIHtcclxuICBib3JkZXItcmFkaXVzOiBAbnVtO1xyXG59XHJcblxyXG4ucmFkaXVzX25vbmUoKSB7XHJcbiAgLnJhZGl1cygwKTtcclxufVxyXG5cclxuLnJhZGl1c19taW5pKCkge1xyXG4gIC5yYWRpdXMoMnB4KTtcclxufVxyXG5cclxuLnJhZGl1c19zbWFsbCgpIHtcclxuICAucmFkaXVzKDNweCk7XHJcbn1cclxuXHJcbi5yYWRpdXNfcmVndWxhcigpIHtcclxuICAucmFkaXVzKDRweCk7XHJcbn1cclxuXHJcbi5yYWRpdXNfbWVkaXVtKCkge1xyXG4gIC5yYWRpdXMoNXB4KTtcclxufVxyXG5cclxuLnJhZGl1c19sYXJnZSgpIHtcclxuICAucmFkaXVzKDEwcHgpO1xyXG59XHJcblxyXG4ucmFkaXVzX2h1Z2UoKSB7XHJcbiAgLnJhZGl1cygxNnB4KTtcclxufVxyXG5cclxuLnJhZGl1c19yb3VuZCgpIHtcclxuICAucmFkaXVzKDMwcHgpO1xyXG59XHJcbiIsIi8qID09PT09PT09PT0gYnV0dG9ucy50aGVtZSAtIOaMiemSruWvvOiIquagt+W8jyA9PT09PT09PT09ICovXHJcbkBpbXBvcnQgJy4vY29sb3JzJztcclxuQGltcG9ydCAnLi9zaGFkb3cnO1xyXG5cclxuLm91dGxpbmUtdG9vbGJhciB7XHJcbiAgcG9zaXRpb246IGZpeGVkO1xyXG4gIHotaW5kZXg6IDk5OTk5O1xyXG4gIG1hcmdpbjogMDtcclxuICB0cmFuc2l0aW9uLWR1cmF0aW9uOiAwLjNzO1xyXG4gIG92ZXJmbG93OiBoaWRkZW47XHJcblxyXG4gICZfX2J1dHRvbiB7XHJcbiAgICAuc2hhZG93X2xpZ2h0X3JlZ3VsYXIoKTtcclxuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcclxuICAgIHotaW5kZXg6IDE7XHJcbiAgICBtYXJnaW46IDEwcHg7XHJcbiAgICB3aWR0aDogMzZweDtcclxuICAgIGhlaWdodDogMzZweDtcclxuICAgIGJvcmRlcjogMXB4IHNvbGlkIEBwcmltYXJ5X2JvcmRlcl9jb2xvcjtcclxuICAgIGJvcmRlci1yYWRpdXM6IDNweDtcclxuICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XHJcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAd2hpdGU7XHJcbiAgICBjdXJzb3I6IHBvaW50ZXI7XHJcbiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XHJcbiAgICBjb2xvcjogQGZvdXJ0aF90ZXh0X2NvbG9yO1xyXG4gICAgdHJhbnNpdGlvbjogYWxsIDAuM3MgMC4xcyBlYXNlLWluLW91dDtcclxuICAgIG92ZXJmbG93OiBoaWRkZW47XHJcblxyXG4gICAgJjpob3ZlciB7XHJcbiAgICAgIGNvbG9yOiBAc3VjY2Vzc19jb2xvcjtcclxuICAgICAgYm9yZGVyLWNvbG9yOiBAc3VjY2Vzc19jb2xvcjtcclxuICAgICAgdHJhbnNmb3JtOiBzY2FsZSgxLjM1KTtcclxuICAgIH1cclxuXHJcbiAgICAmLmhpZGUge1xyXG4gICAgICBkaXNwbGF5OiBub25lO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgJl9fYW5jaG9yIHtcclxuICAgICY6bGluayxcclxuICAgICY6dmlzaXRlZCxcclxuICAgICY6aG92ZXIge1xyXG4gICAgICBjb2xvcjogQGZvdXJ0aF90ZXh0X2NvbG9yO1xyXG4gICAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7XHJcbiAgICB9XHJcblxyXG4gICAgJjpob3ZlciB7XHJcbiAgICAgIGNvbG9yOiBAc3VjY2Vzc19jb2xvcjtcclxuICAgIH1cclxuICB9XHJcblxyXG4gICZfX2ljb24ge1xyXG4gICAgcG9zaXRpb246IGFic29sdXRlO1xyXG4gICAgei1pbmRleDogMjtcclxuICAgIHRvcDogNTAlO1xyXG4gICAgbGVmdDogNTAlO1xyXG4gICAgd2lkdGg6IDIwcHg7XHJcbiAgICBoZWlnaHQ6IDIwcHg7XHJcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCAtNTAlKTtcclxuICAgIGZpbGw6IGN1cnJlbnRjb2xvcjtcclxuICAgIG92ZXJmbG93OiBoaWRkZW47XHJcbiAgfVxyXG5cclxuICAmX2FjdGl2ZSB7XHJcbiAgICAmLm91dGxpbmUtdG9vbGJhciB7XHJcbiAgICAgICZfX2J1dHRvbiB7XHJcbiAgICAgICAgY29sb3I6IEB3aGl0ZTtcclxuICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAc3VjY2Vzc19jb2xvcjtcclxuICAgICAgICBib3JkZXItY29sb3I6IEBzdWNjZXNzX2NvbG9yO1xyXG5cclxuICAgICAgICAmOmhvdmVyIHtcclxuICAgICAgICAgIGNvbG9yOiBAd2hpdGU7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLm91dGxpbmUtdG9vbGJhcl9fYW5jaG9yIHtcclxuICAgICAgJjpsaW5rLFxyXG4gICAgICAmOnZpc2l0ZWQsXHJcbiAgICAgICY6aG92ZXIge1xyXG4gICAgICAgIGNvbG9yOiBAd2hpdGU7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gICZfcm91bmRlZCB7XHJcbiAgICAmLm91dGxpbmUtdG9vbGJhcl9fYnV0dG9uIHtcclxuICAgICAgYm9yZGVyLXJhZGl1czogMThweDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gICZfZGlzYWJsZWQge1xyXG4gICAgJi5vdXRsaW5lLXRvb2xiYXIsXHJcbiAgICAub3V0bGluZS10b29sYmFyIHtcclxuICAgICAgJl9fYW5jaG9yOmxpbmssXHJcbiAgICAgICZfX2FuY2hvcjp2aXNpdGVkLFxyXG4gICAgICAmX19hbmNob3I6aG92ZXIsXHJcbiAgICAgICZfX2J1dHRvbiB7XHJcbiAgICAgICAgY3Vyc29yOiBub3QtYWxsb3dlZDtcclxuICAgICAgICBjb2xvcjogQGZvdXJ0aF90ZXh0X2NvbG9yO1xyXG4gICAgICAgIGJvcmRlci1jb2xvcjogQGZvdXJ0aF90ZXh0X2NvbG9yO1xyXG5cclxuICAgICAgICAmOmhvdmVyIHtcclxuICAgICAgICAgIGNvbG9yOiBAZm91cnRoX3RleHRfY29sb3I7XHJcbiAgICAgICAgICBib3JkZXItY29sb3I6IEBmb3VydGhfdGV4dF9jb2xvcjtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgICZfX2J1dHRvbiB7XHJcbiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogQGRpc2FibGVkX2JnX2NvbG9yO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAmX3R0YixcclxuICAmX2J0dCB7XHJcbiAgICBsZWZ0OiA1MCU7XHJcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTUwJSk7XHJcblxyXG4gICAgLm91dGxpbmUtdG9vbGJhcl9fYnV0dG9uIHtcclxuICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgJl90dGIge1xyXG4gICAgdG9wOiAxMnB4O1xyXG5cclxuICAgICYub3V0bGluZS10b29sYmFyX2hpZGRlbiB7XHJcbiAgICAgIHRvcDogLTU2cHg7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAmX2J0dCB7XHJcbiAgICBib3R0b206IDEycHg7XHJcblxyXG4gICAgJi5vdXRsaW5lLXRvb2xiYXJfaGlkZGVuIHtcclxuICAgICAgYm90dG9tOiAtNTZweDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gICZfcnRsLFxyXG4gICZfbHRyIHtcclxuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtNTAlKTtcclxuICAgIHdpZHRoOiA1NnB4O1xyXG4gIH1cclxuXHJcbiAgJl9ydGwge1xyXG4gICAgdG9wOiA1MCU7XHJcbiAgICByaWdodDogMTJweDtcclxuXHJcbiAgICAmLm91dGxpbmUtdG9vbGJhcl9oaWRkZW4ge1xyXG4gICAgICByaWdodDogLTg2cHg7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAmX2x0ciB7XHJcbiAgICB0b3A6IDUwJTtcclxuICAgIGxlZnQ6IDEycHg7XHJcblxyXG4gICAgJi5vdXRsaW5lLXRvb2xiYXJfaGlkZGVuIHtcclxuICAgICAgbGVmdDogLTg2cHg7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAmX3R0YixcclxuICAmX3J0bCxcclxuICAmX2J0dCxcclxuICAmX2x0ciB7XHJcbiAgICAub3V0bGluZS10b29sYmFyX19idXR0b24ge1xyXG4gICAgICAmLm91dGxpbmUtdG9vbGJhcl9oaWRkZW4ge1xyXG4gICAgICAgIGRpc3BsYXk6IG5vbmU7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcbn1cclxuIiwiQGltcG9ydCAnLi9jb2xvcnMnO1xyXG5AaW1wb3J0ICcuL2ZvbnQnO1xyXG5AaW1wb3J0ICcuL2ljb25zJztcclxuQGltcG9ydCAnLi9taXhpbnMnO1xyXG5cclxuLm91dGxpbmUtbWVzc2FnZSB7XHJcbiAgLnJhZGl1c19zbWFsbCgpO1xyXG4gIC5zaGFkb3dfbGlnaHRfcmVndWxhcigpO1xyXG4gIHBvc2l0aW9uOiBmaXhlZDtcclxuICB6LWluZGV4OiA5OTk5O1xyXG4gIG9wYWNpdHk6IDAuMTtcclxuICB0b3A6IC01MHB4O1xyXG4gIGxlZnQ6IDUwJTtcclxuICBoZWlnaHQ6IDQwcHg7XHJcbiAgbWFyZ2luOiAwO1xyXG4gIHBhZGRpbmc6IDAgNTBweDtcclxuICBsaW5lLWhlaWdodDogNDBweDtcclxuICBmb250LXNpemU6IEBmb250X3NpemVfc21hbGw7XHJcbiAgYmFja2dyb3VuZC1jb2xvcjogQHdoaXRlO1xyXG4gIGNvbG9yOiBAdGhpcmRfdGV4dF9jb2xvcjtcclxuICB0cmFuc2l0aW9uOiBhbGwgMC41cyBlYXNlLWluLW91dDtcclxuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTUwJSk7XHJcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcclxuXHJcbiAgJl9fY29udGVudCB7XHJcbiAgICAuZWxsaXBzaXMoMSk7XHJcbiAgICBtYXJnaW46IDA7XHJcbiAgICBtYXgtd2lkdGg6IDcwMHB4O1xyXG4gICAgaGVpZ2h0OiA0MHB4O1xyXG4gICAgbGluZS1oZWlnaHQ6IDQwcHg7XHJcbiAgICBmb250LXNpemU6IDEzcHg7XHJcbiAgICBjb2xvcjogQHRoaXJkX3RleHRfY29sb3I7XHJcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xyXG4gIH1cclxuXHJcbiAgJl9fY2xvc2UsXHJcbiAgJl9faWNvbiB7XHJcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XHJcbiAgICB6LWluZGV4OiAyO1xyXG4gICAgdG9wOiAwO1xyXG4gICAgd2lkdGg6IDQwcHg7XHJcbiAgICBoZWlnaHQ6IDQwcHg7XHJcbiAgICBsaW5lLWhlaWdodDogNDBweDtcclxuICAgIHRleHQtYWxpZ246IGNlbnRlcjtcclxuICAgIG92ZXJmbG93OiBoaWRkZW47XHJcbiAgfVxyXG5cclxuICAmX19pY29uIHtcclxuICAgIGxlZnQ6IDA7XHJcbiAgICBjb2xvcjogQHdoaXRlO1xyXG5cclxuICAgIC5vdXRsaW5lLWljb24ge1xyXG4gICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XHJcbiAgICAgIHotaW5kZXg6IDI7XHJcbiAgICAgIHRvcDogNTAlO1xyXG4gICAgICBsZWZ0OiA1MCU7XHJcbiAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIC01MCUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgJl9fY2xvc2Uge1xyXG4gICAgcmlnaHQ6IDA7XHJcbiAgICBjdXJzb3I6IHBvaW50ZXI7XHJcbiAgICBjb2xvcjogQGZvdXJ0aF90ZXh0X2NvbG9yO1xyXG5cclxuICAgIC5vdXRsaW5lLWljb24ge1xyXG4gICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XHJcbiAgICAgIHotaW5kZXg6IDI7XHJcbiAgICAgIHRvcDogNTAlO1xyXG4gICAgICBsZWZ0OiA1MCU7XHJcbiAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIC01MCUpO1xyXG4gICAgfVxyXG5cclxuICAgICY6aG92ZXIge1xyXG4gICAgICBjb2xvcjogQHRoaXJkX3RleHRfY29sb3I7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAmX2luZm8ge1xyXG4gICAgLm91dGxpbmUtbWVzc2FnZV9faWNvbiB7XHJcbiAgICAgIGJhY2tncm91bmQtY29sb3I6IEBwcmltYXJ5X2NvbG9yO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgJl93YXJuaW5nIHtcclxuICAgIC5vdXRsaW5lLW1lc3NhZ2VfX2ljb24ge1xyXG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAd2FybmluZ19jb2xvcjtcclxuICAgIH1cclxuICB9XHJcblxyXG4gICZfc3VjY2VzcyB7XHJcbiAgICAub3V0bGluZS1tZXNzYWdlX19pY29uIHtcclxuICAgICAgYmFja2dyb3VuZC1jb2xvcjogQHN1Y2Nlc3NfY29sb3I7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAmX2Vycm9yIHtcclxuICAgIC5vdXRsaW5lLW1lc3NhZ2VfX2ljb24ge1xyXG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAZGFuZ2VyX2NvbG9yO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgJl9wbGFpbiB7XHJcbiAgICBtaW4td2lkdGg6IDE5MHB4O1xyXG4gICAgcGFkZGluZzogMCA1MHB4IDAgMTVweDtcclxuXHJcbiAgICAmLm91dGxpbmUtbWVzc2FnZSB7XHJcbiAgICAgICZfaW5mbyB7XHJcbiAgICAgICAgYm9yZGVyLWxlZnQ6IDVweCBzb2xpZCBAcHJpbWFyeV9jb2xvcjtcclxuICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAaW5mb190aXBfYmdfY29sb3I7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgICZfd2FybmluZyB7XHJcbiAgICAgICAgYm9yZGVyLWxlZnQ6IDVweCBzb2xpZCBAd2FybmluZ19jb2xvcjtcclxuICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAd2FybmluZ190aXBfYmdfY29sb3I7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgICZfc3VjY2VzcyB7XHJcbiAgICAgICAgYm9yZGVyLWxlZnQ6IDVweCBzb2xpZCBAc3VjY2Vzc19jb2xvcjtcclxuICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAc3VjY2Vzc190aXBfYmdfY29sb3I7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgICZfZXJyb3Ige1xyXG4gICAgICAgIGJvcmRlci1sZWZ0OiA1cHggc29saWQgQGRhbmdlcl9jb2xvcjtcclxuICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAZGFuZ2VyX3RpcF9iZ19jb2xvcjtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC5vdXRsaW5lLW1lc3NhZ2VfX2ljb24ge1xyXG4gICAgICB3aWR0aDogMDtcclxuICAgICAgZGlzcGxheTogbm9uZTtcclxuXHJcbiAgICAgIC5vdXRsaW5lLWljb24ge1xyXG4gICAgICAgIGRpc3BsYXk6IG5vbmU7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gICZfbGlnaHQge1xyXG4gICAgbWluLXdpZHRoOiAxODBweDtcclxuICAgIHBhZGRpbmc6IDAgNDBweDtcclxuXHJcbiAgICAmLm91dGxpbmUtbWVzc2FnZSB7XHJcbiAgICAgICZfaW5mbyB7XHJcbiAgICAgICAgLm91dGxpbmUtbWVzc2FnZV9faWNvbiB7XHJcbiAgICAgICAgICBjb2xvcjogQHByaW1hcnlfY29sb3I7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICAmX3dhcm5pbmcge1xyXG4gICAgICAgIC5vdXRsaW5lLW1lc3NhZ2VfX2ljb24ge1xyXG4gICAgICAgICAgY29sb3I6IEB3YXJuaW5nX2NvbG9yO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgJl9zdWNjZXNzIHtcclxuICAgICAgICAub3V0bGluZS1tZXNzYWdlX19pY29uIHtcclxuICAgICAgICAgIGNvbG9yOiBAc3VjY2Vzc19jb2xvcjtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgICZfZXJyb3Ige1xyXG4gICAgICAgIC5vdXRsaW5lLW1lc3NhZ2VfX2ljb24ge1xyXG4gICAgICAgICAgY29sb3I6IEBkYW5nZXJfY29sb3I7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLm91dGxpbmUtbWVzc2FnZV9faWNvbiB7XHJcbiAgICAgIGJhY2tncm91bmQtY29sb3I6IEB3aGl0ZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gICZfcm91bmQge1xyXG4gICAgLnJhZGl1cygyMHB4KTtcclxuXHJcbiAgICAmLm91dGxpbmUtbWVzc2FnZSB7XHJcbiAgICAgICZfZGVmYXVsdCB7XHJcbiAgICAgICAgbWluLXdpZHRoOiAxODBweDtcclxuICAgICAgICBwYWRkaW5nOiAwIDQwcHg7XHJcblxyXG4gICAgICAgIC5vdXRsaW5lLW1lc3NhZ2VfX2ljb24ge1xyXG4gICAgICAgICAgLnJhZGl1cygxMHB4KTtcclxuICAgICAgICAgIHRvcDogMTBweDtcclxuICAgICAgICAgIGxlZnQ6IDEwcHg7XHJcbiAgICAgICAgICB3aWR0aDogMjBweDtcclxuICAgICAgICAgIGhlaWdodDogMjBweDtcclxuICAgICAgICAgIGxpbmUtaGVpZ2h0OiAyMHB4O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgJi5vdXRsaW5lLW1lc3NhZ2VfZnVsbC13aWR0aCB7XHJcbiAgICAgICAgICBtaW4td2lkdGg6IDIwMHB4O1xyXG4gICAgICAgICAgcGFkZGluZzogMCAyMHB4IDAgNDBweDtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgICZfcGxhaW4ge1xyXG4gICAgICAgIG1pbi13aWR0aDogMTk1cHg7XHJcbiAgICAgICAgcGFkZGluZzogMCA0MHB4IDAgMjBweDtcclxuXHJcbiAgICAgICAgJi5vdXRsaW5lLW1lc3NhZ2VfZnVsbC13aWR0aCB7XHJcbiAgICAgICAgICBtaW4td2lkdGg6IDIxNXB4O1xyXG4gICAgICAgICAgcGFkZGluZzogMCAyMHB4O1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgJl9mdWxsLXdpZHRoIHtcclxuICAgIG1pbi13aWR0aDogMjAwcHg7XHJcbiAgICBwYWRkaW5nOiAwIDEwcHggMCA1MHB4O1xyXG5cclxuICAgICYub3V0bGluZS1tZXNzYWdlIHtcclxuICAgICAgJl9wbGFpbiB7XHJcbiAgICAgICAgbWluLXdpZHRoOiAyMzBweDtcclxuICAgICAgICBwYWRkaW5nOiAwIDEwcHggMCAxNXB4O1xyXG4gICAgICB9XHJcblxyXG4gICAgICAmX2xpZ2h0IHtcclxuICAgICAgICBtaW4td2lkdGg6IDIxMHB4O1xyXG4gICAgICAgIHBhZGRpbmc6IDAgMTBweCAwIDQwcHg7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gICZfdmlzaWJsZSB7XHJcbiAgICBvcGFjaXR5OiAxO1xyXG4gIH1cclxuXHJcbiAgJl9oaWRkZW4ge1xyXG4gICAgZGlzcGxheTogbm9uZTtcclxuICB9XHJcbn1cclxuIiwiLyogPT09PT0gU2Nyb2xsYmFyID09PT09ICovXHJcbjo6LXdlYmtpdC1zY3JvbGxiYXIge1xyXG4gIHdpZHRoOiA3cHg7XHJcbiAgaGVpZ2h0OiA3cHg7XHJcbiAgLXdlYmtpdC1ib3JkZXItcmFkaXVzOiA1cHg7XHJcblxyXG4gICYtdHJhY2stcGllY2Uge1xyXG4gICAgLXdlYmtpdC1ib3JkZXItcmFkaXVzOiA1cHg7XHJcbiAgfVxyXG5cclxuICAmLXRodW1iIHtcclxuICAgICY6dmVydGljYWwge1xyXG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuMjUpO1xyXG4gICAgICAtd2Via2l0LWJvcmRlci1yYWRpdXM6IDVweDtcclxuICAgIH1cclxuXHJcbiAgICAmOmhvcml6b250YWwge1xyXG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuMjUpO1xyXG4gICAgICAtd2Via2l0LWJvcmRlci1yYWRpdXM6IDVweDtcclxuICAgIH1cclxuXHJcbiAgICAmOmhvdmVyIHtcclxuICAgICAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjM1KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gICY6aG92ZXIge1xyXG4gICAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjE1KTtcclxuICB9XHJcbn1cclxuIl19 */ +.outline-heading{overflow:hidden;position:relative;z-index:1}.outline-heading__anchor{display:none}.outline-heading__anchor:hover,.outline-heading__anchor:link,.outline-heading__anchor:visited{color:#999;text-decoration:none}.outline-heading__anchor:hover{color:#507afe}.outline-heading:hover .outline-heading__anchor{display:inline-block}.outline-heading_start:hover{overflow:visible}.outline-heading_start .outline-heading__anchor{left:-1em;position:absolute;top:50%;transform:translateY(-50%);z-index:2} +:root{--outline-zIndex:2000;--outline-sticky-height:100%;--outline-navigator-width:100%}.outline-drawer{box-sizing:border-box;height:100%;left:0;margin:0;overflow:hidden;position:relative;top:0;visibility:hidden;width:100%;z-index:-1}.outline-drawer__modal{background-color:#fff;box-shadow:0 0 6px 1px #dcdfe6;display:flex;flex-direction:column;flex-wrap:nowrap;height:100%;overflow:hidden;position:absolute;transition-duration:.4s;z-index:21}.outline-drawer__footer,.outline-drawer__header,.outline-drawer__main{box-sizing:border-box;width:100%}.outline-drawer__footer,.outline-drawer__header{flex-shrink:0}.outline-drawer__footer,.outline-drawer__main,.outline-drawer__title{padding:0 16px}.outline-drawer__header,.outline-drawer__title{height:52px;line-height:52px;margin:0 auto;overflow:hidden;position:relative;z-index:1}.outline-drawer__title{border-bottom:1px solid #dcdfe6;box-sizing:border-box;font-size:16px;font-weight:400;margin:0 16px}.outline-drawer__close{color:#999;cursor:pointer;font-size:20px;height:20px;line-height:20px;overflow:hidden;position:absolute;right:12px;text-align:center;top:50%;transform:translateY(-50%);width:20px;z-index:2}.outline-drawer__close .outline-icon{left:0;position:absolute;top:0;z-index:2}.outline-drawer__close:hover{color:#666}.outline-drawer__main{flex:1;overflow:auto}.outline-drawer__main.overflow-hidden{overflow:hidden}.outline-drawer__footer{margin:0 auto;overflow:hidden;text-align:right}.outline-drawer__overlay{background-color:#fff;content:"";height:100%;left:0;opacity:.1;overflow:hidden;position:relative;top:0;width:100%;z-index:1}.outline-drawer_ltr.outline-drawer_tiny,.outline-drawer_rtl.outline-drawer_tiny{width:280px}.outline-drawer_ltr.outline-drawer_mini,.outline-drawer_rtl.outline-drawer_mini{width:480px}.outline-drawer_ltr.outline-drawer_small,.outline-drawer_rtl.outline-drawer_small{width:540px}.outline-drawer_ltr.outline-drawer_regular,.outline-drawer_rtl.outline-drawer_regular{width:680px}.outline-drawer_ltr.outline-drawer_medium,.outline-drawer_rtl.outline-drawer_medium{width:720px}.outline-drawer_ltr.outline-drawer_large,.outline-drawer_rtl.outline-drawer_large{width:960px}.outline-drawer_rtl{border-left:1px solid #dcdfe6}.outline-drawer_rtl.outline-drawer_tiny.outline-drawer_closed{right:-290px}.outline-drawer_rtl.outline-drawer_mini.outline-drawer_closed{right:-490px}.outline-drawer_rtl.outline-drawer_small.outline-drawer_closed{right:-550px}.outline-drawer_rtl.outline-drawer_regular.outline-drawer_closed{right:-690px}.outline-drawer_rtl.outline-drawer_medium.outline-drawer_closed{right:-730px}.outline-drawer_rtl.outline-drawer_large.outline-drawer_closed{right:-970px}.outline-drawer_ltr{border-right:1px solid #dcdfe6}.outline-drawer_ltr.outline-drawer_tiny.outline-drawer_closed{left:-290px}.outline-drawer_ltr.outline-drawer_mini.outline-drawer_closed{left:-490px}.outline-drawer_ltr.outline-drawer_small.outline-drawer_closed{left:-550px}.outline-drawer_ltr.outline-drawer_regular.outline-drawer_closed{left:-690px}.outline-drawer_ltr.outline-drawer_medium.outline-drawer_closed{left:-730px}.outline-drawer_ltr.outline-drawer_large.outline-drawer_closed{left:-970px}.outline-drawer_btt,.outline-drawer_ttb{left:0;width:100%}.outline-drawer_btt.outline-drawer_tiny,.outline-drawer_ttb.outline-drawer_tiny{height:240px}.outline-drawer_btt.outline-drawer_mini,.outline-drawer_ttb.outline-drawer_mini{height:320px}.outline-drawer_btt.outline-drawer_small,.outline-drawer_ttb.outline-drawer_small{height:360px}.outline-drawer_btt.outline-drawer_regular,.outline-drawer_ttb.outline-drawer_regular{height:400px}.outline-drawer_btt.outline-drawer_medium,.outline-drawer_ttb.outline-drawer_medium{height:440px}.outline-drawer_btt.outline-drawer_large,.outline-drawer_ttb.outline-drawer_large{height:480px}.outline-drawer_ttb{border-bottom:1px solid #dcdfe6}.outline-drawer_ttb.outline-drawer_tiny.outline-drawer_closed{top:-250px}.outline-drawer_ttb.outline-drawer_mini.outline-drawer_closed{top:-330px}.outline-drawer_ttb.outline-drawer_small.outline-drawer_closed{top:-370px}.outline-drawer_ttb.outline-drawer_regular.outline-drawer_closed{top:-410px}.outline-drawer_ttb.outline-drawer_medium.outline-drawer_closed{top:-450px}.outline-drawer_ttb.outline-drawer_large.outline-drawer_closed{top:-490px}.outline-drawer_btt{border-top:1px solid #dcdfe6;top:auto}.outline-drawer_btt.outline-drawer_tiny.outline-drawer_closed{bottom:-250px}.outline-drawer_btt.outline-drawer_mini.outline-drawer_closed{bottom:-330px}.outline-drawer_btt.outline-drawer_small.outline-drawer_closed{bottom:-370px}.outline-drawer_btt.outline-drawer_regular.outline-drawer_closed{bottom:-410px}.outline-drawer_btt.outline-drawer_medium.outline-drawer_closed{bottom:-450px}.outline-drawer_btt.outline-drawer_large.outline-drawer_closed{bottom:-490px}.outline-drawer_opened{visibility:visible;z-index:var(--outline-zIndex)}.outline-drawer_opened.outline-drawer{position:fixed}.outline-drawer_opened.outline-drawer_rtl{right:0}.outline-drawer_opened.outline-drawer_ltr{left:0}.outline-drawer_opened.outline-drawer_ttb{top:0}.outline-drawer_opened.outline-drawer_btt{bottom:0}.outline-drawer_offset.outline-drawer_ltr,.outline-drawer_offset.outline-drawer_rtl{height:calc(100% - 4em);top:50%;transform:translateY(-50%)}.outline-drawer_offset.outline-drawer_btt,.outline-drawer_offset.outline-drawer_ttb{left:50%;transform:translateX(-50%);width:calc(100% - 4em)}.outline-drawer_offset.outline-drawer_opened.outline-drawer_rtl{right:2em}.outline-drawer_offset.outline-drawer_opened.outline-drawer_ltr{left:2em}.outline-drawer_offset.outline-drawer_opened.outline-drawer_ttb{top:2em}.outline-drawer_offset.outline-drawer_opened.outline-drawer_btt{bottom:2em}.outline-drawer_auto.outline-drawer_ltr,.outline-drawer_auto.outline-drawer_rtl{height:auto;max-height:calc(100% - 4em)}.outline-drawer_full{padding:0} +:root{--outline-zIndex:2000;--outline-sticky-height:100%;--outline-navigator-width:100%}.outline-navigator{margin:0;overflow:auto;position:relative;width:var(--outline-navigator-width);z-index:1}.outline-navigator-parent{transition:.3s ease-in-out}.outline-navigator__title{border-bottom:1px solid #dcdfe6;font-size:16px;font-weight:400;height:40px;line-height:40px;margin:0 16px;overflow:hidden;padding:0 16px}.outline-navigator__main{margin:0;overflow:hidden;position:relative;z-index:1}.outline-navigator__item,.outline-navigator__list,.outline-navigator__subject{list-style-type:none;margin:0;overflow:hidden;padding:0;position:relative;z-index:2}.outline-navigator__list{padding:.5em 0}.outline-navigator__subject{padding-left:1em}.outline-navigator__item{font-size:13px;line-height:30px;margin:0;overflow:hidden}.outline-navigator__placeholder{background-color:#f7f8f9;border-left:2px solid #058942;box-sizing:border-box;height:30px;left:0;overflow:hidden;position:absolute;top:0;transition-duration:.2s;width:100%;z-index:1}.outline-navigator__anchor{display:block;overflow:hidden;padding:0 1.5em;text-overflow:ellipsis;white-space:nowrap}.outline-navigator__anchor:hover,.outline-navigator__anchor:link,.outline-navigator__anchor:visited{color:#555;text-decoration:none}.outline-navigator__anchor:hover{color:#058942}.outline-navigator__code{padding-right:.5em}.outline-navigator_highlight.outline-navigator__anchor:hover,.outline-navigator_highlight.outline-navigator__anchor:link,.outline-navigator_highlight.outline-navigator__anchor:visited{color:#058942;font-weight:700}.outline-navigator_fixed,.outline-navigator_sticky{display:flex;flex-direction:column;flex-wrap:nowrap;overflow:hidden;top:0;z-index:var(--outline-zIndex)}.outline-navigator_fixed .outline-navigator__main,.outline-navigator_fixed .outline-navigator__title,.outline-navigator_sticky .outline-navigator__main,.outline-navigator_sticky .outline-navigator__title{box-sizing:border-box}.outline-navigator_fixed .outline-navigator__title,.outline-navigator_sticky .outline-navigator__title{flex-shrink:0}.outline-navigator_fixed .outline-navigator__main,.outline-navigator_sticky .outline-navigator__main{flex:1;overflow:auto}.outline-navigator_sticky{max-height:var(--outline-sticky-height);position:sticky}.outline-navigator_fixed{max-height:100%;position:fixed}.outline-navigator_hidden{display:none}.outline-navigator_folded{overflow:hidden;width:0} +.outline-icon{display:inline-block;position:relative;vertical-align:middle;z-index:1}.outline-icon,.outline-icon__svg{height:1em;overflow:hidden;width:1em}.outline-icon__svg{left:50%;position:absolute;top:50%;z-index:2;fill:currentcolor;transform:translate(-50%,-50%)}.outline-icon_hidden{display:none}.outline-message{background-color:#fff;border-radius:3px;box-shadow:0 0 6px 1px #dcdfe6;left:50%;opacity:.1;padding:0 50px;position:fixed;top:-50px;transform:translateX(-50%);transition:all .5s ease-in-out;z-index:9999}.outline-message,.outline-message__content{color:#666;font-size:13px;height:40px;line-height:40px;margin:0;overflow:hidden}.outline-message__content{max-width:700px;text-overflow:ellipsis;white-space:nowrap}.outline-message__close,.outline-message__icon{height:40px;line-height:40px;overflow:hidden;position:absolute;text-align:center;top:0;width:40px;z-index:2}.outline-message__icon{color:#fff;left:0}.outline-message__icon .outline-icon{left:50%;position:absolute;top:50%;transform:translate(-50%,-50%);z-index:2}.outline-message__close{color:#999;cursor:pointer;right:0}.outline-message__close .outline-icon{left:50%;position:absolute;top:50%;transform:translate(-50%,-50%);z-index:2}.outline-message__close:hover{color:#666}.outline-message_info .outline-message__icon{background-color:#507afe}.outline-message_warning .outline-message__icon{background-color:#ff9901}.outline-message_success .outline-message__icon{background-color:#058942}.outline-message_error .outline-message__icon{background-color:#ff5d5d}.outline-message_plain{min-width:190px;padding:0 50px 0 15px}.outline-message_plain.outline-message_info{background-color:#ecf8ff;border-left:5px solid #507afe}.outline-message_plain.outline-message_warning{background-color:#fffbe6;border-left:5px solid #ff9901}.outline-message_plain.outline-message_success{background-color:#e1f6eb;border-left:5px solid #058942}.outline-message_plain.outline-message_error{background-color:#fff1f0;border-left:5px solid #ff5d5d}.outline-message_plain .outline-message__icon{display:none;width:0}.outline-message_plain .outline-message__icon .outline-icon{display:none}.outline-message_light{min-width:180px;padding:0 40px}.outline-message_light.outline-message_info .outline-message__icon{color:#507afe}.outline-message_light.outline-message_warning .outline-message__icon{color:#ff9901}.outline-message_light.outline-message_success .outline-message__icon{color:#058942}.outline-message_light.outline-message_error .outline-message__icon{color:#ff5d5d}.outline-message_light .outline-message__icon{background-color:#fff}.outline-message_round{border-radius:20px}.outline-message_round.outline-message_default{min-width:180px;padding:0 40px}.outline-message_round.outline-message_default .outline-message__icon{border-radius:10px;height:20px;left:10px;line-height:20px;top:10px;width:20px}.outline-message_round.outline-message_default.outline-message_full-width{min-width:200px;padding:0 20px 0 40px}.outline-message_round.outline-message_plain{min-width:195px;padding:0 40px 0 20px}.outline-message_round.outline-message_plain.outline-message_full-width{min-width:215px;padding:0 20px}.outline-message_full-width{min-width:200px;padding:0 10px 0 50px}.outline-message_full-width.outline-message_plain{min-width:230px;padding:0 10px 0 15px}.outline-message_full-width.outline-message_light{min-width:210px;padding:0 10px 0 40px}.outline-message_visible{opacity:1}.outline-message_hidden{display:none} +.outline-toolbar{margin:0;overflow:hidden;position:fixed;transition-duration:.3s;z-index:99999}.outline-toolbar__button{background-color:#fff;border:1px solid #dcdfe6;border-radius:3px;box-shadow:0 0 6px 1px #dcdfe6;box-sizing:border-box;color:#999;cursor:pointer;height:36px;margin:10px;overflow:hidden;position:relative;text-align:center;transition:all .3s ease-in-out .1s;width:36px;z-index:1}.outline-toolbar__button:hover{border-color:#058942;color:#058942;transform:scale(1.35)}.outline-toolbar__button.hide{display:none}.outline-toolbar__anchor:hover,.outline-toolbar__anchor:link,.outline-toolbar__anchor:visited{color:#999;text-decoration:none}.outline-toolbar__anchor:hover{color:#058942}.outline-toolbar__icon{height:20px;left:50%;position:absolute;top:50%;transform:translate(-50%,-50%);width:20px;z-index:2;fill:currentcolor;overflow:hidden}.outline-toolbar_active.outline-toolbar__button{background-color:#058942;border-color:#058942;color:#fff}.outline-toolbar_active.outline-toolbar__button:hover{color:#fff}.outline-toolbar_active .outline-toolbar__anchor:hover,.outline-toolbar_active .outline-toolbar__anchor:link,.outline-toolbar_active .outline-toolbar__anchor:visited{color:#fff}.outline-toolbar_rounded.outline-toolbar__button{border-radius:18px}.outline-toolbar_disabled .outline-toolbar__anchor:hover,.outline-toolbar_disabled .outline-toolbar__anchor:link,.outline-toolbar_disabled .outline-toolbar__anchor:visited,.outline-toolbar_disabled .outline-toolbar__button,.outline-toolbar_disabled.outline-toolbar__anchor:hover,.outline-toolbar_disabled.outline-toolbar__anchor:link,.outline-toolbar_disabled.outline-toolbar__anchor:visited,.outline-toolbar_disabled.outline-toolbar__button{border-color:#999;color:#999;cursor:not-allowed}.outline-toolbar_disabled .outline-toolbar__anchor:hover:hover,.outline-toolbar_disabled .outline-toolbar__anchor:link:hover,.outline-toolbar_disabled .outline-toolbar__anchor:visited:hover,.outline-toolbar_disabled .outline-toolbar__button:hover,.outline-toolbar_disabled.outline-toolbar__anchor:hover:hover,.outline-toolbar_disabled.outline-toolbar__anchor:link:hover,.outline-toolbar_disabled.outline-toolbar__anchor:visited:hover,.outline-toolbar_disabled.outline-toolbar__button:hover{border-color:#999;color:#999}.outline-toolbar_disabled .outline-toolbar__button,.outline-toolbar_disabled.outline-toolbar__button{background-color:#f5f5f5}.outline-toolbar_btt,.outline-toolbar_ttb{left:50%;transform:translateX(-50%)}.outline-toolbar_btt .outline-toolbar__button,.outline-toolbar_ttb .outline-toolbar__button{display:inline-block}.outline-toolbar_ttb{top:12px}.outline-toolbar_ttb.outline-toolbar_hidden{top:-56px}.outline-toolbar_btt{bottom:12px}.outline-toolbar_btt.outline-toolbar_hidden{bottom:-56px}.outline-toolbar_ltr,.outline-toolbar_rtl{transform:translateY(-50%);width:56px}.outline-toolbar_rtl{right:12px;top:50%}.outline-toolbar_rtl.outline-toolbar_hidden{right:-86px}.outline-toolbar_ltr{left:12px;top:50%}.outline-toolbar_ltr.outline-toolbar_hidden{left:-86px}.outline-toolbar_btt .outline-toolbar__button.outline-toolbar_hidden,.outline-toolbar_ltr .outline-toolbar__button.outline-toolbar_hidden,.outline-toolbar_rtl .outline-toolbar__button.outline-toolbar_hidden,.outline-toolbar_ttb .outline-toolbar__button.outline-toolbar_hidden{display:none} +.outline-reader__progress{animation:outline-reader-progress linear;background-color:#507afe;height:4px;left:0;position:fixed;scale:0 1;top:0;transform-origin:left;width:100%;z-index:3;animation-timeline:--ProgressTimeline}.outline-reader__paper{background-color:#fff;box-shadow:0 0 6px 1px #ddd;box-sizing:border-box;margin:2em auto;max-width:1200px;overflow:hidden;padding:3.2em}.outline-reader__title{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Helvetica Neue,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Helvetica,Arial,sans-serif;font-size:4.2em;font-weight:400;line-height:1.3em;margin:.67em 0;overflow:hidden;text-align:center}.outline-reader__article .outline-reader__progress,.outline-reader_hidden{display:none}.outline-reader_hidden.outline-reader_sibling{display:none!important}.outline-reader_hidden.outline-reader_sibling.wrapper.post{display:none}.outline-reader--reading{background-color:#fafafa;box-sizing:border-box;display:block;height:100%;left:0;margin:0;padding:3em 4em;position:fixed;top:0;width:100%;z-index:2;scroll-timeline-name:--ProgressTimeline;overflow:scroll}@keyframes outline-reader-progress{to{scale:1 1}}@media (max-width:500px){.outline-reader{overflow:hidden}.outline-reader .outline-toolbar{align-items:center;align-self:auto;background-color:#fff;border-top:1px solid #ddd;box-sizing:border-box;display:flex;flex-direction:row;flex-wrap:nowrap;height:48px;padding:0 16px;right:0;top:100%;transform:translateY(-48px);width:100%}.outline-reader .outline-toolbar__button{border:none;border-radius:0;box-shadow:none;flex:1}.outline-reader--reading{background-color:#fff;box-sizing:border-box;padding:0}.outline-reader__paper{box-shadow:none;height:100%;margin:0;overflow:hidden;padding:0;position:relative;z-index:1}.outline-reader__title{background-color:#fff;border-bottom:1px solid #ddd;font-size:1.8em;font-weight:400;height:48px;left:0;line-height:48px;margin:0;overflow:hidden;position:absolute;text-overflow:ellipsis;top:0;white-space:nowrap;width:100%;z-index:3}.outline-reader__article{height:calc(100% - 96px);margin:48px 0;padding:0 1.25em;scroll-timeline-name:--MobileProgressTimeline;overflow-x:hidden;overflow-y:scroll}.outline-reader__article .outline-reader__progress{animation:outline-reader-progress linear;z-index:4;animation-timeline:--MobileProgressTimeline;display:block}}@media print{body,html{background-color:#fff;color:#333;font-size:12pt;height:auto!important}a:hover,a:link,a:visited{color:#507afe;text-decoration:underline!important}audio,video{display:none!important}table{border-collapse:collapse;width:100%}td,th{border:1px solid #dcdfe6;padding:8px 20px}.outline-message,.outline-toolbar{display:none!important}.outline-reader{display:block!important;overflow:hidden}.outline-reader__title{font-size:32pt!important;margin:13.4pt 0 28pt!important;text-align:center!important}.outline-reader--reading{background-color:#fff;height:auto!important;overflow:hidden!important;padding:0!important;position:relative!important}.outline-reader__progress{display:none!important}.outline-reader__paper{box-shadow:none}.outline-reader pre{border:1px solid #ddd!important;border-radius:4px!important;padding:1em!important}.outline-reader code,.outline-reader pre{background-color:#fff!important}.outline-reader img,.outline-reader svg,.outline-reader table{break-inside:avoid}.outline-reader_sibling{display:none!important}} \ No newline at end of file diff --git a/outline.js b/outline.js index 44c41bb1..357d5310 100644 --- a/outline.js +++ b/outline.js @@ -1,22 +1,24 @@ import later from './utils/lang/later' import cloneDeep from './utils/lang/cloneDeep' + import isFunction from './utils/types/isFunction' import isString from './utils/types/isString' import isElement from './utils/types/isElement' + import addClass from './utils/dom/addClass' import scrollTo from './utils/dom/scrollTo' -import _getScrollElement from './utils/dom/_getScrollElement' +import getScrollElement from './utils/dom/getScrollElement' -import getChapters from './getChapters' +import getChapters from './chapters/getChapters' -import Base from './base' -import Anchors from './anchors' -import Drawer from './drawer' -import Navigator from './navigator' -import Reader from './reader' -import Toolbar from './toolbar' +import Component from './component' +import Anchors from './anchors/anchors' +import Drawer from './drawer/drawer' +import Navigator from './navigator/navigator' +import Reader from './reader/reader' +import Toolbar from './toolbar/toolbar' -class Outline extends Base { +class Outline extends Component { constructor(options) { super() @@ -61,7 +63,7 @@ class Outline extends Base { $article = articleElement } this.$article = $article - this.$scrollElement = _getScrollElement(scrollElement) + this.$scrollElement = getScrollElement(scrollElement) this.$emit('created', { ...this.attr() }) this.render().addListeners() diff --git a/outline.min.css b/outline.min.css index 5c80da86..8f6aa395 100644 --- a/outline.min.css +++ b/outline.min.css @@ -1,2 +1,2 @@ -.outline-icon,.outline-icon__svg{width:1em;height:1em;overflow:hidden}.outline-drawer__title,.outline-drawer_ttb,.outline-navigator__title{border-bottom:1px solid #dcdfe6}:root{--outline-zIndex:2000;--outline-sticky-height:100%;--outline-navigator-width:100%}.outline-icon{position:relative;z-index:1;display:inline-block;vertical-align:middle}.outline-heading__anchor,.outline-icon_hidden{display:none}.outline-icon__svg{position:absolute;z-index:2;top:50%;left:50%;fill:currentcolor;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%)}.outline-heading{position:relative;z-index:1;overflow:hidden}.outline-heading__anchor:hover,.outline-heading__anchor:link,.outline-heading__anchor:visited{color:#999;text-decoration:none}.outline-heading__anchor:hover{color:#507afe}.outline-heading:hover .outline-heading__anchor{display:inline-block}.outline-heading_start:hover{overflow:visible}.outline-heading_start .outline-heading__anchor{position:absolute;z-index:2;top:50%;-webkit-transform:translateY(-50%);transform:translateY(-50%);left:-1em}.outline-drawer{position:relative;z-index:-1;top:0;left:0;margin:0;width:100%;height:100%;-webkit-box-sizing:border-box;box-sizing:border-box;visibility:hidden;overflow:hidden}.outline-drawer__modal{-webkit-box-shadow:0 0 6px 1px #dcdfe6;box-shadow:0 0 6px 1px #dcdfe6;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-ms-flex-wrap:nowrap;flex-wrap:nowrap;position:absolute;z-index:21;height:100%;background-color:#fff;-webkit-transition-duration:.4s;transition-duration:.4s;overflow:hidden}.outline-drawer__footer,.outline-drawer__header,.outline-drawer__main{width:100%;-webkit-box-sizing:border-box;box-sizing:border-box}.outline-drawer__footer,.outline-drawer__header{-ms-flex-negative:0;flex-shrink:0}.outline-drawer__footer,.outline-drawer__main,.outline-drawer__title{padding:0 16px}.outline-drawer__header,.outline-drawer__title{position:relative;z-index:1;margin:0 auto;height:52px;line-height:52px;overflow:hidden}.outline-drawer__title{font-size:16px;font-weight:400;margin:0 16px;-webkit-box-sizing:border-box;box-sizing:border-box}.outline-drawer__close{position:absolute;z-index:2;top:50%;right:12px;width:20px;height:20px;line-height:20px;color:#999;font-size:20px;text-align:center;cursor:pointer;-webkit-transform:translateY(-50%);transform:translateY(-50%);overflow:hidden}.outline-drawer__close .outline-icon{position:absolute;z-index:2;top:0;left:0}.outline-drawer__close:hover{color:#666}.outline-drawer__main{-webkit-box-flex:1;-ms-flex:1;flex:1;overflow:auto}.outline-drawer__main.overflow-hidden{overflow:hidden}.outline-drawer__footer{margin:0 auto;text-align:right;overflow:hidden}.outline-drawer__overlay{content:'';position:relative;z-index:1;top:0;left:0;width:100%;height:100%;background-color:#fff;opacity:.1;overflow:hidden}.outline-drawer_ltr.outline-drawer_tiny,.outline-drawer_rtl.outline-drawer_tiny{width:280px}.outline-drawer_ltr.outline-drawer_mini,.outline-drawer_rtl.outline-drawer_mini{width:480px}.outline-drawer_ltr.outline-drawer_small,.outline-drawer_rtl.outline-drawer_small{width:540px}.outline-drawer_ltr.outline-drawer_regular,.outline-drawer_rtl.outline-drawer_regular{width:680px}.outline-drawer_ltr.outline-drawer_medium,.outline-drawer_rtl.outline-drawer_medium{width:720px}.outline-drawer_ltr.outline-drawer_large,.outline-drawer_rtl.outline-drawer_large{width:960px}.outline-drawer_rtl{border-left:1px solid #dcdfe6}.outline-drawer_rtl.outline-drawer_tiny.outline-drawer_closed{right:-290px}.outline-drawer_rtl.outline-drawer_mini.outline-drawer_closed{right:-490px}.outline-drawer_rtl.outline-drawer_small.outline-drawer_closed{right:-550px}.outline-drawer_rtl.outline-drawer_regular.outline-drawer_closed{right:-690px}.outline-drawer_rtl.outline-drawer_medium.outline-drawer_closed{right:-730px}.outline-drawer_rtl.outline-drawer_large.outline-drawer_closed{right:-970px}.outline-drawer_ltr{border-right:1px solid #dcdfe6}.outline-drawer_ltr.outline-drawer_tiny.outline-drawer_closed{left:-290px}.outline-drawer_ltr.outline-drawer_mini.outline-drawer_closed{left:-490px}.outline-drawer_ltr.outline-drawer_small.outline-drawer_closed{left:-550px}.outline-drawer_ltr.outline-drawer_regular.outline-drawer_closed{left:-690px}.outline-drawer_ltr.outline-drawer_medium.outline-drawer_closed{left:-730px}.outline-drawer_ltr.outline-drawer_large.outline-drawer_closed{left:-970px}.outline-drawer_btt,.outline-drawer_ttb{left:0;width:100%}.outline-drawer_btt.outline-drawer_tiny,.outline-drawer_ttb.outline-drawer_tiny{height:240px}.outline-drawer_btt.outline-drawer_mini,.outline-drawer_ttb.outline-drawer_mini{height:320px}.outline-drawer_btt.outline-drawer_small,.outline-drawer_ttb.outline-drawer_small{height:360px}.outline-drawer_btt.outline-drawer_regular,.outline-drawer_ttb.outline-drawer_regular{height:400px}.outline-drawer_btt.outline-drawer_medium,.outline-drawer_ttb.outline-drawer_medium{height:440px}.outline-drawer_btt.outline-drawer_large,.outline-drawer_ttb.outline-drawer_large{height:480px}.outline-drawer_ttb.outline-drawer_tiny.outline-drawer_closed{top:-250px}.outline-drawer_ttb.outline-drawer_mini.outline-drawer_closed{top:-330px}.outline-drawer_ttb.outline-drawer_small.outline-drawer_closed{top:-370px}.outline-drawer_ttb.outline-drawer_regular.outline-drawer_closed{top:-410px}.outline-drawer_ttb.outline-drawer_medium.outline-drawer_closed{top:-450px}.outline-drawer_ttb.outline-drawer_large.outline-drawer_closed{top:-490px}.outline-drawer_btt{top:initial;border-top:1px solid #dcdfe6}.outline-drawer_btt.outline-drawer_tiny.outline-drawer_closed{bottom:-250px}.outline-drawer_btt.outline-drawer_mini.outline-drawer_closed{bottom:-330px}.outline-drawer_btt.outline-drawer_small.outline-drawer_closed{bottom:-370px}.outline-drawer_btt.outline-drawer_regular.outline-drawer_closed{bottom:-410px}.outline-drawer_btt.outline-drawer_medium.outline-drawer_closed{bottom:-450px}.outline-drawer_btt.outline-drawer_large.outline-drawer_closed{bottom:-490px}.outline-drawer_opened{visibility:visible;z-index:var(--outline-zIndex)}.outline-drawer_opened.outline-drawer{position:fixed}.outline-drawer_opened.outline-drawer_rtl{right:0}.outline-drawer_opened.outline-drawer_ltr{left:0}.outline-drawer_opened.outline-drawer_ttb{top:0}.outline-drawer_opened.outline-drawer_btt{bottom:0}.outline-drawer_offset.outline-drawer_ltr,.outline-drawer_offset.outline-drawer_rtl{height:calc(100% - 4em);top:50%;-webkit-transform:translateY(-50%);transform:translateY(-50%)}.outline-drawer_offset.outline-drawer_btt,.outline-drawer_offset.outline-drawer_ttb{width:calc(100% - 4em);left:50%;-webkit-transform:translateX(-50%);transform:translateX(-50%)}.outline-drawer_offset.outline-drawer_opened.outline-drawer_rtl{right:2em}.outline-drawer_offset.outline-drawer_opened.outline-drawer_ltr{left:2em}.outline-drawer_offset.outline-drawer_opened.outline-drawer_ttb{top:2em}.outline-drawer_offset.outline-drawer_opened.outline-drawer_btt{bottom:2em}.outline-drawer_auto.outline-drawer_ltr,.outline-drawer_auto.outline-drawer_rtl{height:auto;max-height:calc(100% - 4em)}.outline-drawer_full{padding:0}.outline-navigator{position:relative;z-index:1;margin:0;width:var(--outline-navigator-width);overflow:auto}.outline-navigator-parent{-webkit-transition:.3s ease-in-out;transition:.3s ease-in-out}.outline-navigator__title{margin:0 16px;height:40px;line-height:40px;padding:0 16px;font-size:16px;font-weight:400;overflow:hidden}.outline-navigator__main{position:relative;z-index:1;margin:0;overflow:hidden}.outline-navigator__item,.outline-navigator__list,.outline-navigator__subject{position:relative;z-index:2;margin:0;padding:0;list-style-type:none;overflow:hidden}.outline-navigator__list{padding:.5em 0}.outline-navigator__subject{padding-left:1em}.outline-navigator__item{margin:0;line-height:30px;font-size:13px;overflow:hidden}.outline-navigator__placeholder{position:absolute;z-index:1;top:0;left:0;width:100%;height:30px;background-color:#f7f8f9;border-left:2px solid #058942;-webkit-transition-duration:.2s;transition-duration:.2s;-webkit-box-sizing:border-box;box-sizing:border-box;overflow:hidden}.outline-navigator__anchor{white-space:nowrap;text-overflow:ellipsis;overflow:hidden;display:block;padding:0 1.5em}.outline-navigator__anchor:hover,.outline-navigator__anchor:link,.outline-navigator__anchor:visited{text-decoration:none;color:#555}.outline-navigator__anchor:hover{color:#058942}.outline-navigator__code{padding-right:.5em}.outline-navigator_highlight.outline-navigator__anchor:hover,.outline-navigator_highlight.outline-navigator__anchor:link,.outline-navigator_highlight.outline-navigator__anchor:visited{color:#058942;font-weight:700}.outline-navigator_fixed,.outline-navigator_sticky{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;z-index:var(--outline-zIndex);top:0;overflow:hidden}.outline-navigator_hidden,.outline-reader__article .outline-reader__progress,.outline-reader_hidden{display:none}.outline-navigator_fixed .outline-navigator__main,.outline-navigator_fixed .outline-navigator__title,.outline-navigator_sticky .outline-navigator__main,.outline-navigator_sticky .outline-navigator__title{-webkit-box-sizing:border-box;box-sizing:border-box}.outline-navigator_fixed .outline-navigator__title,.outline-navigator_sticky .outline-navigator__title{-ms-flex-negative:0;flex-shrink:0}.outline-navigator_fixed .outline-navigator__main,.outline-navigator_sticky .outline-navigator__main{-webkit-box-flex:1;-ms-flex:1;flex:1;overflow:auto}.outline-navigator_sticky{position:sticky;max-height:var(--outline-sticky-height)}.outline-navigator_fixed{position:fixed;max-height:100%}.outline-navigator_folded{width:0;overflow:hidden}.outline-reader__progress{position:fixed;top:0;left:0;z-index:3;height:4px;width:100%;background-color:#507afe;scale:0 1;-webkit-transform-origin:left;transform-origin:left;-webkit-animation:outline-reader-progress linear;animation:outline-reader-progress linear;animation-timeline:--ProgressTimeline}.outline-message,.outline-toolbar__button{background-color:#fff;-webkit-box-shadow:0 0 6px 1px #dcdfe6}.outline-reader__paper{-webkit-box-shadow:0 0 6px 1px #ddd;box-shadow:0 0 6px 1px #ddd;margin:2em auto;max-width:1200px;padding:3.2em;-webkit-box-sizing:border-box;box-sizing:border-box;background-color:#fff;overflow:hidden}.outline-reader__title{margin:.67em 0;text-align:center;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI','PingFang SC','Hiragino Sans GB','Microsoft YaHei','Helvetica Neue','Apple Color Emoji','Segoe UI Emoji','Segoe UI Symbol',Helvetica,Arial,sans-serif;font-weight:400;line-height:1.3em;font-size:4.2em;overflow:hidden}.outline-reader_hidden.outline-reader_sibling{display:none!important}.outline-reader_hidden.outline-reader_sibling.wrapper.post{display:none}.outline-reader--reading{display:block;position:fixed;z-index:2;top:0;left:0;width:100%;height:100%;margin:0;-webkit-box-sizing:border-box;box-sizing:border-box;padding:3em 4em;background-color:#fafafa;scroll-timeline-name:--ProgressTimeline;overflow:scroll}@-webkit-keyframes outline-reader-progress{to{scale:1 1}}@keyframes outline-reader-progress{to{scale:1 1}}@media (max-width:500px){.outline-reader{overflow:hidden}.outline-reader .outline-toolbar{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-ms-flex-item-align:auto;align-self:auto;top:100%;right:0;-webkit-transform:translateY(-48px);transform:translateY(-48px);width:100%;height:48px;-webkit-box-sizing:border-box;box-sizing:border-box;border-top:1px solid #ddd;background-color:#fff;padding:0 16px}.outline-reader .outline-toolbar__button{border-radius:0;-webkit-box-flex:1;-ms-flex:1;flex:1;border:none;-webkit-box-shadow:none;box-shadow:none}.outline-reader--reading{padding:0;background-color:#fff;-webkit-box-sizing:border-box;box-sizing:border-box}.outline-reader__paper{position:relative;z-index:1;margin:0;padding:0;height:100%;-webkit-box-shadow:none;box-shadow:none;overflow:hidden}.outline-reader__title{white-space:nowrap;text-overflow:ellipsis;position:absolute;z-index:3;top:0;left:0;margin:0;width:100%;height:48px;line-height:48px;border-bottom:1px solid #ddd;font-size:1.8em;font-weight:400;background-color:#fff;overflow:hidden}.outline-reader__article{margin:48px 0;height:calc(100% - 96px);padding:0 1.25em;scroll-timeline-name:--MobileProgressTimeline;overflow-x:hidden;overflow-y:scroll}.outline-reader__article .outline-reader__progress{z-index:4;-webkit-animation:outline-reader-progress linear;animation:outline-reader-progress linear;animation-timeline:--MobileProgressTimeline;display:block}}@media print{body,html{font-size:12pt;background-color:#fff;color:#333;height:initial!important}a:hover,a:link,a:visited{text-decoration:underline!important;color:#507afe}.outline-message,.outline-toolbar,audio,video{display:none!important}table{width:100%;border-collapse:collapse}td,th{border:1px solid #dcdfe6;padding:8px 20px}.outline-reader{display:block!important;overflow:hidden}.outline-reader__progress,.outline-reader_sibling{display:none!important}.outline-reader__title{margin:13.4pt 0 28pt!important;text-align:center!important;font-size:32pt!important}.outline-reader--reading{position:relative!important;height:auto!important;padding:0!important;background-color:#fff;overflow:hidden!important}.outline-reader__paper{-webkit-box-shadow:none;box-shadow:none}.outline-reader pre{padding:1em!important;border:1px solid #ddd!important;border-radius:4px!important}.outline-reader code,.outline-reader pre{background-color:#fff!important}.outline-reader img,.outline-reader svg,.outline-reader table{-webkit-column-break-inside:avoid;-moz-column-break-inside:avoid;break-inside:avoid}}.outline-toolbar{position:fixed;z-index:99999;margin:0;-webkit-transition-duration:.3s;transition-duration:.3s;overflow:hidden}.outline-toolbar__button{box-shadow:0 0 6px 1px #dcdfe6;position:relative;z-index:1;margin:10px;width:36px;height:36px;border:1px solid #dcdfe6;border-radius:3px;-webkit-box-sizing:border-box;box-sizing:border-box;cursor:pointer;text-align:center;color:#999;-webkit-transition:all .3s .1s ease-in-out;transition:all .3s .1s ease-in-out;overflow:hidden}.outline-toolbar__button:hover{color:#058942;border-color:#058942;-webkit-transform:scale(1.35);transform:scale(1.35)}.outline-toolbar__button.hide{display:none}.outline-toolbar__anchor:hover,.outline-toolbar__anchor:link,.outline-toolbar__anchor:visited{color:#999;text-decoration:none}.outline-toolbar__anchor:hover{color:#058942}.outline-toolbar__icon{position:absolute;z-index:2;top:50%;left:50%;width:20px;height:20px;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%);fill:currentcolor;overflow:hidden}.outline-toolbar_active.outline-toolbar__button{color:#fff;background-color:#058942;border-color:#058942}.outline-toolbar_active .outline-toolbar__anchor:hover,.outline-toolbar_active .outline-toolbar__anchor:link,.outline-toolbar_active .outline-toolbar__anchor:visited,.outline-toolbar_active.outline-toolbar__button:hover{color:#fff}.outline-toolbar_rounded.outline-toolbar__button{border-radius:18px}.outline-toolbar_disabled .outline-toolbar__anchor:hover,.outline-toolbar_disabled .outline-toolbar__anchor:link,.outline-toolbar_disabled .outline-toolbar__anchor:visited,.outline-toolbar_disabled .outline-toolbar__button,.outline-toolbar_disabled.outline-toolbar__anchor:hover,.outline-toolbar_disabled.outline-toolbar__anchor:link,.outline-toolbar_disabled.outline-toolbar__anchor:visited,.outline-toolbar_disabled.outline-toolbar__button{cursor:not-allowed;color:#999;border-color:#999}.outline-toolbar_disabled .outline-toolbar__anchor:hover:hover,.outline-toolbar_disabled .outline-toolbar__anchor:link:hover,.outline-toolbar_disabled .outline-toolbar__anchor:visited:hover,.outline-toolbar_disabled .outline-toolbar__button:hover,.outline-toolbar_disabled.outline-toolbar__anchor:hover:hover,.outline-toolbar_disabled.outline-toolbar__anchor:link:hover,.outline-toolbar_disabled.outline-toolbar__anchor:visited:hover,.outline-toolbar_disabled.outline-toolbar__button:hover{color:#999;border-color:#999}.outline-message,.outline-message__content{margin:0;font-size:13px;color:#666;height:40px;line-height:40px;overflow:hidden}.outline-toolbar_disabled .outline-toolbar__button,.outline-toolbar_disabled.outline-toolbar__button{background-color:#f5f5f5}.outline-toolbar_btt,.outline-toolbar_ttb{left:50%;-webkit-transform:translateX(-50%);transform:translateX(-50%)}.outline-toolbar_btt .outline-toolbar__button,.outline-toolbar_ttb .outline-toolbar__button{display:inline-block}.outline-toolbar_ttb{top:12px}.outline-toolbar_ttb.outline-toolbar_hidden{top:-56px}.outline-toolbar_btt{bottom:12px}.outline-toolbar_btt.outline-toolbar_hidden{bottom:-56px}.outline-toolbar_ltr,.outline-toolbar_rtl{-webkit-transform:translateY(-50%);transform:translateY(-50%);width:56px}.outline-toolbar_rtl{top:50%;right:12px}.outline-toolbar_rtl.outline-toolbar_hidden{right:-86px}.outline-toolbar_ltr{top:50%;left:12px}.outline-toolbar_ltr.outline-toolbar_hidden{left:-86px}.outline-toolbar_btt .outline-toolbar__button.outline-toolbar_hidden,.outline-toolbar_ltr .outline-toolbar__button.outline-toolbar_hidden,.outline-toolbar_rtl .outline-toolbar__button.outline-toolbar_hidden,.outline-toolbar_ttb .outline-toolbar__button.outline-toolbar_hidden{display:none}.outline-message{border-radius:3px;box-shadow:0 0 6px 1px #dcdfe6;position:fixed;z-index:9999;opacity:.1;top:-50px;left:50%;padding:0 50px;-webkit-transition:all .5s ease-in-out;transition:all .5s ease-in-out;-webkit-transform:translateX(-50%);transform:translateX(-50%)}.outline-message__content{white-space:nowrap;text-overflow:ellipsis;max-width:700px}.outline-message__close,.outline-message__icon{position:absolute;z-index:2;top:0;width:40px;height:40px;line-height:40px;text-align:center;overflow:hidden}.outline-message__icon{left:0;color:#fff}.outline-message__icon .outline-icon{position:absolute;z-index:2;top:50%;left:50%;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%)}.outline-message__close{right:0;cursor:pointer;color:#999}.outline-message__close .outline-icon{position:absolute;z-index:2;top:50%;left:50%;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%)}.outline-message__close:hover{color:#666}.outline-message_info .outline-message__icon{background-color:#507afe}.outline-message_warning .outline-message__icon{background-color:#ff9901}.outline-message_success .outline-message__icon{background-color:#058942}.outline-message_error .outline-message__icon{background-color:#ff5d5d}.outline-message_plain{min-width:190px;padding:0 50px 0 15px}.outline-message_light,.outline-message_round.outline-message_default{min-width:180px;padding:0 40px}.outline-message_plain.outline-message_info{border-left:5px solid #507afe;background-color:#ecf8ff}.outline-message_plain.outline-message_warning{border-left:5px solid #ff9901;background-color:#fffbe6}.outline-message_plain.outline-message_success{border-left:5px solid #058942;background-color:#e1f6eb}.outline-message_plain.outline-message_error{border-left:5px solid #ff5d5d;background-color:#fff1f0}.outline-message_plain .outline-message__icon{width:0;display:none}.outline-message_plain .outline-message__icon .outline-icon{display:none}.outline-message_light.outline-message_info .outline-message__icon{color:#507afe}.outline-message_light.outline-message_warning .outline-message__icon{color:#ff9901}.outline-message_light.outline-message_success .outline-message__icon{color:#058942}.outline-message_light.outline-message_error .outline-message__icon{color:#ff5d5d}.outline-message_light .outline-message__icon{background-color:#fff}.outline-message_round{border-radius:20px}.outline-message_round.outline-message_default .outline-message__icon{border-radius:10px;top:10px;left:10px;width:20px;height:20px;line-height:20px}.outline-message_round.outline-message_default.outline-message_full-width{min-width:200px;padding:0 20px 0 40px}.outline-message_round.outline-message_plain{min-width:195px;padding:0 40px 0 20px}.outline-message_round.outline-message_plain.outline-message_full-width{min-width:215px;padding:0 20px}.outline-message_full-width{min-width:200px;padding:0 10px 0 50px}.outline-message_full-width.outline-message_plain{min-width:230px;padding:0 10px 0 15px}.outline-message_full-width.outline-message_light{min-width:210px;padding:0 10px 0 40px}.outline-message_visible{opacity:1}.outline-message_hidden{display:none}::-webkit-scrollbar{width:7px;height:7px;-webkit-border-radius:5px}::-webkit-scrollbar-track-piece{-webkit-border-radius:5px}::-webkit-scrollbar-thumb:vertical{background-color:rgba(0,0,0,.25);-webkit-border-radius:5px}::-webkit-scrollbar-thumb:horizontal{background-color:rgba(0,0,0,.25);-webkit-border-radius:5px}::-webkit-scrollbar-thumb:hover{background-color:rgba(0,0,0,.35)}::-webkit-scrollbar:hover{background-color:rgba(0,0,0,.15)} -/*# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlcyI6WyJvdXRsaW5lLmNzcyJdLCJzb3VyY2VzQ29udGVudCI6WyI6cm9vdCB7XG4gIC0tb3V0bGluZS16SW5kZXg6IDIwMDA7XG4gIC0tb3V0bGluZS1zdGlja3ktaGVpZ2h0OiAxMDAlO1xuICAtLW91dGxpbmUtbmF2aWdhdG9yLXdpZHRoOiAxMDAlO1xufVxuLyogPT09PT09PT09PSBjb2xvcnMudGhlbWUgLSDln7rnoYDpopzoibLlj5jph4/pm4blkIggPT09PT09PT09PSAqL1xuLyoqXG4gKiBlbGxpcHNpcy5sZXNzIC0g5paH5pys55yB55WlIG1peGlueCDlh73mlbBcbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIENyZWF0ZWQgQnk6IFlhb2hhaXhpYW9cbiAqIFVwZGF0ZTogMjAyMi4zLjExXG4gKi9cbi8qID09PT09PSDmlofmnKznnIHnlaXlh73mlbAgPT09PT09ICovXG4vKipcbiAqIHNoYWRvdy5sZXNzIC0g6Zi05b2x5qC35byP6K6+572uIG1peGlueCDlh73mlbBcbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIENyZWF0ZWQgQnk6IFlhb2hhaXhpYW9cbiAqIFVwZGF0ZTogMjAyMi4zLjIwXG4gKi9cbi8qID09PT09PSDpmLTlvbHmoLflvI/orr7nva7lh73mlbAgPT09PT09ICovXG4vKiA9PT09PT09PT09IGljb24udGhlbWUgLSBzdmcg5Zu+5qCH55qE5qC35byPID09PT09PT09PT0gKi9cbi5vdXRsaW5lLWljb24ge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIHotaW5kZXg6IDE7XG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgdmVydGljYWwtYWxpZ246IG1pZGRsZTtcbiAgd2lkdGg6IDFlbTtcbiAgaGVpZ2h0OiAxZW07XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4ub3V0bGluZS1pY29uX19zdmcge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHotaW5kZXg6IDI7XG4gIHRvcDogNTAlO1xuICBsZWZ0OiA1MCU7XG4gIHdpZHRoOiAxZW07XG4gIGhlaWdodDogMWVtO1xuICBmaWxsOiBjdXJyZW50Y29sb3I7XG4gIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgLTUwJSk7XG4gICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgLTUwJSk7XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4ub3V0bGluZS1pY29uX2hpZGRlbiB7XG4gIGRpc3BsYXk6IG5vbmU7XG59XG4ub3V0bGluZS1oZWFkaW5nIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICB6LWluZGV4OiAxO1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLm91dGxpbmUtaGVhZGluZ19fYW5jaG9yIHtcbiAgZGlzcGxheTogbm9uZTtcbn1cbi5vdXRsaW5lLWhlYWRpbmdfX2FuY2hvcjpsaW5rLFxuLm91dGxpbmUtaGVhZGluZ19fYW5jaG9yOnZpc2l0ZWQsXG4ub3V0bGluZS1oZWFkaW5nX19hbmNob3I6aG92ZXIge1xuICBjb2xvcjogIzk5OTtcbiAgdGV4dC1kZWNvcmF0aW9uOiBub25lO1xufVxuLm91dGxpbmUtaGVhZGluZ19fYW5jaG9yOmhvdmVyIHtcbiAgY29sb3I6ICM1MDdhZmU7XG59XG4ub3V0bGluZS1oZWFkaW5nOmhvdmVyIC5vdXRsaW5lLWhlYWRpbmdfX2FuY2hvciB7XG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbn1cbi5vdXRsaW5lLWhlYWRpbmdfc3RhcnQ6aG92ZXIge1xuICBvdmVyZmxvdzogdmlzaWJsZTtcbn1cbi5vdXRsaW5lLWhlYWRpbmdfc3RhcnQgLm91dGxpbmUtaGVhZGluZ19fYW5jaG9yIHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB6LWluZGV4OiAyO1xuICB0b3A6IDUwJTtcbiAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTUwJSk7XG4gICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC01MCUpO1xuICBsZWZ0OiAtMWVtO1xufVxuLm91dGxpbmUtZHJhd2VyIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICB6LWluZGV4OiAtMTtcbiAgdG9wOiAwO1xuICBsZWZ0OiAwO1xuICBtYXJnaW46IDA7XG4gIHdpZHRoOiAxMDAlO1xuICBoZWlnaHQ6IDEwMCU7XG4gIC13ZWJraXQtYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICB2aXNpYmlsaXR5OiBoaWRkZW47XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4ub3V0bGluZS1kcmF3ZXJfX21vZGFsIHtcbiAgLXdlYmtpdC1ib3gtc2hhZG93OiAwIDAgNnB4IDFweCAjZGNkZmU2O1xuICAgICAgICAgIGJveC1zaGFkb3c6IDAgMCA2cHggMXB4ICNkY2RmZTY7XG4gIGRpc3BsYXk6IC13ZWJraXQtYm94O1xuICBkaXNwbGF5OiAtbXMtZmxleGJveDtcbiAgZGlzcGxheTogZmxleDtcbiAgLXdlYmtpdC1ib3gtb3JpZW50OiB2ZXJ0aWNhbDtcbiAgLXdlYmtpdC1ib3gtZGlyZWN0aW9uOiBub3JtYWw7XG4gICAgICAtbXMtZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAtbXMtZmxleC13cmFwOiBub3dyYXA7XG4gICAgICBmbGV4LXdyYXA6IG5vd3JhcDtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB6LWluZGV4OiAyMTtcbiAgaGVpZ2h0OiAxMDAlO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmO1xuICAtd2Via2l0LXRyYW5zaXRpb24tZHVyYXRpb246IDAuNHM7XG4gICAgICAgICAgdHJhbnNpdGlvbi1kdXJhdGlvbjogMC40cztcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi5vdXRsaW5lLWRyYXdlcl9faGVhZGVyLFxuLm91dGxpbmUtZHJhd2VyX19tYWluLFxuLm91dGxpbmUtZHJhd2VyX19mb290ZXIge1xuICB3aWR0aDogMTAwJTtcbiAgLXdlYmtpdC1ib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG59XG4ub3V0bGluZS1kcmF3ZXJfX2hlYWRlcixcbi5vdXRsaW5lLWRyYXdlcl9fZm9vdGVyIHtcbiAgLW1zLWZsZXgtbmVnYXRpdmU6IDA7XG4gICAgICBmbGV4LXNocmluazogMDtcbn1cbi5vdXRsaW5lLWRyYXdlcl9fdGl0bGUsXG4ub3V0bGluZS1kcmF3ZXJfX21haW4sXG4ub3V0bGluZS1kcmF3ZXJfX2Zvb3RlciB7XG4gIHBhZGRpbmc6IDAgMTZweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl9faGVhZGVyLFxuLm91dGxpbmUtZHJhd2VyX190aXRsZSB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgei1pbmRleDogMTtcbiAgbWFyZ2luOiAwIGF1dG87XG4gIGhlaWdodDogNTJweDtcbiAgbGluZS1oZWlnaHQ6IDUycHg7XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4ub3V0bGluZS1kcmF3ZXJfX3RpdGxlIHtcbiAgZm9udC1zaXplOiAxNnB4O1xuICBmb250LXdlaWdodDogNDAwO1xuICBtYXJnaW46IDAgMTZweDtcbiAgLXdlYmtpdC1ib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjZGNkZmU2O1xufVxuLm91dGxpbmUtZHJhd2VyX19jbG9zZSB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgei1pbmRleDogMjtcbiAgdG9wOiA1MCU7XG4gIHJpZ2h0OiAxMnB4O1xuICB3aWR0aDogMjBweDtcbiAgaGVpZ2h0OiAyMHB4O1xuICBsaW5lLWhlaWdodDogMjBweDtcbiAgY29sb3I6ICM5OTk7XG4gIGZvbnQtc2l6ZTogMjBweDtcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xuICBjdXJzb3I6IHBvaW50ZXI7XG4gIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC01MCUpO1xuICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtNTAlKTtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi5vdXRsaW5lLWRyYXdlcl9fY2xvc2UgLm91dGxpbmUtaWNvbiB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgei1pbmRleDogMjtcbiAgdG9wOiAwO1xuICBsZWZ0OiAwO1xufVxuLm91dGxpbmUtZHJhd2VyX19jbG9zZTpob3ZlciB7XG4gIGNvbG9yOiAjNjY2O1xufVxuLm91dGxpbmUtZHJhd2VyX19tYWluIHtcbiAgLXdlYmtpdC1ib3gtZmxleDogMTtcbiAgICAgIC1tcy1mbGV4OiAxO1xuICAgICAgICAgIGZsZXg6IDE7XG4gIG92ZXJmbG93OiBhdXRvO1xufVxuLm91dGxpbmUtZHJhd2VyX19tYWluLm92ZXJmbG93LWhpZGRlbiB7XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4ub3V0bGluZS1kcmF3ZXJfX2Zvb3RlciB7XG4gIG1hcmdpbjogMCBhdXRvO1xuICB0ZXh0LWFsaWduOiByaWdodDtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi5vdXRsaW5lLWRyYXdlcl9fb3ZlcmxheSB7XG4gIGNvbnRlbnQ6ICcnO1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIHotaW5kZXg6IDE7XG4gIHRvcDogMDtcbiAgbGVmdDogMDtcbiAgd2lkdGg6IDEwMCU7XG4gIGhlaWdodDogMTAwJTtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjtcbiAgb3BhY2l0eTogMC4xO1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLm91dGxpbmUtZHJhd2VyX3J0bC5vdXRsaW5lLWRyYXdlcl90aW55LFxuLm91dGxpbmUtZHJhd2VyX2x0ci5vdXRsaW5lLWRyYXdlcl90aW55IHtcbiAgd2lkdGg6IDI4MHB4O1xufVxuLm91dGxpbmUtZHJhd2VyX3J0bC5vdXRsaW5lLWRyYXdlcl9taW5pLFxuLm91dGxpbmUtZHJhd2VyX2x0ci5vdXRsaW5lLWRyYXdlcl9taW5pIHtcbiAgd2lkdGg6IDQ4MHB4O1xufVxuLm91dGxpbmUtZHJhd2VyX3J0bC5vdXRsaW5lLWRyYXdlcl9zbWFsbCxcbi5vdXRsaW5lLWRyYXdlcl9sdHIub3V0bGluZS1kcmF3ZXJfc21hbGwge1xuICB3aWR0aDogNTQwcHg7XG59XG4ub3V0bGluZS1kcmF3ZXJfcnRsLm91dGxpbmUtZHJhd2VyX3JlZ3VsYXIsXG4ub3V0bGluZS1kcmF3ZXJfbHRyLm91dGxpbmUtZHJhd2VyX3JlZ3VsYXIge1xuICB3aWR0aDogNjgwcHg7XG59XG4ub3V0bGluZS1kcmF3ZXJfcnRsLm91dGxpbmUtZHJhd2VyX21lZGl1bSxcbi5vdXRsaW5lLWRyYXdlcl9sdHIub3V0bGluZS1kcmF3ZXJfbWVkaXVtIHtcbiAgd2lkdGg6IDcyMHB4O1xufVxuLm91dGxpbmUtZHJhd2VyX3J0bC5vdXRsaW5lLWRyYXdlcl9sYXJnZSxcbi5vdXRsaW5lLWRyYXdlcl9sdHIub3V0bGluZS1kcmF3ZXJfbGFyZ2Uge1xuICB3aWR0aDogOTYwcHg7XG59XG4ub3V0bGluZS1kcmF3ZXJfcnRsIHtcbiAgYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjZGNkZmU2O1xufVxuLm91dGxpbmUtZHJhd2VyX3J0bC5vdXRsaW5lLWRyYXdlcl90aW55Lm91dGxpbmUtZHJhd2VyX2Nsb3NlZCB7XG4gIHJpZ2h0OiAtMjkwcHg7XG59XG4ub3V0bGluZS1kcmF3ZXJfcnRsLm91dGxpbmUtZHJhd2VyX21pbmkub3V0bGluZS1kcmF3ZXJfY2xvc2VkIHtcbiAgcmlnaHQ6IC00OTBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl9ydGwub3V0bGluZS1kcmF3ZXJfc21hbGwub3V0bGluZS1kcmF3ZXJfY2xvc2VkIHtcbiAgcmlnaHQ6IC01NTBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl9ydGwub3V0bGluZS1kcmF3ZXJfcmVndWxhci5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xuICByaWdodDogLTY5MHB4O1xufVxuLm91dGxpbmUtZHJhd2VyX3J0bC5vdXRsaW5lLWRyYXdlcl9tZWRpdW0ub3V0bGluZS1kcmF3ZXJfY2xvc2VkIHtcbiAgcmlnaHQ6IC03MzBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl9ydGwub3V0bGluZS1kcmF3ZXJfbGFyZ2Uub3V0bGluZS1kcmF3ZXJfY2xvc2VkIHtcbiAgcmlnaHQ6IC05NzBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl9sdHIge1xuICBib3JkZXItcmlnaHQ6IDFweCBzb2xpZCAjZGNkZmU2O1xufVxuLm91dGxpbmUtZHJhd2VyX2x0ci5vdXRsaW5lLWRyYXdlcl90aW55Lm91dGxpbmUtZHJhd2VyX2Nsb3NlZCB7XG4gIGxlZnQ6IC0yOTBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl9sdHIub3V0bGluZS1kcmF3ZXJfbWluaS5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xuICBsZWZ0OiAtNDkwcHg7XG59XG4ub3V0bGluZS1kcmF3ZXJfbHRyLm91dGxpbmUtZHJhd2VyX3NtYWxsLm91dGxpbmUtZHJhd2VyX2Nsb3NlZCB7XG4gIGxlZnQ6IC01NTBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl9sdHIub3V0bGluZS1kcmF3ZXJfcmVndWxhci5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xuICBsZWZ0OiAtNjkwcHg7XG59XG4ub3V0bGluZS1kcmF3ZXJfbHRyLm91dGxpbmUtZHJhd2VyX21lZGl1bS5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xuICBsZWZ0OiAtNzMwcHg7XG59XG4ub3V0bGluZS1kcmF3ZXJfbHRyLm91dGxpbmUtZHJhd2VyX2xhcmdlLm91dGxpbmUtZHJhd2VyX2Nsb3NlZCB7XG4gIGxlZnQ6IC05NzBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl90dGIsXG4ub3V0bGluZS1kcmF3ZXJfYnR0IHtcbiAgbGVmdDogMDtcbiAgd2lkdGg6IDEwMCU7XG59XG4ub3V0bGluZS1kcmF3ZXJfdHRiLm91dGxpbmUtZHJhd2VyX3RpbnksXG4ub3V0bGluZS1kcmF3ZXJfYnR0Lm91dGxpbmUtZHJhd2VyX3Rpbnkge1xuICBoZWlnaHQ6IDI0MHB4O1xufVxuLm91dGxpbmUtZHJhd2VyX3R0Yi5vdXRsaW5lLWRyYXdlcl9taW5pLFxuLm91dGxpbmUtZHJhd2VyX2J0dC5vdXRsaW5lLWRyYXdlcl9taW5pIHtcbiAgaGVpZ2h0OiAzMjBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl90dGIub3V0bGluZS1kcmF3ZXJfc21hbGwsXG4ub3V0bGluZS1kcmF3ZXJfYnR0Lm91dGxpbmUtZHJhd2VyX3NtYWxsIHtcbiAgaGVpZ2h0OiAzNjBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl90dGIub3V0bGluZS1kcmF3ZXJfcmVndWxhcixcbi5vdXRsaW5lLWRyYXdlcl9idHQub3V0bGluZS1kcmF3ZXJfcmVndWxhciB7XG4gIGhlaWdodDogNDAwcHg7XG59XG4ub3V0bGluZS1kcmF3ZXJfdHRiLm91dGxpbmUtZHJhd2VyX21lZGl1bSxcbi5vdXRsaW5lLWRyYXdlcl9idHQub3V0bGluZS1kcmF3ZXJfbWVkaXVtIHtcbiAgaGVpZ2h0OiA0NDBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl90dGIub3V0bGluZS1kcmF3ZXJfbGFyZ2UsXG4ub3V0bGluZS1kcmF3ZXJfYnR0Lm91dGxpbmUtZHJhd2VyX2xhcmdlIHtcbiAgaGVpZ2h0OiA0ODBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl90dGIge1xuICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI2RjZGZlNjtcbn1cbi5vdXRsaW5lLWRyYXdlcl90dGIub3V0bGluZS1kcmF3ZXJfdGlueS5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xuICB0b3A6IC0yNTBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl90dGIub3V0bGluZS1kcmF3ZXJfbWluaS5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xuICB0b3A6IC0zMzBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl90dGIub3V0bGluZS1kcmF3ZXJfc21hbGwub3V0bGluZS1kcmF3ZXJfY2xvc2VkIHtcbiAgdG9wOiAtMzcwcHg7XG59XG4ub3V0bGluZS1kcmF3ZXJfdHRiLm91dGxpbmUtZHJhd2VyX3JlZ3VsYXIub3V0bGluZS1kcmF3ZXJfY2xvc2VkIHtcbiAgdG9wOiAtNDEwcHg7XG59XG4ub3V0bGluZS1kcmF3ZXJfdHRiLm91dGxpbmUtZHJhd2VyX21lZGl1bS5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xuICB0b3A6IC00NTBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl90dGIub3V0bGluZS1kcmF3ZXJfbGFyZ2Uub3V0bGluZS1kcmF3ZXJfY2xvc2VkIHtcbiAgdG9wOiAtNDkwcHg7XG59XG4ub3V0bGluZS1kcmF3ZXJfYnR0IHtcbiAgdG9wOiBpbml0aWFsO1xuICBib3JkZXItdG9wOiAxcHggc29saWQgI2RjZGZlNjtcbn1cbi5vdXRsaW5lLWRyYXdlcl9idHQub3V0bGluZS1kcmF3ZXJfdGlueS5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xuICBib3R0b206IC0yNTBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl9idHQub3V0bGluZS1kcmF3ZXJfbWluaS5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xuICBib3R0b206IC0zMzBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl9idHQub3V0bGluZS1kcmF3ZXJfc21hbGwub3V0bGluZS1kcmF3ZXJfY2xvc2VkIHtcbiAgYm90dG9tOiAtMzcwcHg7XG59XG4ub3V0bGluZS1kcmF3ZXJfYnR0Lm91dGxpbmUtZHJhd2VyX3JlZ3VsYXIub3V0bGluZS1kcmF3ZXJfY2xvc2VkIHtcbiAgYm90dG9tOiAtNDEwcHg7XG59XG4ub3V0bGluZS1kcmF3ZXJfYnR0Lm91dGxpbmUtZHJhd2VyX21lZGl1bS5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xuICBib3R0b206IC00NTBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl9idHQub3V0bGluZS1kcmF3ZXJfbGFyZ2Uub3V0bGluZS1kcmF3ZXJfY2xvc2VkIHtcbiAgYm90dG9tOiAtNDkwcHg7XG59XG4ub3V0bGluZS1kcmF3ZXJfb3BlbmVkIHtcbiAgdmlzaWJpbGl0eTogdmlzaWJsZTtcbiAgei1pbmRleDogdmFyKC0tb3V0bGluZS16SW5kZXgpO1xufVxuLm91dGxpbmUtZHJhd2VyX29wZW5lZC5vdXRsaW5lLWRyYXdlciB7XG4gIHBvc2l0aW9uOiBmaXhlZDtcbn1cbi5vdXRsaW5lLWRyYXdlcl9vcGVuZWQub3V0bGluZS1kcmF3ZXJfcnRsIHtcbiAgcmlnaHQ6IDA7XG59XG4ub3V0bGluZS1kcmF3ZXJfb3BlbmVkLm91dGxpbmUtZHJhd2VyX2x0ciB7XG4gIGxlZnQ6IDA7XG59XG4ub3V0bGluZS1kcmF3ZXJfb3BlbmVkLm91dGxpbmUtZHJhd2VyX3R0YiB7XG4gIHRvcDogMDtcbn1cbi5vdXRsaW5lLWRyYXdlcl9vcGVuZWQub3V0bGluZS1kcmF3ZXJfYnR0IHtcbiAgYm90dG9tOiAwO1xufVxuLm91dGxpbmUtZHJhd2VyX29mZnNldC5vdXRsaW5lLWRyYXdlcl9ydGwsXG4ub3V0bGluZS1kcmF3ZXJfb2Zmc2V0Lm91dGxpbmUtZHJhd2VyX2x0ciB7XG4gIGhlaWdodDogY2FsYygxMDAlIC0gNGVtKTtcbiAgdG9wOiA1MCU7XG4gIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC01MCUpO1xuICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtNTAlKTtcbn1cbi5vdXRsaW5lLWRyYXdlcl9vZmZzZXQub3V0bGluZS1kcmF3ZXJfdHRiLFxuLm91dGxpbmUtZHJhd2VyX29mZnNldC5vdXRsaW5lLWRyYXdlcl9idHQge1xuICB3aWR0aDogY2FsYygxMDAlIC0gNGVtKTtcbiAgbGVmdDogNTAlO1xuICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlWCgtNTAlKTtcbiAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTUwJSk7XG59XG4ub3V0bGluZS1kcmF3ZXJfb2Zmc2V0Lm91dGxpbmUtZHJhd2VyX29wZW5lZC5vdXRsaW5lLWRyYXdlcl9ydGwge1xuICByaWdodDogMmVtO1xufVxuLm91dGxpbmUtZHJhd2VyX29mZnNldC5vdXRsaW5lLWRyYXdlcl9vcGVuZWQub3V0bGluZS1kcmF3ZXJfbHRyIHtcbiAgbGVmdDogMmVtO1xufVxuLm91dGxpbmUtZHJhd2VyX29mZnNldC5vdXRsaW5lLWRyYXdlcl9vcGVuZWQub3V0bGluZS1kcmF3ZXJfdHRiIHtcbiAgdG9wOiAyZW07XG59XG4ub3V0bGluZS1kcmF3ZXJfb2Zmc2V0Lm91dGxpbmUtZHJhd2VyX29wZW5lZC5vdXRsaW5lLWRyYXdlcl9idHQge1xuICBib3R0b206IDJlbTtcbn1cbi5vdXRsaW5lLWRyYXdlcl9hdXRvLm91dGxpbmUtZHJhd2VyX3J0bCxcbi5vdXRsaW5lLWRyYXdlcl9hdXRvLm91dGxpbmUtZHJhd2VyX2x0ciB7XG4gIGhlaWdodDogYXV0bztcbiAgbWF4LWhlaWdodDogY2FsYygxMDAlIC0gNGVtKTtcbn1cbi5vdXRsaW5lLWRyYXdlcl9mdWxsIHtcbiAgcGFkZGluZzogMDtcbn1cbi5vdXRsaW5lLW5hdmlnYXRvciB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgei1pbmRleDogMTtcbiAgbWFyZ2luOiAwO1xuICB3aWR0aDogdmFyKC0tb3V0bGluZS1uYXZpZ2F0b3Itd2lkdGgpO1xuICBvdmVyZmxvdzogYXV0bztcbn1cbi5vdXRsaW5lLW5hdmlnYXRvci1wYXJlbnQge1xuICAtd2Via2l0LXRyYW5zaXRpb246IDAuM3MgZWFzZS1pbi1vdXQ7XG4gIHRyYW5zaXRpb246IDAuM3MgZWFzZS1pbi1vdXQ7XG59XG4ub3V0bGluZS1uYXZpZ2F0b3JfX3RpdGxlIHtcbiAgbWFyZ2luOiAwIDE2cHg7XG4gIGhlaWdodDogNDBweDtcbiAgbGluZS1oZWlnaHQ6IDQwcHg7XG4gIHBhZGRpbmc6IDAgMTZweDtcbiAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNkY2RmZTY7XG4gIGZvbnQtc2l6ZTogMTZweDtcbiAgZm9udC13ZWlnaHQ6IDQwMDtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi5vdXRsaW5lLW5hdmlnYXRvcl9fbWFpbiB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgei1pbmRleDogMTtcbiAgbWFyZ2luOiAwO1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLm91dGxpbmUtbmF2aWdhdG9yX19saXN0LFxuLm91dGxpbmUtbmF2aWdhdG9yX19zdWJqZWN0LFxuLm91dGxpbmUtbmF2aWdhdG9yX19pdGVtIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICB6LWluZGV4OiAyO1xuICBtYXJnaW46IDA7XG4gIHBhZGRpbmc6IDA7XG4gIGxpc3Qtc3R5bGUtdHlwZTogbm9uZTtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi5vdXRsaW5lLW5hdmlnYXRvcl9fbGlzdCB7XG4gIHBhZGRpbmc6IDAuNWVtIDA7XG59XG4ub3V0bGluZS1uYXZpZ2F0b3JfX3N1YmplY3Qge1xuICBwYWRkaW5nLWxlZnQ6IDFlbTtcbn1cbi5vdXRsaW5lLW5hdmlnYXRvcl9faXRlbSB7XG4gIG1hcmdpbjogMDtcbiAgbGluZS1oZWlnaHQ6IDMwcHg7XG4gIGZvbnQtc2l6ZTogMTNweDtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi5vdXRsaW5lLW5hdmlnYXRvcl9fcGxhY2Vob2xkZXIge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHotaW5kZXg6IDE7XG4gIHRvcDogMDtcbiAgbGVmdDogMDtcbiAgd2lkdGg6IDEwMCU7XG4gIGhlaWdodDogMzBweDtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2Y3ZjhmOTtcbiAgYm9yZGVyLWxlZnQ6IDJweCBzb2xpZCAjMDU4OTQyO1xuICAtd2Via2l0LXRyYW5zaXRpb24tZHVyYXRpb246IDAuMnM7XG4gICAgICAgICAgdHJhbnNpdGlvbi1kdXJhdGlvbjogMC4ycztcbiAgLXdlYmtpdC1ib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4ub3V0bGluZS1uYXZpZ2F0b3JfX2FuY2hvciB7XG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzO1xuICBvdmVyZmxvdzogaGlkZGVuO1xuICBkaXNwbGF5OiBibG9jaztcbiAgcGFkZGluZzogMCAxLjVlbTtcbn1cbi5vdXRsaW5lLW5hdmlnYXRvcl9fYW5jaG9yOmxpbmssXG4ub3V0bGluZS1uYXZpZ2F0b3JfX2FuY2hvcjp2aXNpdGVkLFxuLm91dGxpbmUtbmF2aWdhdG9yX19hbmNob3I6aG92ZXIge1xuICB0ZXh0LWRlY29yYXRpb246IG5vbmU7XG4gIGNvbG9yOiAjNTU1O1xufVxuLm91dGxpbmUtbmF2aWdhdG9yX19hbmNob3I6aG92ZXIge1xuICBjb2xvcjogIzA1ODk0Mjtcbn1cbi5vdXRsaW5lLW5hdmlnYXRvcl9fY29kZSB7XG4gIHBhZGRpbmctcmlnaHQ6IDAuNWVtO1xufVxuLm91dGxpbmUtbmF2aWdhdG9yX2hpZ2hsaWdodC5vdXRsaW5lLW5hdmlnYXRvcl9fYW5jaG9yOmxpbmssXG4ub3V0bGluZS1uYXZpZ2F0b3JfaGlnaGxpZ2h0Lm91dGxpbmUtbmF2aWdhdG9yX19hbmNob3I6dmlzaXRlZCxcbi5vdXRsaW5lLW5hdmlnYXRvcl9oaWdobGlnaHQub3V0bGluZS1uYXZpZ2F0b3JfX2FuY2hvcjpob3ZlciB7XG4gIGNvbG9yOiAjMDU4OTQyO1xuICBmb250LXdlaWdodDogYm9sZDtcbn1cbi5vdXRsaW5lLW5hdmlnYXRvcl9zdGlja3ksXG4ub3V0bGluZS1uYXZpZ2F0b3JfZml4ZWQge1xuICBkaXNwbGF5OiAtd2Via2l0LWJveDtcbiAgZGlzcGxheTogLW1zLWZsZXhib3g7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIC1tcy1mbGV4LXdyYXA6IG5vd3JhcDtcbiAgICAgIGZsZXgtd3JhcDogbm93cmFwO1xuICAtd2Via2l0LWJveC1vcmllbnQ6IHZlcnRpY2FsO1xuICAtd2Via2l0LWJveC1kaXJlY3Rpb246IG5vcm1hbDtcbiAgICAgIC1tcy1mbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gIHotaW5kZXg6IHZhcigtLW91dGxpbmUtekluZGV4KTtcbiAgdG9wOiAwO1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLm91dGxpbmUtbmF2aWdhdG9yX3N0aWNreSAub3V0bGluZS1uYXZpZ2F0b3JfX3RpdGxlLFxuLm91dGxpbmUtbmF2aWdhdG9yX2ZpeGVkIC5vdXRsaW5lLW5hdmlnYXRvcl9fdGl0bGUsXG4ub3V0bGluZS1uYXZpZ2F0b3Jfc3RpY2t5IC5vdXRsaW5lLW5hdmlnYXRvcl9fbWFpbixcbi5vdXRsaW5lLW5hdmlnYXRvcl9maXhlZCAub3V0bGluZS1uYXZpZ2F0b3JfX21haW4ge1xuICAtd2Via2l0LWJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbn1cbi5vdXRsaW5lLW5hdmlnYXRvcl9zdGlja3kgLm91dGxpbmUtbmF2aWdhdG9yX190aXRsZSxcbi5vdXRsaW5lLW5hdmlnYXRvcl9maXhlZCAub3V0bGluZS1uYXZpZ2F0b3JfX3RpdGxlIHtcbiAgLW1zLWZsZXgtbmVnYXRpdmU6IDA7XG4gICAgICBmbGV4LXNocmluazogMDtcbn1cbi5vdXRsaW5lLW5hdmlnYXRvcl9zdGlja3kgLm91dGxpbmUtbmF2aWdhdG9yX19tYWluLFxuLm91dGxpbmUtbmF2aWdhdG9yX2ZpeGVkIC5vdXRsaW5lLW5hdmlnYXRvcl9fbWFpbiB7XG4gIC13ZWJraXQtYm94LWZsZXg6IDE7XG4gICAgICAtbXMtZmxleDogMTtcbiAgICAgICAgICBmbGV4OiAxO1xuICBvdmVyZmxvdzogYXV0bztcbn1cbi5vdXRsaW5lLW5hdmlnYXRvcl9zdGlja3kge1xuICBwb3NpdGlvbjogc3RpY2t5O1xuICBtYXgtaGVpZ2h0OiB2YXIoLS1vdXRsaW5lLXN0aWNreS1oZWlnaHQpO1xufVxuLm91dGxpbmUtbmF2aWdhdG9yX2ZpeGVkIHtcbiAgcG9zaXRpb246IGZpeGVkO1xuICBtYXgtaGVpZ2h0OiAxMDAlO1xufVxuLm91dGxpbmUtbmF2aWdhdG9yX2hpZGRlbiB7XG4gIGRpc3BsYXk6IG5vbmU7XG59XG4ub3V0bGluZS1uYXZpZ2F0b3JfZm9sZGVkIHtcbiAgd2lkdGg6IDA7XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4vKipcbiAqIGZvbnQubGVzcyAtIOWtl+S9k+ebuOWFs+agt+W8j1xuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogQ3JlYXRlZCBCeTogWWFvaGFpeGlhb1xuICogVXBkYXRlOiAyMDIyLjMuMTZcbiAqL1xuLyogPT09PT09IOWtl+S9kyA9PT09PT0gKi9cbi8qID09PT09PSDlrZfph40gPT09PT09ICovXG4vKiA9PT09PT0g5a2X5Y+3ID09PT09PSAqL1xuLyoqXG4gKiBtaXhpbnMubGVzcyAtIOW3peWFt+WHveaVsFxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogQ3JlYXRlZCBCeTogWWFvaGFpeGlhb1xuICogVXBkYXRlOiAyMDIyLjMuMTFcbiAqL1xuLyoqXG4gKiByYWRpdXMubGVzcyAtIOWchuinkuiuvue9riBtaXhpbngg5Ye95pWwXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBDcmVhdGVkIEJ5OiBZYW9oYWl4aWFvXG4gKiBVcGRhdGU6IDIwMjQuNC4xNlxuICovXG4vKiA9PT09PT0g5ZyG6KeS5qC35byP6K6+572u5Ye95pWwID09PT09PSAqL1xuLm91dGxpbmUtcmVhZGVyX19wcm9ncmVzcyB7XG4gIHBvc2l0aW9uOiBmaXhlZDtcbiAgdG9wOiAwO1xuICBsZWZ0OiAwO1xuICB6LWluZGV4OiAzO1xuICBoZWlnaHQ6IDRweDtcbiAgd2lkdGg6IDEwMCU7XG4gIGJhY2tncm91bmQtY29sb3I6ICM1MDdhZmU7XG4gIHNjYWxlOiAwIDE7XG4gIC13ZWJraXQtdHJhbnNmb3JtLW9yaWdpbjogbGVmdDtcbiAgICAgICAgICB0cmFuc2Zvcm0tb3JpZ2luOiBsZWZ0O1xuICAtd2Via2l0LWFuaW1hdGlvbjogb3V0bGluZS1yZWFkZXItcHJvZ3Jlc3MgbGluZWFyO1xuICAgICAgICAgIGFuaW1hdGlvbjogb3V0bGluZS1yZWFkZXItcHJvZ3Jlc3MgbGluZWFyO1xuICBhbmltYXRpb24tdGltZWxpbmU6IC0tUHJvZ3Jlc3NUaW1lbGluZTtcbn1cbi5vdXRsaW5lLXJlYWRlcl9fcGFwZXIge1xuICAtd2Via2l0LWJveC1zaGFkb3c6IDAgMCA2cHggMXB4ICNkZGQ7XG4gICAgICAgICAgYm94LXNoYWRvdzogMCAwIDZweCAxcHggI2RkZDtcbiAgbWFyZ2luOiAyZW0gYXV0bztcbiAgbWF4LXdpZHRoOiAxMjAwcHg7XG4gIHBhZGRpbmc6IDMuMmVtO1xuICAtd2Via2l0LWJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi5vdXRsaW5lLXJlYWRlcl9fdGl0bGUge1xuICBtYXJnaW46IDAuNjdlbSAwO1xuICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gIGZvbnQtZmFtaWx5OiAtYXBwbGUtc3lzdGVtLCBCbGlua01hY1N5c3RlbUZvbnQsICdTZWdvZSBVSScsICdQaW5nRmFuZyBTQycsICdIaXJhZ2lubyBTYW5zIEdCJywgJ01pY3Jvc29mdCBZYUhlaScsICdIZWx2ZXRpY2EgTmV1ZScsICdBcHBsZSBDb2xvciBFbW9qaScsICdTZWdvZSBVSSBFbW9qaScsICdTZWdvZSBVSSBTeW1ib2wnLCBIZWx2ZXRpY2EsIEFyaWFsLCBzYW5zLXNlcmlmO1xuICBmb250LXdlaWdodDogbm9ybWFsO1xuICBsaW5lLWhlaWdodDogMS4zZW07XG4gIGZvbnQtc2l6ZTogNC4yZW07XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4ub3V0bGluZS1yZWFkZXJfX2FydGljbGUgLm91dGxpbmUtcmVhZGVyX19wcm9ncmVzcyB7XG4gIGRpc3BsYXk6IG5vbmU7XG59XG4ub3V0bGluZS1yZWFkZXJfaGlkZGVuIHtcbiAgZGlzcGxheTogbm9uZTtcbn1cbi5vdXRsaW5lLXJlYWRlcl9oaWRkZW4ub3V0bGluZS1yZWFkZXJfc2libGluZyB7XG4gIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDtcbn1cbi5vdXRsaW5lLXJlYWRlcl9oaWRkZW4ub3V0bGluZS1yZWFkZXJfc2libGluZy53cmFwcGVyLnBvc3Qge1xuICBkaXNwbGF5OiBub25lO1xufVxuLm91dGxpbmUtcmVhZGVyLS1yZWFkaW5nIHtcbiAgZGlzcGxheTogYmxvY2s7XG4gIHBvc2l0aW9uOiBmaXhlZDtcbiAgei1pbmRleDogMjtcbiAgdG9wOiAwO1xuICBsZWZ0OiAwO1xuICB3aWR0aDogMTAwJTtcbiAgaGVpZ2h0OiAxMDAlO1xuICBtYXJnaW46IDA7XG4gIC13ZWJraXQtYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICBwYWRkaW5nOiAzZW0gNGVtO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmFmYWZhO1xuICBzY3JvbGwtdGltZWxpbmUtbmFtZTogLS1Qcm9ncmVzc1RpbWVsaW5lO1xuICBvdmVyZmxvdzogc2Nyb2xsO1xufVxuQC13ZWJraXQta2V5ZnJhbWVzIG91dGxpbmUtcmVhZGVyLXByb2dyZXNzIHtcbiAgdG8ge1xuICAgIHNjYWxlOiAxIDE7XG4gIH1cbn1cbkBrZXlmcmFtZXMgb3V0bGluZS1yZWFkZXItcHJvZ3Jlc3Mge1xuICB0byB7XG4gICAgc2NhbGU6IDEgMTtcbiAgfVxufVxuQG1lZGlhIChtYXgtd2lkdGg6IDUwMHB4KSB7XG4gIC5vdXRsaW5lLXJlYWRlciB7XG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgfVxuICAub3V0bGluZS1yZWFkZXIgLm91dGxpbmUtdG9vbGJhciB7XG4gICAgZGlzcGxheTogLXdlYmtpdC1ib3g7XG4gICAgZGlzcGxheTogLW1zLWZsZXhib3g7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICAtd2Via2l0LWJveC1vcmllbnQ6IGhvcml6b250YWw7XG4gICAgLXdlYmtpdC1ib3gtZGlyZWN0aW9uOiBub3JtYWw7XG4gICAgICAgIC1tcy1mbGV4LWRpcmVjdGlvbjogcm93O1xuICAgICAgICAgICAgZmxleC1kaXJlY3Rpb246IHJvdztcbiAgICAtbXMtZmxleC13cmFwOiBub3dyYXA7XG4gICAgICAgIGZsZXgtd3JhcDogbm93cmFwO1xuICAgIC13ZWJraXQtYm94LWFsaWduOiBjZW50ZXI7XG4gICAgICAgIC1tcy1mbGV4LWFsaWduOiBjZW50ZXI7XG4gICAgICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgIC1tcy1mbGV4LWl0ZW0tYWxpZ246IGF1dG87XG4gICAgICAgIGFsaWduLXNlbGY6IGF1dG87XG4gICAgdG9wOiAxMDAlO1xuICAgIHJpZ2h0OiAwO1xuICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC00OHB4KTtcbiAgICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtNDhweCk7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgaGVpZ2h0OiA0OHB4O1xuICAgIC13ZWJraXQtYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICAgICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgYm9yZGVyLXRvcDogMXB4IHNvbGlkICNkZGQ7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjtcbiAgICBwYWRkaW5nOiAwIDE2cHg7XG4gIH1cbiAgLm91dGxpbmUtcmVhZGVyIC5vdXRsaW5lLXRvb2xiYXJfX2J1dHRvbiB7XG4gICAgYm9yZGVyLXJhZGl1czogMDtcbiAgICAtd2Via2l0LWJveC1mbGV4OiAxO1xuICAgICAgICAtbXMtZmxleDogMTtcbiAgICAgICAgICAgIGZsZXg6IDE7XG4gICAgYm9yZGVyOiBub25lO1xuICAgIC13ZWJraXQtYm94LXNoYWRvdzogbm9uZTtcbiAgICAgICAgICAgIGJveC1zaGFkb3c6IG5vbmU7XG4gIH1cbiAgLm91dGxpbmUtcmVhZGVyLS1yZWFkaW5nIHtcbiAgICBwYWRkaW5nOiAwO1xuICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmY7XG4gICAgLXdlYmtpdC1ib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgICAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgfVxuICAub3V0bGluZS1yZWFkZXJfX3BhcGVyIHtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgei1pbmRleDogMTtcbiAgICBtYXJnaW46IDA7XG4gICAgcGFkZGluZzogMDtcbiAgICBoZWlnaHQ6IDEwMCU7XG4gICAgLXdlYmtpdC1ib3gtc2hhZG93OiBub25lO1xuICAgICAgICAgICAgYm94LXNoYWRvdzogbm9uZTtcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xuICB9XG4gIC5vdXRsaW5lLXJlYWRlcl9fdGl0bGUge1xuICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIHotaW5kZXg6IDM7XG4gICAgdG9wOiAwO1xuICAgIGxlZnQ6IDA7XG4gICAgbWFyZ2luOiAwO1xuICAgIHdpZHRoOiAxMDAlO1xuICAgIGhlaWdodDogNDhweDtcbiAgICBsaW5lLWhlaWdodDogNDhweDtcbiAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI2RkZDtcbiAgICBmb250LXNpemU6IDEuOGVtO1xuICAgIGZvbnQtd2VpZ2h0OiA0MDA7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjtcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xuICB9XG4gIC5vdXRsaW5lLXJlYWRlcl9fYXJ0aWNsZSB7XG4gICAgbWFyZ2luOiA0OHB4IDA7XG4gICAgaGVpZ2h0OiBjYWxjKDEwMCUgLSA5NnB4KTtcbiAgICBwYWRkaW5nOiAwIDEuMjVlbTtcbiAgICBzY3JvbGwtdGltZWxpbmUtbmFtZTogLS1Nb2JpbGVQcm9ncmVzc1RpbWVsaW5lO1xuICAgIG92ZXJmbG93LXg6IGhpZGRlbjtcbiAgICBvdmVyZmxvdy15OiBzY3JvbGw7XG4gIH1cbiAgLm91dGxpbmUtcmVhZGVyX19hcnRpY2xlIC5vdXRsaW5lLXJlYWRlcl9fcHJvZ3Jlc3Mge1xuICAgIHotaW5kZXg6IDQ7XG4gICAgLXdlYmtpdC1hbmltYXRpb246IG91dGxpbmUtcmVhZGVyLXByb2dyZXNzIGxpbmVhcjtcbiAgICAgICAgICAgIGFuaW1hdGlvbjogb3V0bGluZS1yZWFkZXItcHJvZ3Jlc3MgbGluZWFyO1xuICAgIGFuaW1hdGlvbi10aW1lbGluZTogLS1Nb2JpbGVQcm9ncmVzc1RpbWVsaW5lO1xuICAgIGRpc3BsYXk6IGJsb2NrO1xuICB9XG59XG5AbWVkaWEgcHJpbnQge1xuICBodG1sLFxuICBib2R5IHtcbiAgICAvKiDmiZPljbDnmoTln7rnoYDlrZfkvZPlpKflsI8gKi9cbiAgICBmb250LXNpemU6IDEycHQ7XG4gICAgLyog5pi+56S66K6+572u5paH5a2X6aKc6Imy5ZKM6IOM5pmv6aKc6ImyICovXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjtcbiAgICBjb2xvcjogIzMzMztcbiAgICBoZWlnaHQ6IGluaXRpYWwgIWltcG9ydGFudDtcbiAgfVxuICAvKiDorr7nva7pk77mjqXmoLflvI8gKi9cbiAgYTpsaW5rLFxuICBhOnZpc2l0ZWQsXG4gIGE6aG92ZXIge1xuICAgIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lICFpbXBvcnRhbnQ7XG4gICAgY29sb3I6ICM1MDdhZmU7XG4gIH1cbiAgLyog6ZqQ6JeP5aqS5L2T5qCH562+ICovXG4gIHZpZGVvLFxuICBhdWRpbyB7XG4gICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50O1xuICB9XG4gIC8qIOehruS/neihqOagvOWcqOaJk+WNsOaXtueahOi+ueahhuWSjOWvuem9kOaWueW8j+a4heaZsCAqL1xuICB0YWJsZSB7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTtcbiAgfVxuICB0aCxcbiAgdGQge1xuICAgIGJvcmRlcjogMXB4IHNvbGlkICNkY2RmZTY7XG4gICAgcGFkZGluZzogOHB4IDIwcHg7XG4gIH1cbiAgLm91dGxpbmUtbWVzc2FnZSxcbiAgLm91dGxpbmUtdG9vbGJhciB7XG4gICAgLyog6ZqQ6JeP5LqG5bel5YW35qCP5ZKM5L+h5oGv5o+Q56S65qGGICovXG4gICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50O1xuICB9XG4gIC5vdXRsaW5lLXJlYWRlciB7XG4gICAgZGlzcGxheTogYmxvY2sgIWltcG9ydGFudDtcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgIC8qIOWPlua2iOS6hue7neWvueWumuS9jSAqL1xuICAgIC8qIOmakOiXj+mYheivu+i/m+W6puadoSAqL1xuICAgIC8qIOaJk+WNsOaXtuS4jeaYvuekuuato+aWhyBET00g55qE6Zi05b2x5pWI5p6cICovXG4gICAgLyog5omA5pyJ5paH56ug5YaF5a65IERPTSDnm7jlhbPnmoTpgrvlsYXoioLngrnpg73pmpDol4/kuoYgKi9cbiAgfVxuICAub3V0bGluZS1yZWFkZXJfX3RpdGxlIHtcbiAgICBtYXJnaW46IDEzLjRwdCAwIDI4cHQgIWltcG9ydGFudDtcbiAgICB0ZXh0LWFsaWduOiBjZW50ZXIgIWltcG9ydGFudDtcbiAgICBmb250LXNpemU6IDMycHQgIWltcG9ydGFudDtcbiAgfVxuICAub3V0bGluZS1yZWFkZXItLXJlYWRpbmcge1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZSAhaW1wb3J0YW50O1xuICAgIGhlaWdodDogYXV0byAhaW1wb3J0YW50O1xuICAgIHBhZGRpbmc6IDAgIWltcG9ydGFudDtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmO1xuICAgIG92ZXJmbG93OiBoaWRkZW4gIWltcG9ydGFudDtcbiAgfVxuICAub3V0bGluZS1yZWFkZXJfX3Byb2dyZXNzIHtcbiAgICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7XG4gIH1cbiAgLm91dGxpbmUtcmVhZGVyX19wYXBlciB7XG4gICAgLXdlYmtpdC1ib3gtc2hhZG93OiBub25lO1xuICAgICAgICAgICAgYm94LXNoYWRvdzogbm9uZTtcbiAgfVxuICAub3V0bGluZS1yZWFkZXIgcHJlIHtcbiAgICBwYWRkaW5nOiAxZW0gIWltcG9ydGFudDtcbiAgICBib3JkZXI6IDFweCBzb2xpZCAjZGRkICFpbXBvcnRhbnQ7XG4gICAgYm9yZGVyLXJhZGl1czogNHB4ICFpbXBvcnRhbnQ7XG4gIH1cbiAgLm91dGxpbmUtcmVhZGVyIHByZSxcbiAgLm91dGxpbmUtcmVhZGVyIGNvZGUge1xuICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmYgIWltcG9ydGFudDtcbiAgfVxuICAub3V0bGluZS1yZWFkZXIgdGFibGUsXG4gIC5vdXRsaW5lLXJlYWRlciBpbWcsXG4gIC5vdXRsaW5lLXJlYWRlciBzdmcge1xuICAgIC13ZWJraXQtY29sdW1uLWJyZWFrLWluc2lkZTogYXZvaWQ7XG4gICAgICAgLW1vei1jb2x1bW4tYnJlYWstaW5zaWRlOiBhdm9pZDtcbiAgICAgICAgICAgIGJyZWFrLWluc2lkZTogYXZvaWQ7XG4gIH1cbiAgLm91dGxpbmUtcmVhZGVyX3NpYmxpbmcge1xuICAgIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDtcbiAgfVxufVxuLyogPT09PT09PT09PSBidXR0b25zLnRoZW1lIC0g5oyJ6ZKu5a+86Iiq5qC35byPID09PT09PT09PT0gKi9cbi5vdXRsaW5lLXRvb2xiYXIge1xuICBwb3NpdGlvbjogZml4ZWQ7XG4gIHotaW5kZXg6IDk5OTk5O1xuICBtYXJnaW46IDA7XG4gIC13ZWJraXQtdHJhbnNpdGlvbi1kdXJhdGlvbjogMC4zcztcbiAgICAgICAgICB0cmFuc2l0aW9uLWR1cmF0aW9uOiAwLjNzO1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLm91dGxpbmUtdG9vbGJhcl9fYnV0dG9uIHtcbiAgLXdlYmtpdC1ib3gtc2hhZG93OiAwIDAgNnB4IDFweCAjZGNkZmU2O1xuICAgICAgICAgIGJveC1zaGFkb3c6IDAgMCA2cHggMXB4ICNkY2RmZTY7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgei1pbmRleDogMTtcbiAgbWFyZ2luOiAxMHB4O1xuICB3aWR0aDogMzZweDtcbiAgaGVpZ2h0OiAzNnB4O1xuICBib3JkZXI6IDFweCBzb2xpZCAjZGNkZmU2O1xuICBib3JkZXItcmFkaXVzOiAzcHg7XG4gIC13ZWJraXQtYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmO1xuICBjdXJzb3I6IHBvaW50ZXI7XG4gIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgY29sb3I6ICM5OTk7XG4gIC13ZWJraXQtdHJhbnNpdGlvbjogYWxsIDAuM3MgMC4xcyBlYXNlLWluLW91dDtcbiAgdHJhbnNpdGlvbjogYWxsIDAuM3MgMC4xcyBlYXNlLWluLW91dDtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi5vdXRsaW5lLXRvb2xiYXJfX2J1dHRvbjpob3ZlciB7XG4gIGNvbG9yOiAjMDU4OTQyO1xuICBib3JkZXItY29sb3I6ICMwNTg5NDI7XG4gIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZSgxLjM1KTtcbiAgICAgICAgICB0cmFuc2Zvcm06IHNjYWxlKDEuMzUpO1xufVxuLm91dGxpbmUtdG9vbGJhcl9fYnV0dG9uLmhpZGUge1xuICBkaXNwbGF5OiBub25lO1xufVxuLm91dGxpbmUtdG9vbGJhcl9fYW5jaG9yOmxpbmssXG4ub3V0bGluZS10b29sYmFyX19hbmNob3I6dmlzaXRlZCxcbi5vdXRsaW5lLXRvb2xiYXJfX2FuY2hvcjpob3ZlciB7XG4gIGNvbG9yOiAjOTk5O1xuICB0ZXh0LWRlY29yYXRpb246IG5vbmU7XG59XG4ub3V0bGluZS10b29sYmFyX19hbmNob3I6aG92ZXIge1xuICBjb2xvcjogIzA1ODk0Mjtcbn1cbi5vdXRsaW5lLXRvb2xiYXJfX2ljb24ge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHotaW5kZXg6IDI7XG4gIHRvcDogNTAlO1xuICBsZWZ0OiA1MCU7XG4gIHdpZHRoOiAyMHB4O1xuICBoZWlnaHQ6IDIwcHg7XG4gIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgLTUwJSk7XG4gICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgLTUwJSk7XG4gIGZpbGw6IGN1cnJlbnRjb2xvcjtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi5vdXRsaW5lLXRvb2xiYXJfYWN0aXZlLm91dGxpbmUtdG9vbGJhcl9fYnV0dG9uIHtcbiAgY29sb3I6ICNmZmY7XG4gIGJhY2tncm91bmQtY29sb3I6ICMwNTg5NDI7XG4gIGJvcmRlci1jb2xvcjogIzA1ODk0Mjtcbn1cbi5vdXRsaW5lLXRvb2xiYXJfYWN0aXZlLm91dGxpbmUtdG9vbGJhcl9fYnV0dG9uOmhvdmVyIHtcbiAgY29sb3I6ICNmZmY7XG59XG4ub3V0bGluZS10b29sYmFyX2FjdGl2ZSAub3V0bGluZS10b29sYmFyX19hbmNob3I6bGluayxcbi5vdXRsaW5lLXRvb2xiYXJfYWN0aXZlIC5vdXRsaW5lLXRvb2xiYXJfX2FuY2hvcjp2aXNpdGVkLFxuLm91dGxpbmUtdG9vbGJhcl9hY3RpdmUgLm91dGxpbmUtdG9vbGJhcl9fYW5jaG9yOmhvdmVyIHtcbiAgY29sb3I6ICNmZmY7XG59XG4ub3V0bGluZS10b29sYmFyX3JvdW5kZWQub3V0bGluZS10b29sYmFyX19idXR0b24ge1xuICBib3JkZXItcmFkaXVzOiAxOHB4O1xufVxuLm91dGxpbmUtdG9vbGJhcl9kaXNhYmxlZC5vdXRsaW5lLXRvb2xiYXJfX2FuY2hvcjpsaW5rLFxuLm91dGxpbmUtdG9vbGJhcl9kaXNhYmxlZCAub3V0bGluZS10b29sYmFyX19hbmNob3I6bGluayxcbi5vdXRsaW5lLXRvb2xiYXJfZGlzYWJsZWQub3V0bGluZS10b29sYmFyX19hbmNob3I6dmlzaXRlZCxcbi5vdXRsaW5lLXRvb2xiYXJfZGlzYWJsZWQgLm91dGxpbmUtdG9vbGJhcl9fYW5jaG9yOnZpc2l0ZWQsXG4ub3V0bGluZS10b29sYmFyX2Rpc2FibGVkLm91dGxpbmUtdG9vbGJhcl9fYW5jaG9yOmhvdmVyLFxuLm91dGxpbmUtdG9vbGJhcl9kaXNhYmxlZCAub3V0bGluZS10b29sYmFyX19hbmNob3I6aG92ZXIsXG4ub3V0bGluZS10b29sYmFyX2Rpc2FibGVkLm91dGxpbmUtdG9vbGJhcl9fYnV0dG9uLFxuLm91dGxpbmUtdG9vbGJhcl9kaXNhYmxlZCAub3V0bGluZS10b29sYmFyX19idXR0b24ge1xuICBjdXJzb3I6IG5vdC1hbGxvd2VkO1xuICBjb2xvcjogIzk5OTtcbiAgYm9yZGVyLWNvbG9yOiAjOTk5O1xufVxuLm91dGxpbmUtdG9vbGJhcl9kaXNhYmxlZC5vdXRsaW5lLXRvb2xiYXJfX2FuY2hvcjpsaW5rOmhvdmVyLFxuLm91dGxpbmUtdG9vbGJhcl9kaXNhYmxlZCAub3V0bGluZS10b29sYmFyX19hbmNob3I6bGluazpob3Zlcixcbi5vdXRsaW5lLXRvb2xiYXJfZGlzYWJsZWQub3V0bGluZS10b29sYmFyX19hbmNob3I6dmlzaXRlZDpob3Zlcixcbi5vdXRsaW5lLXRvb2xiYXJfZGlzYWJsZWQgLm91dGxpbmUtdG9vbGJhcl9fYW5jaG9yOnZpc2l0ZWQ6aG92ZXIsXG4ub3V0bGluZS10b29sYmFyX2Rpc2FibGVkLm91dGxpbmUtdG9vbGJhcl9fYW5jaG9yOmhvdmVyOmhvdmVyLFxuLm91dGxpbmUtdG9vbGJhcl9kaXNhYmxlZCAub3V0bGluZS10b29sYmFyX19hbmNob3I6aG92ZXI6aG92ZXIsXG4ub3V0bGluZS10b29sYmFyX2Rpc2FibGVkLm91dGxpbmUtdG9vbGJhcl9fYnV0dG9uOmhvdmVyLFxuLm91dGxpbmUtdG9vbGJhcl9kaXNhYmxlZCAub3V0bGluZS10b29sYmFyX19idXR0b246aG92ZXIge1xuICBjb2xvcjogIzk5OTtcbiAgYm9yZGVyLWNvbG9yOiAjOTk5O1xufVxuLm91dGxpbmUtdG9vbGJhcl9kaXNhYmxlZC5vdXRsaW5lLXRvb2xiYXJfX2J1dHRvbixcbi5vdXRsaW5lLXRvb2xiYXJfZGlzYWJsZWQgLm91dGxpbmUtdG9vbGJhcl9fYnV0dG9uIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2Y1ZjVmNTtcbn1cbi5vdXRsaW5lLXRvb2xiYXJfdHRiLFxuLm91dGxpbmUtdG9vbGJhcl9idHQge1xuICBsZWZ0OiA1MCU7XG4gIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC01MCUpO1xuICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgtNTAlKTtcbn1cbi5vdXRsaW5lLXRvb2xiYXJfdHRiIC5vdXRsaW5lLXRvb2xiYXJfX2J1dHRvbixcbi5vdXRsaW5lLXRvb2xiYXJfYnR0IC5vdXRsaW5lLXRvb2xiYXJfX2J1dHRvbiB7XG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbn1cbi5vdXRsaW5lLXRvb2xiYXJfdHRiIHtcbiAgdG9wOiAxMnB4O1xufVxuLm91dGxpbmUtdG9vbGJhcl90dGIub3V0bGluZS10b29sYmFyX2hpZGRlbiB7XG4gIHRvcDogLTU2cHg7XG59XG4ub3V0bGluZS10b29sYmFyX2J0dCB7XG4gIGJvdHRvbTogMTJweDtcbn1cbi5vdXRsaW5lLXRvb2xiYXJfYnR0Lm91dGxpbmUtdG9vbGJhcl9oaWRkZW4ge1xuICBib3R0b206IC01NnB4O1xufVxuLm91dGxpbmUtdG9vbGJhcl9ydGwsXG4ub3V0bGluZS10b29sYmFyX2x0ciB7XG4gIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC01MCUpO1xuICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtNTAlKTtcbiAgd2lkdGg6IDU2cHg7XG59XG4ub3V0bGluZS10b29sYmFyX3J0bCB7XG4gIHRvcDogNTAlO1xuICByaWdodDogMTJweDtcbn1cbi5vdXRsaW5lLXRvb2xiYXJfcnRsLm91dGxpbmUtdG9vbGJhcl9oaWRkZW4ge1xuICByaWdodDogLTg2cHg7XG59XG4ub3V0bGluZS10b29sYmFyX2x0ciB7XG4gIHRvcDogNTAlO1xuICBsZWZ0OiAxMnB4O1xufVxuLm91dGxpbmUtdG9vbGJhcl9sdHIub3V0bGluZS10b29sYmFyX2hpZGRlbiB7XG4gIGxlZnQ6IC04NnB4O1xufVxuLm91dGxpbmUtdG9vbGJhcl90dGIgLm91dGxpbmUtdG9vbGJhcl9fYnV0dG9uLm91dGxpbmUtdG9vbGJhcl9oaWRkZW4sXG4ub3V0bGluZS10b29sYmFyX3J0bCAub3V0bGluZS10b29sYmFyX19idXR0b24ub3V0bGluZS10b29sYmFyX2hpZGRlbixcbi5vdXRsaW5lLXRvb2xiYXJfYnR0IC5vdXRsaW5lLXRvb2xiYXJfX2J1dHRvbi5vdXRsaW5lLXRvb2xiYXJfaGlkZGVuLFxuLm91dGxpbmUtdG9vbGJhcl9sdHIgLm91dGxpbmUtdG9vbGJhcl9fYnV0dG9uLm91dGxpbmUtdG9vbGJhcl9oaWRkZW4ge1xuICBkaXNwbGF5OiBub25lO1xufVxuLm91dGxpbmUtbWVzc2FnZSB7XG4gIGJvcmRlci1yYWRpdXM6IDNweDtcbiAgLXdlYmtpdC1ib3gtc2hhZG93OiAwIDAgNnB4IDFweCAjZGNkZmU2O1xuICAgICAgICAgIGJveC1zaGFkb3c6IDAgMCA2cHggMXB4ICNkY2RmZTY7XG4gIHBvc2l0aW9uOiBmaXhlZDtcbiAgei1pbmRleDogOTk5OTtcbiAgb3BhY2l0eTogMC4xO1xuICB0b3A6IC01MHB4O1xuICBsZWZ0OiA1MCU7XG4gIGhlaWdodDogNDBweDtcbiAgbWFyZ2luOiAwO1xuICBwYWRkaW5nOiAwIDUwcHg7XG4gIGxpbmUtaGVpZ2h0OiA0MHB4O1xuICBmb250LXNpemU6IDEzcHg7XG4gIGJhY2tncm91bmQtY29sb3I6ICNmZmY7XG4gIGNvbG9yOiAjNjY2O1xuICAtd2Via2l0LXRyYW5zaXRpb246IGFsbCAwLjVzIGVhc2UtaW4tb3V0O1xuICB0cmFuc2l0aW9uOiBhbGwgMC41cyBlYXNlLWluLW91dDtcbiAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTUwJSk7XG4gICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC01MCUpO1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLm91dGxpbmUtbWVzc2FnZV9fY29udGVudCB7XG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzO1xuICBtYXJnaW46IDA7XG4gIG1heC13aWR0aDogNzAwcHg7XG4gIGhlaWdodDogNDBweDtcbiAgbGluZS1oZWlnaHQ6IDQwcHg7XG4gIGZvbnQtc2l6ZTogMTNweDtcbiAgY29sb3I6ICM2NjY7XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4ub3V0bGluZS1tZXNzYWdlX19jbG9zZSxcbi5vdXRsaW5lLW1lc3NhZ2VfX2ljb24ge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHotaW5kZXg6IDI7XG4gIHRvcDogMDtcbiAgd2lkdGg6IDQwcHg7XG4gIGhlaWdodDogNDBweDtcbiAgbGluZS1oZWlnaHQ6IDQwcHg7XG4gIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi5vdXRsaW5lLW1lc3NhZ2VfX2ljb24ge1xuICBsZWZ0OiAwO1xuICBjb2xvcjogI2ZmZjtcbn1cbi5vdXRsaW5lLW1lc3NhZ2VfX2ljb24gLm91dGxpbmUtaWNvbiB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgei1pbmRleDogMjtcbiAgdG9wOiA1MCU7XG4gIGxlZnQ6IDUwJTtcbiAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCAtNTAlKTtcbiAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCAtNTAlKTtcbn1cbi5vdXRsaW5lLW1lc3NhZ2VfX2Nsb3NlIHtcbiAgcmlnaHQ6IDA7XG4gIGN1cnNvcjogcG9pbnRlcjtcbiAgY29sb3I6ICM5OTk7XG59XG4ub3V0bGluZS1tZXNzYWdlX19jbG9zZSAub3V0bGluZS1pY29uIHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB6LWluZGV4OiAyO1xuICB0b3A6IDUwJTtcbiAgbGVmdDogNTAlO1xuICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIC01MCUpO1xuICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIC01MCUpO1xufVxuLm91dGxpbmUtbWVzc2FnZV9fY2xvc2U6aG92ZXIge1xuICBjb2xvcjogIzY2Njtcbn1cbi5vdXRsaW5lLW1lc3NhZ2VfaW5mbyAub3V0bGluZS1tZXNzYWdlX19pY29uIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogIzUwN2FmZTtcbn1cbi5vdXRsaW5lLW1lc3NhZ2Vfd2FybmluZyAub3V0bGluZS1tZXNzYWdlX19pY29uIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ZmOTkwMTtcbn1cbi5vdXRsaW5lLW1lc3NhZ2Vfc3VjY2VzcyAub3V0bGluZS1tZXNzYWdlX19pY29uIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogIzA1ODk0Mjtcbn1cbi5vdXRsaW5lLW1lc3NhZ2VfZXJyb3IgLm91dGxpbmUtbWVzc2FnZV9faWNvbiB7XG4gIGJhY2tncm91bmQtY29sb3I6ICNmZjVkNWQ7XG59XG4ub3V0bGluZS1tZXNzYWdlX3BsYWluIHtcbiAgbWluLXdpZHRoOiAxOTBweDtcbiAgcGFkZGluZzogMCA1MHB4IDAgMTVweDtcbn1cbi5vdXRsaW5lLW1lc3NhZ2VfcGxhaW4ub3V0bGluZS1tZXNzYWdlX2luZm8ge1xuICBib3JkZXItbGVmdDogNXB4IHNvbGlkICM1MDdhZmU7XG4gIGJhY2tncm91bmQtY29sb3I6ICNlY2Y4ZmY7XG59XG4ub3V0bGluZS1tZXNzYWdlX3BsYWluLm91dGxpbmUtbWVzc2FnZV93YXJuaW5nIHtcbiAgYm9yZGVyLWxlZnQ6IDVweCBzb2xpZCAjZmY5OTAxO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmYmU2O1xufVxuLm91dGxpbmUtbWVzc2FnZV9wbGFpbi5vdXRsaW5lLW1lc3NhZ2Vfc3VjY2VzcyB7XG4gIGJvcmRlci1sZWZ0OiA1cHggc29saWQgIzA1ODk0MjtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2UxZjZlYjtcbn1cbi5vdXRsaW5lLW1lc3NhZ2VfcGxhaW4ub3V0bGluZS1tZXNzYWdlX2Vycm9yIHtcbiAgYm9yZGVyLWxlZnQ6IDVweCBzb2xpZCAjZmY1ZDVkO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmMWYwO1xufVxuLm91dGxpbmUtbWVzc2FnZV9wbGFpbiAub3V0bGluZS1tZXNzYWdlX19pY29uIHtcbiAgd2lkdGg6IDA7XG4gIGRpc3BsYXk6IG5vbmU7XG59XG4ub3V0bGluZS1tZXNzYWdlX3BsYWluIC5vdXRsaW5lLW1lc3NhZ2VfX2ljb24gLm91dGxpbmUtaWNvbiB7XG4gIGRpc3BsYXk6IG5vbmU7XG59XG4ub3V0bGluZS1tZXNzYWdlX2xpZ2h0IHtcbiAgbWluLXdpZHRoOiAxODBweDtcbiAgcGFkZGluZzogMCA0MHB4O1xufVxuLm91dGxpbmUtbWVzc2FnZV9saWdodC5vdXRsaW5lLW1lc3NhZ2VfaW5mbyAub3V0bGluZS1tZXNzYWdlX19pY29uIHtcbiAgY29sb3I6ICM1MDdhZmU7XG59XG4ub3V0bGluZS1tZXNzYWdlX2xpZ2h0Lm91dGxpbmUtbWVzc2FnZV93YXJuaW5nIC5vdXRsaW5lLW1lc3NhZ2VfX2ljb24ge1xuICBjb2xvcjogI2ZmOTkwMTtcbn1cbi5vdXRsaW5lLW1lc3NhZ2VfbGlnaHQub3V0bGluZS1tZXNzYWdlX3N1Y2Nlc3MgLm91dGxpbmUtbWVzc2FnZV9faWNvbiB7XG4gIGNvbG9yOiAjMDU4OTQyO1xufVxuLm91dGxpbmUtbWVzc2FnZV9saWdodC5vdXRsaW5lLW1lc3NhZ2VfZXJyb3IgLm91dGxpbmUtbWVzc2FnZV9faWNvbiB7XG4gIGNvbG9yOiAjZmY1ZDVkO1xufVxuLm91dGxpbmUtbWVzc2FnZV9saWdodCAub3V0bGluZS1tZXNzYWdlX19pY29uIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjtcbn1cbi5vdXRsaW5lLW1lc3NhZ2Vfcm91bmQge1xuICBib3JkZXItcmFkaXVzOiAyMHB4O1xufVxuLm91dGxpbmUtbWVzc2FnZV9yb3VuZC5vdXRsaW5lLW1lc3NhZ2VfZGVmYXVsdCB7XG4gIG1pbi13aWR0aDogMTgwcHg7XG4gIHBhZGRpbmc6IDAgNDBweDtcbn1cbi5vdXRsaW5lLW1lc3NhZ2Vfcm91bmQub3V0bGluZS1tZXNzYWdlX2RlZmF1bHQgLm91dGxpbmUtbWVzc2FnZV9faWNvbiB7XG4gIGJvcmRlci1yYWRpdXM6IDEwcHg7XG4gIHRvcDogMTBweDtcbiAgbGVmdDogMTBweDtcbiAgd2lkdGg6IDIwcHg7XG4gIGhlaWdodDogMjBweDtcbiAgbGluZS1oZWlnaHQ6IDIwcHg7XG59XG4ub3V0bGluZS1tZXNzYWdlX3JvdW5kLm91dGxpbmUtbWVzc2FnZV9kZWZhdWx0Lm91dGxpbmUtbWVzc2FnZV9mdWxsLXdpZHRoIHtcbiAgbWluLXdpZHRoOiAyMDBweDtcbiAgcGFkZGluZzogMCAyMHB4IDAgNDBweDtcbn1cbi5vdXRsaW5lLW1lc3NhZ2Vfcm91bmQub3V0bGluZS1tZXNzYWdlX3BsYWluIHtcbiAgbWluLXdpZHRoOiAxOTVweDtcbiAgcGFkZGluZzogMCA0MHB4IDAgMjBweDtcbn1cbi5vdXRsaW5lLW1lc3NhZ2Vfcm91bmQub3V0bGluZS1tZXNzYWdlX3BsYWluLm91dGxpbmUtbWVzc2FnZV9mdWxsLXdpZHRoIHtcbiAgbWluLXdpZHRoOiAyMTVweDtcbiAgcGFkZGluZzogMCAyMHB4O1xufVxuLm91dGxpbmUtbWVzc2FnZV9mdWxsLXdpZHRoIHtcbiAgbWluLXdpZHRoOiAyMDBweDtcbiAgcGFkZGluZzogMCAxMHB4IDAgNTBweDtcbn1cbi5vdXRsaW5lLW1lc3NhZ2VfZnVsbC13aWR0aC5vdXRsaW5lLW1lc3NhZ2VfcGxhaW4ge1xuICBtaW4td2lkdGg6IDIzMHB4O1xuICBwYWRkaW5nOiAwIDEwcHggMCAxNXB4O1xufVxuLm91dGxpbmUtbWVzc2FnZV9mdWxsLXdpZHRoLm91dGxpbmUtbWVzc2FnZV9saWdodCB7XG4gIG1pbi13aWR0aDogMjEwcHg7XG4gIHBhZGRpbmc6IDAgMTBweCAwIDQwcHg7XG59XG4ub3V0bGluZS1tZXNzYWdlX3Zpc2libGUge1xuICBvcGFjaXR5OiAxO1xufVxuLm91dGxpbmUtbWVzc2FnZV9oaWRkZW4ge1xuICBkaXNwbGF5OiBub25lO1xufVxuLyogPT09PT0gU2Nyb2xsYmFyID09PT09ICovXG46Oi13ZWJraXQtc2Nyb2xsYmFyIHtcbiAgd2lkdGg6IDdweDtcbiAgaGVpZ2h0OiA3cHg7XG4gIC13ZWJraXQtYm9yZGVyLXJhZGl1czogNXB4O1xufVxuOjotd2Via2l0LXNjcm9sbGJhci10cmFjay1waWVjZSB7XG4gIC13ZWJraXQtYm9yZGVyLXJhZGl1czogNXB4O1xufVxuOjotd2Via2l0LXNjcm9sbGJhci10aHVtYjp2ZXJ0aWNhbCB7XG4gIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMCwgMCwgMCwgMC4yNSk7XG4gIC13ZWJraXQtYm9yZGVyLXJhZGl1czogNXB4O1xufVxuOjotd2Via2l0LXNjcm9sbGJhci10aHVtYjpob3Jpem9udGFsIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjI1KTtcbiAgLXdlYmtpdC1ib3JkZXItcmFkaXVzOiA1cHg7XG59XG46Oi13ZWJraXQtc2Nyb2xsYmFyLXRodW1iOmhvdmVyIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjM1KTtcbn1cbjo6LXdlYmtpdC1zY3JvbGxiYXI6aG92ZXIge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuMTUpO1xufVxuXG4vKiMgc291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247Y2hhcnNldD11dGY4O2Jhc2U2NCxleUoyWlhKemFXOXVJam96TENKemIzVnlZMlZ6SWpwYkluWmhjbWxoWW14bGN5NXNaWE56SWl3aUxpNHZQR2x1Y0hWMElHTnpjeUEyUGlJc0ltbGpiMjV6TG14bGMzTWlMQ0poYm1Ob2IzSnpMbXhsYzNNaUxDSmtjbUYzWlhJdWJHVnpjeUlzSW5Ob1lXUnZkeTVzWlhOeklpd2libUYyYVdkaGRHOXlMbXhsYzNNaUxDSmxiR3hwY0hOcGN5NXNaWE56SWl3aWNtVmhaR1Z5TG14bGMzTWlMQ0p5WVdScGRYTXViR1Z6Y3lJc0luUnZiMnhpWVhJdWJHVnpjeUlzSW0xbGMzTmhaMlV1YkdWemN5SXNJbk5qY205c2JHSmhjaTVzWlhOeklsMHNJbTVoYldWeklqcGJYU3dpYldGd2NHbHVaM01pT2lKQlFVRkJPMFZCUTBNc2RVSkJRVUU3UlVGRFJDdzRRa0ZCUVR0RlFVRnBReXhuUTBGQlFUdERRMFZvUXp0QlFVTkVMRzFFUVVGdFJEdEJRVU51UkRzN096czdSMEZMUnp0QlFVTklMREJDUVVFd1FqdEJRVU14UWpzN096czdSMEZMUnp0QlFVTklMRFJDUVVFMFFqdEJRVU0xUWl4clJFRkJhMFE3UVVOd1FrTTdSVUZGYmtRc2JVSkJRVUU3UlVGQmMwSXNWMEZCUVR0RlFVTlVMSE5DUVVGQk8wVkJRMVVzZFVKQlFVRTdSVUZEUVN4WFFVRkJPMFZCUTJJc1dVRkJRVHRGUVVOQkxHbENRVUZCTzBORWMwSlVPMEZEY2tKak8wVkJSVllzYlVKQlFVRTdSVUZEV1N4WFFVRkJPMFZCUTFRc1UwRkJRVHRGUVVOSUxGVkJRVUU3UlVGRFFTeFhRVUZCTzBWQlEwRXNXVUZCUVR0RlFVTkJMRzFDUVVGQk8wVkJRMDBzZVVOQlFVRTdWVUZCUVN4cFEwRkJRVHRGUVVOaExHbENRVUZCTzBORWMwSjJRanRCUTNKQ1V6dEZRVU5TTEdOQlFVRTdRMFIxUWtRN1FVVjZRMFE3UlVGRFJTeHRRa0ZCUVR0RlFVTkJMRmRCUVVFN1JVRkRRU3hwUWtGQlFUdERSakpEUkR0QlJYcERRenRGUVVORkxHTkJRVUU3UTBZeVEwZzdRVVY2UTBjN096dEZRVWRGTEZsQlFVRTdSVUZEUVN4elFrRkJRVHREUmpKRFREdEJSWGhEUnp0RlFVTkZMR1ZCUVVFN1EwWXdRMHc3UVVWMFEwTTdSVUZGU1N4elFrRkJRVHREUm5WRFREdEJSV3hEUnp0RlFVTkZMR3RDUVVGQk8wTkdiME5NTzBGRmRFTkRPMFZCVFVrc2JVSkJRVUU3UlVGRFFTeFhRVUZCTzBWQlEwRXNVMEZCUVR0RlFVTkJMRzlEUVVGQk8xVkJRVUVzTkVKQlFVRTdSVUZEUVN4WFFVRkJPME5HYlVOTU8wRkhja1ZFTzBWQlEwVXNiVUpCUVVFN1JVRkRRU3haUVVGQk8wVkJRMEVzVDBGQlFUdEZRVU5CTEZGQlFVRTdSVUZEUVN4VlFVRkJPMFZCUTBFc1dVRkJRVHRGUVVOQkxHRkJRVUU3UlVGRFFTd3JRa0ZCUVR0VlFVRkJMSFZDUVVGQk8wVkJRMEVzYlVKQlFVRTdSVUZEUVN4cFFrRkJRVHREU0hWRlJEdEJSM0pGUXp0RlExQnpSQ3gzUTBGQlFUdFZRVUZCTEdkRFFVRkJPMFZFVTNCRUxIRkNRVUZCTzBWQlFVRXNjVUpCUVVFN1JVRkJRU3hqUVVGQk8wVkJRMEVzTmtKQlFVRTdSVUZCUVN3NFFrRkJRVHROUVVGQkxESkNRVUZCTzFWQlFVRXNkVUpCUVVFN1JVRkRRU3h6UWtGQlFUdE5RVUZCTEd0Q1FVRkJPMFZCUTBFc2JVSkJRVUU3UlVGRFFTeFpRVUZCTzBWQlEwRXNZVUZCUVR0RlFVTkJMSFZDUVVGQk8wVkJRMEVzYTBOQlFVRTdWVUZCUVN3d1FrRkJRVHRGUVVOQkxHbENRVUZCTzBOSWRVVklPMEZIY0VWRE96czdSVUZIUlN4WlFVRkJPMFZCUTBFc0swSkJRVUU3VlVGQlFTeDFRa0ZCUVR0RFNITkZTRHRCUjI1RlF6czdSVUZGUlN4eFFrRkJRVHROUVVGQkxHVkJRVUU3UTBoeFJVZzdRVWRzUlVNN096dEZRVWRGTEdkQ1FVRkJPME5JYjBWSU8wRkhha1ZET3p0RlFVVkZMRzFDUVVGQk8wVkJRMEVzVjBGQlFUdEZRVU5CTEdWQlFVRTdSVUZEUVN4aFFVRkJPMFZCUTBFc2EwSkJRVUU3UlVGRFFTeHBRa0ZCUVR0RFNHMUZTRHRCUjJoRlF6dEZRVU5GTEdkQ1FVRkJPMFZCUTBFc2FVSkJRVUU3UlVGRFFTeGxRVUZCTzBWQlEwRXNLMEpCUVVFN1ZVRkJRU3gxUWtGQlFUdEZRVU5CTEdsRFFVRkJPME5JYTBWSU8wRkhMMFJETzBWQlEwVXNiVUpCUVVFN1JVRkRRU3hYUVVGQk8wVkJRMEVzVTBGQlFUdEZRVU5CTEZsQlFVRTdSVUZEUVN4WlFVRkJPMFZCUTBFc1lVRkJRVHRGUVVOQkxHdENRVUZCTzBWQlEwRXNXVUZCUVR0RlFVTkJMR2RDUVVGQk8wVkJRMEVzYlVKQlFVRTdSVUZEUVN4blFrRkJRVHRGUVVOQkxHOURRVUZCTzFWQlFVRXNORUpCUVVFN1JVRkRRU3hwUWtGQlFUdERTR2xGU0R0QlJ6bEZRenRGUVdkQ1NTeHRRa0ZCUVR0RlFVTkJMRmRCUVVFN1JVRkRRU3hQUVVGQk8wVkJRMEVzVVVGQlFUdERTR2xGVER0QlJ6bEVSenRGUVVORkxGbEJRVUU3UTBoblJVdzdRVWMxUkVNN1JVRkRSU3h2UWtGQlFUdE5RVUZCTEZsQlFVRTdWVUZCUVN4UlFVRkJPMFZCUTBFc1pVRkJRVHREU0RoRVNEdEJSelZFUnp0RlFVTkZMR2xDUVVGQk8wTklPRVJNTzBGSE1VUkRPMFZCUTBVc1pVRkJRVHRGUVVOQkxHdENRVUZCTzBWQlEwRXNhVUpCUVVFN1EwZzBSRWc3UVVkNlJFTTdSVUZEUlN4WlFVRkJPMFZCUTBFc2JVSkJRVUU3UlVGRFFTeFhRVUZCTzBWQlEwRXNUMEZCUVR0RlFVTkJMRkZCUVVFN1JVRkRRU3haUVVGQk8wVkJRMEVzWVVGQlFUdEZRVU5CTEhWQ1FVRkJPMFZCUTBFc1lVRkJRVHRGUVVOQkxHbENRVUZCTzBOSU1rUklPMEZIY2tSTE96dEZRVU5GTEdGQlFVRTdRMGgzUkZBN1FVZHlSRXM3TzBWQlEwVXNZVUZCUVR0RFNIZEVVRHRCUjNKRVN6czdSVUZEUlN4aFFVRkJPME5JZDBSUU8wRkhja1JMT3p0RlFVTkZMR0ZCUVVFN1EwaDNSRkE3UVVkeVJFczdPMFZCUTBVc1lVRkJRVHREU0hkRVVEdEJSM0pFU3pzN1JVRkRSU3hoUVVGQk8wTklkMFJRTzBGSGJrUkRPMFZCUTBVc0swSkJRVUU3UTBoeFJFZzdRVWRxUkU4N1JVRkRSU3hqUVVGQk8wTkliVVJVTzBGSE9VTlBPMFZCUTBVc1kwRkJRVHREU0dkRVZEdEJSek5EVHp0RlFVTkZMR05CUVVFN1EwZzJRMVE3UVVkNFEwODdSVUZEUlN4alFVRkJPME5JTUVOVU8wRkhja05QTzBWQlEwVXNZMEZCUVR0RFNIVkRWRHRCUjJ4RFR6dEZRVU5GTEdOQlFVRTdRMGh2UTFRN1FVYzVRa003UlVGRFJTeG5RMEZCUVR0RFNHZERTRHRCUnpWQ1R6dEZRVU5GTEdGQlFVRTdRMGc0UWxRN1FVZDZRazg3UlVGRFJTeGhRVUZCTzBOSU1rSlVPMEZIZEVKUE8wVkJRMFVzWVVGQlFUdERTSGRDVkR0QlIyNUNUenRGUVVORkxHRkJRVUU3UTBoeFFsUTdRVWRvUWs4N1JVRkRSU3hoUVVGQk8wTklhMEpVTzBGSFlrODdSVUZEUlN4aFFVRkJPME5JWlZRN1FVZFVRenM3UlVGRlJTeFJRVUZCTzBWQlEwRXNXVUZCUVR0RFNGZElPMEZIVWtzN08wVkJRMFVzWTBGQlFUdERTRmRRTzBGSFVrczdPMFZCUTBVc1kwRkJRVHREU0ZkUU8wRkhVa3M3TzBWQlEwVXNZMEZCUVR0RFNGZFFPMEZIVWtzN08wVkJRMFVzWTBGQlFUdERTRmRRTzBGSFVrczdPMFZCUTBVc1kwRkJRVHREU0ZkUU8wRkhVa3M3TzBWQlEwVXNZMEZCUVR0RFNGZFFPMEZIVGtNN1JVRkRSU3hwUTBGQlFUdERTRkZJTzBGSFNrODdSVUZEUlN4WlFVRkJPME5JVFZRN1FVZEVUenRGUVVORkxGbEJRVUU3UTBoSFZEdEJSMFZQTzBWQlEwVXNXVUZCUVR0RFNFRlVPMEZIUzA4N1JVRkRSU3haUVVGQk8wTklTRlE3UVVkUlR6dEZRVU5GTEZsQlFVRTdRMGhPVkR0QlIxZFBPMFZCUTBVc1dVRkJRVHREU0ZSVU8wRkhaVU03UlVGRFJTeGhRVUZCTzBWQlEwRXNPRUpCUVVFN1EwaGlTRHRCUjJsQ1R6dEZRVU5GTEdWQlFVRTdRMGhtVkR0QlIyOUNUenRGUVVORkxHVkJRVUU3UTBoc1FsUTdRVWQxUWs4N1JVRkRSU3hsUVVGQk8wTklja0pVTzBGSE1FSlBPMFZCUTBVc1pVRkJRVHREU0hoQ1ZEdEJSelpDVHp0RlFVTkZMR1ZCUVVFN1EwZ3pRbFE3UVVkblEwODdSVUZEUlN4bFFVRkJPME5JT1VKVU8wRkhiME5ETzBWQlEwVXNiMEpCUVVFN1JVRkRRU3dyUWtGQlFUdERTR3hEU0R0QlIyOURSenRGUVVORkxHZENRVUZCTzBOSWJFTk1PMEZIYjBOTE8wVkJRMFVzVTBGQlFUdERTR3hEVUR0QlIzRkRTenRGUVVORkxGRkJRVUU3UTBodVExQTdRVWR6UTBzN1JVRkRSU3hQUVVGQk8wTkljRU5RTzBGSGRVTkxPMFZCUTBVc1ZVRkJRVHREU0hKRFVEdEJSelJEU3pzN1JVRkZSU3g1UWtGQlFUdEZRVU5CTEZOQlFVRTdSVUZEUVN4dlEwRkJRVHRWUVVGQkxEUkNRVUZCTzBOSU1VTlFPMEZITmtOTE96dEZRVVZGTEhkQ1FVRkJPMFZCUTBFc1ZVRkJRVHRGUVVOQkxHOURRVUZCTzFWQlFVRXNORUpCUVVFN1EwZ3pRMUE3UVVkblJGTTdSVUZEUlN4WFFVRkJPME5JT1VOWU8wRkhhVVJUTzBWQlEwVXNWVUZCUVR0RFNDOURXRHRCUjJ0RVV6dEZRVU5GTEZOQlFVRTdRMGhvUkZnN1FVZHRSRk03UlVGRFJTeFpRVUZCTzBOSWFrUllPMEZITUVSTE96dEZRVVZGTEdGQlFVRTdSVUZEUVN3MlFrRkJRVHREU0hoRVVEdEJSelpFUXp0RlFVTkZMRmRCUVVFN1EwZ3pSRWc3UVV0NlYwUTdSVUZEUlN4dFFrRkJRVHRGUVVOQkxGZEJRVUU3UlVGRFFTeFZRVUZCTzBWQlEwRXNjME5CUVVFN1JVRkRRU3hsUVVGQk8wTk1NbGRFTzBGTGVsZERPMFZCUTBVc2NVTkJRVUU3UlVGQlFTdzJRa0ZCUVR0RFRESlhTRHRCUzNoWFF6dEZRVU5GTEdWQlFVRTdSVUZEUVN4aFFVRkJPMFZCUTBFc2EwSkJRVUU3UlVGRFFTeG5Ra0ZCUVR0RlFVTkJMR2xEUVVGQk8wVkJRMEVzWjBKQlFVRTdSVUZEUVN4cFFrRkJRVHRGUVVOQkxHbENRVUZCTzBOTU1GZElPMEZMZGxkRE8wVkJRMFVzYlVKQlFVRTdSVUZEUVN4WFFVRkJPMFZCUTBFc1ZVRkJRVHRGUVVOQkxHbENRVUZCTzBOTWVWZElPMEZMZEZkRE96czdSVUZIUlN4dFFrRkJRVHRGUVVOQkxGZEJRVUU3UlVGRFFTeFZRVUZCTzBWQlEwRXNWMEZCUVR0RlFVTkJMSE5DUVVGQk8wVkJRMEVzYVVKQlFVRTdRMHgzVjBnN1FVdHlWME03UlVGRFJTeHBRa0ZCUVR0RFRIVlhTRHRCUzNCWFF6dEZRVU5GTEd0Q1FVRkJPME5NYzFkSU8wRkxibGRETzBWQlEwVXNWVUZCUVR0RlFVTkJMR3RDUVVGQk8wVkJRMEVzWjBKQlFVRTdSVUZEUVN4cFFrRkJRVHREVEhGWFNEdEJTMnhYUXp0RlFVTkZMRzFDUVVGQk8wVkJRMEVzVjBGQlFUdEZRVU5CTEU5QlFVRTdSVUZEUVN4UlFVRkJPMFZCUTBFc1dVRkJRVHRGUVVOQkxHRkJRVUU3UlVGRFFTd3dRa0ZCUVR0RlFVTkJMQ3RDUVVGQk8wVkJRMEVzYTBOQlFVRTdWVUZCUVN3d1FrRkJRVHRGUVVOQkxDdENRVUZCTzFWQlFVRXNkVUpCUVVFN1JVRkRRU3hwUWtGQlFUdERURzlYU0R0QlMycFhRenRGUTJwRk5rSXNiMEpCUVVFN1JVRkRaaXgzUWtGQlFUdEZRVU5ITEdsQ1FVRkJPMFZFYVVWbUxHVkJRVUU3UlVGRFFTeHBRa0ZCUVR0RFRIRlhTRHRCUzI1WFJ6czdPMFZCUjBVc2MwSkJRVUU3UlVGRFFTeFpRVUZCTzBOTWNWZE1PMEZMYkZkSE8wVkJRMFVzWlVGQlFUdERURzlYVER0QlMyaFhRenRGUVVORkxIRkNRVUZCTzBOTWExZElPMEZMTjFaTE96czdSVUZIUlN4bFFVRkJPMFZCUTBFc2EwSkJRVUU3UTB3clZsQTdRVXN4VmtNN08wVkJSVVVzY1VKQlFVRTdSVUZCUVN4eFFrRkJRVHRGUVVGQkxHTkJRVUU3UlVGRFFTeHpRa0ZCUVR0TlFVRkJMR3RDUVVGQk8wVkJRMEVzTmtKQlFVRTdSVUZCUVN3NFFrRkJRVHROUVVGQkxESkNRVUZCTzFWQlFVRXNkVUpCUVVFN1JVRkRRU3dyUWtGQlFUdEZRVU5CTEU5QlFVRTdSVUZEUVN4cFFrRkJRVHREVERSV1NEdEJTM3BXU3pzN096dEZRVVZGTEN0Q1FVRkJPMVZCUVVFc2RVSkJRVUU3UTB3MlZsQTdRVXN4VmtzN08wVkJRMFVzY1VKQlFVRTdUVUZCUVN4bFFVRkJPME5NTmxaUU8wRkxNVlpMT3p0RlFVTkZMRzlDUVVGQk8wMUJRVUVzV1VGQlFUdFZRVUZCTEZGQlFVRTdSVUZEUVN4bFFVRkJPME5NTmxaUU8wRkxlRlpETzBWQlEwVXNhVUpCUVVFN1JVRkRRU3g1UTBGQlFUdERUREJXU0R0QlMzWldRenRGUVVORkxHZENRVUZCTzBWQlEwRXNhVUpCUVVFN1EweDVWa2c3UVV0MFZrTTdSVUZEUlN4alFVRkJPME5NZDFaSU8wRkxjbFpETzBWQlEwVXNVMEZCUVR0RlFVTkJMR2xDUVVGQk8wTk1kVlpJTzBGQlEwUTdPenM3TzBkQlMwYzdRVUZEU0N4elFrRkJjMEk3UVVGRGRFSXNjMEpCUVhOQ08wRkJRM1JDTEhOQ1FVRnpRanRCUVVOMFFqczdPenM3UjBGTFJ6dEJRVU5JT3pzN096dEhRVXRITzBGQlEwZ3NORUpCUVRSQ08wRlBNMll4UWp0RlFVTkZMR2RDUVVGQk8wVkJRMEVzVDBGQlFUdEZRVU5CTEZGQlFVRTdSVUZEUVN4WFFVRkJPMFZCUTBFc1dVRkJRVHRGUVVOQkxGbEJRVUU3UlVGRFFTd3dRa0ZCUVR0RlFVTkJMRmRCUVVFN1JVRkRRU3dyUWtGQlFUdFZRVUZCTEhWQ1FVRkJPMFZCUTBFc2EwUkJRVUU3VlVGQlFTd3dRMEZCUVR0RlFVTkJMSFZEUVVGQk8wTlFObVpJTzBGUE1XWkRPMFZJVm5ORUxIRkRRVUZCTzFWQlFVRXNOa0pCUVVFN1JVZFpjRVFzYVVKQlFVRTdSVUZEUVN4clFrRkJRVHRGUVVOQkxHVkJRVUU3UlVGRFFTd3JRa0ZCUVR0VlFVRkJMSFZDUVVGQk8wVkJRMEVzZFVKQlFVRTdSVUZEUVN4cFFrRkJRVHREVURSbVNEdEJUM3BtUXp0RlFVTkZMR2xDUVVGQk8wVkJRMEVzYlVKQlFVRTdSVUZEUVN3eVRrRkJRVHRGUVVOQkxHOUNRVUZCTzBWQlEwRXNiVUpCUVVFN1JVRkRRU3hwUWtGQlFUdEZRVU5CTEdsQ1FVRkJPME5RTW1aSU8wRlBlR1pETzBWQlJVa3NZMEZCUVR0RFVIbG1URHRCVDNKbVF6dEZRVU5GTEdOQlFVRTdRMUIxWmtnN1FVOXlaa2M3UlVGRFJTeDVRa0ZCUVR0RFVIVm1URHRCVDNCbVR6dEZRVU5GTEdOQlFVRTdRMUJ6WmxRN1FVOW9aa003UlVGRFJTeGxRVUZCTzBWQlEwRXNaMEpCUVVFN1JVRkRRU3hYUVVGQk8wVkJRMEVzVDBGQlFUdEZRVU5CTEZGQlFVRTdSVUZEUVN4WlFVRkJPMFZCUTBFc1lVRkJRVHRGUVVOQkxGVkJRVUU3UlVGRFFTd3JRa0ZCUVR0VlFVRkJMSFZDUVVGQk8wVkJRMEVzYVVKQlFVRTdSVUZEUVN3d1FrRkJRVHRGUVVOQkxIbERRVUZCTzBWQlEwRXNhVUpCUVVFN1ExQnJaa2c3UVU4NVpVUTdSVUZEUlR0SlFVTkZMRmRCUVVFN1IxQm5aa1E3UTBGRFJqdEJUMjVtUkR0RlFVTkZPMGxCUTBVc1YwRkJRVHRIVUdkbVJEdERRVU5HTzBGUE4yVkVPMFZCUlVrN1NVRkRSU3hwUWtGQlFUdEhVRGhsU0R0RlR5OWxRenRKUVVsSkxIRkNRVUZCTzBsQlFVRXNjVUpCUVVFN1NVRkJRU3hqUVVGQk8wbEJRMEVzSzBKQlFVRTdTVUZCUVN3NFFrRkJRVHRSUVVGQkxIZENRVUZCTzFsQlFVRXNiMEpCUVVFN1NVRkRRU3h6UWtGQlFUdFJRVUZCTEd0Q1FVRkJPMGxCUTBFc01FSkJRVUU3VVVGQlFTeDFRa0ZCUVR0WlFVRkJMRzlDUVVGQk8wbEJRMEVzTUVKQlFVRTdVVUZCUVN4cFFrRkJRVHRKUVVOQkxGVkJRVUU3U1VGRFFTeFRRVUZCTzBsQlEwRXNjVU5CUVVFN1dVRkJRU3cyUWtGQlFUdEpRVU5CTEZsQlFVRTdTVUZEUVN4aFFVRkJPMGxCUTBFc0swSkJRVUU3V1VGQlFTeDFRa0ZCUVR0SlFVTkJMREpDUVVGQk8wbEJRMEVzZFVKQlFVRTdTVUZEUVN4blFrRkJRVHRIVURobFREdEZUelZsU3p0SlF6bEdUaXhwUWtGQlFUdEpSR2RIVVN4dlFrRkJRVHRSUVVGQkxGbEJRVUU3V1VGQlFTeFJRVUZCTzBsQlEwRXNZVUZCUVR0SlFVTkJMSGxDUVVGQk8xbEJRVUVzYVVKQlFVRTdSMUE0WlZBN1JVOHhaVWM3U1VGRFJTeFhRVUZCTzBsQlEwRXNkVUpCUVVFN1NVRkRRU3dyUWtGQlFUdFpRVUZCTEhWQ1FVRkJPMGRRTkdWTU8wVlBlbVZITzBsQlEwVXNiVUpCUVVFN1NVRkRRU3hYUVVGQk8wbEJRMEVzVlVGQlFUdEpRVU5CTEZkQlFVRTdTVUZEUVN4aFFVRkJPMGxCUTBFc2VVSkJRVUU3V1VGQlFTeHBRa0ZCUVR0SlFVTkJMR2xDUVVGQk8wZFFNbVZNTzBWUGVHVkhPMGxFZGtoNVFpeHZRa0ZCUVR0SlFVTm1MSGRDUVVGQk8wbERkMGhTTEcxQ1FVRkJPMGxCUTBFc1YwRkJRVHRKUVVOQkxFOUJRVUU3U1VGRFFTeFJRVUZCTzBsQlEwRXNWVUZCUVR0SlFVTkJMRmxCUVVFN1NVRkRRU3hoUVVGQk8wbEJRMEVzYTBKQlFVRTdTVUZEUVN3NFFrRkJRVHRKUVVOQkxHbENRVUZCTzBsQlEwRXNhVUpCUVVFN1NVRkRRU3gxUWtGQlFUdEpRVU5CTEdsQ1FVRkJPMGRRTW1WTU8wVlBlR1ZITzBsQlEwVXNaVUZCUVR0SlFVTkJMREJDUVVGQk8wbEJRMEVzYTBKQlFVRTdTVUZEUVN3clEwRkJRVHRKUVVOQkxHMUNRVUZCTzBsQlEwRXNiVUpCUVVFN1IxQXdaVXc3UlU5b1prYzdTVUZUU1N4WFFVRkJPMGxCUTBFc2EwUkJRVUU3V1VGQlFTd3dRMEZCUVR0SlFVTkJMRFpEUVVGQk8wbEJRMEVzWlVGQlFUdEhVREJsVUR0RFFVTkdPMEZQY0dWRU8wVkJRMFU3TzBsUWRXVkZMR1ZCUVdVN1NVOXdaV1lzWjBKQlFVRTdTVkJ6WlVFc2JVSkJRVzFDTzBsUGNHVnVRaXgxUWtGQlFUdEpRVU5CTEZsQlFVRTdTVUZEUVN3eVFrRkJRVHRIVUhObFJEdEZRVU5FTEZsQlFWazdSVTl1WlZvN096dEpRVWRGTEhORFFVRkJPMGxCUTBFc1pVRkJRVHRIVUhGbFJEdEZRVU5FTEZsQlFWazdSVTlzWlZvN08wbEJSVVVzZVVKQlFVRTdSMUJ2WlVRN1JVRkRSQ3gzUWtGQmQwSTdSVTlxWlhoQ08wbEJRMFVzV1VGQlFUdEpRVU5CTERCQ1FVRkJPMGRRYldWRU8wVlBhbVZFT3p0SlFVVkZMREJDUVVGQk8wbEJRMEVzYTBKQlFVRTdSMUJ0WlVRN1JVOHZaRU03TzBsUWEyVkJMR3RDUVVGclFqdEpUeTlrYUVJc2VVSkJRVUU3UjFCcFpVZzdSVTg1WkVNN1NVRkRSU3d3UWtGQlFUdEpRVU5CTEdsQ1FVRkJPMGxRWjJWR0xHRkJRV0U3U1VGRFlpeGhRVUZoTzBsQlEySXNkMEpCUVhkQ08wbEJRM2hDTERSQ1FVRTBRanRIUVVNM1FqdEZUMnhsUnp0SlFVTkZMR2xEUVVGQk8wbEJRMEVzT0VKQlFVRTdTVUZEUVN3eVFrRkJRVHRIVUc5bFREdEZUMmhsUnp0SlFVTkZMRGhDUVVGQk8wbEJRMEVzZDBKQlFVRTdTVUZEUVN4elFrRkJRVHRKUVVOQkxIVkNRVUZCTzBsQlEwRXNORUpCUVVFN1IxQnJaVXc3UlU4NVpFYzdTVUZEUlN4NVFrRkJRVHRIVUdkbFREdEZUelZrUnp0SlFVTkZMSGxDUVVGQk8xbEJRVUVzYVVKQlFVRTdSMUE0WkV3N1JVOTRaa003U1VFNFFra3NkMEpCUVVFN1NVRkRRU3hyUTBGQlFUdEpRVU5CTERoQ1FVRkJPMGRRTm1STU8wVlBOMlpET3p0SlFYRkRTU3hyUTBGQlFUdEhVRFJrVER0RlQycG5Ra003T3p0SlFUSkRTU3h0UTBGQlFUdFBRVUZCTEdkRFFVRkJPMWxCUVVFc2IwSkJRVUU3UjFBeVpFdzdSVTkyWkVjN1NVRkRSU3g1UWtGQlFUdEhVSGxrVER0RFFVTkdPMEZCUTBRc2EwUkJRV3RFTzBGVGNuUkNiRVE3UlVGRFJTeG5Ra0ZCUVR0RlFVTkJMR1ZCUVVFN1JVRkRRU3hWUVVGQk8wVkJRMEVzYTBOQlFVRTdWVUZCUVN3d1FrRkJRVHRGUVVOQkxHbENRVUZCTzBOVWRYUkNSRHRCVTNKMFFrTTdSVXhHYzBRc2QwTkJRVUU3VlVGQlFTeG5RMEZCUVR0RlMwbHdSQ3h0UWtGQlFUdEZRVU5CTEZkQlFVRTdSVUZEUVN4aFFVRkJPMFZCUTBFc1dVRkJRVHRGUVVOQkxHRkJRVUU3UlVGRFFTd3dRa0ZCUVR0RlFVTkJMRzFDUVVGQk8wVkJRMEVzSzBKQlFVRTdWVUZCUVN4MVFrRkJRVHRGUVVOQkxIVkNRVUZCTzBWQlEwRXNaMEpCUVVFN1JVRkRRU3h0UWtGQlFUdEZRVU5CTEZsQlFVRTdSVUZEUVN3NFEwRkJRVHRGUVVGQkxITkRRVUZCTzBWQlEwRXNhVUpCUVVFN1ExUjFkRUpJTzBGVGNuUkNSenRGUVVORkxHVkJRVUU3UlVGRFFTeHpRa0ZCUVR0RlFVTkJMQ3RDUVVGQk8xVkJRVUVzZFVKQlFVRTdRMVIxZEVKTU8wRlRjSFJDUnp0RlFVTkZMR05CUVVFN1ExUnpkRUpNTzBGVGFuUkNSenM3TzBWQlIwVXNXVUZCUVR0RlFVTkJMSE5DUVVGQk8wTlViWFJDVER0QlUyaDBRa2M3UlVGRFJTeGxRVUZCTzBOVWEzUkNURHRCVXpselFrTTdSVUZEUlN4dFFrRkJRVHRGUVVOQkxGZEJRVUU3UlVGRFFTeFRRVUZCTzBWQlEwRXNWVUZCUVR0RlFVTkJMRmxCUVVFN1JVRkRRU3hoUVVGQk8wVkJRMEVzZVVOQlFVRTdWVUZCUVN4cFEwRkJRVHRGUVVOQkxHMUNRVUZCTzBWQlEwRXNhVUpCUVVFN1ExUm5kRUpJTzBGVE0zTkNTenRGUVVORkxGbEJRVUU3UlVGRFFTd3dRa0ZCUVR0RlFVTkJMSE5DUVVGQk8wTlVObk5DVUR0QlV6TnpRazg3UlVGRFJTeFpRVUZCTzBOVU5uTkNWRHRCVTNaelFrczdPenRGUVVkRkxGbEJRVUU3UTFSNWMwSlFPMEZUYm5OQ1J6dEZRVU5GTEc5Q1FVRkJPME5VY1hOQ1REdEJVemx5UWtzN096czdPenM3TzBWQlNVVXNiMEpCUVVFN1JVRkRRU3haUVVGQk8wVkJRMEVzYlVKQlFVRTdRMVJ2YzBKUU8wRlRiSE5DVHpzN096czdPenM3UlVGRFJTeFpRVUZCTzBWQlEwRXNiVUpCUVVFN1ExUXljMEpVTzBGVGRuTkNTenM3UlVGRFJTd3dRa0ZCUVR0RFZEQnpRbEE3UVZOeWMwSkRPenRGUVVWRkxGVkJRVUU3UlVGRFFTeHZRMEZCUVR0VlFVRkJMRFJDUVVGQk8wTlVkWE5DU0R0QlV6RnpRa003TzBWQlRVa3NjMEpCUVVFN1ExUjNjMEpNTzBGVGNITkNRenRGUVVORkxGVkJRVUU3UTFSemMwSklPMEZUY0hOQ1J6dEZRVU5GTEZkQlFVRTdRMVJ6YzBKTU8wRlRiSE5DUXp0RlFVTkZMR0ZCUVVFN1ExUnZjMEpJTzBGVGJITkNSenRGUVVORkxHTkJRVUU3UTFSdmMwSk1PMEZUYUhOQ1F6czdSVUZGUlN4dlEwRkJRVHRWUVVGQkxEUkNRVUZCTzBWQlEwRXNXVUZCUVR0RFZHdHpRa2c3UVZNdmNrSkRPMFZCUTBVc1UwRkJRVHRGUVVOQkxGbEJRVUU3UTFScGMwSklPMEZUTDNKQ1J6dEZRVU5GTEdGQlFVRTdRMVJwYzBKTU8wRlROM0pDUXp0RlFVTkZMRk5CUVVFN1JVRkRRU3hYUVVGQk8wTlVLM0pDU0R0QlV6ZHlRa2M3UlVGRFJTeFpRVUZCTzBOVUszSkNURHRCVTNSeVFrczdPenM3UlVGRFJTeGpRVUZCTzBOVU1uSkNVRHRCVldveVFrUTdSVVpKUlN4dFFrRkJRVHRGU2tGelJDeDNRMEZCUVR0VlFVRkJMR2REUVVGQk8wVk5SSFJFTEdkQ1FVRkJPMFZCUTBFc1kwRkJRVHRGUVVOQkxHRkJRVUU3UlVGRFFTeFhRVUZCTzBWQlEwRXNWVUZCUVR0RlFVTkJMR0ZCUVVFN1JVRkRRU3hWUVVGQk8wVkJRMEVzWjBKQlFVRTdSVUZEUVN4clFrRkJRVHRGUVVOQkxHZENRVUZCTzBWQlEwRXNkVUpCUVVFN1JVRkRRU3haUVVGQk8wVkJRMEVzZVVOQlFVRTdSVUZCUVN4cFEwRkJRVHRGUVVOQkxHOURRVUZCTzFWQlFVRXNORUpCUVVFN1JVRkRRU3hwUWtGQlFUdERWbTB5UWtRN1FWVnFNa0pETzBWS2FFSTJRaXh2UWtGQlFUdEZRVU5tTEhkQ1FVRkJPMFZKYVVKYUxGVkJRVUU3UlVGRFFTeHBRa0ZCUVR0RlFVTkJMR0ZCUVVFN1JVRkRRU3hyUWtGQlFUdEZRVU5CTEdkQ1FVRkJPMFZCUTBFc1dVRkJRVHRGUVVOQkxHbENRVUZCTzBOV2J6SkNTRHRCVldveVFrTTdPMFZCUlVVc2JVSkJRVUU3UlVGRFFTeFhRVUZCTzBWQlEwRXNUMEZCUVR0RlFVTkJMRmxCUVVFN1JVRkRRU3hoUVVGQk8wVkJRMEVzYTBKQlFVRTdSVUZEUVN4dFFrRkJRVHRGUVVOQkxHbENRVUZCTzBOV2JUSkNTRHRCVldneVFrTTdSVUZEUlN4UlFVRkJPMFZCUTBFc1dVRkJRVHREVm1zeVFrZzdRVlZ3TWtKRE8wVkJTMGtzYlVKQlFVRTdSVUZEUVN4WFFVRkJPMFZCUTBFc1UwRkJRVHRGUVVOQkxGVkJRVUU3UlVGRFFTeDVRMEZCUVR0VlFVRkJMR2xEUVVGQk8wTldhekpDVER0QlZUa3hRa003UlVGRFJTeFRRVUZCTzBWQlEwRXNaMEpCUVVFN1JVRkRRU3haUVVGQk8wTldaekpDU0R0QlZXNHlRa003UlVGTlNTeHRRa0ZCUVR0RlFVTkJMRmRCUVVFN1JVRkRRU3hUUVVGQk8wVkJRMEVzVlVGQlFUdEZRVU5CTEhsRFFVRkJPMVZCUVVFc2FVTkJRVUU3UTFabk1rSk1PMEZWTnpGQ1J6dEZRVU5GTEZsQlFVRTdRMVlyTVVKTU8wRlZNekZDUXp0RlFVVkpMREJDUVVGQk8wTldOREZDVER0QlZYZ3hRa003UlVGRlNTd3dRa0ZCUVR0RFZua3hRa3c3UVZWeU1VSkRPMFZCUlVrc01FSkJRVUU3UTFaek1VSk1PMEZWYkRGQ1F6dEZRVVZKTERCQ1FVRkJPME5XYlRGQ1REdEJWUzh3UWtNN1JVRkRSU3hwUWtGQlFUdEZRVU5CTEhWQ1FVRkJPME5XYVRGQ1NEdEJWVGt3UWtzN1JVRkRSU3dyUWtGQlFUdEZRVU5CTERCQ1FVRkJPME5XWnpGQ1VEdEJWVGN3UWtzN1JVRkRSU3dyUWtGQlFUdEZRVU5CTERCQ1FVRkJPME5XS3pCQ1VEdEJWVFV3UWtzN1JVRkRSU3dyUWtGQlFUdEZRVU5CTERCQ1FVRkJPME5XT0RCQ1VEdEJWVE13UWtzN1JVRkRSU3dyUWtGQlFUdEZRVU5CTERCQ1FVRkJPME5XTmpCQ1VEdEJWVzR5UWtNN1JVRXlRa2tzVTBGQlFUdEZRVU5CTEdOQlFVRTdRMVl5TUVKTU8wRlZkakpDUXp0RlFTdENUU3hqUVVGQk8wTldNakJDVUR0QlZYUXdRa003UlVGRFJTeHBRa0ZCUVR0RlFVTkJMR2RDUVVGQk8wTldkekJDU0R0QlZYSXdRa3M3UlVGRlNTeGxRVUZCTzBOV2N6QkNWRHRCVld3d1FrczdSVUZGU1N4bFFVRkJPME5XYlRCQ1ZEdEJWUzk2UWtzN1JVRkZTU3hsUVVGQk8wTldaekJDVkR0QlZUVjZRa3M3UlVGRlNTeGxRVUZCTzBOV05ucENWRHRCVlhReFFrTTdSVUVyUWtrc2RVSkJRVUU3UTFZd2VrSk1PMEZWZEhwQ1F6dEZSbkJMUVN4dlFrRkJRVHREVWpZNVFrUTdRVlZ5ZWtKTE8wVkJRMFVzYVVKQlFVRTdSVUZEUVN4blFrRkJRVHREVm5WNlFsQTdRVlY2ZWtKTE8wVkdlRXRLTEc5Q1FVRkJPMFZGT0V0UkxGVkJRVUU3UlVGRFFTeFhRVUZCTzBWQlEwRXNXVUZCUVR0RlFVTkJMR0ZCUVVFN1JVRkRRU3hyUWtGQlFUdERWblY2UWxRN1FWVndla0pQTzBWQlEwVXNhVUpCUVVFN1JVRkRRU3gxUWtGQlFUdERWbk42UWxRN1FWVnNla0pMTzBWQlEwVXNhVUpCUVVFN1JVRkRRU3gxUWtGQlFUdERWbTk2UWxBN1FWVnNla0pQTzBWQlEwVXNhVUpCUVVFN1JVRkRRU3huUWtGQlFUdERWbTk2UWxRN1FWVTVlVUpETzBWQlEwVXNhVUpCUVVFN1JVRkRRU3gxUWtGQlFUdERWbWQ2UWtnN1FWVTNlVUpMTzBWQlEwVXNhVUpCUVVFN1JVRkRRU3gxUWtGQlFUdERWaXQ1UWxBN1FWVTFlVUpMTzBWQlEwVXNhVUpCUVVFN1JVRkRRU3gxUWtGQlFUdERWamg1UWxBN1FWVjZlVUpETzBWQlEwVXNWMEZCUVR0RFZqSjVRa2c3UVZWNGVVSkRPMFZCUTBVc1kwRkJRVHREVmpCNVFrZzdRVUZEUkN3eVFrRkJNa0k3UVZkb2FFTXpRanRGUVVORkxGZEJRVUU3UlVGRFFTeFpRVUZCTzBWQlEwRXNNa0pCUVVFN1ExaHJhRU5FTzBGWGFHaERRenRGUVVORkxESkNRVUZCTzBOWWEyaERTRHRCVnpsblEwYzdSVUZEUlN4elEwRkJRVHRGUVVOQkxESkNRVUZCTzBOWVoyaERURHRCVnpkblEwYzdSVUZEUlN4elEwRkJRVHRGUVVOQkxESkNRVUZCTzBOWUsyZERURHRCVnpWblEwYzdSVUZEUlN4elEwRkJRVHREV0RoblEwdzdRVmN4WjBORE8wVkJRMFVzYzBOQlFVRTdRMWcwWjBOSUlpd2labWxzWlNJNkltOTFkR3hwYm1VdVkzTnpJaXdpYzI5MWNtTmxjME52Ym5SbGJuUWlPbHNpT25KdmIzUWdlMXh5WEc0Z0lDMHRiM1YwYkdsdVpTMTZTVzVrWlhnNklESXdNREE3WEhKY2JpQWdMUzF2ZFhSc2FXNWxMWE4wYVdOcmVTMW9aV2xuYUhRNklERXdNQ1U3WEhKY2JpQWdMUzF2ZFhSc2FXNWxMVzVoZG1sbllYUnZjaTEzYVdSMGFEb2dNVEF3SlR0Y2NseHVmVnh5WEc0aUxDSTZjbTl2ZENCN1hHNGdJQzB0YjNWMGJHbHVaUzE2U1c1a1pYZzZJREl3TURBN1hHNGdJQzB0YjNWMGJHbHVaUzF6ZEdsamEza3RhR1ZwWjJoME9pQXhNREFsTzF4dUlDQXRMVzkxZEd4cGJtVXRibUYyYVdkaGRHOXlMWGRwWkhSb09pQXhNREFsTzF4dWZWeHVMeW9nUFQwOVBUMDlQVDA5UFNCamIyeHZjbk11ZEdobGJXVWdMU0Rsbjdybm9ZRHBvcHpvaWJMbGo1anBoNC9wbTRibGtJZ2dQVDA5UFQwOVBUMDlQU0FxTDF4dUx5b3FYRzRnS2lCbGJHeHBjSE5wY3k1c1pYTnpJQzBnNXBhSDVweXM1NXlCNTVXbElHMXBlR2x1ZUNEbGg3M21sYkJjYmlBcUlEMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQxY2JpQXFJRU55WldGMFpXUWdRbms2SUZsaGIyaGhhWGhwWVc5Y2JpQXFJRlZ3WkdGMFpUb2dNakF5TWk0ekxqRXhYRzRnS2k5Y2JpOHFJRDA5UFQwOVBTRG1sb2Ztbkt6bm5JSG5sYVhsaDczbWxiQWdQVDA5UFQwOUlDb3ZYRzR2S2lwY2JpQXFJSE5vWVdSdmR5NXNaWE56SUMwZzZaaTA1YjJ4NXFDMzVieVA2SzYrNTcydUlHMXBlR2x1ZUNEbGg3M21sYkJjYmlBcUlEMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQxY2JpQXFJRU55WldGMFpXUWdRbms2SUZsaGIyaGhhWGhwWVc5Y2JpQXFJRlZ3WkdGMFpUb2dNakF5TWk0ekxqSXdYRzRnS2k5Y2JpOHFJRDA5UFQwOVBTRHBtTFRsdmJIbW9MZmx2SS9vcnI3bnZhN2xoNzNtbGJBZ1BUMDlQVDA5SUNvdlhHNHZLaUE5UFQwOVBUMDlQVDA5SUdsamIyNHVkR2hsYldVZ0xTQnpkbWNnNVp1KzVxQ0g1NXFFNXFDMzVieVBJRDA5UFQwOVBUMDlQVDBnS2k5Y2JpNXZkWFJzYVc1bExXbGpiMjRnZTF4dUlDQndiM05wZEdsdmJqb2djbVZzWVhScGRtVTdYRzRnSUhvdGFXNWtaWGc2SURFN1hHNGdJR1JwYzNCc1lYazZJR2x1YkdsdVpTMWliRzlqYXp0Y2JpQWdkbVZ5ZEdsallXd3RZV3hwWjI0NklHMXBaR1JzWlR0Y2JpQWdkMmxrZEdnNklERmxiVHRjYmlBZ2FHVnBaMmgwT2lBeFpXMDdYRzRnSUc5MlpYSm1iRzkzT2lCb2FXUmtaVzQ3WEc1OVhHNHViM1YwYkdsdVpTMXBZMjl1WDE5emRtY2dlMXh1SUNCd2IzTnBkR2x2YmpvZ1lXSnpiMngxZEdVN1hHNGdJSG90YVc1a1pYZzZJREk3WEc0Z0lIUnZjRG9nTlRBbE8xeHVJQ0JzWldaME9pQTFNQ1U3WEc0Z0lIZHBaSFJvT2lBeFpXMDdYRzRnSUdobGFXZG9kRG9nTVdWdE8xeHVJQ0JtYVd4c09pQmpkWEp5Wlc1MFkyOXNiM0k3WEc0Z0lIUnlZVzV6Wm05eWJUb2dkSEpoYm5Oc1lYUmxLQzAxTUNVc0lDMDFNQ1VwTzF4dUlDQnZkbVZ5Wm14dmR6b2dhR2xrWkdWdU8xeHVmVnh1TG05MWRHeHBibVV0YVdOdmJsOW9hV1JrWlc0Z2UxeHVJQ0JrYVhOd2JHRjVPaUJ1YjI1bE8xeHVmVnh1TG05MWRHeHBibVV0YUdWaFpHbHVaeUI3WEc0Z0lIQnZjMmwwYVc5dU9pQnlaV3hoZEdsMlpUdGNiaUFnZWkxcGJtUmxlRG9nTVR0Y2JpQWdiM1psY21ac2IzYzZJR2hwWkdSbGJqdGNibjFjYmk1dmRYUnNhVzVsTFdobFlXUnBibWRmWDJGdVkyaHZjaUI3WEc0Z0lHUnBjM0JzWVhrNklHNXZibVU3WEc1OVhHNHViM1YwYkdsdVpTMW9aV0ZrYVc1blgxOWhibU5vYjNJNmJHbHVheXhjYmk1dmRYUnNhVzVsTFdobFlXUnBibWRmWDJGdVkyaHZjanAyYVhOcGRHVmtMRnh1TG05MWRHeHBibVV0YUdWaFpHbHVaMTlmWVc1amFHOXlPbWh2ZG1WeUlIdGNiaUFnWTI5c2IzSTZJQ001T1RrN1hHNGdJSFJsZUhRdFpHVmpiM0poZEdsdmJqb2dibTl1WlR0Y2JuMWNiaTV2ZFhSc2FXNWxMV2hsWVdScGJtZGZYMkZ1WTJodmNqcG9iM1psY2lCN1hHNGdJR052Ykc5eU9pQWpOVEEzWVdabE8xeHVmVnh1TG05MWRHeHBibVV0YUdWaFpHbHVaenBvYjNabGNpQXViM1YwYkdsdVpTMW9aV0ZrYVc1blgxOWhibU5vYjNJZ2UxeHVJQ0JrYVhOd2JHRjVPaUJwYm14cGJtVXRZbXh2WTJzN1hHNTlYRzR1YjNWMGJHbHVaUzFvWldGa2FXNW5YM04wWVhKME9taHZkbVZ5SUh0Y2JpQWdiM1psY21ac2IzYzZJSFpwYzJsaWJHVTdYRzU5WEc0dWIzVjBiR2x1WlMxb1pXRmthVzVuWDNOMFlYSjBJQzV2ZFhSc2FXNWxMV2hsWVdScGJtZGZYMkZ1WTJodmNpQjdYRzRnSUhCdmMybDBhVzl1T2lCaFluTnZiSFYwWlR0Y2JpQWdlaTFwYm1SbGVEb2dNanRjYmlBZ2RHOXdPaUExTUNVN1hHNGdJSFJ5WVc1elptOXliVG9nZEhKaGJuTnNZWFJsV1NndE5UQWxLVHRjYmlBZ2JHVm1kRG9nTFRGbGJUdGNibjFjYmk1dmRYUnNhVzVsTFdSeVlYZGxjaUI3WEc0Z0lIQnZjMmwwYVc5dU9pQnlaV3hoZEdsMlpUdGNiaUFnZWkxcGJtUmxlRG9nTFRFN1hHNGdJSFJ2Y0RvZ01EdGNiaUFnYkdWbWREb2dNRHRjYmlBZ2JXRnlaMmx1T2lBd08xeHVJQ0IzYVdSMGFEb2dNVEF3SlR0Y2JpQWdhR1ZwWjJoME9pQXhNREFsTzF4dUlDQmliM2d0YzJsNmFXNW5PaUJpYjNKa1pYSXRZbTk0TzF4dUlDQjJhWE5wWW1sc2FYUjVPaUJvYVdSa1pXNDdYRzRnSUc5MlpYSm1iRzkzT2lCb2FXUmtaVzQ3WEc1OVhHNHViM1YwYkdsdVpTMWtjbUYzWlhKZlgyMXZaR0ZzSUh0Y2JpQWdZbTk0TFhOb1lXUnZkem9nTUNBd0lEWndlQ0F4Y0hnZ0kyUmpaR1psTmp0Y2JpQWdaR2x6Y0d4aGVUb2dabXhsZUR0Y2JpQWdabXhsZUMxa2FYSmxZM1JwYjI0NklHTnZiSFZ0Ymp0Y2JpQWdabXhsZUMxM2NtRndPaUJ1YjNkeVlYQTdYRzRnSUhCdmMybDBhVzl1T2lCaFluTnZiSFYwWlR0Y2JpQWdlaTFwYm1SbGVEb2dNakU3WEc0Z0lHaGxhV2RvZERvZ01UQXdKVHRjYmlBZ1ltRmphMmR5YjNWdVpDMWpiMnh2Y2pvZ0kyWm1aanRjYmlBZ2RISmhibk5wZEdsdmJpMWtkWEpoZEdsdmJqb2dNQzQwY3p0Y2JpQWdiM1psY21ac2IzYzZJR2hwWkdSbGJqdGNibjFjYmk1dmRYUnNhVzVsTFdSeVlYZGxjbDlmYUdWaFpHVnlMRnh1TG05MWRHeHBibVV0WkhKaGQyVnlYMTl0WVdsdUxGeHVMbTkxZEd4cGJtVXRaSEpoZDJWeVgxOW1iMjkwWlhJZ2UxeHVJQ0IzYVdSMGFEb2dNVEF3SlR0Y2JpQWdZbTk0TFhOcGVtbHVaem9nWW05eVpHVnlMV0p2ZUR0Y2JuMWNiaTV2ZFhSc2FXNWxMV1J5WVhkbGNsOWZhR1ZoWkdWeUxGeHVMbTkxZEd4cGJtVXRaSEpoZDJWeVgxOW1iMjkwWlhJZ2UxeHVJQ0JtYkdWNExYTm9jbWx1YXpvZ01EdGNibjFjYmk1dmRYUnNhVzVsTFdSeVlYZGxjbDlmZEdsMGJHVXNYRzR1YjNWMGJHbHVaUzFrY21GM1pYSmZYMjFoYVc0c1hHNHViM1YwYkdsdVpTMWtjbUYzWlhKZlgyWnZiM1JsY2lCN1hHNGdJSEJoWkdScGJtYzZJREFnTVRad2VEdGNibjFjYmk1dmRYUnNhVzVsTFdSeVlYZGxjbDlmYUdWaFpHVnlMRnh1TG05MWRHeHBibVV0WkhKaGQyVnlYMTkwYVhSc1pTQjdYRzRnSUhCdmMybDBhVzl1T2lCeVpXeGhkR2wyWlR0Y2JpQWdlaTFwYm1SbGVEb2dNVHRjYmlBZ2JXRnlaMmx1T2lBd0lHRjFkRzg3WEc0Z0lHaGxhV2RvZERvZ05USndlRHRjYmlBZ2JHbHVaUzFvWldsbmFIUTZJRFV5Y0hnN1hHNGdJRzkyWlhKbWJHOTNPaUJvYVdSa1pXNDdYRzU5WEc0dWIzVjBiR2x1WlMxa2NtRjNaWEpmWDNScGRHeGxJSHRjYmlBZ1ptOXVkQzF6YVhwbE9pQXhObkI0TzF4dUlDQm1iMjUwTFhkbGFXZG9kRG9nTkRBd08xeHVJQ0J0WVhKbmFXNDZJREFnTVRad2VEdGNiaUFnWW05NExYTnBlbWx1WnpvZ1ltOXlaR1Z5TFdKdmVEdGNiaUFnWW05eVpHVnlMV0p2ZEhSdmJUb2dNWEI0SUhOdmJHbGtJQ05rWTJSbVpUWTdYRzU5WEc0dWIzVjBiR2x1WlMxa2NtRjNaWEpmWDJOc2IzTmxJSHRjYmlBZ2NHOXphWFJwYjI0NklHRmljMjlzZFhSbE8xeHVJQ0I2TFdsdVpHVjRPaUF5TzF4dUlDQjBiM0E2SURVd0pUdGNiaUFnY21sbmFIUTZJREV5Y0hnN1hHNGdJSGRwWkhSb09pQXlNSEI0TzF4dUlDQm9aV2xuYUhRNklESXdjSGc3WEc0Z0lHeHBibVV0YUdWcFoyaDBPaUF5TUhCNE8xeHVJQ0JqYjJ4dmNqb2dJems1T1R0Y2JpQWdabTl1ZEMxemFYcGxPaUF5TUhCNE8xeHVJQ0IwWlhoMExXRnNhV2R1T2lCalpXNTBaWEk3WEc0Z0lHTjFjbk52Y2pvZ2NHOXBiblJsY2p0Y2JpQWdkSEpoYm5ObWIzSnRPaUIwY21GdWMyeGhkR1ZaS0MwMU1DVXBPMXh1SUNCdmRtVnlabXh2ZHpvZ2FHbGtaR1Z1TzF4dWZWeHVMbTkxZEd4cGJtVXRaSEpoZDJWeVgxOWpiRzl6WlNBdWIzVjBiR2x1WlMxcFkyOXVJSHRjYmlBZ2NHOXphWFJwYjI0NklHRmljMjlzZFhSbE8xeHVJQ0I2TFdsdVpHVjRPaUF5TzF4dUlDQjBiM0E2SURBN1hHNGdJR3hsWm5RNklEQTdYRzU5WEc0dWIzVjBiR2x1WlMxa2NtRjNaWEpmWDJOc2IzTmxPbWh2ZG1WeUlIdGNiaUFnWTI5c2IzSTZJQ00yTmpZN1hHNTlYRzR1YjNWMGJHbHVaUzFrY21GM1pYSmZYMjFoYVc0Z2UxeHVJQ0JtYkdWNE9pQXhPMXh1SUNCdmRtVnlabXh2ZHpvZ1lYVjBienRjYm4xY2JpNXZkWFJzYVc1bExXUnlZWGRsY2w5ZmJXRnBiaTV2ZG1WeVpteHZkeTFvYVdSa1pXNGdlMXh1SUNCdmRtVnlabXh2ZHpvZ2FHbGtaR1Z1TzF4dWZWeHVMbTkxZEd4cGJtVXRaSEpoZDJWeVgxOW1iMjkwWlhJZ2UxeHVJQ0J0WVhKbmFXNDZJREFnWVhWMGJ6dGNiaUFnZEdWNGRDMWhiR2xuYmpvZ2NtbG5hSFE3WEc0Z0lHOTJaWEptYkc5M09pQm9hV1JrWlc0N1hHNTlYRzR1YjNWMGJHbHVaUzFrY21GM1pYSmZYMjkyWlhKc1lYa2dlMXh1SUNCamIyNTBaVzUwT2lBbkp6dGNiaUFnY0c5emFYUnBiMjQ2SUhKbGJHRjBhWFpsTzF4dUlDQjZMV2x1WkdWNE9pQXhPMXh1SUNCMGIzQTZJREE3WEc0Z0lHeGxablE2SURBN1hHNGdJSGRwWkhSb09pQXhNREFsTzF4dUlDQm9aV2xuYUhRNklERXdNQ1U3WEc0Z0lHSmhZMnRuY205MWJtUXRZMjlzYjNJNklDTm1abVk3WEc0Z0lHOXdZV05wZEhrNklEQXVNVHRjYmlBZ2IzWmxjbVpzYjNjNklHaHBaR1JsYmp0Y2JuMWNiaTV2ZFhSc2FXNWxMV1J5WVhkbGNsOXlkR3d1YjNWMGJHbHVaUzFrY21GM1pYSmZkR2x1ZVN4Y2JpNXZkWFJzYVc1bExXUnlZWGRsY2w5c2RISXViM1YwYkdsdVpTMWtjbUYzWlhKZmRHbHVlU0I3WEc0Z0lIZHBaSFJvT2lBeU9EQndlRHRjYm4xY2JpNXZkWFJzYVc1bExXUnlZWGRsY2w5eWRHd3ViM1YwYkdsdVpTMWtjbUYzWlhKZmJXbHVhU3hjYmk1dmRYUnNhVzVsTFdSeVlYZGxjbDlzZEhJdWIzVjBiR2x1WlMxa2NtRjNaWEpmYldsdWFTQjdYRzRnSUhkcFpIUm9PaUEwT0RCd2VEdGNibjFjYmk1dmRYUnNhVzVsTFdSeVlYZGxjbDl5ZEd3dWIzVjBiR2x1WlMxa2NtRjNaWEpmYzIxaGJHd3NYRzR1YjNWMGJHbHVaUzFrY21GM1pYSmZiSFJ5TG05MWRHeHBibVV0WkhKaGQyVnlYM050WVd4c0lIdGNiaUFnZDJsa2RHZzZJRFUwTUhCNE8xeHVmVnh1TG05MWRHeHBibVV0WkhKaGQyVnlYM0owYkM1dmRYUnNhVzVsTFdSeVlYZGxjbDl5WldkMWJHRnlMRnh1TG05MWRHeHBibVV0WkhKaGQyVnlYMngwY2k1dmRYUnNhVzVsTFdSeVlYZGxjbDl5WldkMWJHRnlJSHRjYmlBZ2QybGtkR2c2SURZNE1IQjRPMXh1ZlZ4dUxtOTFkR3hwYm1VdFpISmhkMlZ5WDNKMGJDNXZkWFJzYVc1bExXUnlZWGRsY2w5dFpXUnBkVzBzWEc0dWIzVjBiR2x1WlMxa2NtRjNaWEpmYkhSeUxtOTFkR3hwYm1VdFpISmhkMlZ5WDIxbFpHbDFiU0I3WEc0Z0lIZHBaSFJvT2lBM01qQndlRHRjYm4xY2JpNXZkWFJzYVc1bExXUnlZWGRsY2w5eWRHd3ViM1YwYkdsdVpTMWtjbUYzWlhKZmJHRnlaMlVzWEc0dWIzVjBiR2x1WlMxa2NtRjNaWEpmYkhSeUxtOTFkR3hwYm1VdFpISmhkMlZ5WDJ4aGNtZGxJSHRjYmlBZ2QybGtkR2c2SURrMk1IQjRPMXh1ZlZ4dUxtOTFkR3hwYm1VdFpISmhkMlZ5WDNKMGJDQjdYRzRnSUdKdmNtUmxjaTFzWldaME9pQXhjSGdnYzI5c2FXUWdJMlJqWkdabE5qdGNibjFjYmk1dmRYUnNhVzVsTFdSeVlYZGxjbDl5ZEd3dWIzVjBiR2x1WlMxa2NtRjNaWEpmZEdsdWVTNXZkWFJzYVc1bExXUnlZWGRsY2w5amJHOXpaV1FnZTF4dUlDQnlhV2RvZERvZ0xUSTVNSEI0TzF4dWZWeHVMbTkxZEd4cGJtVXRaSEpoZDJWeVgzSjBiQzV2ZFhSc2FXNWxMV1J5WVhkbGNsOXRhVzVwTG05MWRHeHBibVV0WkhKaGQyVnlYMk5zYjNObFpDQjdYRzRnSUhKcFoyaDBPaUF0TkRrd2NIZzdYRzU5WEc0dWIzVjBiR2x1WlMxa2NtRjNaWEpmY25Sc0xtOTFkR3hwYm1VdFpISmhkMlZ5WDNOdFlXeHNMbTkxZEd4cGJtVXRaSEpoZDJWeVgyTnNiM05sWkNCN1hHNGdJSEpwWjJoME9pQXROVFV3Y0hnN1hHNTlYRzR1YjNWMGJHbHVaUzFrY21GM1pYSmZjblJzTG05MWRHeHBibVV0WkhKaGQyVnlYM0psWjNWc1lYSXViM1YwYkdsdVpTMWtjbUYzWlhKZlkyeHZjMlZrSUh0Y2JpQWdjbWxuYUhRNklDMDJPVEJ3ZUR0Y2JuMWNiaTV2ZFhSc2FXNWxMV1J5WVhkbGNsOXlkR3d1YjNWMGJHbHVaUzFrY21GM1pYSmZiV1ZrYVhWdExtOTFkR3hwYm1VdFpISmhkMlZ5WDJOc2IzTmxaQ0I3WEc0Z0lISnBaMmgwT2lBdE56TXdjSGc3WEc1OVhHNHViM1YwYkdsdVpTMWtjbUYzWlhKZmNuUnNMbTkxZEd4cGJtVXRaSEpoZDJWeVgyeGhjbWRsTG05MWRHeHBibVV0WkhKaGQyVnlYMk5zYjNObFpDQjdYRzRnSUhKcFoyaDBPaUF0T1Rjd2NIZzdYRzU5WEc0dWIzVjBiR2x1WlMxa2NtRjNaWEpmYkhSeUlIdGNiaUFnWW05eVpHVnlMWEpwWjJoME9pQXhjSGdnYzI5c2FXUWdJMlJqWkdabE5qdGNibjFjYmk1dmRYUnNhVzVsTFdSeVlYZGxjbDlzZEhJdWIzVjBiR2x1WlMxa2NtRjNaWEpmZEdsdWVTNXZkWFJzYVc1bExXUnlZWGRsY2w5amJHOXpaV1FnZTF4dUlDQnNaV1owT2lBdE1qa3djSGc3WEc1OVhHNHViM1YwYkdsdVpTMWtjbUYzWlhKZmJIUnlMbTkxZEd4cGJtVXRaSEpoZDJWeVgyMXBibWt1YjNWMGJHbHVaUzFrY21GM1pYSmZZMnh2YzJWa0lIdGNiaUFnYkdWbWREb2dMVFE1TUhCNE8xeHVmVnh1TG05MWRHeHBibVV0WkhKaGQyVnlYMngwY2k1dmRYUnNhVzVsTFdSeVlYZGxjbDl6YldGc2JDNXZkWFJzYVc1bExXUnlZWGRsY2w5amJHOXpaV1FnZTF4dUlDQnNaV1owT2lBdE5UVXdjSGc3WEc1OVhHNHViM1YwYkdsdVpTMWtjbUYzWlhKZmJIUnlMbTkxZEd4cGJtVXRaSEpoZDJWeVgzSmxaM1ZzWVhJdWIzVjBiR2x1WlMxa2NtRjNaWEpmWTJ4dmMyVmtJSHRjYmlBZ2JHVm1kRG9nTFRZNU1IQjRPMXh1ZlZ4dUxtOTFkR3hwYm1VdFpISmhkMlZ5WDJ4MGNpNXZkWFJzYVc1bExXUnlZWGRsY2w5dFpXUnBkVzB1YjNWMGJHbHVaUzFrY21GM1pYSmZZMnh2YzJWa0lIdGNiaUFnYkdWbWREb2dMVGN6TUhCNE8xeHVmVnh1TG05MWRHeHBibVV0WkhKaGQyVnlYMngwY2k1dmRYUnNhVzVsTFdSeVlYZGxjbDlzWVhKblpTNXZkWFJzYVc1bExXUnlZWGRsY2w5amJHOXpaV1FnZTF4dUlDQnNaV1owT2lBdE9UY3djSGc3WEc1OVhHNHViM1YwYkdsdVpTMWtjbUYzWlhKZmRIUmlMRnh1TG05MWRHeHBibVV0WkhKaGQyVnlYMkowZENCN1hHNGdJR3hsWm5RNklEQTdYRzRnSUhkcFpIUm9PaUF4TURBbE8xeHVmVnh1TG05MWRHeHBibVV0WkhKaGQyVnlYM1IwWWk1dmRYUnNhVzVsTFdSeVlYZGxjbDkwYVc1NUxGeHVMbTkxZEd4cGJtVXRaSEpoZDJWeVgySjBkQzV2ZFhSc2FXNWxMV1J5WVhkbGNsOTBhVzU1SUh0Y2JpQWdhR1ZwWjJoME9pQXlOREJ3ZUR0Y2JuMWNiaTV2ZFhSc2FXNWxMV1J5WVhkbGNsOTBkR0l1YjNWMGJHbHVaUzFrY21GM1pYSmZiV2x1YVN4Y2JpNXZkWFJzYVc1bExXUnlZWGRsY2w5aWRIUXViM1YwYkdsdVpTMWtjbUYzWlhKZmJXbHVhU0I3WEc0Z0lHaGxhV2RvZERvZ016SXdjSGc3WEc1OVhHNHViM1YwYkdsdVpTMWtjbUYzWlhKZmRIUmlMbTkxZEd4cGJtVXRaSEpoZDJWeVgzTnRZV3hzTEZ4dUxtOTFkR3hwYm1VdFpISmhkMlZ5WDJKMGRDNXZkWFJzYVc1bExXUnlZWGRsY2w5emJXRnNiQ0I3WEc0Z0lHaGxhV2RvZERvZ016WXdjSGc3WEc1OVhHNHViM1YwYkdsdVpTMWtjbUYzWlhKZmRIUmlMbTkxZEd4cGJtVXRaSEpoZDJWeVgzSmxaM1ZzWVhJc1hHNHViM1YwYkdsdVpTMWtjbUYzWlhKZlluUjBMbTkxZEd4cGJtVXRaSEpoZDJWeVgzSmxaM1ZzWVhJZ2UxeHVJQ0JvWldsbmFIUTZJRFF3TUhCNE8xeHVmVnh1TG05MWRHeHBibVV0WkhKaGQyVnlYM1IwWWk1dmRYUnNhVzVsTFdSeVlYZGxjbDl0WldScGRXMHNYRzR1YjNWMGJHbHVaUzFrY21GM1pYSmZZblIwTG05MWRHeHBibVV0WkhKaGQyVnlYMjFsWkdsMWJTQjdYRzRnSUdobGFXZG9kRG9nTkRRd2NIZzdYRzU5WEc0dWIzVjBiR2x1WlMxa2NtRjNaWEpmZEhSaUxtOTFkR3hwYm1VdFpISmhkMlZ5WDJ4aGNtZGxMRnh1TG05MWRHeHBibVV0WkhKaGQyVnlYMkowZEM1dmRYUnNhVzVsTFdSeVlYZGxjbDlzWVhKblpTQjdYRzRnSUdobGFXZG9kRG9nTkRnd2NIZzdYRzU5WEc0dWIzVjBiR2x1WlMxa2NtRjNaWEpmZEhSaUlIdGNiaUFnWW05eVpHVnlMV0p2ZEhSdmJUb2dNWEI0SUhOdmJHbGtJQ05rWTJSbVpUWTdYRzU5WEc0dWIzVjBiR2x1WlMxa2NtRjNaWEpmZEhSaUxtOTFkR3hwYm1VdFpISmhkMlZ5WDNScGJua3ViM1YwYkdsdVpTMWtjbUYzWlhKZlkyeHZjMlZrSUh0Y2JpQWdkRzl3T2lBdE1qVXdjSGc3WEc1OVhHNHViM1YwYkdsdVpTMWtjbUYzWlhKZmRIUmlMbTkxZEd4cGJtVXRaSEpoZDJWeVgyMXBibWt1YjNWMGJHbHVaUzFrY21GM1pYSmZZMnh2YzJWa0lIdGNiaUFnZEc5d09pQXRNek13Y0hnN1hHNTlYRzR1YjNWMGJHbHVaUzFrY21GM1pYSmZkSFJpTG05MWRHeHBibVV0WkhKaGQyVnlYM050WVd4c0xtOTFkR3hwYm1VdFpISmhkMlZ5WDJOc2IzTmxaQ0I3WEc0Z0lIUnZjRG9nTFRNM01IQjRPMXh1ZlZ4dUxtOTFkR3hwYm1VdFpISmhkMlZ5WDNSMFlpNXZkWFJzYVc1bExXUnlZWGRsY2w5eVpXZDFiR0Z5TG05MWRHeHBibVV0WkhKaGQyVnlYMk5zYjNObFpDQjdYRzRnSUhSdmNEb2dMVFF4TUhCNE8xeHVmVnh1TG05MWRHeHBibVV0WkhKaGQyVnlYM1IwWWk1dmRYUnNhVzVsTFdSeVlYZGxjbDl0WldScGRXMHViM1YwYkdsdVpTMWtjbUYzWlhKZlkyeHZjMlZrSUh0Y2JpQWdkRzl3T2lBdE5EVXdjSGc3WEc1OVhHNHViM1YwYkdsdVpTMWtjbUYzWlhKZmRIUmlMbTkxZEd4cGJtVXRaSEpoZDJWeVgyeGhjbWRsTG05MWRHeHBibVV0WkhKaGQyVnlYMk5zYjNObFpDQjdYRzRnSUhSdmNEb2dMVFE1TUhCNE8xeHVmVnh1TG05MWRHeHBibVV0WkhKaGQyVnlYMkowZENCN1hHNGdJSFJ2Y0RvZ2FXNXBkR2xoYkR0Y2JpQWdZbTl5WkdWeUxYUnZjRG9nTVhCNElITnZiR2xrSUNOa1kyUm1aVFk3WEc1OVhHNHViM1YwYkdsdVpTMWtjbUYzWlhKZlluUjBMbTkxZEd4cGJtVXRaSEpoZDJWeVgzUnBibmt1YjNWMGJHbHVaUzFrY21GM1pYSmZZMnh2YzJWa0lIdGNiaUFnWW05MGRHOXRPaUF0TWpVd2NIZzdYRzU5WEc0dWIzVjBiR2x1WlMxa2NtRjNaWEpmWW5SMExtOTFkR3hwYm1VdFpISmhkMlZ5WDIxcGJta3ViM1YwYkdsdVpTMWtjbUYzWlhKZlkyeHZjMlZrSUh0Y2JpQWdZbTkwZEc5dE9pQXRNek13Y0hnN1hHNTlYRzR1YjNWMGJHbHVaUzFrY21GM1pYSmZZblIwTG05MWRHeHBibVV0WkhKaGQyVnlYM050WVd4c0xtOTFkR3hwYm1VdFpISmhkMlZ5WDJOc2IzTmxaQ0I3WEc0Z0lHSnZkSFJ2YlRvZ0xUTTNNSEI0TzF4dWZWeHVMbTkxZEd4cGJtVXRaSEpoZDJWeVgySjBkQzV2ZFhSc2FXNWxMV1J5WVhkbGNsOXlaV2QxYkdGeUxtOTFkR3hwYm1VdFpISmhkMlZ5WDJOc2IzTmxaQ0I3WEc0Z0lHSnZkSFJ2YlRvZ0xUUXhNSEI0TzF4dWZWeHVMbTkxZEd4cGJtVXRaSEpoZDJWeVgySjBkQzV2ZFhSc2FXNWxMV1J5WVhkbGNsOXRaV1JwZFcwdWIzVjBiR2x1WlMxa2NtRjNaWEpmWTJ4dmMyVmtJSHRjYmlBZ1ltOTBkRzl0T2lBdE5EVXdjSGc3WEc1OVhHNHViM1YwYkdsdVpTMWtjbUYzWlhKZlluUjBMbTkxZEd4cGJtVXRaSEpoZDJWeVgyeGhjbWRsTG05MWRHeHBibVV0WkhKaGQyVnlYMk5zYjNObFpDQjdYRzRnSUdKdmRIUnZiVG9nTFRRNU1IQjRPMXh1ZlZ4dUxtOTFkR3hwYm1VdFpISmhkMlZ5WDI5d1pXNWxaQ0I3WEc0Z0lIWnBjMmxpYVd4cGRIazZJSFpwYzJsaWJHVTdYRzRnSUhvdGFXNWtaWGc2SUhaaGNpZ3RMVzkxZEd4cGJtVXRla2x1WkdWNEtUdGNibjFjYmk1dmRYUnNhVzVsTFdSeVlYZGxjbDl2Y0dWdVpXUXViM1YwYkdsdVpTMWtjbUYzWlhJZ2UxeHVJQ0J3YjNOcGRHbHZiam9nWm1sNFpXUTdYRzU5WEc0dWIzVjBiR2x1WlMxa2NtRjNaWEpmYjNCbGJtVmtMbTkxZEd4cGJtVXRaSEpoZDJWeVgzSjBiQ0I3WEc0Z0lISnBaMmgwT2lBd08xeHVmVnh1TG05MWRHeHBibVV0WkhKaGQyVnlYMjl3Wlc1bFpDNXZkWFJzYVc1bExXUnlZWGRsY2w5c2RISWdlMXh1SUNCc1pXWjBPaUF3TzF4dWZWeHVMbTkxZEd4cGJtVXRaSEpoZDJWeVgyOXdaVzVsWkM1dmRYUnNhVzVsTFdSeVlYZGxjbDkwZEdJZ2UxeHVJQ0IwYjNBNklEQTdYRzU5WEc0dWIzVjBiR2x1WlMxa2NtRjNaWEpmYjNCbGJtVmtMbTkxZEd4cGJtVXRaSEpoZDJWeVgySjBkQ0I3WEc0Z0lHSnZkSFJ2YlRvZ01EdGNibjFjYmk1dmRYUnNhVzVsTFdSeVlYZGxjbDl2Wm1aelpYUXViM1YwYkdsdVpTMWtjbUYzWlhKZmNuUnNMRnh1TG05MWRHeHBibVV0WkhKaGQyVnlYMjltWm5ObGRDNXZkWFJzYVc1bExXUnlZWGRsY2w5c2RISWdlMXh1SUNCb1pXbG5hSFE2SUdOaGJHTW9NVEF3SlNBdElEUmxiU2s3WEc0Z0lIUnZjRG9nTlRBbE8xeHVJQ0IwY21GdWMyWnZjbTA2SUhSeVlXNXpiR0YwWlZrb0xUVXdKU2s3WEc1OVhHNHViM1YwYkdsdVpTMWtjbUYzWlhKZmIyWm1jMlYwTG05MWRHeHBibVV0WkhKaGQyVnlYM1IwWWl4Y2JpNXZkWFJzYVc1bExXUnlZWGRsY2w5dlptWnpaWFF1YjNWMGJHbHVaUzFrY21GM1pYSmZZblIwSUh0Y2JpQWdkMmxrZEdnNklHTmhiR01vTVRBd0pTQXRJRFJsYlNrN1hHNGdJR3hsWm5RNklEVXdKVHRjYmlBZ2RISmhibk5tYjNKdE9pQjBjbUZ1YzJ4aGRHVllLQzAxTUNVcE8xeHVmVnh1TG05MWRHeHBibVV0WkhKaGQyVnlYMjltWm5ObGRDNXZkWFJzYVc1bExXUnlZWGRsY2w5dmNHVnVaV1F1YjNWMGJHbHVaUzFrY21GM1pYSmZjblJzSUh0Y2JpQWdjbWxuYUhRNklESmxiVHRjYm4xY2JpNXZkWFJzYVc1bExXUnlZWGRsY2w5dlptWnpaWFF1YjNWMGJHbHVaUzFrY21GM1pYSmZiM0JsYm1Wa0xtOTFkR3hwYm1VdFpISmhkMlZ5WDJ4MGNpQjdYRzRnSUd4bFpuUTZJREpsYlR0Y2JuMWNiaTV2ZFhSc2FXNWxMV1J5WVhkbGNsOXZabVp6WlhRdWIzVjBiR2x1WlMxa2NtRjNaWEpmYjNCbGJtVmtMbTkxZEd4cGJtVXRaSEpoZDJWeVgzUjBZaUI3WEc0Z0lIUnZjRG9nTW1WdE8xeHVmVnh1TG05MWRHeHBibVV0WkhKaGQyVnlYMjltWm5ObGRDNXZkWFJzYVc1bExXUnlZWGRsY2w5dmNHVnVaV1F1YjNWMGJHbHVaUzFrY21GM1pYSmZZblIwSUh0Y2JpQWdZbTkwZEc5dE9pQXlaVzA3WEc1OVhHNHViM1YwYkdsdVpTMWtjbUYzWlhKZllYVjBieTV2ZFhSc2FXNWxMV1J5WVhkbGNsOXlkR3dzWEc0dWIzVjBiR2x1WlMxa2NtRjNaWEpmWVhWMGJ5NXZkWFJzYVc1bExXUnlZWGRsY2w5c2RISWdlMXh1SUNCb1pXbG5hSFE2SUdGMWRHODdYRzRnSUcxaGVDMW9aV2xuYUhRNklHTmhiR01vTVRBd0pTQXRJRFJsYlNrN1hHNTlYRzR1YjNWMGJHbHVaUzFrY21GM1pYSmZablZzYkNCN1hHNGdJSEJoWkdScGJtYzZJREE3WEc1OVhHNHViM1YwYkdsdVpTMXVZWFpwWjJGMGIzSWdlMXh1SUNCd2IzTnBkR2x2YmpvZ2NtVnNZWFJwZG1VN1hHNGdJSG90YVc1a1pYZzZJREU3WEc0Z0lHMWhjbWRwYmpvZ01EdGNiaUFnZDJsa2RHZzZJSFpoY2lndExXOTFkR3hwYm1VdGJtRjJhV2RoZEc5eUxYZHBaSFJvS1R0Y2JpQWdiM1psY21ac2IzYzZJR0YxZEc4N1hHNTlYRzR1YjNWMGJHbHVaUzF1WVhacFoyRjBiM0l0Y0dGeVpXNTBJSHRjYmlBZ2RISmhibk5wZEdsdmJqb2dNQzR6Y3lCbFlYTmxMV2x1TFc5MWREdGNibjFjYmk1dmRYUnNhVzVsTFc1aGRtbG5ZWFJ2Y2w5ZmRHbDBiR1VnZTF4dUlDQnRZWEpuYVc0NklEQWdNVFp3ZUR0Y2JpQWdhR1ZwWjJoME9pQTBNSEI0TzF4dUlDQnNhVzVsTFdobGFXZG9kRG9nTkRCd2VEdGNiaUFnY0dGa1pHbHVaem9nTUNBeE5uQjRPMXh1SUNCaWIzSmtaWEl0WW05MGRHOXRPaUF4Y0hnZ2MyOXNhV1FnSTJSalpHWmxOanRjYmlBZ1ptOXVkQzF6YVhwbE9pQXhObkI0TzF4dUlDQm1iMjUwTFhkbGFXZG9kRG9nTkRBd08xeHVJQ0J2ZG1WeVpteHZkem9nYUdsa1pHVnVPMXh1ZlZ4dUxtOTFkR3hwYm1VdGJtRjJhV2RoZEc5eVgxOXRZV2x1SUh0Y2JpQWdjRzl6YVhScGIyNDZJSEpsYkdGMGFYWmxPMXh1SUNCNkxXbHVaR1Y0T2lBeE8xeHVJQ0J0WVhKbmFXNDZJREE3WEc0Z0lHOTJaWEptYkc5M09pQm9hV1JrWlc0N1hHNTlYRzR1YjNWMGJHbHVaUzF1WVhacFoyRjBiM0pmWDJ4cGMzUXNYRzR1YjNWMGJHbHVaUzF1WVhacFoyRjBiM0pmWDNOMVltcGxZM1FzWEc0dWIzVjBiR2x1WlMxdVlYWnBaMkYwYjNKZlgybDBaVzBnZTF4dUlDQndiM05wZEdsdmJqb2djbVZzWVhScGRtVTdYRzRnSUhvdGFXNWtaWGc2SURJN1hHNGdJRzFoY21kcGJqb2dNRHRjYmlBZ2NHRmtaR2x1WnpvZ01EdGNiaUFnYkdsemRDMXpkSGxzWlMxMGVYQmxPaUJ1YjI1bE8xeHVJQ0J2ZG1WeVpteHZkem9nYUdsa1pHVnVPMXh1ZlZ4dUxtOTFkR3hwYm1VdGJtRjJhV2RoZEc5eVgxOXNhWE4wSUh0Y2JpQWdjR0ZrWkdsdVp6b2dNQzQxWlcwZ01EdGNibjFjYmk1dmRYUnNhVzVsTFc1aGRtbG5ZWFJ2Y2w5ZmMzVmlhbVZqZENCN1hHNGdJSEJoWkdScGJtY3RiR1ZtZERvZ01XVnRPMXh1ZlZ4dUxtOTFkR3hwYm1VdGJtRjJhV2RoZEc5eVgxOXBkR1Z0SUh0Y2JpQWdiV0Z5WjJsdU9pQXdPMXh1SUNCc2FXNWxMV2hsYVdkb2REb2dNekJ3ZUR0Y2JpQWdabTl1ZEMxemFYcGxPaUF4TTNCNE8xeHVJQ0J2ZG1WeVpteHZkem9nYUdsa1pHVnVPMXh1ZlZ4dUxtOTFkR3hwYm1VdGJtRjJhV2RoZEc5eVgxOXdiR0ZqWldodmJHUmxjaUI3WEc0Z0lIQnZjMmwwYVc5dU9pQmhZbk52YkhWMFpUdGNiaUFnZWkxcGJtUmxlRG9nTVR0Y2JpQWdkRzl3T2lBd08xeHVJQ0JzWldaME9pQXdPMXh1SUNCM2FXUjBhRG9nTVRBd0pUdGNiaUFnYUdWcFoyaDBPaUF6TUhCNE8xeHVJQ0JpWVdOclozSnZkVzVrTFdOdmJHOXlPaUFqWmpkbU9HWTVPMXh1SUNCaWIzSmtaWEl0YkdWbWREb2dNbkI0SUhOdmJHbGtJQ013TlRnNU5ESTdYRzRnSUhSeVlXNXphWFJwYjI0dFpIVnlZWFJwYjI0NklEQXVNbk03WEc0Z0lHSnZlQzF6YVhwcGJtYzZJR0p2Y21SbGNpMWliM2c3WEc0Z0lHOTJaWEptYkc5M09pQm9hV1JrWlc0N1hHNTlYRzR1YjNWMGJHbHVaUzF1WVhacFoyRjBiM0pmWDJGdVkyaHZjaUI3WEc0Z0lIZG9hWFJsTFhOd1lXTmxPaUJ1YjNkeVlYQTdYRzRnSUhSbGVIUXRiM1psY21ac2IzYzZJR1ZzYkdsd2MybHpPMXh1SUNCdmRtVnlabXh2ZHpvZ2FHbGtaR1Z1TzF4dUlDQmthWE53YkdGNU9pQmliRzlqYXp0Y2JpQWdjR0ZrWkdsdVp6b2dNQ0F4TGpWbGJUdGNibjFjYmk1dmRYUnNhVzVsTFc1aGRtbG5ZWFJ2Y2w5ZllXNWphRzl5T214cGJtc3NYRzR1YjNWMGJHbHVaUzF1WVhacFoyRjBiM0pmWDJGdVkyaHZjanAyYVhOcGRHVmtMRnh1TG05MWRHeHBibVV0Ym1GMmFXZGhkRzl5WDE5aGJtTm9iM0k2YUc5MlpYSWdlMXh1SUNCMFpYaDBMV1JsWTI5eVlYUnBiMjQ2SUc1dmJtVTdYRzRnSUdOdmJHOXlPaUFqTlRVMU8xeHVmVnh1TG05MWRHeHBibVV0Ym1GMmFXZGhkRzl5WDE5aGJtTm9iM0k2YUc5MlpYSWdlMXh1SUNCamIyeHZjam9nSXpBMU9EazBNanRjYm4xY2JpNXZkWFJzYVc1bExXNWhkbWxuWVhSdmNsOWZZMjlrWlNCN1hHNGdJSEJoWkdScGJtY3RjbWxuYUhRNklEQXVOV1Z0TzF4dWZWeHVMbTkxZEd4cGJtVXRibUYyYVdkaGRHOXlYMmhwWjJoc2FXZG9kQzV2ZFhSc2FXNWxMVzVoZG1sbllYUnZjbDlmWVc1amFHOXlPbXhwYm1zc1hHNHViM1YwYkdsdVpTMXVZWFpwWjJGMGIzSmZhR2xuYUd4cFoyaDBMbTkxZEd4cGJtVXRibUYyYVdkaGRHOXlYMTloYm1Ob2IzSTZkbWx6YVhSbFpDeGNiaTV2ZFhSc2FXNWxMVzVoZG1sbllYUnZjbDlvYVdkb2JHbG5hSFF1YjNWMGJHbHVaUzF1WVhacFoyRjBiM0pmWDJGdVkyaHZjanBvYjNabGNpQjdYRzRnSUdOdmJHOXlPaUFqTURVNE9UUXlPMXh1SUNCbWIyNTBMWGRsYVdkb2REb2dZbTlzWkR0Y2JuMWNiaTV2ZFhSc2FXNWxMVzVoZG1sbllYUnZjbDl6ZEdsamEza3NYRzR1YjNWMGJHbHVaUzF1WVhacFoyRjBiM0pmWm1sNFpXUWdlMXh1SUNCa2FYTndiR0Y1T2lCbWJHVjRPMXh1SUNCbWJHVjRMWGR5WVhBNklHNXZkM0poY0R0Y2JpQWdabXhsZUMxa2FYSmxZM1JwYjI0NklHTnZiSFZ0Ymp0Y2JpQWdlaTFwYm1SbGVEb2dkbUZ5S0MwdGIzVjBiR2x1WlMxNlNXNWtaWGdwTzF4dUlDQjBiM0E2SURBN1hHNGdJRzkyWlhKbWJHOTNPaUJvYVdSa1pXNDdYRzU5WEc0dWIzVjBiR2x1WlMxdVlYWnBaMkYwYjNKZmMzUnBZMnQ1SUM1dmRYUnNhVzVsTFc1aGRtbG5ZWFJ2Y2w5ZmRHbDBiR1VzWEc0dWIzVjBiR2x1WlMxdVlYWnBaMkYwYjNKZlptbDRaV1FnTG05MWRHeHBibVV0Ym1GMmFXZGhkRzl5WDE5MGFYUnNaU3hjYmk1dmRYUnNhVzVsTFc1aGRtbG5ZWFJ2Y2w5emRHbGphM2tnTG05MWRHeHBibVV0Ym1GMmFXZGhkRzl5WDE5dFlXbHVMRnh1TG05MWRHeHBibVV0Ym1GMmFXZGhkRzl5WDJacGVHVmtJQzV2ZFhSc2FXNWxMVzVoZG1sbllYUnZjbDlmYldGcGJpQjdYRzRnSUdKdmVDMXphWHBwYm1jNklHSnZjbVJsY2kxaWIzZzdYRzU5WEc0dWIzVjBiR2x1WlMxdVlYWnBaMkYwYjNKZmMzUnBZMnQ1SUM1dmRYUnNhVzVsTFc1aGRtbG5ZWFJ2Y2w5ZmRHbDBiR1VzWEc0dWIzVjBiR2x1WlMxdVlYWnBaMkYwYjNKZlptbDRaV1FnTG05MWRHeHBibVV0Ym1GMmFXZGhkRzl5WDE5MGFYUnNaU0I3WEc0Z0lHWnNaWGd0YzJoeWFXNXJPaUF3TzF4dWZWeHVMbTkxZEd4cGJtVXRibUYyYVdkaGRHOXlYM04wYVdOcmVTQXViM1YwYkdsdVpTMXVZWFpwWjJGMGIzSmZYMjFoYVc0c1hHNHViM1YwYkdsdVpTMXVZWFpwWjJGMGIzSmZabWw0WldRZ0xtOTFkR3hwYm1VdGJtRjJhV2RoZEc5eVgxOXRZV2x1SUh0Y2JpQWdabXhsZURvZ01UdGNiaUFnYjNabGNtWnNiM2M2SUdGMWRHODdYRzU5WEc0dWIzVjBiR2x1WlMxdVlYWnBaMkYwYjNKZmMzUnBZMnQ1SUh0Y2JpQWdjRzl6YVhScGIyNDZJSE4wYVdOcmVUdGNiaUFnYldGNExXaGxhV2RvZERvZ2RtRnlLQzB0YjNWMGJHbHVaUzF6ZEdsamEza3RhR1ZwWjJoMEtUdGNibjFjYmk1dmRYUnNhVzVsTFc1aGRtbG5ZWFJ2Y2w5bWFYaGxaQ0I3WEc0Z0lIQnZjMmwwYVc5dU9pQm1hWGhsWkR0Y2JpQWdiV0Y0TFdobGFXZG9kRG9nTVRBd0pUdGNibjFjYmk1dmRYUnNhVzVsTFc1aGRtbG5ZWFJ2Y2w5b2FXUmtaVzRnZTF4dUlDQmthWE53YkdGNU9pQnViMjVsTzF4dWZWeHVMbTkxZEd4cGJtVXRibUYyYVdkaGRHOXlYMlp2YkdSbFpDQjdYRzRnSUhkcFpIUm9PaUF3TzF4dUlDQnZkbVZ5Wm14dmR6b2dhR2xrWkdWdU8xeHVmVnh1THlvcVhHNGdLaUJtYjI1MExteGxjM01nTFNEbHJaZmt2WlBubTdqbGhiUG1vTGZsdkk5Y2JpQXFJRDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMWNiaUFxSUVOeVpXRjBaV1FnUW5rNklGbGhiMmhoYVhocFlXOWNiaUFxSUZWd1pHRjBaVG9nTWpBeU1pNHpMakUyWEc0Z0tpOWNiaThxSUQwOVBUMDlQU0Rsclpma3ZaTWdQVDA5UFQwOUlDb3ZYRzR2S2lBOVBUMDlQVDBnNWEyWDZZZU5JRDA5UFQwOVBTQXFMMXh1THlvZ1BUMDlQVDA5SU9XdGwrV1B0eUE5UFQwOVBUMGdLaTljYmk4cUtseHVJQ29nYldsNGFXNXpMbXhsYzNNZ0xTRGx0NlhsaGJmbGg3M21sYkJjYmlBcUlEMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQxY2JpQXFJRU55WldGMFpXUWdRbms2SUZsaGIyaGhhWGhwWVc5Y2JpQXFJRlZ3WkdGMFpUb2dNakF5TWk0ekxqRXhYRzRnS2k5Y2JpOHFLbHh1SUNvZ2NtRmthWFZ6TG14bGMzTWdMU0Rsbklib3A1TG9ycjdudmE0Z2JXbDRhVzU0SU9XSHZlYVZzRnh1SUNvZ1BUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFZ4dUlDb2dRM0psWVhSbFpDQkNlVG9nV1dGdmFHRnBlR2xoYjF4dUlDb2dWWEJrWVhSbE9pQXlNREkwTGpRdU1UWmNiaUFxTDF4dUx5b2dQVDA5UFQwOUlPV2NodWlua3VhZ3QrVzhqK2l1dnVlOXJ1V0h2ZWFWc0NBOVBUMDlQVDBnS2k5Y2JpNXZkWFJzYVc1bExYSmxZV1JsY2w5ZmNISnZaM0psYzNNZ2UxeHVJQ0J3YjNOcGRHbHZiam9nWm1sNFpXUTdYRzRnSUhSdmNEb2dNRHRjYmlBZ2JHVm1kRG9nTUR0Y2JpQWdlaTFwYm1SbGVEb2dNenRjYmlBZ2FHVnBaMmgwT2lBMGNIZzdYRzRnSUhkcFpIUm9PaUF4TURBbE8xeHVJQ0JpWVdOclozSnZkVzVrTFdOdmJHOXlPaUFqTlRBM1lXWmxPMXh1SUNCelkyRnNaVG9nTUNBeE8xeHVJQ0IwY21GdWMyWnZjbTB0YjNKcFoybHVPaUJzWldaME8xeHVJQ0JoYm1sdFlYUnBiMjQ2SUc5MWRHeHBibVV0Y21WaFpHVnlMWEJ5YjJkeVpYTnpJR3hwYm1WaGNqdGNiaUFnWVc1cGJXRjBhVzl1TFhScGJXVnNhVzVsT2lBdExWQnliMmR5WlhOelZHbHRaV3hwYm1VN1hHNTlYRzR1YjNWMGJHbHVaUzF5WldGa1pYSmZYM0JoY0dWeUlIdGNiaUFnWW05NExYTm9ZV1J2ZHpvZ01DQXdJRFp3ZUNBeGNIZ2dJMlJrWkR0Y2JpQWdiV0Z5WjJsdU9pQXlaVzBnWVhWMGJ6dGNiaUFnYldGNExYZHBaSFJvT2lBeE1qQXdjSGc3WEc0Z0lIQmhaR1JwYm1jNklETXVNbVZ0TzF4dUlDQmliM2d0YzJsNmFXNW5PaUJpYjNKa1pYSXRZbTk0TzF4dUlDQmlZV05yWjNKdmRXNWtMV052Ykc5eU9pQWpabVptTzF4dUlDQnZkbVZ5Wm14dmR6b2dhR2xrWkdWdU8xeHVmVnh1TG05MWRHeHBibVV0Y21WaFpHVnlYMTkwYVhSc1pTQjdYRzRnSUcxaGNtZHBiam9nTUM0Mk4yVnRJREE3WEc0Z0lIUmxlSFF0WVd4cFoyNDZJR05sYm5SbGNqdGNiaUFnWm05dWRDMW1ZVzFwYkhrNklDMWhjSEJzWlMxemVYTjBaVzBzSUVKc2FXNXJUV0ZqVTNsemRHVnRSbTl1ZEN3Z0oxTmxaMjlsSUZWSkp5d2dKMUJwYm1kR1lXNW5JRk5ESnl3Z0owaHBjbUZuYVc1dklGTmhibk1nUjBJbkxDQW5UV2xqY205emIyWjBJRmxoU0dWcEp5d2dKMGhsYkhabGRHbGpZU0JPWlhWbEp5d2dKMEZ3Y0d4bElFTnZiRzl5SUVWdGIycHBKeXdnSjFObFoyOWxJRlZKSUVWdGIycHBKeXdnSjFObFoyOWxJRlZKSUZONWJXSnZiQ2NzSUVobGJIWmxkR2xqWVN3Z1FYSnBZV3dzSUhOaGJuTXRjMlZ5YVdZN1hHNGdJR1p2Ym5RdGQyVnBaMmgwT2lCdWIzSnRZV3c3WEc0Z0lHeHBibVV0YUdWcFoyaDBPaUF4TGpObGJUdGNiaUFnWm05dWRDMXphWHBsT2lBMExqSmxiVHRjYmlBZ2IzWmxjbVpzYjNjNklHaHBaR1JsYmp0Y2JuMWNiaTV2ZFhSc2FXNWxMWEpsWVdSbGNsOWZZWEowYVdOc1pTQXViM1YwYkdsdVpTMXlaV0ZrWlhKZlgzQnliMmR5WlhOeklIdGNiaUFnWkdsemNHeGhlVG9nYm05dVpUdGNibjFjYmk1dmRYUnNhVzVsTFhKbFlXUmxjbDlvYVdSa1pXNGdlMXh1SUNCa2FYTndiR0Y1T2lCdWIyNWxPMXh1ZlZ4dUxtOTFkR3hwYm1VdGNtVmhaR1Z5WDJocFpHUmxiaTV2ZFhSc2FXNWxMWEpsWVdSbGNsOXphV0pzYVc1bklIdGNiaUFnWkdsemNHeGhlVG9nYm05dVpTQWhhVzF3YjNKMFlXNTBPMXh1ZlZ4dUxtOTFkR3hwYm1VdGNtVmhaR1Z5WDJocFpHUmxiaTV2ZFhSc2FXNWxMWEpsWVdSbGNsOXphV0pzYVc1bkxuZHlZWEJ3WlhJdWNHOXpkQ0I3WEc0Z0lHUnBjM0JzWVhrNklHNXZibVU3WEc1OVhHNHViM1YwYkdsdVpTMXlaV0ZrWlhJdExYSmxZV1JwYm1jZ2UxeHVJQ0JrYVhOd2JHRjVPaUJpYkc5amF6dGNiaUFnY0c5emFYUnBiMjQ2SUdacGVHVmtPMXh1SUNCNkxXbHVaR1Y0T2lBeU8xeHVJQ0IwYjNBNklEQTdYRzRnSUd4bFpuUTZJREE3WEc0Z0lIZHBaSFJvT2lBeE1EQWxPMXh1SUNCb1pXbG5hSFE2SURFd01DVTdYRzRnSUcxaGNtZHBiam9nTUR0Y2JpQWdZbTk0TFhOcGVtbHVaem9nWW05eVpHVnlMV0p2ZUR0Y2JpQWdjR0ZrWkdsdVp6b2dNMlZ0SURSbGJUdGNiaUFnWW1GamEyZHliM1Z1WkMxamIyeHZjam9nSTJaaFptRm1ZVHRjYmlBZ2MyTnliMnhzTFhScGJXVnNhVzVsTFc1aGJXVTZJQzB0VUhKdlozSmxjM05VYVcxbGJHbHVaVHRjYmlBZ2IzWmxjbVpzYjNjNklITmpjbTlzYkR0Y2JuMWNia0JyWlhsbWNtRnRaWE1nYjNWMGJHbHVaUzF5WldGa1pYSXRjSEp2WjNKbGMzTWdlMXh1SUNCMGJ5QjdYRzRnSUNBZ2MyTmhiR1U2SURFZ01UdGNiaUFnZlZ4dWZWeHVRRzFsWkdsaElDaHRZWGd0ZDJsa2RHZzZJRFV3TUhCNEtTQjdYRzRnSUM1dmRYUnNhVzVsTFhKbFlXUmxjaUI3WEc0Z0lDQWdiM1psY21ac2IzYzZJR2hwWkdSbGJqdGNiaUFnZlZ4dUlDQXViM1YwYkdsdVpTMXlaV0ZrWlhJZ0xtOTFkR3hwYm1VdGRHOXZiR0poY2lCN1hHNGdJQ0FnWkdsemNHeGhlVG9nWm14bGVEdGNiaUFnSUNCbWJHVjRMV1JwY21WamRHbHZiam9nY205M08xeHVJQ0FnSUdac1pYZ3RkM0poY0RvZ2JtOTNjbUZ3TzF4dUlDQWdJR0ZzYVdkdUxXbDBaVzF6T2lCalpXNTBaWEk3WEc0Z0lDQWdZV3hwWjI0dGMyVnNaam9nWVhWMGJ6dGNiaUFnSUNCMGIzQTZJREV3TUNVN1hHNGdJQ0FnY21sbmFIUTZJREE3WEc0Z0lDQWdkSEpoYm5ObWIzSnRPaUIwY21GdWMyeGhkR1ZaS0MwME9IQjRLVHRjYmlBZ0lDQjNhV1IwYURvZ01UQXdKVHRjYmlBZ0lDQm9aV2xuYUhRNklEUTRjSGc3WEc0Z0lDQWdZbTk0TFhOcGVtbHVaem9nWW05eVpHVnlMV0p2ZUR0Y2JpQWdJQ0JpYjNKa1pYSXRkRzl3T2lBeGNIZ2djMjlzYVdRZ0kyUmtaRHRjYmlBZ0lDQmlZV05yWjNKdmRXNWtMV052Ykc5eU9pQWpabVptTzF4dUlDQWdJSEJoWkdScGJtYzZJREFnTVRad2VEdGNiaUFnZlZ4dUlDQXViM1YwYkdsdVpTMXlaV0ZrWlhJZ0xtOTFkR3hwYm1VdGRHOXZiR0poY2w5ZlluVjBkRzl1SUh0Y2JpQWdJQ0JpYjNKa1pYSXRjbUZrYVhWek9pQXdPMXh1SUNBZ0lHWnNaWGc2SURFN1hHNGdJQ0FnWW05eVpHVnlPaUJ1YjI1bE8xeHVJQ0FnSUdKdmVDMXphR0ZrYjNjNklHNXZibVU3WEc0Z0lIMWNiaUFnTG05MWRHeHBibVV0Y21WaFpHVnlMUzF5WldGa2FXNW5JSHRjYmlBZ0lDQndZV1JrYVc1bk9pQXdPMXh1SUNBZ0lHSmhZMnRuY205MWJtUXRZMjlzYjNJNklDTm1abVk3WEc0Z0lDQWdZbTk0TFhOcGVtbHVaem9nWW05eVpHVnlMV0p2ZUR0Y2JpQWdmVnh1SUNBdWIzVjBiR2x1WlMxeVpXRmtaWEpmWDNCaGNHVnlJSHRjYmlBZ0lDQndiM05wZEdsdmJqb2djbVZzWVhScGRtVTdYRzRnSUNBZ2VpMXBibVJsZURvZ01UdGNiaUFnSUNCdFlYSm5hVzQ2SURBN1hHNGdJQ0FnY0dGa1pHbHVaem9nTUR0Y2JpQWdJQ0JvWldsbmFIUTZJREV3TUNVN1hHNGdJQ0FnWW05NExYTm9ZV1J2ZHpvZ2JtOXVaVHRjYmlBZ0lDQnZkbVZ5Wm14dmR6b2dhR2xrWkdWdU8xeHVJQ0I5WEc0Z0lDNXZkWFJzYVc1bExYSmxZV1JsY2w5ZmRHbDBiR1VnZTF4dUlDQWdJSGRvYVhSbExYTndZV05sT2lCdWIzZHlZWEE3WEc0Z0lDQWdkR1Y0ZEMxdmRtVnlabXh2ZHpvZ1pXeHNhWEJ6YVhNN1hHNGdJQ0FnY0c5emFYUnBiMjQ2SUdGaWMyOXNkWFJsTzF4dUlDQWdJSG90YVc1a1pYZzZJRE03WEc0Z0lDQWdkRzl3T2lBd08xeHVJQ0FnSUd4bFpuUTZJREE3WEc0Z0lDQWdiV0Z5WjJsdU9pQXdPMXh1SUNBZ0lIZHBaSFJvT2lBeE1EQWxPMXh1SUNBZ0lHaGxhV2RvZERvZ05EaHdlRHRjYmlBZ0lDQnNhVzVsTFdobGFXZG9kRG9nTkRod2VEdGNiaUFnSUNCaWIzSmtaWEl0WW05MGRHOXRPaUF4Y0hnZ2MyOXNhV1FnSTJSa1pEdGNiaUFnSUNCbWIyNTBMWE5wZW1VNklERXVPR1Z0TzF4dUlDQWdJR1p2Ym5RdGQyVnBaMmgwT2lBME1EQTdYRzRnSUNBZ1ltRmphMmR5YjNWdVpDMWpiMnh2Y2pvZ0kyWm1aanRjYmlBZ0lDQnZkbVZ5Wm14dmR6b2dhR2xrWkdWdU8xeHVJQ0I5WEc0Z0lDNXZkWFJzYVc1bExYSmxZV1JsY2w5ZllYSjBhV05zWlNCN1hHNGdJQ0FnYldGeVoybHVPaUEwT0hCNElEQTdYRzRnSUNBZ2FHVnBaMmgwT2lCallXeGpLREV3TUNVZ0xTQTVObkI0S1R0Y2JpQWdJQ0J3WVdSa2FXNW5PaUF3SURFdU1qVmxiVHRjYmlBZ0lDQnpZM0p2Ykd3dGRHbHRaV3hwYm1VdGJtRnRaVG9nTFMxTmIySnBiR1ZRY205bmNtVnpjMVJwYldWc2FXNWxPMXh1SUNBZ0lHOTJaWEptYkc5M0xYZzZJR2hwWkdSbGJqdGNiaUFnSUNCdmRtVnlabXh2ZHkxNU9pQnpZM0p2Ykd3N1hHNGdJSDFjYmlBZ0xtOTFkR3hwYm1VdGNtVmhaR1Z5WDE5aGNuUnBZMnhsSUM1dmRYUnNhVzVsTFhKbFlXUmxjbDlmY0hKdlozSmxjM01nZTF4dUlDQWdJSG90YVc1a1pYZzZJRFE3WEc0Z0lDQWdZVzVwYldGMGFXOXVPaUJ2ZFhSc2FXNWxMWEpsWVdSbGNpMXdjbTluY21WemN5QnNhVzVsWVhJN1hHNGdJQ0FnWVc1cGJXRjBhVzl1TFhScGJXVnNhVzVsT2lBdExVMXZZbWxzWlZCeWIyZHlaWE56VkdsdFpXeHBibVU3WEc0Z0lDQWdaR2x6Y0d4aGVUb2dZbXh2WTJzN1hHNGdJSDFjYm4xY2JrQnRaV1JwWVNCd2NtbHVkQ0I3WEc0Z0lHaDBiV3dzWEc0Z0lHSnZaSGtnZTF4dUlDQWdJQzhxSU9hSmsrV05zT2VhaE9XZnV1ZWhnT1d0bCtTOWsrV2twK1d3anlBcUwxeHVJQ0FnSUdadmJuUXRjMmw2WlRvZ01USndkRHRjYmlBZ0lDQXZLaURtbUw3bnBMcm9ycjdudmE3bWxvZmxyWmZwb3B6b2liTGxrb3pvZzR6bW1hL3BvcHpvaWJJZ0tpOWNiaUFnSUNCaVlXTnJaM0p2ZFc1a0xXTnZiRzl5T2lBalptWm1PMXh1SUNBZ0lHTnZiRzl5T2lBak16TXpPMXh1SUNBZ0lHaGxhV2RvZERvZ2FXNXBkR2xoYkNBaGFXMXdiM0owWVc1ME8xeHVJQ0I5WEc0Z0lDOHFJT2l1dnVlOXJ1bVR2dWFPcGVhZ3QrVzhqeUFxTDF4dUlDQmhPbXhwYm1zc1hHNGdJR0U2ZG1semFYUmxaQ3hjYmlBZ1lUcG9iM1psY2lCN1hHNGdJQ0FnZEdWNGRDMWtaV052Y21GMGFXOXVPaUIxYm1SbGNteHBibVVnSVdsdGNHOXlkR0Z1ZER0Y2JpQWdJQ0JqYjJ4dmNqb2dJelV3TjJGbVpUdGNiaUFnZlZ4dUlDQXZLaURwbXBEb2w0L2xxcExrdlpQbW9JZm5yYjRnS2k5Y2JpQWdkbWxrWlc4c1hHNGdJR0YxWkdsdklIdGNiaUFnSUNCa2FYTndiR0Y1T2lCdWIyNWxJQ0ZwYlhCdmNuUmhiblE3WEc0Z0lIMWNiaUFnTHlvZzU2R3U1TCtkNktHbzVxQzg1WnlvNW9tVDVZMnc1cGUyNTVxRTZMNjU1cUdHNVpLTTVhKzU2YjJRNXBhNTVieVA1cmlGNXBtd0lDb3ZYRzRnSUhSaFlteGxJSHRjYmlBZ0lDQjNhV1IwYURvZ01UQXdKVHRjYmlBZ0lDQmliM0prWlhJdFkyOXNiR0Z3YzJVNklHTnZiR3hoY0hObE8xeHVJQ0I5WEc0Z0lIUm9MRnh1SUNCMFpDQjdYRzRnSUNBZ1ltOXlaR1Z5T2lBeGNIZ2djMjlzYVdRZ0kyUmpaR1psTmp0Y2JpQWdJQ0J3WVdSa2FXNW5PaUE0Y0hnZ01qQndlRHRjYmlBZ2ZWeHVJQ0F1YjNWMGJHbHVaUzF0WlhOellXZGxMRnh1SUNBdWIzVjBiR2x1WlMxMGIyOXNZbUZ5SUh0Y2JpQWdJQ0F2S2lEcG1wRG9sNC9rdW9ibHQ2WGxoYmZtb0kvbGtvemt2NkhtZ2EvbWo1RG5wTHJtb1lZZ0tpOWNiaUFnSUNCa2FYTndiR0Y1T2lCdWIyNWxJQ0ZwYlhCdmNuUmhiblE3WEc0Z0lIMWNiaUFnTG05MWRHeHBibVV0Y21WaFpHVnlJSHRjYmlBZ0lDQmthWE53YkdGNU9pQmliRzlqYXlBaGFXMXdiM0owWVc1ME8xeHVJQ0FnSUc5MlpYSm1iRzkzT2lCb2FXUmtaVzQ3WEc0Z0lDQWdMeW9nNVkrVzVyYUk1THFHNTd1ZDVhKzU1YTZhNUwyTklDb3ZYRzRnSUNBZ0x5b2c2WnFRNkplUDZaaUY2Sys3NkwrYjVicW01cDJoSUNvdlhHNGdJQ0FnTHlvZzVvbVQ1WTJ3NXBlMjVMaU41cGkrNTZTNjVxMmo1cGFISUVSUFRTRG5tb1RwbUxUbHZiSG1sWWptbnB3Z0tpOWNiaUFnSUNBdktpRG1pWURtbklubWxvZm5xNkRsaG9YbHJya2dSRTlOSU9lYnVPV0ZzK2VhaE9tQ3UrV3hoZWlLZ3VlQ3VlbUR2ZW1ha09pWGorUzZoaUFxTDF4dUlDQjlYRzRnSUM1dmRYUnNhVzVsTFhKbFlXUmxjbDlmZEdsMGJHVWdlMXh1SUNBZ0lHMWhjbWRwYmpvZ01UTXVOSEIwSURBZ01qaHdkQ0FoYVcxd2IzSjBZVzUwTzF4dUlDQWdJSFJsZUhRdFlXeHBaMjQ2SUdObGJuUmxjaUFoYVcxd2IzSjBZVzUwTzF4dUlDQWdJR1p2Ym5RdGMybDZaVG9nTXpKd2RDQWhhVzF3YjNKMFlXNTBPMXh1SUNCOVhHNGdJQzV2ZFhSc2FXNWxMWEpsWVdSbGNpMHRjbVZoWkdsdVp5QjdYRzRnSUNBZ2NHOXphWFJwYjI0NklISmxiR0YwYVhabElDRnBiWEJ2Y25SaGJuUTdYRzRnSUNBZ2FHVnBaMmgwT2lCaGRYUnZJQ0ZwYlhCdmNuUmhiblE3WEc0Z0lDQWdjR0ZrWkdsdVp6b2dNQ0FoYVcxd2IzSjBZVzUwTzF4dUlDQWdJR0poWTJ0bmNtOTFibVF0WTI5c2IzSTZJQ05tWm1ZN1hHNGdJQ0FnYjNabGNtWnNiM2M2SUdocFpHUmxiaUFoYVcxd2IzSjBZVzUwTzF4dUlDQjlYRzRnSUM1dmRYUnNhVzVsTFhKbFlXUmxjbDlmY0hKdlozSmxjM01nZTF4dUlDQWdJR1JwYzNCc1lYazZJRzV2Ym1VZ0lXbHRjRzl5ZEdGdWREdGNiaUFnZlZ4dUlDQXViM1YwYkdsdVpTMXlaV0ZrWlhKZlgzQmhjR1Z5SUh0Y2JpQWdJQ0JpYjNndGMyaGhaRzkzT2lCdWIyNWxPMXh1SUNCOVhHNGdJQzV2ZFhSc2FXNWxMWEpsWVdSbGNpQndjbVVnZTF4dUlDQWdJSEJoWkdScGJtYzZJREZsYlNBaGFXMXdiM0owWVc1ME8xeHVJQ0FnSUdKdmNtUmxjam9nTVhCNElITnZiR2xrSUNOa1pHUWdJV2x0Y0c5eWRHRnVkRHRjYmlBZ0lDQmliM0prWlhJdGNtRmthWFZ6T2lBMGNIZ2dJV2x0Y0c5eWRHRnVkRHRjYmlBZ2ZWeHVJQ0F1YjNWMGJHbHVaUzF5WldGa1pYSWdjSEpsTEZ4dUlDQXViM1YwYkdsdVpTMXlaV0ZrWlhJZ1kyOWtaU0I3WEc0Z0lDQWdZbUZqYTJkeWIzVnVaQzFqYjJ4dmNqb2dJMlptWmlBaGFXMXdiM0owWVc1ME8xeHVJQ0I5WEc0Z0lDNXZkWFJzYVc1bExYSmxZV1JsY2lCMFlXSnNaU3hjYmlBZ0xtOTFkR3hwYm1VdGNtVmhaR1Z5SUdsdFp5eGNiaUFnTG05MWRHeHBibVV0Y21WaFpHVnlJSE4yWnlCN1hHNGdJQ0FnWW5KbFlXc3RhVzV6YVdSbE9pQmhkbTlwWkR0Y2JpQWdmVnh1SUNBdWIzVjBiR2x1WlMxeVpXRmtaWEpmYzJsaWJHbHVaeUI3WEc0Z0lDQWdaR2x6Y0d4aGVUb2dibTl1WlNBaGFXMXdiM0owWVc1ME8xeHVJQ0I5WEc1OVhHNHZLaUE5UFQwOVBUMDlQVDA5SUdKMWRIUnZibk11ZEdobGJXVWdMU0RtaklucGtxN2xyN3pvaUtybW9MZmx2SThnUFQwOVBUMDlQVDA5UFNBcUwxeHVMbTkxZEd4cGJtVXRkRzl2YkdKaGNpQjdYRzRnSUhCdmMybDBhVzl1T2lCbWFYaGxaRHRjYmlBZ2VpMXBibVJsZURvZ09UazVPVGs3WEc0Z0lHMWhjbWRwYmpvZ01EdGNiaUFnZEhKaGJuTnBkR2x2Ymkxa2RYSmhkR2x2YmpvZ01DNHpjenRjYmlBZ2IzWmxjbVpzYjNjNklHaHBaR1JsYmp0Y2JuMWNiaTV2ZFhSc2FXNWxMWFJ2YjJ4aVlYSmZYMkoxZEhSdmJpQjdYRzRnSUdKdmVDMXphR0ZrYjNjNklEQWdNQ0EyY0hnZ01YQjRJQ05rWTJSbVpUWTdYRzRnSUhCdmMybDBhVzl1T2lCeVpXeGhkR2wyWlR0Y2JpQWdlaTFwYm1SbGVEb2dNVHRjYmlBZ2JXRnlaMmx1T2lBeE1IQjRPMXh1SUNCM2FXUjBhRG9nTXpad2VEdGNiaUFnYUdWcFoyaDBPaUF6Tm5CNE8xeHVJQ0JpYjNKa1pYSTZJREZ3ZUNCemIyeHBaQ0FqWkdOa1ptVTJPMXh1SUNCaWIzSmtaWEl0Y21Ga2FYVnpPaUF6Y0hnN1hHNGdJR0p2ZUMxemFYcHBibWM2SUdKdmNtUmxjaTFpYjNnN1hHNGdJR0poWTJ0bmNtOTFibVF0WTI5c2IzSTZJQ05tWm1ZN1hHNGdJR04xY25OdmNqb2djRzlwYm5SbGNqdGNiaUFnZEdWNGRDMWhiR2xuYmpvZ1kyVnVkR1Z5TzF4dUlDQmpiMnh2Y2pvZ0l6azVPVHRjYmlBZ2RISmhibk5wZEdsdmJqb2dZV3hzSURBdU0zTWdNQzR4Y3lCbFlYTmxMV2x1TFc5MWREdGNiaUFnYjNabGNtWnNiM2M2SUdocFpHUmxianRjYm4xY2JpNXZkWFJzYVc1bExYUnZiMnhpWVhKZlgySjFkSFJ2Ympwb2IzWmxjaUI3WEc0Z0lHTnZiRzl5T2lBak1EVTRPVFF5TzF4dUlDQmliM0prWlhJdFkyOXNiM0k2SUNNd05UZzVOREk3WEc0Z0lIUnlZVzV6Wm05eWJUb2djMk5oYkdVb01TNHpOU2s3WEc1OVhHNHViM1YwYkdsdVpTMTBiMjlzWW1GeVgxOWlkWFIwYjI0dWFHbGtaU0I3WEc0Z0lHUnBjM0JzWVhrNklHNXZibVU3WEc1OVhHNHViM1YwYkdsdVpTMTBiMjlzWW1GeVgxOWhibU5vYjNJNmJHbHVheXhjYmk1dmRYUnNhVzVsTFhSdmIyeGlZWEpmWDJGdVkyaHZjanAyYVhOcGRHVmtMRnh1TG05MWRHeHBibVV0ZEc5dmJHSmhjbDlmWVc1amFHOXlPbWh2ZG1WeUlIdGNiaUFnWTI5c2IzSTZJQ001T1RrN1hHNGdJSFJsZUhRdFpHVmpiM0poZEdsdmJqb2dibTl1WlR0Y2JuMWNiaTV2ZFhSc2FXNWxMWFJ2YjJ4aVlYSmZYMkZ1WTJodmNqcG9iM1psY2lCN1hHNGdJR052Ykc5eU9pQWpNRFU0T1RReU8xeHVmVnh1TG05MWRHeHBibVV0ZEc5dmJHSmhjbDlmYVdOdmJpQjdYRzRnSUhCdmMybDBhVzl1T2lCaFluTnZiSFYwWlR0Y2JpQWdlaTFwYm1SbGVEb2dNanRjYmlBZ2RHOXdPaUExTUNVN1hHNGdJR3hsWm5RNklEVXdKVHRjYmlBZ2QybGtkR2c2SURJd2NIZzdYRzRnSUdobGFXZG9kRG9nTWpCd2VEdGNiaUFnZEhKaGJuTm1iM0p0T2lCMGNtRnVjMnhoZEdVb0xUVXdKU3dnTFRVd0pTazdYRzRnSUdacGJHdzZJR04xY25KbGJuUmpiMnh2Y2p0Y2JpQWdiM1psY21ac2IzYzZJR2hwWkdSbGJqdGNibjFjYmk1dmRYUnNhVzVsTFhSdmIyeGlZWEpmWVdOMGFYWmxMbTkxZEd4cGJtVXRkRzl2YkdKaGNsOWZZblYwZEc5dUlIdGNiaUFnWTI5c2IzSTZJQ05tWm1ZN1hHNGdJR0poWTJ0bmNtOTFibVF0WTI5c2IzSTZJQ013TlRnNU5ESTdYRzRnSUdKdmNtUmxjaTFqYjJ4dmNqb2dJekExT0RrME1qdGNibjFjYmk1dmRYUnNhVzVsTFhSdmIyeGlZWEpmWVdOMGFYWmxMbTkxZEd4cGJtVXRkRzl2YkdKaGNsOWZZblYwZEc5dU9taHZkbVZ5SUh0Y2JpQWdZMjlzYjNJNklDTm1abVk3WEc1OVhHNHViM1YwYkdsdVpTMTBiMjlzWW1GeVgyRmpkR2wyWlNBdWIzVjBiR2x1WlMxMGIyOXNZbUZ5WDE5aGJtTm9iM0k2YkdsdWF5eGNiaTV2ZFhSc2FXNWxMWFJ2YjJ4aVlYSmZZV04wYVhabElDNXZkWFJzYVc1bExYUnZiMnhpWVhKZlgyRnVZMmh2Y2pwMmFYTnBkR1ZrTEZ4dUxtOTFkR3hwYm1VdGRHOXZiR0poY2w5aFkzUnBkbVVnTG05MWRHeHBibVV0ZEc5dmJHSmhjbDlmWVc1amFHOXlPbWh2ZG1WeUlIdGNiaUFnWTI5c2IzSTZJQ05tWm1ZN1hHNTlYRzR1YjNWMGJHbHVaUzEwYjI5c1ltRnlYM0p2ZFc1a1pXUXViM1YwYkdsdVpTMTBiMjlzWW1GeVgxOWlkWFIwYjI0Z2UxeHVJQ0JpYjNKa1pYSXRjbUZrYVhWek9pQXhPSEI0TzF4dWZWeHVMbTkxZEd4cGJtVXRkRzl2YkdKaGNsOWthWE5oWW14bFpDNXZkWFJzYVc1bExYUnZiMnhpWVhKZlgyRnVZMmh2Y2pwc2FXNXJMRnh1TG05MWRHeHBibVV0ZEc5dmJHSmhjbDlrYVhOaFlteGxaQ0F1YjNWMGJHbHVaUzEwYjI5c1ltRnlYMTloYm1Ob2IzSTZiR2x1YXl4Y2JpNXZkWFJzYVc1bExYUnZiMnhpWVhKZlpHbHpZV0pzWldRdWIzVjBiR2x1WlMxMGIyOXNZbUZ5WDE5aGJtTm9iM0k2ZG1semFYUmxaQ3hjYmk1dmRYUnNhVzVsTFhSdmIyeGlZWEpmWkdsellXSnNaV1FnTG05MWRHeHBibVV0ZEc5dmJHSmhjbDlmWVc1amFHOXlPblpwYzJsMFpXUXNYRzR1YjNWMGJHbHVaUzEwYjI5c1ltRnlYMlJwYzJGaWJHVmtMbTkxZEd4cGJtVXRkRzl2YkdKaGNsOWZZVzVqYUc5eU9taHZkbVZ5TEZ4dUxtOTFkR3hwYm1VdGRHOXZiR0poY2w5a2FYTmhZbXhsWkNBdWIzVjBiR2x1WlMxMGIyOXNZbUZ5WDE5aGJtTm9iM0k2YUc5MlpYSXNYRzR1YjNWMGJHbHVaUzEwYjI5c1ltRnlYMlJwYzJGaWJHVmtMbTkxZEd4cGJtVXRkRzl2YkdKaGNsOWZZblYwZEc5dUxGeHVMbTkxZEd4cGJtVXRkRzl2YkdKaGNsOWthWE5oWW14bFpDQXViM1YwYkdsdVpTMTBiMjlzWW1GeVgxOWlkWFIwYjI0Z2UxeHVJQ0JqZFhKemIzSTZJRzV2ZEMxaGJHeHZkMlZrTzF4dUlDQmpiMnh2Y2pvZ0l6azVPVHRjYmlBZ1ltOXlaR1Z5TFdOdmJHOXlPaUFqT1RrNU8xeHVmVnh1TG05MWRHeHBibVV0ZEc5dmJHSmhjbDlrYVhOaFlteGxaQzV2ZFhSc2FXNWxMWFJ2YjJ4aVlYSmZYMkZ1WTJodmNqcHNhVzVyT21odmRtVnlMRnh1TG05MWRHeHBibVV0ZEc5dmJHSmhjbDlrYVhOaFlteGxaQ0F1YjNWMGJHbHVaUzEwYjI5c1ltRnlYMTloYm1Ob2IzSTZiR2x1YXpwb2IzWmxjaXhjYmk1dmRYUnNhVzVsTFhSdmIyeGlZWEpmWkdsellXSnNaV1F1YjNWMGJHbHVaUzEwYjI5c1ltRnlYMTloYm1Ob2IzSTZkbWx6YVhSbFpEcG9iM1psY2l4Y2JpNXZkWFJzYVc1bExYUnZiMnhpWVhKZlpHbHpZV0pzWldRZ0xtOTFkR3hwYm1VdGRHOXZiR0poY2w5ZllXNWphRzl5T25acGMybDBaV1E2YUc5MlpYSXNYRzR1YjNWMGJHbHVaUzEwYjI5c1ltRnlYMlJwYzJGaWJHVmtMbTkxZEd4cGJtVXRkRzl2YkdKaGNsOWZZVzVqYUc5eU9taHZkbVZ5T21odmRtVnlMRnh1TG05MWRHeHBibVV0ZEc5dmJHSmhjbDlrYVhOaFlteGxaQ0F1YjNWMGJHbHVaUzEwYjI5c1ltRnlYMTloYm1Ob2IzSTZhRzkyWlhJNmFHOTJaWElzWEc0dWIzVjBiR2x1WlMxMGIyOXNZbUZ5WDJScGMyRmliR1ZrTG05MWRHeHBibVV0ZEc5dmJHSmhjbDlmWW5WMGRHOXVPbWh2ZG1WeUxGeHVMbTkxZEd4cGJtVXRkRzl2YkdKaGNsOWthWE5oWW14bFpDQXViM1YwYkdsdVpTMTBiMjlzWW1GeVgxOWlkWFIwYjI0NmFHOTJaWElnZTF4dUlDQmpiMnh2Y2pvZ0l6azVPVHRjYmlBZ1ltOXlaR1Z5TFdOdmJHOXlPaUFqT1RrNU8xeHVmVnh1TG05MWRHeHBibVV0ZEc5dmJHSmhjbDlrYVhOaFlteGxaQzV2ZFhSc2FXNWxMWFJ2YjJ4aVlYSmZYMkoxZEhSdmJpeGNiaTV2ZFhSc2FXNWxMWFJ2YjJ4aVlYSmZaR2x6WVdKc1pXUWdMbTkxZEd4cGJtVXRkRzl2YkdKaGNsOWZZblYwZEc5dUlIdGNiaUFnWW1GamEyZHliM1Z1WkMxamIyeHZjam9nSTJZMVpqVm1OVHRjYm4xY2JpNXZkWFJzYVc1bExYUnZiMnhpWVhKZmRIUmlMRnh1TG05MWRHeHBibVV0ZEc5dmJHSmhjbDlpZEhRZ2UxeHVJQ0JzWldaME9pQTFNQ1U3WEc0Z0lIUnlZVzV6Wm05eWJUb2dkSEpoYm5Oc1lYUmxXQ2d0TlRBbEtUdGNibjFjYmk1dmRYUnNhVzVsTFhSdmIyeGlZWEpmZEhSaUlDNXZkWFJzYVc1bExYUnZiMnhpWVhKZlgySjFkSFJ2Yml4Y2JpNXZkWFJzYVc1bExYUnZiMnhpWVhKZlluUjBJQzV2ZFhSc2FXNWxMWFJ2YjJ4aVlYSmZYMkoxZEhSdmJpQjdYRzRnSUdScGMzQnNZWGs2SUdsdWJHbHVaUzFpYkc5amF6dGNibjFjYmk1dmRYUnNhVzVsTFhSdmIyeGlZWEpmZEhSaUlIdGNiaUFnZEc5d09pQXhNbkI0TzF4dWZWeHVMbTkxZEd4cGJtVXRkRzl2YkdKaGNsOTBkR0l1YjNWMGJHbHVaUzEwYjI5c1ltRnlYMmhwWkdSbGJpQjdYRzRnSUhSdmNEb2dMVFUyY0hnN1hHNTlYRzR1YjNWMGJHbHVaUzEwYjI5c1ltRnlYMkowZENCN1hHNGdJR0p2ZEhSdmJUb2dNVEp3ZUR0Y2JuMWNiaTV2ZFhSc2FXNWxMWFJ2YjJ4aVlYSmZZblIwTG05MWRHeHBibVV0ZEc5dmJHSmhjbDlvYVdSa1pXNGdlMXh1SUNCaWIzUjBiMjA2SUMwMU5uQjRPMXh1ZlZ4dUxtOTFkR3hwYm1VdGRHOXZiR0poY2w5eWRHd3NYRzR1YjNWMGJHbHVaUzEwYjI5c1ltRnlYMngwY2lCN1hHNGdJSFJ5WVc1elptOXliVG9nZEhKaGJuTnNZWFJsV1NndE5UQWxLVHRjYmlBZ2QybGtkR2c2SURVMmNIZzdYRzU5WEc0dWIzVjBiR2x1WlMxMGIyOXNZbUZ5WDNKMGJDQjdYRzRnSUhSdmNEb2dOVEFsTzF4dUlDQnlhV2RvZERvZ01USndlRHRjYm4xY2JpNXZkWFJzYVc1bExYUnZiMnhpWVhKZmNuUnNMbTkxZEd4cGJtVXRkRzl2YkdKaGNsOW9hV1JrWlc0Z2UxeHVJQ0J5YVdkb2REb2dMVGcyY0hnN1hHNTlYRzR1YjNWMGJHbHVaUzEwYjI5c1ltRnlYMngwY2lCN1hHNGdJSFJ2Y0RvZ05UQWxPMXh1SUNCc1pXWjBPaUF4TW5CNE8xeHVmVnh1TG05MWRHeHBibVV0ZEc5dmJHSmhjbDlzZEhJdWIzVjBiR2x1WlMxMGIyOXNZbUZ5WDJocFpHUmxiaUI3WEc0Z0lHeGxablE2SUMwNE5uQjRPMXh1ZlZ4dUxtOTFkR3hwYm1VdGRHOXZiR0poY2w5MGRHSWdMbTkxZEd4cGJtVXRkRzl2YkdKaGNsOWZZblYwZEc5dUxtOTFkR3hwYm1VdGRHOXZiR0poY2w5b2FXUmtaVzRzWEc0dWIzVjBiR2x1WlMxMGIyOXNZbUZ5WDNKMGJDQXViM1YwYkdsdVpTMTBiMjlzWW1GeVgxOWlkWFIwYjI0dWIzVjBiR2x1WlMxMGIyOXNZbUZ5WDJocFpHUmxiaXhjYmk1dmRYUnNhVzVsTFhSdmIyeGlZWEpmWW5SMElDNXZkWFJzYVc1bExYUnZiMnhpWVhKZlgySjFkSFJ2Ymk1dmRYUnNhVzVsTFhSdmIyeGlZWEpmYUdsa1pHVnVMRnh1TG05MWRHeHBibVV0ZEc5dmJHSmhjbDlzZEhJZ0xtOTFkR3hwYm1VdGRHOXZiR0poY2w5ZlluVjBkRzl1TG05MWRHeHBibVV0ZEc5dmJHSmhjbDlvYVdSa1pXNGdlMXh1SUNCa2FYTndiR0Y1T2lCdWIyNWxPMXh1ZlZ4dUxtOTFkR3hwYm1VdGJXVnpjMkZuWlNCN1hHNGdJR0p2Y21SbGNpMXlZV1JwZFhNNklETndlRHRjYmlBZ1ltOTRMWE5vWVdSdmR6b2dNQ0F3SURad2VDQXhjSGdnSTJSalpHWmxOanRjYmlBZ2NHOXphWFJwYjI0NklHWnBlR1ZrTzF4dUlDQjZMV2x1WkdWNE9pQTVPVGs1TzF4dUlDQnZjR0ZqYVhSNU9pQXdMakU3WEc0Z0lIUnZjRG9nTFRVd2NIZzdYRzRnSUd4bFpuUTZJRFV3SlR0Y2JpQWdhR1ZwWjJoME9pQTBNSEI0TzF4dUlDQnRZWEpuYVc0NklEQTdYRzRnSUhCaFpHUnBibWM2SURBZ05UQndlRHRjYmlBZ2JHbHVaUzFvWldsbmFIUTZJRFF3Y0hnN1hHNGdJR1p2Ym5RdGMybDZaVG9nTVROd2VEdGNiaUFnWW1GamEyZHliM1Z1WkMxamIyeHZjam9nSTJabVpqdGNiaUFnWTI5c2IzSTZJQ00yTmpZN1hHNGdJSFJ5WVc1emFYUnBiMjQ2SUdGc2JDQXdMalZ6SUdWaGMyVXRhVzR0YjNWME8xeHVJQ0IwY21GdWMyWnZjbTA2SUhSeVlXNXpiR0YwWlZnb0xUVXdKU2s3WEc0Z0lHOTJaWEptYkc5M09pQm9hV1JrWlc0N1hHNTlYRzR1YjNWMGJHbHVaUzF0WlhOellXZGxYMTlqYjI1MFpXNTBJSHRjYmlBZ2QyaHBkR1V0YzNCaFkyVTZJRzV2ZDNKaGNEdGNiaUFnZEdWNGRDMXZkbVZ5Wm14dmR6b2daV3hzYVhCemFYTTdYRzRnSUcxaGNtZHBiam9nTUR0Y2JpQWdiV0Y0TFhkcFpIUm9PaUEzTURCd2VEdGNiaUFnYUdWcFoyaDBPaUEwTUhCNE8xeHVJQ0JzYVc1bExXaGxhV2RvZERvZ05EQndlRHRjYmlBZ1ptOXVkQzF6YVhwbE9pQXhNM0I0TzF4dUlDQmpiMnh2Y2pvZ0l6WTJOanRjYmlBZ2IzWmxjbVpzYjNjNklHaHBaR1JsYmp0Y2JuMWNiaTV2ZFhSc2FXNWxMVzFsYzNOaFoyVmZYMk5zYjNObExGeHVMbTkxZEd4cGJtVXRiV1Z6YzJGblpWOWZhV052YmlCN1hHNGdJSEJ2YzJsMGFXOXVPaUJoWW5OdmJIVjBaVHRjYmlBZ2VpMXBibVJsZURvZ01qdGNiaUFnZEc5d09pQXdPMXh1SUNCM2FXUjBhRG9nTkRCd2VEdGNiaUFnYUdWcFoyaDBPaUEwTUhCNE8xeHVJQ0JzYVc1bExXaGxhV2RvZERvZ05EQndlRHRjYmlBZ2RHVjRkQzFoYkdsbmJqb2dZMlZ1ZEdWeU8xeHVJQ0J2ZG1WeVpteHZkem9nYUdsa1pHVnVPMXh1ZlZ4dUxtOTFkR3hwYm1VdGJXVnpjMkZuWlY5ZmFXTnZiaUI3WEc0Z0lHeGxablE2SURBN1hHNGdJR052Ykc5eU9pQWpabVptTzF4dWZWeHVMbTkxZEd4cGJtVXRiV1Z6YzJGblpWOWZhV052YmlBdWIzVjBiR2x1WlMxcFkyOXVJSHRjYmlBZ2NHOXphWFJwYjI0NklHRmljMjlzZFhSbE8xeHVJQ0I2TFdsdVpHVjRPaUF5TzF4dUlDQjBiM0E2SURVd0pUdGNiaUFnYkdWbWREb2dOVEFsTzF4dUlDQjBjbUZ1YzJadmNtMDZJSFJ5WVc1emJHRjBaU2d0TlRBbExDQXROVEFsS1R0Y2JuMWNiaTV2ZFhSc2FXNWxMVzFsYzNOaFoyVmZYMk5zYjNObElIdGNiaUFnY21sbmFIUTZJREE3WEc0Z0lHTjFjbk52Y2pvZ2NHOXBiblJsY2p0Y2JpQWdZMjlzYjNJNklDTTVPVGs3WEc1OVhHNHViM1YwYkdsdVpTMXRaWE56WVdkbFgxOWpiRzl6WlNBdWIzVjBiR2x1WlMxcFkyOXVJSHRjYmlBZ2NHOXphWFJwYjI0NklHRmljMjlzZFhSbE8xeHVJQ0I2TFdsdVpHVjRPaUF5TzF4dUlDQjBiM0E2SURVd0pUdGNiaUFnYkdWbWREb2dOVEFsTzF4dUlDQjBjbUZ1YzJadmNtMDZJSFJ5WVc1emJHRjBaU2d0TlRBbExDQXROVEFsS1R0Y2JuMWNiaTV2ZFhSc2FXNWxMVzFsYzNOaFoyVmZYMk5zYjNObE9taHZkbVZ5SUh0Y2JpQWdZMjlzYjNJNklDTTJOalk3WEc1OVhHNHViM1YwYkdsdVpTMXRaWE56WVdkbFgybHVabThnTG05MWRHeHBibVV0YldWemMyRm5aVjlmYVdOdmJpQjdYRzRnSUdKaFkydG5jbTkxYm1RdFkyOXNiM0k2SUNNMU1EZGhabVU3WEc1OVhHNHViM1YwYkdsdVpTMXRaWE56WVdkbFgzZGhjbTVwYm1jZ0xtOTFkR3hwYm1VdGJXVnpjMkZuWlY5ZmFXTnZiaUI3WEc0Z0lHSmhZMnRuY205MWJtUXRZMjlzYjNJNklDTm1aams1TURFN1hHNTlYRzR1YjNWMGJHbHVaUzF0WlhOellXZGxYM04xWTJObGMzTWdMbTkxZEd4cGJtVXRiV1Z6YzJGblpWOWZhV052YmlCN1hHNGdJR0poWTJ0bmNtOTFibVF0WTI5c2IzSTZJQ013TlRnNU5ESTdYRzU5WEc0dWIzVjBiR2x1WlMxdFpYTnpZV2RsWDJWeWNtOXlJQzV2ZFhSc2FXNWxMVzFsYzNOaFoyVmZYMmxqYjI0Z2UxeHVJQ0JpWVdOclozSnZkVzVrTFdOdmJHOXlPaUFqWm1ZMVpEVmtPMXh1ZlZ4dUxtOTFkR3hwYm1VdGJXVnpjMkZuWlY5d2JHRnBiaUI3WEc0Z0lHMXBiaTEzYVdSMGFEb2dNVGt3Y0hnN1hHNGdJSEJoWkdScGJtYzZJREFnTlRCd2VDQXdJREUxY0hnN1hHNTlYRzR1YjNWMGJHbHVaUzF0WlhOellXZGxYM0JzWVdsdUxtOTFkR3hwYm1VdGJXVnpjMkZuWlY5cGJtWnZJSHRjYmlBZ1ltOXlaR1Z5TFd4bFpuUTZJRFZ3ZUNCemIyeHBaQ0FqTlRBM1lXWmxPMXh1SUNCaVlXTnJaM0p2ZFc1a0xXTnZiRzl5T2lBalpXTm1PR1ptTzF4dWZWeHVMbTkxZEd4cGJtVXRiV1Z6YzJGblpWOXdiR0ZwYmk1dmRYUnNhVzVsTFcxbGMzTmhaMlZmZDJGeWJtbHVaeUI3WEc0Z0lHSnZjbVJsY2kxc1pXWjBPaUExY0hnZ2MyOXNhV1FnSTJabU9Ua3dNVHRjYmlBZ1ltRmphMmR5YjNWdVpDMWpiMnh2Y2pvZ0kyWm1abUpsTmp0Y2JuMWNiaTV2ZFhSc2FXNWxMVzFsYzNOaFoyVmZjR3hoYVc0dWIzVjBiR2x1WlMxdFpYTnpZV2RsWDNOMVkyTmxjM01nZTF4dUlDQmliM0prWlhJdGJHVm1kRG9nTlhCNElITnZiR2xrSUNNd05UZzVOREk3WEc0Z0lHSmhZMnRuY205MWJtUXRZMjlzYjNJNklDTmxNV1kyWldJN1hHNTlYRzR1YjNWMGJHbHVaUzF0WlhOellXZGxYM0JzWVdsdUxtOTFkR3hwYm1VdGJXVnpjMkZuWlY5bGNuSnZjaUI3WEc0Z0lHSnZjbVJsY2kxc1pXWjBPaUExY0hnZ2MyOXNhV1FnSTJabU5XUTFaRHRjYmlBZ1ltRmphMmR5YjNWdVpDMWpiMnh2Y2pvZ0kyWm1aakZtTUR0Y2JuMWNiaTV2ZFhSc2FXNWxMVzFsYzNOaFoyVmZjR3hoYVc0Z0xtOTFkR3hwYm1VdGJXVnpjMkZuWlY5ZmFXTnZiaUI3WEc0Z0lIZHBaSFJvT2lBd08xeHVJQ0JrYVhOd2JHRjVPaUJ1YjI1bE8xeHVmVnh1TG05MWRHeHBibVV0YldWemMyRm5aVjl3YkdGcGJpQXViM1YwYkdsdVpTMXRaWE56WVdkbFgxOXBZMjl1SUM1dmRYUnNhVzVsTFdsamIyNGdlMXh1SUNCa2FYTndiR0Y1T2lCdWIyNWxPMXh1ZlZ4dUxtOTFkR3hwYm1VdGJXVnpjMkZuWlY5c2FXZG9kQ0I3WEc0Z0lHMXBiaTEzYVdSMGFEb2dNVGd3Y0hnN1hHNGdJSEJoWkdScGJtYzZJREFnTkRCd2VEdGNibjFjYmk1dmRYUnNhVzVsTFcxbGMzTmhaMlZmYkdsbmFIUXViM1YwYkdsdVpTMXRaWE56WVdkbFgybHVabThnTG05MWRHeHBibVV0YldWemMyRm5aVjlmYVdOdmJpQjdYRzRnSUdOdmJHOXlPaUFqTlRBM1lXWmxPMXh1ZlZ4dUxtOTFkR3hwYm1VdGJXVnpjMkZuWlY5c2FXZG9kQzV2ZFhSc2FXNWxMVzFsYzNOaFoyVmZkMkZ5Ym1sdVp5QXViM1YwYkdsdVpTMXRaWE56WVdkbFgxOXBZMjl1SUh0Y2JpQWdZMjlzYjNJNklDTm1aams1TURFN1hHNTlYRzR1YjNWMGJHbHVaUzF0WlhOellXZGxYMnhwWjJoMExtOTFkR3hwYm1VdGJXVnpjMkZuWlY5emRXTmpaWE56SUM1dmRYUnNhVzVsTFcxbGMzTmhaMlZmWDJsamIyNGdlMXh1SUNCamIyeHZjam9nSXpBMU9EazBNanRjYm4xY2JpNXZkWFJzYVc1bExXMWxjM05oWjJWZmJHbG5hSFF1YjNWMGJHbHVaUzF0WlhOellXZGxYMlZ5Y205eUlDNXZkWFJzYVc1bExXMWxjM05oWjJWZlgybGpiMjRnZTF4dUlDQmpiMnh2Y2pvZ0kyWm1OV1ExWkR0Y2JuMWNiaTV2ZFhSc2FXNWxMVzFsYzNOaFoyVmZiR2xuYUhRZ0xtOTFkR3hwYm1VdGJXVnpjMkZuWlY5ZmFXTnZiaUI3WEc0Z0lHSmhZMnRuY205MWJtUXRZMjlzYjNJNklDTm1abVk3WEc1OVhHNHViM1YwYkdsdVpTMXRaWE56WVdkbFgzSnZkVzVrSUh0Y2JpQWdZbTl5WkdWeUxYSmhaR2wxY3pvZ01qQndlRHRjYm4xY2JpNXZkWFJzYVc1bExXMWxjM05oWjJWZmNtOTFibVF1YjNWMGJHbHVaUzF0WlhOellXZGxYMlJsWm1GMWJIUWdlMXh1SUNCdGFXNHRkMmxrZEdnNklERTRNSEI0TzF4dUlDQndZV1JrYVc1bk9pQXdJRFF3Y0hnN1hHNTlYRzR1YjNWMGJHbHVaUzF0WlhOellXZGxYM0p2ZFc1a0xtOTFkR3hwYm1VdGJXVnpjMkZuWlY5a1pXWmhkV3gwSUM1dmRYUnNhVzVsTFcxbGMzTmhaMlZmWDJsamIyNGdlMXh1SUNCaWIzSmtaWEl0Y21Ga2FYVnpPaUF4TUhCNE8xeHVJQ0IwYjNBNklERXdjSGc3WEc0Z0lHeGxablE2SURFd2NIZzdYRzRnSUhkcFpIUm9PaUF5TUhCNE8xeHVJQ0JvWldsbmFIUTZJREl3Y0hnN1hHNGdJR3hwYm1VdGFHVnBaMmgwT2lBeU1IQjRPMXh1ZlZ4dUxtOTFkR3hwYm1VdGJXVnpjMkZuWlY5eWIzVnVaQzV2ZFhSc2FXNWxMVzFsYzNOaFoyVmZaR1ZtWVhWc2RDNXZkWFJzYVc1bExXMWxjM05oWjJWZlpuVnNiQzEzYVdSMGFDQjdYRzRnSUcxcGJpMTNhV1IwYURvZ01qQXdjSGc3WEc0Z0lIQmhaR1JwYm1jNklEQWdNakJ3ZUNBd0lEUXdjSGc3WEc1OVhHNHViM1YwYkdsdVpTMXRaWE56WVdkbFgzSnZkVzVrTG05MWRHeHBibVV0YldWemMyRm5aVjl3YkdGcGJpQjdYRzRnSUcxcGJpMTNhV1IwYURvZ01UazFjSGc3WEc0Z0lIQmhaR1JwYm1jNklEQWdOREJ3ZUNBd0lESXdjSGc3WEc1OVhHNHViM1YwYkdsdVpTMXRaWE56WVdkbFgzSnZkVzVrTG05MWRHeHBibVV0YldWemMyRm5aVjl3YkdGcGJpNXZkWFJzYVc1bExXMWxjM05oWjJWZlpuVnNiQzEzYVdSMGFDQjdYRzRnSUcxcGJpMTNhV1IwYURvZ01qRTFjSGc3WEc0Z0lIQmhaR1JwYm1jNklEQWdNakJ3ZUR0Y2JuMWNiaTV2ZFhSc2FXNWxMVzFsYzNOaFoyVmZablZzYkMxM2FXUjBhQ0I3WEc0Z0lHMXBiaTEzYVdSMGFEb2dNakF3Y0hnN1hHNGdJSEJoWkdScGJtYzZJREFnTVRCd2VDQXdJRFV3Y0hnN1hHNTlYRzR1YjNWMGJHbHVaUzF0WlhOellXZGxYMloxYkd3dGQybGtkR2d1YjNWMGJHbHVaUzF0WlhOellXZGxYM0JzWVdsdUlIdGNiaUFnYldsdUxYZHBaSFJvT2lBeU16QndlRHRjYmlBZ2NHRmtaR2x1WnpvZ01DQXhNSEI0SURBZ01UVndlRHRjYm4xY2JpNXZkWFJzYVc1bExXMWxjM05oWjJWZlpuVnNiQzEzYVdSMGFDNXZkWFJzYVc1bExXMWxjM05oWjJWZmJHbG5hSFFnZTF4dUlDQnRhVzR0ZDJsa2RHZzZJREl4TUhCNE8xeHVJQ0J3WVdSa2FXNW5PaUF3SURFd2NIZ2dNQ0EwTUhCNE8xeHVmVnh1TG05MWRHeHBibVV0YldWemMyRm5aVjkyYVhOcFlteGxJSHRjYmlBZ2IzQmhZMmwwZVRvZ01UdGNibjFjYmk1dmRYUnNhVzVsTFcxbGMzTmhaMlZmYUdsa1pHVnVJSHRjYmlBZ1pHbHpjR3hoZVRvZ2JtOXVaVHRjYm4xY2JpOHFJRDA5UFQwOUlGTmpjbTlzYkdKaGNpQTlQVDA5UFNBcUwxeHVPam90ZDJWaWEybDBMWE5qY205c2JHSmhjaUI3WEc0Z0lIZHBaSFJvT2lBM2NIZzdYRzRnSUdobGFXZG9kRG9nTjNCNE8xeHVJQ0F0ZDJWaWEybDBMV0p2Y21SbGNpMXlZV1JwZFhNNklEVndlRHRjYm4xY2JqbzZMWGRsWW10cGRDMXpZM0p2Ykd4aVlYSXRkSEpoWTJzdGNHbGxZMlVnZTF4dUlDQXRkMlZpYTJsMExXSnZjbVJsY2kxeVlXUnBkWE02SURWd2VEdGNibjFjYmpvNkxYZGxZbXRwZEMxelkzSnZiR3hpWVhJdGRHaDFiV0k2ZG1WeWRHbGpZV3dnZTF4dUlDQmlZV05yWjNKdmRXNWtMV052Ykc5eU9pQnlaMkpoS0RBc0lEQXNJREFzSURBdU1qVXBPMXh1SUNBdGQyVmlhMmwwTFdKdmNtUmxjaTF5WVdScGRYTTZJRFZ3ZUR0Y2JuMWNiam82TFhkbFltdHBkQzF6WTNKdmJHeGlZWEl0ZEdoMWJXSTZhRzl5YVhwdmJuUmhiQ0I3WEc0Z0lHSmhZMnRuY205MWJtUXRZMjlzYjNJNklISm5ZbUVvTUN3Z01Dd2dNQ3dnTUM0eU5TazdYRzRnSUMxM1pXSnJhWFF0WW05eVpHVnlMWEpoWkdsMWN6b2dOWEI0TzF4dWZWeHVPam90ZDJWaWEybDBMWE5qY205c2JHSmhjaTEwYUhWdFlqcG9iM1psY2lCN1hHNGdJR0poWTJ0bmNtOTFibVF0WTI5c2IzSTZJSEpuWW1Fb01Dd2dNQ3dnTUN3Z01DNHpOU2s3WEc1OVhHNDZPaTEzWldKcmFYUXRjMk55YjJ4c1ltRnlPbWh2ZG1WeUlIdGNiaUFnWW1GamEyZHliM1Z1WkMxamIyeHZjam9nY21kaVlTZ3dMQ0F3TENBd0xDQXdMakUxS1R0Y2JuMWNiaUlzSWk4cUlEMDlQVDA5UFQwOVBUMGdhV052Ymk1MGFHVnRaU0F0SUhOMlp5RGxtNzdtb0lmbm1vVG1vTGZsdkk4Z1BUMDlQVDA5UFQwOVBTQXFMMXh5WEc0dWIzVjBiR2x1WlMxcFkyOXVJSHRjY2x4dUlDQndiM05wZEdsdmJqb2djbVZzWVhScGRtVTdYSEpjYmlBZ2VpMXBibVJsZURvZ01UdGNjbHh1SUNCa2FYTndiR0Y1T2lCcGJteHBibVV0WW14dlkyczdYSEpjYmlBZ2RtVnlkR2xqWVd3dFlXeHBaMjQ2SUcxcFpHUnNaVHRjY2x4dUlDQjNhV1IwYURvZ01XVnRPMXh5WEc0Z0lHaGxhV2RvZERvZ01XVnRPMXh5WEc0Z0lHOTJaWEptYkc5M09pQm9hV1JrWlc0N1hISmNibHh5WEc0Z0lDWmZYM04yWnlCN1hISmNiaUFnSUNCd2IzTnBkR2x2YmpvZ1lXSnpiMngxZEdVN1hISmNiaUFnSUNCNkxXbHVaR1Y0T2lBeU8xeHlYRzRnSUNBZ2RHOXdPaUExTUNVN1hISmNiaUFnSUNCc1pXWjBPaUExTUNVN1hISmNiaUFnSUNCM2FXUjBhRG9nTVdWdE8xeHlYRzRnSUNBZ2FHVnBaMmgwT2lBeFpXMDdYSEpjYmlBZ0lDQm1hV3hzT2lCamRYSnlaVzUwWTI5c2IzSTdYSEpjYmlBZ0lDQjBjbUZ1YzJadmNtMDZJSFJ5WVc1emJHRjBaU2d0TlRBbExDQXROVEFsS1R0Y2NseHVJQ0FnSUc5MlpYSm1iRzkzT2lCb2FXUmtaVzQ3WEhKY2JpQWdmVnh5WEc1Y2NseHVJQ0FtWDJocFpHUmxiaUI3WEhKY2JpQWdJQ0JrYVhOd2JHRjVPaUJ1YjI1bE8xeHlYRzRnSUgxY2NseHVmVnh5WEc0aUxDSkFhVzF3YjNKMElDZGpiMnh2Y25Nbk8xeHlYRzVjY2x4dUxtOTFkR3hwYm1VdGFHVmhaR2x1WnlCN1hISmNiaUFnY0c5emFYUnBiMjQ2SUhKbGJHRjBhWFpsTzF4eVhHNGdJSG90YVc1a1pYZzZJREU3WEhKY2JpQWdiM1psY21ac2IzYzZJR2hwWkdSbGJqdGNjbHh1WEhKY2JpQWdKbDlmWVc1amFHOXlJSHRjY2x4dUlDQWdJR1JwYzNCc1lYazZJRzV2Ym1VN1hISmNibHh5WEc0Z0lDQWdKanBzYVc1ckxGeHlYRzRnSUNBZ0pqcDJhWE5wZEdWa0xGeHlYRzRnSUNBZ0pqcG9iM1psY2lCN1hISmNiaUFnSUNBZ0lHTnZiRzl5T2lCQVptOTFjblJvWDNSbGVIUmZZMjlzYjNJN1hISmNiaUFnSUNBZ0lIUmxlSFF0WkdWamIzSmhkR2x2YmpvZ2JtOXVaVHRjY2x4dUlDQWdJSDFjY2x4dVhISmNiaUFnSUNBbU9taHZkbVZ5SUh0Y2NseHVJQ0FnSUNBZ1kyOXNiM0k2SUVCd2NtbHRZWEo1WDJOdmJHOXlPMXh5WEc0Z0lDQWdmVnh5WEc0Z0lIMWNjbHh1WEhKY2JpQWdKanBvYjNabGNpQjdYSEpjYmlBZ0lDQXViM1YwYkdsdVpTMW9aV0ZrYVc1blgxOWhibU5vYjNJZ2UxeHlYRzRnSUNBZ0lDQmthWE53YkdGNU9pQnBibXhwYm1VdFlteHZZMnM3WEhKY2JpQWdJQ0I5WEhKY2JpQWdmVnh5WEc1Y2NseHVJQ0FtWDNOMFlYSjBJSHRjY2x4dUlDQWdJQ1k2YUc5MlpYSWdlMXh5WEc0Z0lDQWdJQ0J2ZG1WeVpteHZkem9nZG1semFXSnNaVHRjY2x4dUlDQWdJSDFjY2x4dVhISmNiaUFnSUNBdWIzVjBiR2x1WlMxb1pXRmthVzVuWDE5aGJtTm9iM0lnZTF4eVhHNGdJQ0FnSUNCd2IzTnBkR2x2YmpvZ1lXSnpiMngxZEdVN1hISmNiaUFnSUNBZ0lIb3RhVzVrWlhnNklESTdYSEpjYmlBZ0lDQWdJSFJ2Y0RvZ05UQWxPMXh5WEc0Z0lDQWdJQ0IwY21GdWMyWnZjbTA2SUhSeVlXNXpiR0YwWlZrb0xUVXdKU2s3WEhKY2JpQWdJQ0FnSUd4bFpuUTZJQzB4WlcwN1hISmNiaUFnSUNCOVhISmNiaUFnZlZ4eVhHNTlYSEpjYmlJc0lrQnBiWEJ2Y25RZ0p5NHZkbUZ5YVdGaWJHVnpKenRjY2x4dVFHbHRjRzl5ZENBbkxpOWpiMnh2Y25Nbk8xeHlYRzVBYVcxd2IzSjBJQ2N1TDNOb1lXUnZkeWM3WEhKY2JseHlYRzR1YjNWMGJHbHVaUzFrY21GM1pYSWdlMXh5WEc0Z0lIQnZjMmwwYVc5dU9pQnlaV3hoZEdsMlpUdGNjbHh1SUNCNkxXbHVaR1Y0T2lBdE1UdGNjbHh1SUNCMGIzQTZJREE3WEhKY2JpQWdiR1ZtZERvZ01EdGNjbHh1SUNCdFlYSm5hVzQ2SURBN1hISmNiaUFnZDJsa2RHZzZJREV3TUNVN1hISmNiaUFnYUdWcFoyaDBPaUF4TURBbE8xeHlYRzRnSUdKdmVDMXphWHBwYm1jNklHSnZjbVJsY2kxaWIzZzdYSEpjYmlBZ2RtbHphV0pwYkdsMGVUb2dhR2xrWkdWdU8xeHlYRzRnSUc5MlpYSm1iRzkzT2lCb2FXUmtaVzQ3WEhKY2JseHlYRzRnSUNaZlgyMXZaR0ZzSUh0Y2NseHVJQ0FnSUM1emFHRmtiM2RmYkdsbmFIUmZjbVZuZFd4aGNpZ3BPMXh5WEc0Z0lDQWdaR2x6Y0d4aGVUb2dabXhsZUR0Y2NseHVJQ0FnSUdac1pYZ3RaR2x5WldOMGFXOXVPaUJqYjJ4MWJXNDdYSEpjYmlBZ0lDQm1iR1Y0TFhkeVlYQTZJRzV2ZDNKaGNEdGNjbHh1SUNBZ0lIQnZjMmwwYVc5dU9pQmhZbk52YkhWMFpUdGNjbHh1SUNBZ0lIb3RhVzVrWlhnNklESXhPMXh5WEc0Z0lDQWdhR1ZwWjJoME9pQXhNREFsTzF4eVhHNGdJQ0FnWW1GamEyZHliM1Z1WkMxamIyeHZjam9nUUhkb2FYUmxPMXh5WEc0Z0lDQWdkSEpoYm5OcGRHbHZiaTFrZFhKaGRHbHZiam9nTUM0MGN6dGNjbHh1SUNBZ0lHOTJaWEptYkc5M09pQm9hV1JrWlc0N1hISmNiaUFnZlZ4eVhHNWNjbHh1SUNBbVgxOW9aV0ZrWlhJc1hISmNiaUFnSmw5ZmJXRnBiaXhjY2x4dUlDQW1YMTltYjI5MFpYSWdlMXh5WEc0Z0lDQWdkMmxrZEdnNklERXdNQ1U3WEhKY2JpQWdJQ0JpYjNndGMybDZhVzVuT2lCaWIzSmtaWEl0WW05NE8xeHlYRzRnSUgxY2NseHVYSEpjYmlBZ0psOWZhR1ZoWkdWeUxGeHlYRzRnSUNaZlgyWnZiM1JsY2lCN1hISmNiaUFnSUNCbWJHVjRMWE5vY21sdWF6b2dNRHRjY2x4dUlDQjlYSEpjYmx4eVhHNGdJQ1pmWDNScGRHeGxMRnh5WEc0Z0lDWmZYMjFoYVc0c1hISmNiaUFnSmw5ZlptOXZkR1Z5SUh0Y2NseHVJQ0FnSUhCaFpHUnBibWM2SURBZ01UWndlRHRjY2x4dUlDQjlYSEpjYmx4eVhHNGdJQ1pmWDJobFlXUmxjaXhjY2x4dUlDQW1YMTkwYVhSc1pTQjdYSEpjYmlBZ0lDQndiM05wZEdsdmJqb2djbVZzWVhScGRtVTdYSEpjYmlBZ0lDQjZMV2x1WkdWNE9pQXhPMXh5WEc0Z0lDQWdiV0Z5WjJsdU9pQXdJR0YxZEc4N1hISmNiaUFnSUNCb1pXbG5hSFE2SURVeWNIZzdYSEpjYmlBZ0lDQnNhVzVsTFdobGFXZG9kRG9nTlRKd2VEdGNjbHh1SUNBZ0lHOTJaWEptYkc5M09pQm9hV1JrWlc0N1hISmNiaUFnZlZ4eVhHNWNjbHh1SUNBbVgxOTBhWFJzWlNCN1hISmNiaUFnSUNCbWIyNTBMWE5wZW1VNklERTJjSGc3WEhKY2JpQWdJQ0JtYjI1MExYZGxhV2RvZERvZ05EQXdPMXh5WEc0Z0lDQWdiV0Z5WjJsdU9pQXdJREUyY0hnN1hISmNiaUFnSUNCaWIzZ3RjMmw2YVc1bk9pQmliM0prWlhJdFltOTRPMXh5WEc0Z0lDQWdZbTl5WkdWeUxXSnZkSFJ2YlRvZ01YQjRJSE52Ykdsa0lFQndjbWx0WVhKNVgySnZjbVJsY2w5amIyeHZjanRjY2x4dUlDQjlYSEpjYmx4eVhHNGdJQ1pmWDJOc2IzTmxJSHRjY2x4dUlDQWdJSEJ2YzJsMGFXOXVPaUJoWW5OdmJIVjBaVHRjY2x4dUlDQWdJSG90YVc1a1pYZzZJREk3WEhKY2JpQWdJQ0IwYjNBNklEVXdKVHRjY2x4dUlDQWdJSEpwWjJoME9pQXhNbkI0TzF4eVhHNGdJQ0FnZDJsa2RHZzZJREl3Y0hnN1hISmNiaUFnSUNCb1pXbG5hSFE2SURJd2NIZzdYSEpjYmlBZ0lDQnNhVzVsTFdobGFXZG9kRG9nTWpCd2VEdGNjbHh1SUNBZ0lHTnZiRzl5T2lCQVptOTFjblJvWDNSbGVIUmZZMjlzYjNJN1hISmNiaUFnSUNCbWIyNTBMWE5wZW1VNklESXdjSGc3WEhKY2JpQWdJQ0IwWlhoMExXRnNhV2R1T2lCalpXNTBaWEk3WEhKY2JpQWdJQ0JqZFhKemIzSTZJSEJ2YVc1MFpYSTdYSEpjYmlBZ0lDQjBjbUZ1YzJadmNtMDZJSFJ5WVc1emJHRjBaVmtvTFRVd0pTazdYSEpjYmlBZ0lDQnZkbVZ5Wm14dmR6b2dhR2xrWkdWdU8xeHlYRzVjY2x4dUlDQWdJQzV2ZFhSc2FXNWxMV2xqYjI0Z2UxeHlYRzRnSUNBZ0lDQndiM05wZEdsdmJqb2dZV0p6YjJ4MWRHVTdYSEpjYmlBZ0lDQWdJSG90YVc1a1pYZzZJREk3WEhKY2JpQWdJQ0FnSUhSdmNEb2dNRHRjY2x4dUlDQWdJQ0FnYkdWbWREb2dNRHRjY2x4dUlDQWdJSDFjY2x4dVhISmNiaUFnSUNBbU9taHZkbVZ5SUh0Y2NseHVJQ0FnSUNBZ1kyOXNiM0k2SUVCMGFHbHlaRjkwWlhoMFgyTnZiRzl5TzF4eVhHNGdJQ0FnZlZ4eVhHNGdJSDFjY2x4dVhISmNiaUFnSmw5ZmJXRnBiaUI3WEhKY2JpQWdJQ0JtYkdWNE9pQXhPMXh5WEc0Z0lDQWdiM1psY21ac2IzYzZJR0YxZEc4N1hISmNibHh5WEc0Z0lDQWdKaTV2ZG1WeVpteHZkeTFvYVdSa1pXNGdlMXh5WEc0Z0lDQWdJQ0J2ZG1WeVpteHZkem9nYUdsa1pHVnVPMXh5WEc0Z0lDQWdmVnh5WEc0Z0lIMWNjbHh1WEhKY2JpQWdKbDlmWm05dmRHVnlJSHRjY2x4dUlDQWdJRzFoY21kcGJqb2dNQ0JoZFhSdk8xeHlYRzRnSUNBZ2RHVjRkQzFoYkdsbmJqb2djbWxuYUhRN1hISmNiaUFnSUNCdmRtVnlabXh2ZHpvZ2FHbGtaR1Z1TzF4eVhHNGdJSDFjY2x4dVhISmNiaUFnSmw5ZmIzWmxjbXhoZVNCN1hISmNiaUFnSUNCamIyNTBaVzUwT2lBbkp6dGNjbHh1SUNBZ0lIQnZjMmwwYVc5dU9pQnlaV3hoZEdsMlpUdGNjbHh1SUNBZ0lIb3RhVzVrWlhnNklERTdYSEpjYmlBZ0lDQjBiM0E2SURBN1hISmNiaUFnSUNCc1pXWjBPaUF3TzF4eVhHNGdJQ0FnZDJsa2RHZzZJREV3TUNVN1hISmNiaUFnSUNCb1pXbG5hSFE2SURFd01DVTdYSEpjYmlBZ0lDQmlZV05yWjNKdmRXNWtMV052Ykc5eU9pQkFkMmhwZEdVN1hISmNiaUFnSUNCdmNHRmphWFI1T2lBd0xqRTdYSEpjYmlBZ0lDQnZkbVZ5Wm14dmR6b2dhR2xrWkdWdU8xeHlYRzRnSUgxY2NseHVYSEpjYmlBZ0psOXlkR3dzWEhKY2JpQWdKbDlzZEhJZ2UxeHlYRzRnSUNBZ0ppNXZkWFJzYVc1bExXUnlZWGRsY2lCN1hISmNiaUFnSUNBZ0lDWmZkR2x1ZVNCN1hISmNiaUFnSUNBZ0lDQWdkMmxrZEdnNklESTRNSEI0TzF4eVhHNGdJQ0FnSUNCOVhISmNibHh5WEc0Z0lDQWdJQ0FtWDIxcGJta2dlMXh5WEc0Z0lDQWdJQ0FnSUhkcFpIUm9PaUEwT0RCd2VEdGNjbHh1SUNBZ0lDQWdmVnh5WEc1Y2NseHVJQ0FnSUNBZ0psOXpiV0ZzYkNCN1hISmNiaUFnSUNBZ0lDQWdkMmxrZEdnNklEVTBNSEI0TzF4eVhHNGdJQ0FnSUNCOVhISmNibHh5WEc0Z0lDQWdJQ0FtWDNKbFozVnNZWElnZTF4eVhHNGdJQ0FnSUNBZ0lIZHBaSFJvT2lBMk9EQndlRHRjY2x4dUlDQWdJQ0FnZlZ4eVhHNWNjbHh1SUNBZ0lDQWdKbDl0WldScGRXMGdlMXh5WEc0Z0lDQWdJQ0FnSUhkcFpIUm9PaUEzTWpCd2VEdGNjbHh1SUNBZ0lDQWdmVnh5WEc1Y2NseHVJQ0FnSUNBZ0psOXNZWEpuWlNCN1hISmNiaUFnSUNBZ0lDQWdkMmxrZEdnNklEazJNSEI0TzF4eVhHNGdJQ0FnSUNCOVhISmNiaUFnSUNCOVhISmNiaUFnZlZ4eVhHNWNjbHh1SUNBbVgzSjBiQ0I3WEhKY2JpQWdJQ0JpYjNKa1pYSXRiR1ZtZERvZ01YQjRJSE52Ykdsa0lFQndjbWx0WVhKNVgySnZjbVJsY2w5amIyeHZjanRjY2x4dVhISmNiaUFnSUNBbUxtOTFkR3hwYm1VdFpISmhkMlZ5SUh0Y2NseHVJQ0FnSUNBZ0psOTBhVzU1SUh0Y2NseHVJQ0FnSUNBZ0lDQW1MbTkxZEd4cGJtVXRaSEpoZDJWeVgyTnNiM05sWkNCN1hISmNiaUFnSUNBZ0lDQWdJQ0J5YVdkb2REb2dMVEk1TUhCNE8xeHlYRzRnSUNBZ0lDQWdJSDFjY2x4dUlDQWdJQ0FnZlZ4eVhHNWNjbHh1SUNBZ0lDQWdKbDl0YVc1cElIdGNjbHh1SUNBZ0lDQWdJQ0FtTG05MWRHeHBibVV0WkhKaGQyVnlYMk5zYjNObFpDQjdYSEpjYmlBZ0lDQWdJQ0FnSUNCeWFXZG9kRG9nTFRRNU1IQjRPMXh5WEc0Z0lDQWdJQ0FnSUgxY2NseHVJQ0FnSUNBZ2ZWeHlYRzVjY2x4dUlDQWdJQ0FnSmw5emJXRnNiQ0I3WEhKY2JpQWdJQ0FnSUNBZ0ppNXZkWFJzYVc1bExXUnlZWGRsY2w5amJHOXpaV1FnZTF4eVhHNGdJQ0FnSUNBZ0lDQWdjbWxuYUhRNklDMDFOVEJ3ZUR0Y2NseHVJQ0FnSUNBZ0lDQjlYSEpjYmlBZ0lDQWdJSDFjY2x4dVhISmNiaUFnSUNBZ0lDWmZjbVZuZFd4aGNpQjdYSEpjYmlBZ0lDQWdJQ0FnSmk1dmRYUnNhVzVsTFdSeVlYZGxjbDlqYkc5elpXUWdlMXh5WEc0Z0lDQWdJQ0FnSUNBZ2NtbG5hSFE2SUMwMk9UQndlRHRjY2x4dUlDQWdJQ0FnSUNCOVhISmNiaUFnSUNBZ0lIMWNjbHh1WEhKY2JpQWdJQ0FnSUNaZmJXVmthWFZ0SUh0Y2NseHVJQ0FnSUNBZ0lDQW1MbTkxZEd4cGJtVXRaSEpoZDJWeVgyTnNiM05sWkNCN1hISmNiaUFnSUNBZ0lDQWdJQ0J5YVdkb2REb2dMVGN6TUhCNE8xeHlYRzRnSUNBZ0lDQWdJSDFjY2x4dUlDQWdJQ0FnZlZ4eVhHNWNjbHh1SUNBZ0lDQWdKbDlzWVhKblpTQjdYSEpjYmlBZ0lDQWdJQ0FnSmk1dmRYUnNhVzVsTFdSeVlYZGxjbDlqYkc5elpXUWdlMXh5WEc0Z0lDQWdJQ0FnSUNBZ2NtbG5hSFE2SUMwNU56QndlRHRjY2x4dUlDQWdJQ0FnSUNCOVhISmNiaUFnSUNBZ0lIMWNjbHh1SUNBZ0lIMWNjbHh1SUNCOVhISmNibHh5WEc0Z0lDWmZiSFJ5SUh0Y2NseHVJQ0FnSUdKdmNtUmxjaTF5YVdkb2REb2dNWEI0SUhOdmJHbGtJRUJ3Y21sdFlYSjVYMkp2Y21SbGNsOWpiMnh2Y2p0Y2NseHVYSEpjYmlBZ0lDQW1MbTkxZEd4cGJtVXRaSEpoZDJWeUlIdGNjbHh1SUNBZ0lDQWdKbDkwYVc1NUlIdGNjbHh1SUNBZ0lDQWdJQ0FtTG05MWRHeHBibVV0WkhKaGQyVnlYMk5zYjNObFpDQjdYSEpjYmlBZ0lDQWdJQ0FnSUNCc1pXWjBPaUF0TWprd2NIZzdYSEpjYmlBZ0lDQWdJQ0FnZlZ4eVhHNGdJQ0FnSUNCOVhISmNibHh5WEc0Z0lDQWdJQ0FtWDIxcGJta2dlMXh5WEc0Z0lDQWdJQ0FnSUNZdWIzVjBiR2x1WlMxa2NtRjNaWEpmWTJ4dmMyVmtJSHRjY2x4dUlDQWdJQ0FnSUNBZ0lHeGxablE2SUMwME9UQndlRHRjY2x4dUlDQWdJQ0FnSUNCOVhISmNiaUFnSUNBZ0lIMWNjbHh1WEhKY2JpQWdJQ0FnSUNaZmMyMWhiR3dnZTF4eVhHNGdJQ0FnSUNBZ0lDWXViM1YwYkdsdVpTMWtjbUYzWlhKZlkyeHZjMlZrSUh0Y2NseHVJQ0FnSUNBZ0lDQWdJR3hsWm5RNklDMDFOVEJ3ZUR0Y2NseHVJQ0FnSUNBZ0lDQjlYSEpjYmlBZ0lDQWdJSDFjY2x4dVhISmNiaUFnSUNBZ0lDWmZjbVZuZFd4aGNpQjdYSEpjYmlBZ0lDQWdJQ0FnSmk1dmRYUnNhVzVsTFdSeVlYZGxjbDlqYkc5elpXUWdlMXh5WEc0Z0lDQWdJQ0FnSUNBZ2JHVm1kRG9nTFRZNU1IQjRPMXh5WEc0Z0lDQWdJQ0FnSUgxY2NseHVJQ0FnSUNBZ2ZWeHlYRzVjY2x4dUlDQWdJQ0FnSmw5dFpXUnBkVzBnZTF4eVhHNGdJQ0FnSUNBZ0lDWXViM1YwYkdsdVpTMWtjbUYzWlhKZlkyeHZjMlZrSUh0Y2NseHVJQ0FnSUNBZ0lDQWdJR3hsWm5RNklDMDNNekJ3ZUR0Y2NseHVJQ0FnSUNBZ0lDQjlYSEpjYmlBZ0lDQWdJSDFjY2x4dVhISmNiaUFnSUNBZ0lDWmZiR0Z5WjJVZ2UxeHlYRzRnSUNBZ0lDQWdJQ1l1YjNWMGJHbHVaUzFrY21GM1pYSmZZMnh2YzJWa0lIdGNjbHh1SUNBZ0lDQWdJQ0FnSUd4bFpuUTZJQzA1TnpCd2VEdGNjbHh1SUNBZ0lDQWdJQ0I5WEhKY2JpQWdJQ0FnSUgxY2NseHVJQ0FnSUgxY2NseHVJQ0I5WEhKY2JseHlYRzRnSUNaZmRIUmlMRnh5WEc0Z0lDWmZZblIwSUh0Y2NseHVJQ0FnSUd4bFpuUTZJREE3WEhKY2JpQWdJQ0IzYVdSMGFEb2dNVEF3SlR0Y2NseHVYSEpjYmlBZ0lDQW1MbTkxZEd4cGJtVXRaSEpoZDJWeUlIdGNjbHh1SUNBZ0lDQWdKbDkwYVc1NUlIdGNjbHh1SUNBZ0lDQWdJQ0JvWldsbmFIUTZJREkwTUhCNE8xeHlYRzRnSUNBZ0lDQjlYSEpjYmx4eVhHNGdJQ0FnSUNBbVgyMXBibWtnZTF4eVhHNGdJQ0FnSUNBZ0lHaGxhV2RvZERvZ016SXdjSGc3WEhKY2JpQWdJQ0FnSUgxY2NseHVYSEpjYmlBZ0lDQWdJQ1pmYzIxaGJHd2dlMXh5WEc0Z0lDQWdJQ0FnSUdobGFXZG9kRG9nTXpZd2NIZzdYSEpjYmlBZ0lDQWdJSDFjY2x4dVhISmNiaUFnSUNBZ0lDWmZjbVZuZFd4aGNpQjdYSEpjYmlBZ0lDQWdJQ0FnYUdWcFoyaDBPaUEwTURCd2VEdGNjbHh1SUNBZ0lDQWdmVnh5WEc1Y2NseHVJQ0FnSUNBZ0psOXRaV1JwZFcwZ2UxeHlYRzRnSUNBZ0lDQWdJR2hsYVdkb2REb2dORFF3Y0hnN1hISmNiaUFnSUNBZ0lIMWNjbHh1WEhKY2JpQWdJQ0FnSUNaZmJHRnlaMlVnZTF4eVhHNGdJQ0FnSUNBZ0lHaGxhV2RvZERvZ05EZ3djSGc3WEhKY2JpQWdJQ0FnSUgxY2NseHVJQ0FnSUgxY2NseHVJQ0I5WEhKY2JseHlYRzRnSUNaZmRIUmlJSHRjY2x4dUlDQWdJR0p2Y21SbGNpMWliM1IwYjIwNklERndlQ0J6YjJ4cFpDQkFjSEpwYldGeWVWOWliM0prWlhKZlkyOXNiM0k3WEhKY2JseHlYRzRnSUNBZ0ppNXZkWFJzYVc1bExXUnlZWGRsY2lCN1hISmNiaUFnSUNBZ0lDWmZkR2x1ZVNCN1hISmNiaUFnSUNBZ0lDQWdKaTV2ZFhSc2FXNWxMV1J5WVhkbGNsOWpiRzl6WldRZ2UxeHlYRzRnSUNBZ0lDQWdJQ0FnZEc5d09pQXRNalV3Y0hnN1hISmNiaUFnSUNBZ0lDQWdmVnh5WEc0Z0lDQWdJQ0I5WEhKY2JseHlYRzRnSUNBZ0lDQW1YMjFwYm1rZ2UxeHlYRzRnSUNBZ0lDQWdJQ1l1YjNWMGJHbHVaUzFrY21GM1pYSmZZMnh2YzJWa0lIdGNjbHh1SUNBZ0lDQWdJQ0FnSUhSdmNEb2dMVE16TUhCNE8xeHlYRzRnSUNBZ0lDQWdJSDFjY2x4dUlDQWdJQ0FnZlZ4eVhHNWNjbHh1SUNBZ0lDQWdKbDl6YldGc2JDQjdYSEpjYmlBZ0lDQWdJQ0FnSmk1dmRYUnNhVzVsTFdSeVlYZGxjbDlqYkc5elpXUWdlMXh5WEc0Z0lDQWdJQ0FnSUNBZ2RHOXdPaUF0TXpjd2NIZzdYSEpjYmlBZ0lDQWdJQ0FnZlZ4eVhHNGdJQ0FnSUNCOVhISmNibHh5WEc0Z0lDQWdJQ0FtWDNKbFozVnNZWElnZTF4eVhHNGdJQ0FnSUNBZ0lDWXViM1YwYkdsdVpTMWtjbUYzWlhKZlkyeHZjMlZrSUh0Y2NseHVJQ0FnSUNBZ0lDQWdJSFJ2Y0RvZ0xUUXhNSEI0TzF4eVhHNGdJQ0FnSUNBZ0lIMWNjbHh1SUNBZ0lDQWdmVnh5WEc1Y2NseHVJQ0FnSUNBZ0psOXRaV1JwZFcwZ2UxeHlYRzRnSUNBZ0lDQWdJQ1l1YjNWMGJHbHVaUzFrY21GM1pYSmZZMnh2YzJWa0lIdGNjbHh1SUNBZ0lDQWdJQ0FnSUhSdmNEb2dMVFExTUhCNE8xeHlYRzRnSUNBZ0lDQWdJSDFjY2x4dUlDQWdJQ0FnZlZ4eVhHNWNjbHh1SUNBZ0lDQWdKbDlzWVhKblpTQjdYSEpjYmlBZ0lDQWdJQ0FnSmk1dmRYUnNhVzVsTFdSeVlYZGxjbDlqYkc5elpXUWdlMXh5WEc0Z0lDQWdJQ0FnSUNBZ2RHOXdPaUF0TkRrd2NIZzdYSEpjYmlBZ0lDQWdJQ0FnZlZ4eVhHNGdJQ0FnSUNCOVhISmNiaUFnSUNCOVhISmNiaUFnZlZ4eVhHNWNjbHh1SUNBbVgySjBkQ0I3WEhKY2JpQWdJQ0IwYjNBNklHbHVhWFJwWVd3N1hISmNiaUFnSUNCaWIzSmtaWEl0ZEc5d09pQXhjSGdnYzI5c2FXUWdRSEJ5YVcxaGNubGZZbTl5WkdWeVgyTnZiRzl5TzF4eVhHNWNjbHh1SUNBZ0lDWXViM1YwYkdsdVpTMWtjbUYzWlhJZ2UxeHlYRzRnSUNBZ0lDQW1YM1JwYm5rZ2UxeHlYRzRnSUNBZ0lDQWdJQ1l1YjNWMGJHbHVaUzFrY21GM1pYSmZZMnh2YzJWa0lIdGNjbHh1SUNBZ0lDQWdJQ0FnSUdKdmRIUnZiVG9nTFRJMU1IQjRPMXh5WEc0Z0lDQWdJQ0FnSUgxY2NseHVJQ0FnSUNBZ2ZWeHlYRzVjY2x4dUlDQWdJQ0FnSmw5dGFXNXBJSHRjY2x4dUlDQWdJQ0FnSUNBbUxtOTFkR3hwYm1VdFpISmhkMlZ5WDJOc2IzTmxaQ0I3WEhKY2JpQWdJQ0FnSUNBZ0lDQmliM1IwYjIwNklDMHpNekJ3ZUR0Y2NseHVJQ0FnSUNBZ0lDQjlYSEpjYmlBZ0lDQWdJSDFjY2x4dVhISmNiaUFnSUNBZ0lDWmZjMjFoYkd3Z2UxeHlYRzRnSUNBZ0lDQWdJQ1l1YjNWMGJHbHVaUzFrY21GM1pYSmZZMnh2YzJWa0lIdGNjbHh1SUNBZ0lDQWdJQ0FnSUdKdmRIUnZiVG9nTFRNM01IQjRPMXh5WEc0Z0lDQWdJQ0FnSUgxY2NseHVJQ0FnSUNBZ2ZWeHlYRzVjY2x4dUlDQWdJQ0FnSmw5eVpXZDFiR0Z5SUh0Y2NseHVJQ0FnSUNBZ0lDQW1MbTkxZEd4cGJtVXRaSEpoZDJWeVgyTnNiM05sWkNCN1hISmNiaUFnSUNBZ0lDQWdJQ0JpYjNSMGIyMDZJQzAwTVRCd2VEdGNjbHh1SUNBZ0lDQWdJQ0I5WEhKY2JpQWdJQ0FnSUgxY2NseHVYSEpjYmlBZ0lDQWdJQ1pmYldWa2FYVnRJSHRjY2x4dUlDQWdJQ0FnSUNBbUxtOTFkR3hwYm1VdFpISmhkMlZ5WDJOc2IzTmxaQ0I3WEhKY2JpQWdJQ0FnSUNBZ0lDQmliM1IwYjIwNklDMDBOVEJ3ZUR0Y2NseHVJQ0FnSUNBZ0lDQjlYSEpjYmlBZ0lDQWdJSDFjY2x4dVhISmNiaUFnSUNBZ0lDWmZiR0Z5WjJVZ2UxeHlYRzRnSUNBZ0lDQWdJQ1l1YjNWMGJHbHVaUzFrY21GM1pYSmZZMnh2YzJWa0lIdGNjbHh1SUNBZ0lDQWdJQ0FnSUdKdmRIUnZiVG9nTFRRNU1IQjRPMXh5WEc0Z0lDQWdJQ0FnSUgxY2NseHVJQ0FnSUNBZ2ZWeHlYRzRnSUNBZ2ZWeHlYRzRnSUgxY2NseHVYSEpjYmlBZ0psOXZjR1Z1WldRZ2UxeHlYRzRnSUNBZ2RtbHphV0pwYkdsMGVUb2dkbWx6YVdKc1pUdGNjbHh1SUNBZ0lIb3RhVzVrWlhnNklIWmhjaWd0TFc5MWRHeHBibVV0ZWtsdVpHVjRLVHRjY2x4dVhISmNiaUFnSUNBbUxtOTFkR3hwYm1VdFpISmhkMlZ5SUh0Y2NseHVJQ0FnSUNBZ2NHOXphWFJwYjI0NklHWnBlR1ZrTzF4eVhHNWNjbHh1SUNBZ0lDQWdKbDl5ZEd3Z2UxeHlYRzRnSUNBZ0lDQWdJSEpwWjJoME9pQXdPMXh5WEc0Z0lDQWdJQ0I5WEhKY2JseHlYRzRnSUNBZ0lDQW1YMngwY2lCN1hISmNiaUFnSUNBZ0lDQWdiR1ZtZERvZ01EdGNjbHh1SUNBZ0lDQWdmVnh5WEc1Y2NseHVJQ0FnSUNBZ0psOTBkR0lnZTF4eVhHNGdJQ0FnSUNBZ0lIUnZjRG9nTUR0Y2NseHVJQ0FnSUNBZ2ZWeHlYRzVjY2x4dUlDQWdJQ0FnSmw5aWRIUWdlMXh5WEc0Z0lDQWdJQ0FnSUdKdmRIUnZiVG9nTUR0Y2NseHVJQ0FnSUNBZ2ZWeHlYRzRnSUNBZ2ZWeHlYRzRnSUgxY2NseHVYSEpjYmlBZ0psOXZabVp6WlhRZ2UxeHlYRzRnSUNBZ0ppNXZkWFJzYVc1bExXUnlZWGRsY2lCN1hISmNiaUFnSUNBZ0lDWmZjblJzTEZ4eVhHNGdJQ0FnSUNBbVgyeDBjaUI3WEhKY2JpQWdJQ0FnSUNBZ2FHVnBaMmgwT2lCallXeGpLREV3TUNVZ0xTQTBaVzBwTzF4eVhHNGdJQ0FnSUNBZ0lIUnZjRG9nTlRBbE8xeHlYRzRnSUNBZ0lDQWdJSFJ5WVc1elptOXliVG9nZEhKaGJuTnNZWFJsV1NndE5UQWxLVHRjY2x4dUlDQWdJQ0FnZlZ4eVhHNWNjbHh1SUNBZ0lDQWdKbDkwZEdJc1hISmNiaUFnSUNBZ0lDWmZZblIwSUh0Y2NseHVJQ0FnSUNBZ0lDQjNhV1IwYURvZ1kyRnNZeWd4TURBbElDMGdOR1Z0S1R0Y2NseHVJQ0FnSUNBZ0lDQnNaV1owT2lBMU1DVTdYSEpjYmlBZ0lDQWdJQ0FnZEhKaGJuTm1iM0p0T2lCMGNtRnVjMnhoZEdWWUtDMDFNQ1VwTzF4eVhHNGdJQ0FnSUNCOVhISmNibHh5WEc0Z0lDQWdJQ0FtWDI5d1pXNWxaQ0I3WEhKY2JpQWdJQ0FnSUNBZ0ppNXZkWFJzYVc1bExXUnlZWGRsY2lCN1hISmNiaUFnSUNBZ0lDQWdJQ0FtWDNKMGJDQjdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lISnBaMmgwT2lBeVpXMDdYSEpjYmlBZ0lDQWdJQ0FnSUNCOVhISmNibHh5WEc0Z0lDQWdJQ0FnSUNBZ0psOXNkSElnZTF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0JzWldaME9pQXlaVzA3WEhKY2JpQWdJQ0FnSUNBZ0lDQjlYSEpjYmx4eVhHNGdJQ0FnSUNBZ0lDQWdKbDkwZEdJZ2UxeHlYRzRnSUNBZ0lDQWdJQ0FnSUNCMGIzQTZJREpsYlR0Y2NseHVJQ0FnSUNBZ0lDQWdJSDFjY2x4dVhISmNiaUFnSUNBZ0lDQWdJQ0FtWDJKMGRDQjdYSEpjYmlBZ0lDQWdJQ0FnSUNBZ0lHSnZkSFJ2YlRvZ01tVnRPMXh5WEc0Z0lDQWdJQ0FnSUNBZ2ZWeHlYRzRnSUNBZ0lDQWdJSDFjY2x4dUlDQWdJQ0FnZlZ4eVhHNGdJQ0FnZlZ4eVhHNGdJSDFjY2x4dVhISmNiaUFnSmw5aGRYUnZJSHRjY2x4dUlDQWdJQ1l1YjNWMGJHbHVaUzFrY21GM1pYSWdlMXh5WEc0Z0lDQWdJQ0FtWDNKMGJDeGNjbHh1SUNBZ0lDQWdKbDlzZEhJZ2UxeHlYRzRnSUNBZ0lDQWdJR2hsYVdkb2REb2dZWFYwYnp0Y2NseHVJQ0FnSUNBZ0lDQnRZWGd0YUdWcFoyaDBPaUJqWVd4aktERXdNQ1VnTFNBMFpXMHBPMXh5WEc0Z0lDQWdJQ0I5WEhKY2JpQWdJQ0I5WEhKY2JpQWdmVnh5WEc1Y2NseHVJQ0FtWDJaMWJHd2dlMXh5WEc0Z0lDQWdjR0ZrWkdsdVp6b2dNRHRjY2x4dUlDQjlYSEpjYm4xY2NseHVJaXdpTHlvcVhISmNiaUFxSUhOb1lXUnZkeTVzWlhOeklDMGc2WmkwNWIyeDVxQzM1YnlQNks2KzU3MnVJRzFwZUdsdWVDRGxoNzNtbGJCY2NseHVJQ29nUFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVnh5WEc0Z0tpQkRjbVZoZEdWa0lFSjVPaUJaWVc5b1lXbDRhV0Z2WEhKY2JpQXFJRlZ3WkdGMFpUb2dNakF5TWk0ekxqSXdYSEpjYmlBcUwxeHlYRzVBYVcxd2IzSjBJQ2N1TDJOdmJHOXljeWM3WEhKY2JseHlYRzR2S2lBOVBUMDlQVDBnNlppMDViMng1cUMzNWJ5UDZLNis1NzJ1NVllOTVwV3dJRDA5UFQwOVBTQXFMMXh5WEc0dWMyaGhaRzkzS0VCdlptWnpaWFE2SURBZ01DQTJjSGdnTVhCNExDQkFZMjlzYjNJNklFQndjbWx0WVhKNVgySnZjbVJsY2w5amIyeHZjaWtnZTF4eVhHNGdJR0p2ZUMxemFHRmtiM2M2SUVCdlptWnpaWFFnUUdOdmJHOXlPMXh5WEc1OVhISmNibHh5WEc0dWMyaGhaRzkzWDNKbFozVnNZWElvUUdOdmJHOXlPaUJBY0hKcGJXRnllVjlpYjNKa1pYSmZZMjlzYjNJcElIdGNjbHh1SUNBdWMyaGhaRzkzS0RBZ01DQTJjSGdnTVhCNExDQkFZMjlzYjNJcE8xeHlYRzU5WEhKY2JseHlYRzR1YzJoaFpHOTNYMnhoY21kbEtFQmpiMnh2Y2pvZ1FIQnlhVzFoY25sZlltOXlaR1Z5WDJOdmJHOXlLU0I3WEhKY2JpQWdMbk5vWVdSdmR5Z3dJREFnTVRKd2VDQXhjSGdzSUVCamIyeHZjaWs3WEhKY2JuMWNjbHh1WEhKY2JpNXphR0ZrYjNkZmJHbG5hSFJmY21WbmRXeGhjaWdwSUh0Y2NseHVJQ0F1YzJoaFpHOTNYM0psWjNWc1lYSW9LVHRjY2x4dWZWeHlYRzVjY2x4dUxuTm9ZV1J2ZDE5c2FXZG9kRjlzWVhKblpTZ3BJSHRjY2x4dUlDQXVjMmhoWkc5M1gyeGhjbWRsS0NrN1hISmNibjFjY2x4dVhISmNiaTV6YUdGa2IzZGZaR0Z5YTE5eVpXZDFiR0Z5S0NrZ2UxeHlYRzRnSUM1emFHRmtiM2RmY21WbmRXeGhjaWhBYzJWamIyNWtZWEo1WDJKdmNtUmxjbDlqYjJ4dmNpazdYSEpjYm4xY2NseHVYSEpjYmk1emFHRmtiM2RmWkdGeWExOXNZWEpuWlNncElIdGNjbHh1SUNBdWMyaGhaRzkzWDJ4aGNtZGxLRUJ6WldOdmJtUmhjbmxmWW05eVpHVnlYMk52Ykc5eUtUdGNjbHh1ZlZ4eVhHNGlMQ0pBYVcxd2IzSjBJQ2N1TDNaaGNtbGhZbXhsY3ljN1hISmNia0JwYlhCdmNuUWdKeTR2WTI5c2IzSnpKenRjY2x4dVFHbHRjRzl5ZENBbkxpOWxiR3hwY0hOcGN5YzdYSEpjYmx4eVhHNHViM1YwYkdsdVpTMXVZWFpwWjJGMGIzSWdlMXh5WEc0Z0lIQnZjMmwwYVc5dU9pQnlaV3hoZEdsMlpUdGNjbHh1SUNCNkxXbHVaR1Y0T2lBeE8xeHlYRzRnSUcxaGNtZHBiam9nTUR0Y2NseHVJQ0IzYVdSMGFEb2dkbUZ5S0MwdGIzVjBiR2x1WlMxdVlYWnBaMkYwYjNJdGQybGtkR2dwTzF4eVhHNGdJRzkyWlhKbWJHOTNPaUJoZFhSdk8xeHlYRzVjY2x4dUlDQW1MWEJoY21WdWRDQjdYSEpjYmlBZ0lDQjBjbUZ1YzJsMGFXOXVPaUF3TGpOeklHVmhjMlV0YVc0dGIzVjBPMXh5WEc0Z0lIMWNjbHh1WEhKY2JpQWdKbDlmZEdsMGJHVWdlMXh5WEc0Z0lDQWdiV0Z5WjJsdU9pQXdJREUyY0hnN1hISmNiaUFnSUNCb1pXbG5hSFE2SURRd2NIZzdYSEpjYmlBZ0lDQnNhVzVsTFdobGFXZG9kRG9nTkRCd2VEdGNjbHh1SUNBZ0lIQmhaR1JwYm1jNklEQWdNVFp3ZUR0Y2NseHVJQ0FnSUdKdmNtUmxjaTFpYjNSMGIyMDZJREZ3ZUNCemIyeHBaQ0JBY0hKcGJXRnllVjlpYjNKa1pYSmZZMjlzYjNJN1hISmNiaUFnSUNCbWIyNTBMWE5wZW1VNklERTJjSGc3WEhKY2JpQWdJQ0JtYjI1MExYZGxhV2RvZERvZ05EQXdPMXh5WEc0Z0lDQWdiM1psY21ac2IzYzZJR2hwWkdSbGJqdGNjbHh1SUNCOVhISmNibHh5WEc0Z0lDWmZYMjFoYVc0Z2UxeHlYRzRnSUNBZ2NHOXphWFJwYjI0NklISmxiR0YwYVhabE8xeHlYRzRnSUNBZ2VpMXBibVJsZURvZ01UdGNjbHh1SUNBZ0lHMWhjbWRwYmpvZ01EdGNjbHh1SUNBZ0lHOTJaWEptYkc5M09pQm9hV1JrWlc0N1hISmNiaUFnZlZ4eVhHNWNjbHh1SUNBbVgxOXNhWE4wTEZ4eVhHNGdJQ1pmWDNOMVltcGxZM1FzWEhKY2JpQWdKbDlmYVhSbGJTQjdYSEpjYmlBZ0lDQndiM05wZEdsdmJqb2djbVZzWVhScGRtVTdYSEpjYmlBZ0lDQjZMV2x1WkdWNE9pQXlPMXh5WEc0Z0lDQWdiV0Z5WjJsdU9pQXdPMXh5WEc0Z0lDQWdjR0ZrWkdsdVp6b2dNRHRjY2x4dUlDQWdJR3hwYzNRdGMzUjViR1V0ZEhsd1pUb2dibTl1WlR0Y2NseHVJQ0FnSUc5MlpYSm1iRzkzT2lCb2FXUmtaVzQ3WEhKY2JpQWdmVnh5WEc1Y2NseHVJQ0FtWDE5c2FYTjBJSHRjY2x4dUlDQWdJSEJoWkdScGJtYzZJREF1TldWdElEQTdYSEpjYmlBZ2ZWeHlYRzVjY2x4dUlDQW1YMTl6ZFdKcVpXTjBJSHRjY2x4dUlDQWdJSEJoWkdScGJtY3RiR1ZtZERvZ01XVnRPMXh5WEc0Z0lIMWNjbHh1WEhKY2JpQWdKbDlmYVhSbGJTQjdYSEpjYmlBZ0lDQnRZWEpuYVc0NklEQTdYSEpjYmlBZ0lDQnNhVzVsTFdobGFXZG9kRG9nTXpCd2VEdGNjbHh1SUNBZ0lHWnZiblF0YzJsNlpUb2dNVE53ZUR0Y2NseHVJQ0FnSUc5MlpYSm1iRzkzT2lCb2FXUmtaVzQ3WEhKY2JpQWdmVnh5WEc1Y2NseHVJQ0FtWDE5d2JHRmpaV2h2YkdSbGNpQjdYSEpjYmlBZ0lDQndiM05wZEdsdmJqb2dZV0p6YjJ4MWRHVTdYSEpjYmlBZ0lDQjZMV2x1WkdWNE9pQXhPMXh5WEc0Z0lDQWdkRzl3T2lBd08xeHlYRzRnSUNBZ2JHVm1kRG9nTUR0Y2NseHVJQ0FnSUhkcFpIUm9PaUF4TURBbE8xeHlYRzRnSUNBZ2FHVnBaMmgwT2lBek1IQjRPMXh5WEc0Z0lDQWdZbUZqYTJkeWIzVnVaQzFqYjJ4dmNqb2dRR2h2ZG1WeVgySm5YMk52Ykc5eU8xeHlYRzRnSUNBZ1ltOXlaR1Z5TFd4bFpuUTZJREp3ZUNCemIyeHBaQ0JBYzNWalkyVnpjMTlqYjJ4dmNqdGNjbHh1SUNBZ0lIUnlZVzV6YVhScGIyNHRaSFZ5WVhScGIyNDZJREF1TW5NN1hISmNiaUFnSUNCaWIzZ3RjMmw2YVc1bk9pQmliM0prWlhJdFltOTRPMXh5WEc0Z0lDQWdiM1psY21ac2IzYzZJR2hwWkdSbGJqdGNjbHh1SUNCOVhISmNibHh5WEc0Z0lDWmZYMkZ1WTJodmNpQjdYSEpjYmlBZ0lDQXVaV3hzYVhCemFYTW9NU2s3WEhKY2JpQWdJQ0JrYVhOd2JHRjVPaUJpYkc5amF6dGNjbHh1SUNBZ0lIQmhaR1JwYm1jNklEQWdNUzQxWlcwN1hISmNibHh5WEc0Z0lDQWdKanBzYVc1ckxGeHlYRzRnSUNBZ0pqcDJhWE5wZEdWa0xGeHlYRzRnSUNBZ0pqcG9iM1psY2lCN1hISmNiaUFnSUNBZ0lIUmxlSFF0WkdWamIzSmhkR2x2YmpvZ2JtOXVaVHRjY2x4dUlDQWdJQ0FnWTI5c2IzSTZJRUJ6WldOdmJtUmhjbmxmZEdWNGRGOWpiMnh2Y2p0Y2NseHVJQ0FnSUgxY2NseHVYSEpjYmlBZ0lDQW1PbWh2ZG1WeUlIdGNjbHh1SUNBZ0lDQWdZMjlzYjNJNklFQnpkV05qWlhOelgyTnZiRzl5TzF4eVhHNGdJQ0FnZlZ4eVhHNGdJSDFjY2x4dVhISmNiaUFnSmw5ZlkyOWtaU0I3WEhKY2JpQWdJQ0J3WVdSa2FXNW5MWEpwWjJoME9pQXdMalZsYlR0Y2NseHVJQ0I5WEhKY2JseHlYRzRnSUNaZmFHbG5hR3hwWjJoMElIdGNjbHh1SUNBZ0lDWXViM1YwYkdsdVpTMXVZWFpwWjJGMGIzSmZYMkZ1WTJodmNpQjdYSEpjYmlBZ0lDQWdJQ1k2YkdsdWF5eGNjbHh1SUNBZ0lDQWdKanAyYVhOcGRHVmtMRnh5WEc0Z0lDQWdJQ0FtT21odmRtVnlJSHRjY2x4dUlDQWdJQ0FnSUNCamIyeHZjam9nUUhOMVkyTmxjM05mWTI5c2IzSTdYSEpjYmlBZ0lDQWdJQ0FnWm05dWRDMTNaV2xuYUhRNklHSnZiR1E3WEhKY2JpQWdJQ0FnSUgxY2NseHVJQ0FnSUgxY2NseHVJQ0I5WEhKY2JseHlYRzRnSUNaZmMzUnBZMnQ1TEZ4eVhHNGdJQ1pmWm1sNFpXUWdlMXh5WEc0Z0lDQWdaR2x6Y0d4aGVUb2dabXhsZUR0Y2NseHVJQ0FnSUdac1pYZ3RkM0poY0RvZ2JtOTNjbUZ3TzF4eVhHNGdJQ0FnWm14bGVDMWthWEpsWTNScGIyNDZJR052YkhWdGJqdGNjbHh1SUNBZ0lIb3RhVzVrWlhnNklIWmhjaWd0TFc5MWRHeHBibVV0ZWtsdVpHVjRLVHRjY2x4dUlDQWdJSFJ2Y0RvZ01EdGNjbHh1SUNBZ0lHOTJaWEptYkc5M09pQm9hV1JrWlc0N1hISmNibHh5WEc0Z0lDQWdMbTkxZEd4cGJtVXRibUYyYVdkaGRHOXlJSHRjY2x4dUlDQWdJQ0FnSmw5ZmRHbDBiR1VzWEhKY2JpQWdJQ0FnSUNaZlgyMWhhVzRnZTF4eVhHNGdJQ0FnSUNBZ0lHSnZlQzF6YVhwcGJtYzZJR0p2Y21SbGNpMWliM2c3WEhKY2JpQWdJQ0FnSUgxY2NseHVYSEpjYmlBZ0lDQWdJQ1pmWDNScGRHeGxJSHRjY2x4dUlDQWdJQ0FnSUNCbWJHVjRMWE5vY21sdWF6b2dNRHRjY2x4dUlDQWdJQ0FnZlZ4eVhHNWNjbHh1SUNBZ0lDQWdKbDlmYldGcGJpQjdYSEpjYmlBZ0lDQWdJQ0FnWm14bGVEb2dNVHRjY2x4dUlDQWdJQ0FnSUNCdmRtVnlabXh2ZHpvZ1lYVjBienRjY2x4dUlDQWdJQ0FnZlZ4eVhHNGdJQ0FnZlZ4eVhHNGdJSDFjY2x4dVhISmNiaUFnSmw5emRHbGphM2tnZTF4eVhHNGdJQ0FnY0c5emFYUnBiMjQ2SUhOMGFXTnJlVHRjY2x4dUlDQWdJRzFoZUMxb1pXbG5hSFE2SUhaaGNpZ3RMVzkxZEd4cGJtVXRjM1JwWTJ0NUxXaGxhV2RvZENrN1hISmNiaUFnZlZ4eVhHNWNjbHh1SUNBbVgyWnBlR1ZrSUh0Y2NseHVJQ0FnSUhCdmMybDBhVzl1T2lCbWFYaGxaRHRjY2x4dUlDQWdJRzFoZUMxb1pXbG5hSFE2SURFd01DVTdYSEpjYmlBZ2ZWeHlYRzVjY2x4dUlDQW1YMmhwWkdSbGJpQjdYSEpjYmlBZ0lDQmthWE53YkdGNU9pQnViMjVsTzF4eVhHNGdJSDFjY2x4dVhISmNiaUFnSmw5bWIyeGtaV1FnZTF4eVhHNGdJQ0FnZDJsa2RHZzZJREE3WEhKY2JpQWdJQ0J2ZG1WeVpteHZkem9nYUdsa1pHVnVPMXh5WEc0Z0lIMWNjbHh1ZlZ4eVhHNGlMQ0l2S2lwY2NseHVJQ29nWld4c2FYQnphWE11YkdWemN5QXRJT2FXaCthY3JPZWNnZWVWcFNCdGFYaHBibmdnNVllOTVwV3dYSEpjYmlBcUlEMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQxY2NseHVJQ29nUTNKbFlYUmxaQ0JDZVRvZ1dXRnZhR0ZwZUdsaGIxeHlYRzRnS2lCVmNHUmhkR1U2SURJd01qSXVNeTR4TVZ4eVhHNGdLaTljY2x4dVhISmNiaThxSUQwOVBUMDlQU0RtbG9mbW5Lem5uSUhubGFYbGg3M21sYkFnUFQwOVBUMDlJQ292WEhKY2JpNWxiR3hwY0hOcGN5QW9RR3hwYm1WektTQjNhR1Z1SUNoQWJHbHVaWE05TVNrZ2UxeHlYRzRnSUhkb2FYUmxMWE53WVdObE9pQnViM2R5WVhBN1hISmNiaUFnZEdWNGRDMXZkbVZ5Wm14dmR6b2daV3hzYVhCemFYTTdYSEpjYmlBZ2IzWmxjbVpzYjNjNklHaHBaR1JsYmp0Y2NseHVmVnh5WEc1Y2NseHVMbVZzYkdsd2MybHpJQ2hBYkdsdVpYTXBJSGRvWlc0Z0tFQnNhVzVsY3o0OU1pa2dlMXh5WEc0Z0lDMTNaV0pyYVhRdGJHbHVaUzFqYkdGdGNEb2dRR3hwYm1Wek8xeHlYRzRnSUdScGMzQnNZWGs2SUdKdmVEdGNjbHh1SUNBdGQyVmlhMmwwTFdKdmVDMXZjbWxsYm5RNklIWmxjblJwWTJGc08xeHlYRzRnSUhSbGVIUXRiM1psY21ac2IzYzZJR1ZzYkdsd2MybHpPMXh5WEc0Z0lHOTJaWEptYkc5M09pQm9hV1JrWlc0N1hISmNibjFjY2x4dUlpd2lRR2x0Y0c5eWRDQW5MaTlqYjJ4dmNuTW5PMXh5WEc1QWFXMXdiM0owSUNjdUwyWnZiblFuTzF4eVhHNUFhVzF3YjNKMElDY3VMMjFwZUdsdWN5YzdYSEpjYmx4eVhHNHViM1YwYkdsdVpTMXlaV0ZrWlhJZ2UxeHlYRzRnSUNaZlgzQnliMmR5WlhOeklIdGNjbHh1SUNBZ0lIQnZjMmwwYVc5dU9pQm1hWGhsWkR0Y2NseHVJQ0FnSUhSdmNEb2dNRHRjY2x4dUlDQWdJR3hsWm5RNklEQTdYSEpjYmlBZ0lDQjZMV2x1WkdWNE9pQXpPMXh5WEc0Z0lDQWdhR1ZwWjJoME9pQTBjSGc3WEhKY2JpQWdJQ0IzYVdSMGFEb2dNVEF3SlR0Y2NseHVJQ0FnSUdKaFkydG5jbTkxYm1RdFkyOXNiM0k2SUVCd2NtbHRZWEo1WDJOdmJHOXlPMXh5WEc0Z0lDQWdjMk5oYkdVNklEQWdNVHRjY2x4dUlDQWdJSFJ5WVc1elptOXliUzF2Y21sbmFXNDZJR3hsWm5RN1hISmNiaUFnSUNCaGJtbHRZWFJwYjI0NklHOTFkR3hwYm1VdGNtVmhaR1Z5TFhCeWIyZHlaWE56SUd4cGJtVmhjanRjY2x4dUlDQWdJR0Z1YVcxaGRHbHZiaTEwYVcxbGJHbHVaVG9nTFMxUWNtOW5jbVZ6YzFScGJXVnNhVzVsTzF4eVhHNGdJSDFjY2x4dVhISmNiaUFnSmw5ZmNHRndaWElnZTF4eVhHNGdJQ0FnTG5Ob1lXUnZkMTlrWVhKclgzSmxaM1ZzWVhJb0tUdGNjbHh1SUNBZ0lHMWhjbWRwYmpvZ01tVnRJR0YxZEc4N1hISmNiaUFnSUNCdFlYZ3RkMmxrZEdnNklERXlNREJ3ZUR0Y2NseHVJQ0FnSUhCaFpHUnBibWM2SURNdU1tVnRPMXh5WEc0Z0lDQWdZbTk0TFhOcGVtbHVaem9nWW05eVpHVnlMV0p2ZUR0Y2NseHVJQ0FnSUdKaFkydG5jbTkxYm1RdFkyOXNiM0k2SUVCM2FHbDBaVHRjY2x4dUlDQWdJRzkyWlhKbWJHOTNPaUJvYVdSa1pXNDdYSEpjYmlBZ2ZWeHlYRzVjY2x4dUlDQW1YMTkwYVhSc1pTQjdYSEpjYmlBZ0lDQnRZWEpuYVc0NklEQXVOamRsYlNBd08xeHlYRzRnSUNBZ2RHVjRkQzFoYkdsbmJqb2dZMlZ1ZEdWeU8xeHlYRzRnSUNBZ1ptOXVkQzFtWVcxcGJIazZJRUJtYjI1MFgzUmxlSFJmWm1GdGFXeDVPMXh5WEc0Z0lDQWdabTl1ZEMxM1pXbG5hSFE2SUc1dmNtMWhiRHRjY2x4dUlDQWdJR3hwYm1VdGFHVnBaMmgwT2lBeExqTmxiVHRjY2x4dUlDQWdJR1p2Ym5RdGMybDZaVG9nTkM0eVpXMDdYSEpjYmlBZ0lDQnZkbVZ5Wm14dmR6b2dhR2xrWkdWdU8xeHlYRzRnSUgxY2NseHVYSEpjYmlBZ0psOWZZWEowYVdOc1pTQjdYSEpjYmlBZ0lDQXViM1YwYkdsdVpTMXlaV0ZrWlhKZlgzQnliMmR5WlhOeklIdGNjbHh1SUNBZ0lDQWdaR2x6Y0d4aGVUb2dibTl1WlR0Y2NseHVJQ0FnSUgxY2NseHVJQ0I5WEhKY2JseHlYRzRnSUNaZmFHbGtaR1Z1SUh0Y2NseHVJQ0FnSUdScGMzQnNZWGs2SUc1dmJtVTdYSEpjYmx4eVhHNGdJQ0FnSmk1dmRYUnNhVzVsTFhKbFlXUmxjbDl6YVdKc2FXNW5JSHRjY2x4dUlDQWdJQ0FnWkdsemNHeGhlVG9nYm05dVpTQWhhVzF3YjNKMFlXNTBPMXh5WEc1Y2NseHVJQ0FnSUNBZ0ppNTNjbUZ3Y0dWeUlIdGNjbHh1SUNBZ0lDQWdJQ0FtTG5CdmMzUWdlMXh5WEc0Z0lDQWdJQ0FnSUNBZ1pHbHpjR3hoZVRvZ2JtOXVaVHRjY2x4dUlDQWdJQ0FnSUNCOVhISmNiaUFnSUNBZ0lIMWNjbHh1SUNBZ0lIMWNjbHh1SUNCOVhISmNibHh5WEc0Z0lDWXRMWEpsWVdScGJtY2dlMXh5WEc0Z0lDQWdaR2x6Y0d4aGVUb2dZbXh2WTJzN1hISmNiaUFnSUNCd2IzTnBkR2x2YmpvZ1ptbDRaV1E3WEhKY2JpQWdJQ0I2TFdsdVpHVjRPaUF5TzF4eVhHNGdJQ0FnZEc5d09pQXdPMXh5WEc0Z0lDQWdiR1ZtZERvZ01EdGNjbHh1SUNBZ0lIZHBaSFJvT2lBeE1EQWxPMXh5WEc0Z0lDQWdhR1ZwWjJoME9pQXhNREFsTzF4eVhHNGdJQ0FnYldGeVoybHVPaUF3TzF4eVhHNGdJQ0FnWW05NExYTnBlbWx1WnpvZ1ltOXlaR1Z5TFdKdmVEdGNjbHh1SUNBZ0lIQmhaR1JwYm1jNklETmxiU0EwWlcwN1hISmNiaUFnSUNCaVlXTnJaM0p2ZFc1a0xXTnZiRzl5T2lCQVltZGZZMjlzYjNJN1hISmNiaUFnSUNCelkzSnZiR3d0ZEdsdFpXeHBibVV0Ym1GdFpUb2dMUzFRY205bmNtVnpjMVJwYldWc2FXNWxPMXh5WEc0Z0lDQWdiM1psY21ac2IzYzZJSE5qY205c2JEdGNjbHh1SUNCOVhISmNibjFjY2x4dVhISmNia0JyWlhsbWNtRnRaWE1nYjNWMGJHbHVaUzF5WldGa1pYSXRjSEp2WjNKbGMzTWdlMXh5WEc0Z0lIUnZJSHRjY2x4dUlDQWdJSE5qWVd4bE9pQXhJREU3WEhKY2JpQWdmVnh5WEc1OVhISmNibHh5WEc1QWJXVmthV0VnS0cxaGVDMTNhV1IwYURvZ05UQXdjSGdwSUh0Y2NseHVJQ0F1YjNWMGJHbHVaU0I3WEhKY2JpQWdJQ0FtTFhKbFlXUmxjaUI3WEhKY2JpQWdJQ0FnSUc5MlpYSm1iRzkzT2lCb2FXUmtaVzQ3WEhKY2JseHlYRzRnSUNBZ0lDQXViM1YwYkdsdVpTMTBiMjlzWW1GeUlIdGNjbHh1SUNBZ0lDQWdJQ0JrYVhOd2JHRjVPaUJtYkdWNE8xeHlYRzRnSUNBZ0lDQWdJR1pzWlhndFpHbHlaV04wYVc5dU9pQnliM2M3WEhKY2JpQWdJQ0FnSUNBZ1pteGxlQzEzY21Gd09pQnViM2R5WVhBN1hISmNiaUFnSUNBZ0lDQWdZV3hwWjI0dGFYUmxiWE02SUdObGJuUmxjanRjY2x4dUlDQWdJQ0FnSUNCaGJHbG5iaTF6Wld4bU9pQmhkWFJ2TzF4eVhHNGdJQ0FnSUNBZ0lIUnZjRG9nTVRBd0pUdGNjbHh1SUNBZ0lDQWdJQ0J5YVdkb2REb2dNRHRjY2x4dUlDQWdJQ0FnSUNCMGNtRnVjMlp2Y20wNklIUnlZVzV6YkdGMFpWa29MVFE0Y0hncE8xeHlYRzRnSUNBZ0lDQWdJSGRwWkhSb09pQXhNREFsTzF4eVhHNGdJQ0FnSUNBZ0lHaGxhV2RvZERvZ05EaHdlRHRjY2x4dUlDQWdJQ0FnSUNCaWIzZ3RjMmw2YVc1bk9pQmliM0prWlhJdFltOTRPMXh5WEc0Z0lDQWdJQ0FnSUdKdmNtUmxjaTEwYjNBNklERndlQ0J6YjJ4cFpDQkFZbTl5WkdWeVgyTnZiRzl5TzF4eVhHNGdJQ0FnSUNBZ0lHSmhZMnRuY205MWJtUXRZMjlzYjNJNklFQjNhR2wwWlR0Y2NseHVJQ0FnSUNBZ0lDQndZV1JrYVc1bk9pQXdJREUyY0hnN1hISmNibHh5WEc0Z0lDQWdJQ0FnSUNaZlgySjFkSFJ2YmlCN1hISmNiaUFnSUNBZ0lDQWdJQ0F1Y21Ga2FYVnpYMjV2Ym1Vb0tUdGNjbHh1SUNBZ0lDQWdJQ0FnSUdac1pYZzZJREU3WEhKY2JpQWdJQ0FnSUNBZ0lDQmliM0prWlhJNklHNXZibVU3WEhKY2JpQWdJQ0FnSUNBZ0lDQmliM2d0YzJoaFpHOTNPaUJ1YjI1bE8xeHlYRzRnSUNBZ0lDQWdJSDFjY2x4dUlDQWdJQ0FnZlZ4eVhHNWNjbHh1SUNBZ0lDQWdKaTB0Y21WaFpHbHVaeUI3WEhKY2JpQWdJQ0FnSUNBZ2NHRmtaR2x1WnpvZ01EdGNjbHh1SUNBZ0lDQWdJQ0JpWVdOclozSnZkVzVrTFdOdmJHOXlPaUJBZDJocGRHVTdYSEpjYmlBZ0lDQWdJQ0FnWW05NExYTnBlbWx1WnpvZ1ltOXlaR1Z5TFdKdmVEdGNjbHh1SUNBZ0lDQWdmVnh5WEc1Y2NseHVJQ0FnSUNBZ0psOWZjR0Z3WlhJZ2UxeHlYRzRnSUNBZ0lDQWdJSEJ2YzJsMGFXOXVPaUJ5Wld4aGRHbDJaVHRjY2x4dUlDQWdJQ0FnSUNCNkxXbHVaR1Y0T2lBeE8xeHlYRzRnSUNBZ0lDQWdJRzFoY21kcGJqb2dNRHRjY2x4dUlDQWdJQ0FnSUNCd1lXUmthVzVuT2lBd08xeHlYRzRnSUNBZ0lDQWdJR2hsYVdkb2REb2dNVEF3SlR0Y2NseHVJQ0FnSUNBZ0lDQmliM2d0YzJoaFpHOTNPaUJ1YjI1bE8xeHlYRzRnSUNBZ0lDQWdJRzkyWlhKbWJHOTNPaUJvYVdSa1pXNDdYSEpjYmlBZ0lDQWdJSDFjY2x4dVhISmNiaUFnSUNBZ0lDWmZYM1JwZEd4bElIdGNjbHh1SUNBZ0lDQWdJQ0F1Wld4c2FYQnphWE1vTVNrN1hISmNiaUFnSUNBZ0lDQWdjRzl6YVhScGIyNDZJR0ZpYzI5c2RYUmxPMXh5WEc0Z0lDQWdJQ0FnSUhvdGFXNWtaWGc2SURNN1hISmNiaUFnSUNBZ0lDQWdkRzl3T2lBd08xeHlYRzRnSUNBZ0lDQWdJR3hsWm5RNklEQTdYSEpjYmlBZ0lDQWdJQ0FnYldGeVoybHVPaUF3TzF4eVhHNGdJQ0FnSUNBZ0lIZHBaSFJvT2lBeE1EQWxPMXh5WEc0Z0lDQWdJQ0FnSUdobGFXZG9kRG9nTkRod2VEdGNjbHh1SUNBZ0lDQWdJQ0JzYVc1bExXaGxhV2RvZERvZ05EaHdlRHRjY2x4dUlDQWdJQ0FnSUNCaWIzSmtaWEl0WW05MGRHOXRPaUF4Y0hnZ2MyOXNhV1FnUUdKdmNtUmxjbDlqYjJ4dmNqdGNjbHh1SUNBZ0lDQWdJQ0JtYjI1MExYTnBlbVU2SURFdU9HVnRPMXh5WEc0Z0lDQWdJQ0FnSUdadmJuUXRkMlZwWjJoME9pQTBNREE3WEhKY2JpQWdJQ0FnSUNBZ1ltRmphMmR5YjNWdVpDMWpiMnh2Y2pvZ1FIZG9hWFJsTzF4eVhHNGdJQ0FnSUNBZ0lHOTJaWEptYkc5M09pQm9hV1JrWlc0N1hISmNiaUFnSUNBZ0lIMWNjbHh1WEhKY2JpQWdJQ0FnSUNaZlgyRnlkR2xqYkdVZ2UxeHlYRzRnSUNBZ0lDQWdJRzFoY21kcGJqb2dORGh3ZUNBd08xeHlYRzRnSUNBZ0lDQWdJR2hsYVdkb2REb2dZMkZzWXlneE1EQWxJQzBnT1Rad2VDazdYSEpjYmlBZ0lDQWdJQ0FnY0dGa1pHbHVaem9nTUNBeExqSTFaVzA3WEhKY2JpQWdJQ0FnSUNBZ2MyTnliMnhzTFhScGJXVnNhVzVsTFc1aGJXVTZJQzB0VFc5aWFXeGxVSEp2WjNKbGMzTlVhVzFsYkdsdVpUdGNjbHh1SUNBZ0lDQWdJQ0J2ZG1WeVpteHZkeTE0T2lCb2FXUmtaVzQ3WEhKY2JpQWdJQ0FnSUNBZ2IzWmxjbVpzYjNjdGVUb2djMk55YjJ4c08xeHlYRzVjY2x4dUlDQWdJQ0FnSUNBdWIzVjBiR2x1WlMxeVpXRmtaWEpmWDNCeWIyZHlaWE56SUh0Y2NseHVJQ0FnSUNBZ0lDQWdJSG90YVc1a1pYZzZJRFE3WEhKY2JpQWdJQ0FnSUNBZ0lDQmhibWx0WVhScGIyNDZJRzkxZEd4cGJtVXRjbVZoWkdWeUxYQnliMmR5WlhOeklHeHBibVZoY2p0Y2NseHVJQ0FnSUNBZ0lDQWdJR0Z1YVcxaGRHbHZiaTEwYVcxbGJHbHVaVG9nTFMxTmIySnBiR1ZRY205bmNtVnpjMVJwYldWc2FXNWxPMXh5WEc0Z0lDQWdJQ0FnSUNBZ1pHbHpjR3hoZVRvZ1lteHZZMnM3WEhKY2JpQWdJQ0FnSUNBZ2ZWeHlYRzRnSUNBZ0lDQjlYSEpjYmlBZ0lDQjlYSEpjYmlBZ2ZWeHlYRzU5WEhKY2JseHlYRzVBYldWa2FXRWdjSEpwYm5RZ2UxeHlYRzRnSUdoMGJXd3NYSEpjYmlBZ1ltOWtlU0I3WEhKY2JpQWdJQ0F2S2lEbWlaUGxqYkRubW9UbG43cm5vWURsclpma3ZaUGxwS2Zsc0k4Z0tpOWNjbHh1SUNBZ0lHWnZiblF0YzJsNlpUb2dNVEp3ZER0Y2NseHVJQ0FnSUM4cUlPYVl2dWVrdXVpdXZ1ZTlydWFXaCtXdGwrbWluT2lKc3VXU2pPaURqT2FacittaW5PaUpzaUFxTDF4eVhHNGdJQ0FnWW1GamEyZHliM1Z1WkMxamIyeHZjam9nUUhkb2FYUmxPMXh5WEc0Z0lDQWdZMjlzYjNJNklFQndjbWx0WVhKNVgzUmxlSFJmWTI5c2IzSTdYSEpjYmlBZ0lDQm9aV2xuYUhRNklHbHVhWFJwWVd3Z0lXbHRjRzl5ZEdGdWREdGNjbHh1SUNCOVhISmNibHh5WEc0Z0lDOHFJT2l1dnVlOXJ1bVR2dWFPcGVhZ3QrVzhqeUFxTDF4eVhHNGdJR0U2YkdsdWF5eGNjbHh1SUNCaE9uWnBjMmwwWldRc1hISmNiaUFnWVRwb2IzWmxjaUI3WEhKY2JpQWdJQ0IwWlhoMExXUmxZMjl5WVhScGIyNDZJSFZ1WkdWeWJHbHVaU0FoYVcxd2IzSjBZVzUwTzF4eVhHNGdJQ0FnWTI5c2IzSTZJRUJ3Y21sdFlYSjVYMk52Ykc5eU8xeHlYRzRnSUgxY2NseHVYSEpjYmlBZ0x5b2c2WnFRNkplUDVhcVM1TDJUNXFDSDU2MitJQ292WEhKY2JpQWdkbWxrWlc4c1hISmNiaUFnWVhWa2FXOGdlMXh5WEc0Z0lDQWdaR2x6Y0d4aGVUb2dibTl1WlNBaGFXMXdiM0owWVc1ME8xeHlYRzRnSUgxY2NseHVYSEpjYmlBZ0x5b2c1Nkd1NUwrZDZLR281cUM4NVp5bzVvbVQ1WTJ3NXBlMjU1cUU2TDY1NXFHRzVaS001YSs1NmIyUTVwYTU1YnlQNXJpRjVwbXdJQ292WEhKY2JpQWdkR0ZpYkdVZ2UxeHlYRzRnSUNBZ2QybGtkR2c2SURFd01DVTdYSEpjYmlBZ0lDQmliM0prWlhJdFkyOXNiR0Z3YzJVNklHTnZiR3hoY0hObE8xeHlYRzRnSUgxY2NseHVJQ0IwYUN4Y2NseHVJQ0IwWkNCN1hISmNiaUFnSUNCaWIzSmtaWEk2SURGd2VDQnpiMnhwWkNCQWNISnBiV0Z5ZVY5aWIzSmtaWEpmWTI5c2IzSTdYSEpjYmlBZ0lDQndZV1JrYVc1bk9pQTRjSGdnTWpCd2VEdGNjbHh1SUNCOVhISmNibHh5WEc0Z0lDNXZkWFJzYVc1bElIdGNjbHh1SUNBZ0lDWXRiV1Z6YzJGblpTeGNjbHh1SUNBZ0lDWXRkRzl2YkdKaGNpQjdYSEpjYmlBZ0lDQWdJQzhxSU9tYWtPaVhqK1M2aHVXM3BlV0Z0K2FnaitXU2pPUy9vZWFCcithUGtPZWt1dWFoaGlBcUwxeHlYRzRnSUNBZ0lDQmthWE53YkdGNU9pQnViMjVsSUNGcGJYQnZjblJoYm5RN1hISmNiaUFnSUNCOVhISmNibHh5WEc0Z0lDQWdKaTF5WldGa1pYSWdlMXh5WEc0Z0lDQWdJQ0JrYVhOd2JHRjVPaUJpYkc5amF5QWhhVzF3YjNKMFlXNTBPMXh5WEc0Z0lDQWdJQ0J2ZG1WeVpteHZkem9nYUdsa1pHVnVPMXh5WEc1Y2NseHVJQ0FnSUNBZ0psOWZkR2wwYkdVZ2UxeHlYRzRnSUNBZ0lDQWdJRzFoY21kcGJqb2dNVE11TkhCMElEQWdNamh3ZENBaGFXMXdiM0owWVc1ME8xeHlYRzRnSUNBZ0lDQWdJSFJsZUhRdFlXeHBaMjQ2SUdObGJuUmxjaUFoYVcxd2IzSjBZVzUwTzF4eVhHNGdJQ0FnSUNBZ0lHWnZiblF0YzJsNlpUb2dNekp3ZENBaGFXMXdiM0owWVc1ME8xeHlYRzRnSUNBZ0lDQjlYSEpjYmx4eVhHNGdJQ0FnSUNBdktpRGxqNWJtdG9qa3VvYm51NTNscjdubHJwcmt2WTBnS2k5Y2NseHVJQ0FnSUNBZ0ppMHRjbVZoWkdsdVp5QjdYSEpjYmlBZ0lDQWdJQ0FnY0c5emFYUnBiMjQ2SUhKbGJHRjBhWFpsSUNGcGJYQnZjblJoYm5RN1hISmNiaUFnSUNBZ0lDQWdhR1ZwWjJoME9pQmhkWFJ2SUNGcGJYQnZjblJoYm5RN1hISmNiaUFnSUNBZ0lDQWdjR0ZrWkdsdVp6b2dNQ0FoYVcxd2IzSjBZVzUwTzF4eVhHNGdJQ0FnSUNBZ0lHSmhZMnRuY205MWJtUXRZMjlzYjNJNklFQjNhR2wwWlR0Y2NseHVJQ0FnSUNBZ0lDQnZkbVZ5Wm14dmR6b2dhR2xrWkdWdUlDRnBiWEJ2Y25SaGJuUTdYSEpjYmlBZ0lDQWdJSDFjY2x4dVhISmNiaUFnSUNBZ0lDOHFJT21ha09pWGorbVloZWl2dStpL20rVzZwdWFkb1NBcUwxeHlYRzRnSUNBZ0lDQW1YMTl3Y205bmNtVnpjeUI3WEhKY2JpQWdJQ0FnSUNBZ1pHbHpjR3hoZVRvZ2JtOXVaU0FoYVcxd2IzSjBZVzUwTzF4eVhHNGdJQ0FnSUNCOVhISmNibHh5WEc0Z0lDQWdJQ0F2S2lEbWlaUGxqYkRtbDdia3VJM21tTDducExybXJhUG1sb2NnUkU5TklPZWFoT21ZdE9XOXNlYVZpT2FlbkNBcUwxeHlYRzRnSUNBZ0lDQW1YMTl3WVhCbGNpQjdYSEpjYmlBZ0lDQWdJQ0FnWW05NExYTm9ZV1J2ZHpvZ2JtOXVaVHRjY2x4dUlDQWdJQ0FnZlZ4eVhHNWNjbHh1SUNBZ0lDQWdjSEpsSUh0Y2NseHVJQ0FnSUNBZ0lDQndZV1JrYVc1bk9pQXhaVzBnSVdsdGNHOXlkR0Z1ZER0Y2NseHVJQ0FnSUNBZ0lDQmliM0prWlhJNklERndlQ0J6YjJ4cFpDQkFZbTl5WkdWeVgyTnZiRzl5SUNGcGJYQnZjblJoYm5RN1hISmNiaUFnSUNBZ0lDQWdZbTl5WkdWeUxYSmhaR2wxY3pvZ05IQjRJQ0ZwYlhCdmNuUmhiblE3WEhKY2JpQWdJQ0FnSUgxY2NseHVYSEpjYmlBZ0lDQWdJSEJ5WlN4Y2NseHVJQ0FnSUNBZ1kyOWtaU0I3WEhKY2JpQWdJQ0FnSUNBZ1ltRmphMmR5YjNWdVpDMWpiMnh2Y2pvZ1FIZG9hWFJsSUNGcGJYQnZjblJoYm5RN1hISmNiaUFnSUNBZ0lIMWNjbHh1WEhKY2JpQWdJQ0FnSUhSaFlteGxMRnh5WEc0Z0lDQWdJQ0JwYldjc1hISmNiaUFnSUNBZ0lITjJaeUI3WEhKY2JpQWdJQ0FnSUNBZ1luSmxZV3N0YVc1emFXUmxPaUJoZG05cFpEdGNjbHh1SUNBZ0lDQWdmVnh5WEc1Y2NseHVJQ0FnSUNBZ0x5b2c1b21BNXB5SjVwYUg1NnVnNVlhRjVhNjVJRVJQVFNEbm03amxoYlBubW9UcGdydmxzWVhvaW9MbmdybnBnNzNwbXBEb2w0L2t1b1lnS2k5Y2NseHVJQ0FnSUNBZ0psOXphV0pzYVc1bklIdGNjbHh1SUNBZ0lDQWdJQ0JrYVhOd2JHRjVPaUJ1YjI1bElDRnBiWEJ2Y25SaGJuUTdYSEpjYmlBZ0lDQWdJSDFjY2x4dUlDQWdJSDFjY2x4dUlDQjlYSEpjYm4xY2NseHVJaXdpTHlvcVhISmNiaUFxSUhKaFpHbDFjeTVzWlhOeklDMGc1WnlHNktlUzZLNis1NzJ1SUcxcGVHbHVlQ0RsaDczbWxiQmNjbHh1SUNvZ1BUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFZ4eVhHNGdLaUJEY21WaGRHVmtJRUo1T2lCWllXOW9ZV2w0YVdGdlhISmNiaUFxSUZWd1pHRjBaVG9nTWpBeU5DNDBMakUyWEhKY2JpQXFMMXh5WEc1Y2NseHVMeW9nUFQwOVBUMDlJT1djaHVpbmt1YWd0K1c4aitpdXZ1ZTlydVdIdmVhVnNDQTlQVDA5UFQwZ0tpOWNjbHh1TG5KaFpHbDFjeWhBYm5WdE9pQXljSGdwSUh0Y2NseHVJQ0JpYjNKa1pYSXRjbUZrYVhWek9pQkFiblZ0TzF4eVhHNTlYSEpjYmx4eVhHNHVjbUZrYVhWelgyNXZibVVvS1NCN1hISmNiaUFnTG5KaFpHbDFjeWd3S1R0Y2NseHVmVnh5WEc1Y2NseHVMbkpoWkdsMWMxOXRhVzVwS0NrZ2UxeHlYRzRnSUM1eVlXUnBkWE1vTW5CNEtUdGNjbHh1ZlZ4eVhHNWNjbHh1TG5KaFpHbDFjMTl6YldGc2JDZ3BJSHRjY2x4dUlDQXVjbUZrYVhWektETndlQ2s3WEhKY2JuMWNjbHh1WEhKY2JpNXlZV1JwZFhOZmNtVm5kV3hoY2lncElIdGNjbHh1SUNBdWNtRmthWFZ6S0RSd2VDazdYSEpjYm4xY2NseHVYSEpjYmk1eVlXUnBkWE5mYldWa2FYVnRLQ2tnZTF4eVhHNGdJQzV5WVdScGRYTW9OWEI0S1R0Y2NseHVmVnh5WEc1Y2NseHVMbkpoWkdsMWMxOXNZWEpuWlNncElIdGNjbHh1SUNBdWNtRmthWFZ6S0RFd2NIZ3BPMXh5WEc1OVhISmNibHh5WEc0dWNtRmthWFZ6WDJoMVoyVW9LU0I3WEhKY2JpQWdMbkpoWkdsMWN5Z3hObkI0S1R0Y2NseHVmVnh5WEc1Y2NseHVMbkpoWkdsMWMxOXliM1Z1WkNncElIdGNjbHh1SUNBdWNtRmthWFZ6S0RNd2NIZ3BPMXh5WEc1OVhISmNiaUlzSWk4cUlEMDlQVDA5UFQwOVBUMGdZblYwZEc5dWN5NTBhR1Z0WlNBdElPYU1pZW1TcnVXdnZPaUlxdWFndCtXOGp5QTlQVDA5UFQwOVBUMDlJQ292WEhKY2JrQnBiWEJ2Y25RZ0p5NHZZMjlzYjNKekp6dGNjbHh1UUdsdGNHOXlkQ0FuTGk5emFHRmtiM2NuTzF4eVhHNWNjbHh1TG05MWRHeHBibVV0ZEc5dmJHSmhjaUI3WEhKY2JpQWdjRzl6YVhScGIyNDZJR1pwZUdWa08xeHlYRzRnSUhvdGFXNWtaWGc2SURrNU9UazVPMXh5WEc0Z0lHMWhjbWRwYmpvZ01EdGNjbHh1SUNCMGNtRnVjMmwwYVc5dUxXUjFjbUYwYVc5dU9pQXdMak56TzF4eVhHNGdJRzkyWlhKbWJHOTNPaUJvYVdSa1pXNDdYSEpjYmx4eVhHNGdJQ1pmWDJKMWRIUnZiaUI3WEhKY2JpQWdJQ0F1YzJoaFpHOTNYMnhwWjJoMFgzSmxaM1ZzWVhJb0tUdGNjbHh1SUNBZ0lIQnZjMmwwYVc5dU9pQnlaV3hoZEdsMlpUdGNjbHh1SUNBZ0lIb3RhVzVrWlhnNklERTdYSEpjYmlBZ0lDQnRZWEpuYVc0NklERXdjSGc3WEhKY2JpQWdJQ0IzYVdSMGFEb2dNelp3ZUR0Y2NseHVJQ0FnSUdobGFXZG9kRG9nTXpad2VEdGNjbHh1SUNBZ0lHSnZjbVJsY2pvZ01YQjRJSE52Ykdsa0lFQndjbWx0WVhKNVgySnZjbVJsY2w5amIyeHZjanRjY2x4dUlDQWdJR0p2Y21SbGNpMXlZV1JwZFhNNklETndlRHRjY2x4dUlDQWdJR0p2ZUMxemFYcHBibWM2SUdKdmNtUmxjaTFpYjNnN1hISmNiaUFnSUNCaVlXTnJaM0p2ZFc1a0xXTnZiRzl5T2lCQWQyaHBkR1U3WEhKY2JpQWdJQ0JqZFhKemIzSTZJSEJ2YVc1MFpYSTdYSEpjYmlBZ0lDQjBaWGgwTFdGc2FXZHVPaUJqWlc1MFpYSTdYSEpjYmlBZ0lDQmpiMnh2Y2pvZ1FHWnZkWEowYUY5MFpYaDBYMk52Ykc5eU8xeHlYRzRnSUNBZ2RISmhibk5wZEdsdmJqb2dZV3hzSURBdU0zTWdNQzR4Y3lCbFlYTmxMV2x1TFc5MWREdGNjbHh1SUNBZ0lHOTJaWEptYkc5M09pQm9hV1JrWlc0N1hISmNibHh5WEc0Z0lDQWdKanBvYjNabGNpQjdYSEpjYmlBZ0lDQWdJR052Ykc5eU9pQkFjM1ZqWTJWemMxOWpiMnh2Y2p0Y2NseHVJQ0FnSUNBZ1ltOXlaR1Z5TFdOdmJHOXlPaUJBYzNWalkyVnpjMTlqYjJ4dmNqdGNjbHh1SUNBZ0lDQWdkSEpoYm5ObWIzSnRPaUJ6WTJGc1pTZ3hMak0xS1R0Y2NseHVJQ0FnSUgxY2NseHVYSEpjYmlBZ0lDQW1MbWhwWkdVZ2UxeHlYRzRnSUNBZ0lDQmthWE53YkdGNU9pQnViMjVsTzF4eVhHNGdJQ0FnZlZ4eVhHNGdJSDFjY2x4dVhISmNiaUFnSmw5ZllXNWphRzl5SUh0Y2NseHVJQ0FnSUNZNmJHbHVheXhjY2x4dUlDQWdJQ1k2ZG1semFYUmxaQ3hjY2x4dUlDQWdJQ1k2YUc5MlpYSWdlMXh5WEc0Z0lDQWdJQ0JqYjJ4dmNqb2dRR1p2ZFhKMGFGOTBaWGgwWDJOdmJHOXlPMXh5WEc0Z0lDQWdJQ0IwWlhoMExXUmxZMjl5WVhScGIyNDZJRzV2Ym1VN1hISmNiaUFnSUNCOVhISmNibHh5WEc0Z0lDQWdKanBvYjNabGNpQjdYSEpjYmlBZ0lDQWdJR052Ykc5eU9pQkFjM1ZqWTJWemMxOWpiMnh2Y2p0Y2NseHVJQ0FnSUgxY2NseHVJQ0I5WEhKY2JseHlYRzRnSUNaZlgybGpiMjRnZTF4eVhHNGdJQ0FnY0c5emFYUnBiMjQ2SUdGaWMyOXNkWFJsTzF4eVhHNGdJQ0FnZWkxcGJtUmxlRG9nTWp0Y2NseHVJQ0FnSUhSdmNEb2dOVEFsTzF4eVhHNGdJQ0FnYkdWbWREb2dOVEFsTzF4eVhHNGdJQ0FnZDJsa2RHZzZJREl3Y0hnN1hISmNiaUFnSUNCb1pXbG5hSFE2SURJd2NIZzdYSEpjYmlBZ0lDQjBjbUZ1YzJadmNtMDZJSFJ5WVc1emJHRjBaU2d0TlRBbExDQXROVEFsS1R0Y2NseHVJQ0FnSUdacGJHdzZJR04xY25KbGJuUmpiMnh2Y2p0Y2NseHVJQ0FnSUc5MlpYSm1iRzkzT2lCb2FXUmtaVzQ3WEhKY2JpQWdmVnh5WEc1Y2NseHVJQ0FtWDJGamRHbDJaU0I3WEhKY2JpQWdJQ0FtTG05MWRHeHBibVV0ZEc5dmJHSmhjaUI3WEhKY2JpQWdJQ0FnSUNaZlgySjFkSFJ2YmlCN1hISmNiaUFnSUNBZ0lDQWdZMjlzYjNJNklFQjNhR2wwWlR0Y2NseHVJQ0FnSUNBZ0lDQmlZV05yWjNKdmRXNWtMV052Ykc5eU9pQkFjM1ZqWTJWemMxOWpiMnh2Y2p0Y2NseHVJQ0FnSUNBZ0lDQmliM0prWlhJdFkyOXNiM0k2SUVCemRXTmpaWE56WDJOdmJHOXlPMXh5WEc1Y2NseHVJQ0FnSUNBZ0lDQW1PbWh2ZG1WeUlIdGNjbHh1SUNBZ0lDQWdJQ0FnSUdOdmJHOXlPaUJBZDJocGRHVTdYSEpjYmlBZ0lDQWdJQ0FnZlZ4eVhHNGdJQ0FnSUNCOVhISmNiaUFnSUNCOVhISmNibHh5WEc0Z0lDQWdMbTkxZEd4cGJtVXRkRzl2YkdKaGNsOWZZVzVqYUc5eUlIdGNjbHh1SUNBZ0lDQWdKanBzYVc1ckxGeHlYRzRnSUNBZ0lDQW1PblpwYzJsMFpXUXNYSEpjYmlBZ0lDQWdJQ1k2YUc5MlpYSWdlMXh5WEc0Z0lDQWdJQ0FnSUdOdmJHOXlPaUJBZDJocGRHVTdYSEpjYmlBZ0lDQWdJSDFjY2x4dUlDQWdJSDFjY2x4dUlDQjlYSEpjYmx4eVhHNGdJQ1pmY205MWJtUmxaQ0I3WEhKY2JpQWdJQ0FtTG05MWRHeHBibVV0ZEc5dmJHSmhjbDlmWW5WMGRHOXVJSHRjY2x4dUlDQWdJQ0FnWW05eVpHVnlMWEpoWkdsMWN6b2dNVGh3ZUR0Y2NseHVJQ0FnSUgxY2NseHVJQ0I5WEhKY2JseHlYRzRnSUNaZlpHbHpZV0pzWldRZ2UxeHlYRzRnSUNBZ0ppNXZkWFJzYVc1bExYUnZiMnhpWVhJc1hISmNiaUFnSUNBdWIzVjBiR2x1WlMxMGIyOXNZbUZ5SUh0Y2NseHVJQ0FnSUNBZ0psOWZZVzVqYUc5eU9teHBibXNzWEhKY2JpQWdJQ0FnSUNaZlgyRnVZMmh2Y2pwMmFYTnBkR1ZrTEZ4eVhHNGdJQ0FnSUNBbVgxOWhibU5vYjNJNmFHOTJaWElzWEhKY2JpQWdJQ0FnSUNaZlgySjFkSFJ2YmlCN1hISmNiaUFnSUNBZ0lDQWdZM1Z5YzI5eU9pQnViM1F0WVd4c2IzZGxaRHRjY2x4dUlDQWdJQ0FnSUNCamIyeHZjam9nUUdadmRYSjBhRjkwWlhoMFgyTnZiRzl5TzF4eVhHNGdJQ0FnSUNBZ0lHSnZjbVJsY2kxamIyeHZjam9nUUdadmRYSjBhRjkwWlhoMFgyTnZiRzl5TzF4eVhHNWNjbHh1SUNBZ0lDQWdJQ0FtT21odmRtVnlJSHRjY2x4dUlDQWdJQ0FnSUNBZ0lHTnZiRzl5T2lCQVptOTFjblJvWDNSbGVIUmZZMjlzYjNJN1hISmNiaUFnSUNBZ0lDQWdJQ0JpYjNKa1pYSXRZMjlzYjNJNklFQm1iM1Z5ZEdoZmRHVjRkRjlqYjJ4dmNqdGNjbHh1SUNBZ0lDQWdJQ0I5WEhKY2JpQWdJQ0FnSUgxY2NseHVYSEpjYmlBZ0lDQWdJQ1pmWDJKMWRIUnZiaUI3WEhKY2JpQWdJQ0FnSUNBZ1ltRmphMmR5YjNWdVpDMWpiMnh2Y2pvZ1FHUnBjMkZpYkdWa1gySm5YMk52Ykc5eU8xeHlYRzRnSUNBZ0lDQjlYSEpjYmlBZ0lDQjlYSEpjYmlBZ2ZWeHlYRzVjY2x4dUlDQW1YM1IwWWl4Y2NseHVJQ0FtWDJKMGRDQjdYSEpjYmlBZ0lDQnNaV1owT2lBMU1DVTdYSEpjYmlBZ0lDQjBjbUZ1YzJadmNtMDZJSFJ5WVc1emJHRjBaVmdvTFRVd0pTazdYSEpjYmx4eVhHNGdJQ0FnTG05MWRHeHBibVV0ZEc5dmJHSmhjbDlmWW5WMGRHOXVJSHRjY2x4dUlDQWdJQ0FnWkdsemNHeGhlVG9nYVc1c2FXNWxMV0pzYjJOck8xeHlYRzRnSUNBZ2ZWeHlYRzRnSUgxY2NseHVYSEpjYmlBZ0psOTBkR0lnZTF4eVhHNGdJQ0FnZEc5d09pQXhNbkI0TzF4eVhHNWNjbHh1SUNBZ0lDWXViM1YwYkdsdVpTMTBiMjlzWW1GeVgyaHBaR1JsYmlCN1hISmNiaUFnSUNBZ0lIUnZjRG9nTFRVMmNIZzdYSEpjYmlBZ0lDQjlYSEpjYmlBZ2ZWeHlYRzVjY2x4dUlDQW1YMkowZENCN1hISmNiaUFnSUNCaWIzUjBiMjA2SURFeWNIZzdYSEpjYmx4eVhHNGdJQ0FnSmk1dmRYUnNhVzVsTFhSdmIyeGlZWEpmYUdsa1pHVnVJSHRjY2x4dUlDQWdJQ0FnWW05MGRHOXRPaUF0TlRad2VEdGNjbHh1SUNBZ0lIMWNjbHh1SUNCOVhISmNibHh5WEc0Z0lDWmZjblJzTEZ4eVhHNGdJQ1pmYkhSeUlIdGNjbHh1SUNBZ0lIUnlZVzV6Wm05eWJUb2dkSEpoYm5Oc1lYUmxXU2d0TlRBbEtUdGNjbHh1SUNBZ0lIZHBaSFJvT2lBMU5uQjRPMXh5WEc0Z0lIMWNjbHh1WEhKY2JpQWdKbDl5ZEd3Z2UxeHlYRzRnSUNBZ2RHOXdPaUExTUNVN1hISmNiaUFnSUNCeWFXZG9kRG9nTVRKd2VEdGNjbHh1WEhKY2JpQWdJQ0FtTG05MWRHeHBibVV0ZEc5dmJHSmhjbDlvYVdSa1pXNGdlMXh5WEc0Z0lDQWdJQ0J5YVdkb2REb2dMVGcyY0hnN1hISmNiaUFnSUNCOVhISmNiaUFnZlZ4eVhHNWNjbHh1SUNBbVgyeDBjaUI3WEhKY2JpQWdJQ0IwYjNBNklEVXdKVHRjY2x4dUlDQWdJR3hsWm5RNklERXljSGc3WEhKY2JseHlYRzRnSUNBZ0ppNXZkWFJzYVc1bExYUnZiMnhpWVhKZmFHbGtaR1Z1SUh0Y2NseHVJQ0FnSUNBZ2JHVm1kRG9nTFRnMmNIZzdYSEpjYmlBZ0lDQjlYSEpjYmlBZ2ZWeHlYRzVjY2x4dUlDQW1YM1IwWWl4Y2NseHVJQ0FtWDNKMGJDeGNjbHh1SUNBbVgySjBkQ3hjY2x4dUlDQW1YMngwY2lCN1hISmNiaUFnSUNBdWIzVjBiR2x1WlMxMGIyOXNZbUZ5WDE5aWRYUjBiMjRnZTF4eVhHNGdJQ0FnSUNBbUxtOTFkR3hwYm1VdGRHOXZiR0poY2w5b2FXUmtaVzRnZTF4eVhHNGdJQ0FnSUNBZ0lHUnBjM0JzWVhrNklHNXZibVU3WEhKY2JpQWdJQ0FnSUgxY2NseHVJQ0FnSUgxY2NseHVJQ0I5WEhKY2JuMWNjbHh1SWl3aVFHbHRjRzl5ZENBbkxpOWpiMnh2Y25Nbk8xeHlYRzVBYVcxd2IzSjBJQ2N1TDJadmJuUW5PMXh5WEc1QWFXMXdiM0owSUNjdUwybGpiMjV6Snp0Y2NseHVRR2x0Y0c5eWRDQW5MaTl0YVhocGJuTW5PMXh5WEc1Y2NseHVMbTkxZEd4cGJtVXRiV1Z6YzJGblpTQjdYSEpjYmlBZ0xuSmhaR2wxYzE5emJXRnNiQ2dwTzF4eVhHNGdJQzV6YUdGa2IzZGZiR2xuYUhSZmNtVm5kV3hoY2lncE8xeHlYRzRnSUhCdmMybDBhVzl1T2lCbWFYaGxaRHRjY2x4dUlDQjZMV2x1WkdWNE9pQTVPVGs1TzF4eVhHNGdJRzl3WVdOcGRIazZJREF1TVR0Y2NseHVJQ0IwYjNBNklDMDFNSEI0TzF4eVhHNGdJR3hsWm5RNklEVXdKVHRjY2x4dUlDQm9aV2xuYUhRNklEUXdjSGc3WEhKY2JpQWdiV0Z5WjJsdU9pQXdPMXh5WEc0Z0lIQmhaR1JwYm1jNklEQWdOVEJ3ZUR0Y2NseHVJQ0JzYVc1bExXaGxhV2RvZERvZ05EQndlRHRjY2x4dUlDQm1iMjUwTFhOcGVtVTZJRUJtYjI1MFgzTnBlbVZmYzIxaGJHdzdYSEpjYmlBZ1ltRmphMmR5YjNWdVpDMWpiMnh2Y2pvZ1FIZG9hWFJsTzF4eVhHNGdJR052Ykc5eU9pQkFkR2hwY21SZmRHVjRkRjlqYjJ4dmNqdGNjbHh1SUNCMGNtRnVjMmwwYVc5dU9pQmhiR3dnTUM0MWN5QmxZWE5sTFdsdUxXOTFkRHRjY2x4dUlDQjBjbUZ1YzJadmNtMDZJSFJ5WVc1emJHRjBaVmdvTFRVd0pTazdYSEpjYmlBZ2IzWmxjbVpzYjNjNklHaHBaR1JsYmp0Y2NseHVYSEpjYmlBZ0psOWZZMjl1ZEdWdWRDQjdYSEpjYmlBZ0lDQXVaV3hzYVhCemFYTW9NU2s3WEhKY2JpQWdJQ0J0WVhKbmFXNDZJREE3WEhKY2JpQWdJQ0J0WVhndGQybGtkR2c2SURjd01IQjRPMXh5WEc0Z0lDQWdhR1ZwWjJoME9pQTBNSEI0TzF4eVhHNGdJQ0FnYkdsdVpTMW9aV2xuYUhRNklEUXdjSGc3WEhKY2JpQWdJQ0JtYjI1MExYTnBlbVU2SURFemNIZzdYSEpjYmlBZ0lDQmpiMnh2Y2pvZ1FIUm9hWEprWDNSbGVIUmZZMjlzYjNJN1hISmNiaUFnSUNCdmRtVnlabXh2ZHpvZ2FHbGtaR1Z1TzF4eVhHNGdJSDFjY2x4dVhISmNiaUFnSmw5ZlkyeHZjMlVzWEhKY2JpQWdKbDlmYVdOdmJpQjdYSEpjYmlBZ0lDQndiM05wZEdsdmJqb2dZV0p6YjJ4MWRHVTdYSEpjYmlBZ0lDQjZMV2x1WkdWNE9pQXlPMXh5WEc0Z0lDQWdkRzl3T2lBd08xeHlYRzRnSUNBZ2QybGtkR2c2SURRd2NIZzdYSEpjYmlBZ0lDQm9aV2xuYUhRNklEUXdjSGc3WEhKY2JpQWdJQ0JzYVc1bExXaGxhV2RvZERvZ05EQndlRHRjY2x4dUlDQWdJSFJsZUhRdFlXeHBaMjQ2SUdObGJuUmxjanRjY2x4dUlDQWdJRzkyWlhKbWJHOTNPaUJvYVdSa1pXNDdYSEpjYmlBZ2ZWeHlYRzVjY2x4dUlDQW1YMTlwWTI5dUlIdGNjbHh1SUNBZ0lHeGxablE2SURBN1hISmNiaUFnSUNCamIyeHZjam9nUUhkb2FYUmxPMXh5WEc1Y2NseHVJQ0FnSUM1dmRYUnNhVzVsTFdsamIyNGdlMXh5WEc0Z0lDQWdJQ0J3YjNOcGRHbHZiam9nWVdKemIyeDFkR1U3WEhKY2JpQWdJQ0FnSUhvdGFXNWtaWGc2SURJN1hISmNiaUFnSUNBZ0lIUnZjRG9nTlRBbE8xeHlYRzRnSUNBZ0lDQnNaV1owT2lBMU1DVTdYSEpjYmlBZ0lDQWdJSFJ5WVc1elptOXliVG9nZEhKaGJuTnNZWFJsS0MwMU1DVXNJQzAxTUNVcE8xeHlYRzRnSUNBZ2ZWeHlYRzRnSUgxY2NseHVYSEpjYmlBZ0psOWZZMnh2YzJVZ2UxeHlYRzRnSUNBZ2NtbG5hSFE2SURBN1hISmNiaUFnSUNCamRYSnpiM0k2SUhCdmFXNTBaWEk3WEhKY2JpQWdJQ0JqYjJ4dmNqb2dRR1p2ZFhKMGFGOTBaWGgwWDJOdmJHOXlPMXh5WEc1Y2NseHVJQ0FnSUM1dmRYUnNhVzVsTFdsamIyNGdlMXh5WEc0Z0lDQWdJQ0J3YjNOcGRHbHZiam9nWVdKemIyeDFkR1U3WEhKY2JpQWdJQ0FnSUhvdGFXNWtaWGc2SURJN1hISmNiaUFnSUNBZ0lIUnZjRG9nTlRBbE8xeHlYRzRnSUNBZ0lDQnNaV1owT2lBMU1DVTdYSEpjYmlBZ0lDQWdJSFJ5WVc1elptOXliVG9nZEhKaGJuTnNZWFJsS0MwMU1DVXNJQzAxTUNVcE8xeHlYRzRnSUNBZ2ZWeHlYRzVjY2x4dUlDQWdJQ1k2YUc5MlpYSWdlMXh5WEc0Z0lDQWdJQ0JqYjJ4dmNqb2dRSFJvYVhKa1gzUmxlSFJmWTI5c2IzSTdYSEpjYmlBZ0lDQjlYSEpjYmlBZ2ZWeHlYRzVjY2x4dUlDQW1YMmx1Wm04Z2UxeHlYRzRnSUNBZ0xtOTFkR3hwYm1VdGJXVnpjMkZuWlY5ZmFXTnZiaUI3WEhKY2JpQWdJQ0FnSUdKaFkydG5jbTkxYm1RdFkyOXNiM0k2SUVCd2NtbHRZWEo1WDJOdmJHOXlPMXh5WEc0Z0lDQWdmVnh5WEc0Z0lIMWNjbHh1WEhKY2JpQWdKbDkzWVhKdWFXNW5JSHRjY2x4dUlDQWdJQzV2ZFhSc2FXNWxMVzFsYzNOaFoyVmZYMmxqYjI0Z2UxeHlYRzRnSUNBZ0lDQmlZV05yWjNKdmRXNWtMV052Ykc5eU9pQkFkMkZ5Ym1sdVoxOWpiMnh2Y2p0Y2NseHVJQ0FnSUgxY2NseHVJQ0I5WEhKY2JseHlYRzRnSUNaZmMzVmpZMlZ6Y3lCN1hISmNiaUFnSUNBdWIzVjBiR2x1WlMxdFpYTnpZV2RsWDE5cFkyOXVJSHRjY2x4dUlDQWdJQ0FnWW1GamEyZHliM1Z1WkMxamIyeHZjam9nUUhOMVkyTmxjM05mWTI5c2IzSTdYSEpjYmlBZ0lDQjlYSEpjYmlBZ2ZWeHlYRzVjY2x4dUlDQW1YMlZ5Y205eUlIdGNjbHh1SUNBZ0lDNXZkWFJzYVc1bExXMWxjM05oWjJWZlgybGpiMjRnZTF4eVhHNGdJQ0FnSUNCaVlXTnJaM0p2ZFc1a0xXTnZiRzl5T2lCQVpHRnVaMlZ5WDJOdmJHOXlPMXh5WEc0Z0lDQWdmVnh5WEc0Z0lIMWNjbHh1WEhKY2JpQWdKbDl3YkdGcGJpQjdYSEpjYmlBZ0lDQnRhVzR0ZDJsa2RHZzZJREU1TUhCNE8xeHlYRzRnSUNBZ2NHRmtaR2x1WnpvZ01DQTFNSEI0SURBZ01UVndlRHRjY2x4dVhISmNiaUFnSUNBbUxtOTFkR3hwYm1VdGJXVnpjMkZuWlNCN1hISmNiaUFnSUNBZ0lDWmZhVzVtYnlCN1hISmNiaUFnSUNBZ0lDQWdZbTl5WkdWeUxXeGxablE2SURWd2VDQnpiMnhwWkNCQWNISnBiV0Z5ZVY5amIyeHZjanRjY2x4dUlDQWdJQ0FnSUNCaVlXTnJaM0p2ZFc1a0xXTnZiRzl5T2lCQWFXNW1iMTkwYVhCZlltZGZZMjlzYjNJN1hISmNiaUFnSUNBZ0lIMWNjbHh1WEhKY2JpQWdJQ0FnSUNaZmQyRnlibWx1WnlCN1hISmNiaUFnSUNBZ0lDQWdZbTl5WkdWeUxXeGxablE2SURWd2VDQnpiMnhwWkNCQWQyRnlibWx1WjE5amIyeHZjanRjY2x4dUlDQWdJQ0FnSUNCaVlXTnJaM0p2ZFc1a0xXTnZiRzl5T2lCQWQyRnlibWx1WjE5MGFYQmZZbWRmWTI5c2IzSTdYSEpjYmlBZ0lDQWdJSDFjY2x4dVhISmNiaUFnSUNBZ0lDWmZjM1ZqWTJWemN5QjdYSEpjYmlBZ0lDQWdJQ0FnWW05eVpHVnlMV3hsWm5RNklEVndlQ0J6YjJ4cFpDQkFjM1ZqWTJWemMxOWpiMnh2Y2p0Y2NseHVJQ0FnSUNBZ0lDQmlZV05yWjNKdmRXNWtMV052Ykc5eU9pQkFjM1ZqWTJWemMxOTBhWEJmWW1kZlkyOXNiM0k3WEhKY2JpQWdJQ0FnSUgxY2NseHVYSEpjYmlBZ0lDQWdJQ1pmWlhKeWIzSWdlMXh5WEc0Z0lDQWdJQ0FnSUdKdmNtUmxjaTFzWldaME9pQTFjSGdnYzI5c2FXUWdRR1JoYm1kbGNsOWpiMnh2Y2p0Y2NseHVJQ0FnSUNBZ0lDQmlZV05yWjNKdmRXNWtMV052Ykc5eU9pQkFaR0Z1WjJWeVgzUnBjRjlpWjE5amIyeHZjanRjY2x4dUlDQWdJQ0FnZlZ4eVhHNGdJQ0FnZlZ4eVhHNWNjbHh1SUNBZ0lDNXZkWFJzYVc1bExXMWxjM05oWjJWZlgybGpiMjRnZTF4eVhHNGdJQ0FnSUNCM2FXUjBhRG9nTUR0Y2NseHVJQ0FnSUNBZ1pHbHpjR3hoZVRvZ2JtOXVaVHRjY2x4dVhISmNiaUFnSUNBZ0lDNXZkWFJzYVc1bExXbGpiMjRnZTF4eVhHNGdJQ0FnSUNBZ0lHUnBjM0JzWVhrNklHNXZibVU3WEhKY2JpQWdJQ0FnSUgxY2NseHVJQ0FnSUgxY2NseHVJQ0I5WEhKY2JseHlYRzRnSUNaZmJHbG5hSFFnZTF4eVhHNGdJQ0FnYldsdUxYZHBaSFJvT2lBeE9EQndlRHRjY2x4dUlDQWdJSEJoWkdScGJtYzZJREFnTkRCd2VEdGNjbHh1WEhKY2JpQWdJQ0FtTG05MWRHeHBibVV0YldWemMyRm5aU0I3WEhKY2JpQWdJQ0FnSUNaZmFXNW1ieUI3WEhKY2JpQWdJQ0FnSUNBZ0xtOTFkR3hwYm1VdGJXVnpjMkZuWlY5ZmFXTnZiaUI3WEhKY2JpQWdJQ0FnSUNBZ0lDQmpiMnh2Y2pvZ1FIQnlhVzFoY25sZlkyOXNiM0k3WEhKY2JpQWdJQ0FnSUNBZ2ZWeHlYRzRnSUNBZ0lDQjlYSEpjYmx4eVhHNGdJQ0FnSUNBbVgzZGhjbTVwYm1jZ2UxeHlYRzRnSUNBZ0lDQWdJQzV2ZFhSc2FXNWxMVzFsYzNOaFoyVmZYMmxqYjI0Z2UxeHlYRzRnSUNBZ0lDQWdJQ0FnWTI5c2IzSTZJRUIzWVhKdWFXNW5YMk52Ykc5eU8xeHlYRzRnSUNBZ0lDQWdJSDFjY2x4dUlDQWdJQ0FnZlZ4eVhHNWNjbHh1SUNBZ0lDQWdKbDl6ZFdOalpYTnpJSHRjY2x4dUlDQWdJQ0FnSUNBdWIzVjBiR2x1WlMxdFpYTnpZV2RsWDE5cFkyOXVJSHRjY2x4dUlDQWdJQ0FnSUNBZ0lHTnZiRzl5T2lCQWMzVmpZMlZ6YzE5amIyeHZjanRjY2x4dUlDQWdJQ0FnSUNCOVhISmNiaUFnSUNBZ0lIMWNjbHh1WEhKY2JpQWdJQ0FnSUNaZlpYSnliM0lnZTF4eVhHNGdJQ0FnSUNBZ0lDNXZkWFJzYVc1bExXMWxjM05oWjJWZlgybGpiMjRnZTF4eVhHNGdJQ0FnSUNBZ0lDQWdZMjlzYjNJNklFQmtZVzVuWlhKZlkyOXNiM0k3WEhKY2JpQWdJQ0FnSUNBZ2ZWeHlYRzRnSUNBZ0lDQjlYSEpjYmlBZ0lDQjlYSEpjYmx4eVhHNGdJQ0FnTG05MWRHeHBibVV0YldWemMyRm5aVjlmYVdOdmJpQjdYSEpjYmlBZ0lDQWdJR0poWTJ0bmNtOTFibVF0WTI5c2IzSTZJRUIzYUdsMFpUdGNjbHh1SUNBZ0lIMWNjbHh1SUNCOVhISmNibHh5WEc0Z0lDWmZjbTkxYm1RZ2UxeHlYRzRnSUNBZ0xuSmhaR2wxY3lneU1IQjRLVHRjY2x4dVhISmNiaUFnSUNBbUxtOTFkR3hwYm1VdGJXVnpjMkZuWlNCN1hISmNiaUFnSUNBZ0lDWmZaR1ZtWVhWc2RDQjdYSEpjYmlBZ0lDQWdJQ0FnYldsdUxYZHBaSFJvT2lBeE9EQndlRHRjY2x4dUlDQWdJQ0FnSUNCd1lXUmthVzVuT2lBd0lEUXdjSGc3WEhKY2JseHlYRzRnSUNBZ0lDQWdJQzV2ZFhSc2FXNWxMVzFsYzNOaFoyVmZYMmxqYjI0Z2UxeHlYRzRnSUNBZ0lDQWdJQ0FnTG5KaFpHbDFjeWd4TUhCNEtUdGNjbHh1SUNBZ0lDQWdJQ0FnSUhSdmNEb2dNVEJ3ZUR0Y2NseHVJQ0FnSUNBZ0lDQWdJR3hsWm5RNklERXdjSGc3WEhKY2JpQWdJQ0FnSUNBZ0lDQjNhV1IwYURvZ01qQndlRHRjY2x4dUlDQWdJQ0FnSUNBZ0lHaGxhV2RvZERvZ01qQndlRHRjY2x4dUlDQWdJQ0FnSUNBZ0lHeHBibVV0YUdWcFoyaDBPaUF5TUhCNE8xeHlYRzRnSUNBZ0lDQWdJSDFjY2x4dVhISmNiaUFnSUNBZ0lDQWdKaTV2ZFhSc2FXNWxMVzFsYzNOaFoyVmZablZzYkMxM2FXUjBhQ0I3WEhKY2JpQWdJQ0FnSUNBZ0lDQnRhVzR0ZDJsa2RHZzZJREl3TUhCNE8xeHlYRzRnSUNBZ0lDQWdJQ0FnY0dGa1pHbHVaem9nTUNBeU1IQjRJREFnTkRCd2VEdGNjbHh1SUNBZ0lDQWdJQ0I5WEhKY2JpQWdJQ0FnSUgxY2NseHVYSEpjYmlBZ0lDQWdJQ1pmY0d4aGFXNGdlMXh5WEc0Z0lDQWdJQ0FnSUcxcGJpMTNhV1IwYURvZ01UazFjSGc3WEhKY2JpQWdJQ0FnSUNBZ2NHRmtaR2x1WnpvZ01DQTBNSEI0SURBZ01qQndlRHRjY2x4dVhISmNiaUFnSUNBZ0lDQWdKaTV2ZFhSc2FXNWxMVzFsYzNOaFoyVmZablZzYkMxM2FXUjBhQ0I3WEhKY2JpQWdJQ0FnSUNBZ0lDQnRhVzR0ZDJsa2RHZzZJREl4TlhCNE8xeHlYRzRnSUNBZ0lDQWdJQ0FnY0dGa1pHbHVaem9nTUNBeU1IQjRPMXh5WEc0Z0lDQWdJQ0FnSUgxY2NseHVJQ0FnSUNBZ2ZWeHlYRzRnSUNBZ2ZWeHlYRzRnSUgxY2NseHVYSEpjYmlBZ0psOW1kV3hzTFhkcFpIUm9JSHRjY2x4dUlDQWdJRzFwYmkxM2FXUjBhRG9nTWpBd2NIZzdYSEpjYmlBZ0lDQndZV1JrYVc1bk9pQXdJREV3Y0hnZ01DQTFNSEI0TzF4eVhHNWNjbHh1SUNBZ0lDWXViM1YwYkdsdVpTMXRaWE56WVdkbElIdGNjbHh1SUNBZ0lDQWdKbDl3YkdGcGJpQjdYSEpjYmlBZ0lDQWdJQ0FnYldsdUxYZHBaSFJvT2lBeU16QndlRHRjY2x4dUlDQWdJQ0FnSUNCd1lXUmthVzVuT2lBd0lERXdjSGdnTUNBeE5YQjRPMXh5WEc0Z0lDQWdJQ0I5WEhKY2JseHlYRzRnSUNBZ0lDQW1YMnhwWjJoMElIdGNjbHh1SUNBZ0lDQWdJQ0J0YVc0dGQybGtkR2c2SURJeE1IQjRPMXh5WEc0Z0lDQWdJQ0FnSUhCaFpHUnBibWM2SURBZ01UQndlQ0F3SURRd2NIZzdYSEpjYmlBZ0lDQWdJSDFjY2x4dUlDQWdJSDFjY2x4dUlDQjlYSEpjYmx4eVhHNGdJQ1pmZG1semFXSnNaU0I3WEhKY2JpQWdJQ0J2Y0dGamFYUjVPaUF4TzF4eVhHNGdJSDFjY2x4dVhISmNiaUFnSmw5b2FXUmtaVzRnZTF4eVhHNGdJQ0FnWkdsemNHeGhlVG9nYm05dVpUdGNjbHh1SUNCOVhISmNibjFjY2x4dUlpd2lMeW9nUFQwOVBUMGdVMk55YjJ4c1ltRnlJRDA5UFQwOUlDb3ZYSEpjYmpvNkxYZGxZbXRwZEMxelkzSnZiR3hpWVhJZ2UxeHlYRzRnSUhkcFpIUm9PaUEzY0hnN1hISmNiaUFnYUdWcFoyaDBPaUEzY0hnN1hISmNiaUFnTFhkbFltdHBkQzFpYjNKa1pYSXRjbUZrYVhWek9pQTFjSGc3WEhKY2JseHlYRzRnSUNZdGRISmhZMnN0Y0dsbFkyVWdlMXh5WEc0Z0lDQWdMWGRsWW10cGRDMWliM0prWlhJdGNtRmthWFZ6T2lBMWNIZzdYSEpjYmlBZ2ZWeHlYRzVjY2x4dUlDQW1MWFJvZFcxaUlIdGNjbHh1SUNBZ0lDWTZkbVZ5ZEdsallXd2dlMXh5WEc0Z0lDQWdJQ0JpWVdOclozSnZkVzVrTFdOdmJHOXlPaUJ5WjJKaEtEQXNJREFzSURBc0lEQXVNalVwTzF4eVhHNGdJQ0FnSUNBdGQyVmlhMmwwTFdKdmNtUmxjaTF5WVdScGRYTTZJRFZ3ZUR0Y2NseHVJQ0FnSUgxY2NseHVYSEpjYmlBZ0lDQW1PbWh2Y21sNmIyNTBZV3dnZTF4eVhHNGdJQ0FnSUNCaVlXTnJaM0p2ZFc1a0xXTnZiRzl5T2lCeVoySmhLREFzSURBc0lEQXNJREF1TWpVcE8xeHlYRzRnSUNBZ0lDQXRkMlZpYTJsMExXSnZjbVJsY2kxeVlXUnBkWE02SURWd2VEdGNjbHh1SUNBZ0lIMWNjbHh1WEhKY2JpQWdJQ0FtT21odmRtVnlJSHRjY2x4dUlDQWdJQ0FnWW1GamEyZHliM1Z1WkMxamIyeHZjam9nY21kaVlTZ3dMQ0F3TENBd0xDQXdMak0xS1R0Y2NseHVJQ0FnSUgxY2NseHVJQ0I5WEhKY2JseHlYRzRnSUNZNmFHOTJaWElnZTF4eVhHNGdJQ0FnWW1GamEyZHliM1Z1WkMxamIyeHZjam9nY21kaVlTZ3dMQ0F3TENBd0xDQXdMakUxS1R0Y2NseHVJQ0I5WEhKY2JuMWNjbHh1SWwxOSAqL1xuIl0sImZpbGUiOiJvdXRsaW5lLm1pbi5jc3MifQ== */ +.outline-icon,.outline-icon__svg{width:1em;height:1em;overflow:hidden}.outline-drawer__title,.outline-drawer_ttb,.outline-navigator__title{border-bottom:1px solid #dcdfe6}:root{--outline-zIndex:2000;--outline-sticky-height:100%;--outline-navigator-width:100%}.outline-icon{position:relative;z-index:1;display:inline-block;vertical-align:middle}.outline-icon__svg{position:absolute;z-index:2;top:50%;left:50%;fill:currentcolor;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%)}.outline-icon_hidden{display:none}::-webkit-scrollbar{width:7px;height:7px;-webkit-border-radius:5px}::-webkit-scrollbar-track-piece{-webkit-border-radius:5px}::-webkit-scrollbar-thumb:vertical{background-color:rgba(0,0,0,.25);-webkit-border-radius:5px}::-webkit-scrollbar-thumb:horizontal{background-color:rgba(0,0,0,.25);-webkit-border-radius:5px}::-webkit-scrollbar-thumb:hover{background-color:rgba(0,0,0,.35)}::-webkit-scrollbar:hover{background-color:rgba(0,0,0,.15)}.outline-heading{position:relative;z-index:1;overflow:hidden}.outline-heading__anchor{display:none}.outline-heading__anchor:hover,.outline-heading__anchor:link,.outline-heading__anchor:visited{color:#999;text-decoration:none}.outline-heading__anchor:hover{color:#507afe}.outline-heading:hover .outline-heading__anchor{display:inline-block}.outline-heading_start:hover{overflow:visible}.outline-heading_start .outline-heading__anchor{position:absolute;z-index:2;top:50%;-webkit-transform:translateY(-50%);transform:translateY(-50%);left:-1em}.outline-drawer{position:relative;z-index:-1;top:0;left:0;margin:0;width:100%;height:100%;-webkit-box-sizing:border-box;box-sizing:border-box;visibility:hidden;overflow:hidden}.outline-drawer__modal{-webkit-box-shadow:0 0 6px 1px #dcdfe6;box-shadow:0 0 6px 1px #dcdfe6;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-ms-flex-wrap:nowrap;flex-wrap:nowrap;position:absolute;z-index:21;height:100%;background-color:#fff;-webkit-transition-duration:.4s;transition-duration:.4s;overflow:hidden}.outline-drawer__footer,.outline-drawer__header,.outline-drawer__main{width:100%;-webkit-box-sizing:border-box;box-sizing:border-box}.outline-drawer__footer,.outline-drawer__header{-ms-flex-negative:0;flex-shrink:0}.outline-drawer__footer,.outline-drawer__main,.outline-drawer__title{padding:0 16px}.outline-drawer__header,.outline-drawer__title{position:relative;z-index:1;margin:0 auto;height:52px;line-height:52px;overflow:hidden}.outline-drawer__title{font-size:16px;font-weight:400;margin:0 16px;-webkit-box-sizing:border-box;box-sizing:border-box}.outline-drawer__close{position:absolute;z-index:2;top:50%;right:12px;width:20px;height:20px;line-height:20px;color:#999;font-size:20px;text-align:center;cursor:pointer;-webkit-transform:translateY(-50%);transform:translateY(-50%);overflow:hidden}.outline-drawer__close .outline-icon{position:absolute;z-index:2;top:0;left:0}.outline-drawer__close:hover{color:#666}.outline-drawer__main{-webkit-box-flex:1;-ms-flex:1;flex:1;overflow:auto}.outline-drawer__main.overflow-hidden{overflow:hidden}.outline-drawer__footer{margin:0 auto;text-align:right;overflow:hidden}.outline-drawer__overlay{content:'';position:relative;z-index:1;top:0;left:0;width:100%;height:100%;background-color:#fff;opacity:.1;overflow:hidden}.outline-drawer_ltr.outline-drawer_tiny,.outline-drawer_rtl.outline-drawer_tiny{width:280px}.outline-drawer_ltr.outline-drawer_mini,.outline-drawer_rtl.outline-drawer_mini{width:480px}.outline-drawer_ltr.outline-drawer_small,.outline-drawer_rtl.outline-drawer_small{width:540px}.outline-drawer_ltr.outline-drawer_regular,.outline-drawer_rtl.outline-drawer_regular{width:680px}.outline-drawer_ltr.outline-drawer_medium,.outline-drawer_rtl.outline-drawer_medium{width:720px}.outline-drawer_ltr.outline-drawer_large,.outline-drawer_rtl.outline-drawer_large{width:960px}.outline-drawer_rtl{border-left:1px solid #dcdfe6}.outline-drawer_rtl.outline-drawer_tiny.outline-drawer_closed{right:-290px}.outline-drawer_rtl.outline-drawer_mini.outline-drawer_closed{right:-490px}.outline-drawer_rtl.outline-drawer_small.outline-drawer_closed{right:-550px}.outline-drawer_rtl.outline-drawer_regular.outline-drawer_closed{right:-690px}.outline-drawer_rtl.outline-drawer_medium.outline-drawer_closed{right:-730px}.outline-drawer_rtl.outline-drawer_large.outline-drawer_closed{right:-970px}.outline-drawer_ltr{border-right:1px solid #dcdfe6}.outline-drawer_ltr.outline-drawer_tiny.outline-drawer_closed{left:-290px}.outline-drawer_ltr.outline-drawer_mini.outline-drawer_closed{left:-490px}.outline-drawer_ltr.outline-drawer_small.outline-drawer_closed{left:-550px}.outline-drawer_ltr.outline-drawer_regular.outline-drawer_closed{left:-690px}.outline-drawer_ltr.outline-drawer_medium.outline-drawer_closed{left:-730px}.outline-drawer_ltr.outline-drawer_large.outline-drawer_closed{left:-970px}.outline-drawer_btt,.outline-drawer_ttb{left:0;width:100%}.outline-drawer_btt.outline-drawer_tiny,.outline-drawer_ttb.outline-drawer_tiny{height:240px}.outline-drawer_btt.outline-drawer_mini,.outline-drawer_ttb.outline-drawer_mini{height:320px}.outline-drawer_btt.outline-drawer_small,.outline-drawer_ttb.outline-drawer_small{height:360px}.outline-drawer_btt.outline-drawer_regular,.outline-drawer_ttb.outline-drawer_regular{height:400px}.outline-drawer_btt.outline-drawer_medium,.outline-drawer_ttb.outline-drawer_medium{height:440px}.outline-drawer_btt.outline-drawer_large,.outline-drawer_ttb.outline-drawer_large{height:480px}.outline-drawer_ttb.outline-drawer_tiny.outline-drawer_closed{top:-250px}.outline-drawer_ttb.outline-drawer_mini.outline-drawer_closed{top:-330px}.outline-drawer_ttb.outline-drawer_small.outline-drawer_closed{top:-370px}.outline-drawer_ttb.outline-drawer_regular.outline-drawer_closed{top:-410px}.outline-drawer_ttb.outline-drawer_medium.outline-drawer_closed{top:-450px}.outline-drawer_ttb.outline-drawer_large.outline-drawer_closed{top:-490px}.outline-drawer_btt{top:initial;border-top:1px solid #dcdfe6}.outline-drawer_btt.outline-drawer_tiny.outline-drawer_closed{bottom:-250px}.outline-drawer_btt.outline-drawer_mini.outline-drawer_closed{bottom:-330px}.outline-drawer_btt.outline-drawer_small.outline-drawer_closed{bottom:-370px}.outline-drawer_btt.outline-drawer_regular.outline-drawer_closed{bottom:-410px}.outline-drawer_btt.outline-drawer_medium.outline-drawer_closed{bottom:-450px}.outline-drawer_btt.outline-drawer_large.outline-drawer_closed{bottom:-490px}.outline-drawer_opened{visibility:visible;z-index:var(--outline-zIndex)}.outline-drawer_opened.outline-drawer{position:fixed}.outline-drawer_opened.outline-drawer_rtl{right:0}.outline-drawer_opened.outline-drawer_ltr{left:0}.outline-drawer_opened.outline-drawer_ttb{top:0}.outline-drawer_opened.outline-drawer_btt{bottom:0}.outline-drawer_offset.outline-drawer_ltr,.outline-drawer_offset.outline-drawer_rtl{height:calc(100% - 4em);top:50%;-webkit-transform:translateY(-50%);transform:translateY(-50%)}.outline-drawer_offset.outline-drawer_btt,.outline-drawer_offset.outline-drawer_ttb{width:calc(100% - 4em);left:50%;-webkit-transform:translateX(-50%);transform:translateX(-50%)}.outline-drawer_offset.outline-drawer_opened.outline-drawer_rtl{right:2em}.outline-drawer_offset.outline-drawer_opened.outline-drawer_ltr{left:2em}.outline-drawer_offset.outline-drawer_opened.outline-drawer_ttb{top:2em}.outline-drawer_offset.outline-drawer_opened.outline-drawer_btt{bottom:2em}.outline-drawer_auto.outline-drawer_ltr,.outline-drawer_auto.outline-drawer_rtl{height:auto;max-height:calc(100% - 4em)}.outline-drawer_full{padding:0}.outline-navigator{position:relative;z-index:1;margin:0;width:var(--outline-navigator-width);overflow:auto}.outline-navigator-parent{-webkit-transition:.3s ease-in-out;transition:.3s ease-in-out}.outline-navigator__title{margin:0 16px;height:40px;line-height:40px;padding:0 16px;font-size:16px;font-weight:400;overflow:hidden}.outline-navigator__main{position:relative;z-index:1;margin:0;overflow:hidden}.outline-navigator__item,.outline-navigator__list,.outline-navigator__subject{position:relative;z-index:2;margin:0;padding:0;list-style-type:none;overflow:hidden}.outline-navigator__list{padding:.5em 0}.outline-navigator__subject{padding-left:1em}.outline-navigator__item{margin:0;line-height:30px;font-size:13px;overflow:hidden}.outline-navigator__placeholder{position:absolute;z-index:1;top:0;left:0;width:100%;height:30px;background-color:#f7f8f9;border-left:2px solid #058942;-webkit-transition-duration:.2s;transition-duration:.2s;-webkit-box-sizing:border-box;box-sizing:border-box;overflow:hidden}.outline-navigator__anchor{white-space:nowrap;text-overflow:ellipsis;overflow:hidden;display:block;padding:0 1.5em}.outline-navigator__anchor:hover,.outline-navigator__anchor:link,.outline-navigator__anchor:visited{text-decoration:none;color:#555}.outline-navigator__anchor:hover{color:#058942}.outline-navigator__code{padding-right:.5em}.outline-navigator_highlight.outline-navigator__anchor:hover,.outline-navigator_highlight.outline-navigator__anchor:link,.outline-navigator_highlight.outline-navigator__anchor:visited{color:#058942;font-weight:700}.outline-navigator_fixed,.outline-navigator_sticky{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;z-index:var(--outline-zIndex);top:0;overflow:hidden}.outline-navigator_hidden,.outline-reader__article .outline-reader__progress,.outline-reader_hidden{display:none}.outline-navigator_fixed .outline-navigator__main,.outline-navigator_fixed .outline-navigator__title,.outline-navigator_sticky .outline-navigator__main,.outline-navigator_sticky .outline-navigator__title{-webkit-box-sizing:border-box;box-sizing:border-box}.outline-navigator_fixed .outline-navigator__title,.outline-navigator_sticky .outline-navigator__title{-ms-flex-negative:0;flex-shrink:0}.outline-navigator_fixed .outline-navigator__main,.outline-navigator_sticky .outline-navigator__main{-webkit-box-flex:1;-ms-flex:1;flex:1;overflow:auto}.outline-navigator_sticky{position:sticky;max-height:var(--outline-sticky-height)}.outline-navigator_fixed{position:fixed;max-height:100%}.outline-navigator_folded{width:0;overflow:hidden}.outline-reader__progress{position:fixed;top:0;left:0;z-index:3;height:4px;width:100%;background-color:#507afe;scale:0 1;-webkit-transform-origin:left;transform-origin:left;-webkit-animation:outline-reader-progress linear;animation:outline-reader-progress linear;animation-timeline:--ProgressTimeline}.outline-reader__paper{-webkit-box-shadow:0 0 6px 1px #ddd;box-shadow:0 0 6px 1px #ddd;margin:2em auto;max-width:1200px;padding:3.2em;-webkit-box-sizing:border-box;box-sizing:border-box;background-color:#fff;overflow:hidden}.outline-reader__title{margin:.67em 0;text-align:center;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI','PingFang SC','Hiragino Sans GB','Microsoft YaHei','Helvetica Neue','Apple Color Emoji','Segoe UI Emoji','Segoe UI Symbol',Helvetica,Arial,sans-serif;font-weight:400;line-height:1.3em;font-size:4.2em;overflow:hidden}.outline-reader_hidden.outline-reader_sibling{display:none!important}.outline-reader_hidden.outline-reader_sibling.wrapper.post{display:none}.outline-reader--reading{display:block;position:fixed;z-index:2;top:0;left:0;width:100%;height:100%;margin:0;-webkit-box-sizing:border-box;box-sizing:border-box;padding:3em 4em;background-color:#fafafa;scroll-timeline-name:--ProgressTimeline;overflow:scroll}@-webkit-keyframes outline-reader-progress{to{scale:1 1}}@keyframes outline-reader-progress{to{scale:1 1}}@media (max-width:500px){.outline-reader{overflow:hidden}.outline-reader .outline-toolbar{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-ms-flex-item-align:auto;align-self:auto;top:100%;right:0;-webkit-transform:translateY(-48px);transform:translateY(-48px);width:100%;height:48px;-webkit-box-sizing:border-box;box-sizing:border-box;border-top:1px solid #ddd;background-color:#fff;padding:0 16px}.outline-reader .outline-toolbar__button{border-radius:0;-webkit-box-flex:1;-ms-flex:1;flex:1;border:none;-webkit-box-shadow:none;box-shadow:none}.outline-reader--reading{padding:0;background-color:#fff;-webkit-box-sizing:border-box;box-sizing:border-box}.outline-reader__paper{position:relative;z-index:1;margin:0;padding:0;height:100%;-webkit-box-shadow:none;box-shadow:none;overflow:hidden}.outline-reader__title{white-space:nowrap;text-overflow:ellipsis;position:absolute;z-index:3;top:0;left:0;margin:0;width:100%;height:48px;line-height:48px;border-bottom:1px solid #ddd;font-size:1.8em;font-weight:400;background-color:#fff;overflow:hidden}.outline-reader__article{margin:48px 0;height:calc(100% - 96px);padding:0 1.25em;scroll-timeline-name:--MobileProgressTimeline;overflow-x:hidden;overflow-y:scroll}.outline-reader__article .outline-reader__progress{z-index:4;-webkit-animation:outline-reader-progress linear;animation:outline-reader-progress linear;animation-timeline:--MobileProgressTimeline;display:block}}@media print{body,html{font-size:12pt;background-color:#fff;color:#333;height:initial!important}a:hover,a:link,a:visited{text-decoration:underline!important;color:#507afe}.outline-message,.outline-toolbar,audio,video{display:none!important}table{width:100%;border-collapse:collapse}td,th{border:1px solid #dcdfe6;padding:8px 20px}.outline-reader{display:block!important;overflow:hidden}.outline-reader__progress,.outline-reader_sibling{display:none!important}.outline-reader__title{margin:13.4pt 0 28pt!important;text-align:center!important;font-size:32pt!important}.outline-reader--reading{position:relative!important;height:auto!important;padding:0!important;background-color:#fff;overflow:hidden!important}.outline-reader__paper{-webkit-box-shadow:none;box-shadow:none}.outline-reader pre{padding:1em!important;border:1px solid #ddd!important;border-radius:4px!important}.outline-reader code,.outline-reader pre{background-color:#fff!important}.outline-reader img,.outline-reader svg,.outline-reader table{-webkit-column-break-inside:avoid;-moz-column-break-inside:avoid;break-inside:avoid}}.outline-toolbar{position:fixed;z-index:99999;margin:0;-webkit-transition-duration:.3s;transition-duration:.3s;overflow:hidden}.outline-toolbar__button{-webkit-box-shadow:0 0 6px 1px #dcdfe6;box-shadow:0 0 6px 1px #dcdfe6;position:relative;z-index:1;margin:10px;width:36px;height:36px;border:1px solid #dcdfe6;border-radius:3px;-webkit-box-sizing:border-box;box-sizing:border-box;background-color:#fff;cursor:pointer;text-align:center;color:#999;-webkit-transition:all .3s .1s ease-in-out;transition:all .3s .1s ease-in-out;overflow:hidden}.outline-toolbar__button:hover{color:#058942;border-color:#058942;-webkit-transform:scale(1.35);transform:scale(1.35)}.outline-toolbar__button.hide{display:none}.outline-toolbar__anchor:hover,.outline-toolbar__anchor:link,.outline-toolbar__anchor:visited{color:#999;text-decoration:none}.outline-toolbar__anchor:hover{color:#058942}.outline-toolbar__icon{position:absolute;z-index:2;top:50%;left:50%;width:20px;height:20px;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%);fill:currentcolor;overflow:hidden}.outline-toolbar_active.outline-toolbar__button{color:#fff;background-color:#058942;border-color:#058942}.outline-toolbar_active .outline-toolbar__anchor:hover,.outline-toolbar_active .outline-toolbar__anchor:link,.outline-toolbar_active .outline-toolbar__anchor:visited,.outline-toolbar_active.outline-toolbar__button:hover{color:#fff}.outline-toolbar_rounded.outline-toolbar__button{border-radius:18px}.outline-toolbar_disabled .outline-toolbar__anchor:hover,.outline-toolbar_disabled .outline-toolbar__anchor:link,.outline-toolbar_disabled .outline-toolbar__anchor:visited,.outline-toolbar_disabled .outline-toolbar__button,.outline-toolbar_disabled.outline-toolbar__anchor:hover,.outline-toolbar_disabled.outline-toolbar__anchor:link,.outline-toolbar_disabled.outline-toolbar__anchor:visited,.outline-toolbar_disabled.outline-toolbar__button{cursor:not-allowed;color:#999;border-color:#999}.outline-toolbar_disabled .outline-toolbar__anchor:hover:hover,.outline-toolbar_disabled .outline-toolbar__anchor:link:hover,.outline-toolbar_disabled .outline-toolbar__anchor:visited:hover,.outline-toolbar_disabled .outline-toolbar__button:hover,.outline-toolbar_disabled.outline-toolbar__anchor:hover:hover,.outline-toolbar_disabled.outline-toolbar__anchor:link:hover,.outline-toolbar_disabled.outline-toolbar__anchor:visited:hover,.outline-toolbar_disabled.outline-toolbar__button:hover{color:#999;border-color:#999}.outline-toolbar_disabled .outline-toolbar__button,.outline-toolbar_disabled.outline-toolbar__button{background-color:#f5f5f5}.outline-toolbar_btt,.outline-toolbar_ttb{left:50%;-webkit-transform:translateX(-50%);transform:translateX(-50%)}.outline-toolbar_btt .outline-toolbar__button,.outline-toolbar_ttb .outline-toolbar__button{display:inline-block}.outline-toolbar_ttb{top:12px}.outline-toolbar_ttb.outline-toolbar_hidden{top:-56px}.outline-toolbar_btt{bottom:12px}.outline-toolbar_btt.outline-toolbar_hidden{bottom:-56px}.outline-toolbar_ltr,.outline-toolbar_rtl{-webkit-transform:translateY(-50%);transform:translateY(-50%);width:56px}.outline-toolbar_rtl{top:50%;right:12px}.outline-toolbar_rtl.outline-toolbar_hidden{right:-86px}.outline-toolbar_ltr{top:50%;left:12px}.outline-toolbar_ltr.outline-toolbar_hidden{left:-86px}.outline-toolbar_btt .outline-toolbar__button.outline-toolbar_hidden,.outline-toolbar_ltr .outline-toolbar__button.outline-toolbar_hidden,.outline-toolbar_rtl .outline-toolbar__button.outline-toolbar_hidden,.outline-toolbar_ttb .outline-toolbar__button.outline-toolbar_hidden{display:none} +/*# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlcyI6WyJvdXRsaW5lLmNzcyJdLCJzb3VyY2VzQ29udGVudCI6WyI6cm9vdCB7XG4gIC0tb3V0bGluZS16SW5kZXg6IDIwMDA7XG4gIC0tb3V0bGluZS1zdGlja3ktaGVpZ2h0OiAxMDAlO1xuICAtLW91dGxpbmUtbmF2aWdhdG9yLXdpZHRoOiAxMDAlO1xufVxuLyogPT09PT09PT09PSBjb2xvcnMudGhlbWUgLSDln7rnoYDpopzoibLlj5jph4/pm4blkIggPT09PT09PT09PSAqL1xuLyoqXG4gKiBlbGxpcHNpcy5sZXNzIC0g5paH5pys55yB55WlIG1peGlueCDlh73mlbBcbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIENyZWF0ZWQgQnk6IFlhb2hhaXhpYW9cbiAqIFVwZGF0ZTogMjAyMi4zLjExXG4gKi9cbi8qID09PT09PSDmlofmnKznnIHnlaXlh73mlbAgPT09PT09ICovXG4vKipcbiAqIHNoYWRvdy5sZXNzIC0g6Zi05b2x5qC35byP6K6+572uIG1peGlueCDlh73mlbBcbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIENyZWF0ZWQgQnk6IFlhb2hhaXhpYW9cbiAqIFVwZGF0ZTogMjAyMi4zLjIwXG4gKi9cbi8qID09PT09PSDpmLTlvbHmoLflvI/orr7nva7lh73mlbAgPT09PT09ICovXG4vKiA9PT09PT09PT09IGljb24udGhlbWUgLSBzdmcg5Zu+5qCH55qE5qC35byPID09PT09PT09PT0gKi9cbi5vdXRsaW5lLWljb24ge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIHotaW5kZXg6IDE7XG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgdmVydGljYWwtYWxpZ246IG1pZGRsZTtcbiAgd2lkdGg6IDFlbTtcbiAgaGVpZ2h0OiAxZW07XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4ub3V0bGluZS1pY29uX19zdmcge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHotaW5kZXg6IDI7XG4gIHRvcDogNTAlO1xuICBsZWZ0OiA1MCU7XG4gIHdpZHRoOiAxZW07XG4gIGhlaWdodDogMWVtO1xuICBmaWxsOiBjdXJyZW50Y29sb3I7XG4gIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgLTUwJSk7XG4gICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgLTUwJSk7XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4ub3V0bGluZS1pY29uX2hpZGRlbiB7XG4gIGRpc3BsYXk6IG5vbmU7XG59XG4vKiA9PT09PSBTY3JvbGxiYXIgPT09PT0gKi9cbjo6LXdlYmtpdC1zY3JvbGxiYXIge1xuICB3aWR0aDogN3B4O1xuICBoZWlnaHQ6IDdweDtcbiAgLXdlYmtpdC1ib3JkZXItcmFkaXVzOiA1cHg7XG59XG46Oi13ZWJraXQtc2Nyb2xsYmFyLXRyYWNrLXBpZWNlIHtcbiAgLXdlYmtpdC1ib3JkZXItcmFkaXVzOiA1cHg7XG59XG46Oi13ZWJraXQtc2Nyb2xsYmFyLXRodW1iOnZlcnRpY2FsIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjI1KTtcbiAgLXdlYmtpdC1ib3JkZXItcmFkaXVzOiA1cHg7XG59XG46Oi13ZWJraXQtc2Nyb2xsYmFyLXRodW1iOmhvcml6b250YWwge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuMjUpO1xuICAtd2Via2l0LWJvcmRlci1yYWRpdXM6IDVweDtcbn1cbjo6LXdlYmtpdC1zY3JvbGxiYXItdGh1bWI6aG92ZXIge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuMzUpO1xufVxuOjotd2Via2l0LXNjcm9sbGJhcjpob3ZlciB7XG4gIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMCwgMCwgMCwgMC4xNSk7XG59XG4ub3V0bGluZS1oZWFkaW5nIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICB6LWluZGV4OiAxO1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLm91dGxpbmUtaGVhZGluZ19fYW5jaG9yIHtcbiAgZGlzcGxheTogbm9uZTtcbn1cbi5vdXRsaW5lLWhlYWRpbmdfX2FuY2hvcjpsaW5rLFxuLm91dGxpbmUtaGVhZGluZ19fYW5jaG9yOnZpc2l0ZWQsXG4ub3V0bGluZS1oZWFkaW5nX19hbmNob3I6aG92ZXIge1xuICBjb2xvcjogIzk5OTtcbiAgdGV4dC1kZWNvcmF0aW9uOiBub25lO1xufVxuLm91dGxpbmUtaGVhZGluZ19fYW5jaG9yOmhvdmVyIHtcbiAgY29sb3I6ICM1MDdhZmU7XG59XG4ub3V0bGluZS1oZWFkaW5nOmhvdmVyIC5vdXRsaW5lLWhlYWRpbmdfX2FuY2hvciB7XG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbn1cbi5vdXRsaW5lLWhlYWRpbmdfc3RhcnQ6aG92ZXIge1xuICBvdmVyZmxvdzogdmlzaWJsZTtcbn1cbi5vdXRsaW5lLWhlYWRpbmdfc3RhcnQgLm91dGxpbmUtaGVhZGluZ19fYW5jaG9yIHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB6LWluZGV4OiAyO1xuICB0b3A6IDUwJTtcbiAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTUwJSk7XG4gICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC01MCUpO1xuICBsZWZ0OiAtMWVtO1xufVxuLm91dGxpbmUtZHJhd2VyIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICB6LWluZGV4OiAtMTtcbiAgdG9wOiAwO1xuICBsZWZ0OiAwO1xuICBtYXJnaW46IDA7XG4gIHdpZHRoOiAxMDAlO1xuICBoZWlnaHQ6IDEwMCU7XG4gIC13ZWJraXQtYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICB2aXNpYmlsaXR5OiBoaWRkZW47XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4ub3V0bGluZS1kcmF3ZXJfX21vZGFsIHtcbiAgLXdlYmtpdC1ib3gtc2hhZG93OiAwIDAgNnB4IDFweCAjZGNkZmU2O1xuICAgICAgICAgIGJveC1zaGFkb3c6IDAgMCA2cHggMXB4ICNkY2RmZTY7XG4gIGRpc3BsYXk6IC13ZWJraXQtYm94O1xuICBkaXNwbGF5OiAtbXMtZmxleGJveDtcbiAgZGlzcGxheTogZmxleDtcbiAgLXdlYmtpdC1ib3gtb3JpZW50OiB2ZXJ0aWNhbDtcbiAgLXdlYmtpdC1ib3gtZGlyZWN0aW9uOiBub3JtYWw7XG4gICAgICAtbXMtZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAtbXMtZmxleC13cmFwOiBub3dyYXA7XG4gICAgICBmbGV4LXdyYXA6IG5vd3JhcDtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB6LWluZGV4OiAyMTtcbiAgaGVpZ2h0OiAxMDAlO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmO1xuICAtd2Via2l0LXRyYW5zaXRpb24tZHVyYXRpb246IDAuNHM7XG4gICAgICAgICAgdHJhbnNpdGlvbi1kdXJhdGlvbjogMC40cztcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi5vdXRsaW5lLWRyYXdlcl9faGVhZGVyLFxuLm91dGxpbmUtZHJhd2VyX19tYWluLFxuLm91dGxpbmUtZHJhd2VyX19mb290ZXIge1xuICB3aWR0aDogMTAwJTtcbiAgLXdlYmtpdC1ib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG59XG4ub3V0bGluZS1kcmF3ZXJfX2hlYWRlcixcbi5vdXRsaW5lLWRyYXdlcl9fZm9vdGVyIHtcbiAgLW1zLWZsZXgtbmVnYXRpdmU6IDA7XG4gICAgICBmbGV4LXNocmluazogMDtcbn1cbi5vdXRsaW5lLWRyYXdlcl9fdGl0bGUsXG4ub3V0bGluZS1kcmF3ZXJfX21haW4sXG4ub3V0bGluZS1kcmF3ZXJfX2Zvb3RlciB7XG4gIHBhZGRpbmc6IDAgMTZweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl9faGVhZGVyLFxuLm91dGxpbmUtZHJhd2VyX190aXRsZSB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgei1pbmRleDogMTtcbiAgbWFyZ2luOiAwIGF1dG87XG4gIGhlaWdodDogNTJweDtcbiAgbGluZS1oZWlnaHQ6IDUycHg7XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4ub3V0bGluZS1kcmF3ZXJfX3RpdGxlIHtcbiAgZm9udC1zaXplOiAxNnB4O1xuICBmb250LXdlaWdodDogNDAwO1xuICBtYXJnaW46IDAgMTZweDtcbiAgLXdlYmtpdC1ib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjZGNkZmU2O1xufVxuLm91dGxpbmUtZHJhd2VyX19jbG9zZSB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgei1pbmRleDogMjtcbiAgdG9wOiA1MCU7XG4gIHJpZ2h0OiAxMnB4O1xuICB3aWR0aDogMjBweDtcbiAgaGVpZ2h0OiAyMHB4O1xuICBsaW5lLWhlaWdodDogMjBweDtcbiAgY29sb3I6ICM5OTk7XG4gIGZvbnQtc2l6ZTogMjBweDtcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xuICBjdXJzb3I6IHBvaW50ZXI7XG4gIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC01MCUpO1xuICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtNTAlKTtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi5vdXRsaW5lLWRyYXdlcl9fY2xvc2UgLm91dGxpbmUtaWNvbiB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgei1pbmRleDogMjtcbiAgdG9wOiAwO1xuICBsZWZ0OiAwO1xufVxuLm91dGxpbmUtZHJhd2VyX19jbG9zZTpob3ZlciB7XG4gIGNvbG9yOiAjNjY2O1xufVxuLm91dGxpbmUtZHJhd2VyX19tYWluIHtcbiAgLXdlYmtpdC1ib3gtZmxleDogMTtcbiAgICAgIC1tcy1mbGV4OiAxO1xuICAgICAgICAgIGZsZXg6IDE7XG4gIG92ZXJmbG93OiBhdXRvO1xufVxuLm91dGxpbmUtZHJhd2VyX19tYWluLm92ZXJmbG93LWhpZGRlbiB7XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4ub3V0bGluZS1kcmF3ZXJfX2Zvb3RlciB7XG4gIG1hcmdpbjogMCBhdXRvO1xuICB0ZXh0LWFsaWduOiByaWdodDtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi5vdXRsaW5lLWRyYXdlcl9fb3ZlcmxheSB7XG4gIGNvbnRlbnQ6ICcnO1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIHotaW5kZXg6IDE7XG4gIHRvcDogMDtcbiAgbGVmdDogMDtcbiAgd2lkdGg6IDEwMCU7XG4gIGhlaWdodDogMTAwJTtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjtcbiAgb3BhY2l0eTogMC4xO1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLm91dGxpbmUtZHJhd2VyX3J0bC5vdXRsaW5lLWRyYXdlcl90aW55LFxuLm91dGxpbmUtZHJhd2VyX2x0ci5vdXRsaW5lLWRyYXdlcl90aW55IHtcbiAgd2lkdGg6IDI4MHB4O1xufVxuLm91dGxpbmUtZHJhd2VyX3J0bC5vdXRsaW5lLWRyYXdlcl9taW5pLFxuLm91dGxpbmUtZHJhd2VyX2x0ci5vdXRsaW5lLWRyYXdlcl9taW5pIHtcbiAgd2lkdGg6IDQ4MHB4O1xufVxuLm91dGxpbmUtZHJhd2VyX3J0bC5vdXRsaW5lLWRyYXdlcl9zbWFsbCxcbi5vdXRsaW5lLWRyYXdlcl9sdHIub3V0bGluZS1kcmF3ZXJfc21hbGwge1xuICB3aWR0aDogNTQwcHg7XG59XG4ub3V0bGluZS1kcmF3ZXJfcnRsLm91dGxpbmUtZHJhd2VyX3JlZ3VsYXIsXG4ub3V0bGluZS1kcmF3ZXJfbHRyLm91dGxpbmUtZHJhd2VyX3JlZ3VsYXIge1xuICB3aWR0aDogNjgwcHg7XG59XG4ub3V0bGluZS1kcmF3ZXJfcnRsLm91dGxpbmUtZHJhd2VyX21lZGl1bSxcbi5vdXRsaW5lLWRyYXdlcl9sdHIub3V0bGluZS1kcmF3ZXJfbWVkaXVtIHtcbiAgd2lkdGg6IDcyMHB4O1xufVxuLm91dGxpbmUtZHJhd2VyX3J0bC5vdXRsaW5lLWRyYXdlcl9sYXJnZSxcbi5vdXRsaW5lLWRyYXdlcl9sdHIub3V0bGluZS1kcmF3ZXJfbGFyZ2Uge1xuICB3aWR0aDogOTYwcHg7XG59XG4ub3V0bGluZS1kcmF3ZXJfcnRsIHtcbiAgYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjZGNkZmU2O1xufVxuLm91dGxpbmUtZHJhd2VyX3J0bC5vdXRsaW5lLWRyYXdlcl90aW55Lm91dGxpbmUtZHJhd2VyX2Nsb3NlZCB7XG4gIHJpZ2h0OiAtMjkwcHg7XG59XG4ub3V0bGluZS1kcmF3ZXJfcnRsLm91dGxpbmUtZHJhd2VyX21pbmkub3V0bGluZS1kcmF3ZXJfY2xvc2VkIHtcbiAgcmlnaHQ6IC00OTBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl9ydGwub3V0bGluZS1kcmF3ZXJfc21hbGwub3V0bGluZS1kcmF3ZXJfY2xvc2VkIHtcbiAgcmlnaHQ6IC01NTBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl9ydGwub3V0bGluZS1kcmF3ZXJfcmVndWxhci5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xuICByaWdodDogLTY5MHB4O1xufVxuLm91dGxpbmUtZHJhd2VyX3J0bC5vdXRsaW5lLWRyYXdlcl9tZWRpdW0ub3V0bGluZS1kcmF3ZXJfY2xvc2VkIHtcbiAgcmlnaHQ6IC03MzBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl9ydGwub3V0bGluZS1kcmF3ZXJfbGFyZ2Uub3V0bGluZS1kcmF3ZXJfY2xvc2VkIHtcbiAgcmlnaHQ6IC05NzBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl9sdHIge1xuICBib3JkZXItcmlnaHQ6IDFweCBzb2xpZCAjZGNkZmU2O1xufVxuLm91dGxpbmUtZHJhd2VyX2x0ci5vdXRsaW5lLWRyYXdlcl90aW55Lm91dGxpbmUtZHJhd2VyX2Nsb3NlZCB7XG4gIGxlZnQ6IC0yOTBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl9sdHIub3V0bGluZS1kcmF3ZXJfbWluaS5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xuICBsZWZ0OiAtNDkwcHg7XG59XG4ub3V0bGluZS1kcmF3ZXJfbHRyLm91dGxpbmUtZHJhd2VyX3NtYWxsLm91dGxpbmUtZHJhd2VyX2Nsb3NlZCB7XG4gIGxlZnQ6IC01NTBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl9sdHIub3V0bGluZS1kcmF3ZXJfcmVndWxhci5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xuICBsZWZ0OiAtNjkwcHg7XG59XG4ub3V0bGluZS1kcmF3ZXJfbHRyLm91dGxpbmUtZHJhd2VyX21lZGl1bS5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xuICBsZWZ0OiAtNzMwcHg7XG59XG4ub3V0bGluZS1kcmF3ZXJfbHRyLm91dGxpbmUtZHJhd2VyX2xhcmdlLm91dGxpbmUtZHJhd2VyX2Nsb3NlZCB7XG4gIGxlZnQ6IC05NzBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl90dGIsXG4ub3V0bGluZS1kcmF3ZXJfYnR0IHtcbiAgbGVmdDogMDtcbiAgd2lkdGg6IDEwMCU7XG59XG4ub3V0bGluZS1kcmF3ZXJfdHRiLm91dGxpbmUtZHJhd2VyX3RpbnksXG4ub3V0bGluZS1kcmF3ZXJfYnR0Lm91dGxpbmUtZHJhd2VyX3Rpbnkge1xuICBoZWlnaHQ6IDI0MHB4O1xufVxuLm91dGxpbmUtZHJhd2VyX3R0Yi5vdXRsaW5lLWRyYXdlcl9taW5pLFxuLm91dGxpbmUtZHJhd2VyX2J0dC5vdXRsaW5lLWRyYXdlcl9taW5pIHtcbiAgaGVpZ2h0OiAzMjBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl90dGIub3V0bGluZS1kcmF3ZXJfc21hbGwsXG4ub3V0bGluZS1kcmF3ZXJfYnR0Lm91dGxpbmUtZHJhd2VyX3NtYWxsIHtcbiAgaGVpZ2h0OiAzNjBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl90dGIub3V0bGluZS1kcmF3ZXJfcmVndWxhcixcbi5vdXRsaW5lLWRyYXdlcl9idHQub3V0bGluZS1kcmF3ZXJfcmVndWxhciB7XG4gIGhlaWdodDogNDAwcHg7XG59XG4ub3V0bGluZS1kcmF3ZXJfdHRiLm91dGxpbmUtZHJhd2VyX21lZGl1bSxcbi5vdXRsaW5lLWRyYXdlcl9idHQub3V0bGluZS1kcmF3ZXJfbWVkaXVtIHtcbiAgaGVpZ2h0OiA0NDBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl90dGIub3V0bGluZS1kcmF3ZXJfbGFyZ2UsXG4ub3V0bGluZS1kcmF3ZXJfYnR0Lm91dGxpbmUtZHJhd2VyX2xhcmdlIHtcbiAgaGVpZ2h0OiA0ODBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl90dGIge1xuICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI2RjZGZlNjtcbn1cbi5vdXRsaW5lLWRyYXdlcl90dGIub3V0bGluZS1kcmF3ZXJfdGlueS5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xuICB0b3A6IC0yNTBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl90dGIub3V0bGluZS1kcmF3ZXJfbWluaS5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xuICB0b3A6IC0zMzBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl90dGIub3V0bGluZS1kcmF3ZXJfc21hbGwub3V0bGluZS1kcmF3ZXJfY2xvc2VkIHtcbiAgdG9wOiAtMzcwcHg7XG59XG4ub3V0bGluZS1kcmF3ZXJfdHRiLm91dGxpbmUtZHJhd2VyX3JlZ3VsYXIub3V0bGluZS1kcmF3ZXJfY2xvc2VkIHtcbiAgdG9wOiAtNDEwcHg7XG59XG4ub3V0bGluZS1kcmF3ZXJfdHRiLm91dGxpbmUtZHJhd2VyX21lZGl1bS5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xuICB0b3A6IC00NTBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl90dGIub3V0bGluZS1kcmF3ZXJfbGFyZ2Uub3V0bGluZS1kcmF3ZXJfY2xvc2VkIHtcbiAgdG9wOiAtNDkwcHg7XG59XG4ub3V0bGluZS1kcmF3ZXJfYnR0IHtcbiAgdG9wOiBpbml0aWFsO1xuICBib3JkZXItdG9wOiAxcHggc29saWQgI2RjZGZlNjtcbn1cbi5vdXRsaW5lLWRyYXdlcl9idHQub3V0bGluZS1kcmF3ZXJfdGlueS5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xuICBib3R0b206IC0yNTBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl9idHQub3V0bGluZS1kcmF3ZXJfbWluaS5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xuICBib3R0b206IC0zMzBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl9idHQub3V0bGluZS1kcmF3ZXJfc21hbGwub3V0bGluZS1kcmF3ZXJfY2xvc2VkIHtcbiAgYm90dG9tOiAtMzcwcHg7XG59XG4ub3V0bGluZS1kcmF3ZXJfYnR0Lm91dGxpbmUtZHJhd2VyX3JlZ3VsYXIub3V0bGluZS1kcmF3ZXJfY2xvc2VkIHtcbiAgYm90dG9tOiAtNDEwcHg7XG59XG4ub3V0bGluZS1kcmF3ZXJfYnR0Lm91dGxpbmUtZHJhd2VyX21lZGl1bS5vdXRsaW5lLWRyYXdlcl9jbG9zZWQge1xuICBib3R0b206IC00NTBweDtcbn1cbi5vdXRsaW5lLWRyYXdlcl9idHQub3V0bGluZS1kcmF3ZXJfbGFyZ2Uub3V0bGluZS1kcmF3ZXJfY2xvc2VkIHtcbiAgYm90dG9tOiAtNDkwcHg7XG59XG4ub3V0bGluZS1kcmF3ZXJfb3BlbmVkIHtcbiAgdmlzaWJpbGl0eTogdmlzaWJsZTtcbiAgei1pbmRleDogdmFyKC0tb3V0bGluZS16SW5kZXgpO1xufVxuLm91dGxpbmUtZHJhd2VyX29wZW5lZC5vdXRsaW5lLWRyYXdlciB7XG4gIHBvc2l0aW9uOiBmaXhlZDtcbn1cbi5vdXRsaW5lLWRyYXdlcl9vcGVuZWQub3V0bGluZS1kcmF3ZXJfcnRsIHtcbiAgcmlnaHQ6IDA7XG59XG4ub3V0bGluZS1kcmF3ZXJfb3BlbmVkLm91dGxpbmUtZHJhd2VyX2x0ciB7XG4gIGxlZnQ6IDA7XG59XG4ub3V0bGluZS1kcmF3ZXJfb3BlbmVkLm91dGxpbmUtZHJhd2VyX3R0YiB7XG4gIHRvcDogMDtcbn1cbi5vdXRsaW5lLWRyYXdlcl9vcGVuZWQub3V0bGluZS1kcmF3ZXJfYnR0IHtcbiAgYm90dG9tOiAwO1xufVxuLm91dGxpbmUtZHJhd2VyX29mZnNldC5vdXRsaW5lLWRyYXdlcl9ydGwsXG4ub3V0bGluZS1kcmF3ZXJfb2Zmc2V0Lm91dGxpbmUtZHJhd2VyX2x0ciB7XG4gIGhlaWdodDogY2FsYygxMDAlIC0gNGVtKTtcbiAgdG9wOiA1MCU7XG4gIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC01MCUpO1xuICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtNTAlKTtcbn1cbi5vdXRsaW5lLWRyYXdlcl9vZmZzZXQub3V0bGluZS1kcmF3ZXJfdHRiLFxuLm91dGxpbmUtZHJhd2VyX29mZnNldC5vdXRsaW5lLWRyYXdlcl9idHQge1xuICB3aWR0aDogY2FsYygxMDAlIC0gNGVtKTtcbiAgbGVmdDogNTAlO1xuICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlWCgtNTAlKTtcbiAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTUwJSk7XG59XG4ub3V0bGluZS1kcmF3ZXJfb2Zmc2V0Lm91dGxpbmUtZHJhd2VyX29wZW5lZC5vdXRsaW5lLWRyYXdlcl9ydGwge1xuICByaWdodDogMmVtO1xufVxuLm91dGxpbmUtZHJhd2VyX29mZnNldC5vdXRsaW5lLWRyYXdlcl9vcGVuZWQub3V0bGluZS1kcmF3ZXJfbHRyIHtcbiAgbGVmdDogMmVtO1xufVxuLm91dGxpbmUtZHJhd2VyX29mZnNldC5vdXRsaW5lLWRyYXdlcl9vcGVuZWQub3V0bGluZS1kcmF3ZXJfdHRiIHtcbiAgdG9wOiAyZW07XG59XG4ub3V0bGluZS1kcmF3ZXJfb2Zmc2V0Lm91dGxpbmUtZHJhd2VyX29wZW5lZC5vdXRsaW5lLWRyYXdlcl9idHQge1xuICBib3R0b206IDJlbTtcbn1cbi5vdXRsaW5lLWRyYXdlcl9hdXRvLm91dGxpbmUtZHJhd2VyX3J0bCxcbi5vdXRsaW5lLWRyYXdlcl9hdXRvLm91dGxpbmUtZHJhd2VyX2x0ciB7XG4gIGhlaWdodDogYXV0bztcbiAgbWF4LWhlaWdodDogY2FsYygxMDAlIC0gNGVtKTtcbn1cbi5vdXRsaW5lLWRyYXdlcl9mdWxsIHtcbiAgcGFkZGluZzogMDtcbn1cbi5vdXRsaW5lLW5hdmlnYXRvciB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgei1pbmRleDogMTtcbiAgbWFyZ2luOiAwO1xuICB3aWR0aDogdmFyKC0tb3V0bGluZS1uYXZpZ2F0b3Itd2lkdGgpO1xuICBvdmVyZmxvdzogYXV0bztcbn1cbi5vdXRsaW5lLW5hdmlnYXRvci1wYXJlbnQge1xuICAtd2Via2l0LXRyYW5zaXRpb246IDAuM3MgZWFzZS1pbi1vdXQ7XG4gIHRyYW5zaXRpb246IDAuM3MgZWFzZS1pbi1vdXQ7XG59XG4ub3V0bGluZS1uYXZpZ2F0b3JfX3RpdGxlIHtcbiAgbWFyZ2luOiAwIDE2cHg7XG4gIGhlaWdodDogNDBweDtcbiAgbGluZS1oZWlnaHQ6IDQwcHg7XG4gIHBhZGRpbmc6IDAgMTZweDtcbiAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNkY2RmZTY7XG4gIGZvbnQtc2l6ZTogMTZweDtcbiAgZm9udC13ZWlnaHQ6IDQwMDtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi5vdXRsaW5lLW5hdmlnYXRvcl9fbWFpbiB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgei1pbmRleDogMTtcbiAgbWFyZ2luOiAwO1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLm91dGxpbmUtbmF2aWdhdG9yX19saXN0LFxuLm91dGxpbmUtbmF2aWdhdG9yX19zdWJqZWN0LFxuLm91dGxpbmUtbmF2aWdhdG9yX19pdGVtIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICB6LWluZGV4OiAyO1xuICBtYXJnaW46IDA7XG4gIHBhZGRpbmc6IDA7XG4gIGxpc3Qtc3R5bGUtdHlwZTogbm9uZTtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi5vdXRsaW5lLW5hdmlnYXRvcl9fbGlzdCB7XG4gIHBhZGRpbmc6IDAuNWVtIDA7XG59XG4ub3V0bGluZS1uYXZpZ2F0b3JfX3N1YmplY3Qge1xuICBwYWRkaW5nLWxlZnQ6IDFlbTtcbn1cbi5vdXRsaW5lLW5hdmlnYXRvcl9faXRlbSB7XG4gIG1hcmdpbjogMDtcbiAgbGluZS1oZWlnaHQ6IDMwcHg7XG4gIGZvbnQtc2l6ZTogMTNweDtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi5vdXRsaW5lLW5hdmlnYXRvcl9fcGxhY2Vob2xkZXIge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHotaW5kZXg6IDE7XG4gIHRvcDogMDtcbiAgbGVmdDogMDtcbiAgd2lkdGg6IDEwMCU7XG4gIGhlaWdodDogMzBweDtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2Y3ZjhmOTtcbiAgYm9yZGVyLWxlZnQ6IDJweCBzb2xpZCAjMDU4OTQyO1xuICAtd2Via2l0LXRyYW5zaXRpb24tZHVyYXRpb246IDAuMnM7XG4gICAgICAgICAgdHJhbnNpdGlvbi1kdXJhdGlvbjogMC4ycztcbiAgLXdlYmtpdC1ib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4ub3V0bGluZS1uYXZpZ2F0b3JfX2FuY2hvciB7XG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzO1xuICBvdmVyZmxvdzogaGlkZGVuO1xuICBkaXNwbGF5OiBibG9jaztcbiAgcGFkZGluZzogMCAxLjVlbTtcbn1cbi5vdXRsaW5lLW5hdmlnYXRvcl9fYW5jaG9yOmxpbmssXG4ub3V0bGluZS1uYXZpZ2F0b3JfX2FuY2hvcjp2aXNpdGVkLFxuLm91dGxpbmUtbmF2aWdhdG9yX19hbmNob3I6aG92ZXIge1xuICB0ZXh0LWRlY29yYXRpb246IG5vbmU7XG4gIGNvbG9yOiAjNTU1O1xufVxuLm91dGxpbmUtbmF2aWdhdG9yX19hbmNob3I6aG92ZXIge1xuICBjb2xvcjogIzA1ODk0Mjtcbn1cbi5vdXRsaW5lLW5hdmlnYXRvcl9fY29kZSB7XG4gIHBhZGRpbmctcmlnaHQ6IDAuNWVtO1xufVxuLm91dGxpbmUtbmF2aWdhdG9yX2hpZ2hsaWdodC5vdXRsaW5lLW5hdmlnYXRvcl9fYW5jaG9yOmxpbmssXG4ub3V0bGluZS1uYXZpZ2F0b3JfaGlnaGxpZ2h0Lm91dGxpbmUtbmF2aWdhdG9yX19hbmNob3I6dmlzaXRlZCxcbi5vdXRsaW5lLW5hdmlnYXRvcl9oaWdobGlnaHQub3V0bGluZS1uYXZpZ2F0b3JfX2FuY2hvcjpob3ZlciB7XG4gIGNvbG9yOiAjMDU4OTQyO1xuICBmb250LXdlaWdodDogYm9sZDtcbn1cbi5vdXRsaW5lLW5hdmlnYXRvcl9zdGlja3ksXG4ub3V0bGluZS1uYXZpZ2F0b3JfZml4ZWQge1xuICBkaXNwbGF5OiAtd2Via2l0LWJveDtcbiAgZGlzcGxheTogLW1zLWZsZXhib3g7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIC1tcy1mbGV4LXdyYXA6IG5vd3JhcDtcbiAgICAgIGZsZXgtd3JhcDogbm93cmFwO1xuICAtd2Via2l0LWJveC1vcmllbnQ6IHZlcnRpY2FsO1xuICAtd2Via2l0LWJveC1kaXJlY3Rpb246IG5vcm1hbDtcbiAgICAgIC1tcy1mbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gIHotaW5kZXg6IHZhcigtLW91dGxpbmUtekluZGV4KTtcbiAgdG9wOiAwO1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLm91dGxpbmUtbmF2aWdhdG9yX3N0aWNreSAub3V0bGluZS1uYXZpZ2F0b3JfX3RpdGxlLFxuLm91dGxpbmUtbmF2aWdhdG9yX2ZpeGVkIC5vdXRsaW5lLW5hdmlnYXRvcl9fdGl0bGUsXG4ub3V0bGluZS1uYXZpZ2F0b3Jfc3RpY2t5IC5vdXRsaW5lLW5hdmlnYXRvcl9fbWFpbixcbi5vdXRsaW5lLW5hdmlnYXRvcl9maXhlZCAub3V0bGluZS1uYXZpZ2F0b3JfX21haW4ge1xuICAtd2Via2l0LWJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbn1cbi5vdXRsaW5lLW5hdmlnYXRvcl9zdGlja3kgLm91dGxpbmUtbmF2aWdhdG9yX190aXRsZSxcbi5vdXRsaW5lLW5hdmlnYXRvcl9maXhlZCAub3V0bGluZS1uYXZpZ2F0b3JfX3RpdGxlIHtcbiAgLW1zLWZsZXgtbmVnYXRpdmU6IDA7XG4gICAgICBmbGV4LXNocmluazogMDtcbn1cbi5vdXRsaW5lLW5hdmlnYXRvcl9zdGlja3kgLm91dGxpbmUtbmF2aWdhdG9yX19tYWluLFxuLm91dGxpbmUtbmF2aWdhdG9yX2ZpeGVkIC5vdXRsaW5lLW5hdmlnYXRvcl9fbWFpbiB7XG4gIC13ZWJraXQtYm94LWZsZXg6IDE7XG4gICAgICAtbXMtZmxleDogMTtcbiAgICAgICAgICBmbGV4OiAxO1xuICBvdmVyZmxvdzogYXV0bztcbn1cbi5vdXRsaW5lLW5hdmlnYXRvcl9zdGlja3kge1xuICBwb3NpdGlvbjogc3RpY2t5O1xuICBtYXgtaGVpZ2h0OiB2YXIoLS1vdXRsaW5lLXN0aWNreS1oZWlnaHQpO1xufVxuLm91dGxpbmUtbmF2aWdhdG9yX2ZpeGVkIHtcbiAgcG9zaXRpb246IGZpeGVkO1xuICBtYXgtaGVpZ2h0OiAxMDAlO1xufVxuLm91dGxpbmUtbmF2aWdhdG9yX2hpZGRlbiB7XG4gIGRpc3BsYXk6IG5vbmU7XG59XG4ub3V0bGluZS1uYXZpZ2F0b3JfZm9sZGVkIHtcbiAgd2lkdGg6IDA7XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4vKipcbiAqIGZvbnQubGVzcyAtIOWtl+S9k+ebuOWFs+agt+W8j1xuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogQ3JlYXRlZCBCeTogWWFvaGFpeGlhb1xuICogVXBkYXRlOiAyMDIyLjMuMTZcbiAqL1xuLyogPT09PT09IOWtl+S9kyA9PT09PT0gKi9cbi8qID09PT09PSDlrZfph40gPT09PT09ICovXG4vKiA9PT09PT0g5a2X5Y+3ID09PT09PSAqL1xuLyoqXG4gKiBtaXhpbnMubGVzcyAtIOW3peWFt+WHveaVsFxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogQ3JlYXRlZCBCeTogWWFvaGFpeGlhb1xuICogVXBkYXRlOiAyMDIyLjMuMTFcbiAqL1xuLyoqXG4gKiByYWRpdXMubGVzcyAtIOWchuinkuiuvue9riBtaXhpbngg5Ye95pWwXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBDcmVhdGVkIEJ5OiBZYW9oYWl4aWFvXG4gKiBVcGRhdGU6IDIwMjQuNC4xNlxuICovXG4vKiA9PT09PT0g5ZyG6KeS5qC35byP6K6+572u5Ye95pWwID09PT09PSAqL1xuLm91dGxpbmUtcmVhZGVyX19wcm9ncmVzcyB7XG4gIHBvc2l0aW9uOiBmaXhlZDtcbiAgdG9wOiAwO1xuICBsZWZ0OiAwO1xuICB6LWluZGV4OiAzO1xuICBoZWlnaHQ6IDRweDtcbiAgd2lkdGg6IDEwMCU7XG4gIGJhY2tncm91bmQtY29sb3I6ICM1MDdhZmU7XG4gIHNjYWxlOiAwIDE7XG4gIC13ZWJraXQtdHJhbnNmb3JtLW9yaWdpbjogbGVmdDtcbiAgICAgICAgICB0cmFuc2Zvcm0tb3JpZ2luOiBsZWZ0O1xuICAtd2Via2l0LWFuaW1hdGlvbjogb3V0bGluZS1yZWFkZXItcHJvZ3Jlc3MgbGluZWFyO1xuICAgICAgICAgIGFuaW1hdGlvbjogb3V0bGluZS1yZWFkZXItcHJvZ3Jlc3MgbGluZWFyO1xuICBhbmltYXRpb24tdGltZWxpbmU6IC0tUHJvZ3Jlc3NUaW1lbGluZTtcbn1cbi5vdXRsaW5lLXJlYWRlcl9fcGFwZXIge1xuICAtd2Via2l0LWJveC1zaGFkb3c6IDAgMCA2cHggMXB4ICNkZGQ7XG4gICAgICAgICAgYm94LXNoYWRvdzogMCAwIDZweCAxcHggI2RkZDtcbiAgbWFyZ2luOiAyZW0gYXV0bztcbiAgbWF4LXdpZHRoOiAxMjAwcHg7XG4gIHBhZGRpbmc6IDMuMmVtO1xuICAtd2Via2l0LWJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi5vdXRsaW5lLXJlYWRlcl9fdGl0bGUge1xuICBtYXJnaW46IDAuNjdlbSAwO1xuICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gIGZvbnQtZmFtaWx5OiAtYXBwbGUtc3lzdGVtLCBCbGlua01hY1N5c3RlbUZvbnQsICdTZWdvZSBVSScsICdQaW5nRmFuZyBTQycsICdIaXJhZ2lubyBTYW5zIEdCJywgJ01pY3Jvc29mdCBZYUhlaScsICdIZWx2ZXRpY2EgTmV1ZScsICdBcHBsZSBDb2xvciBFbW9qaScsICdTZWdvZSBVSSBFbW9qaScsICdTZWdvZSBVSSBTeW1ib2wnLCBIZWx2ZXRpY2EsIEFyaWFsLCBzYW5zLXNlcmlmO1xuICBmb250LXdlaWdodDogbm9ybWFsO1xuICBsaW5lLWhlaWdodDogMS4zZW07XG4gIGZvbnQtc2l6ZTogNC4yZW07XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4ub3V0bGluZS1yZWFkZXJfX2FydGljbGUgLm91dGxpbmUtcmVhZGVyX19wcm9ncmVzcyB7XG4gIGRpc3BsYXk6IG5vbmU7XG59XG4ub3V0bGluZS1yZWFkZXJfaGlkZGVuIHtcbiAgZGlzcGxheTogbm9uZTtcbn1cbi5vdXRsaW5lLXJlYWRlcl9oaWRkZW4ub3V0bGluZS1yZWFkZXJfc2libGluZyB7XG4gIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDtcbn1cbi5vdXRsaW5lLXJlYWRlcl9oaWRkZW4ub3V0bGluZS1yZWFkZXJfc2libGluZy53cmFwcGVyLnBvc3Qge1xuICBkaXNwbGF5OiBub25lO1xufVxuLm91dGxpbmUtcmVhZGVyLS1yZWFkaW5nIHtcbiAgZGlzcGxheTogYmxvY2s7XG4gIHBvc2l0aW9uOiBmaXhlZDtcbiAgei1pbmRleDogMjtcbiAgdG9wOiAwO1xuICBsZWZ0OiAwO1xuICB3aWR0aDogMTAwJTtcbiAgaGVpZ2h0OiAxMDAlO1xuICBtYXJnaW46IDA7XG4gIC13ZWJraXQtYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICBwYWRkaW5nOiAzZW0gNGVtO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmFmYWZhO1xuICBzY3JvbGwtdGltZWxpbmUtbmFtZTogLS1Qcm9ncmVzc1RpbWVsaW5lO1xuICBvdmVyZmxvdzogc2Nyb2xsO1xufVxuQC13ZWJraXQta2V5ZnJhbWVzIG91dGxpbmUtcmVhZGVyLXByb2dyZXNzIHtcbiAgdG8ge1xuICAgIHNjYWxlOiAxIDE7XG4gIH1cbn1cbkBrZXlmcmFtZXMgb3V0bGluZS1yZWFkZXItcHJvZ3Jlc3Mge1xuICB0byB7XG4gICAgc2NhbGU6IDEgMTtcbiAgfVxufVxuQG1lZGlhIChtYXgtd2lkdGg6IDUwMHB4KSB7XG4gIC5vdXRsaW5lLXJlYWRlciB7XG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgfVxuICAub3V0bGluZS1yZWFkZXIgLm91dGxpbmUtdG9vbGJhciB7XG4gICAgZGlzcGxheTogLXdlYmtpdC1ib3g7XG4gICAgZGlzcGxheTogLW1zLWZsZXhib3g7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICAtd2Via2l0LWJveC1vcmllbnQ6IGhvcml6b250YWw7XG4gICAgLXdlYmtpdC1ib3gtZGlyZWN0aW9uOiBub3JtYWw7XG4gICAgICAgIC1tcy1mbGV4LWRpcmVjdGlvbjogcm93O1xuICAgICAgICAgICAgZmxleC1kaXJlY3Rpb246IHJvdztcbiAgICAtbXMtZmxleC13cmFwOiBub3dyYXA7XG4gICAgICAgIGZsZXgtd3JhcDogbm93cmFwO1xuICAgIC13ZWJraXQtYm94LWFsaWduOiBjZW50ZXI7XG4gICAgICAgIC1tcy1mbGV4LWFsaWduOiBjZW50ZXI7XG4gICAgICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgIC1tcy1mbGV4LWl0ZW0tYWxpZ246IGF1dG87XG4gICAgICAgIGFsaWduLXNlbGY6IGF1dG87XG4gICAgdG9wOiAxMDAlO1xuICAgIHJpZ2h0OiAwO1xuICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC00OHB4KTtcbiAgICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtNDhweCk7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgaGVpZ2h0OiA0OHB4O1xuICAgIC13ZWJraXQtYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICAgICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgYm9yZGVyLXRvcDogMXB4IHNvbGlkICNkZGQ7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjtcbiAgICBwYWRkaW5nOiAwIDE2cHg7XG4gIH1cbiAgLm91dGxpbmUtcmVhZGVyIC5vdXRsaW5lLXRvb2xiYXJfX2J1dHRvbiB7XG4gICAgYm9yZGVyLXJhZGl1czogMDtcbiAgICAtd2Via2l0LWJveC1mbGV4OiAxO1xuICAgICAgICAtbXMtZmxleDogMTtcbiAgICAgICAgICAgIGZsZXg6IDE7XG4gICAgYm9yZGVyOiBub25lO1xuICAgIC13ZWJraXQtYm94LXNoYWRvdzogbm9uZTtcbiAgICAgICAgICAgIGJveC1zaGFkb3c6IG5vbmU7XG4gIH1cbiAgLm91dGxpbmUtcmVhZGVyLS1yZWFkaW5nIHtcbiAgICBwYWRkaW5nOiAwO1xuICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmY7XG4gICAgLXdlYmtpdC1ib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgICAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgfVxuICAub3V0bGluZS1yZWFkZXJfX3BhcGVyIHtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgei1pbmRleDogMTtcbiAgICBtYXJnaW46IDA7XG4gICAgcGFkZGluZzogMDtcbiAgICBoZWlnaHQ6IDEwMCU7XG4gICAgLXdlYmtpdC1ib3gtc2hhZG93OiBub25lO1xuICAgICAgICAgICAgYm94LXNoYWRvdzogbm9uZTtcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xuICB9XG4gIC5vdXRsaW5lLXJlYWRlcl9fdGl0bGUge1xuICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIHotaW5kZXg6IDM7XG4gICAgdG9wOiAwO1xuICAgIGxlZnQ6IDA7XG4gICAgbWFyZ2luOiAwO1xuICAgIHdpZHRoOiAxMDAlO1xuICAgIGhlaWdodDogNDhweDtcbiAgICBsaW5lLWhlaWdodDogNDhweDtcbiAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI2RkZDtcbiAgICBmb250LXNpemU6IDEuOGVtO1xuICAgIGZvbnQtd2VpZ2h0OiA0MDA7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjtcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xuICB9XG4gIC5vdXRsaW5lLXJlYWRlcl9fYXJ0aWNsZSB7XG4gICAgbWFyZ2luOiA0OHB4IDA7XG4gICAgaGVpZ2h0OiBjYWxjKDEwMCUgLSA5NnB4KTtcbiAgICBwYWRkaW5nOiAwIDEuMjVlbTtcbiAgICBzY3JvbGwtdGltZWxpbmUtbmFtZTogLS1Nb2JpbGVQcm9ncmVzc1RpbWVsaW5lO1xuICAgIG92ZXJmbG93LXg6IGhpZGRlbjtcbiAgICBvdmVyZmxvdy15OiBzY3JvbGw7XG4gIH1cbiAgLm91dGxpbmUtcmVhZGVyX19hcnRpY2xlIC5vdXRsaW5lLXJlYWRlcl9fcHJvZ3Jlc3Mge1xuICAgIHotaW5kZXg6IDQ7XG4gICAgLXdlYmtpdC1hbmltYXRpb246IG91dGxpbmUtcmVhZGVyLXByb2dyZXNzIGxpbmVhcjtcbiAgICAgICAgICAgIGFuaW1hdGlvbjogb3V0bGluZS1yZWFkZXItcHJvZ3Jlc3MgbGluZWFyO1xuICAgIGFuaW1hdGlvbi10aW1lbGluZTogLS1Nb2JpbGVQcm9ncmVzc1RpbWVsaW5lO1xuICAgIGRpc3BsYXk6IGJsb2NrO1xuICB9XG59XG5AbWVkaWEgcHJpbnQge1xuICBodG1sLFxuICBib2R5IHtcbiAgICAvKiDmiZPljbDnmoTln7rnoYDlrZfkvZPlpKflsI8gKi9cbiAgICBmb250LXNpemU6IDEycHQ7XG4gICAgLyog5pi+56S66K6+572u5paH5a2X6aKc6Imy5ZKM6IOM5pmv6aKc6ImyICovXG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjtcbiAgICBjb2xvcjogIzMzMztcbiAgICBoZWlnaHQ6IGluaXRpYWwgIWltcG9ydGFudDtcbiAgfVxuICAvKiDorr7nva7pk77mjqXmoLflvI8gKi9cbiAgYTpsaW5rLFxuICBhOnZpc2l0ZWQsXG4gIGE6aG92ZXIge1xuICAgIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lICFpbXBvcnRhbnQ7XG4gICAgY29sb3I6ICM1MDdhZmU7XG4gIH1cbiAgLyog6ZqQ6JeP5aqS5L2T5qCH562+ICovXG4gIHZpZGVvLFxuICBhdWRpbyB7XG4gICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50O1xuICB9XG4gIC8qIOehruS/neihqOagvOWcqOaJk+WNsOaXtueahOi+ueahhuWSjOWvuem9kOaWueW8j+a4heaZsCAqL1xuICB0YWJsZSB7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTtcbiAgfVxuICB0aCxcbiAgdGQge1xuICAgIGJvcmRlcjogMXB4IHNvbGlkICNkY2RmZTY7XG4gICAgcGFkZGluZzogOHB4IDIwcHg7XG4gIH1cbiAgLm91dGxpbmUtbWVzc2FnZSxcbiAgLm91dGxpbmUtdG9vbGJhciB7XG4gICAgLyog6ZqQ6JeP5LqG5bel5YW35qCP5ZKM5L+h5oGv5o+Q56S65qGGICovXG4gICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50O1xuICB9XG4gIC5vdXRsaW5lLXJlYWRlciB7XG4gICAgZGlzcGxheTogYmxvY2sgIWltcG9ydGFudDtcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgIC8qIOWPlua2iOS6hue7neWvueWumuS9jSAqL1xuICAgIC8qIOmakOiXj+mYheivu+i/m+W6puadoSAqL1xuICAgIC8qIOaJk+WNsOaXtuS4jeaYvuekuuato+aWhyBET00g55qE6Zi05b2x5pWI5p6cICovXG4gICAgLyog5omA5pyJ5paH56ug5YaF5a65IERPTSDnm7jlhbPnmoTpgrvlsYXoioLngrnpg73pmpDol4/kuoYgKi9cbiAgfVxuICAub3V0bGluZS1yZWFkZXJfX3RpdGxlIHtcbiAgICBtYXJnaW46IDEzLjRwdCAwIDI4cHQgIWltcG9ydGFudDtcbiAgICB0ZXh0LWFsaWduOiBjZW50ZXIgIWltcG9ydGFudDtcbiAgICBmb250LXNpemU6IDMycHQgIWltcG9ydGFudDtcbiAgfVxuICAub3V0bGluZS1yZWFkZXItLXJlYWRpbmcge1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZSAhaW1wb3J0YW50O1xuICAgIGhlaWdodDogYXV0byAhaW1wb3J0YW50O1xuICAgIHBhZGRpbmc6IDAgIWltcG9ydGFudDtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmO1xuICAgIG92ZXJmbG93OiBoaWRkZW4gIWltcG9ydGFudDtcbiAgfVxuICAub3V0bGluZS1yZWFkZXJfX3Byb2dyZXNzIHtcbiAgICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7XG4gIH1cbiAgLm91dGxpbmUtcmVhZGVyX19wYXBlciB7XG4gICAgLXdlYmtpdC1ib3gtc2hhZG93OiBub25lO1xuICAgICAgICAgICAgYm94LXNoYWRvdzogbm9uZTtcbiAgfVxuICAub3V0bGluZS1yZWFkZXIgcHJlIHtcbiAgICBwYWRkaW5nOiAxZW0gIWltcG9ydGFudDtcbiAgICBib3JkZXI6IDFweCBzb2xpZCAjZGRkICFpbXBvcnRhbnQ7XG4gICAgYm9yZGVyLXJhZGl1czogNHB4ICFpbXBvcnRhbnQ7XG4gIH1cbiAgLm91dGxpbmUtcmVhZGVyIHByZSxcbiAgLm91dGxpbmUtcmVhZGVyIGNvZGUge1xuICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmYgIWltcG9ydGFudDtcbiAgfVxuICAub3V0bGluZS1yZWFkZXIgdGFibGUsXG4gIC5vdXRsaW5lLXJlYWRlciBpbWcsXG4gIC5vdXRsaW5lLXJlYWRlciBzdmcge1xuICAgIC13ZWJraXQtY29sdW1uLWJyZWFrLWluc2lkZTogYXZvaWQ7XG4gICAgICAgLW1vei1jb2x1bW4tYnJlYWstaW5zaWRlOiBhdm9pZDtcbiAgICAgICAgICAgIGJyZWFrLWluc2lkZTogYXZvaWQ7XG4gIH1cbiAgLm91dGxpbmUtcmVhZGVyX3NpYmxpbmcge1xuICAgIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDtcbiAgfVxufVxuLm91dGxpbmUtdG9vbGJhciB7XG4gIHBvc2l0aW9uOiBmaXhlZDtcbiAgei1pbmRleDogOTk5OTk7XG4gIG1hcmdpbjogMDtcbiAgLXdlYmtpdC10cmFuc2l0aW9uLWR1cmF0aW9uOiAwLjNzO1xuICAgICAgICAgIHRyYW5zaXRpb24tZHVyYXRpb246IDAuM3M7XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4ub3V0bGluZS10b29sYmFyX19idXR0b24ge1xuICAtd2Via2l0LWJveC1zaGFkb3c6IDAgMCA2cHggMXB4ICNkY2RmZTY7XG4gICAgICAgICAgYm94LXNoYWRvdzogMCAwIDZweCAxcHggI2RjZGZlNjtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICB6LWluZGV4OiAxO1xuICBtYXJnaW46IDEwcHg7XG4gIHdpZHRoOiAzNnB4O1xuICBoZWlnaHQ6IDM2cHg7XG4gIGJvcmRlcjogMXB4IHNvbGlkICNkY2RmZTY7XG4gIGJvcmRlci1yYWRpdXM6IDNweDtcbiAgLXdlYmtpdC1ib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gIGJhY2tncm91bmQtY29sb3I6ICNmZmY7XG4gIGN1cnNvcjogcG9pbnRlcjtcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xuICBjb2xvcjogIzk5OTtcbiAgLXdlYmtpdC10cmFuc2l0aW9uOiBhbGwgMC4zcyAwLjFzIGVhc2UtaW4tb3V0O1xuICB0cmFuc2l0aW9uOiBhbGwgMC4zcyAwLjFzIGVhc2UtaW4tb3V0O1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLm91dGxpbmUtdG9vbGJhcl9fYnV0dG9uOmhvdmVyIHtcbiAgY29sb3I6ICMwNTg5NDI7XG4gIGJvcmRlci1jb2xvcjogIzA1ODk0MjtcbiAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlKDEuMzUpO1xuICAgICAgICAgIHRyYW5zZm9ybTogc2NhbGUoMS4zNSk7XG59XG4ub3V0bGluZS10b29sYmFyX19idXR0b24uaGlkZSB7XG4gIGRpc3BsYXk6IG5vbmU7XG59XG4ub3V0bGluZS10b29sYmFyX19hbmNob3I6bGluayxcbi5vdXRsaW5lLXRvb2xiYXJfX2FuY2hvcjp2aXNpdGVkLFxuLm91dGxpbmUtdG9vbGJhcl9fYW5jaG9yOmhvdmVyIHtcbiAgY29sb3I6ICM5OTk7XG4gIHRleHQtZGVjb3JhdGlvbjogbm9uZTtcbn1cbi5vdXRsaW5lLXRvb2xiYXJfX2FuY2hvcjpob3ZlciB7XG4gIGNvbG9yOiAjMDU4OTQyO1xufVxuLm91dGxpbmUtdG9vbGJhcl9faWNvbiB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgei1pbmRleDogMjtcbiAgdG9wOiA1MCU7XG4gIGxlZnQ6IDUwJTtcbiAgd2lkdGg6IDIwcHg7XG4gIGhlaWdodDogMjBweDtcbiAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCAtNTAlKTtcbiAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCAtNTAlKTtcbiAgZmlsbDogY3VycmVudGNvbG9yO1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLm91dGxpbmUtdG9vbGJhcl9hY3RpdmUub3V0bGluZS10b29sYmFyX19idXR0b24ge1xuICBjb2xvcjogI2ZmZjtcbiAgYmFja2dyb3VuZC1jb2xvcjogIzA1ODk0MjtcbiAgYm9yZGVyLWNvbG9yOiAjMDU4OTQyO1xufVxuLm91dGxpbmUtdG9vbGJhcl9hY3RpdmUub3V0bGluZS10b29sYmFyX19idXR0b246aG92ZXIge1xuICBjb2xvcjogI2ZmZjtcbn1cbi5vdXRsaW5lLXRvb2xiYXJfYWN0aXZlIC5vdXRsaW5lLXRvb2xiYXJfX2FuY2hvcjpsaW5rLFxuLm91dGxpbmUtdG9vbGJhcl9hY3RpdmUgLm91dGxpbmUtdG9vbGJhcl9fYW5jaG9yOnZpc2l0ZWQsXG4ub3V0bGluZS10b29sYmFyX2FjdGl2ZSAub3V0bGluZS10b29sYmFyX19hbmNob3I6aG92ZXIge1xuICBjb2xvcjogI2ZmZjtcbn1cbi5vdXRsaW5lLXRvb2xiYXJfcm91bmRlZC5vdXRsaW5lLXRvb2xiYXJfX2J1dHRvbiB7XG4gIGJvcmRlci1yYWRpdXM6IDE4cHg7XG59XG4ub3V0bGluZS10b29sYmFyX2Rpc2FibGVkLm91dGxpbmUtdG9vbGJhcl9fYW5jaG9yOmxpbmssXG4ub3V0bGluZS10b29sYmFyX2Rpc2FibGVkIC5vdXRsaW5lLXRvb2xiYXJfX2FuY2hvcjpsaW5rLFxuLm91dGxpbmUtdG9vbGJhcl9kaXNhYmxlZC5vdXRsaW5lLXRvb2xiYXJfX2FuY2hvcjp2aXNpdGVkLFxuLm91dGxpbmUtdG9vbGJhcl9kaXNhYmxlZCAub3V0bGluZS10b29sYmFyX19hbmNob3I6dmlzaXRlZCxcbi5vdXRsaW5lLXRvb2xiYXJfZGlzYWJsZWQub3V0bGluZS10b29sYmFyX19hbmNob3I6aG92ZXIsXG4ub3V0bGluZS10b29sYmFyX2Rpc2FibGVkIC5vdXRsaW5lLXRvb2xiYXJfX2FuY2hvcjpob3Zlcixcbi5vdXRsaW5lLXRvb2xiYXJfZGlzYWJsZWQub3V0bGluZS10b29sYmFyX19idXR0b24sXG4ub3V0bGluZS10b29sYmFyX2Rpc2FibGVkIC5vdXRsaW5lLXRvb2xiYXJfX2J1dHRvbiB7XG4gIGN1cnNvcjogbm90LWFsbG93ZWQ7XG4gIGNvbG9yOiAjOTk5O1xuICBib3JkZXItY29sb3I6ICM5OTk7XG59XG4ub3V0bGluZS10b29sYmFyX2Rpc2FibGVkLm91dGxpbmUtdG9vbGJhcl9fYW5jaG9yOmxpbms6aG92ZXIsXG4ub3V0bGluZS10b29sYmFyX2Rpc2FibGVkIC5vdXRsaW5lLXRvb2xiYXJfX2FuY2hvcjpsaW5rOmhvdmVyLFxuLm91dGxpbmUtdG9vbGJhcl9kaXNhYmxlZC5vdXRsaW5lLXRvb2xiYXJfX2FuY2hvcjp2aXNpdGVkOmhvdmVyLFxuLm91dGxpbmUtdG9vbGJhcl9kaXNhYmxlZCAub3V0bGluZS10b29sYmFyX19hbmNob3I6dmlzaXRlZDpob3Zlcixcbi5vdXRsaW5lLXRvb2xiYXJfZGlzYWJsZWQub3V0bGluZS10b29sYmFyX19hbmNob3I6aG92ZXI6aG92ZXIsXG4ub3V0bGluZS10b29sYmFyX2Rpc2FibGVkIC5vdXRsaW5lLXRvb2xiYXJfX2FuY2hvcjpob3Zlcjpob3Zlcixcbi5vdXRsaW5lLXRvb2xiYXJfZGlzYWJsZWQub3V0bGluZS10b29sYmFyX19idXR0b246aG92ZXIsXG4ub3V0bGluZS10b29sYmFyX2Rpc2FibGVkIC5vdXRsaW5lLXRvb2xiYXJfX2J1dHRvbjpob3ZlciB7XG4gIGNvbG9yOiAjOTk5O1xuICBib3JkZXItY29sb3I6ICM5OTk7XG59XG4ub3V0bGluZS10b29sYmFyX2Rpc2FibGVkLm91dGxpbmUtdG9vbGJhcl9fYnV0dG9uLFxuLm91dGxpbmUtdG9vbGJhcl9kaXNhYmxlZCAub3V0bGluZS10b29sYmFyX19idXR0b24ge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjVmNWY1O1xufVxuLm91dGxpbmUtdG9vbGJhcl90dGIsXG4ub3V0bGluZS10b29sYmFyX2J0dCB7XG4gIGxlZnQ6IDUwJTtcbiAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTUwJSk7XG4gICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC01MCUpO1xufVxuLm91dGxpbmUtdG9vbGJhcl90dGIgLm91dGxpbmUtdG9vbGJhcl9fYnV0dG9uLFxuLm91dGxpbmUtdG9vbGJhcl9idHQgLm91dGxpbmUtdG9vbGJhcl9fYnV0dG9uIHtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xufVxuLm91dGxpbmUtdG9vbGJhcl90dGIge1xuICB0b3A6IDEycHg7XG59XG4ub3V0bGluZS10b29sYmFyX3R0Yi5vdXRsaW5lLXRvb2xiYXJfaGlkZGVuIHtcbiAgdG9wOiAtNTZweDtcbn1cbi5vdXRsaW5lLXRvb2xiYXJfYnR0IHtcbiAgYm90dG9tOiAxMnB4O1xufVxuLm91dGxpbmUtdG9vbGJhcl9idHQub3V0bGluZS10b29sYmFyX2hpZGRlbiB7XG4gIGJvdHRvbTogLTU2cHg7XG59XG4ub3V0bGluZS10b29sYmFyX3J0bCxcbi5vdXRsaW5lLXRvb2xiYXJfbHRyIHtcbiAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTUwJSk7XG4gICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC01MCUpO1xuICB3aWR0aDogNTZweDtcbn1cbi5vdXRsaW5lLXRvb2xiYXJfcnRsIHtcbiAgdG9wOiA1MCU7XG4gIHJpZ2h0OiAxMnB4O1xufVxuLm91dGxpbmUtdG9vbGJhcl9ydGwub3V0bGluZS10b29sYmFyX2hpZGRlbiB7XG4gIHJpZ2h0OiAtODZweDtcbn1cbi5vdXRsaW5lLXRvb2xiYXJfbHRyIHtcbiAgdG9wOiA1MCU7XG4gIGxlZnQ6IDEycHg7XG59XG4ub3V0bGluZS10b29sYmFyX2x0ci5vdXRsaW5lLXRvb2xiYXJfaGlkZGVuIHtcbiAgbGVmdDogLTg2cHg7XG59XG4ub3V0bGluZS10b29sYmFyX3R0YiAub3V0bGluZS10b29sYmFyX19idXR0b24ub3V0bGluZS10b29sYmFyX2hpZGRlbixcbi5vdXRsaW5lLXRvb2xiYXJfcnRsIC5vdXRsaW5lLXRvb2xiYXJfX2J1dHRvbi5vdXRsaW5lLXRvb2xiYXJfaGlkZGVuLFxuLm91dGxpbmUtdG9vbGJhcl9idHQgLm91dGxpbmUtdG9vbGJhcl9fYnV0dG9uLm91dGxpbmUtdG9vbGJhcl9oaWRkZW4sXG4ub3V0bGluZS10b29sYmFyX2x0ciAub3V0bGluZS10b29sYmFyX19idXR0b24ub3V0bGluZS10b29sYmFyX2hpZGRlbiB7XG4gIGRpc3BsYXk6IG5vbmU7XG59XG5cbi8qIyBzb3VyY2VNYXBwaW5nVVJMPWRhdGE6YXBwbGljYXRpb24vanNvbjtjaGFyc2V0PXV0Zjg7YmFzZTY0LGV5SjJaWEp6YVc5dUlqb3pMQ0p6YjNWeVkyVnpJanBiSW5aaGNtbGhZbXhsY3k1c1pYTnpJaXdpTGk0dlBHbHVjSFYwSUdOemN5QTJQaUlzSW1samIyNXpMbXhsYzNNaUxDSnpZM0p2Ykd4aVlYSXViR1Z6Y3lJc0lpNHVMMkZ1WTJodmNuTXZZVzVqYUc5eWN5NXNaWE56SWl3aUxpNHZaSEpoZDJWeUwyUnlZWGRsY2k1c1pYTnpJaXdpYzJoaFpHOTNMbXhsYzNNaUxDSXVMaTl1WVhacFoyRjBiM0l2Ym1GMmFXZGhkRzl5TG14bGMzTWlMQ0psYkd4cGNITnBjeTVzWlhOeklpd2lMaTR2Y21WaFpHVnlMM0psWVdSbGNpNXNaWE56SWl3aWNtRmthWFZ6TG14bGMzTWlMQ0l1TGk5MGIyOXNZbUZ5TDNSdmIyeGlZWEl1YkdWemN5SmRMQ0p1WVcxbGN5STZXMTBzSW0xaGNIQnBibWR6SWpvaVFVRkJRVHRGUVVORExIVkNRVUZCTzBWQlEwUXNPRUpCUVVFN1JVRkJhVU1zWjBOQlFVRTdRME5GYUVNN1FVRkRSQ3h0UkVGQmJVUTdRVUZEYmtRN096czdPMGRCUzBjN1FVRkRTQ3d3UWtGQk1FSTdRVUZETVVJN096czdPMGRCUzBjN1FVRkRTQ3cwUWtGQk5FSTdRVUZETlVJc2EwUkJRV3RFTzBGRGJrSnNSRHRGUVVORkxHMUNRVUZCTzBWQlEwRXNWMEZCUVR0RlFVTkJMSE5DUVVGQk8wVkJRMEVzZFVKQlFVRTdSVUZEUVN4WFFVRkJPMFZCUTBFc1dVRkJRVHRGUVVOQkxHbENRVUZCTzBORWNVSkVPMEZEYmtKRE8wVkJRMFVzYlVKQlFVRTdSVUZEUVN4WFFVRkJPMFZCUTBFc1UwRkJRVHRGUVVOQkxGVkJRVUU3UlVGRFFTeFhRVUZCTzBWQlEwRXNXVUZCUVR0RlFVTkJMRzFDUVVGQk8wVkJRMEVzZVVOQlFVRTdWVUZCUVN4cFEwRkJRVHRGUVVOQkxHbENRVUZCTzBORWNVSklPMEZEYkVKRE8wVkJRMFVzWTBGQlFUdERSRzlDU0R0QlFVTkVMREpDUVVFeVFqdEJSVE5ETTBJN1JVRkRSU3hYUVVGQk8wVkJRMEVzV1VGQlFUdEZRVU5CTERKQ1FVRkJPME5HTmtORU8wRkZNME5ETzBWQlEwVXNNa0pCUVVFN1EwWTJRMGc3UVVWNlEwYzdSVUZEUlN4elEwRkJRVHRGUVVOQkxESkNRVUZCTzBOR01rTk1PMEZGZUVOSE8wVkJRMFVzYzBOQlFVRTdSVUZEUVN3eVFrRkJRVHREUmpCRFREdEJSWFpEUnp0RlFVTkZMSE5EUVVGQk8wTkdlVU5NTzBGRmNrTkRPMFZCUTBVc2MwTkJRVUU3UTBaMVEwZzdRVWRvUlVRN1JVRkRSU3h0UWtGQlFUdEZRVU5CTEZkQlFVRTdSVUZEUVN4cFFrRkJRVHREU0d0RlJEdEJSMmhGUXp0RlFVTkZMR05CUVVFN1EwaHJSVWc3UVVkb1JVYzdPenRGUVVkRkxGbEJRVUU3UlVGRFFTeHpRa0ZCUVR0RFNHdEZURHRCUnk5RVJ6dEZRVU5GTEdWQlFVRTdRMGhwUlV3N1FVYzNSRU03UlVGRlNTeHpRa0ZCUVR0RFNEaEVURHRCUjNwRVJ6dEZRVU5GTEd0Q1FVRkJPME5JTWtSTU8wRkhOMFJETzBWQlRVa3NiVUpCUVVFN1JVRkRRU3hYUVVGQk8wVkJRMEVzVTBGQlFUdEZRVU5CTEc5RFFVRkJPMVZCUVVFc05FSkJRVUU3UlVGRFFTeFhRVUZCTzBOSU1FUk1PMEZKTlVaRU8wVkJRMFVzYlVKQlFVRTdSVUZEUVN4WlFVRkJPMFZCUTBFc1QwRkJRVHRGUVVOQkxGRkJRVUU3UlVGRFFTeFZRVUZCTzBWQlEwRXNXVUZCUVR0RlFVTkJMR0ZCUVVFN1JVRkRRU3dyUWtGQlFUdFZRVUZCTEhWQ1FVRkJPMFZCUTBFc2JVSkJRVUU3UlVGRFFTeHBRa0ZCUVR0RFNqaEdSRHRCU1RWR1F6dEZRMUJ6UkN4M1EwRkJRVHRWUVVGQkxHZERRVUZCTzBWRVUzQkVMSEZDUVVGQk8wVkJRVUVzY1VKQlFVRTdSVUZCUVN4alFVRkJPMFZCUTBFc05rSkJRVUU3UlVGQlFTdzRRa0ZCUVR0TlFVRkJMREpDUVVGQk8xVkJRVUVzZFVKQlFVRTdSVUZEUVN4elFrRkJRVHROUVVGQkxHdENRVUZCTzBWQlEwRXNiVUpCUVVFN1JVRkRRU3haUVVGQk8wVkJRMEVzWVVGQlFUdEZRVU5CTEhWQ1FVRkJPMFZCUTBFc2EwTkJRVUU3VlVGQlFTd3dRa0ZCUVR0RlFVTkJMR2xDUVVGQk8wTktPRVpJTzBGSk0wWkRPenM3UlVGSFJTeFpRVUZCTzBWQlEwRXNLMEpCUVVFN1ZVRkJRU3gxUWtGQlFUdERTalpHU0R0QlNURkdRenM3UlVGRlJTeHhRa0ZCUVR0TlFVRkJMR1ZCUVVFN1EwbzBSa2c3UVVsNlJrTTdPenRGUVVkRkxHZENRVUZCTzBOS01rWklPMEZKZUVaRE96dEZRVVZGTEcxQ1FVRkJPMFZCUTBFc1YwRkJRVHRGUVVOQkxHVkJRVUU3UlVGRFFTeGhRVUZCTzBWQlEwRXNhMEpCUVVFN1JVRkRRU3hwUWtGQlFUdERTakJHU0R0QlNYWkdRenRGUVVORkxHZENRVUZCTzBWQlEwRXNhVUpCUVVFN1JVRkRRU3hsUVVGQk8wVkJRMEVzSzBKQlFVRTdWVUZCUVN4MVFrRkJRVHRGUVVOQkxHbERRVUZCTzBOS2VVWklPMEZKZEVaRE8wVkJRMFVzYlVKQlFVRTdSVUZEUVN4WFFVRkJPMFZCUTBFc1UwRkJRVHRGUVVOQkxGbEJRVUU3UlVGRFFTeFpRVUZCTzBWQlEwRXNZVUZCUVR0RlFVTkJMR3RDUVVGQk8wVkJRMEVzV1VGQlFUdEZRVU5CTEdkQ1FVRkJPMFZCUTBFc2JVSkJRVUU3UlVGRFFTeG5Ra0ZCUVR0RlFVTkJMRzlEUVVGQk8xVkJRVUVzTkVKQlFVRTdSVUZEUVN4cFFrRkJRVHREU25kR1NEdEJTWEpIUXp0RlFXZENTU3h0UWtGQlFUdEZRVU5CTEZkQlFVRTdSVUZEUVN4UFFVRkJPMFZCUTBFc1VVRkJRVHREU25kR1REdEJTWEpHUnp0RlFVTkZMRmxCUVVFN1EwcDFSa3c3UVVsdVJrTTdSVUZEUlN4dlFrRkJRVHROUVVGQkxGbEJRVUU3VlVGQlFTeFJRVUZCTzBWQlEwRXNaVUZCUVR0RFNuRkdTRHRCU1c1R1J6dEZRVU5GTEdsQ1FVRkJPME5LY1VaTU8wRkpha1pETzBWQlEwVXNaVUZCUVR0RlFVTkJMR3RDUVVGQk8wVkJRMEVzYVVKQlFVRTdRMHB0UmtnN1FVbG9Sa003UlVGRFJTeFpRVUZCTzBWQlEwRXNiVUpCUVVFN1JVRkRRU3hYUVVGQk8wVkJRMEVzVDBGQlFUdEZRVU5CTEZGQlFVRTdSVUZEUVN4WlFVRkJPMFZCUTBFc1lVRkJRVHRGUVVOQkxIVkNRVUZCTzBWQlEwRXNZVUZCUVR0RlFVTkJMR2xDUVVGQk8wTkthMFpJTzBGSk5VVkxPenRGUVVORkxHRkJRVUU3UTBvclJWQTdRVWsxUlVzN08wVkJRMFVzWVVGQlFUdERTaXRGVUR0QlNUVkZTenM3UlVGRFJTeGhRVUZCTzBOS0swVlFPMEZKTlVWTE96dEZRVU5GTEdGQlFVRTdRMG9yUlZBN1FVazFSVXM3TzBWQlEwVXNZVUZCUVR0RFNpdEZVRHRCU1RWRlN6czdSVUZEUlN4aFFVRkJPME5LSzBWUU8wRkpNVVZETzBWQlEwVXNLMEpCUVVFN1EwbzBSVWc3UVVsNFJVODdSVUZEUlN4alFVRkJPME5LTUVWVU8wRkpja1ZQTzBWQlEwVXNZMEZCUVR0RFNuVkZWRHRCU1d4RlR6dEZRVU5GTEdOQlFVRTdRMHB2UlZRN1FVa3ZSRTg3UlVGRFJTeGpRVUZCTzBOS2FVVlVPMEZKTlVSUE8wVkJRMFVzWTBGQlFUdERTamhFVkR0QlNYcEVUenRGUVVORkxHTkJRVUU3UTBveVJGUTdRVWx5UkVNN1JVRkRSU3huUTBGQlFUdERTblZFU0R0QlNXNUVUenRGUVVORkxHRkJRVUU3UTBweFJGUTdRVWxvUkU4N1JVRkRSU3hoUVVGQk8wTkthMFJVTzBGSk4wTlBPMFZCUTBVc1lVRkJRVHREU2l0RFZEdEJTVEZEVHp0RlFVTkZMR0ZCUVVFN1EwbzBRMVE3UVVsMlEwODdSVUZEUlN4aFFVRkJPME5LZVVOVU8wRkpjRU5QTzBWQlEwVXNZVUZCUVR0RFNuTkRWRHRCU1doRFF6czdSVUZGUlN4UlFVRkJPMFZCUTBFc1dVRkJRVHREU210RFNEdEJTUzlDU3pzN1JVRkRSU3hqUVVGQk8wTkthME5RTzBGSkwwSkxPenRGUVVORkxHTkJRVUU3UTBwclExQTdRVWt2UWtzN08wVkJRMFVzWTBGQlFUdERTbXREVUR0QlNTOUNTenM3UlVGRFJTeGpRVUZCTzBOS2EwTlFPMEZKTDBKTE96dEZRVU5GTEdOQlFVRTdRMHByUTFBN1FVa3ZRa3M3TzBWQlEwVXNZMEZCUVR0RFNtdERVRHRCU1RkQ1F6dEZRVU5GTEdsRFFVRkJPME5LSzBKSU8wRkpNMEpQTzBWQlEwVXNXVUZCUVR0RFNqWkNWRHRCU1hoQ1R6dEZRVU5GTEZsQlFVRTdRMG93UWxRN1FVbHlRazg3UlVGRFJTeFpRVUZCTzBOS2RVSlVPMEZKYkVKUE8wVkJRMFVzV1VGQlFUdERTbTlDVkR0QlNXWlBPMFZCUTBVc1dVRkJRVHREU21sQ1ZEdEJTVnBQTzBWQlEwVXNXVUZCUVR0RFNtTlVPMEZKVWtNN1JVRkRSU3hoUVVGQk8wVkJRMEVzT0VKQlFVRTdRMHBWU0R0QlNVNVBPMFZCUTBVc1pVRkJRVHREU2xGVU8wRkpTRTg3UlVGRFJTeGxRVUZCTzBOS1MxUTdRVWxCVHp0RlFVTkZMR1ZCUVVFN1EwcEZWRHRCU1VkUE8wVkJRMFVzWlVGQlFUdERTa1JVTzBGSlRVODdSVUZEUlN4bFFVRkJPME5LU2xRN1FVbFRUenRGUVVORkxHVkJRVUU3UTBwUVZEdEJTV0ZETzBWQlEwVXNiMEpCUVVFN1JVRkRRU3dyUWtGQlFUdERTbGhJTzBGSllVYzdSVUZEUlN4blFrRkJRVHREU2xoTU8wRkpZVXM3UlVGRFJTeFRRVUZCTzBOS1dGQTdRVWxqU3p0RlFVTkZMRkZCUVVFN1EwcGFVRHRCU1dWTE8wVkJRMFVzVDBGQlFUdERTbUpRTzBGSlowSkxPMFZCUTBVc1ZVRkJRVHREU21SUU8wRkpjVUpMT3p0RlFVVkZMSGxDUVVGQk8wVkJRMEVzVTBGQlFUdEZRVU5CTEc5RFFVRkJPMVZCUVVFc05FSkJRVUU3UTBwdVFsQTdRVWx6UWtzN08wVkJSVVVzZDBKQlFVRTdSVUZEUVN4VlFVRkJPMFZCUTBFc2IwTkJRVUU3VlVGQlFTdzBRa0ZCUVR0RFNuQkNVRHRCU1hsQ1V6dEZRVU5GTEZkQlFVRTdRMHAyUWxnN1FVa3dRbE03UlVGRFJTeFZRVUZCTzBOS2VFSllPMEZKTWtKVE8wVkJRMFVzVTBGQlFUdERTbnBDV0R0QlNUUkNVenRGUVVORkxGbEJRVUU3UTBveFFsZzdRVWx0UTBzN08wVkJSVVVzWVVGQlFUdEZRVU5CTERaQ1FVRkJPME5LYWtOUU8wRkpjME5ETzBWQlEwVXNWMEZCUVR0RFNuQkRTRHRCVFdoWlJEdEZRVU5GTEcxQ1FVRkJPMFZCUTBFc1YwRkJRVHRGUVVOQkxGVkJRVUU3UlVGRFFTeHpRMEZCUVR0RlFVTkJMR1ZCUVVFN1EwNXJXVVE3UVUxb1dVTTdSVUZEUlN4eFEwRkJRVHRGUVVGQkxEWkNRVUZCTzBOT2ExbElPMEZOTDFoRE8wVkJRMFVzWlVGQlFUdEZRVU5CTEdGQlFVRTdSVUZEUVN4clFrRkJRVHRGUVVOQkxHZENRVUZCTzBWQlEwRXNhVU5CUVVFN1JVRkRRU3huUWtGQlFUdEZRVU5CTEdsQ1FVRkJPMFZCUTBFc2FVSkJRVUU3UTA1cFdVZzdRVTA1V0VNN1JVRkRSU3h0UWtGQlFUdEZRVU5CTEZkQlFVRTdSVUZEUVN4VlFVRkJPMFZCUTBFc2FVSkJRVUU3UTA1bldVZzdRVTAzV0VNN096dEZRVWRGTEcxQ1FVRkJPMFZCUTBFc1YwRkJRVHRGUVVOQkxGVkJRVUU3UlVGRFFTeFhRVUZCTzBWQlEwRXNjMEpCUVVFN1JVRkRRU3hwUWtGQlFUdERUaXRZU0R0QlRUVllRenRGUVVORkxHbENRVUZCTzBOT09GaElPMEZOTTFoRE8wVkJRMFVzYTBKQlFVRTdRMDQyV0VnN1FVMHhXRU03UlVGRFJTeFZRVUZCTzBWQlEwRXNhMEpCUVVFN1JVRkRRU3huUWtGQlFUdEZRVU5CTEdsQ1FVRkJPME5PTkZoSU8wRk5lbGhETzBWQlEwVXNiVUpCUVVFN1JVRkRRU3hYUVVGQk8wVkJRMEVzVDBGQlFUdEZRVU5CTEZGQlFVRTdSVUZEUVN4WlFVRkJPMFZCUTBFc1lVRkJRVHRGUVVOQkxEQkNRVUZCTzBWQlEwRXNLMEpCUVVFN1JVRkRRU3hyUTBGQlFUdFZRVUZCTERCQ1FVRkJPMFZCUTBFc0swSkJRVUU3VlVGQlFTeDFRa0ZCUVR0RlFVTkJMR2xDUVVGQk8wTk9NbGhJTzBGTmVGaERPMFZEYWtVMlFpeHZRa0ZCUVR0RlFVTm1MSGRDUVVGQk8wVkJRMGNzYVVKQlFVRTdSVVJwUldZc1pVRkJRVHRGUVVOQkxHbENRVUZCTzBOT05GaElPMEZOTVZoSE96czdSVUZIUlN4elFrRkJRVHRGUVVOQkxGbEJRVUU3UTA0MFdFdzdRVTE2V0VjN1JVRkRSU3hsUVVGQk8wTk9NbGhNTzBGTmRsaERPMFZCUTBVc2NVSkJRVUU3UTA1NVdFZzdRVTF3V0VzN096dEZRVWRGTEdWQlFVRTdSVUZEUVN4clFrRkJRVHREVG5OWVVEdEJUV3BZUXpzN1JVRkZSU3h4UWtGQlFUdEZRVUZCTEhGQ1FVRkJPMFZCUVVFc1kwRkJRVHRGUVVOQkxITkNRVUZCTzAxQlFVRXNhMEpCUVVFN1JVRkRRU3cyUWtGQlFUdEZRVUZCTERoQ1FVRkJPMDFCUVVFc01rSkJRVUU3VlVGQlFTeDFRa0ZCUVR0RlFVTkJMQ3RDUVVGQk8wVkJRMEVzVDBGQlFUdEZRVU5CTEdsQ1FVRkJPME5PYlZoSU8wRk5hRmhMT3pzN08wVkJSVVVzSzBKQlFVRTdWVUZCUVN4MVFrRkJRVHREVG05WVVEdEJUV3BZU3pzN1JVRkRSU3h4UWtGQlFUdE5RVUZCTEdWQlFVRTdRMDV2V0ZBN1FVMXFXRXM3TzBWQlEwVXNiMEpCUVVFN1RVRkJRU3haUVVGQk8xVkJRVUVzVVVGQlFUdEZRVU5CTEdWQlFVRTdRMDV2V0ZBN1FVMHZWME03UlVGRFJTeHBRa0ZCUVR0RlFVTkJMSGxEUVVGQk8wTk9hVmhJTzBGTk9WZERPMFZCUTBVc1owSkJRVUU3UlVGRFFTeHBRa0ZCUVR0RFRtZFlTRHRCVFRkWFF6dEZRVU5GTEdOQlFVRTdRMDRyVjBnN1FVMDFWME03UlVGRFJTeFRRVUZCTzBWQlEwRXNhVUpCUVVFN1EwNDRWMGc3UVVGRFJEczdPenM3UjBGTFJ6dEJRVU5JTEhOQ1FVRnpRanRCUVVOMFFpeHpRa0ZCYzBJN1FVRkRkRUlzYzBKQlFYTkNPMEZCUTNSQ096czdPenRIUVV0SE8wRkJRMGc3T3pzN08wZEJTMGM3UVVGRFNDdzBRa0ZCTkVJN1FWRnNhRUl4UWp0RlFVTkZMR2RDUVVGQk8wVkJRMEVzVDBGQlFUdEZRVU5CTEZGQlFVRTdSVUZEUVN4WFFVRkJPMFZCUTBFc1dVRkJRVHRGUVVOQkxGbEJRVUU3UlVGRFFTd3dRa0ZCUVR0RlFVTkJMRmRCUVVFN1JVRkRRU3dyUWtGQlFUdFZRVUZCTEhWQ1FVRkJPMFZCUTBFc2EwUkJRVUU3VlVGQlFTd3dRMEZCUVR0RlFVTkJMSFZEUVVGQk8wTlNiMmhDU0R0QlVXcG9Ra003UlVoV2MwUXNjVU5CUVVFN1ZVRkJRU3cyUWtGQlFUdEZSMWx3UkN4cFFrRkJRVHRGUVVOQkxHdENRVUZCTzBWQlEwRXNaVUZCUVR0RlFVTkJMQ3RDUVVGQk8xVkJRVUVzZFVKQlFVRTdSVUZEUVN4MVFrRkJRVHRGUVVOQkxHbENRVUZCTzBOU2JXaENTRHRCVVdob1FrTTdSVUZEUlN4cFFrRkJRVHRGUVVOQkxHMUNRVUZCTzBWQlEwRXNNazVCUVVFN1JVRkRRU3h2UWtGQlFUdEZRVU5CTEcxQ1FVRkJPMFZCUTBFc2FVSkJRVUU3UlVGRFFTeHBRa0ZCUVR0RFVtdG9Ra2c3UVZFdlowSkRPMFZCUlVrc1kwRkJRVHREVW1kb1FrdzdRVkUxWjBKRE8wVkJRMFVzWTBGQlFUdERVamhuUWtnN1FWRTFaMEpITzBWQlEwVXNlVUpCUVVFN1ExSTRaMEpNTzBGUk0yZENUenRGUVVORkxHTkJRVUU3UTFJMlowSlVPMEZSZG1kQ1F6dEZRVU5GTEdWQlFVRTdSVUZEUVN4blFrRkJRVHRGUVVOQkxGZEJRVUU3UlVGRFFTeFBRVUZCTzBWQlEwRXNVVUZCUVR0RlFVTkJMRmxCUVVFN1JVRkRRU3hoUVVGQk8wVkJRMEVzVlVGQlFUdEZRVU5CTEN0Q1FVRkJPMVZCUVVFc2RVSkJRVUU3UlVGRFFTeHBRa0ZCUVR0RlFVTkJMREJDUVVGQk8wVkJRMEVzZVVOQlFVRTdSVUZEUVN4cFFrRkJRVHREVW5sblFrZzdRVkZ5WjBKRU8wVkJRMFU3U1VGRFJTeFhRVUZCTzBkU2RXZENSRHREUVVOR08wRlJNV2RDUkR0RlFVTkZPMGxCUTBVc1YwRkJRVHRIVW5WblFrUTdRMEZEUmp0QlVYQm5Ra1E3UlVGRlNUdEpRVU5GTEdsQ1FVRkJPMGRTY1dkQ1NEdEZVWFJuUWtNN1NVRkpTU3h4UWtGQlFUdEpRVUZCTEhGQ1FVRkJPMGxCUVVFc1kwRkJRVHRKUVVOQkxDdENRVUZCTzBsQlFVRXNPRUpCUVVFN1VVRkJRU3gzUWtGQlFUdFpRVUZCTEc5Q1FVRkJPMGxCUTBFc2MwSkJRVUU3VVVGQlFTeHJRa0ZCUVR0SlFVTkJMREJDUVVGQk8xRkJRVUVzZFVKQlFVRTdXVUZCUVN4dlFrRkJRVHRKUVVOQkxEQkNRVUZCTzFGQlFVRXNhVUpCUVVFN1NVRkRRU3hWUVVGQk8wbEJRMEVzVTBGQlFUdEpRVU5CTEhGRFFVRkJPMWxCUVVFc05rSkJRVUU3U1VGRFFTeFpRVUZCTzBsQlEwRXNZVUZCUVR0SlFVTkJMQ3RDUVVGQk8xbEJRVUVzZFVKQlFVRTdTVUZEUVN3eVFrRkJRVHRKUVVOQkxIVkNRVUZCTzBsQlEwRXNaMEpCUVVFN1IxSnhaMEpNTzBWUmJtZENTenRKUXpsR1RpeHBRa0ZCUVR0SlJHZEhVU3h2UWtGQlFUdFJRVUZCTEZsQlFVRTdXVUZCUVN4UlFVRkJPMGxCUTBFc1lVRkJRVHRKUVVOQkxIbENRVUZCTzFsQlFVRXNhVUpCUVVFN1IxSnhaMEpRTzBWUmFtZENSenRKUVVORkxGZEJRVUU3U1VGRFFTeDFRa0ZCUVR0SlFVTkJMQ3RDUVVGQk8xbEJRVUVzZFVKQlFVRTdSMUp0WjBKTU8wVlJhR2RDUnp0SlFVTkZMRzFDUVVGQk8wbEJRMEVzVjBGQlFUdEpRVU5CTEZWQlFVRTdTVUZEUVN4WFFVRkJPMGxCUTBFc1lVRkJRVHRKUVVOQkxIbENRVUZCTzFsQlFVRXNhVUpCUVVFN1NVRkRRU3hwUWtGQlFUdEhVbXRuUWt3N1JWRXZaa2M3U1VSMlNIbENMRzlDUVVGQk8wbEJRMllzZDBKQlFVRTdTVU4zU0ZJc2JVSkJRVUU3U1VGRFFTeFhRVUZCTzBsQlEwRXNUMEZCUVR0SlFVTkJMRkZCUVVFN1NVRkRRU3hWUVVGQk8wbEJRMEVzV1VGQlFUdEpRVU5CTEdGQlFVRTdTVUZEUVN4clFrRkJRVHRKUVVOQkxEaENRVUZCTzBsQlEwRXNhVUpCUVVFN1NVRkRRU3hwUWtGQlFUdEpRVU5CTEhWQ1FVRkJPMGxCUTBFc2FVSkJRVUU3UjFKclowSk1PMFZSTDJaSE8wbEJRMFVzWlVGQlFUdEpRVU5CTERCQ1FVRkJPMGxCUTBFc2EwSkJRVUU3U1VGRFFTd3JRMEZCUVR0SlFVTkJMRzFDUVVGQk8wbEJRMEVzYlVKQlFVRTdSMUpwWjBKTU8wVlJkbWRDUnp0SlFWTkpMRmRCUVVFN1NVRkRRU3hyUkVGQlFUdFpRVUZCTERCRFFVRkJPMGxCUTBFc05rTkJRVUU3U1VGRFFTeGxRVUZCTzBkU2FXZENVRHREUVVOR08wRlJNMlpFTzBWQlEwVTdPMGxTT0daRkxHVkJRV1U3U1ZFelptWXNaMEpCUVVFN1NWSTJaa0VzYlVKQlFXMUNPMGxSTTJadVFpeDFRa0ZCUVR0SlFVTkJMRmxCUVVFN1NVRkRRU3d5UWtGQlFUdEhValptUkR0RlFVTkVMRmxCUVZrN1JWRXhabG83T3p0SlFVZEZMSE5EUVVGQk8wbEJRMEVzWlVGQlFUdEhValJtUkR0RlFVTkVMRmxCUVZrN1JWRjZabG83TzBsQlJVVXNlVUpCUVVFN1IxSXlaa1E3UlVGRFJDeDNRa0ZCZDBJN1JWRjRabmhDTzBsQlEwVXNXVUZCUVR0SlFVTkJMREJDUVVGQk8wZFNNR1pFTzBWUmVHWkVPenRKUVVWRkxEQkNRVUZCTzBsQlEwRXNhMEpCUVVFN1IxSXdaa1E3UlZGMFprTTdPMGxTZVdaQkxHdENRVUZyUWp0SlVYUm1hRUlzZVVKQlFVRTdSMUozWmtnN1JWRnlaa003U1VGRFJTd3dRa0ZCUVR0SlFVTkJMR2xDUVVGQk8wbFNkV1pHTEdGQlFXRTdTVUZEWWl4aFFVRmhPMGxCUTJJc2QwSkJRWGRDTzBsQlEzaENMRFJDUVVFMFFqdEhRVU0zUWp0RlVYcG1SenRKUVVORkxHbERRVUZCTzBsQlEwRXNPRUpCUVVFN1NVRkRRU3d5UWtGQlFUdEhVakptVER0RlVYWm1SenRKUVVORkxEaENRVUZCTzBsQlEwRXNkMEpCUVVFN1NVRkRRU3h6UWtGQlFUdEpRVU5CTEhWQ1FVRkJPMGxCUTBFc05FSkJRVUU3UjFKNVprdzdSVkZ5WmtjN1NVRkRSU3g1UWtGQlFUdEhVblZtVER0RlVXNW1SenRKUVVORkxIbENRVUZCTzFsQlFVRXNhVUpCUVVFN1IxSnhaa3c3UlZFdlowSkRPMGxCT0VKSkxIZENRVUZCTzBsQlEwRXNhME5CUVVFN1NVRkRRU3c0UWtGQlFUdEhVbTltVER0RlVYQm9Ra003TzBsQmNVTkpMR3REUVVGQk8wZFNiV1pNTzBWUmVHaENRenM3TzBsQk1rTkpMRzFEUVVGQk8wOUJRVUVzWjBOQlFVRTdXVUZCUVN4dlFrRkJRVHRIVW10bVREdEZVVGxsUnp0SlFVTkZMSGxDUVVGQk8wZFNaMlpNTzBOQlEwWTdRVlUxZFVKRU8wVkJRMFVzWjBKQlFVRTdSVUZEUVN4bFFVRkJPMFZCUTBFc1ZVRkJRVHRGUVVOQkxHdERRVUZCTzFWQlFVRXNNRUpCUVVFN1JVRkRRU3hwUWtGQlFUdERWamgxUWtRN1FWVTFkVUpETzBWTVJITkVMSGREUVVGQk8xVkJRVUVzWjBOQlFVRTdSVXRIY0VRc2JVSkJRVUU3UlVGRFFTeFhRVUZCTzBWQlEwRXNZVUZCUVR0RlFVTkJMRmxCUVVFN1JVRkRRU3hoUVVGQk8wVkJRMEVzTUVKQlFVRTdSVUZEUVN4dFFrRkJRVHRGUVVOQkxDdENRVUZCTzFWQlFVRXNkVUpCUVVFN1JVRkRRU3gxUWtGQlFUdEZRVU5CTEdkQ1FVRkJPMFZCUTBFc2JVSkJRVUU3UlVGRFFTeFpRVUZCTzBWQlEwRXNPRU5CUVVFN1JVRkJRU3h6UTBGQlFUdEZRVU5CTEdsQ1FVRkJPME5XT0hWQ1NEdEJWVFYxUWtjN1JVRkRSU3hsUVVGQk8wVkJRMEVzYzBKQlFVRTdSVUZEUVN3clFrRkJRVHRWUVVGQkxIVkNRVUZCTzBOV09IVkNURHRCVlROMVFrYzdSVUZEUlN4alFVRkJPME5XTm5WQ1REdEJWWGgxUWtjN096dEZRVWRGTEZsQlFVRTdSVUZEUVN4elFrRkJRVHREVmpCMVFrdzdRVlYyZFVKSE8wVkJRMFVzWlVGQlFUdERWbmwxUWt3N1FWVnlkVUpETzBWQlEwVXNiVUpCUVVFN1JVRkRRU3hYUVVGQk8wVkJRMEVzVTBGQlFUdEZRVU5CTEZWQlFVRTdSVUZEUVN4WlFVRkJPMFZCUTBFc1lVRkJRVHRGUVVOQkxIbERRVUZCTzFWQlFVRXNhVU5CUVVFN1JVRkRRU3h0UWtGQlFUdEZRVU5CTEdsQ1FVRkJPME5XZFhWQ1NEdEJWV3gxUWtzN1JVRkRSU3haUVVGQk8wVkJRMEVzTUVKQlFVRTdSVUZEUVN4elFrRkJRVHREVm05MVFsQTdRVlZzZFVKUE8wVkJRMFVzV1VGQlFUdERWbTkxUWxRN1FWVTVkRUpMT3pzN1JVRkhSU3haUVVGQk8wTldaM1ZDVUR0QlZURjBRa2M3UlVGRFJTeHZRa0ZCUVR0RFZqUjBRa3c3UVZWeWRFSkxPenM3T3pzN096dEZRVWxGTEc5Q1FVRkJPMFZCUTBFc1dVRkJRVHRGUVVOQkxHMUNRVUZCTzBOV01uUkNVRHRCVlhwMFFrODdPenM3T3pzN08wVkJRMFVzV1VGQlFUdEZRVU5CTEcxQ1FVRkJPME5XYTNWQ1ZEdEJWVGwwUWtzN08wVkJRMFVzTUVKQlFVRTdRMVpwZFVKUU8wRlZOWFJDUXpzN1JVRkZSU3hWUVVGQk8wVkJRMEVzYjBOQlFVRTdWVUZCUVN3MFFrRkJRVHREVmpoMFFrZzdRVlZxZFVKRE96dEZRVTFKTEhOQ1FVRkJPME5XSzNSQ1REdEJWVE4wUWtNN1JVRkRSU3hWUVVGQk8wTldOblJDU0R0QlZUTjBRa2M3UlVGRFJTeFhRVUZCTzBOV05uUkNURHRCVlhwMFFrTTdSVUZEUlN4aFFVRkJPME5XTW5SQ1NEdEJWWHAwUWtjN1JVRkRSU3hqUVVGQk8wTldNblJDVER0QlZYWjBRa003TzBWQlJVVXNiME5CUVVFN1ZVRkJRU3cwUWtGQlFUdEZRVU5CTEZsQlFVRTdRMVo1ZEVKSU8wRlZkSFJDUXp0RlFVTkZMRk5CUVVFN1JVRkRRU3haUVVGQk8wTldkM1JDU0R0QlZYUjBRa2M3UlVGRFJTeGhRVUZCTzBOV2QzUkNURHRCVlhCMFFrTTdSVUZEUlN4VFFVRkJPMFZCUTBFc1YwRkJRVHREVm5OMFFrZzdRVlZ3ZEVKSE8wVkJRMFVzV1VGQlFUdERWbk4wUWt3N1FWVTNjMEpMT3pzN08wVkJRMFVzWTBGQlFUdERWbXQwUWxBaUxDSm1hV3hsSWpvaWIzVjBiR2x1WlM1amMzTWlMQ0p6YjNWeVkyVnpRMjl1ZEdWdWRDSTZXeUk2Y205dmRDQjdYSEpjYmlBZ0xTMXZkWFJzYVc1bExYcEpibVJsZURvZ01qQXdNRHRjY2x4dUlDQXRMVzkxZEd4cGJtVXRjM1JwWTJ0NUxXaGxhV2RvZERvZ01UQXdKVHRjY2x4dUlDQXRMVzkxZEd4cGJtVXRibUYyYVdkaGRHOXlMWGRwWkhSb09pQXhNREFsTzF4eVhHNTlYSEpjYmlJc0lqcHliMjkwSUh0Y2JpQWdMUzF2ZFhSc2FXNWxMWHBKYm1SbGVEb2dNakF3TUR0Y2JpQWdMUzF2ZFhSc2FXNWxMWE4wYVdOcmVTMW9aV2xuYUhRNklERXdNQ1U3WEc0Z0lDMHRiM1YwYkdsdVpTMXVZWFpwWjJGMGIzSXRkMmxrZEdnNklERXdNQ1U3WEc1OVhHNHZLaUE5UFQwOVBUMDlQVDA5SUdOdmJHOXljeTUwYUdWdFpTQXRJT1dmdXVlaGdPbWluT2lKc3VXUG1PbUhqK21iaHVXUWlDQTlQVDA5UFQwOVBUMDlJQ292WEc0dktpcGNiaUFxSUdWc2JHbHdjMmx6TG14bGMzTWdMU0RtbG9mbW5Lem5uSUhubGFVZ2JXbDRhVzU0SU9XSHZlYVZzRnh1SUNvZ1BUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFZ4dUlDb2dRM0psWVhSbFpDQkNlVG9nV1dGdmFHRnBlR2xoYjF4dUlDb2dWWEJrWVhSbE9pQXlNREl5TGpNdU1URmNiaUFxTDF4dUx5b2dQVDA5UFQwOUlPYVdoK2Fjck9lY2dlZVZwZVdIdmVhVnNDQTlQVDA5UFQwZ0tpOWNiaThxS2x4dUlDb2djMmhoWkc5M0xteGxjM01nTFNEcG1MVGx2Ykhtb0xmbHZJL29ycjdudmE0Z2JXbDRhVzU0SU9XSHZlYVZzRnh1SUNvZ1BUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFZ4dUlDb2dRM0psWVhSbFpDQkNlVG9nV1dGdmFHRnBlR2xoYjF4dUlDb2dWWEJrWVhSbE9pQXlNREl5TGpNdU1qQmNiaUFxTDF4dUx5b2dQVDA5UFQwOUlPbVl0T1c5c2VhZ3QrVzhqK2l1dnVlOXJ1V0h2ZWFWc0NBOVBUMDlQVDBnS2k5Y2JpOHFJRDA5UFQwOVBUMDlQVDBnYVdOdmJpNTBhR1Z0WlNBdElITjJaeURsbTc3bW9JZm5tb1Rtb0xmbHZJOGdQVDA5UFQwOVBUMDlQU0FxTDF4dUxtOTFkR3hwYm1VdGFXTnZiaUI3WEc0Z0lIQnZjMmwwYVc5dU9pQnlaV3hoZEdsMlpUdGNiaUFnZWkxcGJtUmxlRG9nTVR0Y2JpQWdaR2x6Y0d4aGVUb2dhVzVzYVc1bExXSnNiMk5yTzF4dUlDQjJaWEowYVdOaGJDMWhiR2xuYmpvZ2JXbGtaR3hsTzF4dUlDQjNhV1IwYURvZ01XVnRPMXh1SUNCb1pXbG5hSFE2SURGbGJUdGNiaUFnYjNabGNtWnNiM2M2SUdocFpHUmxianRjYm4xY2JpNXZkWFJzYVc1bExXbGpiMjVmWDNOMlp5QjdYRzRnSUhCdmMybDBhVzl1T2lCaFluTnZiSFYwWlR0Y2JpQWdlaTFwYm1SbGVEb2dNanRjYmlBZ2RHOXdPaUExTUNVN1hHNGdJR3hsWm5RNklEVXdKVHRjYmlBZ2QybGtkR2c2SURGbGJUdGNiaUFnYUdWcFoyaDBPaUF4WlcwN1hHNGdJR1pwYkd3NklHTjFjbkpsYm5SamIyeHZjanRjYmlBZ2RISmhibk5tYjNKdE9pQjBjbUZ1YzJ4aGRHVW9MVFV3SlN3Z0xUVXdKU2s3WEc0Z0lHOTJaWEptYkc5M09pQm9hV1JrWlc0N1hHNTlYRzR1YjNWMGJHbHVaUzFwWTI5dVgyaHBaR1JsYmlCN1hHNGdJR1JwYzNCc1lYazZJRzV2Ym1VN1hHNTlYRzR2S2lBOVBUMDlQU0JUWTNKdmJHeGlZWElnUFQwOVBUMGdLaTljYmpvNkxYZGxZbXRwZEMxelkzSnZiR3hpWVhJZ2UxeHVJQ0IzYVdSMGFEb2dOM0I0TzF4dUlDQm9aV2xuYUhRNklEZHdlRHRjYmlBZ0xYZGxZbXRwZEMxaWIzSmtaWEl0Y21Ga2FYVnpPaUExY0hnN1hHNTlYRzQ2T2kxM1pXSnJhWFF0YzJOeWIyeHNZbUZ5TFhSeVlXTnJMWEJwWldObElIdGNiaUFnTFhkbFltdHBkQzFpYjNKa1pYSXRjbUZrYVhWek9pQTFjSGc3WEc1OVhHNDZPaTEzWldKcmFYUXRjMk55YjJ4c1ltRnlMWFJvZFcxaU9uWmxjblJwWTJGc0lIdGNiaUFnWW1GamEyZHliM1Z1WkMxamIyeHZjam9nY21kaVlTZ3dMQ0F3TENBd0xDQXdMakkxS1R0Y2JpQWdMWGRsWW10cGRDMWliM0prWlhJdGNtRmthWFZ6T2lBMWNIZzdYRzU5WEc0Nk9pMTNaV0pyYVhRdGMyTnliMnhzWW1GeUxYUm9kVzFpT21odmNtbDZiMjUwWVd3Z2UxeHVJQ0JpWVdOclozSnZkVzVrTFdOdmJHOXlPaUJ5WjJKaEtEQXNJREFzSURBc0lEQXVNalVwTzF4dUlDQXRkMlZpYTJsMExXSnZjbVJsY2kxeVlXUnBkWE02SURWd2VEdGNibjFjYmpvNkxYZGxZbXRwZEMxelkzSnZiR3hpWVhJdGRHaDFiV0k2YUc5MlpYSWdlMXh1SUNCaVlXTnJaM0p2ZFc1a0xXTnZiRzl5T2lCeVoySmhLREFzSURBc0lEQXNJREF1TXpVcE8xeHVmVnh1T2pvdGQyVmlhMmwwTFhOamNtOXNiR0poY2pwb2IzWmxjaUI3WEc0Z0lHSmhZMnRuY205MWJtUXRZMjlzYjNJNklISm5ZbUVvTUN3Z01Dd2dNQ3dnTUM0eE5TazdYRzU5WEc0dWIzVjBiR2x1WlMxb1pXRmthVzVuSUh0Y2JpQWdjRzl6YVhScGIyNDZJSEpsYkdGMGFYWmxPMXh1SUNCNkxXbHVaR1Y0T2lBeE8xeHVJQ0J2ZG1WeVpteHZkem9nYUdsa1pHVnVPMXh1ZlZ4dUxtOTFkR3hwYm1VdGFHVmhaR2x1WjE5ZllXNWphRzl5SUh0Y2JpQWdaR2x6Y0d4aGVUb2dibTl1WlR0Y2JuMWNiaTV2ZFhSc2FXNWxMV2hsWVdScGJtZGZYMkZ1WTJodmNqcHNhVzVyTEZ4dUxtOTFkR3hwYm1VdGFHVmhaR2x1WjE5ZllXNWphRzl5T25acGMybDBaV1FzWEc0dWIzVjBiR2x1WlMxb1pXRmthVzVuWDE5aGJtTm9iM0k2YUc5MlpYSWdlMXh1SUNCamIyeHZjam9nSXprNU9UdGNiaUFnZEdWNGRDMWtaV052Y21GMGFXOXVPaUJ1YjI1bE8xeHVmVnh1TG05MWRHeHBibVV0YUdWaFpHbHVaMTlmWVc1amFHOXlPbWh2ZG1WeUlIdGNiaUFnWTI5c2IzSTZJQ00xTURkaFptVTdYRzU5WEc0dWIzVjBiR2x1WlMxb1pXRmthVzVuT21odmRtVnlJQzV2ZFhSc2FXNWxMV2hsWVdScGJtZGZYMkZ1WTJodmNpQjdYRzRnSUdScGMzQnNZWGs2SUdsdWJHbHVaUzFpYkc5amF6dGNibjFjYmk1dmRYUnNhVzVsTFdobFlXUnBibWRmYzNSaGNuUTZhRzkyWlhJZ2UxeHVJQ0J2ZG1WeVpteHZkem9nZG1semFXSnNaVHRjYm4xY2JpNXZkWFJzYVc1bExXaGxZV1JwYm1kZmMzUmhjblFnTG05MWRHeHBibVV0YUdWaFpHbHVaMTlmWVc1amFHOXlJSHRjYmlBZ2NHOXphWFJwYjI0NklHRmljMjlzZFhSbE8xeHVJQ0I2TFdsdVpHVjRPaUF5TzF4dUlDQjBiM0E2SURVd0pUdGNiaUFnZEhKaGJuTm1iM0p0T2lCMGNtRnVjMnhoZEdWWktDMDFNQ1VwTzF4dUlDQnNaV1owT2lBdE1XVnRPMXh1ZlZ4dUxtOTFkR3hwYm1VdFpISmhkMlZ5SUh0Y2JpQWdjRzl6YVhScGIyNDZJSEpsYkdGMGFYWmxPMXh1SUNCNkxXbHVaR1Y0T2lBdE1UdGNiaUFnZEc5d09pQXdPMXh1SUNCc1pXWjBPaUF3TzF4dUlDQnRZWEpuYVc0NklEQTdYRzRnSUhkcFpIUm9PaUF4TURBbE8xeHVJQ0JvWldsbmFIUTZJREV3TUNVN1hHNGdJR0p2ZUMxemFYcHBibWM2SUdKdmNtUmxjaTFpYjNnN1hHNGdJSFpwYzJsaWFXeHBkSGs2SUdocFpHUmxianRjYmlBZ2IzWmxjbVpzYjNjNklHaHBaR1JsYmp0Y2JuMWNiaTV2ZFhSc2FXNWxMV1J5WVhkbGNsOWZiVzlrWVd3Z2UxeHVJQ0JpYjNndGMyaGhaRzkzT2lBd0lEQWdObkI0SURGd2VDQWpaR05rWm1VMk8xeHVJQ0JrYVhOd2JHRjVPaUJtYkdWNE8xeHVJQ0JtYkdWNExXUnBjbVZqZEdsdmJqb2dZMjlzZFcxdU8xeHVJQ0JtYkdWNExYZHlZWEE2SUc1dmQzSmhjRHRjYmlBZ2NHOXphWFJwYjI0NklHRmljMjlzZFhSbE8xeHVJQ0I2TFdsdVpHVjRPaUF5TVR0Y2JpQWdhR1ZwWjJoME9pQXhNREFsTzF4dUlDQmlZV05yWjNKdmRXNWtMV052Ykc5eU9pQWpabVptTzF4dUlDQjBjbUZ1YzJsMGFXOXVMV1IxY21GMGFXOXVPaUF3TGpSek8xeHVJQ0J2ZG1WeVpteHZkem9nYUdsa1pHVnVPMXh1ZlZ4dUxtOTFkR3hwYm1VdFpISmhkMlZ5WDE5b1pXRmtaWElzWEc0dWIzVjBiR2x1WlMxa2NtRjNaWEpmWDIxaGFXNHNYRzR1YjNWMGJHbHVaUzFrY21GM1pYSmZYMlp2YjNSbGNpQjdYRzRnSUhkcFpIUm9PaUF4TURBbE8xeHVJQ0JpYjNndGMybDZhVzVuT2lCaWIzSmtaWEl0WW05NE8xeHVmVnh1TG05MWRHeHBibVV0WkhKaGQyVnlYMTlvWldGa1pYSXNYRzR1YjNWMGJHbHVaUzFrY21GM1pYSmZYMlp2YjNSbGNpQjdYRzRnSUdac1pYZ3RjMmh5YVc1ck9pQXdPMXh1ZlZ4dUxtOTFkR3hwYm1VdFpISmhkMlZ5WDE5MGFYUnNaU3hjYmk1dmRYUnNhVzVsTFdSeVlYZGxjbDlmYldGcGJpeGNiaTV2ZFhSc2FXNWxMV1J5WVhkbGNsOWZabTl2ZEdWeUlIdGNiaUFnY0dGa1pHbHVaem9nTUNBeE5uQjRPMXh1ZlZ4dUxtOTFkR3hwYm1VdFpISmhkMlZ5WDE5b1pXRmtaWElzWEc0dWIzVjBiR2x1WlMxa2NtRjNaWEpmWDNScGRHeGxJSHRjYmlBZ2NHOXphWFJwYjI0NklISmxiR0YwYVhabE8xeHVJQ0I2TFdsdVpHVjRPaUF4TzF4dUlDQnRZWEpuYVc0NklEQWdZWFYwYnp0Y2JpQWdhR1ZwWjJoME9pQTFNbkI0TzF4dUlDQnNhVzVsTFdobGFXZG9kRG9nTlRKd2VEdGNiaUFnYjNabGNtWnNiM2M2SUdocFpHUmxianRjYm4xY2JpNXZkWFJzYVc1bExXUnlZWGRsY2w5ZmRHbDBiR1VnZTF4dUlDQm1iMjUwTFhOcGVtVTZJREUyY0hnN1hHNGdJR1p2Ym5RdGQyVnBaMmgwT2lBME1EQTdYRzRnSUcxaGNtZHBiam9nTUNBeE5uQjRPMXh1SUNCaWIzZ3RjMmw2YVc1bk9pQmliM0prWlhJdFltOTRPMXh1SUNCaWIzSmtaWEl0WW05MGRHOXRPaUF4Y0hnZ2MyOXNhV1FnSTJSalpHWmxOanRjYm4xY2JpNXZkWFJzYVc1bExXUnlZWGRsY2w5ZlkyeHZjMlVnZTF4dUlDQndiM05wZEdsdmJqb2dZV0p6YjJ4MWRHVTdYRzRnSUhvdGFXNWtaWGc2SURJN1hHNGdJSFJ2Y0RvZ05UQWxPMXh1SUNCeWFXZG9kRG9nTVRKd2VEdGNiaUFnZDJsa2RHZzZJREl3Y0hnN1hHNGdJR2hsYVdkb2REb2dNakJ3ZUR0Y2JpQWdiR2x1WlMxb1pXbG5hSFE2SURJd2NIZzdYRzRnSUdOdmJHOXlPaUFqT1RrNU8xeHVJQ0JtYjI1MExYTnBlbVU2SURJd2NIZzdYRzRnSUhSbGVIUXRZV3hwWjI0NklHTmxiblJsY2p0Y2JpQWdZM1Z5YzI5eU9pQndiMmx1ZEdWeU8xeHVJQ0IwY21GdWMyWnZjbTA2SUhSeVlXNXpiR0YwWlZrb0xUVXdKU2s3WEc0Z0lHOTJaWEptYkc5M09pQm9hV1JrWlc0N1hHNTlYRzR1YjNWMGJHbHVaUzFrY21GM1pYSmZYMk5zYjNObElDNXZkWFJzYVc1bExXbGpiMjRnZTF4dUlDQndiM05wZEdsdmJqb2dZV0p6YjJ4MWRHVTdYRzRnSUhvdGFXNWtaWGc2SURJN1hHNGdJSFJ2Y0RvZ01EdGNiaUFnYkdWbWREb2dNRHRjYm4xY2JpNXZkWFJzYVc1bExXUnlZWGRsY2w5ZlkyeHZjMlU2YUc5MlpYSWdlMXh1SUNCamIyeHZjam9nSXpZMk5qdGNibjFjYmk1dmRYUnNhVzVsTFdSeVlYZGxjbDlmYldGcGJpQjdYRzRnSUdac1pYZzZJREU3WEc0Z0lHOTJaWEptYkc5M09pQmhkWFJ2TzF4dWZWeHVMbTkxZEd4cGJtVXRaSEpoZDJWeVgxOXRZV2x1TG05MlpYSm1iRzkzTFdocFpHUmxiaUI3WEc0Z0lHOTJaWEptYkc5M09pQm9hV1JrWlc0N1hHNTlYRzR1YjNWMGJHbHVaUzFrY21GM1pYSmZYMlp2YjNSbGNpQjdYRzRnSUcxaGNtZHBiam9nTUNCaGRYUnZPMXh1SUNCMFpYaDBMV0ZzYVdkdU9pQnlhV2RvZER0Y2JpQWdiM1psY21ac2IzYzZJR2hwWkdSbGJqdGNibjFjYmk1dmRYUnNhVzVsTFdSeVlYZGxjbDlmYjNabGNteGhlU0I3WEc0Z0lHTnZiblJsYm5RNklDY25PMXh1SUNCd2IzTnBkR2x2YmpvZ2NtVnNZWFJwZG1VN1hHNGdJSG90YVc1a1pYZzZJREU3WEc0Z0lIUnZjRG9nTUR0Y2JpQWdiR1ZtZERvZ01EdGNiaUFnZDJsa2RHZzZJREV3TUNVN1hHNGdJR2hsYVdkb2REb2dNVEF3SlR0Y2JpQWdZbUZqYTJkeWIzVnVaQzFqYjJ4dmNqb2dJMlptWmp0Y2JpQWdiM0JoWTJsMGVUb2dNQzR4TzF4dUlDQnZkbVZ5Wm14dmR6b2dhR2xrWkdWdU8xeHVmVnh1TG05MWRHeHBibVV0WkhKaGQyVnlYM0owYkM1dmRYUnNhVzVsTFdSeVlYZGxjbDkwYVc1NUxGeHVMbTkxZEd4cGJtVXRaSEpoZDJWeVgyeDBjaTV2ZFhSc2FXNWxMV1J5WVhkbGNsOTBhVzU1SUh0Y2JpQWdkMmxrZEdnNklESTRNSEI0TzF4dWZWeHVMbTkxZEd4cGJtVXRaSEpoZDJWeVgzSjBiQzV2ZFhSc2FXNWxMV1J5WVhkbGNsOXRhVzVwTEZ4dUxtOTFkR3hwYm1VdFpISmhkMlZ5WDJ4MGNpNXZkWFJzYVc1bExXUnlZWGRsY2w5dGFXNXBJSHRjYmlBZ2QybGtkR2c2SURRNE1IQjRPMXh1ZlZ4dUxtOTFkR3hwYm1VdFpISmhkMlZ5WDNKMGJDNXZkWFJzYVc1bExXUnlZWGRsY2w5emJXRnNiQ3hjYmk1dmRYUnNhVzVsTFdSeVlYZGxjbDlzZEhJdWIzVjBiR2x1WlMxa2NtRjNaWEpmYzIxaGJHd2dlMXh1SUNCM2FXUjBhRG9nTlRRd2NIZzdYRzU5WEc0dWIzVjBiR2x1WlMxa2NtRjNaWEpmY25Sc0xtOTFkR3hwYm1VdFpISmhkMlZ5WDNKbFozVnNZWElzWEc0dWIzVjBiR2x1WlMxa2NtRjNaWEpmYkhSeUxtOTFkR3hwYm1VdFpISmhkMlZ5WDNKbFozVnNZWElnZTF4dUlDQjNhV1IwYURvZ05qZ3djSGc3WEc1OVhHNHViM1YwYkdsdVpTMWtjbUYzWlhKZmNuUnNMbTkxZEd4cGJtVXRaSEpoZDJWeVgyMWxaR2wxYlN4Y2JpNXZkWFJzYVc1bExXUnlZWGRsY2w5c2RISXViM1YwYkdsdVpTMWtjbUYzWlhKZmJXVmthWFZ0SUh0Y2JpQWdkMmxrZEdnNklEY3lNSEI0TzF4dWZWeHVMbTkxZEd4cGJtVXRaSEpoZDJWeVgzSjBiQzV2ZFhSc2FXNWxMV1J5WVhkbGNsOXNZWEpuWlN4Y2JpNXZkWFJzYVc1bExXUnlZWGRsY2w5c2RISXViM1YwYkdsdVpTMWtjbUYzWlhKZmJHRnlaMlVnZTF4dUlDQjNhV1IwYURvZ09UWXdjSGc3WEc1OVhHNHViM1YwYkdsdVpTMWtjbUYzWlhKZmNuUnNJSHRjYmlBZ1ltOXlaR1Z5TFd4bFpuUTZJREZ3ZUNCemIyeHBaQ0FqWkdOa1ptVTJPMXh1ZlZ4dUxtOTFkR3hwYm1VdFpISmhkMlZ5WDNKMGJDNXZkWFJzYVc1bExXUnlZWGRsY2w5MGFXNTVMbTkxZEd4cGJtVXRaSEpoZDJWeVgyTnNiM05sWkNCN1hHNGdJSEpwWjJoME9pQXRNamt3Y0hnN1hHNTlYRzR1YjNWMGJHbHVaUzFrY21GM1pYSmZjblJzTG05MWRHeHBibVV0WkhKaGQyVnlYMjFwYm1rdWIzVjBiR2x1WlMxa2NtRjNaWEpmWTJ4dmMyVmtJSHRjYmlBZ2NtbG5hSFE2SUMwME9UQndlRHRjYm4xY2JpNXZkWFJzYVc1bExXUnlZWGRsY2w5eWRHd3ViM1YwYkdsdVpTMWtjbUYzWlhKZmMyMWhiR3d1YjNWMGJHbHVaUzFrY21GM1pYSmZZMnh2YzJWa0lIdGNiaUFnY21sbmFIUTZJQzAxTlRCd2VEdGNibjFjYmk1dmRYUnNhVzVsTFdSeVlYZGxjbDl5ZEd3dWIzVjBiR2x1WlMxa2NtRjNaWEpmY21WbmRXeGhjaTV2ZFhSc2FXNWxMV1J5WVhkbGNsOWpiRzl6WldRZ2UxeHVJQ0J5YVdkb2REb2dMVFk1TUhCNE8xeHVmVnh1TG05MWRHeHBibVV0WkhKaGQyVnlYM0owYkM1dmRYUnNhVzVsTFdSeVlYZGxjbDl0WldScGRXMHViM1YwYkdsdVpTMWtjbUYzWlhKZlkyeHZjMlZrSUh0Y2JpQWdjbWxuYUhRNklDMDNNekJ3ZUR0Y2JuMWNiaTV2ZFhSc2FXNWxMV1J5WVhkbGNsOXlkR3d1YjNWMGJHbHVaUzFrY21GM1pYSmZiR0Z5WjJVdWIzVjBiR2x1WlMxa2NtRjNaWEpmWTJ4dmMyVmtJSHRjYmlBZ2NtbG5hSFE2SUMwNU56QndlRHRjYm4xY2JpNXZkWFJzYVc1bExXUnlZWGRsY2w5c2RISWdlMXh1SUNCaWIzSmtaWEl0Y21sbmFIUTZJREZ3ZUNCemIyeHBaQ0FqWkdOa1ptVTJPMXh1ZlZ4dUxtOTFkR3hwYm1VdFpISmhkMlZ5WDJ4MGNpNXZkWFJzYVc1bExXUnlZWGRsY2w5MGFXNTVMbTkxZEd4cGJtVXRaSEpoZDJWeVgyTnNiM05sWkNCN1hHNGdJR3hsWm5RNklDMHlPVEJ3ZUR0Y2JuMWNiaTV2ZFhSc2FXNWxMV1J5WVhkbGNsOXNkSEl1YjNWMGJHbHVaUzFrY21GM1pYSmZiV2x1YVM1dmRYUnNhVzVsTFdSeVlYZGxjbDlqYkc5elpXUWdlMXh1SUNCc1pXWjBPaUF0TkRrd2NIZzdYRzU5WEc0dWIzVjBiR2x1WlMxa2NtRjNaWEpmYkhSeUxtOTFkR3hwYm1VdFpISmhkMlZ5WDNOdFlXeHNMbTkxZEd4cGJtVXRaSEpoZDJWeVgyTnNiM05sWkNCN1hHNGdJR3hsWm5RNklDMDFOVEJ3ZUR0Y2JuMWNiaTV2ZFhSc2FXNWxMV1J5WVhkbGNsOXNkSEl1YjNWMGJHbHVaUzFrY21GM1pYSmZjbVZuZFd4aGNpNXZkWFJzYVc1bExXUnlZWGRsY2w5amJHOXpaV1FnZTF4dUlDQnNaV1owT2lBdE5qa3djSGc3WEc1OVhHNHViM1YwYkdsdVpTMWtjbUYzWlhKZmJIUnlMbTkxZEd4cGJtVXRaSEpoZDJWeVgyMWxaR2wxYlM1dmRYUnNhVzVsTFdSeVlYZGxjbDlqYkc5elpXUWdlMXh1SUNCc1pXWjBPaUF0TnpNd2NIZzdYRzU5WEc0dWIzVjBiR2x1WlMxa2NtRjNaWEpmYkhSeUxtOTFkR3hwYm1VdFpISmhkMlZ5WDJ4aGNtZGxMbTkxZEd4cGJtVXRaSEpoZDJWeVgyTnNiM05sWkNCN1hHNGdJR3hsWm5RNklDMDVOekJ3ZUR0Y2JuMWNiaTV2ZFhSc2FXNWxMV1J5WVhkbGNsOTBkR0lzWEc0dWIzVjBiR2x1WlMxa2NtRjNaWEpmWW5SMElIdGNiaUFnYkdWbWREb2dNRHRjYmlBZ2QybGtkR2c2SURFd01DVTdYRzU5WEc0dWIzVjBiR2x1WlMxa2NtRjNaWEpmZEhSaUxtOTFkR3hwYm1VdFpISmhkMlZ5WDNScGJua3NYRzR1YjNWMGJHbHVaUzFrY21GM1pYSmZZblIwTG05MWRHeHBibVV0WkhKaGQyVnlYM1JwYm5rZ2UxeHVJQ0JvWldsbmFIUTZJREkwTUhCNE8xeHVmVnh1TG05MWRHeHBibVV0WkhKaGQyVnlYM1IwWWk1dmRYUnNhVzVsTFdSeVlYZGxjbDl0YVc1cExGeHVMbTkxZEd4cGJtVXRaSEpoZDJWeVgySjBkQzV2ZFhSc2FXNWxMV1J5WVhkbGNsOXRhVzVwSUh0Y2JpQWdhR1ZwWjJoME9pQXpNakJ3ZUR0Y2JuMWNiaTV2ZFhSc2FXNWxMV1J5WVhkbGNsOTBkR0l1YjNWMGJHbHVaUzFrY21GM1pYSmZjMjFoYkd3c1hHNHViM1YwYkdsdVpTMWtjbUYzWlhKZlluUjBMbTkxZEd4cGJtVXRaSEpoZDJWeVgzTnRZV3hzSUh0Y2JpQWdhR1ZwWjJoME9pQXpOakJ3ZUR0Y2JuMWNiaTV2ZFhSc2FXNWxMV1J5WVhkbGNsOTBkR0l1YjNWMGJHbHVaUzFrY21GM1pYSmZjbVZuZFd4aGNpeGNiaTV2ZFhSc2FXNWxMV1J5WVhkbGNsOWlkSFF1YjNWMGJHbHVaUzFrY21GM1pYSmZjbVZuZFd4aGNpQjdYRzRnSUdobGFXZG9kRG9nTkRBd2NIZzdYRzU5WEc0dWIzVjBiR2x1WlMxa2NtRjNaWEpmZEhSaUxtOTFkR3hwYm1VdFpISmhkMlZ5WDIxbFpHbDFiU3hjYmk1dmRYUnNhVzVsTFdSeVlYZGxjbDlpZEhRdWIzVjBiR2x1WlMxa2NtRjNaWEpmYldWa2FYVnRJSHRjYmlBZ2FHVnBaMmgwT2lBME5EQndlRHRjYm4xY2JpNXZkWFJzYVc1bExXUnlZWGRsY2w5MGRHSXViM1YwYkdsdVpTMWtjbUYzWlhKZmJHRnlaMlVzWEc0dWIzVjBiR2x1WlMxa2NtRjNaWEpmWW5SMExtOTFkR3hwYm1VdFpISmhkMlZ5WDJ4aGNtZGxJSHRjYmlBZ2FHVnBaMmgwT2lBME9EQndlRHRjYm4xY2JpNXZkWFJzYVc1bExXUnlZWGRsY2w5MGRHSWdlMXh1SUNCaWIzSmtaWEl0WW05MGRHOXRPaUF4Y0hnZ2MyOXNhV1FnSTJSalpHWmxOanRjYm4xY2JpNXZkWFJzYVc1bExXUnlZWGRsY2w5MGRHSXViM1YwYkdsdVpTMWtjbUYzWlhKZmRHbHVlUzV2ZFhSc2FXNWxMV1J5WVhkbGNsOWpiRzl6WldRZ2UxeHVJQ0IwYjNBNklDMHlOVEJ3ZUR0Y2JuMWNiaTV2ZFhSc2FXNWxMV1J5WVhkbGNsOTBkR0l1YjNWMGJHbHVaUzFrY21GM1pYSmZiV2x1YVM1dmRYUnNhVzVsTFdSeVlYZGxjbDlqYkc5elpXUWdlMXh1SUNCMGIzQTZJQzB6TXpCd2VEdGNibjFjYmk1dmRYUnNhVzVsTFdSeVlYZGxjbDkwZEdJdWIzVjBiR2x1WlMxa2NtRjNaWEpmYzIxaGJHd3ViM1YwYkdsdVpTMWtjbUYzWlhKZlkyeHZjMlZrSUh0Y2JpQWdkRzl3T2lBdE16Y3djSGc3WEc1OVhHNHViM1YwYkdsdVpTMWtjbUYzWlhKZmRIUmlMbTkxZEd4cGJtVXRaSEpoZDJWeVgzSmxaM1ZzWVhJdWIzVjBiR2x1WlMxa2NtRjNaWEpmWTJ4dmMyVmtJSHRjYmlBZ2RHOXdPaUF0TkRFd2NIZzdYRzU5WEc0dWIzVjBiR2x1WlMxa2NtRjNaWEpmZEhSaUxtOTFkR3hwYm1VdFpISmhkMlZ5WDIxbFpHbDFiUzV2ZFhSc2FXNWxMV1J5WVhkbGNsOWpiRzl6WldRZ2UxeHVJQ0IwYjNBNklDMDBOVEJ3ZUR0Y2JuMWNiaTV2ZFhSc2FXNWxMV1J5WVhkbGNsOTBkR0l1YjNWMGJHbHVaUzFrY21GM1pYSmZiR0Z5WjJVdWIzVjBiR2x1WlMxa2NtRjNaWEpmWTJ4dmMyVmtJSHRjYmlBZ2RHOXdPaUF0TkRrd2NIZzdYRzU5WEc0dWIzVjBiR2x1WlMxa2NtRjNaWEpmWW5SMElIdGNiaUFnZEc5d09pQnBibWwwYVdGc08xeHVJQ0JpYjNKa1pYSXRkRzl3T2lBeGNIZ2djMjlzYVdRZ0kyUmpaR1psTmp0Y2JuMWNiaTV2ZFhSc2FXNWxMV1J5WVhkbGNsOWlkSFF1YjNWMGJHbHVaUzFrY21GM1pYSmZkR2x1ZVM1dmRYUnNhVzVsTFdSeVlYZGxjbDlqYkc5elpXUWdlMXh1SUNCaWIzUjBiMjA2SUMweU5UQndlRHRjYm4xY2JpNXZkWFJzYVc1bExXUnlZWGRsY2w5aWRIUXViM1YwYkdsdVpTMWtjbUYzWlhKZmJXbHVhUzV2ZFhSc2FXNWxMV1J5WVhkbGNsOWpiRzl6WldRZ2UxeHVJQ0JpYjNSMGIyMDZJQzB6TXpCd2VEdGNibjFjYmk1dmRYUnNhVzVsTFdSeVlYZGxjbDlpZEhRdWIzVjBiR2x1WlMxa2NtRjNaWEpmYzIxaGJHd3ViM1YwYkdsdVpTMWtjbUYzWlhKZlkyeHZjMlZrSUh0Y2JpQWdZbTkwZEc5dE9pQXRNemN3Y0hnN1hHNTlYRzR1YjNWMGJHbHVaUzFrY21GM1pYSmZZblIwTG05MWRHeHBibVV0WkhKaGQyVnlYM0psWjNWc1lYSXViM1YwYkdsdVpTMWtjbUYzWlhKZlkyeHZjMlZrSUh0Y2JpQWdZbTkwZEc5dE9pQXROREV3Y0hnN1hHNTlYRzR1YjNWMGJHbHVaUzFrY21GM1pYSmZZblIwTG05MWRHeHBibVV0WkhKaGQyVnlYMjFsWkdsMWJTNXZkWFJzYVc1bExXUnlZWGRsY2w5amJHOXpaV1FnZTF4dUlDQmliM1IwYjIwNklDMDBOVEJ3ZUR0Y2JuMWNiaTV2ZFhSc2FXNWxMV1J5WVhkbGNsOWlkSFF1YjNWMGJHbHVaUzFrY21GM1pYSmZiR0Z5WjJVdWIzVjBiR2x1WlMxa2NtRjNaWEpmWTJ4dmMyVmtJSHRjYmlBZ1ltOTBkRzl0T2lBdE5Ea3djSGc3WEc1OVhHNHViM1YwYkdsdVpTMWtjbUYzWlhKZmIzQmxibVZrSUh0Y2JpQWdkbWx6YVdKcGJHbDBlVG9nZG1semFXSnNaVHRjYmlBZ2VpMXBibVJsZURvZ2RtRnlLQzB0YjNWMGJHbHVaUzE2U1c1a1pYZ3BPMXh1ZlZ4dUxtOTFkR3hwYm1VdFpISmhkMlZ5WDI5d1pXNWxaQzV2ZFhSc2FXNWxMV1J5WVhkbGNpQjdYRzRnSUhCdmMybDBhVzl1T2lCbWFYaGxaRHRjYm4xY2JpNXZkWFJzYVc1bExXUnlZWGRsY2w5dmNHVnVaV1F1YjNWMGJHbHVaUzFrY21GM1pYSmZjblJzSUh0Y2JpQWdjbWxuYUhRNklEQTdYRzU5WEc0dWIzVjBiR2x1WlMxa2NtRjNaWEpmYjNCbGJtVmtMbTkxZEd4cGJtVXRaSEpoZDJWeVgyeDBjaUI3WEc0Z0lHeGxablE2SURBN1hHNTlYRzR1YjNWMGJHbHVaUzFrY21GM1pYSmZiM0JsYm1Wa0xtOTFkR3hwYm1VdFpISmhkMlZ5WDNSMFlpQjdYRzRnSUhSdmNEb2dNRHRjYm4xY2JpNXZkWFJzYVc1bExXUnlZWGRsY2w5dmNHVnVaV1F1YjNWMGJHbHVaUzFrY21GM1pYSmZZblIwSUh0Y2JpQWdZbTkwZEc5dE9pQXdPMXh1ZlZ4dUxtOTFkR3hwYm1VdFpISmhkMlZ5WDI5bVpuTmxkQzV2ZFhSc2FXNWxMV1J5WVhkbGNsOXlkR3dzWEc0dWIzVjBiR2x1WlMxa2NtRjNaWEpmYjJabWMyVjBMbTkxZEd4cGJtVXRaSEpoZDJWeVgyeDBjaUI3WEc0Z0lHaGxhV2RvZERvZ1kyRnNZeWd4TURBbElDMGdOR1Z0S1R0Y2JpQWdkRzl3T2lBMU1DVTdYRzRnSUhSeVlXNXpabTl5YlRvZ2RISmhibk5zWVhSbFdTZ3ROVEFsS1R0Y2JuMWNiaTV2ZFhSc2FXNWxMV1J5WVhkbGNsOXZabVp6WlhRdWIzVjBiR2x1WlMxa2NtRjNaWEpmZEhSaUxGeHVMbTkxZEd4cGJtVXRaSEpoZDJWeVgyOW1abk5sZEM1dmRYUnNhVzVsTFdSeVlYZGxjbDlpZEhRZ2UxeHVJQ0IzYVdSMGFEb2dZMkZzWXlneE1EQWxJQzBnTkdWdEtUdGNiaUFnYkdWbWREb2dOVEFsTzF4dUlDQjBjbUZ1YzJadmNtMDZJSFJ5WVc1emJHRjBaVmdvTFRVd0pTazdYRzU5WEc0dWIzVjBiR2x1WlMxa2NtRjNaWEpmYjJabWMyVjBMbTkxZEd4cGJtVXRaSEpoZDJWeVgyOXdaVzVsWkM1dmRYUnNhVzVsTFdSeVlYZGxjbDl5ZEd3Z2UxeHVJQ0J5YVdkb2REb2dNbVZ0TzF4dWZWeHVMbTkxZEd4cGJtVXRaSEpoZDJWeVgyOW1abk5sZEM1dmRYUnNhVzVsTFdSeVlYZGxjbDl2Y0dWdVpXUXViM1YwYkdsdVpTMWtjbUYzWlhKZmJIUnlJSHRjYmlBZ2JHVm1kRG9nTW1WdE8xeHVmVnh1TG05MWRHeHBibVV0WkhKaGQyVnlYMjltWm5ObGRDNXZkWFJzYVc1bExXUnlZWGRsY2w5dmNHVnVaV1F1YjNWMGJHbHVaUzFrY21GM1pYSmZkSFJpSUh0Y2JpQWdkRzl3T2lBeVpXMDdYRzU5WEc0dWIzVjBiR2x1WlMxa2NtRjNaWEpmYjJabWMyVjBMbTkxZEd4cGJtVXRaSEpoZDJWeVgyOXdaVzVsWkM1dmRYUnNhVzVsTFdSeVlYZGxjbDlpZEhRZ2UxeHVJQ0JpYjNSMGIyMDZJREpsYlR0Y2JuMWNiaTV2ZFhSc2FXNWxMV1J5WVhkbGNsOWhkWFJ2TG05MWRHeHBibVV0WkhKaGQyVnlYM0owYkN4Y2JpNXZkWFJzYVc1bExXUnlZWGRsY2w5aGRYUnZMbTkxZEd4cGJtVXRaSEpoZDJWeVgyeDBjaUI3WEc0Z0lHaGxhV2RvZERvZ1lYVjBienRjYmlBZ2JXRjRMV2hsYVdkb2REb2dZMkZzWXlneE1EQWxJQzBnTkdWdEtUdGNibjFjYmk1dmRYUnNhVzVsTFdSeVlYZGxjbDltZFd4c0lIdGNiaUFnY0dGa1pHbHVaem9nTUR0Y2JuMWNiaTV2ZFhSc2FXNWxMVzVoZG1sbllYUnZjaUI3WEc0Z0lIQnZjMmwwYVc5dU9pQnlaV3hoZEdsMlpUdGNiaUFnZWkxcGJtUmxlRG9nTVR0Y2JpQWdiV0Z5WjJsdU9pQXdPMXh1SUNCM2FXUjBhRG9nZG1GeUtDMHRiM1YwYkdsdVpTMXVZWFpwWjJGMGIzSXRkMmxrZEdncE8xeHVJQ0J2ZG1WeVpteHZkem9nWVhWMGJ6dGNibjFjYmk1dmRYUnNhVzVsTFc1aGRtbG5ZWFJ2Y2kxd1lYSmxiblFnZTF4dUlDQjBjbUZ1YzJsMGFXOXVPaUF3TGpOeklHVmhjMlV0YVc0dGIzVjBPMXh1ZlZ4dUxtOTFkR3hwYm1VdGJtRjJhV2RoZEc5eVgxOTBhWFJzWlNCN1hHNGdJRzFoY21kcGJqb2dNQ0F4Tm5CNE8xeHVJQ0JvWldsbmFIUTZJRFF3Y0hnN1hHNGdJR3hwYm1VdGFHVnBaMmgwT2lBME1IQjRPMXh1SUNCd1lXUmthVzVuT2lBd0lERTJjSGc3WEc0Z0lHSnZjbVJsY2kxaWIzUjBiMjA2SURGd2VDQnpiMnhwWkNBalpHTmtabVUyTzF4dUlDQm1iMjUwTFhOcGVtVTZJREUyY0hnN1hHNGdJR1p2Ym5RdGQyVnBaMmgwT2lBME1EQTdYRzRnSUc5MlpYSm1iRzkzT2lCb2FXUmtaVzQ3WEc1OVhHNHViM1YwYkdsdVpTMXVZWFpwWjJGMGIzSmZYMjFoYVc0Z2UxeHVJQ0J3YjNOcGRHbHZiam9nY21Wc1lYUnBkbVU3WEc0Z0lIb3RhVzVrWlhnNklERTdYRzRnSUcxaGNtZHBiam9nTUR0Y2JpQWdiM1psY21ac2IzYzZJR2hwWkdSbGJqdGNibjFjYmk1dmRYUnNhVzVsTFc1aGRtbG5ZWFJ2Y2w5ZmJHbHpkQ3hjYmk1dmRYUnNhVzVsTFc1aGRtbG5ZWFJ2Y2w5ZmMzVmlhbVZqZEN4Y2JpNXZkWFJzYVc1bExXNWhkbWxuWVhSdmNsOWZhWFJsYlNCN1hHNGdJSEJ2YzJsMGFXOXVPaUJ5Wld4aGRHbDJaVHRjYmlBZ2VpMXBibVJsZURvZ01qdGNiaUFnYldGeVoybHVPaUF3TzF4dUlDQndZV1JrYVc1bk9pQXdPMXh1SUNCc2FYTjBMWE4wZVd4bExYUjVjR1U2SUc1dmJtVTdYRzRnSUc5MlpYSm1iRzkzT2lCb2FXUmtaVzQ3WEc1OVhHNHViM1YwYkdsdVpTMXVZWFpwWjJGMGIzSmZYMnhwYzNRZ2UxeHVJQ0J3WVdSa2FXNW5PaUF3TGpWbGJTQXdPMXh1ZlZ4dUxtOTFkR3hwYm1VdGJtRjJhV2RoZEc5eVgxOXpkV0pxWldOMElIdGNiaUFnY0dGa1pHbHVaeTFzWldaME9pQXhaVzA3WEc1OVhHNHViM1YwYkdsdVpTMXVZWFpwWjJGMGIzSmZYMmwwWlcwZ2UxeHVJQ0J0WVhKbmFXNDZJREE3WEc0Z0lHeHBibVV0YUdWcFoyaDBPaUF6TUhCNE8xeHVJQ0JtYjI1MExYTnBlbVU2SURFemNIZzdYRzRnSUc5MlpYSm1iRzkzT2lCb2FXUmtaVzQ3WEc1OVhHNHViM1YwYkdsdVpTMXVZWFpwWjJGMGIzSmZYM0JzWVdObGFHOXNaR1Z5SUh0Y2JpQWdjRzl6YVhScGIyNDZJR0ZpYzI5c2RYUmxPMXh1SUNCNkxXbHVaR1Y0T2lBeE8xeHVJQ0IwYjNBNklEQTdYRzRnSUd4bFpuUTZJREE3WEc0Z0lIZHBaSFJvT2lBeE1EQWxPMXh1SUNCb1pXbG5hSFE2SURNd2NIZzdYRzRnSUdKaFkydG5jbTkxYm1RdFkyOXNiM0k2SUNObU4yWTRaams3WEc0Z0lHSnZjbVJsY2kxc1pXWjBPaUF5Y0hnZ2MyOXNhV1FnSXpBMU9EazBNanRjYmlBZ2RISmhibk5wZEdsdmJpMWtkWEpoZEdsdmJqb2dNQzR5Y3p0Y2JpQWdZbTk0TFhOcGVtbHVaem9nWW05eVpHVnlMV0p2ZUR0Y2JpQWdiM1psY21ac2IzYzZJR2hwWkdSbGJqdGNibjFjYmk1dmRYUnNhVzVsTFc1aGRtbG5ZWFJ2Y2w5ZllXNWphRzl5SUh0Y2JpQWdkMmhwZEdVdGMzQmhZMlU2SUc1dmQzSmhjRHRjYmlBZ2RHVjRkQzF2ZG1WeVpteHZkem9nWld4c2FYQnphWE03WEc0Z0lHOTJaWEptYkc5M09pQm9hV1JrWlc0N1hHNGdJR1JwYzNCc1lYazZJR0pzYjJOck8xeHVJQ0J3WVdSa2FXNW5PaUF3SURFdU5XVnRPMXh1ZlZ4dUxtOTFkR3hwYm1VdGJtRjJhV2RoZEc5eVgxOWhibU5vYjNJNmJHbHVheXhjYmk1dmRYUnNhVzVsTFc1aGRtbG5ZWFJ2Y2w5ZllXNWphRzl5T25acGMybDBaV1FzWEc0dWIzVjBiR2x1WlMxdVlYWnBaMkYwYjNKZlgyRnVZMmh2Y2pwb2IzWmxjaUI3WEc0Z0lIUmxlSFF0WkdWamIzSmhkR2x2YmpvZ2JtOXVaVHRjYmlBZ1kyOXNiM0k2SUNNMU5UVTdYRzU5WEc0dWIzVjBiR2x1WlMxdVlYWnBaMkYwYjNKZlgyRnVZMmh2Y2pwb2IzWmxjaUI3WEc0Z0lHTnZiRzl5T2lBak1EVTRPVFF5TzF4dWZWeHVMbTkxZEd4cGJtVXRibUYyYVdkaGRHOXlYMTlqYjJSbElIdGNiaUFnY0dGa1pHbHVaeTF5YVdkb2REb2dNQzQxWlcwN1hHNTlYRzR1YjNWMGJHbHVaUzF1WVhacFoyRjBiM0pmYUdsbmFHeHBaMmgwTG05MWRHeHBibVV0Ym1GMmFXZGhkRzl5WDE5aGJtTm9iM0k2YkdsdWF5eGNiaTV2ZFhSc2FXNWxMVzVoZG1sbllYUnZjbDlvYVdkb2JHbG5hSFF1YjNWMGJHbHVaUzF1WVhacFoyRjBiM0pmWDJGdVkyaHZjanAyYVhOcGRHVmtMRnh1TG05MWRHeHBibVV0Ym1GMmFXZGhkRzl5WDJocFoyaHNhV2RvZEM1dmRYUnNhVzVsTFc1aGRtbG5ZWFJ2Y2w5ZllXNWphRzl5T21odmRtVnlJSHRjYmlBZ1kyOXNiM0k2SUNNd05UZzVOREk3WEc0Z0lHWnZiblF0ZDJWcFoyaDBPaUJpYjJ4a08xeHVmVnh1TG05MWRHeHBibVV0Ym1GMmFXZGhkRzl5WDNOMGFXTnJlU3hjYmk1dmRYUnNhVzVsTFc1aGRtbG5ZWFJ2Y2w5bWFYaGxaQ0I3WEc0Z0lHUnBjM0JzWVhrNklHWnNaWGc3WEc0Z0lHWnNaWGd0ZDNKaGNEb2dibTkzY21Gd08xeHVJQ0JtYkdWNExXUnBjbVZqZEdsdmJqb2dZMjlzZFcxdU8xeHVJQ0I2TFdsdVpHVjRPaUIyWVhJb0xTMXZkWFJzYVc1bExYcEpibVJsZUNrN1hHNGdJSFJ2Y0RvZ01EdGNiaUFnYjNabGNtWnNiM2M2SUdocFpHUmxianRjYm4xY2JpNXZkWFJzYVc1bExXNWhkbWxuWVhSdmNsOXpkR2xqYTNrZ0xtOTFkR3hwYm1VdGJtRjJhV2RoZEc5eVgxOTBhWFJzWlN4Y2JpNXZkWFJzYVc1bExXNWhkbWxuWVhSdmNsOW1hWGhsWkNBdWIzVjBiR2x1WlMxdVlYWnBaMkYwYjNKZlgzUnBkR3hsTEZ4dUxtOTFkR3hwYm1VdGJtRjJhV2RoZEc5eVgzTjBhV05yZVNBdWIzVjBiR2x1WlMxdVlYWnBaMkYwYjNKZlgyMWhhVzRzWEc0dWIzVjBiR2x1WlMxdVlYWnBaMkYwYjNKZlptbDRaV1FnTG05MWRHeHBibVV0Ym1GMmFXZGhkRzl5WDE5dFlXbHVJSHRjYmlBZ1ltOTRMWE5wZW1sdVp6b2dZbTl5WkdWeUxXSnZlRHRjYm4xY2JpNXZkWFJzYVc1bExXNWhkbWxuWVhSdmNsOXpkR2xqYTNrZ0xtOTFkR3hwYm1VdGJtRjJhV2RoZEc5eVgxOTBhWFJzWlN4Y2JpNXZkWFJzYVc1bExXNWhkbWxuWVhSdmNsOW1hWGhsWkNBdWIzVjBiR2x1WlMxdVlYWnBaMkYwYjNKZlgzUnBkR3hsSUh0Y2JpQWdabXhsZUMxemFISnBibXM2SURBN1hHNTlYRzR1YjNWMGJHbHVaUzF1WVhacFoyRjBiM0pmYzNScFkydDVJQzV2ZFhSc2FXNWxMVzVoZG1sbllYUnZjbDlmYldGcGJpeGNiaTV2ZFhSc2FXNWxMVzVoZG1sbllYUnZjbDltYVhobFpDQXViM1YwYkdsdVpTMXVZWFpwWjJGMGIzSmZYMjFoYVc0Z2UxeHVJQ0JtYkdWNE9pQXhPMXh1SUNCdmRtVnlabXh2ZHpvZ1lYVjBienRjYm4xY2JpNXZkWFJzYVc1bExXNWhkbWxuWVhSdmNsOXpkR2xqYTNrZ2UxeHVJQ0J3YjNOcGRHbHZiam9nYzNScFkydDVPMXh1SUNCdFlYZ3RhR1ZwWjJoME9pQjJZWElvTFMxdmRYUnNhVzVsTFhOMGFXTnJlUzFvWldsbmFIUXBPMXh1ZlZ4dUxtOTFkR3hwYm1VdGJtRjJhV2RoZEc5eVgyWnBlR1ZrSUh0Y2JpQWdjRzl6YVhScGIyNDZJR1pwZUdWa08xeHVJQ0J0WVhndGFHVnBaMmgwT2lBeE1EQWxPMXh1ZlZ4dUxtOTFkR3hwYm1VdGJtRjJhV2RoZEc5eVgyaHBaR1JsYmlCN1hHNGdJR1JwYzNCc1lYazZJRzV2Ym1VN1hHNTlYRzR1YjNWMGJHbHVaUzF1WVhacFoyRjBiM0pmWm05c1pHVmtJSHRjYmlBZ2QybGtkR2c2SURBN1hHNGdJRzkyWlhKbWJHOTNPaUJvYVdSa1pXNDdYRzU5WEc0dktpcGNiaUFxSUdadmJuUXViR1Z6Y3lBdElPV3RsK1M5aytlYnVPV0ZzK2FndCtXOGoxeHVJQ29nUFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVnh1SUNvZ1EzSmxZWFJsWkNCQ2VUb2dXV0Z2YUdGcGVHbGhiMXh1SUNvZ1ZYQmtZWFJsT2lBeU1ESXlMak11TVRaY2JpQXFMMXh1THlvZ1BUMDlQVDA5SU9XdGwrUzlreUE5UFQwOVBUMGdLaTljYmk4cUlEMDlQVDA5UFNEbHJaZnBoNDBnUFQwOVBUMDlJQ292WEc0dktpQTlQVDA5UFQwZzVhMlg1WSszSUQwOVBUMDlQU0FxTDF4dUx5b3FYRzRnS2lCdGFYaHBibk11YkdWemN5QXRJT1czcGVXRnQrV0h2ZWFWc0Z4dUlDb2dQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBWeHVJQ29nUTNKbFlYUmxaQ0JDZVRvZ1dXRnZhR0ZwZUdsaGIxeHVJQ29nVlhCa1lYUmxPaUF5TURJeUxqTXVNVEZjYmlBcUwxeHVMeW9xWEc0Z0tpQnlZV1JwZFhNdWJHVnpjeUF0SU9XY2h1aW5rdWl1dnVlOXJpQnRhWGhwYm5nZzVZZTk1cFd3WEc0Z0tpQTlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVhHNGdLaUJEY21WaGRHVmtJRUo1T2lCWllXOW9ZV2w0YVdGdlhHNGdLaUJWY0dSaGRHVTZJREl3TWpRdU5DNHhObHh1SUNvdlhHNHZLaUE5UFQwOVBUMGc1WnlHNktlUzVxQzM1YnlQNks2KzU3MnU1WWU5NXBXd0lEMDlQVDA5UFNBcUwxeHVMbTkxZEd4cGJtVXRjbVZoWkdWeVgxOXdjbTluY21WemN5QjdYRzRnSUhCdmMybDBhVzl1T2lCbWFYaGxaRHRjYmlBZ2RHOXdPaUF3TzF4dUlDQnNaV1owT2lBd08xeHVJQ0I2TFdsdVpHVjRPaUF6TzF4dUlDQm9aV2xuYUhRNklEUndlRHRjYmlBZ2QybGtkR2c2SURFd01DVTdYRzRnSUdKaFkydG5jbTkxYm1RdFkyOXNiM0k2SUNNMU1EZGhabVU3WEc0Z0lITmpZV3hsT2lBd0lERTdYRzRnSUhSeVlXNXpabTl5YlMxdmNtbG5hVzQ2SUd4bFpuUTdYRzRnSUdGdWFXMWhkR2x2YmpvZ2IzVjBiR2x1WlMxeVpXRmtaWEl0Y0hKdlozSmxjM01nYkdsdVpXRnlPMXh1SUNCaGJtbHRZWFJwYjI0dGRHbHRaV3hwYm1VNklDMHRVSEp2WjNKbGMzTlVhVzFsYkdsdVpUdGNibjFjYmk1dmRYUnNhVzVsTFhKbFlXUmxjbDlmY0dGd1pYSWdlMXh1SUNCaWIzZ3RjMmhoWkc5M09pQXdJREFnTm5CNElERndlQ0FqWkdSa08xeHVJQ0J0WVhKbmFXNDZJREpsYlNCaGRYUnZPMXh1SUNCdFlYZ3RkMmxrZEdnNklERXlNREJ3ZUR0Y2JpQWdjR0ZrWkdsdVp6b2dNeTR5WlcwN1hHNGdJR0p2ZUMxemFYcHBibWM2SUdKdmNtUmxjaTFpYjNnN1hHNGdJR0poWTJ0bmNtOTFibVF0WTI5c2IzSTZJQ05tWm1ZN1hHNGdJRzkyWlhKbWJHOTNPaUJvYVdSa1pXNDdYRzU5WEc0dWIzVjBiR2x1WlMxeVpXRmtaWEpmWDNScGRHeGxJSHRjYmlBZ2JXRnlaMmx1T2lBd0xqWTNaVzBnTUR0Y2JpQWdkR1Y0ZEMxaGJHbG5iam9nWTJWdWRHVnlPMXh1SUNCbWIyNTBMV1poYldsc2VUb2dMV0Z3Y0d4bExYTjVjM1JsYlN3Z1FteHBibXROWVdOVGVYTjBaVzFHYjI1MExDQW5VMlZuYjJVZ1ZVa25MQ0FuVUdsdVowWmhibWNnVTBNbkxDQW5TR2x5WVdkcGJtOGdVMkZ1Y3lCSFFpY3NJQ2ROYVdOeWIzTnZablFnV1dGSVpXa25MQ0FuU0dWc2RtVjBhV05oSUU1bGRXVW5MQ0FuUVhCd2JHVWdRMjlzYjNJZ1JXMXZhbWtuTENBblUyVm5iMlVnVlVrZ1JXMXZhbWtuTENBblUyVm5iMlVnVlVrZ1UzbHRZbTlzSnl3Z1NHVnNkbVYwYVdOaExDQkJjbWxoYkN3Z2MyRnVjeTF6WlhKcFpqdGNiaUFnWm05dWRDMTNaV2xuYUhRNklHNXZjbTFoYkR0Y2JpQWdiR2x1WlMxb1pXbG5hSFE2SURFdU0yVnRPMXh1SUNCbWIyNTBMWE5wZW1VNklEUXVNbVZ0TzF4dUlDQnZkbVZ5Wm14dmR6b2dhR2xrWkdWdU8xeHVmVnh1TG05MWRHeHBibVV0Y21WaFpHVnlYMTloY25ScFkyeGxJQzV2ZFhSc2FXNWxMWEpsWVdSbGNsOWZjSEp2WjNKbGMzTWdlMXh1SUNCa2FYTndiR0Y1T2lCdWIyNWxPMXh1ZlZ4dUxtOTFkR3hwYm1VdGNtVmhaR1Z5WDJocFpHUmxiaUI3WEc0Z0lHUnBjM0JzWVhrNklHNXZibVU3WEc1OVhHNHViM1YwYkdsdVpTMXlaV0ZrWlhKZmFHbGtaR1Z1TG05MWRHeHBibVV0Y21WaFpHVnlYM05wWW14cGJtY2dlMXh1SUNCa2FYTndiR0Y1T2lCdWIyNWxJQ0ZwYlhCdmNuUmhiblE3WEc1OVhHNHViM1YwYkdsdVpTMXlaV0ZrWlhKZmFHbGtaR1Z1TG05MWRHeHBibVV0Y21WaFpHVnlYM05wWW14cGJtY3VkM0poY0hCbGNpNXdiM04wSUh0Y2JpQWdaR2x6Y0d4aGVUb2dibTl1WlR0Y2JuMWNiaTV2ZFhSc2FXNWxMWEpsWVdSbGNpMHRjbVZoWkdsdVp5QjdYRzRnSUdScGMzQnNZWGs2SUdKc2IyTnJPMXh1SUNCd2IzTnBkR2x2YmpvZ1ptbDRaV1E3WEc0Z0lIb3RhVzVrWlhnNklESTdYRzRnSUhSdmNEb2dNRHRjYmlBZ2JHVm1kRG9nTUR0Y2JpQWdkMmxrZEdnNklERXdNQ1U3WEc0Z0lHaGxhV2RvZERvZ01UQXdKVHRjYmlBZ2JXRnlaMmx1T2lBd08xeHVJQ0JpYjNndGMybDZhVzVuT2lCaWIzSmtaWEl0WW05NE8xeHVJQ0J3WVdSa2FXNW5PaUF6WlcwZ05HVnRPMXh1SUNCaVlXTnJaM0p2ZFc1a0xXTnZiRzl5T2lBalptRm1ZV1poTzF4dUlDQnpZM0p2Ykd3dGRHbHRaV3hwYm1VdGJtRnRaVG9nTFMxUWNtOW5jbVZ6YzFScGJXVnNhVzVsTzF4dUlDQnZkbVZ5Wm14dmR6b2djMk55YjJ4c08xeHVmVnh1UUd0bGVXWnlZVzFsY3lCdmRYUnNhVzVsTFhKbFlXUmxjaTF3Y205bmNtVnpjeUI3WEc0Z0lIUnZJSHRjYmlBZ0lDQnpZMkZzWlRvZ01TQXhPMXh1SUNCOVhHNTlYRzVBYldWa2FXRWdLRzFoZUMxM2FXUjBhRG9nTlRBd2NIZ3BJSHRjYmlBZ0xtOTFkR3hwYm1VdGNtVmhaR1Z5SUh0Y2JpQWdJQ0J2ZG1WeVpteHZkem9nYUdsa1pHVnVPMXh1SUNCOVhHNGdJQzV2ZFhSc2FXNWxMWEpsWVdSbGNpQXViM1YwYkdsdVpTMTBiMjlzWW1GeUlIdGNiaUFnSUNCa2FYTndiR0Y1T2lCbWJHVjRPMXh1SUNBZ0lHWnNaWGd0WkdseVpXTjBhVzl1T2lCeWIzYzdYRzRnSUNBZ1pteGxlQzEzY21Gd09pQnViM2R5WVhBN1hHNGdJQ0FnWVd4cFoyNHRhWFJsYlhNNklHTmxiblJsY2p0Y2JpQWdJQ0JoYkdsbmJpMXpaV3htT2lCaGRYUnZPMXh1SUNBZ0lIUnZjRG9nTVRBd0pUdGNiaUFnSUNCeWFXZG9kRG9nTUR0Y2JpQWdJQ0IwY21GdWMyWnZjbTA2SUhSeVlXNXpiR0YwWlZrb0xUUTRjSGdwTzF4dUlDQWdJSGRwWkhSb09pQXhNREFsTzF4dUlDQWdJR2hsYVdkb2REb2dORGh3ZUR0Y2JpQWdJQ0JpYjNndGMybDZhVzVuT2lCaWIzSmtaWEl0WW05NE8xeHVJQ0FnSUdKdmNtUmxjaTEwYjNBNklERndlQ0J6YjJ4cFpDQWpaR1JrTzF4dUlDQWdJR0poWTJ0bmNtOTFibVF0WTI5c2IzSTZJQ05tWm1ZN1hHNGdJQ0FnY0dGa1pHbHVaem9nTUNBeE5uQjRPMXh1SUNCOVhHNGdJQzV2ZFhSc2FXNWxMWEpsWVdSbGNpQXViM1YwYkdsdVpTMTBiMjlzWW1GeVgxOWlkWFIwYjI0Z2UxeHVJQ0FnSUdKdmNtUmxjaTF5WVdScGRYTTZJREE3WEc0Z0lDQWdabXhsZURvZ01UdGNiaUFnSUNCaWIzSmtaWEk2SUc1dmJtVTdYRzRnSUNBZ1ltOTRMWE5vWVdSdmR6b2dibTl1WlR0Y2JpQWdmVnh1SUNBdWIzVjBiR2x1WlMxeVpXRmtaWEl0TFhKbFlXUnBibWNnZTF4dUlDQWdJSEJoWkdScGJtYzZJREE3WEc0Z0lDQWdZbUZqYTJkeWIzVnVaQzFqYjJ4dmNqb2dJMlptWmp0Y2JpQWdJQ0JpYjNndGMybDZhVzVuT2lCaWIzSmtaWEl0WW05NE8xeHVJQ0I5WEc0Z0lDNXZkWFJzYVc1bExYSmxZV1JsY2w5ZmNHRndaWElnZTF4dUlDQWdJSEJ2YzJsMGFXOXVPaUJ5Wld4aGRHbDJaVHRjYmlBZ0lDQjZMV2x1WkdWNE9pQXhPMXh1SUNBZ0lHMWhjbWRwYmpvZ01EdGNiaUFnSUNCd1lXUmthVzVuT2lBd08xeHVJQ0FnSUdobGFXZG9kRG9nTVRBd0pUdGNiaUFnSUNCaWIzZ3RjMmhoWkc5M09pQnViMjVsTzF4dUlDQWdJRzkyWlhKbWJHOTNPaUJvYVdSa1pXNDdYRzRnSUgxY2JpQWdMbTkxZEd4cGJtVXRjbVZoWkdWeVgxOTBhWFJzWlNCN1hHNGdJQ0FnZDJocGRHVXRjM0JoWTJVNklHNXZkM0poY0R0Y2JpQWdJQ0IwWlhoMExXOTJaWEptYkc5M09pQmxiR3hwY0hOcGN6dGNiaUFnSUNCd2IzTnBkR2x2YmpvZ1lXSnpiMngxZEdVN1hHNGdJQ0FnZWkxcGJtUmxlRG9nTXp0Y2JpQWdJQ0IwYjNBNklEQTdYRzRnSUNBZ2JHVm1kRG9nTUR0Y2JpQWdJQ0J0WVhKbmFXNDZJREE3WEc0Z0lDQWdkMmxrZEdnNklERXdNQ1U3WEc0Z0lDQWdhR1ZwWjJoME9pQTBPSEI0TzF4dUlDQWdJR3hwYm1VdGFHVnBaMmgwT2lBME9IQjRPMXh1SUNBZ0lHSnZjbVJsY2kxaWIzUjBiMjA2SURGd2VDQnpiMnhwWkNBalpHUmtPMXh1SUNBZ0lHWnZiblF0YzJsNlpUb2dNUzQ0WlcwN1hHNGdJQ0FnWm05dWRDMTNaV2xuYUhRNklEUXdNRHRjYmlBZ0lDQmlZV05yWjNKdmRXNWtMV052Ykc5eU9pQWpabVptTzF4dUlDQWdJRzkyWlhKbWJHOTNPaUJvYVdSa1pXNDdYRzRnSUgxY2JpQWdMbTkxZEd4cGJtVXRjbVZoWkdWeVgxOWhjblJwWTJ4bElIdGNiaUFnSUNCdFlYSm5hVzQ2SURRNGNIZ2dNRHRjYmlBZ0lDQm9aV2xuYUhRNklHTmhiR01vTVRBd0pTQXRJRGsyY0hncE8xeHVJQ0FnSUhCaFpHUnBibWM2SURBZ01TNHlOV1Z0TzF4dUlDQWdJSE5qY205c2JDMTBhVzFsYkdsdVpTMXVZVzFsT2lBdExVMXZZbWxzWlZCeWIyZHlaWE56VkdsdFpXeHBibVU3WEc0Z0lDQWdiM1psY21ac2IzY3RlRG9nYUdsa1pHVnVPMXh1SUNBZ0lHOTJaWEptYkc5M0xYazZJSE5qY205c2JEdGNiaUFnZlZ4dUlDQXViM1YwYkdsdVpTMXlaV0ZrWlhKZlgyRnlkR2xqYkdVZ0xtOTFkR3hwYm1VdGNtVmhaR1Z5WDE5d2NtOW5jbVZ6Y3lCN1hHNGdJQ0FnZWkxcGJtUmxlRG9nTkR0Y2JpQWdJQ0JoYm1sdFlYUnBiMjQ2SUc5MWRHeHBibVV0Y21WaFpHVnlMWEJ5YjJkeVpYTnpJR3hwYm1WaGNqdGNiaUFnSUNCaGJtbHRZWFJwYjI0dGRHbHRaV3hwYm1VNklDMHRUVzlpYVd4bFVISnZaM0psYzNOVWFXMWxiR2x1WlR0Y2JpQWdJQ0JrYVhOd2JHRjVPaUJpYkc5amF6dGNiaUFnZlZ4dWZWeHVRRzFsWkdsaElIQnlhVzUwSUh0Y2JpQWdhSFJ0YkN4Y2JpQWdZbTlrZVNCN1hHNGdJQ0FnTHlvZzVvbVQ1WTJ3NTVxRTVaKzY1NkdBNWEyWDVMMlQ1YVNuNWJDUElDb3ZYRzRnSUNBZ1ptOXVkQzF6YVhwbE9pQXhNbkIwTzF4dUlDQWdJQzhxSU9hWXZ1ZWt1dWl1dnVlOXJ1YVdoK1d0bCttaW5PaUpzdVdTak9pRGpPYVpyK21pbk9pSnNpQXFMMXh1SUNBZ0lHSmhZMnRuY205MWJtUXRZMjlzYjNJNklDTm1abVk3WEc0Z0lDQWdZMjlzYjNJNklDTXpNek03WEc0Z0lDQWdhR1ZwWjJoME9pQnBibWwwYVdGc0lDRnBiWEJ2Y25SaGJuUTdYRzRnSUgxY2JpQWdMeW9nNks2KzU3MnU2Wk8rNW82bDVxQzM1YnlQSUNvdlhHNGdJR0U2YkdsdWF5eGNiaUFnWVRwMmFYTnBkR1ZrTEZ4dUlDQmhPbWh2ZG1WeUlIdGNiaUFnSUNCMFpYaDBMV1JsWTI5eVlYUnBiMjQ2SUhWdVpHVnliR2x1WlNBaGFXMXdiM0owWVc1ME8xeHVJQ0FnSUdOdmJHOXlPaUFqTlRBM1lXWmxPMXh1SUNCOVhHNGdJQzhxSU9tYWtPaVhqK1dxa3VTOWsrYWdoK2V0dmlBcUwxeHVJQ0IyYVdSbGJ5eGNiaUFnWVhWa2FXOGdlMXh1SUNBZ0lHUnBjM0JzWVhrNklHNXZibVVnSVdsdGNHOXlkR0Z1ZER0Y2JpQWdmVnh1SUNBdktpRG5vYTdrdjUzb29ham1vTHpsbktqbWlaUGxqYkRtbDdibm1vVG92cm5tb1libGtvemxyN25wdlpEbWxybmx2SS9tdUlYbW1iQWdLaTljYmlBZ2RHRmliR1VnZTF4dUlDQWdJSGRwWkhSb09pQXhNREFsTzF4dUlDQWdJR0p2Y21SbGNpMWpiMnhzWVhCelpUb2dZMjlzYkdGd2MyVTdYRzRnSUgxY2JpQWdkR2dzWEc0Z0lIUmtJSHRjYmlBZ0lDQmliM0prWlhJNklERndlQ0J6YjJ4cFpDQWpaR05rWm1VMk8xeHVJQ0FnSUhCaFpHUnBibWM2SURod2VDQXlNSEI0TzF4dUlDQjlYRzRnSUM1dmRYUnNhVzVsTFcxbGMzTmhaMlVzWEc0Z0lDNXZkWFJzYVc1bExYUnZiMnhpWVhJZ2UxeHVJQ0FnSUM4cUlPbWFrT2lYaitTNmh1VzNwZVdGdCthZ2orV1NqT1Mvb2VhQnIrYVBrT2VrdXVhaGhpQXFMMXh1SUNBZ0lHUnBjM0JzWVhrNklHNXZibVVnSVdsdGNHOXlkR0Z1ZER0Y2JpQWdmVnh1SUNBdWIzVjBiR2x1WlMxeVpXRmtaWElnZTF4dUlDQWdJR1JwYzNCc1lYazZJR0pzYjJOcklDRnBiWEJ2Y25SaGJuUTdYRzRnSUNBZ2IzWmxjbVpzYjNjNklHaHBaR1JsYmp0Y2JpQWdJQ0F2S2lEbGo1Ym10b2prdW9ibnU1M2xyN25scnBya3ZZMGdLaTljYmlBZ0lDQXZLaURwbXBEb2w0L3BtSVhvcjd2b3Y1dmx1cWJtbmFFZ0tpOWNiaUFnSUNBdktpRG1pWlBsamJEbWw3Ymt1STNtbUw3bnBMcm1yYVBtbG9jZ1JFOU5JT2VhaE9tWXRPVzlzZWFWaU9hZW5DQXFMMXh1SUNBZ0lDOHFJT2FKZ09hY2llYVdoK2Vyb09XR2hlV3V1U0JFVDAwZzU1dTQ1WVd6NTVxRTZZSzc1YkdGNklxQzU0SzU2WU85NlpxUTZKZVA1THFHSUNvdlhHNGdJSDFjYmlBZ0xtOTFkR3hwYm1VdGNtVmhaR1Z5WDE5MGFYUnNaU0I3WEc0Z0lDQWdiV0Z5WjJsdU9pQXhNeTQwY0hRZ01DQXlPSEIwSUNGcGJYQnZjblJoYm5RN1hHNGdJQ0FnZEdWNGRDMWhiR2xuYmpvZ1kyVnVkR1Z5SUNGcGJYQnZjblJoYm5RN1hHNGdJQ0FnWm05dWRDMXphWHBsT2lBek1uQjBJQ0ZwYlhCdmNuUmhiblE3WEc0Z0lIMWNiaUFnTG05MWRHeHBibVV0Y21WaFpHVnlMUzF5WldGa2FXNW5JSHRjYmlBZ0lDQndiM05wZEdsdmJqb2djbVZzWVhScGRtVWdJV2x0Y0c5eWRHRnVkRHRjYmlBZ0lDQm9aV2xuYUhRNklHRjFkRzhnSVdsdGNHOXlkR0Z1ZER0Y2JpQWdJQ0J3WVdSa2FXNW5PaUF3SUNGcGJYQnZjblJoYm5RN1hHNGdJQ0FnWW1GamEyZHliM1Z1WkMxamIyeHZjam9nSTJabVpqdGNiaUFnSUNCdmRtVnlabXh2ZHpvZ2FHbGtaR1Z1SUNGcGJYQnZjblJoYm5RN1hHNGdJSDFjYmlBZ0xtOTFkR3hwYm1VdGNtVmhaR1Z5WDE5d2NtOW5jbVZ6Y3lCN1hHNGdJQ0FnWkdsemNHeGhlVG9nYm05dVpTQWhhVzF3YjNKMFlXNTBPMXh1SUNCOVhHNGdJQzV2ZFhSc2FXNWxMWEpsWVdSbGNsOWZjR0Z3WlhJZ2UxeHVJQ0FnSUdKdmVDMXphR0ZrYjNjNklHNXZibVU3WEc0Z0lIMWNiaUFnTG05MWRHeHBibVV0Y21WaFpHVnlJSEJ5WlNCN1hHNGdJQ0FnY0dGa1pHbHVaem9nTVdWdElDRnBiWEJ2Y25SaGJuUTdYRzRnSUNBZ1ltOXlaR1Z5T2lBeGNIZ2djMjlzYVdRZ0kyUmtaQ0FoYVcxd2IzSjBZVzUwTzF4dUlDQWdJR0p2Y21SbGNpMXlZV1JwZFhNNklEUndlQ0FoYVcxd2IzSjBZVzUwTzF4dUlDQjlYRzRnSUM1dmRYUnNhVzVsTFhKbFlXUmxjaUJ3Y21Vc1hHNGdJQzV2ZFhSc2FXNWxMWEpsWVdSbGNpQmpiMlJsSUh0Y2JpQWdJQ0JpWVdOclozSnZkVzVrTFdOdmJHOXlPaUFqWm1abUlDRnBiWEJ2Y25SaGJuUTdYRzRnSUgxY2JpQWdMbTkxZEd4cGJtVXRjbVZoWkdWeUlIUmhZbXhsTEZ4dUlDQXViM1YwYkdsdVpTMXlaV0ZrWlhJZ2FXMW5MRnh1SUNBdWIzVjBiR2x1WlMxeVpXRmtaWElnYzNabklIdGNiaUFnSUNCaWNtVmhheTFwYm5OcFpHVTZJR0YyYjJsa08xeHVJQ0I5WEc0Z0lDNXZkWFJzYVc1bExYSmxZV1JsY2w5emFXSnNhVzVuSUh0Y2JpQWdJQ0JrYVhOd2JHRjVPaUJ1YjI1bElDRnBiWEJ2Y25SaGJuUTdYRzRnSUgxY2JuMWNiaTV2ZFhSc2FXNWxMWFJ2YjJ4aVlYSWdlMXh1SUNCd2IzTnBkR2x2YmpvZ1ptbDRaV1E3WEc0Z0lIb3RhVzVrWlhnNklEazVPVGs1TzF4dUlDQnRZWEpuYVc0NklEQTdYRzRnSUhSeVlXNXphWFJwYjI0dFpIVnlZWFJwYjI0NklEQXVNM003WEc0Z0lHOTJaWEptYkc5M09pQm9hV1JrWlc0N1hHNTlYRzR1YjNWMGJHbHVaUzEwYjI5c1ltRnlYMTlpZFhSMGIyNGdlMXh1SUNCaWIzZ3RjMmhoWkc5M09pQXdJREFnTm5CNElERndlQ0FqWkdOa1ptVTJPMXh1SUNCd2IzTnBkR2x2YmpvZ2NtVnNZWFJwZG1VN1hHNGdJSG90YVc1a1pYZzZJREU3WEc0Z0lHMWhjbWRwYmpvZ01UQndlRHRjYmlBZ2QybGtkR2c2SURNMmNIZzdYRzRnSUdobGFXZG9kRG9nTXpad2VEdGNiaUFnWW05eVpHVnlPaUF4Y0hnZ2MyOXNhV1FnSTJSalpHWmxOanRjYmlBZ1ltOXlaR1Z5TFhKaFpHbDFjem9nTTNCNE8xeHVJQ0JpYjNndGMybDZhVzVuT2lCaWIzSmtaWEl0WW05NE8xeHVJQ0JpWVdOclozSnZkVzVrTFdOdmJHOXlPaUFqWm1abU8xeHVJQ0JqZFhKemIzSTZJSEJ2YVc1MFpYSTdYRzRnSUhSbGVIUXRZV3hwWjI0NklHTmxiblJsY2p0Y2JpQWdZMjlzYjNJNklDTTVPVGs3WEc0Z0lIUnlZVzV6YVhScGIyNDZJR0ZzYkNBd0xqTnpJREF1TVhNZ1pXRnpaUzFwYmkxdmRYUTdYRzRnSUc5MlpYSm1iRzkzT2lCb2FXUmtaVzQ3WEc1OVhHNHViM1YwYkdsdVpTMTBiMjlzWW1GeVgxOWlkWFIwYjI0NmFHOTJaWElnZTF4dUlDQmpiMnh2Y2pvZ0l6QTFPRGswTWp0Y2JpQWdZbTl5WkdWeUxXTnZiRzl5T2lBak1EVTRPVFF5TzF4dUlDQjBjbUZ1YzJadmNtMDZJSE5qWVd4bEtERXVNelVwTzF4dWZWeHVMbTkxZEd4cGJtVXRkRzl2YkdKaGNsOWZZblYwZEc5dUxtaHBaR1VnZTF4dUlDQmthWE53YkdGNU9pQnViMjVsTzF4dWZWeHVMbTkxZEd4cGJtVXRkRzl2YkdKaGNsOWZZVzVqYUc5eU9teHBibXNzWEc0dWIzVjBiR2x1WlMxMGIyOXNZbUZ5WDE5aGJtTm9iM0k2ZG1semFYUmxaQ3hjYmk1dmRYUnNhVzVsTFhSdmIyeGlZWEpmWDJGdVkyaHZjanBvYjNabGNpQjdYRzRnSUdOdmJHOXlPaUFqT1RrNU8xeHVJQ0IwWlhoMExXUmxZMjl5WVhScGIyNDZJRzV2Ym1VN1hHNTlYRzR1YjNWMGJHbHVaUzEwYjI5c1ltRnlYMTloYm1Ob2IzSTZhRzkyWlhJZ2UxeHVJQ0JqYjJ4dmNqb2dJekExT0RrME1qdGNibjFjYmk1dmRYUnNhVzVsTFhSdmIyeGlZWEpmWDJsamIyNGdlMXh1SUNCd2IzTnBkR2x2YmpvZ1lXSnpiMngxZEdVN1hHNGdJSG90YVc1a1pYZzZJREk3WEc0Z0lIUnZjRG9nTlRBbE8xeHVJQ0JzWldaME9pQTFNQ1U3WEc0Z0lIZHBaSFJvT2lBeU1IQjRPMXh1SUNCb1pXbG5hSFE2SURJd2NIZzdYRzRnSUhSeVlXNXpabTl5YlRvZ2RISmhibk5zWVhSbEtDMDFNQ1VzSUMwMU1DVXBPMXh1SUNCbWFXeHNPaUJqZFhKeVpXNTBZMjlzYjNJN1hHNGdJRzkyWlhKbWJHOTNPaUJvYVdSa1pXNDdYRzU5WEc0dWIzVjBiR2x1WlMxMGIyOXNZbUZ5WDJGamRHbDJaUzV2ZFhSc2FXNWxMWFJ2YjJ4aVlYSmZYMkoxZEhSdmJpQjdYRzRnSUdOdmJHOXlPaUFqWm1abU8xeHVJQ0JpWVdOclozSnZkVzVrTFdOdmJHOXlPaUFqTURVNE9UUXlPMXh1SUNCaWIzSmtaWEl0WTI5c2IzSTZJQ013TlRnNU5ESTdYRzU5WEc0dWIzVjBiR2x1WlMxMGIyOXNZbUZ5WDJGamRHbDJaUzV2ZFhSc2FXNWxMWFJ2YjJ4aVlYSmZYMkoxZEhSdmJqcG9iM1psY2lCN1hHNGdJR052Ykc5eU9pQWpabVptTzF4dWZWeHVMbTkxZEd4cGJtVXRkRzl2YkdKaGNsOWhZM1JwZG1VZ0xtOTFkR3hwYm1VdGRHOXZiR0poY2w5ZllXNWphRzl5T214cGJtc3NYRzR1YjNWMGJHbHVaUzEwYjI5c1ltRnlYMkZqZEdsMlpTQXViM1YwYkdsdVpTMTBiMjlzWW1GeVgxOWhibU5vYjNJNmRtbHphWFJsWkN4Y2JpNXZkWFJzYVc1bExYUnZiMnhpWVhKZllXTjBhWFpsSUM1dmRYUnNhVzVsTFhSdmIyeGlZWEpmWDJGdVkyaHZjanBvYjNabGNpQjdYRzRnSUdOdmJHOXlPaUFqWm1abU8xeHVmVnh1TG05MWRHeHBibVV0ZEc5dmJHSmhjbDl5YjNWdVpHVmtMbTkxZEd4cGJtVXRkRzl2YkdKaGNsOWZZblYwZEc5dUlIdGNiaUFnWW05eVpHVnlMWEpoWkdsMWN6b2dNVGh3ZUR0Y2JuMWNiaTV2ZFhSc2FXNWxMWFJ2YjJ4aVlYSmZaR2x6WVdKc1pXUXViM1YwYkdsdVpTMTBiMjlzWW1GeVgxOWhibU5vYjNJNmJHbHVheXhjYmk1dmRYUnNhVzVsTFhSdmIyeGlZWEpmWkdsellXSnNaV1FnTG05MWRHeHBibVV0ZEc5dmJHSmhjbDlmWVc1amFHOXlPbXhwYm1zc1hHNHViM1YwYkdsdVpTMTBiMjlzWW1GeVgyUnBjMkZpYkdWa0xtOTFkR3hwYm1VdGRHOXZiR0poY2w5ZllXNWphRzl5T25acGMybDBaV1FzWEc0dWIzVjBiR2x1WlMxMGIyOXNZbUZ5WDJScGMyRmliR1ZrSUM1dmRYUnNhVzVsTFhSdmIyeGlZWEpmWDJGdVkyaHZjanAyYVhOcGRHVmtMRnh1TG05MWRHeHBibVV0ZEc5dmJHSmhjbDlrYVhOaFlteGxaQzV2ZFhSc2FXNWxMWFJ2YjJ4aVlYSmZYMkZ1WTJodmNqcG9iM1psY2l4Y2JpNXZkWFJzYVc1bExYUnZiMnhpWVhKZlpHbHpZV0pzWldRZ0xtOTFkR3hwYm1VdGRHOXZiR0poY2w5ZllXNWphRzl5T21odmRtVnlMRnh1TG05MWRHeHBibVV0ZEc5dmJHSmhjbDlrYVhOaFlteGxaQzV2ZFhSc2FXNWxMWFJ2YjJ4aVlYSmZYMkoxZEhSdmJpeGNiaTV2ZFhSc2FXNWxMWFJ2YjJ4aVlYSmZaR2x6WVdKc1pXUWdMbTkxZEd4cGJtVXRkRzl2YkdKaGNsOWZZblYwZEc5dUlIdGNiaUFnWTNWeWMyOXlPaUJ1YjNRdFlXeHNiM2RsWkR0Y2JpQWdZMjlzYjNJNklDTTVPVGs3WEc0Z0lHSnZjbVJsY2kxamIyeHZjam9nSXprNU9UdGNibjFjYmk1dmRYUnNhVzVsTFhSdmIyeGlZWEpmWkdsellXSnNaV1F1YjNWMGJHbHVaUzEwYjI5c1ltRnlYMTloYm1Ob2IzSTZiR2x1YXpwb2IzWmxjaXhjYmk1dmRYUnNhVzVsTFhSdmIyeGlZWEpmWkdsellXSnNaV1FnTG05MWRHeHBibVV0ZEc5dmJHSmhjbDlmWVc1amFHOXlPbXhwYm1zNmFHOTJaWElzWEc0dWIzVjBiR2x1WlMxMGIyOXNZbUZ5WDJScGMyRmliR1ZrTG05MWRHeHBibVV0ZEc5dmJHSmhjbDlmWVc1amFHOXlPblpwYzJsMFpXUTZhRzkyWlhJc1hHNHViM1YwYkdsdVpTMTBiMjlzWW1GeVgyUnBjMkZpYkdWa0lDNXZkWFJzYVc1bExYUnZiMnhpWVhKZlgyRnVZMmh2Y2pwMmFYTnBkR1ZrT21odmRtVnlMRnh1TG05MWRHeHBibVV0ZEc5dmJHSmhjbDlrYVhOaFlteGxaQzV2ZFhSc2FXNWxMWFJ2YjJ4aVlYSmZYMkZ1WTJodmNqcG9iM1psY2pwb2IzWmxjaXhjYmk1dmRYUnNhVzVsTFhSdmIyeGlZWEpmWkdsellXSnNaV1FnTG05MWRHeHBibVV0ZEc5dmJHSmhjbDlmWVc1amFHOXlPbWh2ZG1WeU9taHZkbVZ5TEZ4dUxtOTFkR3hwYm1VdGRHOXZiR0poY2w5a2FYTmhZbXhsWkM1dmRYUnNhVzVsTFhSdmIyeGlZWEpmWDJKMWRIUnZianBvYjNabGNpeGNiaTV2ZFhSc2FXNWxMWFJ2YjJ4aVlYSmZaR2x6WVdKc1pXUWdMbTkxZEd4cGJtVXRkRzl2YkdKaGNsOWZZblYwZEc5dU9taHZkbVZ5SUh0Y2JpQWdZMjlzYjNJNklDTTVPVGs3WEc0Z0lHSnZjbVJsY2kxamIyeHZjam9nSXprNU9UdGNibjFjYmk1dmRYUnNhVzVsTFhSdmIyeGlZWEpmWkdsellXSnNaV1F1YjNWMGJHbHVaUzEwYjI5c1ltRnlYMTlpZFhSMGIyNHNYRzR1YjNWMGJHbHVaUzEwYjI5c1ltRnlYMlJwYzJGaWJHVmtJQzV2ZFhSc2FXNWxMWFJ2YjJ4aVlYSmZYMkoxZEhSdmJpQjdYRzRnSUdKaFkydG5jbTkxYm1RdFkyOXNiM0k2SUNObU5XWTFaalU3WEc1OVhHNHViM1YwYkdsdVpTMTBiMjlzWW1GeVgzUjBZaXhjYmk1dmRYUnNhVzVsTFhSdmIyeGlZWEpmWW5SMElIdGNiaUFnYkdWbWREb2dOVEFsTzF4dUlDQjBjbUZ1YzJadmNtMDZJSFJ5WVc1emJHRjBaVmdvTFRVd0pTazdYRzU5WEc0dWIzVjBiR2x1WlMxMGIyOXNZbUZ5WDNSMFlpQXViM1YwYkdsdVpTMTBiMjlzWW1GeVgxOWlkWFIwYjI0c1hHNHViM1YwYkdsdVpTMTBiMjlzWW1GeVgySjBkQ0F1YjNWMGJHbHVaUzEwYjI5c1ltRnlYMTlpZFhSMGIyNGdlMXh1SUNCa2FYTndiR0Y1T2lCcGJteHBibVV0WW14dlkyczdYRzU5WEc0dWIzVjBiR2x1WlMxMGIyOXNZbUZ5WDNSMFlpQjdYRzRnSUhSdmNEb2dNVEp3ZUR0Y2JuMWNiaTV2ZFhSc2FXNWxMWFJ2YjJ4aVlYSmZkSFJpTG05MWRHeHBibVV0ZEc5dmJHSmhjbDlvYVdSa1pXNGdlMXh1SUNCMGIzQTZJQzAxTm5CNE8xeHVmVnh1TG05MWRHeHBibVV0ZEc5dmJHSmhjbDlpZEhRZ2UxeHVJQ0JpYjNSMGIyMDZJREV5Y0hnN1hHNTlYRzR1YjNWMGJHbHVaUzEwYjI5c1ltRnlYMkowZEM1dmRYUnNhVzVsTFhSdmIyeGlZWEpmYUdsa1pHVnVJSHRjYmlBZ1ltOTBkRzl0T2lBdE5UWndlRHRjYm4xY2JpNXZkWFJzYVc1bExYUnZiMnhpWVhKZmNuUnNMRnh1TG05MWRHeHBibVV0ZEc5dmJHSmhjbDlzZEhJZ2UxeHVJQ0IwY21GdWMyWnZjbTA2SUhSeVlXNXpiR0YwWlZrb0xUVXdKU2s3WEc0Z0lIZHBaSFJvT2lBMU5uQjRPMXh1ZlZ4dUxtOTFkR3hwYm1VdGRHOXZiR0poY2w5eWRHd2dlMXh1SUNCMGIzQTZJRFV3SlR0Y2JpQWdjbWxuYUhRNklERXljSGc3WEc1OVhHNHViM1YwYkdsdVpTMTBiMjlzWW1GeVgzSjBiQzV2ZFhSc2FXNWxMWFJ2YjJ4aVlYSmZhR2xrWkdWdUlIdGNiaUFnY21sbmFIUTZJQzA0Tm5CNE8xeHVmVnh1TG05MWRHeHBibVV0ZEc5dmJHSmhjbDlzZEhJZ2UxeHVJQ0IwYjNBNklEVXdKVHRjYmlBZ2JHVm1kRG9nTVRKd2VEdGNibjFjYmk1dmRYUnNhVzVsTFhSdmIyeGlZWEpmYkhSeUxtOTFkR3hwYm1VdGRHOXZiR0poY2w5b2FXUmtaVzRnZTF4dUlDQnNaV1owT2lBdE9EWndlRHRjYm4xY2JpNXZkWFJzYVc1bExYUnZiMnhpWVhKZmRIUmlJQzV2ZFhSc2FXNWxMWFJ2YjJ4aVlYSmZYMkoxZEhSdmJpNXZkWFJzYVc1bExYUnZiMnhpWVhKZmFHbGtaR1Z1TEZ4dUxtOTFkR3hwYm1VdGRHOXZiR0poY2w5eWRHd2dMbTkxZEd4cGJtVXRkRzl2YkdKaGNsOWZZblYwZEc5dUxtOTFkR3hwYm1VdGRHOXZiR0poY2w5b2FXUmtaVzRzWEc0dWIzVjBiR2x1WlMxMGIyOXNZbUZ5WDJKMGRDQXViM1YwYkdsdVpTMTBiMjlzWW1GeVgxOWlkWFIwYjI0dWIzVjBiR2x1WlMxMGIyOXNZbUZ5WDJocFpHUmxiaXhjYmk1dmRYUnNhVzVsTFhSdmIyeGlZWEpmYkhSeUlDNXZkWFJzYVc1bExYUnZiMnhpWVhKZlgySjFkSFJ2Ymk1dmRYUnNhVzVsTFhSdmIyeGlZWEpmYUdsa1pHVnVJSHRjYmlBZ1pHbHpjR3hoZVRvZ2JtOXVaVHRjYm4xY2JpSXNJaThxSUQwOVBUMDlQVDA5UFQwZ2FXTnZiaTUwYUdWdFpTQXRJSE4yWnlEbG03N21vSWZubW9UbW9MZmx2SThnUFQwOVBUMDlQVDA5UFNBcUwxeHlYRzR1YjNWMGJHbHVaUzFwWTI5dUlIdGNjbHh1SUNCd2IzTnBkR2x2YmpvZ2NtVnNZWFJwZG1VN1hISmNiaUFnZWkxcGJtUmxlRG9nTVR0Y2NseHVJQ0JrYVhOd2JHRjVPaUJwYm14cGJtVXRZbXh2WTJzN1hISmNiaUFnZG1WeWRHbGpZV3d0WVd4cFoyNDZJRzFwWkdSc1pUdGNjbHh1SUNCM2FXUjBhRG9nTVdWdE8xeHlYRzRnSUdobGFXZG9kRG9nTVdWdE8xeHlYRzRnSUc5MlpYSm1iRzkzT2lCb2FXUmtaVzQ3WEhKY2JseHlYRzRnSUNaZlgzTjJaeUI3WEhKY2JpQWdJQ0J3YjNOcGRHbHZiam9nWVdKemIyeDFkR1U3WEhKY2JpQWdJQ0I2TFdsdVpHVjRPaUF5TzF4eVhHNGdJQ0FnZEc5d09pQTFNQ1U3WEhKY2JpQWdJQ0JzWldaME9pQTFNQ1U3WEhKY2JpQWdJQ0IzYVdSMGFEb2dNV1Z0TzF4eVhHNGdJQ0FnYUdWcFoyaDBPaUF4WlcwN1hISmNiaUFnSUNCbWFXeHNPaUJqZFhKeVpXNTBZMjlzYjNJN1hISmNiaUFnSUNCMGNtRnVjMlp2Y20wNklIUnlZVzV6YkdGMFpTZ3ROVEFsTENBdE5UQWxLVHRjY2x4dUlDQWdJRzkyWlhKbWJHOTNPaUJvYVdSa1pXNDdYSEpjYmlBZ2ZWeHlYRzVjY2x4dUlDQW1YMmhwWkdSbGJpQjdYSEpjYmlBZ0lDQmthWE53YkdGNU9pQnViMjVsTzF4eVhHNGdJSDFjY2x4dWZWeHlYRzRpTENJdktpQTlQVDA5UFNCVFkzSnZiR3hpWVhJZ1BUMDlQVDBnS2k5Y2NseHVPam90ZDJWaWEybDBMWE5qY205c2JHSmhjaUI3WEhKY2JpQWdkMmxrZEdnNklEZHdlRHRjY2x4dUlDQm9aV2xuYUhRNklEZHdlRHRjY2x4dUlDQXRkMlZpYTJsMExXSnZjbVJsY2kxeVlXUnBkWE02SURWd2VEdGNjbHh1WEhKY2JpQWdKaTEwY21GamF5MXdhV1ZqWlNCN1hISmNiaUFnSUNBdGQyVmlhMmwwTFdKdmNtUmxjaTF5WVdScGRYTTZJRFZ3ZUR0Y2NseHVJQ0I5WEhKY2JseHlYRzRnSUNZdGRHaDFiV0lnZTF4eVhHNGdJQ0FnSmpwMlpYSjBhV05oYkNCN1hISmNiaUFnSUNBZ0lHSmhZMnRuY205MWJtUXRZMjlzYjNJNklISm5ZbUVvTUN3Z01Dd2dNQ3dnTUM0eU5TazdYSEpjYmlBZ0lDQWdJQzEzWldKcmFYUXRZbTl5WkdWeUxYSmhaR2wxY3pvZ05YQjRPMXh5WEc0Z0lDQWdmVnh5WEc1Y2NseHVJQ0FnSUNZNmFHOXlhWHB2Ym5SaGJDQjdYSEpjYmlBZ0lDQWdJR0poWTJ0bmNtOTFibVF0WTI5c2IzSTZJSEpuWW1Fb01Dd2dNQ3dnTUN3Z01DNHlOU2s3WEhKY2JpQWdJQ0FnSUMxM1pXSnJhWFF0WW05eVpHVnlMWEpoWkdsMWN6b2dOWEI0TzF4eVhHNGdJQ0FnZlZ4eVhHNWNjbHh1SUNBZ0lDWTZhRzkyWlhJZ2UxeHlYRzRnSUNBZ0lDQmlZV05yWjNKdmRXNWtMV052Ykc5eU9pQnlaMkpoS0RBc0lEQXNJREFzSURBdU16VXBPMXh5WEc0Z0lDQWdmVnh5WEc0Z0lIMWNjbHh1WEhKY2JpQWdKanBvYjNabGNpQjdYSEpjYmlBZ0lDQmlZV05yWjNKdmRXNWtMV052Ykc5eU9pQnlaMkpoS0RBc0lEQXNJREFzSURBdU1UVXBPMXh5WEc0Z0lIMWNjbHh1ZlZ4eVhHNGlMQ0pBYVcxd2IzSjBJQ2N1TGk5MGFHVnRaUzlqYjJ4dmNuTW5PMXh5WEc1Y2NseHVMbTkxZEd4cGJtVXRhR1ZoWkdsdVp5QjdYSEpjYmlBZ2NHOXphWFJwYjI0NklISmxiR0YwYVhabE8xeHlYRzRnSUhvdGFXNWtaWGc2SURFN1hISmNiaUFnYjNabGNtWnNiM2M2SUdocFpHUmxianRjY2x4dVhISmNiaUFnSmw5ZllXNWphRzl5SUh0Y2NseHVJQ0FnSUdScGMzQnNZWGs2SUc1dmJtVTdYSEpjYmx4eVhHNGdJQ0FnSmpwc2FXNXJMRnh5WEc0Z0lDQWdKanAyYVhOcGRHVmtMRnh5WEc0Z0lDQWdKanBvYjNabGNpQjdYSEpjYmlBZ0lDQWdJR052Ykc5eU9pQkFabTkxY25Sb1gzUmxlSFJmWTI5c2IzSTdYSEpjYmlBZ0lDQWdJSFJsZUhRdFpHVmpiM0poZEdsdmJqb2dibTl1WlR0Y2NseHVJQ0FnSUgxY2NseHVYSEpjYmlBZ0lDQW1PbWh2ZG1WeUlIdGNjbHh1SUNBZ0lDQWdZMjlzYjNJNklFQndjbWx0WVhKNVgyTnZiRzl5TzF4eVhHNGdJQ0FnZlZ4eVhHNGdJSDFjY2x4dVhISmNiaUFnSmpwb2IzWmxjaUI3WEhKY2JpQWdJQ0F1YjNWMGJHbHVaUzFvWldGa2FXNW5YMTloYm1Ob2IzSWdlMXh5WEc0Z0lDQWdJQ0JrYVhOd2JHRjVPaUJwYm14cGJtVXRZbXh2WTJzN1hISmNiaUFnSUNCOVhISmNiaUFnZlZ4eVhHNWNjbHh1SUNBbVgzTjBZWEowSUh0Y2NseHVJQ0FnSUNZNmFHOTJaWElnZTF4eVhHNGdJQ0FnSUNCdmRtVnlabXh2ZHpvZ2RtbHphV0pzWlR0Y2NseHVJQ0FnSUgxY2NseHVYSEpjYmlBZ0lDQXViM1YwYkdsdVpTMW9aV0ZrYVc1blgxOWhibU5vYjNJZ2UxeHlYRzRnSUNBZ0lDQndiM05wZEdsdmJqb2dZV0p6YjJ4MWRHVTdYSEpjYmlBZ0lDQWdJSG90YVc1a1pYZzZJREk3WEhKY2JpQWdJQ0FnSUhSdmNEb2dOVEFsTzF4eVhHNGdJQ0FnSUNCMGNtRnVjMlp2Y20wNklIUnlZVzV6YkdGMFpWa29MVFV3SlNrN1hISmNiaUFnSUNBZ0lHeGxablE2SUMweFpXMDdYSEpjYmlBZ0lDQjlYSEpjYmlBZ2ZWeHlYRzU5WEhKY2JpSXNJa0JwYlhCdmNuUWdKeTR1TDNSb1pXMWxMM1poY21saFlteGxjeWM3WEhKY2JrQnBiWEJ2Y25RZ0p5NHVMM1JvWlcxbEwyTnZiRzl5Y3ljN1hISmNia0JwYlhCdmNuUWdKeTR1TDNSb1pXMWxMM05vWVdSdmR5YzdYSEpjYmx4eVhHNHViM1YwYkdsdVpTMWtjbUYzWlhJZ2UxeHlYRzRnSUhCdmMybDBhVzl1T2lCeVpXeGhkR2wyWlR0Y2NseHVJQ0I2TFdsdVpHVjRPaUF0TVR0Y2NseHVJQ0IwYjNBNklEQTdYSEpjYmlBZ2JHVm1kRG9nTUR0Y2NseHVJQ0J0WVhKbmFXNDZJREE3WEhKY2JpQWdkMmxrZEdnNklERXdNQ1U3WEhKY2JpQWdhR1ZwWjJoME9pQXhNREFsTzF4eVhHNGdJR0p2ZUMxemFYcHBibWM2SUdKdmNtUmxjaTFpYjNnN1hISmNiaUFnZG1semFXSnBiR2wwZVRvZ2FHbGtaR1Z1TzF4eVhHNGdJRzkyWlhKbWJHOTNPaUJvYVdSa1pXNDdYSEpjYmx4eVhHNGdJQ1pmWDIxdlpHRnNJSHRjY2x4dUlDQWdJQzV6YUdGa2IzZGZiR2xuYUhSZmNtVm5kV3hoY2lncE8xeHlYRzRnSUNBZ1pHbHpjR3hoZVRvZ1pteGxlRHRjY2x4dUlDQWdJR1pzWlhndFpHbHlaV04wYVc5dU9pQmpiMngxYlc0N1hISmNiaUFnSUNCbWJHVjRMWGR5WVhBNklHNXZkM0poY0R0Y2NseHVJQ0FnSUhCdmMybDBhVzl1T2lCaFluTnZiSFYwWlR0Y2NseHVJQ0FnSUhvdGFXNWtaWGc2SURJeE8xeHlYRzRnSUNBZ2FHVnBaMmgwT2lBeE1EQWxPMXh5WEc0Z0lDQWdZbUZqYTJkeWIzVnVaQzFqYjJ4dmNqb2dRSGRvYVhSbE8xeHlYRzRnSUNBZ2RISmhibk5wZEdsdmJpMWtkWEpoZEdsdmJqb2dNQzQwY3p0Y2NseHVJQ0FnSUc5MlpYSm1iRzkzT2lCb2FXUmtaVzQ3WEhKY2JpQWdmVnh5WEc1Y2NseHVJQ0FtWDE5b1pXRmtaWElzWEhKY2JpQWdKbDlmYldGcGJpeGNjbHh1SUNBbVgxOW1iMjkwWlhJZ2UxeHlYRzRnSUNBZ2QybGtkR2c2SURFd01DVTdYSEpjYmlBZ0lDQmliM2d0YzJsNmFXNW5PaUJpYjNKa1pYSXRZbTk0TzF4eVhHNGdJSDFjY2x4dVhISmNiaUFnSmw5ZmFHVmhaR1Z5TEZ4eVhHNGdJQ1pmWDJadmIzUmxjaUI3WEhKY2JpQWdJQ0JtYkdWNExYTm9jbWx1YXpvZ01EdGNjbHh1SUNCOVhISmNibHh5WEc0Z0lDWmZYM1JwZEd4bExGeHlYRzRnSUNaZlgyMWhhVzRzWEhKY2JpQWdKbDlmWm05dmRHVnlJSHRjY2x4dUlDQWdJSEJoWkdScGJtYzZJREFnTVRad2VEdGNjbHh1SUNCOVhISmNibHh5WEc0Z0lDWmZYMmhsWVdSbGNpeGNjbHh1SUNBbVgxOTBhWFJzWlNCN1hISmNiaUFnSUNCd2IzTnBkR2x2YmpvZ2NtVnNZWFJwZG1VN1hISmNiaUFnSUNCNkxXbHVaR1Y0T2lBeE8xeHlYRzRnSUNBZ2JXRnlaMmx1T2lBd0lHRjFkRzg3WEhKY2JpQWdJQ0JvWldsbmFIUTZJRFV5Y0hnN1hISmNiaUFnSUNCc2FXNWxMV2hsYVdkb2REb2dOVEp3ZUR0Y2NseHVJQ0FnSUc5MlpYSm1iRzkzT2lCb2FXUmtaVzQ3WEhKY2JpQWdmVnh5WEc1Y2NseHVJQ0FtWDE5MGFYUnNaU0I3WEhKY2JpQWdJQ0JtYjI1MExYTnBlbVU2SURFMmNIZzdYSEpjYmlBZ0lDQm1iMjUwTFhkbGFXZG9kRG9nTkRBd08xeHlYRzRnSUNBZ2JXRnlaMmx1T2lBd0lERTJjSGc3WEhKY2JpQWdJQ0JpYjNndGMybDZhVzVuT2lCaWIzSmtaWEl0WW05NE8xeHlYRzRnSUNBZ1ltOXlaR1Z5TFdKdmRIUnZiVG9nTVhCNElITnZiR2xrSUVCd2NtbHRZWEo1WDJKdmNtUmxjbDlqYjJ4dmNqdGNjbHh1SUNCOVhISmNibHh5WEc0Z0lDWmZYMk5zYjNObElIdGNjbHh1SUNBZ0lIQnZjMmwwYVc5dU9pQmhZbk52YkhWMFpUdGNjbHh1SUNBZ0lIb3RhVzVrWlhnNklESTdYSEpjYmlBZ0lDQjBiM0E2SURVd0pUdGNjbHh1SUNBZ0lISnBaMmgwT2lBeE1uQjRPMXh5WEc0Z0lDQWdkMmxrZEdnNklESXdjSGc3WEhKY2JpQWdJQ0JvWldsbmFIUTZJREl3Y0hnN1hISmNiaUFnSUNCc2FXNWxMV2hsYVdkb2REb2dNakJ3ZUR0Y2NseHVJQ0FnSUdOdmJHOXlPaUJBWm05MWNuUm9YM1JsZUhSZlkyOXNiM0k3WEhKY2JpQWdJQ0JtYjI1MExYTnBlbVU2SURJd2NIZzdYSEpjYmlBZ0lDQjBaWGgwTFdGc2FXZHVPaUJqWlc1MFpYSTdYSEpjYmlBZ0lDQmpkWEp6YjNJNklIQnZhVzUwWlhJN1hISmNiaUFnSUNCMGNtRnVjMlp2Y20wNklIUnlZVzV6YkdGMFpWa29MVFV3SlNrN1hISmNiaUFnSUNCdmRtVnlabXh2ZHpvZ2FHbGtaR1Z1TzF4eVhHNWNjbHh1SUNBZ0lDNXZkWFJzYVc1bExXbGpiMjRnZTF4eVhHNGdJQ0FnSUNCd2IzTnBkR2x2YmpvZ1lXSnpiMngxZEdVN1hISmNiaUFnSUNBZ0lIb3RhVzVrWlhnNklESTdYSEpjYmlBZ0lDQWdJSFJ2Y0RvZ01EdGNjbHh1SUNBZ0lDQWdiR1ZtZERvZ01EdGNjbHh1SUNBZ0lIMWNjbHh1WEhKY2JpQWdJQ0FtT21odmRtVnlJSHRjY2x4dUlDQWdJQ0FnWTI5c2IzSTZJRUIwYUdseVpGOTBaWGgwWDJOdmJHOXlPMXh5WEc0Z0lDQWdmVnh5WEc0Z0lIMWNjbHh1WEhKY2JpQWdKbDlmYldGcGJpQjdYSEpjYmlBZ0lDQm1iR1Y0T2lBeE8xeHlYRzRnSUNBZ2IzWmxjbVpzYjNjNklHRjFkRzg3WEhKY2JseHlYRzRnSUNBZ0ppNXZkbVZ5Wm14dmR5MW9hV1JrWlc0Z2UxeHlYRzRnSUNBZ0lDQnZkbVZ5Wm14dmR6b2dhR2xrWkdWdU8xeHlYRzRnSUNBZ2ZWeHlYRzRnSUgxY2NseHVYSEpjYmlBZ0psOWZabTl2ZEdWeUlIdGNjbHh1SUNBZ0lHMWhjbWRwYmpvZ01DQmhkWFJ2TzF4eVhHNGdJQ0FnZEdWNGRDMWhiR2xuYmpvZ2NtbG5hSFE3WEhKY2JpQWdJQ0J2ZG1WeVpteHZkem9nYUdsa1pHVnVPMXh5WEc0Z0lIMWNjbHh1WEhKY2JpQWdKbDlmYjNabGNteGhlU0I3WEhKY2JpQWdJQ0JqYjI1MFpXNTBPaUFuSnp0Y2NseHVJQ0FnSUhCdmMybDBhVzl1T2lCeVpXeGhkR2wyWlR0Y2NseHVJQ0FnSUhvdGFXNWtaWGc2SURFN1hISmNiaUFnSUNCMGIzQTZJREE3WEhKY2JpQWdJQ0JzWldaME9pQXdPMXh5WEc0Z0lDQWdkMmxrZEdnNklERXdNQ1U3WEhKY2JpQWdJQ0JvWldsbmFIUTZJREV3TUNVN1hISmNiaUFnSUNCaVlXTnJaM0p2ZFc1a0xXTnZiRzl5T2lCQWQyaHBkR1U3WEhKY2JpQWdJQ0J2Y0dGamFYUjVPaUF3TGpFN1hISmNiaUFnSUNCdmRtVnlabXh2ZHpvZ2FHbGtaR1Z1TzF4eVhHNGdJSDFjY2x4dVhISmNiaUFnSmw5eWRHd3NYSEpjYmlBZ0psOXNkSElnZTF4eVhHNGdJQ0FnSmk1dmRYUnNhVzVsTFdSeVlYZGxjaUI3WEhKY2JpQWdJQ0FnSUNaZmRHbHVlU0I3WEhKY2JpQWdJQ0FnSUNBZ2QybGtkR2c2SURJNE1IQjRPMXh5WEc0Z0lDQWdJQ0I5WEhKY2JseHlYRzRnSUNBZ0lDQW1YMjFwYm1rZ2UxeHlYRzRnSUNBZ0lDQWdJSGRwWkhSb09pQTBPREJ3ZUR0Y2NseHVJQ0FnSUNBZ2ZWeHlYRzVjY2x4dUlDQWdJQ0FnSmw5emJXRnNiQ0I3WEhKY2JpQWdJQ0FnSUNBZ2QybGtkR2c2SURVME1IQjRPMXh5WEc0Z0lDQWdJQ0I5WEhKY2JseHlYRzRnSUNBZ0lDQW1YM0psWjNWc1lYSWdlMXh5WEc0Z0lDQWdJQ0FnSUhkcFpIUm9PaUEyT0RCd2VEdGNjbHh1SUNBZ0lDQWdmVnh5WEc1Y2NseHVJQ0FnSUNBZ0psOXRaV1JwZFcwZ2UxeHlYRzRnSUNBZ0lDQWdJSGRwWkhSb09pQTNNakJ3ZUR0Y2NseHVJQ0FnSUNBZ2ZWeHlYRzVjY2x4dUlDQWdJQ0FnSmw5c1lYSm5aU0I3WEhKY2JpQWdJQ0FnSUNBZ2QybGtkR2c2SURrMk1IQjRPMXh5WEc0Z0lDQWdJQ0I5WEhKY2JpQWdJQ0I5WEhKY2JpQWdmVnh5WEc1Y2NseHVJQ0FtWDNKMGJDQjdYSEpjYmlBZ0lDQmliM0prWlhJdGJHVm1kRG9nTVhCNElITnZiR2xrSUVCd2NtbHRZWEo1WDJKdmNtUmxjbDlqYjJ4dmNqdGNjbHh1WEhKY2JpQWdJQ0FtTG05MWRHeHBibVV0WkhKaGQyVnlJSHRjY2x4dUlDQWdJQ0FnSmw5MGFXNTVJSHRjY2x4dUlDQWdJQ0FnSUNBbUxtOTFkR3hwYm1VdFpISmhkMlZ5WDJOc2IzTmxaQ0I3WEhKY2JpQWdJQ0FnSUNBZ0lDQnlhV2RvZERvZ0xUSTVNSEI0TzF4eVhHNGdJQ0FnSUNBZ0lIMWNjbHh1SUNBZ0lDQWdmVnh5WEc1Y2NseHVJQ0FnSUNBZ0psOXRhVzVwSUh0Y2NseHVJQ0FnSUNBZ0lDQW1MbTkxZEd4cGJtVXRaSEpoZDJWeVgyTnNiM05sWkNCN1hISmNiaUFnSUNBZ0lDQWdJQ0J5YVdkb2REb2dMVFE1TUhCNE8xeHlYRzRnSUNBZ0lDQWdJSDFjY2x4dUlDQWdJQ0FnZlZ4eVhHNWNjbHh1SUNBZ0lDQWdKbDl6YldGc2JDQjdYSEpjYmlBZ0lDQWdJQ0FnSmk1dmRYUnNhVzVsTFdSeVlYZGxjbDlqYkc5elpXUWdlMXh5WEc0Z0lDQWdJQ0FnSUNBZ2NtbG5hSFE2SUMwMU5UQndlRHRjY2x4dUlDQWdJQ0FnSUNCOVhISmNiaUFnSUNBZ0lIMWNjbHh1WEhKY2JpQWdJQ0FnSUNaZmNtVm5kV3hoY2lCN1hISmNiaUFnSUNBZ0lDQWdKaTV2ZFhSc2FXNWxMV1J5WVhkbGNsOWpiRzl6WldRZ2UxeHlYRzRnSUNBZ0lDQWdJQ0FnY21sbmFIUTZJQzAyT1RCd2VEdGNjbHh1SUNBZ0lDQWdJQ0I5WEhKY2JpQWdJQ0FnSUgxY2NseHVYSEpjYmlBZ0lDQWdJQ1pmYldWa2FYVnRJSHRjY2x4dUlDQWdJQ0FnSUNBbUxtOTFkR3hwYm1VdFpISmhkMlZ5WDJOc2IzTmxaQ0I3WEhKY2JpQWdJQ0FnSUNBZ0lDQnlhV2RvZERvZ0xUY3pNSEI0TzF4eVhHNGdJQ0FnSUNBZ0lIMWNjbHh1SUNBZ0lDQWdmVnh5WEc1Y2NseHVJQ0FnSUNBZ0psOXNZWEpuWlNCN1hISmNiaUFnSUNBZ0lDQWdKaTV2ZFhSc2FXNWxMV1J5WVhkbGNsOWpiRzl6WldRZ2UxeHlYRzRnSUNBZ0lDQWdJQ0FnY21sbmFIUTZJQzA1TnpCd2VEdGNjbHh1SUNBZ0lDQWdJQ0I5WEhKY2JpQWdJQ0FnSUgxY2NseHVJQ0FnSUgxY2NseHVJQ0I5WEhKY2JseHlYRzRnSUNaZmJIUnlJSHRjY2x4dUlDQWdJR0p2Y21SbGNpMXlhV2RvZERvZ01YQjRJSE52Ykdsa0lFQndjbWx0WVhKNVgySnZjbVJsY2w5amIyeHZjanRjY2x4dVhISmNiaUFnSUNBbUxtOTFkR3hwYm1VdFpISmhkMlZ5SUh0Y2NseHVJQ0FnSUNBZ0psOTBhVzU1SUh0Y2NseHVJQ0FnSUNBZ0lDQW1MbTkxZEd4cGJtVXRaSEpoZDJWeVgyTnNiM05sWkNCN1hISmNiaUFnSUNBZ0lDQWdJQ0JzWldaME9pQXRNamt3Y0hnN1hISmNiaUFnSUNBZ0lDQWdmVnh5WEc0Z0lDQWdJQ0I5WEhKY2JseHlYRzRnSUNBZ0lDQW1YMjFwYm1rZ2UxeHlYRzRnSUNBZ0lDQWdJQ1l1YjNWMGJHbHVaUzFrY21GM1pYSmZZMnh2YzJWa0lIdGNjbHh1SUNBZ0lDQWdJQ0FnSUd4bFpuUTZJQzAwT1RCd2VEdGNjbHh1SUNBZ0lDQWdJQ0I5WEhKY2JpQWdJQ0FnSUgxY2NseHVYSEpjYmlBZ0lDQWdJQ1pmYzIxaGJHd2dlMXh5WEc0Z0lDQWdJQ0FnSUNZdWIzVjBiR2x1WlMxa2NtRjNaWEpmWTJ4dmMyVmtJSHRjY2x4dUlDQWdJQ0FnSUNBZ0lHeGxablE2SUMwMU5UQndlRHRjY2x4dUlDQWdJQ0FnSUNCOVhISmNiaUFnSUNBZ0lIMWNjbHh1WEhKY2JpQWdJQ0FnSUNaZmNtVm5kV3hoY2lCN1hISmNiaUFnSUNBZ0lDQWdKaTV2ZFhSc2FXNWxMV1J5WVhkbGNsOWpiRzl6WldRZ2UxeHlYRzRnSUNBZ0lDQWdJQ0FnYkdWbWREb2dMVFk1TUhCNE8xeHlYRzRnSUNBZ0lDQWdJSDFjY2x4dUlDQWdJQ0FnZlZ4eVhHNWNjbHh1SUNBZ0lDQWdKbDl0WldScGRXMGdlMXh5WEc0Z0lDQWdJQ0FnSUNZdWIzVjBiR2x1WlMxa2NtRjNaWEpmWTJ4dmMyVmtJSHRjY2x4dUlDQWdJQ0FnSUNBZ0lHeGxablE2SUMwM016QndlRHRjY2x4dUlDQWdJQ0FnSUNCOVhISmNiaUFnSUNBZ0lIMWNjbHh1WEhKY2JpQWdJQ0FnSUNaZmJHRnlaMlVnZTF4eVhHNGdJQ0FnSUNBZ0lDWXViM1YwYkdsdVpTMWtjbUYzWlhKZlkyeHZjMlZrSUh0Y2NseHVJQ0FnSUNBZ0lDQWdJR3hsWm5RNklDMDVOekJ3ZUR0Y2NseHVJQ0FnSUNBZ0lDQjlYSEpjYmlBZ0lDQWdJSDFjY2x4dUlDQWdJSDFjY2x4dUlDQjlYSEpjYmx4eVhHNGdJQ1pmZEhSaUxGeHlYRzRnSUNaZlluUjBJSHRjY2x4dUlDQWdJR3hsWm5RNklEQTdYSEpjYmlBZ0lDQjNhV1IwYURvZ01UQXdKVHRjY2x4dVhISmNiaUFnSUNBbUxtOTFkR3hwYm1VdFpISmhkMlZ5SUh0Y2NseHVJQ0FnSUNBZ0psOTBhVzU1SUh0Y2NseHVJQ0FnSUNBZ0lDQm9aV2xuYUhRNklESTBNSEI0TzF4eVhHNGdJQ0FnSUNCOVhISmNibHh5WEc0Z0lDQWdJQ0FtWDIxcGJta2dlMXh5WEc0Z0lDQWdJQ0FnSUdobGFXZG9kRG9nTXpJd2NIZzdYSEpjYmlBZ0lDQWdJSDFjY2x4dVhISmNiaUFnSUNBZ0lDWmZjMjFoYkd3Z2UxeHlYRzRnSUNBZ0lDQWdJR2hsYVdkb2REb2dNell3Y0hnN1hISmNiaUFnSUNBZ0lIMWNjbHh1WEhKY2JpQWdJQ0FnSUNaZmNtVm5kV3hoY2lCN1hISmNiaUFnSUNBZ0lDQWdhR1ZwWjJoME9pQTBNREJ3ZUR0Y2NseHVJQ0FnSUNBZ2ZWeHlYRzVjY2x4dUlDQWdJQ0FnSmw5dFpXUnBkVzBnZTF4eVhHNGdJQ0FnSUNBZ0lHaGxhV2RvZERvZ05EUXdjSGc3WEhKY2JpQWdJQ0FnSUgxY2NseHVYSEpjYmlBZ0lDQWdJQ1pmYkdGeVoyVWdlMXh5WEc0Z0lDQWdJQ0FnSUdobGFXZG9kRG9nTkRnd2NIZzdYSEpjYmlBZ0lDQWdJSDFjY2x4dUlDQWdJSDFjY2x4dUlDQjlYSEpjYmx4eVhHNGdJQ1pmZEhSaUlIdGNjbHh1SUNBZ0lHSnZjbVJsY2kxaWIzUjBiMjA2SURGd2VDQnpiMnhwWkNCQWNISnBiV0Z5ZVY5aWIzSmtaWEpmWTI5c2IzSTdYSEpjYmx4eVhHNGdJQ0FnSmk1dmRYUnNhVzVsTFdSeVlYZGxjaUI3WEhKY2JpQWdJQ0FnSUNaZmRHbHVlU0I3WEhKY2JpQWdJQ0FnSUNBZ0ppNXZkWFJzYVc1bExXUnlZWGRsY2w5amJHOXpaV1FnZTF4eVhHNGdJQ0FnSUNBZ0lDQWdkRzl3T2lBdE1qVXdjSGc3WEhKY2JpQWdJQ0FnSUNBZ2ZWeHlYRzRnSUNBZ0lDQjlYSEpjYmx4eVhHNGdJQ0FnSUNBbVgyMXBibWtnZTF4eVhHNGdJQ0FnSUNBZ0lDWXViM1YwYkdsdVpTMWtjbUYzWlhKZlkyeHZjMlZrSUh0Y2NseHVJQ0FnSUNBZ0lDQWdJSFJ2Y0RvZ0xUTXpNSEI0TzF4eVhHNGdJQ0FnSUNBZ0lIMWNjbHh1SUNBZ0lDQWdmVnh5WEc1Y2NseHVJQ0FnSUNBZ0psOXpiV0ZzYkNCN1hISmNiaUFnSUNBZ0lDQWdKaTV2ZFhSc2FXNWxMV1J5WVhkbGNsOWpiRzl6WldRZ2UxeHlYRzRnSUNBZ0lDQWdJQ0FnZEc5d09pQXRNemN3Y0hnN1hISmNiaUFnSUNBZ0lDQWdmVnh5WEc0Z0lDQWdJQ0I5WEhKY2JseHlYRzRnSUNBZ0lDQW1YM0psWjNWc1lYSWdlMXh5WEc0Z0lDQWdJQ0FnSUNZdWIzVjBiR2x1WlMxa2NtRjNaWEpmWTJ4dmMyVmtJSHRjY2x4dUlDQWdJQ0FnSUNBZ0lIUnZjRG9nTFRReE1IQjRPMXh5WEc0Z0lDQWdJQ0FnSUgxY2NseHVJQ0FnSUNBZ2ZWeHlYRzVjY2x4dUlDQWdJQ0FnSmw5dFpXUnBkVzBnZTF4eVhHNGdJQ0FnSUNBZ0lDWXViM1YwYkdsdVpTMWtjbUYzWlhKZlkyeHZjMlZrSUh0Y2NseHVJQ0FnSUNBZ0lDQWdJSFJ2Y0RvZ0xUUTFNSEI0TzF4eVhHNGdJQ0FnSUNBZ0lIMWNjbHh1SUNBZ0lDQWdmVnh5WEc1Y2NseHVJQ0FnSUNBZ0psOXNZWEpuWlNCN1hISmNiaUFnSUNBZ0lDQWdKaTV2ZFhSc2FXNWxMV1J5WVhkbGNsOWpiRzl6WldRZ2UxeHlYRzRnSUNBZ0lDQWdJQ0FnZEc5d09pQXRORGt3Y0hnN1hISmNiaUFnSUNBZ0lDQWdmVnh5WEc0Z0lDQWdJQ0I5WEhKY2JpQWdJQ0I5WEhKY2JpQWdmVnh5WEc1Y2NseHVJQ0FtWDJKMGRDQjdYSEpjYmlBZ0lDQjBiM0E2SUdsdWFYUnBZV3c3WEhKY2JpQWdJQ0JpYjNKa1pYSXRkRzl3T2lBeGNIZ2djMjlzYVdRZ1FIQnlhVzFoY25sZlltOXlaR1Z5WDJOdmJHOXlPMXh5WEc1Y2NseHVJQ0FnSUNZdWIzVjBiR2x1WlMxa2NtRjNaWElnZTF4eVhHNGdJQ0FnSUNBbVgzUnBibmtnZTF4eVhHNGdJQ0FnSUNBZ0lDWXViM1YwYkdsdVpTMWtjbUYzWlhKZlkyeHZjMlZrSUh0Y2NseHVJQ0FnSUNBZ0lDQWdJR0p2ZEhSdmJUb2dMVEkxTUhCNE8xeHlYRzRnSUNBZ0lDQWdJSDFjY2x4dUlDQWdJQ0FnZlZ4eVhHNWNjbHh1SUNBZ0lDQWdKbDl0YVc1cElIdGNjbHh1SUNBZ0lDQWdJQ0FtTG05MWRHeHBibVV0WkhKaGQyVnlYMk5zYjNObFpDQjdYSEpjYmlBZ0lDQWdJQ0FnSUNCaWIzUjBiMjA2SUMwek16QndlRHRjY2x4dUlDQWdJQ0FnSUNCOVhISmNiaUFnSUNBZ0lIMWNjbHh1WEhKY2JpQWdJQ0FnSUNaZmMyMWhiR3dnZTF4eVhHNGdJQ0FnSUNBZ0lDWXViM1YwYkdsdVpTMWtjbUYzWlhKZlkyeHZjMlZrSUh0Y2NseHVJQ0FnSUNBZ0lDQWdJR0p2ZEhSdmJUb2dMVE0zTUhCNE8xeHlYRzRnSUNBZ0lDQWdJSDFjY2x4dUlDQWdJQ0FnZlZ4eVhHNWNjbHh1SUNBZ0lDQWdKbDl5WldkMWJHRnlJSHRjY2x4dUlDQWdJQ0FnSUNBbUxtOTFkR3hwYm1VdFpISmhkMlZ5WDJOc2IzTmxaQ0I3WEhKY2JpQWdJQ0FnSUNBZ0lDQmliM1IwYjIwNklDMDBNVEJ3ZUR0Y2NseHVJQ0FnSUNBZ0lDQjlYSEpjYmlBZ0lDQWdJSDFjY2x4dVhISmNiaUFnSUNBZ0lDWmZiV1ZrYVhWdElIdGNjbHh1SUNBZ0lDQWdJQ0FtTG05MWRHeHBibVV0WkhKaGQyVnlYMk5zYjNObFpDQjdYSEpjYmlBZ0lDQWdJQ0FnSUNCaWIzUjBiMjA2SUMwME5UQndlRHRjY2x4dUlDQWdJQ0FnSUNCOVhISmNiaUFnSUNBZ0lIMWNjbHh1WEhKY2JpQWdJQ0FnSUNaZmJHRnlaMlVnZTF4eVhHNGdJQ0FnSUNBZ0lDWXViM1YwYkdsdVpTMWtjbUYzWlhKZlkyeHZjMlZrSUh0Y2NseHVJQ0FnSUNBZ0lDQWdJR0p2ZEhSdmJUb2dMVFE1TUhCNE8xeHlYRzRnSUNBZ0lDQWdJSDFjY2x4dUlDQWdJQ0FnZlZ4eVhHNGdJQ0FnZlZ4eVhHNGdJSDFjY2x4dVhISmNiaUFnSmw5dmNHVnVaV1FnZTF4eVhHNGdJQ0FnZG1semFXSnBiR2wwZVRvZ2RtbHphV0pzWlR0Y2NseHVJQ0FnSUhvdGFXNWtaWGc2SUhaaGNpZ3RMVzkxZEd4cGJtVXRla2x1WkdWNEtUdGNjbHh1WEhKY2JpQWdJQ0FtTG05MWRHeHBibVV0WkhKaGQyVnlJSHRjY2x4dUlDQWdJQ0FnY0c5emFYUnBiMjQ2SUdacGVHVmtPMXh5WEc1Y2NseHVJQ0FnSUNBZ0psOXlkR3dnZTF4eVhHNGdJQ0FnSUNBZ0lISnBaMmgwT2lBd08xeHlYRzRnSUNBZ0lDQjlYSEpjYmx4eVhHNGdJQ0FnSUNBbVgyeDBjaUI3WEhKY2JpQWdJQ0FnSUNBZ2JHVm1kRG9nTUR0Y2NseHVJQ0FnSUNBZ2ZWeHlYRzVjY2x4dUlDQWdJQ0FnSmw5MGRHSWdlMXh5WEc0Z0lDQWdJQ0FnSUhSdmNEb2dNRHRjY2x4dUlDQWdJQ0FnZlZ4eVhHNWNjbHh1SUNBZ0lDQWdKbDlpZEhRZ2UxeHlYRzRnSUNBZ0lDQWdJR0p2ZEhSdmJUb2dNRHRjY2x4dUlDQWdJQ0FnZlZ4eVhHNGdJQ0FnZlZ4eVhHNGdJSDFjY2x4dVhISmNiaUFnSmw5dlptWnpaWFFnZTF4eVhHNGdJQ0FnSmk1dmRYUnNhVzVsTFdSeVlYZGxjaUI3WEhKY2JpQWdJQ0FnSUNaZmNuUnNMRnh5WEc0Z0lDQWdJQ0FtWDJ4MGNpQjdYSEpjYmlBZ0lDQWdJQ0FnYUdWcFoyaDBPaUJqWVd4aktERXdNQ1VnTFNBMFpXMHBPMXh5WEc0Z0lDQWdJQ0FnSUhSdmNEb2dOVEFsTzF4eVhHNGdJQ0FnSUNBZ0lIUnlZVzV6Wm05eWJUb2dkSEpoYm5Oc1lYUmxXU2d0TlRBbEtUdGNjbHh1SUNBZ0lDQWdmVnh5WEc1Y2NseHVJQ0FnSUNBZ0psOTBkR0lzWEhKY2JpQWdJQ0FnSUNaZlluUjBJSHRjY2x4dUlDQWdJQ0FnSUNCM2FXUjBhRG9nWTJGc1l5Z3hNREFsSUMwZ05HVnRLVHRjY2x4dUlDQWdJQ0FnSUNCc1pXWjBPaUExTUNVN1hISmNiaUFnSUNBZ0lDQWdkSEpoYm5ObWIzSnRPaUIwY21GdWMyeGhkR1ZZS0MwMU1DVXBPMXh5WEc0Z0lDQWdJQ0I5WEhKY2JseHlYRzRnSUNBZ0lDQW1YMjl3Wlc1bFpDQjdYSEpjYmlBZ0lDQWdJQ0FnSmk1dmRYUnNhVzVsTFdSeVlYZGxjaUI3WEhKY2JpQWdJQ0FnSUNBZ0lDQW1YM0owYkNCN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUhKcFoyaDBPaUF5WlcwN1hISmNiaUFnSUNBZ0lDQWdJQ0I5WEhKY2JseHlYRzRnSUNBZ0lDQWdJQ0FnSmw5c2RISWdlMXh5WEc0Z0lDQWdJQ0FnSUNBZ0lDQnNaV1owT2lBeVpXMDdYSEpjYmlBZ0lDQWdJQ0FnSUNCOVhISmNibHh5WEc0Z0lDQWdJQ0FnSUNBZ0psOTBkR0lnZTF4eVhHNGdJQ0FnSUNBZ0lDQWdJQ0IwYjNBNklESmxiVHRjY2x4dUlDQWdJQ0FnSUNBZ0lIMWNjbHh1WEhKY2JpQWdJQ0FnSUNBZ0lDQW1YMkowZENCN1hISmNiaUFnSUNBZ0lDQWdJQ0FnSUdKdmRIUnZiVG9nTW1WdE8xeHlYRzRnSUNBZ0lDQWdJQ0FnZlZ4eVhHNGdJQ0FnSUNBZ0lIMWNjbHh1SUNBZ0lDQWdmVnh5WEc0Z0lDQWdmVnh5WEc0Z0lIMWNjbHh1WEhKY2JpQWdKbDloZFhSdklIdGNjbHh1SUNBZ0lDWXViM1YwYkdsdVpTMWtjbUYzWlhJZ2UxeHlYRzRnSUNBZ0lDQW1YM0owYkN4Y2NseHVJQ0FnSUNBZ0psOXNkSElnZTF4eVhHNGdJQ0FnSUNBZ0lHaGxhV2RvZERvZ1lYVjBienRjY2x4dUlDQWdJQ0FnSUNCdFlYZ3RhR1ZwWjJoME9pQmpZV3hqS0RFd01DVWdMU0EwWlcwcE8xeHlYRzRnSUNBZ0lDQjlYSEpjYmlBZ0lDQjlYSEpjYmlBZ2ZWeHlYRzVjY2x4dUlDQW1YMloxYkd3Z2UxeHlYRzRnSUNBZ2NHRmtaR2x1WnpvZ01EdGNjbHh1SUNCOVhISmNibjFjY2x4dUlpd2lMeW9xWEhKY2JpQXFJSE5vWVdSdmR5NXNaWE56SUMwZzZaaTA1YjJ4NXFDMzVieVA2SzYrNTcydUlHMXBlR2x1ZUNEbGg3M21sYkJjY2x4dUlDb2dQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBWeHlYRzRnS2lCRGNtVmhkR1ZrSUVKNU9pQlpZVzlvWVdsNGFXRnZYSEpjYmlBcUlGVndaR0YwWlRvZ01qQXlNaTR6TGpJd1hISmNiaUFxTDF4eVhHNUFhVzF3YjNKMElDY3VMMk52Ykc5eWN5YzdYSEpjYmx4eVhHNHZLaUE5UFQwOVBUMGc2WmkwNWIyeDVxQzM1YnlQNks2KzU3MnU1WWU5NXBXd0lEMDlQVDA5UFNBcUwxeHlYRzR1YzJoaFpHOTNLRUJ2Wm1aelpYUTZJREFnTUNBMmNIZ2dNWEI0TENCQVkyOXNiM0k2SUVCd2NtbHRZWEo1WDJKdmNtUmxjbDlqYjJ4dmNpa2dlMXh5WEc0Z0lHSnZlQzF6YUdGa2IzYzZJRUJ2Wm1aelpYUWdRR052Ykc5eU8xeHlYRzU5WEhKY2JseHlYRzR1YzJoaFpHOTNYM0psWjNWc1lYSW9RR052Ykc5eU9pQkFjSEpwYldGeWVWOWliM0prWlhKZlkyOXNiM0lwSUh0Y2NseHVJQ0F1YzJoaFpHOTNLREFnTUNBMmNIZ2dNWEI0TENCQVkyOXNiM0lwTzF4eVhHNTlYSEpjYmx4eVhHNHVjMmhoWkc5M1gyeGhjbWRsS0VCamIyeHZjam9nUUhCeWFXMWhjbmxmWW05eVpHVnlYMk52Ykc5eUtTQjdYSEpjYmlBZ0xuTm9ZV1J2ZHlnd0lEQWdNVEp3ZUNBeGNIZ3NJRUJqYjJ4dmNpazdYSEpjYm4xY2NseHVYSEpjYmk1emFHRmtiM2RmYkdsbmFIUmZjbVZuZFd4aGNpZ3BJSHRjY2x4dUlDQXVjMmhoWkc5M1gzSmxaM1ZzWVhJb0tUdGNjbHh1ZlZ4eVhHNWNjbHh1TG5Ob1lXUnZkMTlzYVdkb2RGOXNZWEpuWlNncElIdGNjbHh1SUNBdWMyaGhaRzkzWDJ4aGNtZGxLQ2s3WEhKY2JuMWNjbHh1WEhKY2JpNXphR0ZrYjNkZlpHRnlhMTl5WldkMWJHRnlLQ2tnZTF4eVhHNGdJQzV6YUdGa2IzZGZjbVZuZFd4aGNpaEFjMlZqYjI1a1lYSjVYMkp2Y21SbGNsOWpiMnh2Y2lrN1hISmNibjFjY2x4dVhISmNiaTV6YUdGa2IzZGZaR0Z5YTE5c1lYSm5aU2dwSUh0Y2NseHVJQ0F1YzJoaFpHOTNYMnhoY21kbEtFQnpaV052Ym1SaGNubGZZbTl5WkdWeVgyTnZiRzl5S1R0Y2NseHVmVnh5WEc0aUxDSkFhVzF3YjNKMElDY3VMaTkwYUdWdFpTOTJZWEpwWVdKc1pYTW5PMXh5WEc1QWFXMXdiM0owSUNjdUxpOTBhR1Z0WlM5amIyeHZjbk1uTzF4eVhHNUFhVzF3YjNKMElDY3VMaTkwYUdWdFpTOWxiR3hwY0hOcGN5YzdYSEpjYmx4eVhHNHViM1YwYkdsdVpTMXVZWFpwWjJGMGIzSWdlMXh5WEc0Z0lIQnZjMmwwYVc5dU9pQnlaV3hoZEdsMlpUdGNjbHh1SUNCNkxXbHVaR1Y0T2lBeE8xeHlYRzRnSUcxaGNtZHBiam9nTUR0Y2NseHVJQ0IzYVdSMGFEb2dkbUZ5S0MwdGIzVjBiR2x1WlMxdVlYWnBaMkYwYjNJdGQybGtkR2dwTzF4eVhHNGdJRzkyWlhKbWJHOTNPaUJoZFhSdk8xeHlYRzVjY2x4dUlDQW1MWEJoY21WdWRDQjdYSEpjYmlBZ0lDQjBjbUZ1YzJsMGFXOXVPaUF3TGpOeklHVmhjMlV0YVc0dGIzVjBPMXh5WEc0Z0lIMWNjbHh1WEhKY2JpQWdKbDlmZEdsMGJHVWdlMXh5WEc0Z0lDQWdiV0Z5WjJsdU9pQXdJREUyY0hnN1hISmNiaUFnSUNCb1pXbG5hSFE2SURRd2NIZzdYSEpjYmlBZ0lDQnNhVzVsTFdobGFXZG9kRG9nTkRCd2VEdGNjbHh1SUNBZ0lIQmhaR1JwYm1jNklEQWdNVFp3ZUR0Y2NseHVJQ0FnSUdKdmNtUmxjaTFpYjNSMGIyMDZJREZ3ZUNCemIyeHBaQ0JBY0hKcGJXRnllVjlpYjNKa1pYSmZZMjlzYjNJN1hISmNiaUFnSUNCbWIyNTBMWE5wZW1VNklERTJjSGc3WEhKY2JpQWdJQ0JtYjI1MExYZGxhV2RvZERvZ05EQXdPMXh5WEc0Z0lDQWdiM1psY21ac2IzYzZJR2hwWkdSbGJqdGNjbHh1SUNCOVhISmNibHh5WEc0Z0lDWmZYMjFoYVc0Z2UxeHlYRzRnSUNBZ2NHOXphWFJwYjI0NklISmxiR0YwYVhabE8xeHlYRzRnSUNBZ2VpMXBibVJsZURvZ01UdGNjbHh1SUNBZ0lHMWhjbWRwYmpvZ01EdGNjbHh1SUNBZ0lHOTJaWEptYkc5M09pQm9hV1JrWlc0N1hISmNiaUFnZlZ4eVhHNWNjbHh1SUNBbVgxOXNhWE4wTEZ4eVhHNGdJQ1pmWDNOMVltcGxZM1FzWEhKY2JpQWdKbDlmYVhSbGJTQjdYSEpjYmlBZ0lDQndiM05wZEdsdmJqb2djbVZzWVhScGRtVTdYSEpjYmlBZ0lDQjZMV2x1WkdWNE9pQXlPMXh5WEc0Z0lDQWdiV0Z5WjJsdU9pQXdPMXh5WEc0Z0lDQWdjR0ZrWkdsdVp6b2dNRHRjY2x4dUlDQWdJR3hwYzNRdGMzUjViR1V0ZEhsd1pUb2dibTl1WlR0Y2NseHVJQ0FnSUc5MlpYSm1iRzkzT2lCb2FXUmtaVzQ3WEhKY2JpQWdmVnh5WEc1Y2NseHVJQ0FtWDE5c2FYTjBJSHRjY2x4dUlDQWdJSEJoWkdScGJtYzZJREF1TldWdElEQTdYSEpjYmlBZ2ZWeHlYRzVjY2x4dUlDQW1YMTl6ZFdKcVpXTjBJSHRjY2x4dUlDQWdJSEJoWkdScGJtY3RiR1ZtZERvZ01XVnRPMXh5WEc0Z0lIMWNjbHh1WEhKY2JpQWdKbDlmYVhSbGJTQjdYSEpjYmlBZ0lDQnRZWEpuYVc0NklEQTdYSEpjYmlBZ0lDQnNhVzVsTFdobGFXZG9kRG9nTXpCd2VEdGNjbHh1SUNBZ0lHWnZiblF0YzJsNlpUb2dNVE53ZUR0Y2NseHVJQ0FnSUc5MlpYSm1iRzkzT2lCb2FXUmtaVzQ3WEhKY2JpQWdmVnh5WEc1Y2NseHVJQ0FtWDE5d2JHRmpaV2h2YkdSbGNpQjdYSEpjYmlBZ0lDQndiM05wZEdsdmJqb2dZV0p6YjJ4MWRHVTdYSEpjYmlBZ0lDQjZMV2x1WkdWNE9pQXhPMXh5WEc0Z0lDQWdkRzl3T2lBd08xeHlYRzRnSUNBZ2JHVm1kRG9nTUR0Y2NseHVJQ0FnSUhkcFpIUm9PaUF4TURBbE8xeHlYRzRnSUNBZ2FHVnBaMmgwT2lBek1IQjRPMXh5WEc0Z0lDQWdZbUZqYTJkeWIzVnVaQzFqYjJ4dmNqb2dRR2h2ZG1WeVgySm5YMk52Ykc5eU8xeHlYRzRnSUNBZ1ltOXlaR1Z5TFd4bFpuUTZJREp3ZUNCemIyeHBaQ0JBYzNWalkyVnpjMTlqYjJ4dmNqdGNjbHh1SUNBZ0lIUnlZVzV6YVhScGIyNHRaSFZ5WVhScGIyNDZJREF1TW5NN1hISmNiaUFnSUNCaWIzZ3RjMmw2YVc1bk9pQmliM0prWlhJdFltOTRPMXh5WEc0Z0lDQWdiM1psY21ac2IzYzZJR2hwWkdSbGJqdGNjbHh1SUNCOVhISmNibHh5WEc0Z0lDWmZYMkZ1WTJodmNpQjdYSEpjYmlBZ0lDQXVaV3hzYVhCemFYTW9NU2s3WEhKY2JpQWdJQ0JrYVhOd2JHRjVPaUJpYkc5amF6dGNjbHh1SUNBZ0lIQmhaR1JwYm1jNklEQWdNUzQxWlcwN1hISmNibHh5WEc0Z0lDQWdKanBzYVc1ckxGeHlYRzRnSUNBZ0pqcDJhWE5wZEdWa0xGeHlYRzRnSUNBZ0pqcG9iM1psY2lCN1hISmNiaUFnSUNBZ0lIUmxlSFF0WkdWamIzSmhkR2x2YmpvZ2JtOXVaVHRjY2x4dUlDQWdJQ0FnWTI5c2IzSTZJRUJ6WldOdmJtUmhjbmxmZEdWNGRGOWpiMnh2Y2p0Y2NseHVJQ0FnSUgxY2NseHVYSEpjYmlBZ0lDQW1PbWh2ZG1WeUlIdGNjbHh1SUNBZ0lDQWdZMjlzYjNJNklFQnpkV05qWlhOelgyTnZiRzl5TzF4eVhHNGdJQ0FnZlZ4eVhHNGdJSDFjY2x4dVhISmNiaUFnSmw5ZlkyOWtaU0I3WEhKY2JpQWdJQ0J3WVdSa2FXNW5MWEpwWjJoME9pQXdMalZsYlR0Y2NseHVJQ0I5WEhKY2JseHlYRzRnSUNaZmFHbG5hR3hwWjJoMElIdGNjbHh1SUNBZ0lDWXViM1YwYkdsdVpTMXVZWFpwWjJGMGIzSmZYMkZ1WTJodmNpQjdYSEpjYmlBZ0lDQWdJQ1k2YkdsdWF5eGNjbHh1SUNBZ0lDQWdKanAyYVhOcGRHVmtMRnh5WEc0Z0lDQWdJQ0FtT21odmRtVnlJSHRjY2x4dUlDQWdJQ0FnSUNCamIyeHZjam9nUUhOMVkyTmxjM05mWTI5c2IzSTdYSEpjYmlBZ0lDQWdJQ0FnWm05dWRDMTNaV2xuYUhRNklHSnZiR1E3WEhKY2JpQWdJQ0FnSUgxY2NseHVJQ0FnSUgxY2NseHVJQ0I5WEhKY2JseHlYRzRnSUNaZmMzUnBZMnQ1TEZ4eVhHNGdJQ1pmWm1sNFpXUWdlMXh5WEc0Z0lDQWdaR2x6Y0d4aGVUb2dabXhsZUR0Y2NseHVJQ0FnSUdac1pYZ3RkM0poY0RvZ2JtOTNjbUZ3TzF4eVhHNGdJQ0FnWm14bGVDMWthWEpsWTNScGIyNDZJR052YkhWdGJqdGNjbHh1SUNBZ0lIb3RhVzVrWlhnNklIWmhjaWd0TFc5MWRHeHBibVV0ZWtsdVpHVjRLVHRjY2x4dUlDQWdJSFJ2Y0RvZ01EdGNjbHh1SUNBZ0lHOTJaWEptYkc5M09pQm9hV1JrWlc0N1hISmNibHh5WEc0Z0lDQWdMbTkxZEd4cGJtVXRibUYyYVdkaGRHOXlJSHRjY2x4dUlDQWdJQ0FnSmw5ZmRHbDBiR1VzWEhKY2JpQWdJQ0FnSUNaZlgyMWhhVzRnZTF4eVhHNGdJQ0FnSUNBZ0lHSnZlQzF6YVhwcGJtYzZJR0p2Y21SbGNpMWliM2c3WEhKY2JpQWdJQ0FnSUgxY2NseHVYSEpjYmlBZ0lDQWdJQ1pmWDNScGRHeGxJSHRjY2x4dUlDQWdJQ0FnSUNCbWJHVjRMWE5vY21sdWF6b2dNRHRjY2x4dUlDQWdJQ0FnZlZ4eVhHNWNjbHh1SUNBZ0lDQWdKbDlmYldGcGJpQjdYSEpjYmlBZ0lDQWdJQ0FnWm14bGVEb2dNVHRjY2x4dUlDQWdJQ0FnSUNCdmRtVnlabXh2ZHpvZ1lYVjBienRjY2x4dUlDQWdJQ0FnZlZ4eVhHNGdJQ0FnZlZ4eVhHNGdJSDFjY2x4dVhISmNiaUFnSmw5emRHbGphM2tnZTF4eVhHNGdJQ0FnY0c5emFYUnBiMjQ2SUhOMGFXTnJlVHRjY2x4dUlDQWdJRzFoZUMxb1pXbG5hSFE2SUhaaGNpZ3RMVzkxZEd4cGJtVXRjM1JwWTJ0NUxXaGxhV2RvZENrN1hISmNiaUFnZlZ4eVhHNWNjbHh1SUNBbVgyWnBlR1ZrSUh0Y2NseHVJQ0FnSUhCdmMybDBhVzl1T2lCbWFYaGxaRHRjY2x4dUlDQWdJRzFoZUMxb1pXbG5hSFE2SURFd01DVTdYSEpjYmlBZ2ZWeHlYRzVjY2x4dUlDQW1YMmhwWkdSbGJpQjdYSEpjYmlBZ0lDQmthWE53YkdGNU9pQnViMjVsTzF4eVhHNGdJSDFjY2x4dVhISmNiaUFnSmw5bWIyeGtaV1FnZTF4eVhHNGdJQ0FnZDJsa2RHZzZJREE3WEhKY2JpQWdJQ0J2ZG1WeVpteHZkem9nYUdsa1pHVnVPMXh5WEc0Z0lIMWNjbHh1ZlZ4eVhHNGlMQ0l2S2lwY2NseHVJQ29nWld4c2FYQnphWE11YkdWemN5QXRJT2FXaCthY3JPZWNnZWVWcFNCdGFYaHBibmdnNVllOTVwV3dYSEpjYmlBcUlEMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQxY2NseHVJQ29nUTNKbFlYUmxaQ0JDZVRvZ1dXRnZhR0ZwZUdsaGIxeHlYRzRnS2lCVmNHUmhkR1U2SURJd01qSXVNeTR4TVZ4eVhHNGdLaTljY2x4dVhISmNiaThxSUQwOVBUMDlQU0RtbG9mbW5Lem5uSUhubGFYbGg3M21sYkFnUFQwOVBUMDlJQ292WEhKY2JpNWxiR3hwY0hOcGN5QW9RR3hwYm1WektTQjNhR1Z1SUNoQWJHbHVaWE05TVNrZ2UxeHlYRzRnSUhkb2FYUmxMWE53WVdObE9pQnViM2R5WVhBN1hISmNiaUFnZEdWNGRDMXZkbVZ5Wm14dmR6b2daV3hzYVhCemFYTTdYSEpjYmlBZ2IzWmxjbVpzYjNjNklHaHBaR1JsYmp0Y2NseHVmVnh5WEc1Y2NseHVMbVZzYkdsd2MybHpJQ2hBYkdsdVpYTXBJSGRvWlc0Z0tFQnNhVzVsY3o0OU1pa2dlMXh5WEc0Z0lDMTNaV0pyYVhRdGJHbHVaUzFqYkdGdGNEb2dRR3hwYm1Wek8xeHlYRzRnSUdScGMzQnNZWGs2SUdKdmVEdGNjbHh1SUNBdGQyVmlhMmwwTFdKdmVDMXZjbWxsYm5RNklIWmxjblJwWTJGc08xeHlYRzRnSUhSbGVIUXRiM1psY21ac2IzYzZJR1ZzYkdsd2MybHpPMXh5WEc0Z0lHOTJaWEptYkc5M09pQm9hV1JrWlc0N1hISmNibjFjY2x4dUlpd2lRR2x0Y0c5eWRDQW5MaTR2ZEdobGJXVXZZMjlzYjNKekp6dGNjbHh1UUdsdGNHOXlkQ0FuTGk0dmRHaGxiV1V2Wm05dWRDYzdYSEpjYmtCcGJYQnZjblFnSnk0dUwzUm9aVzFsTDIxcGVHbHVjeWM3WEhKY2JseHlYRzR1YjNWMGJHbHVaUzF5WldGa1pYSWdlMXh5WEc0Z0lDWmZYM0J5YjJkeVpYTnpJSHRjY2x4dUlDQWdJSEJ2YzJsMGFXOXVPaUJtYVhobFpEdGNjbHh1SUNBZ0lIUnZjRG9nTUR0Y2NseHVJQ0FnSUd4bFpuUTZJREE3WEhKY2JpQWdJQ0I2TFdsdVpHVjRPaUF6TzF4eVhHNGdJQ0FnYUdWcFoyaDBPaUEwY0hnN1hISmNiaUFnSUNCM2FXUjBhRG9nTVRBd0pUdGNjbHh1SUNBZ0lHSmhZMnRuY205MWJtUXRZMjlzYjNJNklFQndjbWx0WVhKNVgyTnZiRzl5TzF4eVhHNGdJQ0FnYzJOaGJHVTZJREFnTVR0Y2NseHVJQ0FnSUhSeVlXNXpabTl5YlMxdmNtbG5hVzQ2SUd4bFpuUTdYSEpjYmlBZ0lDQmhibWx0WVhScGIyNDZJRzkxZEd4cGJtVXRjbVZoWkdWeUxYQnliMmR5WlhOeklHeHBibVZoY2p0Y2NseHVJQ0FnSUdGdWFXMWhkR2x2YmkxMGFXMWxiR2x1WlRvZ0xTMVFjbTluY21WemMxUnBiV1ZzYVc1bE8xeHlYRzRnSUgxY2NseHVYSEpjYmlBZ0psOWZjR0Z3WlhJZ2UxeHlYRzRnSUNBZ0xuTm9ZV1J2ZDE5a1lYSnJYM0psWjNWc1lYSW9LVHRjY2x4dUlDQWdJRzFoY21kcGJqb2dNbVZ0SUdGMWRHODdYSEpjYmlBZ0lDQnRZWGd0ZDJsa2RHZzZJREV5TURCd2VEdGNjbHh1SUNBZ0lIQmhaR1JwYm1jNklETXVNbVZ0TzF4eVhHNGdJQ0FnWW05NExYTnBlbWx1WnpvZ1ltOXlaR1Z5TFdKdmVEdGNjbHh1SUNBZ0lHSmhZMnRuY205MWJtUXRZMjlzYjNJNklFQjNhR2wwWlR0Y2NseHVJQ0FnSUc5MlpYSm1iRzkzT2lCb2FXUmtaVzQ3WEhKY2JpQWdmVnh5WEc1Y2NseHVJQ0FtWDE5MGFYUnNaU0I3WEhKY2JpQWdJQ0J0WVhKbmFXNDZJREF1TmpkbGJTQXdPMXh5WEc0Z0lDQWdkR1Y0ZEMxaGJHbG5iam9nWTJWdWRHVnlPMXh5WEc0Z0lDQWdabTl1ZEMxbVlXMXBiSGs2SUVCbWIyNTBYM1JsZUhSZlptRnRhV3g1TzF4eVhHNGdJQ0FnWm05dWRDMTNaV2xuYUhRNklHNXZjbTFoYkR0Y2NseHVJQ0FnSUd4cGJtVXRhR1ZwWjJoME9pQXhMak5sYlR0Y2NseHVJQ0FnSUdadmJuUXRjMmw2WlRvZ05DNHlaVzA3WEhKY2JpQWdJQ0J2ZG1WeVpteHZkem9nYUdsa1pHVnVPMXh5WEc0Z0lIMWNjbHh1WEhKY2JpQWdKbDlmWVhKMGFXTnNaU0I3WEhKY2JpQWdJQ0F1YjNWMGJHbHVaUzF5WldGa1pYSmZYM0J5YjJkeVpYTnpJSHRjY2x4dUlDQWdJQ0FnWkdsemNHeGhlVG9nYm05dVpUdGNjbHh1SUNBZ0lIMWNjbHh1SUNCOVhISmNibHh5WEc0Z0lDWmZhR2xrWkdWdUlIdGNjbHh1SUNBZ0lHUnBjM0JzWVhrNklHNXZibVU3WEhKY2JseHlYRzRnSUNBZ0ppNXZkWFJzYVc1bExYSmxZV1JsY2w5emFXSnNhVzVuSUh0Y2NseHVJQ0FnSUNBZ1pHbHpjR3hoZVRvZ2JtOXVaU0FoYVcxd2IzSjBZVzUwTzF4eVhHNWNjbHh1SUNBZ0lDQWdKaTUzY21Gd2NHVnlJSHRjY2x4dUlDQWdJQ0FnSUNBbUxuQnZjM1FnZTF4eVhHNGdJQ0FnSUNBZ0lDQWdaR2x6Y0d4aGVUb2dibTl1WlR0Y2NseHVJQ0FnSUNBZ0lDQjlYSEpjYmlBZ0lDQWdJSDFjY2x4dUlDQWdJSDFjY2x4dUlDQjlYSEpjYmx4eVhHNGdJQ1l0TFhKbFlXUnBibWNnZTF4eVhHNGdJQ0FnWkdsemNHeGhlVG9nWW14dlkyczdYSEpjYmlBZ0lDQndiM05wZEdsdmJqb2dabWw0WldRN1hISmNiaUFnSUNCNkxXbHVaR1Y0T2lBeU8xeHlYRzRnSUNBZ2RHOXdPaUF3TzF4eVhHNGdJQ0FnYkdWbWREb2dNRHRjY2x4dUlDQWdJSGRwWkhSb09pQXhNREFsTzF4eVhHNGdJQ0FnYUdWcFoyaDBPaUF4TURBbE8xeHlYRzRnSUNBZ2JXRnlaMmx1T2lBd08xeHlYRzRnSUNBZ1ltOTRMWE5wZW1sdVp6b2dZbTl5WkdWeUxXSnZlRHRjY2x4dUlDQWdJSEJoWkdScGJtYzZJRE5sYlNBMFpXMDdYSEpjYmlBZ0lDQmlZV05yWjNKdmRXNWtMV052Ykc5eU9pQkFZbWRmWTI5c2IzSTdYSEpjYmlBZ0lDQnpZM0p2Ykd3dGRHbHRaV3hwYm1VdGJtRnRaVG9nTFMxUWNtOW5jbVZ6YzFScGJXVnNhVzVsTzF4eVhHNGdJQ0FnYjNabGNtWnNiM2M2SUhOamNtOXNiRHRjY2x4dUlDQjlYSEpjYm4xY2NseHVYSEpjYmtCclpYbG1jbUZ0WlhNZ2IzVjBiR2x1WlMxeVpXRmtaWEl0Y0hKdlozSmxjM01nZTF4eVhHNGdJSFJ2SUh0Y2NseHVJQ0FnSUhOallXeGxPaUF4SURFN1hISmNiaUFnZlZ4eVhHNTlYSEpjYmx4eVhHNUFiV1ZrYVdFZ0tHMWhlQzEzYVdSMGFEb2dOVEF3Y0hncElIdGNjbHh1SUNBdWIzVjBiR2x1WlNCN1hISmNiaUFnSUNBbUxYSmxZV1JsY2lCN1hISmNiaUFnSUNBZ0lHOTJaWEptYkc5M09pQm9hV1JrWlc0N1hISmNibHh5WEc0Z0lDQWdJQ0F1YjNWMGJHbHVaUzEwYjI5c1ltRnlJSHRjY2x4dUlDQWdJQ0FnSUNCa2FYTndiR0Y1T2lCbWJHVjRPMXh5WEc0Z0lDQWdJQ0FnSUdac1pYZ3RaR2x5WldOMGFXOXVPaUJ5YjNjN1hISmNiaUFnSUNBZ0lDQWdabXhsZUMxM2NtRndPaUJ1YjNkeVlYQTdYSEpjYmlBZ0lDQWdJQ0FnWVd4cFoyNHRhWFJsYlhNNklHTmxiblJsY2p0Y2NseHVJQ0FnSUNBZ0lDQmhiR2xuYmkxelpXeG1PaUJoZFhSdk8xeHlYRzRnSUNBZ0lDQWdJSFJ2Y0RvZ01UQXdKVHRjY2x4dUlDQWdJQ0FnSUNCeWFXZG9kRG9nTUR0Y2NseHVJQ0FnSUNBZ0lDQjBjbUZ1YzJadmNtMDZJSFJ5WVc1emJHRjBaVmtvTFRRNGNIZ3BPMXh5WEc0Z0lDQWdJQ0FnSUhkcFpIUm9PaUF4TURBbE8xeHlYRzRnSUNBZ0lDQWdJR2hsYVdkb2REb2dORGh3ZUR0Y2NseHVJQ0FnSUNBZ0lDQmliM2d0YzJsNmFXNW5PaUJpYjNKa1pYSXRZbTk0TzF4eVhHNGdJQ0FnSUNBZ0lHSnZjbVJsY2kxMGIzQTZJREZ3ZUNCemIyeHBaQ0JBWW05eVpHVnlYMk52Ykc5eU8xeHlYRzRnSUNBZ0lDQWdJR0poWTJ0bmNtOTFibVF0WTI5c2IzSTZJRUIzYUdsMFpUdGNjbHh1SUNBZ0lDQWdJQ0J3WVdSa2FXNW5PaUF3SURFMmNIZzdYSEpjYmx4eVhHNGdJQ0FnSUNBZ0lDWmZYMkoxZEhSdmJpQjdYSEpjYmlBZ0lDQWdJQ0FnSUNBdWNtRmthWFZ6WDI1dmJtVW9LVHRjY2x4dUlDQWdJQ0FnSUNBZ0lHWnNaWGc2SURFN1hISmNiaUFnSUNBZ0lDQWdJQ0JpYjNKa1pYSTZJRzV2Ym1VN1hISmNiaUFnSUNBZ0lDQWdJQ0JpYjNndGMyaGhaRzkzT2lCdWIyNWxPMXh5WEc0Z0lDQWdJQ0FnSUgxY2NseHVJQ0FnSUNBZ2ZWeHlYRzVjY2x4dUlDQWdJQ0FnSmkwdGNtVmhaR2x1WnlCN1hISmNiaUFnSUNBZ0lDQWdjR0ZrWkdsdVp6b2dNRHRjY2x4dUlDQWdJQ0FnSUNCaVlXTnJaM0p2ZFc1a0xXTnZiRzl5T2lCQWQyaHBkR1U3WEhKY2JpQWdJQ0FnSUNBZ1ltOTRMWE5wZW1sdVp6b2dZbTl5WkdWeUxXSnZlRHRjY2x4dUlDQWdJQ0FnZlZ4eVhHNWNjbHh1SUNBZ0lDQWdKbDlmY0dGd1pYSWdlMXh5WEc0Z0lDQWdJQ0FnSUhCdmMybDBhVzl1T2lCeVpXeGhkR2wyWlR0Y2NseHVJQ0FnSUNBZ0lDQjZMV2x1WkdWNE9pQXhPMXh5WEc0Z0lDQWdJQ0FnSUcxaGNtZHBiam9nTUR0Y2NseHVJQ0FnSUNBZ0lDQndZV1JrYVc1bk9pQXdPMXh5WEc0Z0lDQWdJQ0FnSUdobGFXZG9kRG9nTVRBd0pUdGNjbHh1SUNBZ0lDQWdJQ0JpYjNndGMyaGhaRzkzT2lCdWIyNWxPMXh5WEc0Z0lDQWdJQ0FnSUc5MlpYSm1iRzkzT2lCb2FXUmtaVzQ3WEhKY2JpQWdJQ0FnSUgxY2NseHVYSEpjYmlBZ0lDQWdJQ1pmWDNScGRHeGxJSHRjY2x4dUlDQWdJQ0FnSUNBdVpXeHNhWEJ6YVhNb01TazdYSEpjYmlBZ0lDQWdJQ0FnY0c5emFYUnBiMjQ2SUdGaWMyOXNkWFJsTzF4eVhHNGdJQ0FnSUNBZ0lIb3RhVzVrWlhnNklETTdYSEpjYmlBZ0lDQWdJQ0FnZEc5d09pQXdPMXh5WEc0Z0lDQWdJQ0FnSUd4bFpuUTZJREE3WEhKY2JpQWdJQ0FnSUNBZ2JXRnlaMmx1T2lBd08xeHlYRzRnSUNBZ0lDQWdJSGRwWkhSb09pQXhNREFsTzF4eVhHNGdJQ0FnSUNBZ0lHaGxhV2RvZERvZ05EaHdlRHRjY2x4dUlDQWdJQ0FnSUNCc2FXNWxMV2hsYVdkb2REb2dORGh3ZUR0Y2NseHVJQ0FnSUNBZ0lDQmliM0prWlhJdFltOTBkRzl0T2lBeGNIZ2djMjlzYVdRZ1FHSnZjbVJsY2w5amIyeHZjanRjY2x4dUlDQWdJQ0FnSUNCbWIyNTBMWE5wZW1VNklERXVPR1Z0TzF4eVhHNGdJQ0FnSUNBZ0lHWnZiblF0ZDJWcFoyaDBPaUEwTURBN1hISmNiaUFnSUNBZ0lDQWdZbUZqYTJkeWIzVnVaQzFqYjJ4dmNqb2dRSGRvYVhSbE8xeHlYRzRnSUNBZ0lDQWdJRzkyWlhKbWJHOTNPaUJvYVdSa1pXNDdYSEpjYmlBZ0lDQWdJSDFjY2x4dVhISmNiaUFnSUNBZ0lDWmZYMkZ5ZEdsamJHVWdlMXh5WEc0Z0lDQWdJQ0FnSUcxaGNtZHBiam9nTkRod2VDQXdPMXh5WEc0Z0lDQWdJQ0FnSUdobGFXZG9kRG9nWTJGc1l5Z3hNREFsSUMwZ09UWndlQ2s3WEhKY2JpQWdJQ0FnSUNBZ2NHRmtaR2x1WnpvZ01DQXhMakkxWlcwN1hISmNiaUFnSUNBZ0lDQWdjMk55YjJ4c0xYUnBiV1ZzYVc1bExXNWhiV1U2SUMwdFRXOWlhV3hsVUhKdlozSmxjM05VYVcxbGJHbHVaVHRjY2x4dUlDQWdJQ0FnSUNCdmRtVnlabXh2ZHkxNE9pQm9hV1JrWlc0N1hISmNiaUFnSUNBZ0lDQWdiM1psY21ac2IzY3RlVG9nYzJOeWIyeHNPMXh5WEc1Y2NseHVJQ0FnSUNBZ0lDQXViM1YwYkdsdVpTMXlaV0ZrWlhKZlgzQnliMmR5WlhOeklIdGNjbHh1SUNBZ0lDQWdJQ0FnSUhvdGFXNWtaWGc2SURRN1hISmNiaUFnSUNBZ0lDQWdJQ0JoYm1sdFlYUnBiMjQ2SUc5MWRHeHBibVV0Y21WaFpHVnlMWEJ5YjJkeVpYTnpJR3hwYm1WaGNqdGNjbHh1SUNBZ0lDQWdJQ0FnSUdGdWFXMWhkR2x2YmkxMGFXMWxiR2x1WlRvZ0xTMU5iMkpwYkdWUWNtOW5jbVZ6YzFScGJXVnNhVzVsTzF4eVhHNGdJQ0FnSUNBZ0lDQWdaR2x6Y0d4aGVUb2dZbXh2WTJzN1hISmNiaUFnSUNBZ0lDQWdmVnh5WEc0Z0lDQWdJQ0I5WEhKY2JpQWdJQ0I5WEhKY2JpQWdmVnh5WEc1OVhISmNibHh5WEc1QWJXVmthV0VnY0hKcGJuUWdlMXh5WEc0Z0lHaDBiV3dzWEhKY2JpQWdZbTlrZVNCN1hISmNiaUFnSUNBdktpRG1pWlBsamJEbm1vVGxuN3Jub1lEbHJaZmt2WlBscEtmbHNJOGdLaTljY2x4dUlDQWdJR1p2Ym5RdGMybDZaVG9nTVRKd2REdGNjbHh1SUNBZ0lDOHFJT2FZdnVla3V1aXV2dWU5cnVhV2grV3RsK21pbk9pSnN1V1NqT2lEak9hWnIrbWluT2lKc2lBcUwxeHlYRzRnSUNBZ1ltRmphMmR5YjNWdVpDMWpiMnh2Y2pvZ1FIZG9hWFJsTzF4eVhHNGdJQ0FnWTI5c2IzSTZJRUJ3Y21sdFlYSjVYM1JsZUhSZlkyOXNiM0k3WEhKY2JpQWdJQ0JvWldsbmFIUTZJR2x1YVhScFlXd2dJV2x0Y0c5eWRHRnVkRHRjY2x4dUlDQjlYSEpjYmx4eVhHNGdJQzhxSU9pdXZ1ZTlydW1UdnVhT3BlYWd0K1c4anlBcUwxeHlYRzRnSUdFNmJHbHVheXhjY2x4dUlDQmhPblpwYzJsMFpXUXNYSEpjYmlBZ1lUcG9iM1psY2lCN1hISmNiaUFnSUNCMFpYaDBMV1JsWTI5eVlYUnBiMjQ2SUhWdVpHVnliR2x1WlNBaGFXMXdiM0owWVc1ME8xeHlYRzRnSUNBZ1kyOXNiM0k2SUVCd2NtbHRZWEo1WDJOdmJHOXlPMXh5WEc0Z0lIMWNjbHh1WEhKY2JpQWdMeW9nNlpxUTZKZVA1YXFTNUwyVDVxQ0g1NjIrSUNvdlhISmNiaUFnZG1sa1pXOHNYSEpjYmlBZ1lYVmthVzhnZTF4eVhHNGdJQ0FnWkdsemNHeGhlVG9nYm05dVpTQWhhVzF3YjNKMFlXNTBPMXh5WEc0Z0lIMWNjbHh1WEhKY2JpQWdMeW9nNTZHdTVMK2Q2S0dvNXFDODVaeW81b21UNVkydzVwZTI1NXFFNkw2NTVxR0c1WktNNWErNTZiMlE1cGE1NWJ5UDVyaUY1cG13SUNvdlhISmNiaUFnZEdGaWJHVWdlMXh5WEc0Z0lDQWdkMmxrZEdnNklERXdNQ1U3WEhKY2JpQWdJQ0JpYjNKa1pYSXRZMjlzYkdGd2MyVTZJR052Ykd4aGNITmxPMXh5WEc0Z0lIMWNjbHh1SUNCMGFDeGNjbHh1SUNCMFpDQjdYSEpjYmlBZ0lDQmliM0prWlhJNklERndlQ0J6YjJ4cFpDQkFjSEpwYldGeWVWOWliM0prWlhKZlkyOXNiM0k3WEhKY2JpQWdJQ0J3WVdSa2FXNW5PaUE0Y0hnZ01qQndlRHRjY2x4dUlDQjlYSEpjYmx4eVhHNGdJQzV2ZFhSc2FXNWxJSHRjY2x4dUlDQWdJQ1l0YldWemMyRm5aU3hjY2x4dUlDQWdJQ1l0ZEc5dmJHSmhjaUI3WEhKY2JpQWdJQ0FnSUM4cUlPbWFrT2lYaitTNmh1VzNwZVdGdCthZ2orV1NqT1Mvb2VhQnIrYVBrT2VrdXVhaGhpQXFMMXh5WEc0Z0lDQWdJQ0JrYVhOd2JHRjVPaUJ1YjI1bElDRnBiWEJ2Y25SaGJuUTdYSEpjYmlBZ0lDQjlYSEpjYmx4eVhHNGdJQ0FnSmkxeVpXRmtaWElnZTF4eVhHNGdJQ0FnSUNCa2FYTndiR0Y1T2lCaWJHOWpheUFoYVcxd2IzSjBZVzUwTzF4eVhHNGdJQ0FnSUNCdmRtVnlabXh2ZHpvZ2FHbGtaR1Z1TzF4eVhHNWNjbHh1SUNBZ0lDQWdKbDlmZEdsMGJHVWdlMXh5WEc0Z0lDQWdJQ0FnSUcxaGNtZHBiam9nTVRNdU5IQjBJREFnTWpod2RDQWhhVzF3YjNKMFlXNTBPMXh5WEc0Z0lDQWdJQ0FnSUhSbGVIUXRZV3hwWjI0NklHTmxiblJsY2lBaGFXMXdiM0owWVc1ME8xeHlYRzRnSUNBZ0lDQWdJR1p2Ym5RdGMybDZaVG9nTXpKd2RDQWhhVzF3YjNKMFlXNTBPMXh5WEc0Z0lDQWdJQ0I5WEhKY2JseHlYRzRnSUNBZ0lDQXZLaURsajVibXRvamt1b2JudTUzbHI3bmxycHJrdlkwZ0tpOWNjbHh1SUNBZ0lDQWdKaTB0Y21WaFpHbHVaeUI3WEhKY2JpQWdJQ0FnSUNBZ2NHOXphWFJwYjI0NklISmxiR0YwYVhabElDRnBiWEJ2Y25SaGJuUTdYSEpjYmlBZ0lDQWdJQ0FnYUdWcFoyaDBPaUJoZFhSdklDRnBiWEJ2Y25SaGJuUTdYSEpjYmlBZ0lDQWdJQ0FnY0dGa1pHbHVaem9nTUNBaGFXMXdiM0owWVc1ME8xeHlYRzRnSUNBZ0lDQWdJR0poWTJ0bmNtOTFibVF0WTI5c2IzSTZJRUIzYUdsMFpUdGNjbHh1SUNBZ0lDQWdJQ0J2ZG1WeVpteHZkem9nYUdsa1pHVnVJQ0ZwYlhCdmNuUmhiblE3WEhKY2JpQWdJQ0FnSUgxY2NseHVYSEpjYmlBZ0lDQWdJQzhxSU9tYWtPaVhqK21ZaGVpdnUraS9tK1c2cHVhZG9TQXFMMXh5WEc0Z0lDQWdJQ0FtWDE5d2NtOW5jbVZ6Y3lCN1hISmNiaUFnSUNBZ0lDQWdaR2x6Y0d4aGVUb2dibTl1WlNBaGFXMXdiM0owWVc1ME8xeHlYRzRnSUNBZ0lDQjlYSEpjYmx4eVhHNGdJQ0FnSUNBdktpRG1pWlBsamJEbWw3Ymt1STNtbUw3bnBMcm1yYVBtbG9jZ1JFOU5JT2VhaE9tWXRPVzlzZWFWaU9hZW5DQXFMMXh5WEc0Z0lDQWdJQ0FtWDE5d1lYQmxjaUI3WEhKY2JpQWdJQ0FnSUNBZ1ltOTRMWE5vWVdSdmR6b2dibTl1WlR0Y2NseHVJQ0FnSUNBZ2ZWeHlYRzVjY2x4dUlDQWdJQ0FnY0hKbElIdGNjbHh1SUNBZ0lDQWdJQ0J3WVdSa2FXNW5PaUF4WlcwZ0lXbHRjRzl5ZEdGdWREdGNjbHh1SUNBZ0lDQWdJQ0JpYjNKa1pYSTZJREZ3ZUNCemIyeHBaQ0JBWW05eVpHVnlYMk52Ykc5eUlDRnBiWEJ2Y25SaGJuUTdYSEpjYmlBZ0lDQWdJQ0FnWW05eVpHVnlMWEpoWkdsMWN6b2dOSEI0SUNGcGJYQnZjblJoYm5RN1hISmNiaUFnSUNBZ0lIMWNjbHh1WEhKY2JpQWdJQ0FnSUhCeVpTeGNjbHh1SUNBZ0lDQWdZMjlrWlNCN1hISmNiaUFnSUNBZ0lDQWdZbUZqYTJkeWIzVnVaQzFqYjJ4dmNqb2dRSGRvYVhSbElDRnBiWEJ2Y25SaGJuUTdYSEpjYmlBZ0lDQWdJSDFjY2x4dVhISmNiaUFnSUNBZ0lIUmhZbXhsTEZ4eVhHNGdJQ0FnSUNCcGJXY3NYSEpjYmlBZ0lDQWdJSE4yWnlCN1hISmNiaUFnSUNBZ0lDQWdZbkpsWVdzdGFXNXphV1JsT2lCaGRtOXBaRHRjY2x4dUlDQWdJQ0FnZlZ4eVhHNWNjbHh1SUNBZ0lDQWdMeW9nNW9tQTVweUo1cGFINTZ1ZzVZYUY1YTY1SUVSUFRTRG5tN2psaGJQbm1vVHBncnZsc1lYb2lvTG5ncm5wZzczcG1wRG9sNC9rdW9ZZ0tpOWNjbHh1SUNBZ0lDQWdKbDl6YVdKc2FXNW5JSHRjY2x4dUlDQWdJQ0FnSUNCa2FYTndiR0Y1T2lCdWIyNWxJQ0ZwYlhCdmNuUmhiblE3WEhKY2JpQWdJQ0FnSUgxY2NseHVJQ0FnSUgxY2NseHVJQ0I5WEhKY2JuMWNjbHh1SWl3aUx5b3FYSEpjYmlBcUlISmhaR2wxY3k1c1pYTnpJQzBnNVp5RzZLZVM2SzYrNTcydUlHMXBlR2x1ZUNEbGg3M21sYkJjY2x4dUlDb2dQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBWeHlYRzRnS2lCRGNtVmhkR1ZrSUVKNU9pQlpZVzlvWVdsNGFXRnZYSEpjYmlBcUlGVndaR0YwWlRvZ01qQXlOQzQwTGpFMlhISmNiaUFxTDF4eVhHNWNjbHh1THlvZ1BUMDlQVDA5SU9XY2h1aW5rdWFndCtXOGoraXV2dWU5cnVXSHZlYVZzQ0E5UFQwOVBUMGdLaTljY2x4dUxuSmhaR2wxY3loQWJuVnRPaUF5Y0hncElIdGNjbHh1SUNCaWIzSmtaWEl0Y21Ga2FYVnpPaUJBYm5WdE8xeHlYRzU5WEhKY2JseHlYRzR1Y21Ga2FYVnpYMjV2Ym1Vb0tTQjdYSEpjYmlBZ0xuSmhaR2wxY3lnd0tUdGNjbHh1ZlZ4eVhHNWNjbHh1TG5KaFpHbDFjMTl0YVc1cEtDa2dlMXh5WEc0Z0lDNXlZV1JwZFhNb01uQjRLVHRjY2x4dWZWeHlYRzVjY2x4dUxuSmhaR2wxYzE5emJXRnNiQ2dwSUh0Y2NseHVJQ0F1Y21Ga2FYVnpLRE53ZUNrN1hISmNibjFjY2x4dVhISmNiaTV5WVdScGRYTmZjbVZuZFd4aGNpZ3BJSHRjY2x4dUlDQXVjbUZrYVhWektEUndlQ2s3WEhKY2JuMWNjbHh1WEhKY2JpNXlZV1JwZFhOZmJXVmthWFZ0S0NrZ2UxeHlYRzRnSUM1eVlXUnBkWE1vTlhCNEtUdGNjbHh1ZlZ4eVhHNWNjbHh1TG5KaFpHbDFjMTlzWVhKblpTZ3BJSHRjY2x4dUlDQXVjbUZrYVhWektERXdjSGdwTzF4eVhHNTlYSEpjYmx4eVhHNHVjbUZrYVhWelgyaDFaMlVvS1NCN1hISmNiaUFnTG5KaFpHbDFjeWd4Tm5CNEtUdGNjbHh1ZlZ4eVhHNWNjbHh1TG5KaFpHbDFjMTl5YjNWdVpDZ3BJSHRjY2x4dUlDQXVjbUZrYVhWektETXdjSGdwTzF4eVhHNTlYSEpjYmlJc0lrQnBiWEJ2Y25RZ0p5NHVMM1JvWlcxbEwyTnZiRzl5Y3ljN1hISmNia0JwYlhCdmNuUWdKeTR1TDNSb1pXMWxMM05vWVdSdmR5YzdYSEpjYmx4eVhHNHViM1YwYkdsdVpTMTBiMjlzWW1GeUlIdGNjbHh1SUNCd2IzTnBkR2x2YmpvZ1ptbDRaV1E3WEhKY2JpQWdlaTFwYm1SbGVEb2dPVGs1T1RrN1hISmNiaUFnYldGeVoybHVPaUF3TzF4eVhHNGdJSFJ5WVc1emFYUnBiMjR0WkhWeVlYUnBiMjQ2SURBdU0zTTdYSEpjYmlBZ2IzWmxjbVpzYjNjNklHaHBaR1JsYmp0Y2NseHVYSEpjYmlBZ0psOWZZblYwZEc5dUlIdGNjbHh1SUNBZ0lDNXphR0ZrYjNkZmJHbG5hSFJmY21WbmRXeGhjaWdwTzF4eVhHNGdJQ0FnY0c5emFYUnBiMjQ2SUhKbGJHRjBhWFpsTzF4eVhHNGdJQ0FnZWkxcGJtUmxlRG9nTVR0Y2NseHVJQ0FnSUcxaGNtZHBiam9nTVRCd2VEdGNjbHh1SUNBZ0lIZHBaSFJvT2lBek5uQjRPMXh5WEc0Z0lDQWdhR1ZwWjJoME9pQXpObkI0TzF4eVhHNGdJQ0FnWW05eVpHVnlPaUF4Y0hnZ2MyOXNhV1FnUUhCeWFXMWhjbmxmWW05eVpHVnlYMk52Ykc5eU8xeHlYRzRnSUNBZ1ltOXlaR1Z5TFhKaFpHbDFjem9nTTNCNE8xeHlYRzRnSUNBZ1ltOTRMWE5wZW1sdVp6b2dZbTl5WkdWeUxXSnZlRHRjY2x4dUlDQWdJR0poWTJ0bmNtOTFibVF0WTI5c2IzSTZJRUIzYUdsMFpUdGNjbHh1SUNBZ0lHTjFjbk52Y2pvZ2NHOXBiblJsY2p0Y2NseHVJQ0FnSUhSbGVIUXRZV3hwWjI0NklHTmxiblJsY2p0Y2NseHVJQ0FnSUdOdmJHOXlPaUJBWm05MWNuUm9YM1JsZUhSZlkyOXNiM0k3WEhKY2JpQWdJQ0IwY21GdWMybDBhVzl1T2lCaGJHd2dNQzR6Y3lBd0xqRnpJR1ZoYzJVdGFXNHRiM1YwTzF4eVhHNGdJQ0FnYjNabGNtWnNiM2M2SUdocFpHUmxianRjY2x4dVhISmNiaUFnSUNBbU9taHZkbVZ5SUh0Y2NseHVJQ0FnSUNBZ1kyOXNiM0k2SUVCemRXTmpaWE56WDJOdmJHOXlPMXh5WEc0Z0lDQWdJQ0JpYjNKa1pYSXRZMjlzYjNJNklFQnpkV05qWlhOelgyTnZiRzl5TzF4eVhHNGdJQ0FnSUNCMGNtRnVjMlp2Y20wNklITmpZV3hsS0RFdU16VXBPMXh5WEc0Z0lDQWdmVnh5WEc1Y2NseHVJQ0FnSUNZdWFHbGtaU0I3WEhKY2JpQWdJQ0FnSUdScGMzQnNZWGs2SUc1dmJtVTdYSEpjYmlBZ0lDQjlYSEpjYmlBZ2ZWeHlYRzVjY2x4dUlDQW1YMTloYm1Ob2IzSWdlMXh5WEc0Z0lDQWdKanBzYVc1ckxGeHlYRzRnSUNBZ0pqcDJhWE5wZEdWa0xGeHlYRzRnSUNBZ0pqcG9iM1psY2lCN1hISmNiaUFnSUNBZ0lHTnZiRzl5T2lCQVptOTFjblJvWDNSbGVIUmZZMjlzYjNJN1hISmNiaUFnSUNBZ0lIUmxlSFF0WkdWamIzSmhkR2x2YmpvZ2JtOXVaVHRjY2x4dUlDQWdJSDFjY2x4dVhISmNiaUFnSUNBbU9taHZkbVZ5SUh0Y2NseHVJQ0FnSUNBZ1kyOXNiM0k2SUVCemRXTmpaWE56WDJOdmJHOXlPMXh5WEc0Z0lDQWdmVnh5WEc0Z0lIMWNjbHh1WEhKY2JpQWdKbDlmYVdOdmJpQjdYSEpjYmlBZ0lDQndiM05wZEdsdmJqb2dZV0p6YjJ4MWRHVTdYSEpjYmlBZ0lDQjZMV2x1WkdWNE9pQXlPMXh5WEc0Z0lDQWdkRzl3T2lBMU1DVTdYSEpjYmlBZ0lDQnNaV1owT2lBMU1DVTdYSEpjYmlBZ0lDQjNhV1IwYURvZ01qQndlRHRjY2x4dUlDQWdJR2hsYVdkb2REb2dNakJ3ZUR0Y2NseHVJQ0FnSUhSeVlXNXpabTl5YlRvZ2RISmhibk5zWVhSbEtDMDFNQ1VzSUMwMU1DVXBPMXh5WEc0Z0lDQWdabWxzYkRvZ1kzVnljbVZ1ZEdOdmJHOXlPMXh5WEc0Z0lDQWdiM1psY21ac2IzYzZJR2hwWkdSbGJqdGNjbHh1SUNCOVhISmNibHh5WEc0Z0lDWmZZV04wYVhabElIdGNjbHh1SUNBZ0lDWXViM1YwYkdsdVpTMTBiMjlzWW1GeUlIdGNjbHh1SUNBZ0lDQWdKbDlmWW5WMGRHOXVJSHRjY2x4dUlDQWdJQ0FnSUNCamIyeHZjam9nUUhkb2FYUmxPMXh5WEc0Z0lDQWdJQ0FnSUdKaFkydG5jbTkxYm1RdFkyOXNiM0k2SUVCemRXTmpaWE56WDJOdmJHOXlPMXh5WEc0Z0lDQWdJQ0FnSUdKdmNtUmxjaTFqYjJ4dmNqb2dRSE4xWTJObGMzTmZZMjlzYjNJN1hISmNibHh5WEc0Z0lDQWdJQ0FnSUNZNmFHOTJaWElnZTF4eVhHNGdJQ0FnSUNBZ0lDQWdZMjlzYjNJNklFQjNhR2wwWlR0Y2NseHVJQ0FnSUNBZ0lDQjlYSEpjYmlBZ0lDQWdJSDFjY2x4dUlDQWdJSDFjY2x4dVhISmNiaUFnSUNBdWIzVjBiR2x1WlMxMGIyOXNZbUZ5WDE5aGJtTm9iM0lnZTF4eVhHNGdJQ0FnSUNBbU9teHBibXNzWEhKY2JpQWdJQ0FnSUNZNmRtbHphWFJsWkN4Y2NseHVJQ0FnSUNBZ0pqcG9iM1psY2lCN1hISmNiaUFnSUNBZ0lDQWdZMjlzYjNJNklFQjNhR2wwWlR0Y2NseHVJQ0FnSUNBZ2ZWeHlYRzRnSUNBZ2ZWeHlYRzRnSUgxY2NseHVYSEpjYmlBZ0psOXliM1Z1WkdWa0lIdGNjbHh1SUNBZ0lDWXViM1YwYkdsdVpTMTBiMjlzWW1GeVgxOWlkWFIwYjI0Z2UxeHlYRzRnSUNBZ0lDQmliM0prWlhJdGNtRmthWFZ6T2lBeE9IQjRPMXh5WEc0Z0lDQWdmVnh5WEc0Z0lIMWNjbHh1WEhKY2JpQWdKbDlrYVhOaFlteGxaQ0I3WEhKY2JpQWdJQ0FtTG05MWRHeHBibVV0ZEc5dmJHSmhjaXhjY2x4dUlDQWdJQzV2ZFhSc2FXNWxMWFJ2YjJ4aVlYSWdlMXh5WEc0Z0lDQWdJQ0FtWDE5aGJtTm9iM0k2YkdsdWF5eGNjbHh1SUNBZ0lDQWdKbDlmWVc1amFHOXlPblpwYzJsMFpXUXNYSEpjYmlBZ0lDQWdJQ1pmWDJGdVkyaHZjanBvYjNabGNpeGNjbHh1SUNBZ0lDQWdKbDlmWW5WMGRHOXVJSHRjY2x4dUlDQWdJQ0FnSUNCamRYSnpiM0k2SUc1dmRDMWhiR3h2ZDJWa08xeHlYRzRnSUNBZ0lDQWdJR052Ykc5eU9pQkFabTkxY25Sb1gzUmxlSFJmWTI5c2IzSTdYSEpjYmlBZ0lDQWdJQ0FnWW05eVpHVnlMV052Ykc5eU9pQkFabTkxY25Sb1gzUmxlSFJmWTI5c2IzSTdYSEpjYmx4eVhHNGdJQ0FnSUNBZ0lDWTZhRzkyWlhJZ2UxeHlYRzRnSUNBZ0lDQWdJQ0FnWTI5c2IzSTZJRUJtYjNWeWRHaGZkR1Y0ZEY5amIyeHZjanRjY2x4dUlDQWdJQ0FnSUNBZ0lHSnZjbVJsY2kxamIyeHZjam9nUUdadmRYSjBhRjkwWlhoMFgyTnZiRzl5TzF4eVhHNGdJQ0FnSUNBZ0lIMWNjbHh1SUNBZ0lDQWdmVnh5WEc1Y2NseHVJQ0FnSUNBZ0psOWZZblYwZEc5dUlIdGNjbHh1SUNBZ0lDQWdJQ0JpWVdOclozSnZkVzVrTFdOdmJHOXlPaUJBWkdsellXSnNaV1JmWW1kZlkyOXNiM0k3WEhKY2JpQWdJQ0FnSUgxY2NseHVJQ0FnSUgxY2NseHVJQ0I5WEhKY2JseHlYRzRnSUNaZmRIUmlMRnh5WEc0Z0lDWmZZblIwSUh0Y2NseHVJQ0FnSUd4bFpuUTZJRFV3SlR0Y2NseHVJQ0FnSUhSeVlXNXpabTl5YlRvZ2RISmhibk5zWVhSbFdDZ3ROVEFsS1R0Y2NseHVYSEpjYmlBZ0lDQXViM1YwYkdsdVpTMTBiMjlzWW1GeVgxOWlkWFIwYjI0Z2UxeHlYRzRnSUNBZ0lDQmthWE53YkdGNU9pQnBibXhwYm1VdFlteHZZMnM3WEhKY2JpQWdJQ0I5WEhKY2JpQWdmVnh5WEc1Y2NseHVJQ0FtWDNSMFlpQjdYSEpjYmlBZ0lDQjBiM0E2SURFeWNIZzdYSEpjYmx4eVhHNGdJQ0FnSmk1dmRYUnNhVzVsTFhSdmIyeGlZWEpmYUdsa1pHVnVJSHRjY2x4dUlDQWdJQ0FnZEc5d09pQXROVFp3ZUR0Y2NseHVJQ0FnSUgxY2NseHVJQ0I5WEhKY2JseHlYRzRnSUNaZlluUjBJSHRjY2x4dUlDQWdJR0p2ZEhSdmJUb2dNVEp3ZUR0Y2NseHVYSEpjYmlBZ0lDQW1MbTkxZEd4cGJtVXRkRzl2YkdKaGNsOW9hV1JrWlc0Z2UxeHlYRzRnSUNBZ0lDQmliM1IwYjIwNklDMDFObkI0TzF4eVhHNGdJQ0FnZlZ4eVhHNGdJSDFjY2x4dVhISmNiaUFnSmw5eWRHd3NYSEpjYmlBZ0psOXNkSElnZTF4eVhHNGdJQ0FnZEhKaGJuTm1iM0p0T2lCMGNtRnVjMnhoZEdWWktDMDFNQ1VwTzF4eVhHNGdJQ0FnZDJsa2RHZzZJRFUyY0hnN1hISmNiaUFnZlZ4eVhHNWNjbHh1SUNBbVgzSjBiQ0I3WEhKY2JpQWdJQ0IwYjNBNklEVXdKVHRjY2x4dUlDQWdJSEpwWjJoME9pQXhNbkI0TzF4eVhHNWNjbHh1SUNBZ0lDWXViM1YwYkdsdVpTMTBiMjlzWW1GeVgyaHBaR1JsYmlCN1hISmNiaUFnSUNBZ0lISnBaMmgwT2lBdE9EWndlRHRjY2x4dUlDQWdJSDFjY2x4dUlDQjlYSEpjYmx4eVhHNGdJQ1pmYkhSeUlIdGNjbHh1SUNBZ0lIUnZjRG9nTlRBbE8xeHlYRzRnSUNBZ2JHVm1kRG9nTVRKd2VEdGNjbHh1WEhKY2JpQWdJQ0FtTG05MWRHeHBibVV0ZEc5dmJHSmhjbDlvYVdSa1pXNGdlMXh5WEc0Z0lDQWdJQ0JzWldaME9pQXRPRFp3ZUR0Y2NseHVJQ0FnSUgxY2NseHVJQ0I5WEhKY2JseHlYRzRnSUNaZmRIUmlMRnh5WEc0Z0lDWmZjblJzTEZ4eVhHNGdJQ1pmWW5SMExGeHlYRzRnSUNaZmJIUnlJSHRjY2x4dUlDQWdJQzV2ZFhSc2FXNWxMWFJ2YjJ4aVlYSmZYMkoxZEhSdmJpQjdYSEpjYmlBZ0lDQWdJQ1l1YjNWMGJHbHVaUzEwYjI5c1ltRnlYMmhwWkdSbGJpQjdYSEpjYmlBZ0lDQWdJQ0FnWkdsemNHeGhlVG9nYm05dVpUdGNjbHh1SUNBZ0lDQWdmVnh5WEc0Z0lDQWdmVnh5WEc0Z0lIMWNjbHh1ZlZ4eVhHNGlYWDA9ICovXG4iXSwiZmlsZSI6Im91dGxpbmUubWluLmNzcyJ9 */ diff --git a/outline.min.js b/outline.min.js index bd5dec33..fda35279 100644 --- a/outline.min.js +++ b/outline.min.js @@ -1,2 +1,2 @@ -!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(t="undefined"!=typeof globalThis?globalThis:t||self).Outline=e()}(this,(function(){"use strict";function t(t,e){(null==e||e>t.length)&&(e=t.length);for(var i=0,s=Array(e);iObject.prototype.toString.apply(t),l=t=>"function"==typeof t||"[object Function]"===o(t),a=(t,e=300)=>!!l(t)&&setTimeout((()=>{t()}),e),h=t=>("[object Object]"===o(t)||"object"==typeof t||l(t))&&null!==t,c=t=>Array.isArray?Array.isArray(t):"[object Array]"===o(t),u=t=>{let e={};return null===t?null:(c(t)?e=Array.from(t):(e=Object.assign({},t),Object.keys(e).forEach((i=>e[i]=h(t[i])?u(t[i]):t[i]))),e)},d=t=>"string"==typeof t,m=t=>!!(h(t)&&t.nodeName&&t.tagName&&1===t.nodeType),p=(t,e)=>{const i=new RegExp("(\\s|^)"+e+"(\\s|$)");let s,r;return!!m(t)&&(s=t.className,!!s&&(r=t.classList,r&&r.contains?t.classList.contains(e):!!i.exec(s)))},g=(t,e)=>{var i;let s,r;if(p(t,e))return!1;s=t.classList,null!==(i=s)&&void 0!==i&&i.add?e.indexOf(" ")>-1?e.split(" ").forEach((t=>{s.add(t)})):s.add(e):(r=t.className,r+=r.length>0?" "+e:e,t.className=r)},f=t=>t*t,b=(t=null)=>{let e,i;return t?d(t)?i=document.querySelector(t):m(t)&&(i=t):(e=document.querySelectorAll("html,body"),i=e[0].scrollTop-e[1].scrollTop>=0?e[0]:e[1]),i},y=(t,e,i)=>{const s=b(t);let r=s.scrollTop,n=0;const o=e-r,a=s.scrollHeight,h=e-a<=0?e:a,c=t=>(l(i)&&i(t),!1),u=()=>{if(n+=1,o<0){if(r-=f(n),s.scrollTop=r,console.log("$scrollElement up",t,s,r,s.scrollTop),r<=e)return s.scrollTop=e,c(e)}else if(r+=f(n),s.scrollTop=r,console.log("$scrollElement down",t,s,r,s.scrollTop),r>=h)return s.scrollTop=h,c(h);requestAnimationFrame(u)};requestAnimationFrame(u)},v=t=>!!d(t)&&t.replace(/(^\s+)|(\s+$)/g,""),$=(t,e=!1,i=null)=>{const s=/^\d(\.|(\.\d+)*)\s?/gi,r=[];let n=1,o=0,a="";return t.forEach(((t,h)=>{const c=t.tagName,u=c.replace(/h/i,"");let m=parseInt(u,10),p=-1;var g;m>n?(o+=1,p=1===o?-1:h-1):m===n||mo?1===m?(o=1,p=-1):p=r[h-1].pid:m<=o&&(1===m?o=1:(o-=n-m,o<=1&&(o=1)),p=1===o?-1:((t,e,i)=>{let s,r,n=t[i-1];for(r=0;r]+(>|$)/g,""):"")),e&&(a=v(a.replace(s,""))),l(i)&&(a=i(a)),r.push({id:h,pid:p,level:o,rel:`heading-${h}`,text:a,tagName:c})})),e?(t=>{const e={};return t.forEach((t=>{const i=JSON.stringify((t=>[t.pid])(t));e[i]=e[i]||[],e[i].push(t),t.index=e[i].length,-1===t.pid&&(t.code=String(t.index))})),Object.keys(e).forEach((t=>{e[t].forEach((t=>{const i=e[`[${t.id}]`];if(!i||!c(i))return!1;i.forEach((e=>{e.code=t.code+"."+e.index}))}))})),t})(r):r},_=t=>{const{articleElement:e,selector:s,showCode:r,chapterTextFilter:o,isTreeStructured:a}=t;let h=document.querySelector("#article"),c=[],u=[],p=null;return d(e)?h=document.querySelector(e):m(e)&&(h=e),h?(l(o)?p=o:!0===o&&(p=t=>t.replace(/\(.*?\)/,"()")),c=i(n,h.querySelectorAll(s||"h1,h2,h3,h4,h5,h6")),u=$(c,r,p),!0===a?((t,e,i)=>{const s={},r=[];return t.forEach(((t,i)=>{s[t[e]]=i,t.children=[]})),t.forEach((e=>{const n=t[s[e[i]]];-1!==e[i]?n.children.push(e):r.push(e)})),r})(u,"id","pid"):u):u},x=(t,e)=>{const i=Object.prototype.hasOwnProperty;return t&&i.call(t,e)},w=(t,e)=>{Object.keys(e).forEach((i=>{x(e,i)&&(t[i]=e[i])}))},T={},E=t=>x(T,t)&&T[t].length>0,S=(t,e=!0)=>e?E(t):(t=>{let e=E(t),i=t.lastIndexOf(".");for(;!e&&-1!==i;)i=(t=t.substring(0,i)).lastIndexOf("."),e=E(t);return e})(t),C=(t,e,i=!0)=>{const s=t=>{if(!E(t))return!1;T[t].forEach((t=>{const i=["[object Int8Array]","[object Uint8Array]","[object Uint8ClampedArray]","[object Int16Array]","[object Uint16Array]","[object Int32Array]","[object Uint32Array]","[object Float32Array]","[object Float64Array]","[object BigInt64Array]","[object BigUint64Array]"].indexOf(o(e))>-1?e.toString():e;t.callback.call(t.context||t,i)}))},r=()=>{let e=t,i=t.lastIndexOf(".");for(;-1!==i;)e=e.substring(0,i),i=e.lastIndexOf("."),s(e);s(t),s("*")};if(!S(t))return!1;i?setTimeout(r,10):r()},L=(()=>{let t=0;return e=>(t+=1,e?e+"-"+t:"guid-"+t)})(),z=t=>{if(!x(T,t))return!1;delete T[t]},k=(t,e)=>{if(!S(t))return!1;e?(t=>{const e=Object.keys(T);if(!t||e.length<1)return!1;e.forEach((e=>{const i=T[e];let s;i.forEach(((e,r)=>{e.callback!==t&&e.token!==t||(s=e.topic,i.splice(-1,r))})),i.length<1&&z(s)}))})(e):z(t)};class M{constructor(t){this.attrs={},t&&this.initialize(t)}initialize(t){return this.attr(t).render().addListeners(),this}attr(t,e){const i=this.attrs;return d(t)?e&&x(i,t)?(i[t]=e,this):i[t]:h(t)?(w(i,t),this):0===arguments.length?i:this}render(){return this}refresh(){return this}destroy(){return this.removeListeners(),this}reload(t){let e=this.attr();return t&&(e=this.attr(t)),this.destroy().initialize(e),this}$emit(t,e){return C(t,e),this}$on(t,e){return((t,e,i=null)=>{const s=L();let r="symbol"==typeof t?t.toString():t;l(e)&&(T[r]||(T[r]=[]),T[r].push({topic:r,callback:e,context:i,token:s}))})(t,e,this),this}$off(t,e){return k(t,e),this}addListeners(){return this}removeListeners(){return this}}const A=[];let O,N;function H(t){for(;t.timeRemaining()>0&&A.length;){const t=A.shift();if(!l(t))return!1;t()}A.length?O=requestIdleCallback(H):(O=0,l(N)&&(N(),N=null))}void 0===window.requestIdleCallback&&(window.requestIdleCallback=function(t){const e=Date.now();return a((function(){t({didTimeout:!1,timeRemaining:function(){return Math.max(0,50-(Date.now()-e))}})}),10)},window.cancelIdleCallback=function(t){clearTimeout(t)});const D=(t,e=null)=>{A.push(t),l(e)&&(N=e),O||requestIdleCallback(H)},j=t=>{let e=t.offsetTop;return null!==t.offsetParent&&(e+=j(t.offsetParent)),e},F=(t,e="")=>{const i=e.replace(/^>/i,"");return!!(e&&i&&t)&&(t.matches?t.matches(i):!!t.msMatchesSelector&&t.msMatchesSelector(i))},R=t=>t.host&&t!==document&&t.host.nodeType?t.host:t.parentNode,q=["focusout","blur","focusin","focus","load","unload","mouseenter","mouseleave"],I=(t,e,i)=>{const s=q.indexOf(e)>-1;i._delegateListener&&delete(i=i._delegateListener)._delegateListener,function(t,e,i){const s=t._listeners;let r=-1;if(s.length<1)return!1;s.forEach(((t,s)=>{const n=t.fn;e===t.type&&(r=s,n===i&&(r=s))})),r>-1&&s.splice(r,1)}(t,e,i),t.removeEventListener(e,i,s)},U=function(t,e,i=!1){const s=d(t)?document.querySelector(t):t,r=s.childNodes,n=((t,e)=>{let i=t._listeners||[];return d(e)&&e&&(i=i.filter((t=>t.type===e))),i})(s,e);n.forEach((t=>{I(s,t.type,t.fn)})),(i||!0===e||1===arguments.length)&&s&&r&&r.forEach((t=>{m(t)&&U(t,e,i)}))},B=(t,e,i)=>{if(!l(i))return U(t,e),!1;I(t,e,i)},P=(t,e,i,s,r,n,o=!1)=>{const l=q.indexOf(i)>-1,a=function(l){const h=function(t){const e=t.target;return(i=e)&&3===i.nodeType?i.parentNode:i;var i}(l),c=((t,e,i,s)=>{const r=i||document;if(!t)return null;do{if(null!=e&&(e.startsWith(">")?t.parentNode===r&&F(t,e):F(t,e))||s&&t===r)return t;if(t===r)break}while(t=R(t))})(h,e,t);let u=n||t;l.delegateTarget=c,!0===n&&(u=r),c&&(!0===o&&B(t,i,a),s.call(u,l,r))};if(!t)return!1;t._listeners||(t._listeners=[]),t._listeners.push({el:t,selector:e,type:i,fn:a,data:r,context:n,capture:l}),s._delegateListener=a,t.addEventListener(i,a,l)},V=function(t){t.stopPropagation(),t.preventDefault()},W=i(n,['','','','','','','','','','','','','','','','','','','','']),Q=(t,e="icon")=>d(t)?((t,e="icon")=>{const i=/id="(.*?)"/,s=/^(\w+)-/;return W.find((r=>{const n=i.exec(r)[1];return s.exec(n)[1]===e&&n===("icon"===e?`${e}-${t}`:`${e}-icon-${t}`)}))})(t,e):i(n,W),J=(t="")=>{const e=document.body;let i=document.querySelector("#outline-icons"),s=[];(t=>{if(!t)return!1;c(t)&&t.length>0?t.forEach((t=>{-1===W.indexOf(t)&&d(t)&&W.push(t)})):d(t)&&W.push(t)})(t),s=Q(),i?i.innerHTML=s.join(""):(i=document.createElement("div"),i.innerHTML=``,e.insertBefore(i.firstChild,e.firstChild))},Y=t=>{return!(!h(t)||!(m(t)||(t=>!(!h(t)||"[object NodeList]"!==o(t)))(t)||(e=t,h(e)&&"[object DocumentFragment]"===o(e))||(t=>!(!h(t)||!("[object Text]"===o(t)||t.tagName&&3===t.nodeType)))(t)));var e},G=(t,e,i)=>{let s=t.tagName.toLowerCase();switch(e){case"style":t.style.cssText=i;break;case"value":"input"===s||"textarea"===s?t.value=i:t.setAttribute(e,i);break;case"htmlFor":t.setAttribute("for",i);break;case"className":g(t,i);break;case"innerHTML":t.innerHTML=i;break;case"innerText":t.innerText=i;break;default:t.setAttribute(e,i)}},K=(t,e)=>{if(!t||!h(e))return!1;Object.keys(e).forEach((i=>{const s=e[i];x(e,i)&&G(t,i,s)}))},X=(t,e,i)=>{const s=document.createDocumentFragment(),r=document.createElement(t),n=t=>Y(t)||d(t),o=t=>{let e;if(!n(t))return!1;Y(t)?e=t:d(t)&&(e=document.createTextNode(t)),s.appendChild(e)};return h(e)?K(r,e):c(e)&&e.every((t=>n(t)))?e.forEach((t=>{o(t)})):Y(e)?o(e):d(e)&&o(document.createTextNode(e)),c(i)?i.forEach((t=>{o(t)})):o(i),r.appendChild(s),r},Z=(t,e={})=>{const i="outline-icon",s=e.size||0,r=e.color||"",n=e.iconSet||"",o=c(s)?s[0]:s,l=c(s)?s[1]:s,a=s?`width:${o}px;height:${l}px;`:"",h=r?a+`color:${r}`:a,u=e.attrs||{},m=document.createElement("i");let p,g="",f="";return d(t)?((t=>{const e=new RegExp("^\\s*(?:<\\?xml[^>]*>\\s*)?(?:<\\!doctype svg[^>]*\\s*(?:\\[?(?:\\s*]*>\\s*)*\\]?)*[^>]*>\\s*)?]*>[^]*<\\/svg>\\s*$\\s*$","i");return d(t)&&e.test(t)})(t)?f=t:(g=n&&"icon"!==n?`xlink:href="#${n}-icon-${t}"`:`xlink:href="#icon-${t}"`,f=``),m.innerHTML=f,u.className?u.className=`${i} ${u.className}`:u.className=i,K(m,u),p=m.querySelector("svg"),K(p,{"aria-hidden":!0,xmlns:"http://www.w3.org/2000/svg",class:"outline-icon__svg",width:200,height:200,style:h}),m):null},tt=(t,e={})=>Z(t,e),et=(t,e)=>{var i;let s,r=t.className;if(!r||!p(t,e))return!1;s=t.classList,null!==(i=s)&&void 0!==i&&i.remove?s.remove(e):(r=v(r.replace(e,"")),t.className=r)},it=(t,e=!0,i=!0)=>{const s="outline-heading",r=t.innerHTML;let n;if(t.innerHTML=r.replace(/^\d+(\.?\d+)*\s?/gi,""),t.removeAttribute("id"),t.removeAttribute("data-id"),et(t,s),!e)return!1;var o;n=t.querySelector(`.${s}__anchor`),i&&et(t,`${s}_start`),o=v(t.className),d(o)&&""===o&&t.removeAttribute("class"),n&&t.removeChild(n)};class st extends M{constructor(t){super(),this._default(),t&&this.initialize(t)}_default(){return this.attrs=u(st.DEFAULTS),this.$articleElement=null,this.$scrollElement=null,this.$headings=[],this}initialize(t){let e,i,s,r;return this.attr(t),r=this.attr("articleElement"),i=this.attr("scrollElement"),e=this.attr("created"),d(r)?s=document.querySelector(r):m(r)&&(s=r),s?(this.$articleElement=s,this.$scrollElement=b(i),this.$headings=this.getHeadings(),this.$headings.length<1||(l(e)&&e.call(this),this.render().addListeners()),this):this}getHeadings(){const t=this.$articleElement,e=this.attr("selector");return i(n,t.querySelectorAll(e))}count(){return this.getHeadings().length}render(){const t=this.attr("articleElement"),e=this.attr("selector"),i=this.attr("showCode"),s=this.attr("chapterTextFilter"),r=this.attr("mounted"),n=_({articleElement:t,selector:e,showCode:i,chapterTextFilter:s});return J(),this._paint(n),l(r)&&r.call(this),this}erase(){return this._remove(),this}_paint(t){const e=400,s=this.attr("hasAnchor"),r=this.attr("isAtStart"),o=this.attr("showCode"),a=this.attr("anchorURL"),h=this.attr("anchorLinkFilter"),c=this.count(),u=i(n,this.$headings),d=(i,n)=>{i.forEach(((i,c)=>{const u=c+n*e,d=t[u].code;((t,e,i)=>{const s="outline-heading",r=i.hasAnchor||!0,n=i.isAtStart||!0,o=i.showCode||!1,a=i.chapterCode||"",h=i.anchorURL||"",c=i.anchorLinkFilter||null,u=`heading-${e}`,d={id:u,className:n?`${s} ${s}_start`:s,"data-id":e},m=v(t.innerHTML);let p,g,f;if(o&&(d.innerHTML=a+" "+m,d["data-code"]=a),K(t,d),!r)return!1;p=h||(l(c)?c(t.tagName.toLowerCase(),m,e):`#${u}`),f=tt("hash",{iconSet:"outline"}),g=X("a",{id:`anchor-${e}`,className:`${s}__anchor anchor-${e}`,href:p,target:h?"_blank":"self","data-id":e},f),t.appendChild(g)})(i,u,{hasAnchor:s,isAtStart:r,showCode:o,chapterCode:d,anchorURL:a,anchorLinkFilter:h})}))};let m=-1;if(c>e)for(m+=1,d(u.splice(0,e),0);u.length>0;){const t=u.splice(0,e);D((()=>{d(t,m+=1)}),(()=>{this.$emit("anchors:all:paint")}))}else d(u,0);return this}_remove(){const t=this.attr("hasAnchor"),e=this.attr("isAtStart");return this.$headings.forEach((i=>{it(i,t,e)})),this}refresh(t){const e=this.attr("articleElement"),i=this.attr("selector"),s=this.attr("showCode"),r=this.attr("chapterTextFilter");return this.$headings=this.getHeadings(),this.erase()._paint(t||_({articleElement:e,selector:i,showCode:s,chapterTextFilter:r})),this}scrollTo(t,e){const i=this.$scrollElement;return y(i,t,e),this}destroy(){const t=this.attr("beforeDestroy"),e=this.attr("afterDestroy");return l(t)&&t.call(this),this.removeListeners()._remove()._default(),l(e)&&e.call(this),this}onAnchorTrigger(t){const e=this.attr("anchorURL"),i=this.attr("afterScroll"),s=this.attr("stickyHeight"),r=t.delegateTarget.parentNode,n=j(r)-(s+10),o=this.$scrollElement,h=o.scrollHeight-o.clientHeight;return this.scrollTo(n,(()=>{l(i)&&i.call(this,"anchor"),a((()=>{this.$emit("toolbar:update",{top:n,min:0,max:h})}))})),e||V(t),this}onRefresh(t){return this.refresh(t),this}addListeners(){const t=this.$articleElement;return this.count()<1||(P(t,".outline-heading__anchor","click",this.onAnchorTrigger,this,!0),this.$on("anchors:refresh",this.onRefresh)),this}removeListeners(){const t=this.$articleElement;return this.count()<1||(B(t,"click",this.onAnchorTrigger),this.$off("anchors:refresh",this.onRefresh)),this}}st.DEFAULTS=u({scrollElement:"html,body",articleElement:"#article",selector:"h1,h2,h3,h4,h5,h6",stickyHeight:0,anchorURL:"",hasAnchor:!0,isAtStart:!0,showCode:!1,created:null,mounted:null,afterScroll:null,beforeDestroy:null,afterDestroy:null,chapterTextFilter:null,anchorLinkFilter:null});const rt=["a","abbr","address","area","article","aside","audio","b","base","bdi","bdo","blockquote","body","br","button","canvas","caption","cite","code","col","colgroup","data","datalist","dd","del","details","dfn","dialog","div","dl","dt","em","embed","fieldset","figcaption","figure","footer","form","h1","h2","h3","h4","h5","h6","head","header","hgroup","hr","html","i","iframe","img","input","ins","kbd","label","legend","li","link","main","map","mark","math","menu","menuitem","meta","meter","nav","noscript","object","ol","optgroup","option","output","p","param","picture","pre","progress","q","rb","rp","rt","rtc","ruby","s","samp","script","search","section","select","slot","small","source","span","strong","style","sub","summary","sup","svg","table","tbody","td","template","textarea","tfoot","th","thead","time","title","tr","track","u","ul","var","video","wbr"],nt=t=>{let e,i,s;return!!d(t)&&(e=v(t).slice(0,1e3),i=/\s*|]*>|]*>|]+>/i,s=new RegExp(rt.map((t=>`<${t}\\b[^>]*>`)).join("|"),"i"),i.test(e)||s.test(e))},ot=t=>t.replace(/]*>.*?<\/script>/gi,""),lt=(t,e)=>{document.documentElement.style.setProperty(t,e)};let at=2e3;const ht=t=>(t?at=t:at+=1,lt("--outline-zIndex",`${at}`),at);class ct extends M{constructor(t){super(),this._default(),this.zIndex=0,t&&this.initialize(t)}_default(){return this.attrs=u(ct.DEFAULTS),this.title="",this.closed=!1,this.$el=null,this.$modal=null,this.$header=null,this.$title=null,this.$close=null,this.$main=null,this.$footer=null,this.$overlay=null,this}initialize(t){let e;return this.attr(t),this.title=this.attr("title"),e=this.attr("created"),l(e)&&e.call(this),this.render().addListeners(),this}setTitle(t){return this.attr("title",t),this.title=t,this.$title.innerHTML=t,this}isClosed(){return this.closed}render(){const t=this.attr("mounted"),e=this.attr("size"),i=this.attr("placement"),s=this.attr("hasClose"),r=this.attr("hasOverlay"),n=this.attr("hasOffset"),o=this.attr("hasPadding"),a=this.attr("autoHeight"),h=this.attr("overflow"),c=this.attr("customClass");let u,d,m,p,f,b,y,v,$="outline-drawer__main";return J(),this.zIndex=ht(),p=X("h2",{className:"outline-drawer__title"},this.title),this.$title=p,s&&(f=X("div",{className:"outline-drawer__close"},tt("close",{iconSet:"outline",size:20})),this.$close=f),m=X("header",{className:"outline-drawer__header"},[p,f]),this.$header=m,"hidden"===h&&($+=" overflow-hidden"),b=X("div",{className:$}),this.$main=b,o||g(b,"outline-drawer_full"),y=X("footer",{className:"outline-drawer__footer"}),this.$footer=y,d=X("div",{className:`outline-drawer__modal outline-drawer_${i} outline-drawer_${e} outline-drawer_closed`},[m,b,y]),this.$modal=d,n&&g(d,"outline-drawer_offset"),a&&g(d,"outline-drawer_auto"),c&&g(d,c),r&&(v=X("div",{className:"outline-drawer__overlay"}),this.$overlay=v),u=X("div",{className:"outline-drawer"},[d,v]),this.$el=u,document.body.appendChild(u),l(t)&&t.call(this),this}erase(){return this.$main.innerHTML="",this}_paint(t){let e=null;return l(t)?e=t():Y(t)?e=t:nt(t)&&(e=((t,e)=>{const s=document.createDocumentFragment();if(!t||!nt(t)&&!d(t)&&!m(t))return null;if(nt(t)){const e=X("div");let r=[];return e.innerHTML=ot(t),r=i(n,e.childNodes),r.forEach((t=>{s.appendChild(t)})),s}if(!d(e))return t.innerHTML;t.innerHTML=ot(e)})(t)),e&&this.$main.appendChild(e),this}_remove(){return document.body.removeChild(this.$el),this}refresh(t){return this.erase()._paint(t),this}open(){const t=this.attr("afterOpened"),e=this.$modal;return g(this.$el,"outline-drawer_opened"),et(e,"outline-drawer_closed"),g(e,"outline-drawer_opened"),a((()=>{this.closed=!1,l(t)&&t.call(this)})),this}close(){const t=this.attr("afterClosed"),e=this.$modal;return et(e,"outline-drawer_opened"),g(e,"outline-drawer_closed"),a((()=>{et(this.$el,"outline-drawer_opened"),this.closed=!0,l(t)&&t.call(this)})),this}toggle(){const t=this.attr("afterToggle"),e=this.isClosed();return e?this.open():this.close(),l(t)&&a((()=>{t.call(this,e)})),this}destroy(){const t=this.attr("afterDestroy"),e=this.attr("beforeDestroy");let i=this.zIndex;return l(e)&&e.call(this),this.removeListeners()._remove()._default(),i-=1,ht(i),this.zIndex=0,l(t)&&t.call(this),this}onClose(){return this.close(),this}addListeners(){const t=this.attr("hasClose"),e=this.attr("hasOverlay"),i=this.attr("closeOnClickModal"),s=this.$el;return t&&P(s,".outline-drawer__close","click",this.onClose,this,!0),e&&i&&P(s,".outline-drawer__overlay","click",this.onClose,this,!0),this}removeListeners(){const t=this.attr("hasClose"),e=this.attr("hasOverlay"),i=this.$el;return t||e?(B(i,"click",this.onClose),this):this}}ct.DEFAULTS=u({placement:"rtl",title:"标题",size:"regular",hasClose:!0,hasOverlay:!0,hasOffset:!1,hasPadding:!0,autoHeight:!0,closeOnClickModal:!0,overflow:"auto",created:null,mounted:null,afterClosed:null,afterOpened:null,afterScroll:null,beforeDestroy:null,afterDestroy:null,afterToggle:null});const ut=(t,e,i,s,r,n=!1)=>{const o=q.indexOf(e)>-1,a=function(o){let l=r||t;!0===r&&(l=s),!0===n&&B(t,e,a),i.call(l,o,s)};if(!l(i))return!1;t._listeners||(t._listeners=[]),t._listeners.push({el:t,type:e,fn:a,data:s,context:r,capture:o}),i._delegateListener=a,t.addEventListener(e,a,o)},dt=(t,e)=>getComputedStyle(t)[e],mt="outline-navigator_hidden",pt="outline-navigator_expanded",gt="outline-navigator_folded";class ft extends M{constructor(t){super(),this._default(),this.scrollTimer=null,this.resizeTimer=null,this.observerTimer=null,this.Observer=null,t&&this.initialize(t)}_default(){return this.attrs=u(ft.DEFAULTS),this.$el=null,this.$title=null,this.$main=null,this.$list=null,this.$placeholder=null,this.$parentElement=null,this.$scrollElement=null,this.$active=null,this.chapters=[],this.active=0,this.offsetWidth=0,this.offsetTop=0,this.playing=!1,this.closed=!1,this}initialize(t){let e,i,s,r;return this.attr(t),e=this.attr("created"),i=this.attr("parentElement"),s=this.attr("scrollElement"),d(i)?r=document.querySelector(i):m(i)&&(r=i),this.$parentElement=r,this.$scrollElement=b(s),this.chapters=this.attr("chapters"),this.closed=this.attr("closed"),this.active=this.attr("active"),l(e)&&e.call(this),this.chapters.length<1||(this.render().addListeners(),this.$active=document.querySelector(`#chapter-${this.active}`)),this}isClosed(){return this.closed}isSticky(){return"sticky"===this.attr("position")}isFixed(){return"fixed"===this.attr("position")}isInside(){return this.isFixed()||this.isSticky()}isOutside(){return!this.isInside()}count(){return this.chapters.length}_paintEdge(){const t=document.createDocumentFragment(),e=this.attr("title"),i=this.attr("animationCurrent"),s=this.attr("customClass"),r=this.$parentElement,n=[],o=[];let l,a,h,c,u=null;return r?(this.isInside()&&e&&(u=X("h2",{className:"outline-navigator__title"},e),this.$title=u,o.push(u)),h=X("ul",{className:"outline-navigator__list"}),this.$list=h,n.push(h),i&&(c=X("div",{className:"outline-navigator__placeholder"}),this.$placeholder=c,n.push(c)),a=X("div",{className:"outline-navigator__main"},n),this.$main=a,o.push(a),l=X("nav",{id:"outline-navigator",className:`outline-navigator ${mt}`},o),this.$el=l,this.isSticky()&&(this.calculateStickyHeight(),g(l,"outline-navigator_sticky")),s&&g(l,s),t.appendChild(l),r.appendChild(t),this):this}render(){const t=this.attr("mounted"),e=this.$parentElement,i=this.chapters,s=this.count();let r;return!e||i.length<1||(this.isInside()&&g(e,"outline-navigator-parent"),this._paintEdge(),r=this.$el,this._paint(i),a((()=>{this.highlight(this.active)}),60),this.offsetTop=j(r),this.offsetWidth=r.offsetWidth,this.isFixed()&&(this.sticky(),lt("--outline-navigator-width",`${this.offsetWidth}px`)),l(t)&&t.call(this),s<400&&this.onObserver()),this}erase(){return this.$list.innerHTML="",this}_paint(t){const e=this.attr("showCode"),s=this.$el;return((t,e,s=!1)=>{const r=e.length,o=i(n,e),l=e=>{const i=e=>t.querySelector(`#${e}`);e.forEach((e=>{const r=e.pid,n=e.id,o=e.code,l=e.rel,a=[],h=X("span",{className:"outline-navigator__text"},e.text);let c,u,d,m,p;s&&(u=X("span",{className:"outline-navigator__code","data-id":n},e.code),a.push(u)),a.push(h),c=X("a",{id:`chapter__anchor-${n}`,className:"outline-navigator__anchor",href:"#"+l,rel:l,"data-id":n,"data-code":o},a),d=X("li",{id:`chapter-${n}`,className:"outline-navigator__item","data-id":n,"data-code":o},c),-1===r?t.appendChild(d):(p=i(`chapter-${r}`),m=i(`subject-${r}`),m?m.appendChild(d):(m=X("ul",{id:"subject-"+r,className:"outline-navigator__subject"},d),p.appendChild(m)))}))};if(r>400)for(l(o.splice(0,400));o.length>0;){const t=o.splice(0,400);D((()=>{l(t)}))}else l(o)})(this.$list,t,e),et(s,mt),g(s,pt),this}_remove(){return this.$parentElement.removeChild(this.$el),this}refresh(t){const e=this.$el;return et(e,mt),this.erase()._paint(t),this}_getPlaceholderOffset(t){const e=this.$main,i=this.$list,s=i.querySelector(".outline-navigator__anchor"),r=parseInt(dt(e,"padding-top"),10),n=parseInt(dt(e,"border-top-width"),10),o=parseInt(dt(i,"padding-top"),10),l=parseInt(dt(i,"margin-top"),10),a=parseInt(dt(i,"border-top-width"),10);let h,c=0;return r&&(c+=r),o&&(c+=o),l&&(c+=l),n&&(c+=n),a&&(c+=a),h=s.offsetHeight*t,c+h}positionPlaceholder(t){const e=this.$list,i=this.$placeholder,s=e.querySelector(".outline-navigator__anchor"),r=this.attr("animationCurrent"),n=s.offsetHeight;let o=0;return r?(o=this._getPlaceholderOffset(t),i.style.cssText=`transform: translateY(${o}px);height:${n}px;`,this):this}highlight(t){const e=this.$el,i=this.attr("animationCurrent"),s="outline-navigator_active",r="outline-navigator_highlight";let n="relative"===this.attr("position")?this.$parentElement:this.$main,o=null,l=0;return e?(o=e.querySelector(`#chapter__anchor-${t}`),o?(this.active=parseInt(o.getAttribute("data-id"),10),this.$active&&(et(this.$active,r),et(this.$active,s)),this.$active=o,g(this.$active,s),i?this.positionPlaceholder(this.active):g(this.$active,r),a((()=>{((t,e)=>{let i,s,r=!1;return m(t)&&m(e)?(i=e.getBoundingClientRect(),s=t.getBoundingClientRect(),r=!!(s.top>=i.top&&s.right<=i.right&&s.bottom<=i.bottom&&s.left>=i.left),r):r})(this.$active,n)||(l=this._getPlaceholderOffset(this.active),y(n,l))})),this):this):this}sticky(){const t=this.attr("afterSticky"),e="outline-navigator_fixed",i=this.$el,s=this.offsetTop,r=this.$scrollElement.scrollTop;let n;return this.isFixed()?(n=r>=s,n?g(i,e):et(i,e),l(t)&&t.call(this,this.isClosed(),n),this):this}calculateStickyHeight(){const t=document.documentElement,e=Math.max(t.clientHeight||0,window.innerHeight||0);return lt("--outline-sticky-height",`${e}px`),this}scrollTo(t,e){const i=this.$scrollElement;return y(i,t,e),this}show(){const t=this.attr("afterOpened"),e=this.count(),i=this.$el,s=this.$parentElement;return this.isInside()?e>800?et(s,mt):(et(s,mt),a((()=>{et(s,gt),g(s,pt)}),30)):et(i,mt),this.closed=!1,l(t)&&t.call(this),this}hide(){const t=this.attr("afterClosed"),e=this.count(),i=this.$el,s=this.$parentElement;return this.isInside()?e>800?g(s,mt):(g(s,gt),et(s,pt),a((()=>{g(s,mt)}))):g(i,mt),this.closed=!0,l(t)&&t.call(this),this}toggle(){const t=this.attr("afterToggle"),e=this.offsetTop,i=this.$scrollElement.scrollTop;let s;return this.isClosed()?this.show():this.hide(),l(t)&&a((()=>{s=i>=e,t.call(this,this.isClosed(),s)})),this}destroy(){const t=this.attr("beforeDestroy"),e=this.attr("afterDestroy");return l(t)&&t.call(this),this.removeListeners()._remove()._default(),this.scrollTimer&&(clearTimeout(this.scrollTimer),this.scrollTimer=null),this.resizeTimer&&(clearTimeout(this.resizeTimer),this.resizeTimer=null),this.observerTimer&&(clearTimeout(this.observerTimer),this.observerTimer=null),this.Observer&&(this.Observer=null),l(e)&&e.call(this),this}onObserver(){const t=this.attr("selector");return this.Observer=((t,e={})=>{const i=e.root||null,s=e.selector||".outline-heading",r=e.context||null,n={rootMargin:e.rootMargin||"0px 0px -90% 0px"},o=new IntersectionObserver((e=>{e.forEach((e=>{e.intersectionRatio>0&&l(t)&&t.call(r||e.target,e.target)}))}),n),a=m(i)?i:document;return i&&(n.root=i),a.querySelectorAll(s).forEach((t=>{o.observe(t)})),o})((t=>{const e=t.getAttribute("data-id");if(this.playing)return!1;this.observerTimer&&clearTimeout(this.observerTimer),this.observerTimer=a((()=>{this.highlight(e)}),100)}),{selector:t,context:this}),this}onSelect(t){const e=this.attr("stickyHeight"),i=t.delegateTarget,s=i.getAttribute("data-id"),r=i.href.split("#")[1],n=document.querySelector(`#${r}`),o=j(n)-(e+10),h=this.$scrollElement.scrollHeight,c=this.attr("afterScroll"),u=()=>{l(c)&&c.call(this,"chapter"),a((()=>{this.playing=!1,this.$emit("toolbar:update",{top:o,min:0,max:h})}))};return this.playing=!0,this.isFixed()?(this.sticky(),a((()=>{this.scrollTo(o,u),this.highlight(s)}),10)):(this.scrollTo(o,u),this.highlight(s)),V(t),this}onScroll(){const t=this.$scrollElement;return this.scrollTimer&&clearTimeout(this.scrollTimer),this.scrollTimer=a((()=>{const e=t.scrollTop,i=t.scrollHeight-t.clientHeight;this.isFixed()&&this.sticky(),this.$emit("toolbar:update",{top:e,min:0,max:i})}),100),this}onResize(){return this.isSticky()?(this.resizeTimer&&clearTimeout(this.resizeTimer),this.resizeTimer=a((()=>{this.calculateStickyHeight()})),this):this}onRefresh(t){return this.refresh(t),this}addListeners(){const t=this.$el,e=this.$scrollElement,i=e.tagName.toLowerCase();let s=e;return this.count()<1||("html"!==i&&"body"!==i||(s=window),P(t,".outline-navigator__anchor","click",this.onSelect,this,!0),ut(s,"scroll",this.onScroll,this,!0),this.isSticky()&&ut(window,"resize",this.onResize,this,!0),this.$on("anchors:all:paint",this.onObserver,this),this.$on("navigator:refresh",this.onRefresh,this)),this}removeListeners(){const t=this.attr("selector"),e=this.$el,i=this.$scrollElement,s=i.tagName.toLowerCase();let r=i;return this.count()<1||("html"!==s&&"body"!==s||(r=window),B(e,"click",this.onSelect),B(r,"scroll",this.onScroll),this.isSticky()&&B(window,"resize",this.onResize),this.$off("anchors:all:paint"),this.$off("navigator:refresh"),this.Observer&&document.querySelectorAll(t).forEach((t=>{this.Observer.unobserve(t)}))),this}}ft.DEFAULTS=u({parentElement:"",scrollElement:"",selector:".outline-heading",active:0,closed:!1,showCode:!0,animationCurrent:!0,position:"relative",stickyHeight:0,chapters:[],created:null,mounted:null,afterClosed:null,afterOpened:null,afterScroll:null,beforeDestroy:null,afterDestroy:null,afterSticky:null});const bt=t=>{const e=Object.getPrototypeOf;let i;if(!(t=>h(t)&&null!==t)(t))return!1;if(i=t.prototype,!i)return!0;for(i=t;null!==e(i);)i=e(i);return e(t)===i},yt=t=>{const e={"&":"&","<":"<",">":">","'":"'",'"':"""};return t.replace(/[&<>'"]/g,(t=>e[t]||t))},vt=[];let $t;J();class _t extends M{constructor(t){super(),this._default(),t&&this.initialize(t)}_default(){return this.attrs=u(_t.DEFAULTS),this.$el=null,this.id="",this.closed=!1,this.visible=!1,this.offset=-50,this.timer=null,this.destroyed=!1,this}initialize(t){return this.attr(t),this.id=this.attr("id"),this.offset=this.attr("offset")||-50,this.$emit("created",r({},this.attr())),this.render().addListeners(),this.attr("visible")&&this.open(),this}isClosed(){return this.closed}isDestroyed(){return this.destroyed}_getClassName(){const t=this.attr("type"),e=this.attr("effect"),i=this.attr("round"),s=this.attr("closable"),r=this.attr("visible"),n=this.attr("customClass"),o=["outline-message",`outline-message_${t}`,`outline-message_${e}`];return i&&o.push("outline-message_round"),s||o.push("outline-message_full-width"),r&&o.push("outline-message_visible"),n&&o.push(n),o}render(){const t=this.attr("type"),e=this.attr("message"),i=this.attr("effect"),s=this.attr("round"),r=this.attr("closable"),n=this.attr("dangerouslyUseHTMLString"),o=this._getClassName(),l=[];let a,h,c,u,d,m=20;return s&&"default"===i&&(m=12),"plain"!==i&&(a=tt("light"===i?`circle-${t}`:t,{iconSet:"outline",size:m}),g(a,"outline-message__icon"),l.push(a)),n?(c=document.createDocumentFragment(),c.innerHTML=e):c=document.createTextNode(yt(ot(e))),h=X("p",{className:"outline-message__content"},[c]),l.push(h),r&&(u=tt("close",{iconSet:"outline",size:18}),g(u,"outline-message__close"),l.push(u)),d=X("div",{className:o.join(" ")},l),d.style.cssText="top:-50px;",this.$el=d,document.body.appendChild(this.$el),this.$emit("mounted"),this}_refreshIcon(){const t=".outline-message_hidden",e=this.$el;let i,s,r,n,o,l,a,h=20;return this.isDestroyed()?this:(o=e.querySelector(".outline-icon"),o?(i=this.attr("type"),s=this.attr("effect"),r=this.attr("round"),"plain"===s?g(o,t):(et(o,t),r&&"default"===s&&(h=12)),l=o.querySelector(".outline-icon__svg"),K(l,{style:`width:${h}px;height:${h}px;`}),a=l.querySelector("use"),n="light"===s?`circle-${i}`:i,G(a,"xlink:href",`#outline-icon-${n}`),this):this)}_refreshMessage(){const t=this.$el;let e,i,s,r;return this.isDestroyed()||(e=t.querySelector(".outline-message__content"),i=this.attr("dangerouslyUseHTMLString"),s=this.attr("message"),r=i?s:yt(ot(s)),e.innerHTML=r),this}_refreshClose(){const t=".outline-message_hidden",e=this.$el;let i,s;return this.isDestroyed()||(i=e.querySelector(".outline-message__close"),s=this.attr("closable"),i&&(s?g(i,t):et(i,t))),this}_refreshEl(){const t=this.$el;let e;return this.isDestroyed()||(e=this._getClassName(),G(t,"className",e.join(" "))),this}refresh(t){return bt(t)?(this.attr(t)._refreshIcon()._refreshMessage()._refreshClose()._refreshEl(),this):this}clearTimer(){return this.isDestroyed()||this.timer&&(clearTimeout(this.timer),this.timer=null),this}startTimer(t){return this.isDestroyed()||(this.timer=a((()=>{this.$emit("opened"),this.close()}),1e3*t)),this}open(t){const e=this.$el;let i,s,r,n;return this.isDestroyed()||(this.isClosed()&&this.refresh(t),i=this.attr("offset"),s=this.attr("duration"),r=i&&i>=this.offset?i:this.offset,n=`top:${r}px;`,this.clearTimer(),this.$emit("beforeOpen"),a((()=>{this.visible=!0,g(e,"outline-message_visible"),e.style.cssText=n,s>0&&this.startTimer(s)}),100)),this}close(){const t=this.$el;let e,i;return this.isDestroyed()||(e=this.attr("destroyAfterClosed"),i=this.attr("beforeClose"),l(i)&&i.call(this),t.style.cssText="top:-50px;",et(t,"outline-message_visible"),this.visible=!1,this.closed=!0,a((()=>{this.$emit("closed"),e&&this.destroy()}),500)),this}destroy(){return this.$emit("beforeDestroy"),this.isDestroyed()||(this.removeListeners(),document.body.removeChild(this.$el),clearTimeout(this.timer),this._default(),this.$emit("afterDestroy")),this}onMouseEnter(){return this.clearTimer(),this}onMouseLeave(){const t=this.attr("duration"),e=this.attr("delay");return t<=0||this.startTimer(e),this}onClose(){return this.clearTimer(),this.close(),this}addListeners(){const t=this.$el;return P(t,".outline-message__content","mouseenter",this.onMouseEnter,this,!0),P(t,".outline-message__content","mouseleave",this.onMouseLeave,this,!0),P(t,".outline-message__close","click",this.onClose,this,!0),this}removeListeners(){const t=this.$el;return B(t,"mouseenter",this.onMouseEnter),B(t,"mouseleave",this.onMouseLeave),B(t,"click",this.onClose),this}}_t.DEFAULTS=u({id:"",type:"info",effect:"default",round:!1,offset:30,duration:3,delay:2,message:"",customClass:"",closable:!0,visible:!0,dangerouslyUseHTMLString:!1,destroyAfterClosed:!0,beforeClose:null}),["info","success","warning","error"].forEach((t=>{_t[t]=e=>{const i={},s=L("outline-message-"),r=e.beforeClose||null;let n=e.offset||30;return d(e)?i.message=e:bt(e)&&w(i,e),i.id=s,i.type=t,i.offset=n,i.visible=!1,i.beforeClose=()=>{_t.close(s,r)},$t=new _t(i),vt.forEach((t=>{n+=t.$el.offsetHeight+16})),$t.offset=n,$t.open(),vt.push($t),$t}})),_t.close=(t,e)=>{const i=vt.length;let s,r,n=-1;if(vt.forEach(((i,s)=>{t===i.id&&(r=i.$el.offsetHeight,n=s,l(e)&&e.call(i),vt.splice(s,1))})),i<=1||-1===n||n>vt.length-1)return!1;for(s=n;s{let t=vt.length-1;for(;t>=0;t-=1)vt[t].close()};class xt{constructor(t,e){this.name=t,l(e)&&(this.action=e)}execute(){return this.action(),this}}class wt{constructor(){this.commands=[]}get(t){return this.commands.find((e=>e.name===t))}add(t){return this.commands.push(t),this}del(t){const e=this.commands,i=e.find((e=>e.name===t)),s=i?e.indexOf(i):-1;return s>-1&&e.splice(s,1),this}clear(){return this.commands=[],this}execute(t){const e=this.commands.find((e=>e.name===t));return l(null==e?void 0:e.execute)&&e.execute(),this}}const Tt=(t,e=!0)=>{const i=tt(t.icon,{iconSet:t.iconSet||"outline",color:t.color||"",size:t.size}),s=X("a",{className:"outline-toolbar__anchor",href:t.link},i),r=X("div",{className:`outline-toolbar__button ${t.name}`,"data-cmd":t.name},[t.link?s:i]);return g(i,"outline-toolbar__icon"),e&&g(r,"outline-toolbar_rounded"),t.disabled&&g(r,"outline-toolbar_disabled"),r},Et="outline-toolbar_disabled",St="outline-toolbar_hidden",Ct="outline-toolbar_active";class Lt extends M{constructor(t){super(),this._default(),t&&this.initialize(t)}_default(){return this.attrs=u(Lt.DEFAULTS),this.disabled=!1,this.closed=!1,this.$el=null,this.buttons=[],this.commands=null,this}initialize(t){let e;return this.attr(t),this.disabled=this.attr("disabled"),this.closed=this.attr("closed"),this.commands=new wt,e=this.attr("created"),l(e)&&e.call(this),this.render().addListeners(),this}isHighlight(t){const e=this.get(t);return!!e&&p(e.$el,Ct)}isDisabled(t){let e;return t?(e=this.get(t),e.disabled):this.disabled}isExist(t){return!!this.get(t)}isClosed(){return this.closed}_getCommand(t){const e=this,{action:i,name:s}=t;let r,n,o=null,a=null;return i?(a=i.handler,r=i.context||this,l(a)?n=a:d(a)&&(n=function(){e.$emit(a,s)}),l(n)&&(o=new xt(s,n.bind(r))),o):o}get(t){return this.buttons.find((e=>e.name===t))}render(){const t=this.attr("mounted"),e=this.attr("buttons")||[],i=this.attr("placement");return J(),this.$el=X("div",{id:L("outline-toolbar"),className:`outline-toolbar outline-toolbar_${i}`}),this._paint(e),document.body.appendChild(this.$el),this.closed&&this.hide(),this.disabled&&this.disable(),l(t)&&t.call(this),this}erase(){return this.$el.innerHTML="",this}_paint(t){const e=this.attr("rounded"),i=document.createDocumentFragment();return t.forEach((t=>{const s=Tt(t,e),r=this._getCommand(t),{name:n,disabled:o,context:l}=t;i.appendChild(s),this.isExist(n)||(this.buttons.push({$el:s,name:n,disabled:o||!1,context:l||this}),r&&this.commands.add(r))})),this.$el.appendChild(i),this}_remove(){return document.body.removeChild(this.$el),this}refresh(t){return this.attr({buttons:t}),this.erase()._paint(t),this}add(t){const e=this.$el,i=document.createDocumentFragment(),s=this.attr("buttons")||[],{name:r,disabled:n,context:o}=t,l=this._getCommand(t),a=t=>{const e=Tt(t);i.appendChild(e),s.push(t),this.buttons.push({$el:e,name:r,disabled:n||!1,context:o||this,command:l}),l&&this.commands.add(l)};return h(t)?a(t):c(t)&&t.forEach((t=>{h(t)&&a(t)})),e.appendChild(i),this}remove(t){const e=this.$el,i=this.buttons,s=this.get(t);let r=-1;return s?(r=i.indexOf(s),r>-1&&(i.splice(r,1),this.attr("buttons").splice(r,1)),this._disable(t),e.removeChild(s.$el),this):this}_disable(t){const e=this.get(t),i=this.commands.get(t);return!e||e.disabled||(e.disabled=!0,i&&this.commands.del(i),g(e.$el,Et)),this}_enable(t){const e=this.get(t),i=this.commands.get(t);return e&&e.disabled?(e.disabled=!1,i&&this.commands.add(i),et(e.$el,Et),this):this}disable(t){const e=this.attr("afterDisabled");return t?this._disable(t):(g(this.$el,Et),this.removeListeners(),this.disabled=!0,l(e)&&e.call(this)),this}enable(t){const e=this.attr("afterEnabled");return t?this._enable(t):(this.disabled=!1,et(this.$el,Et),this.addListeners(),l(e)&&e.call(this)),this}show(t){const e=this.attr("afterOpened"),i=this.get(t),s=this.$el;if(t){if(!i)return this;et(i.$el,St)}else et(s,St),this.closed=!1,l(e)&&a((()=>{e.call(this)}),310);return this}hide(t){const e=this.attr("afterClosed"),i=this.get(t),s=this.$el;if(t){if(!i)return this;g(i.$el,St)}else g(s,St),this.closed=!0,l(e)&&a((()=>{e.call(this)}),310);return this}toggle(t){return this.isClosed()?this.show(t):this.hide(t),this}highlight(t){const e=this.get(t);let i;return e?(i=e.$el,p(i,Ct)?et(i,Ct):g(i,Ct),this):this}destroy(){const t=this.attr("beforeDestroy"),e=this.attr("afterDestroy");return l(t)&&t.call(this),this.commands.clear(),this.removeListeners()._remove()._default(),l(e)&&e.call(this),this}execute(t){return this.isDisabled(t)||this.commands.execute(t),this}onExecute(t){const e=t.delegateTarget;let i="";return e&&(i=e.getAttribute("data-cmd"),i&&this.execute(i)),this}_updateToolbar({top:t,min:e,max:i}){const s=Math.ceil(t);return s<=e?(this.hide("up"),this.show("down")):s>=i?(this.hide("down"),this.show("up")):s>e&&s{t[`on${i}`]=t=>{C(i,{event:t,speech:e})}})),speechSynthesis.onvoiceschanged=t=>{C("voiceschanged",{event:t,speech:e})},this}}zt.isSupport="speechSynthesis"in window;const kt=(t,e)=>{let i,s=t;for(;s;)i=s.tagName.toLowerCase(),"script"!==i&&"style"!==i&&g(s,"outline-reader_sibling"),s=e?s.previousElementSibling:s.nextElementSibling},Mt=()=>{const t=navigator.userAgent;return/Mobile|mini|Fennec|Android|iP(ad|od|hone)|NokiaN[^/]*/.test(t)},At="进入阅读模式,按 ESC 键可退出阅读模式";class Ot extends M{constructor(t){super(),this._default(),t&&this.initialize(t)}_default(){return this.attrs=u(Ot.DEFAULTS),this.reading=!1,this.$target=null,this.$el=null,this.$paper=null,this.$title=null,this.$article=null,this.$progress=null,this.toolbar=null,this.speech=null,this}initialize(t){let e;return this.attr(t),e=this.attr("target"),d(e)?this.$target=document.querySelector(e):m(e)&&(this.$target=e),this.$target?(zt.isSupport&&(this.speech=new zt),this.render().addListeners(),this):this}isSpeaking(){var t;return null==this||null===(t=this.speech)||void 0===t?void 0:t.isSpeaking()}render(){return this._renderEdge()._paint(this.$target),this}erase(){return this.$article.innerHTML="",this}_paint(t){const e=document.createDocumentFragment(),s=i(n,t.cloneNode(!0).children);return a((()=>{s.forEach((t=>{e.appendChild(t)})),this.$article.appendChild(e)})),this}_remove(){const t=this.$el,e=this.toolbar;return t&&document.body.removeChild(t),e&&e.destroy(),this}refresh(){return this.erase()._paint(this.$target),this}_animateTimeline(){return window.ScrollTimeline&&Mt()?(this.$progress.animate({scale:["0 1","1 1"]},{timeline:new ScrollTimeline({source:this.$article,axis:"block"})}),this):this}_renderEdge(){const t=this.$target,e=Mt()?26:20;let i,s,r,n,o,l,h=this.attr("title");o=X("div",{className:"outline-reader__progress"}),this.$progress=o,r=t.querySelector("h1"),m(h)&&(r=h),m(r)&&(h=r.innerText),r=X("h1",{className:"outline-reader__title"},h),this.$title=r,n=X("article",{id:"outline-reader__article",className:"outline-reader__article"},Mt()?[]:[o.cloneNode()]),this.$article=n,s=X("div",{id:"outline-reader__paper",className:"outline-reader__paper"},[r,n]),this.$paper=s;const c=[];return c.push({name:"print",icon:"print",size:e,action:{context:this,handler:this.print}}),zt.isSupport&&this.attr("allowSpeak")&&c.push({name:"speak",icon:"sound",size:e,action:{context:this,handler:this.speak}}),c.push({name:"exit",icon:"close",size:e,action:{context:this,handler:this.exit}}),this.toolbar=new Lt({placement:"rtl",buttons:c}),i=X("section",{id:"outline-reader",className:"outline-reader outline-reader_hidden"},[o,s,this.toolbar.$el]),this.$el=i,document.body.appendChild(i),this._animateTimeline(),a((()=>{l=i.previousElementSibling,kt(l,!0),l=i.nextElementSibling,kt(l)})),this}enter(){const t="outline-reader",e=`${t}--reading`,i=`${t}_hidden`,s=this.$el,r=document.querySelectorAll(".outline-reader_sibling"),n=this.attr("enterReadingTip")||At;return this.reading||!s||(r.forEach((t=>{g(t,i)})),g(s,e),et(s,i),this.toolbar.show(),this.reading=!0,_t.info({round:!0,message:n}),this.$emit("reader:enter")),this}exit(){const t="speak",e="outline-reader",i=`${e}--reading`,s=`${e}_hidden`,r=this.$el,n=document.querySelectorAll(".outline-reader_sibling"),o=this.speech,l=this.toolbar;return this.reading&&r?(g(r,s),et(r,i),n.forEach((t=>{et(t,s)})),l.hide(),this.reading=!1,o&&(l.isHighlight(t)&&l.highlight(t),o.cancel()),this.$emit("reader:exit"),this):this}toggle(){return this.reading?this.exit():this.enter(),this}speak(){const t=this.$article.innerText,e=this.speech;return zt.isSupport&&e?(this.toolbar.highlight("speak"),this.isSpeaking()?e.cancel():e.speak(t),this):this}print(){return l(print)?(print(),this):this}destroy(){return this.$el?(this.removeListeners()._remove()._default(),this):this}onPrint(){return this.print(),this}onEnterReading(){return this.toggle(),this}onExitReading(t){return 27===t.keyCode&&this.reading&&(this.toggle(),V(t)),this}onRefresh(){return this.refresh(),this}addListeners(){return this.$el?(ut(document,"keyup",this.onExitReading,this,!0),this.$on("toolbar:action:print",this.onPrint),this.$on("toolbar:action:reading",this.onEnterReading),this.$on("reader:print",this.onPrint),this.$on("reader:refresh",this.onRefresh),this.$on("reader:enter",this.enter),this.$on("reader:exit",this.exit),this.$on("reader:toggle",this.toggle),this):this}removeListeners(){return this.$el?(B(document,"keyup",this.onExitReading),this.$off("toolbar:action:print"),this.$off("toolbar:action:reading"),this.$off("reader:refresh"),this.$off("reader:toggle"),this):this}}var Nt;Ot.DEFAULTS=u({target:"",title:"",enterReadingTip:At,allowSpeak:!1});class Ht extends M{constructor(t){super(),this.version="3.39.0",this._default(),t&&this.initialize(t)}_default(){const t=Ht.DEFAULTS;return this.attrs=u(t),this.$article=null,this.$scrollElement=null,this.buttons=[],this.anchors=null,this.drawer=null,this.navigator=null,this.reader=null,this.toolbar=null,this}initialize(t){let e="",i="",s=null;return this.attr(t),e=this.attr("articleElement"),i=this.attr("scrollElement"),d(e)?s=document.querySelector(e):m(e)&&(s=e),this.$article=s,this.$scrollElement=b(i),this.$emit("created",r({},this.attr())),this.render().addListeners(),this}isExpanded(){const t=this.attr("position"),e=this.drawer,i=this.navigator;return!(this.count()<0)&&("relative"===t?!e.isClosed():!i.isClosed())}getChapters(t=!1){const e=this.$article,i=this.attr("selector"),s=this.attr("showCode"),r=this.attr("chapterTextFilter");return _({articleElement:e,selector:i,showCode:s,chapterTextFilter:r,isTreeStructured:t})}count(){return this.getChapters().length}render(){const t=this.attr("hasToolbar"),e=this.$scrollElement;return this._renderReader()._renderAnchors()._renderNavigator()._renderToolbar(),e&&t&&this.$emit("toolbar:update",{top:e.scrollTop,min:0,max:e.scrollHeight}),this.$emit("mounted"),this}_renderReader(){const t=this.attr("reader");return t.target?(g(this.$article,"outline-article"),this.reader=new Ot(t),this):this}_renderAnchors(){const t=this.attr("articleElement"),e=this.attr("selector"),i=this.attr("stickyHeight"),s=this.attr("scrollElement"),r=this.attr("showCode"),n=this.attr("anchorURL"),o=this.attr("afterScroll"),l=this.attr("chapterTextFilter"),a=this.attr("anchorLinkFilter");return this.anchors=new st({articleElement:t,stickyHeight:i,scrollElement:s,selector:e,showCode:r,anchorURL:n,afterScroll:o,chapterTextFilter:l,anchorLinkFilter:a}),this}_renderNavigator(){const t=this.attr("title"),e=this.attr("stickyHeight"),i=this.attr("scrollElement"),s=this.attr("customClass"),r=this.attr("showCode"),n=this.attr("animationCurrent"),o=this.attr("closeOnClickModal"),l=this.attr("showNavModalFirst"),a=this.attr("position"),h=this.attr("placement"),c=this.attr("afterSticky"),u=this.attr("afterToggle"),d=this.attr("afterScroll"),m=this.count();let p,g=this.attr("parentElement");return m<1||(p={scrollElement:i,showCode:r,animationCurrent:n,position:a,title:t,stickyHeight:e,chapters:this.getChapters(),afterSticky:c,afterToggle:u,afterScroll:d},"relative"===a?(this.drawer=new ct({placement:h,title:t,size:"tiny",hasOffset:!0,hasPadding:!1,closeOnClickModal:o,customClass:s,afterClosed:()=>{this.toolbar.toggle()}}),g=this.drawer.$main,l&&this.drawer.open()):p.customClass=s,p.parentElement=g,this.navigator=new ft(p)),this}_renderToolbar(){const t=this.attr("position"),e=this.attr("hasToolbar"),s=this.attr("showNavModalFirst"),r=this.attr("placement"),o=this.attr("homepage"),a=this.attr("git"),h=this.attr("tags"),c=this.attr("issues"),u=this.attr("tools"),d=this.attr("reader"),m=this.count(),p={name:"up",icon:"up",size:20,action:{context:this,handler:this.toTop}},g={name:"homepage",icon:"homepage",size:20,link:o},f={name:"github",icon:"github",size:20,link:a},b={name:"tags",icon:"tags",size:20,link:h},y={name:"issues",icon:"issues",size:20,link:c},v={name:"toggle",icon:"menu",size:18,action:{context:this,handler:this.toggle}},$={name:"reading",icon:"file",size:18,action:{context:this,handler:"toolbar:action:reading"}},_={name:"print",icon:"print",size:20,action:{handler:"toolbar:action:print"}},x={name:"down",icon:"down",size:20,action:{context:this,handler:this.toBottom}},w=[];return e?(w.push(p),m>0&&w.push(v),o&&w.push(g),a&&w.push(f),h&&w.push(b),c&&w.push(y),d.target&&(w.push($),l(print)&&w.push(_)),(null==u?void 0:u.length)>0&&w.push.apply(w,i(n,u)),w.push(x),this.buttons=[].concat(w),this.toolbar=new Lt({placement:r,buttons:w}),"relative"===t&&s&&this.toolbar.hide(),this):this}refresh(){const t=this.getChapters();return this.$emit("anchors:refresh",t),this.$emit("navigator:refresh",t),this.$emit("reader:refresh"),this.$emit("refresh",t),this}addButton(t){const e=this.buttons;return e.splice(-1,0,t),this.$emit("toolbar:add:button",e),this}removeButton(t){return this.$emit("toolbar:remove:button",t),this}toTop(){const t=this.attr("afterScroll"),e=this.toolbar,i=this.navigator,s=this.count();return s>0&&(i.playing=!0),this.scrollTo(0,(()=>{e.hide("up"),e.show("down"),s>0&&(i.highlight(0),i.playing=!1,y(i.$main,0)),l(t)&&t.call(e,"up")})),this}toBottom(){const t=this.attr("afterScroll"),e=this.$scrollElement,i=this.toolbar,s=this.navigator,r=this.count(),n=Math.floor(e.scrollHeight-e.clientHeight);return r>0&&(s.playing=!0),this.scrollTo(n,(()=>{const e=s.$main;i.hide("down"),i.show("up"),r>0&&(s.highlight(r-1),y(e,e.scrollHeight),s.playing=!1),l(t)&&t.call(i,"bottom")})),this}scrollTo(t,e){return y(this.$scrollElement,t,e),this}enterReading(){return this.$emit("toolbar:toggle"),this.$emit("reader:enter"),this}exitReading(){return this.$emit("toolbar:toggle"),this.$emit("reader:exit"),this}switchReading(){return this.$emit("toolbar:toggle"),this.$emit("reader:toggle"),this}expand(){const t=this.attr("position"),e=this.toolbar,i=this.drawer,s=this.navigator;return this.count()<1||("relative"!==t?(s.show(),e.highlight("toggle")):(e.hide(),a((()=>{i.open()})))),this}collapses(){const t=this.attr("position"),e=this.toolbar,i=this.drawer,s=this.navigator;return this.count()<1||("relative"!==t?(s.hide(),e.highlight("toggle")):(e.show(),a((()=>{i.close()})))),this}toggle(){return this.isExpanded()?this.collapses():this.expand(),this}print(){return this.$emit("reader:print"),this}_destroy(){const t=this.count();let e=this.anchors,i=this.navigator,s=this.drawer,r=this.reader,n=this.toolbar,o=!1;return this.removeListeners(),r&&r.destroy(),t>0&&i&&(o=i.isOutside(),i.destroy(),o&&s&&s.destroy()),e&&e.destroy(),n&&n.destroy(),this}destroy(){return this.$emit("beforeDestroy"),this._destroy()._default(),this.$emit("destroyed"),this}addListeners(){return this.attr("hasToolbar")?(this.$on("toolbar:update",this.onToolbarUpdate),this):this}removeListeners(){return this.attr("hasToolbar")?(this.$off("toolbar:update"),this):this}}if(Ht.DEFAULTS=u({articleElement:"#article",selector:"h2,h3,h4,h5,h6",parentElement:"#aside",scrollElement:"html,body",title:"目录",position:"relative",placement:"rtl",animationCurrent:!0,showCode:!1,hasToolbar:!0,closeOnClickModal:!0,showNavModalFirst:!1,anchorURL:"",stickyHeight:0,homepage:"",git:"",tags:"",issues:"",tools:[],reader:{target:"",title:"",enterReadingTip:"进入阅读模式,按 ESC 键可退出阅读模式",allowSpeak:!1},customClass:"",afterSticky:null,afterToggle:null,afterScroll:null,chapterTextFilter:null,anchorLinkFilter:null}),null!==(Nt=window)&&void 0!==Nt&&Nt.jQuery){const t=window.jQuery;t.extend(t.fn,{outline:function(e){let i=t(this);return new Ht(t.extend({},e,{articleElement:i}))}})}return Ht})); +!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(t="undefined"!=typeof globalThis?globalThis:t||self).Outline=e()}(this,(function(){"use strict";function t(t,e){(null==e||e>t.length)&&(e=t.length);for(var i=0,s=Array(e);iObject.prototype.toString.apply(t),l=t=>"function"==typeof t||"[object Function]"===o(t),a=(t,e=300)=>!!l(t)&&setTimeout((()=>{t()}),e),h=t=>("[object Object]"===o(t)||"object"==typeof t||l(t))&&null!==t,c=t=>Array.isArray?Array.isArray(t):"[object Array]"===o(t),u=t=>{let e={};return null===t?null:(c(t)?e=Array.from(t):(e=Object.assign({},t),Object.keys(e).forEach((i=>e[i]=h(t[i])?u(t[i]):t[i]))),e)},d=t=>"string"==typeof t,m=t=>!!(h(t)&&t.nodeName&&t.tagName&&1===t.nodeType),p=(t,e)=>{const i=new RegExp("(\\s|^)"+e+"(\\s|$)");let s,r;return!!m(t)&&(s=t.className,!!s&&(r=t.classList,r&&r.contains?t.classList.contains(e):!!i.exec(s)))},g=(t,e)=>{var i;let s,r;if(p(t,e))return!1;s=t.classList,null!==(i=s)&&void 0!==i&&i.add?e.indexOf(" ")>-1?e.split(" ").forEach((t=>{s.add(t)})):s.add(e):(r=t.className,r+=r.length>0?" "+e:e,t.className=r)},f=t=>t*t,b=(t,e,i)=>{const s=((t=null)=>{let e,i;return t?d(t)?i=document.querySelector(t):m(t)&&(i=t):(e=document.querySelectorAll("html,body"),i=e[0].scrollTop-e[1].scrollTop>=0?e[0]:e[1]),i})(t);let r=s.scrollTop,n=0;const o=e-r,a=s.scrollHeight,h=e-a<=0?e:a,c=t=>(l(i)&&i(t),!1),u=()=>{if(n+=1,o<0){if(r-=f(n),s.scrollTop=r,r<=e)return s.scrollTop=e,c(e)}else if(r+=f(n),s.scrollTop=r,r>=h)return s.scrollTop=h,c(h);requestAnimationFrame(u)};requestAnimationFrame(u)},y=(t=null)=>{let e,i;return t?d(t)?i=document.querySelector(t):m(t)&&(i=t):(e=document.querySelectorAll("html,body"),i=e[0].scrollTop-e[1].scrollTop>=0?e[0]:e[1]),i},v=t=>!!d(t)&&t.replace(/(^\s+)|(\s+$)/g,""),$=(t,e=!1,i=null)=>{const s=/^\d(\.|(\.\d+)*)\s?/gi,r=[];let n=1,o=0,a="";return t.forEach(((t,h)=>{const c=t.tagName,u=c.replace(/h/i,"");let m=parseInt(u,10),p=-1;var g;m>n?(o+=1,p=1===o?-1:h-1):m===n||mo?1===m?(o=1,p=-1):p=r[h-1].pid:m<=o&&(1===m?o=1:(o-=n-m,o<=1&&(o=1)),p=1===o?-1:((t,e,i)=>{let s,r,n=t[i-1];for(r=0;r]+(>|$)/g,""):"")),e&&(a=v(a.replace(s,""))),l(i)&&(a=i(a)),r.push({id:h,pid:p,level:o,rel:`heading-${h}`,text:a,tagName:c})})),e?(t=>{const e={};return t.forEach((t=>{const i=JSON.stringify((t=>[t.pid])(t));e[i]=e[i]||[],e[i].push(t),t.index=e[i].length,-1===t.pid&&(t.code=String(t.index))})),Object.keys(e).forEach((t=>{e[t].forEach((t=>{const i=e[`[${t.id}]`];if(!i||!c(i))return!1;i.forEach((e=>{e.code=t.code+"."+e.index}))}))})),t})(r):r},_=t=>{const{articleElement:e,selector:s,showCode:r,chapterTextFilter:o,isTreeStructured:a}=t;let h=document.querySelector("#article"),c=[],u=[],p=null;return d(e)?h=document.querySelector(e):m(e)&&(h=e),h?(l(o)?p=o:!0===o&&(p=t=>t.replace(/\(.*?\)/,"()")),c=i(n,h.querySelectorAll(s||"h1,h2,h3,h4,h5,h6")),u=$(c,r,p),!0===a?((t,e,i)=>{const s={},r=[];return t.forEach(((t,i)=>{s[t[e]]=i,t.children=[]})),t.forEach((e=>{const n=t[s[e[i]]];-1!==e[i]?n.children.push(e):r.push(e)})),r})(u,"id","pid"):u):u},x=(t,e)=>{const i=Object.prototype.hasOwnProperty;return t&&i.call(t,e)},w=(t,e)=>{Object.keys(e).forEach((i=>{x(e,i)&&(t[i]=e[i])}))},T={},E=t=>x(T,t)&&T[t].length>0,S=(t,e=!0)=>e?E(t):(t=>{let e=E(t),i=t.lastIndexOf(".");for(;!e&&-1!==i;)i=(t=t.substring(0,i)).lastIndexOf("."),e=E(t);return e})(t),C=(t,e,i=!0)=>{const s=t=>{if(!E(t))return!1;T[t].forEach((t=>{const i=["[object Int8Array]","[object Uint8Array]","[object Uint8ClampedArray]","[object Int16Array]","[object Uint16Array]","[object Int32Array]","[object Uint32Array]","[object Float32Array]","[object Float64Array]","[object BigInt64Array]","[object BigUint64Array]"].indexOf(o(e))>-1?e.toString():e;t.callback.call(t.context||t,i)}))},r=()=>{let e=t,i=t.lastIndexOf(".");for(;-1!==i;)e=e.substring(0,i),i=e.lastIndexOf("."),s(e);s(t),s("*")};if(!S(t))return!1;i?setTimeout(r,10):r()},L=(()=>{let t=0;return e=>(t+=1,e?e+"-"+t:"guid-"+t)})(),z=t=>{if(!x(T,t))return!1;delete T[t]},k=(t,e)=>{if(!S(t))return!1;e?(t=>{const e=Object.keys(T);if(!t||e.length<1)return!1;e.forEach((e=>{const i=T[e];let s;i.forEach(((e,r)=>{e.callback!==t&&e.token!==t||(s=e.topic,i.splice(-1,r))})),i.length<1&&z(s)}))})(e):z(t)};class M{constructor(t){this.attrs={},this.name="component",t&&this.initialize(t)}initialize(t){return this.attr(t).render().addListeners(),this}attr(t,e){const i=this.attrs;return d(t)?e&&x(i,t)?(i[t]=e,this):i[t]:h(t)?(w(i,t),this):0===arguments.length?i:this}render(){return this}refresh(){return this}destroy(){return this.removeListeners(),this}reload(t){let e=this.attr();return t&&(e=this.attr(t)),this.destroy().initialize(e),this}$emit(t,e){return C(t,e),this}$on(t,e){return((t,e,i=null)=>{const s=L();let r="symbol"==typeof t?t.toString():t;l(e)&&(T[r]||(T[r]=[]),T[r].push({topic:r,callback:e,context:i,token:s}))})(t,e,this),this}$off(t,e){return k(t,e),this}addListeners(){return this}removeListeners(){return this}}const A=[];let O,N;function H(t){for(;t.timeRemaining()>0&&A.length;){const t=A.shift();if(!l(t))return!1;t()}A.length?O=requestIdleCallback(H):(O=0,l(N)&&(N(),N=null))}void 0===window.requestIdleCallback&&(window.requestIdleCallback=function(t){const e=Date.now();return a((function(){t({didTimeout:!1,timeRemaining:function(){return Math.max(0,50-(Date.now()-e))}})}),10)},window.cancelIdleCallback=function(t){clearTimeout(t)});const D=(t,e=null)=>{A.push(t),l(e)&&(N=e),O||requestIdleCallback(H)},j=t=>{let e=t.offsetTop;return null!==t.offsetParent&&(e+=j(t.offsetParent)),e},F=(t,e="")=>{const i=e.replace(/^>/i,"");return!!(e&&i&&t)&&(t.matches?t.matches(i):!!t.msMatchesSelector&&t.msMatchesSelector(i))},q=t=>t.host&&t!==document&&t.host.nodeType?t.host:t.parentNode,R=["focusout","blur","focusin","focus","load","unload","mouseenter","mouseleave"],I=(t,e,i)=>{const s=R.indexOf(e)>-1;i._delegateListener&&delete(i=i._delegateListener)._delegateListener,function(t,e,i){const s=t._listeners;let r=-1;if(s.length<1)return!1;s.forEach(((t,s)=>{const n=t.fn;e===t.type&&(r=s,n===i&&(r=s))})),r>-1&&s.splice(r,1)}(t,e,i),t.removeEventListener(e,i,s)},U=function(t,e,i=!1){const s=d(t)?document.querySelector(t):t,r=s.childNodes,n=((t,e)=>{let i=t._listeners||[];return d(e)&&e&&(i=i.filter((t=>t.type===e))),i})(s,e);n.forEach((t=>{I(s,t.type,t.fn)})),(i||!0===e||1===arguments.length)&&s&&r&&r.forEach((t=>{m(t)&&U(t,e,i)}))},B=(t,e,i)=>{if(!l(i))return U(t,e),!1;I(t,e,i)},P=(t,e,i,s,r,n,o=!1)=>{const l=R.indexOf(i)>-1,a=function(l){const h=function(t){const e=t.target;return(i=e)&&3===i.nodeType?i.parentNode:i;var i}(l),c=((t,e,i,s)=>{const r=i||document;if(!t)return null;do{if(null!=e&&(e.startsWith(">")?t.parentNode===r&&F(t,e):F(t,e))||s&&t===r)return t;if(t===r)break}while(t=q(t))})(h,e,t);let u=n||t;l.delegateTarget=c,!0===n&&(u=r),c&&(!0===o&&B(t,i,a),s.call(u,l,r))};if(!t)return!1;t._listeners||(t._listeners=[]),t._listeners.push({el:t,selector:e,type:i,fn:a,data:r,context:n,capture:l}),s._delegateListener=a,t.addEventListener(i,a,l)},V=function(t){t.stopPropagation(),t.preventDefault()},W=i(n,['','','','','','','','','','','','','','','','','','','','']),Q=(t,e="icon")=>d(t)?((t,e="icon")=>{const i=/id="(.*?)"/,s=/^(\w+)-/;return W.find((r=>{const n=i.exec(r)[1];return s.exec(n)[1]===e&&n===("icon"===e?`${e}-${t}`:`${e}-icon-${t}`)}))})(t,e):i(n,W),J=(t="")=>{const e=document.body;let i=document.querySelector("#outline-icons"),s=[];(t=>{if(!t)return!1;c(t)&&t.length>0?t.forEach((t=>{-1===W.indexOf(t)&&d(t)&&W.push(t)})):d(t)&&W.push(t)})(t),s=Q(),i?i.innerHTML=s.join(""):(i=document.createElement("div"),i.innerHTML=``,e.insertBefore(i.firstChild,e.firstChild))},Y=t=>{return!(!h(t)||!(m(t)||(t=>!(!h(t)||"[object NodeList]"!==o(t)))(t)||(e=t,h(e)&&"[object DocumentFragment]"===o(e))||(t=>!(!h(t)||!("[object Text]"===o(t)||t.tagName&&3===t.nodeType)))(t)));var e},G=(t,e,i)=>{let s=t.tagName.toLowerCase();switch(e){case"style":t.style.cssText=i;break;case"value":"input"===s||"textarea"===s?t.value=i:t.setAttribute(e,i);break;case"htmlFor":t.setAttribute("for",i);break;case"className":g(t,i);break;case"innerHTML":t.innerHTML=i;break;case"innerText":t.innerText=i;break;default:t.setAttribute(e,i)}},K=(t,e)=>{if(!t||!h(e))return!1;Object.keys(e).forEach((i=>{const s=e[i];x(e,i)&&G(t,i,s)}))},X=(t,e,i)=>{const s=document.createDocumentFragment(),r=document.createElement(t),n=t=>Y(t)||d(t),o=t=>{let e;if(!n(t))return!1;Y(t)?e=t:d(t)&&(e=document.createTextNode(t)),s.appendChild(e)};return h(e)?K(r,e):c(e)&&e.every((t=>n(t)))?e.forEach((t=>{o(t)})):Y(e)?o(e):d(e)&&o(document.createTextNode(e)),c(i)?i.forEach((t=>{o(t)})):o(i),r.appendChild(s),r},Z=(t,e={})=>{const i="outline-icon",s=e.size||0,r=e.color||"",n=e.iconSet||"",o=c(s)?s[0]:s,l=c(s)?s[1]:s,a=s?`width:${o}px;height:${l}px;`:"",h=r?a+`color:${r}`:a,u=e.attrs||{},m=document.createElement("i");let p,g="",f="";return d(t)?((t=>{const e=new RegExp("^\\s*(?:<\\?xml[^>]*>\\s*)?(?:<\\!doctype svg[^>]*\\s*(?:\\[?(?:\\s*]*>\\s*)*\\]?)*[^>]*>\\s*)?]*>[^]*<\\/svg>\\s*$\\s*$","i");return d(t)&&e.test(t)})(t)?f=t:(g=n&&"icon"!==n?`xlink:href="#${n}-icon-${t}"`:`xlink:href="#icon-${t}"`,f=``),m.innerHTML=f,u.className?u.className=`${i} ${u.className}`:u.className=i,K(m,u),p=m.querySelector("svg"),K(p,{"aria-hidden":!0,xmlns:"http://www.w3.org/2000/svg",class:"outline-icon__svg",width:200,height:200,style:h}),m):null},tt=(t,e={})=>Z(t,e),et=(t,e)=>{var i;let s,r=t.className;if(!r||!p(t,e))return!1;s=t.classList,null!==(i=s)&&void 0!==i&&i.remove?s.remove(e):(r=v(r.replace(e,"")),t.className=r)},it=(t,e=!0,i=!0)=>{const s="outline-heading",r=t.innerHTML;let n;if(t.innerHTML=r.replace(/^\d+(\.?\d+)*\s?/gi,""),t.removeAttribute("id"),t.removeAttribute("data-id"),et(t,s),!e)return!1;var o;n=t.querySelector(`.${s}__anchor`),i&&et(t,`${s}_start`),o=v(t.className),d(o)&&""===o&&t.removeAttribute("class"),n&&t.removeChild(n)};class st extends M{constructor(t){super(),this._default(),t&&this.initialize(t)}_default(){return this.attrs=u(st.DEFAULTS),this.$articleElement=null,this.$scrollElement=null,this.$headings=[],this}initialize(t){let e,i,s,r;return this.attr(t),r=this.attr("articleElement"),i=this.attr("scrollElement"),e=this.attr("created"),d(r)?s=document.querySelector(r):m(r)&&(s=r),s?(this.$articleElement=s,this.$scrollElement=y(i),this.$headings=this.getHeadings(),this.$headings.length<1||(l(e)&&e.call(this),this.render().addListeners()),this):this}getHeadings(){const t=this.$articleElement,e=this.attr("selector");return i(n,t.querySelectorAll(e))}count(){return this.getHeadings().length}render(){const t=this.attr("articleElement"),e=this.attr("selector"),i=this.attr("showCode"),s=this.attr("chapterTextFilter"),r=this.attr("mounted"),n=_({articleElement:t,selector:e,showCode:i,chapterTextFilter:s});return J(),this._paint(n),l(r)&&r.call(this),this}erase(){return this._remove(),this}_paint(t){const e=400,s=this.attr("hasAnchor"),r=this.attr("isAtStart"),o=this.attr("showCode"),a=this.attr("anchorURL"),h=this.attr("anchorLinkFilter"),c=this.count(),u=i(n,this.$headings),d=(i,n)=>{i.forEach(((i,c)=>{const u=c+n*e,d=t[u].code;((t,e,i)=>{const s="outline-heading",r=i.hasAnchor||!0,n=i.isAtStart||!0,o=i.showCode||!1,a=i.chapterCode||"",h=i.anchorURL||"",c=i.anchorLinkFilter||null,u=`heading-${e}`,d={id:u,className:n?`${s} ${s}_start`:s,"data-id":e},m=v(t.innerHTML);let p,g,f;if(o&&(d.innerHTML=a+" "+m,d["data-code"]=a),K(t,d),!r)return!1;p=h||(l(c)?c(t.tagName.toLowerCase(),m,e):`#${u}`),f=tt("hash",{iconSet:"outline"}),g=X("a",{id:`anchor-${e}`,className:`${s}__anchor anchor-${e}`,href:p,target:h?"_blank":"self","data-id":e},f),t.appendChild(g)})(i,u,{hasAnchor:s,isAtStart:r,showCode:o,chapterCode:d,anchorURL:a,anchorLinkFilter:h})}))};let m=-1;if(c>e)for(m+=1,d(u.splice(0,e),0);u.length>0;){const t=u.splice(0,e);D((()=>{d(t,m+=1)}),(()=>{this.$emit("anchors:all:paint")}))}else d(u,0);return this}_remove(){const t=this.attr("hasAnchor"),e=this.attr("isAtStart");return this.$headings.forEach((i=>{it(i,t,e)})),this}refresh(t){const e=this.attr("articleElement"),i=this.attr("selector"),s=this.attr("showCode"),r=this.attr("chapterTextFilter");return this.$headings=this.getHeadings(),this.erase()._paint(t||_({articleElement:e,selector:i,showCode:s,chapterTextFilter:r})),this}scrollTo(t,e){const i=this.$scrollElement;return b(i,t,e),this}destroy(){const t=this.attr("beforeDestroy"),e=this.attr("afterDestroy");return l(t)&&t.call(this),this.removeListeners()._remove()._default(),l(e)&&e.call(this),this}onAnchorTrigger(t){const e=this.attr("anchorURL"),i=this.attr("afterScroll"),s=this.attr("stickyHeight"),r=t.delegateTarget.parentNode,n=j(r)-(s+10),o=this.$scrollElement,h=o.scrollHeight-o.clientHeight;return this.scrollTo(n,(()=>{l(i)&&i.call(this,"anchor"),a((()=>{this.$emit("toolbar:update",{top:n,min:0,max:h})}))})),e||V(t),this}onRefresh(t){return this.refresh(t),this}addListeners(){const t=this.$articleElement;return this.count()<1||(P(t,".outline-heading__anchor","click",this.onAnchorTrigger,this,!0),this.$on("anchors:refresh",this.onRefresh)),this}removeListeners(){const t=this.$articleElement;return this.count()<1||(B(t,"click",this.onAnchorTrigger),this.$off("anchors:refresh",this.onRefresh)),this}}st.DEFAULTS=u({scrollElement:"html,body",articleElement:"#article",selector:"h1,h2,h3,h4,h5,h6",stickyHeight:0,anchorURL:"",hasAnchor:!0,isAtStart:!0,showCode:!1,created:null,mounted:null,afterScroll:null,beforeDestroy:null,afterDestroy:null,chapterTextFilter:null,anchorLinkFilter:null});const rt=["a","abbr","address","area","article","aside","audio","b","base","bdi","bdo","blockquote","body","br","button","canvas","caption","cite","code","col","colgroup","data","datalist","dd","del","details","dfn","dialog","div","dl","dt","em","embed","fieldset","figcaption","figure","footer","form","h1","h2","h3","h4","h5","h6","head","header","hgroup","hr","html","i","iframe","img","input","ins","kbd","label","legend","li","link","main","map","mark","math","menu","menuitem","meta","meter","nav","noscript","object","ol","optgroup","option","output","p","param","picture","pre","progress","q","rb","rp","rt","rtc","ruby","s","samp","script","search","section","select","slot","small","source","span","strong","style","sub","summary","sup","svg","table","tbody","td","template","textarea","tfoot","th","thead","time","title","tr","track","u","ul","var","video","wbr"],nt=t=>{let e,i,s;return!!d(t)&&(e=v(t).slice(0,1e3),i=/\s*|]*>|]*>|]+>/i,s=new RegExp(rt.map((t=>`<${t}\\b[^>]*>`)).join("|"),"i"),i.test(e)||s.test(e))},ot=t=>t.replace(/]*>.*?<\/script>/gi,""),lt=(t,e)=>{document.documentElement.style.setProperty(t,e)};let at=2e3;const ht=t=>(t?at=t:at+=1,lt("--outline-zIndex",`${at}`),at);class ct extends M{constructor(t){super(),this._default(),this.zIndex=0,t&&this.initialize(t)}_default(){return this.attrs=u(ct.DEFAULTS),this.title="",this.closed=!1,this.$el=null,this.$modal=null,this.$header=null,this.$title=null,this.$close=null,this.$main=null,this.$footer=null,this.$overlay=null,this}initialize(t){let e;return this.attr(t),this.title=this.attr("title"),e=this.attr("created"),l(e)&&e.call(this),this.render().addListeners(),this}setTitle(t){return this.attr("title",t),this.title=t,this.$title.innerHTML=t,this}isClosed(){return this.closed}render(){const t=this.attr("mounted"),e=this.attr("size"),i=this.attr("placement"),s=this.attr("hasClose"),r=this.attr("hasOverlay"),n=this.attr("hasOffset"),o=this.attr("hasPadding"),a=this.attr("autoHeight"),h=this.attr("overflow"),c=this.attr("customClass");let u,d,m,p,f,b,y,v,$="outline-drawer__main";return J(),this.zIndex=ht(),p=X("h2",{className:"outline-drawer__title"},this.title),this.$title=p,s&&(f=X("div",{className:"outline-drawer__close"},tt("close",{iconSet:"outline",size:20})),this.$close=f),m=X("header",{className:"outline-drawer__header"},[p,f]),this.$header=m,"hidden"===h&&($+=" overflow-hidden"),b=X("div",{className:$}),this.$main=b,o||g(b,"outline-drawer_full"),y=X("footer",{className:"outline-drawer__footer"}),this.$footer=y,d=X("div",{className:`outline-drawer__modal outline-drawer_${i} outline-drawer_${e} outline-drawer_closed`},[m,b,y]),this.$modal=d,n&&g(d,"outline-drawer_offset"),a&&g(d,"outline-drawer_auto"),c&&g(d,c),r&&(v=X("div",{className:"outline-drawer__overlay"}),this.$overlay=v),u=X("div",{className:"outline-drawer"},[d,v]),this.$el=u,document.body.appendChild(u),l(t)&&t.call(this),this}erase(){return this.$main.innerHTML="",this}_paint(t){let e=null;return l(t)?e=t():Y(t)?e=t:nt(t)&&(e=((t,e)=>{const s=document.createDocumentFragment();if(!t||!nt(t)&&!d(t)&&!m(t))return null;if(nt(t)){const e=X("div");let r=[];return e.innerHTML=ot(t),r=i(n,e.childNodes),r.forEach((t=>{s.appendChild(t)})),s}if(!d(e))return t.innerHTML;t.innerHTML=ot(e)})(t)),e&&this.$main.appendChild(e),this}_remove(){return document.body.removeChild(this.$el),this}refresh(t){return this.erase()._paint(t),this}open(){const t=this.attr("afterOpened"),e=this.$modal;return g(this.$el,"outline-drawer_opened"),et(e,"outline-drawer_closed"),g(e,"outline-drawer_opened"),a((()=>{this.closed=!1,l(t)&&t.call(this)})),this}close(){const t=this.attr("afterClosed"),e=this.$modal;return et(e,"outline-drawer_opened"),g(e,"outline-drawer_closed"),a((()=>{et(this.$el,"outline-drawer_opened"),this.closed=!0,l(t)&&t.call(this)})),this}toggle(){const t=this.attr("afterToggle"),e=this.isClosed();return e?this.open():this.close(),l(t)&&a((()=>{t.call(this,e)})),this}destroy(){const t=this.attr("afterDestroy"),e=this.attr("beforeDestroy");let i=this.zIndex;return l(e)&&e.call(this),this.removeListeners()._remove()._default(),i-=1,ht(i),this.zIndex=0,l(t)&&t.call(this),this}onClose(){return this.close(),this}addListeners(){const t=this.attr("hasClose"),e=this.attr("hasOverlay"),i=this.attr("closeOnClickModal"),s=this.$el;return t&&P(s,".outline-drawer__close","click",this.onClose,this,!0),e&&i&&P(s,".outline-drawer__overlay","click",this.onClose,this,!0),this}removeListeners(){const t=this.attr("hasClose"),e=this.attr("hasOverlay"),i=this.$el;return t||e?(B(i,"click",this.onClose),this):this}}ct.DEFAULTS=u({placement:"rtl",title:"标题",size:"regular",hasClose:!0,hasOverlay:!0,hasOffset:!1,hasPadding:!0,autoHeight:!0,closeOnClickModal:!0,overflow:"auto",created:null,mounted:null,afterClosed:null,afterOpened:null,afterScroll:null,beforeDestroy:null,afterDestroy:null,afterToggle:null});const ut=(t,e,i,s,r,n=!1)=>{const o=R.indexOf(e)>-1,a=function(o){let l=r||t;!0===r&&(l=s),!0===n&&B(t,e,a),i.call(l,o,s)};if(!l(i))return!1;t._listeners||(t._listeners=[]),t._listeners.push({el:t,type:e,fn:a,data:s,context:r,capture:o}),i._delegateListener=a,t.addEventListener(e,a,o)},dt=(t,e)=>getComputedStyle(t)[e],mt="outline-navigator_hidden",pt="outline-navigator_expanded",gt="outline-navigator_folded";class ft extends M{constructor(t){super(),this._default(),this.scrollTimer=null,this.resizeTimer=null,this.observerTimer=null,this.Observer=null,t&&this.initialize(t)}_default(){return this.attrs=u(ft.DEFAULTS),this.$el=null,this.$title=null,this.$main=null,this.$list=null,this.$placeholder=null,this.$parentElement=null,this.$scrollElement=null,this.$active=null,this.chapters=[],this.active=0,this.offsetWidth=0,this.offsetTop=0,this.playing=!1,this.closed=!1,this}initialize(t){let e,i,s,r;return this.attr(t),e=this.attr("created"),i=this.attr("parentElement"),s=this.attr("scrollElement"),d(i)?r=document.querySelector(i):m(i)&&(r=i),this.$parentElement=r,this.$scrollElement=y(s),this.chapters=this.attr("chapters"),this.closed=this.attr("closed"),this.active=this.attr("active"),l(e)&&e.call(this),this.chapters.length<1||(this.render().addListeners(),this.$active=document.querySelector(`#chapter-${this.active}`)),this}isClosed(){return this.closed}isSticky(){return"sticky"===this.attr("position")}isFixed(){return"fixed"===this.attr("position")}isInside(){return this.isFixed()||this.isSticky()}isOutside(){return!this.isInside()}count(){return this.chapters.length}_paintEdge(){const t=document.createDocumentFragment(),e=this.attr("title"),i=this.attr("animationCurrent"),s=this.attr("customClass"),r=this.$parentElement,n=[],o=[];let l,a,h,c,u=null;return r?(this.isInside()&&e&&(u=X("h2",{className:"outline-navigator__title"},e),this.$title=u,o.push(u)),h=X("ul",{className:"outline-navigator__list"}),this.$list=h,n.push(h),i&&(c=X("div",{className:"outline-navigator__placeholder"}),this.$placeholder=c,n.push(c)),a=X("div",{className:"outline-navigator__main"},n),this.$main=a,o.push(a),l=X("nav",{id:"outline-navigator",className:`outline-navigator ${mt}`},o),this.$el=l,this.isSticky()&&(this.calculateStickyHeight(),g(l,"outline-navigator_sticky")),s&&g(l,s),t.appendChild(l),r.appendChild(t),this):this}render(){const t=this.attr("mounted"),e=this.$parentElement,i=this.chapters,s=this.count();let r;return!e||i.length<1||(this.isInside()&&g(e,"outline-navigator-parent"),this._paintEdge(),r=this.$el,this._paint(i),a((()=>{this.highlight(this.active)}),60),this.offsetTop=j(r),this.offsetWidth=r.offsetWidth,this.isFixed()&&(this.sticky(),lt("--outline-navigator-width",`${this.offsetWidth}px`)),l(t)&&t.call(this),s<400&&this.onObserver()),this}erase(){return this.$list.innerHTML="",this}_paint(t){const e=this.attr("showCode"),s=this.$el;return((t,e,s=!1)=>{const r=e.length,o=i(n,e),l=e=>{const i=e=>t.querySelector(`#${e}`);e.forEach((e=>{const r=e.pid,n=e.id,o=e.code,l=e.rel,a=[],h=X("span",{className:"outline-navigator__text"},e.text);let c,u,d,m,p;s&&(u=X("span",{className:"outline-navigator__code","data-id":n},e.code),a.push(u)),a.push(h),c=X("a",{id:`chapter__anchor-${n}`,className:"outline-navigator__anchor",href:"#"+l,rel:l,"data-id":n,"data-code":o},a),d=X("li",{id:`chapter-${n}`,className:"outline-navigator__item","data-id":n,"data-code":o},c),-1===r?t.appendChild(d):(p=i(`chapter-${r}`),m=i(`subject-${r}`),m?m.appendChild(d):(m=X("ul",{id:"subject-"+r,className:"outline-navigator__subject"},d),p.appendChild(m)))}))};if(r>400)for(l(o.splice(0,400));o.length>0;){const t=o.splice(0,400);D((()=>{l(t)}))}else l(o)})(this.$list,t,e),et(s,mt),g(s,pt),this}_remove(){return this.$parentElement.removeChild(this.$el),this}refresh(t){const e=this.$el;return et(e,mt),this.erase()._paint(t),this}_getPlaceholderOffset(t){const e=this.$main,i=this.$list,s=i.querySelector(".outline-navigator__anchor"),r=parseInt(dt(e,"padding-top"),10),n=parseInt(dt(e,"border-top-width"),10),o=parseInt(dt(i,"padding-top"),10),l=parseInt(dt(i,"margin-top"),10),a=parseInt(dt(i,"border-top-width"),10);let h,c=0;return r&&(c+=r),o&&(c+=o),l&&(c+=l),n&&(c+=n),a&&(c+=a),h=s.offsetHeight*t,c+h}positionPlaceholder(t){const e=this.$list,i=this.$placeholder,s=e.querySelector(".outline-navigator__anchor"),r=this.attr("animationCurrent"),n=s.offsetHeight;let o=0;return r?(o=this._getPlaceholderOffset(t),i.style.cssText=`transform: translateY(${o}px);height:${n}px;`,this):this}highlight(t){const e=this.$el,i=this.attr("animationCurrent"),s="outline-navigator_active",r="outline-navigator_highlight";let n="relative"===this.attr("position")?this.$parentElement:this.$main,o=null,l=0;return e?(o=e.querySelector(`#chapter__anchor-${t}`),o?(this.active=parseInt(o.getAttribute("data-id"),10),this.$active&&(et(this.$active,r),et(this.$active,s)),this.$active=o,g(this.$active,s),i?this.positionPlaceholder(this.active):g(this.$active,r),a((()=>{((t,e)=>{let i,s,r=!1;return m(t)&&m(e)?(i=e.getBoundingClientRect(),s=t.getBoundingClientRect(),r=!!(s.top>=i.top&&s.right<=i.right&&s.bottom<=i.bottom&&s.left>=i.left),r):r})(this.$active,n)||(l=this._getPlaceholderOffset(this.active),b(n,l))})),this):this):this}sticky(){const t=this.attr("afterSticky"),e="outline-navigator_fixed",i=this.$el,s=this.offsetTop,r=this.$scrollElement.scrollTop;let n;return this.isFixed()?(n=r>=s,n?g(i,e):et(i,e),l(t)&&t.call(this,this.isClosed(),n),this):this}calculateStickyHeight(){const t=document.documentElement,e=Math.max(t.clientHeight||0,window.innerHeight||0);return lt("--outline-sticky-height",`${e}px`),this}scrollTo(t,e){const i=this.$scrollElement;return b(i,t,e),this}show(){const t=this.attr("afterOpened"),e=this.count(),i=this.$el,s=this.$parentElement;return this.isInside()?e>800?et(s,mt):(et(s,mt),a((()=>{et(s,gt),g(s,pt)}),30)):et(i,mt),this.closed=!1,l(t)&&t.call(this),this}hide(){const t=this.attr("afterClosed"),e=this.count(),i=this.$el,s=this.$parentElement;return this.isInside()?e>800?g(s,mt):(g(s,gt),et(s,pt),a((()=>{g(s,mt)}))):g(i,mt),this.closed=!0,l(t)&&t.call(this),this}toggle(){const t=this.attr("afterToggle"),e=this.offsetTop,i=this.$scrollElement.scrollTop;let s;return this.isClosed()?this.show():this.hide(),l(t)&&a((()=>{s=i>=e,t.call(this,this.isClosed(),s)})),this}destroy(){const t=this.attr("beforeDestroy"),e=this.attr("afterDestroy");return l(t)&&t.call(this),this.removeListeners()._remove()._default(),this.scrollTimer&&(clearTimeout(this.scrollTimer),this.scrollTimer=null),this.resizeTimer&&(clearTimeout(this.resizeTimer),this.resizeTimer=null),this.observerTimer&&(clearTimeout(this.observerTimer),this.observerTimer=null),this.Observer&&(this.Observer=null),l(e)&&e.call(this),this}onObserver(){const t=this.attr("selector");return this.Observer=((t,e={})=>{const i=e.root||null,s=e.selector||".outline-heading",r=e.context||null,n={rootMargin:e.rootMargin||"0px 0px -90% 0px"},o=new IntersectionObserver((e=>{e.forEach((e=>{e.intersectionRatio>0&&l(t)&&t.call(r||e.target,e.target)}))}),n),a=m(i)?i:document;return i&&(n.root=i),a.querySelectorAll(s).forEach((t=>{o.observe(t)})),o})((t=>{const e=t.getAttribute("data-id");if(this.playing)return!1;this.observerTimer&&clearTimeout(this.observerTimer),this.observerTimer=a((()=>{this.highlight(e)}),100)}),{selector:t,context:this}),this}onSelect(t){const e=this.attr("stickyHeight"),i=t.delegateTarget,s=i.getAttribute("data-id"),r=i.href.split("#")[1],n=document.querySelector(`#${r}`),o=j(n)-(e+10),h=this.$scrollElement.scrollHeight,c=this.attr("afterScroll"),u=()=>{l(c)&&c.call(this,"chapter"),a((()=>{this.playing=!1,this.$emit("toolbar:update",{top:o,min:0,max:h})}))};return this.playing=!0,this.isFixed()?(this.sticky(),a((()=>{this.scrollTo(o,u),this.highlight(s)}),10)):(this.scrollTo(o,u),this.highlight(s)),V(t),this}onScroll(){const t=this.$scrollElement;return this.scrollTimer&&clearTimeout(this.scrollTimer),this.scrollTimer=a((()=>{const e=t.scrollTop,i=t.scrollHeight-t.clientHeight;this.isFixed()&&this.sticky(),this.$emit("toolbar:update",{top:e,min:0,max:i})}),100),this}onResize(){return this.isSticky()?(this.resizeTimer&&clearTimeout(this.resizeTimer),this.resizeTimer=a((()=>{this.calculateStickyHeight()})),this):this}onRefresh(t){return this.refresh(t),this}addListeners(){const t=this.$el,e=this.$scrollElement,i=e.tagName.toLowerCase();let s=e;return this.count()<1||("html"!==i&&"body"!==i||(s=window),P(t,".outline-navigator__anchor","click",this.onSelect,this,!0),ut(s,"scroll",this.onScroll,this,!0),this.isSticky()&&ut(window,"resize",this.onResize,this,!0),this.$on("anchors:all:paint",this.onObserver,this),this.$on("navigator:refresh",this.onRefresh,this)),this}removeListeners(){const t=this.attr("selector"),e=this.$el,i=this.$scrollElement,s=i.tagName.toLowerCase();let r=i;return this.count()<1||("html"!==s&&"body"!==s||(r=window),B(e,"click",this.onSelect),B(r,"scroll",this.onScroll),this.isSticky()&&B(window,"resize",this.onResize),this.$off("anchors:all:paint"),this.$off("navigator:refresh"),this.Observer&&document.querySelectorAll(t).forEach((t=>{this.Observer.unobserve(t)}))),this}}ft.DEFAULTS=u({parentElement:"",scrollElement:"",selector:".outline-heading",active:0,closed:!1,showCode:!0,animationCurrent:!0,position:"relative",stickyHeight:0,chapters:[],created:null,mounted:null,afterClosed:null,afterOpened:null,afterScroll:null,beforeDestroy:null,afterDestroy:null,afterSticky:null});const bt=()=>{const t=navigator.userAgent;return/Mobile|mini|Fennec|Android|iP(ad|od|hone)|NokiaN[^/]*/.test(t)},yt=t=>{const e=Object.getPrototypeOf;let i;if(!(t=>h(t)&&null!==t)(t))return!1;if(i=t.prototype,!i)return!0;for(i=t;null!==e(i);)i=e(i);return e(t)===i},vt=t=>{const e={"&":"&","<":"<",">":">","'":"'",'"':"""};return t.replace(/[&<>'"]/g,(t=>e[t]||t))},$t=[];let _t;J();class xt extends M{constructor(t){super(),this._default(),t&&this.initialize(t)}_default(){return this.attrs=u(xt.DEFAULTS),this.$el=null,this.id="",this.closed=!1,this.visible=!1,this.offset=-50,this.timer=null,this.destroyed=!1,this}initialize(t){return this.attr(t),this.id=this.attr("id"),this.offset=this.attr("offset")||-50,this.$emit("created",r({},this.attr())),this.render().addListeners(),this.attr("visible")&&this.open(),this}isClosed(){return this.closed}isDestroyed(){return this.destroyed}_getClassName(){const t=this.attr("type"),e=this.attr("effect"),i=this.attr("round"),s=this.attr("closable"),r=this.attr("visible"),n=this.attr("customClass"),o=["outline-message",`outline-message_${t}`,`outline-message_${e}`];return i&&o.push("outline-message_round"),s||o.push("outline-message_full-width"),r&&o.push("outline-message_visible"),n&&o.push(n),o}render(){const t=this.attr("type"),e=this.attr("message"),i=this.attr("effect"),s=this.attr("round"),r=this.attr("closable"),n=this.attr("dangerouslyUseHTMLString"),o=this._getClassName(),l=[];let a,h,c,u,d,m=20;return s&&"default"===i&&(m=12),"plain"!==i&&(a=tt("light"===i?`circle-${t}`:t,{iconSet:"outline",size:m}),g(a,"outline-message__icon"),l.push(a)),n?(c=document.createDocumentFragment(),c.innerHTML=e):c=document.createTextNode(vt(ot(e))),h=X("p",{className:"outline-message__content"},[c]),l.push(h),r&&(u=tt("close",{iconSet:"outline",size:18}),g(u,"outline-message__close"),l.push(u)),d=X("div",{className:o.join(" ")},l),d.style.cssText="top:-50px;",this.$el=d,document.body.appendChild(this.$el),this.$emit("mounted"),this}_refreshIcon(){const t=".outline-message_hidden",e=this.$el;let i,s,r,n,o,l,a,h=20;return this.isDestroyed()?this:(o=e.querySelector(".outline-icon"),o?(i=this.attr("type"),s=this.attr("effect"),r=this.attr("round"),"plain"===s?g(o,t):(et(o,t),r&&"default"===s&&(h=12)),l=o.querySelector(".outline-icon__svg"),K(l,{style:`width:${h}px;height:${h}px;`}),a=l.querySelector("use"),n="light"===s?`circle-${i}`:i,G(a,"xlink:href",`#outline-icon-${n}`),this):this)}_refreshMessage(){const t=this.$el;let e,i,s,r;return this.isDestroyed()||(e=t.querySelector(".outline-message__content"),i=this.attr("dangerouslyUseHTMLString"),s=this.attr("message"),r=i?s:vt(ot(s)),e.innerHTML=r),this}_refreshClose(){const t=".outline-message_hidden",e=this.$el;let i,s;return this.isDestroyed()||(i=e.querySelector(".outline-message__close"),s=this.attr("closable"),i&&(s?g(i,t):et(i,t))),this}_refreshEl(){const t=this.$el;let e;return this.isDestroyed()||(e=this._getClassName(),G(t,"className",e.join(" "))),this}refresh(t){return yt(t)?(this.attr(t)._refreshIcon()._refreshMessage()._refreshClose()._refreshEl(),this):this}clearTimer(){return this.isDestroyed()||this.timer&&(clearTimeout(this.timer),this.timer=null),this}startTimer(t){return this.isDestroyed()||(this.timer=a((()=>{this.$emit("opened"),this.close()}),1e3*t)),this}open(t){const e=this.$el;let i,s,r,n;return this.isDestroyed()||(this.isClosed()&&this.refresh(t),i=this.attr("offset"),s=this.attr("duration"),r=i&&i>=this.offset?i:this.offset,n=`top:${r}px;`,this.clearTimer(),this.$emit("beforeOpen"),a((()=>{this.visible=!0,g(e,"outline-message_visible"),e.style.cssText=n,s>0&&this.startTimer(s)}),100)),this}close(){const t=this.$el;let e,i;return this.isDestroyed()||(e=this.attr("destroyAfterClosed"),i=this.attr("beforeClose"),l(i)&&i.call(this),t.style.cssText="top:-50px;",et(t,"outline-message_visible"),this.visible=!1,this.closed=!0,a((()=>{this.$emit("closed"),e&&this.destroy()}),500)),this}destroy(){return this.$emit("beforeDestroy"),this.isDestroyed()||(this.removeListeners(),document.body.removeChild(this.$el),clearTimeout(this.timer),this._default(),this.$emit("afterDestroy")),this}onMouseEnter(){return this.clearTimer(),this}onMouseLeave(){const t=this.attr("duration"),e=this.attr("delay");return t<=0||this.startTimer(e),this}onClose(){return this.clearTimer(),this.close(),this}addListeners(){const t=this.$el;return P(t,".outline-message__content","mouseenter",this.onMouseEnter,this,!0),P(t,".outline-message__content","mouseleave",this.onMouseLeave,this,!0),P(t,".outline-message__close","click",this.onClose,this,!0),this}removeListeners(){const t=this.$el;return B(t,"mouseenter",this.onMouseEnter),B(t,"mouseleave",this.onMouseLeave),B(t,"click",this.onClose),this}}xt.DEFAULTS=u({id:"",type:"info",effect:"default",round:!1,offset:30,duration:3,delay:2,message:"",customClass:"",closable:!0,visible:!0,dangerouslyUseHTMLString:!1,destroyAfterClosed:!0,beforeClose:null}),["info","success","warning","error"].forEach((t=>{xt[t]=e=>{const i={},s=L("outline-message-"),r=e.beforeClose||null;let n=e.offset||30;return d(e)?i.message=e:yt(e)&&w(i,e),i.id=s,i.type=t,i.offset=n,i.visible=!1,i.beforeClose=()=>{xt.close(s,r)},_t=new xt(i),$t.forEach((t=>{n+=t.$el.offsetHeight+16})),_t.offset=n,_t.open(),$t.push(_t),_t}})),xt.close=(t,e)=>{const i=$t.length;let s,r,n=-1;if($t.forEach(((i,s)=>{t===i.id&&(r=i.$el.offsetHeight,n=s,l(e)&&e.call(i),$t.splice(s,1))})),i<=1||-1===n||n>$t.length-1)return!1;for(s=n;s{let t=$t.length-1;for(;t>=0;t-=1)$t[t].close()};class wt{constructor(t,e){this.name=t,l(e)&&(this.action=e)}execute(){return this.action(),this}}class Tt{constructor(){this.commands=[]}get(t){return this.commands.find((e=>e.name===t))}add(t){return this.commands.push(t),this}del(t){const e=this.commands,i=e.find((e=>e.name===t)),s=i?e.indexOf(i):-1;return s>-1&&e.splice(s,1),this}clear(){return this.commands=[],this}execute(t){const e=this.commands.find((e=>e.name===t));return l(null==e?void 0:e.execute)&&e.execute(),this}}const Et=(t,e=!0)=>{const i=tt(t.icon,{iconSet:t.iconSet||"outline",color:t.color||"",size:t.size}),s=X("a",{className:"outline-toolbar__anchor",href:t.link},i),r=X("div",{className:`outline-toolbar__button ${t.name}`,"data-cmd":t.name},[t.link?s:i]);return g(i,"outline-toolbar__icon"),e&&g(r,"outline-toolbar_rounded"),t.disabled&&g(r,"outline-toolbar_disabled"),r},St="outline-toolbar_disabled",Ct="outline-toolbar_hidden",Lt="outline-toolbar_active";class zt extends M{constructor(t){super(),this._default(),t&&this.initialize(t)}_default(){return this.attrs=u(zt.DEFAULTS),this.disabled=!1,this.closed=!1,this.$el=null,this.buttons=[],this.commands=null,this}initialize(t){let e;return this.attr(t),this.disabled=this.attr("disabled"),this.closed=this.attr("closed"),this.commands=new Tt,e=this.attr("created"),l(e)&&e.call(this),this.render().addListeners(),this}isHighlight(t){const e=this.get(t);return!!e&&p(e.$el,Lt)}isDisabled(t){let e;return t?(e=this.get(t),e.disabled):this.disabled}isExist(t){return!!this.get(t)}isClosed(){return this.closed}_getCommand(t){const e=this,{action:i,name:s}=t;let r,n,o=null,a=null;return i?(a=i.handler,r=i.context||this,l(a)?n=a:d(a)&&(n=function(){e.$emit(a,s)}),l(n)&&(o=new wt(s,n.bind(r))),o):o}get(t){return this.buttons.find((e=>e.name===t))}render(){const t=this.attr("mounted"),e=this.attr("buttons")||[],i=this.attr("placement");return J(),this.$el=X("div",{id:L("outline-toolbar"),className:`outline-toolbar outline-toolbar_${i}`}),this._paint(e),document.body.appendChild(this.$el),this.closed&&this.hide(),this.disabled&&this.disable(),l(t)&&t.call(this),this}erase(){return this.$el.innerHTML="",this}_paint(t){const e=this.attr("rounded"),i=document.createDocumentFragment();return t.forEach((t=>{const s=Et(t,e),r=this._getCommand(t),{name:n,disabled:o,context:l}=t;i.appendChild(s),this.isExist(n)||(this.buttons.push({$el:s,name:n,disabled:o||!1,context:l||this}),r&&this.commands.add(r))})),this.$el.appendChild(i),this}_remove(){return document.body.removeChild(this.$el),this}refresh(t){return this.attr({buttons:t}),this.erase()._paint(t),this}add(t){const e=this.$el,i=document.createDocumentFragment(),s=this.attr("buttons")||[],{name:r,disabled:n,context:o}=t,l=this._getCommand(t),a=t=>{const e=Et(t);i.appendChild(e),s.push(t),this.buttons.push({$el:e,name:r,disabled:n||!1,context:o||this,command:l}),l&&this.commands.add(l)};return h(t)?a(t):c(t)&&t.forEach((t=>{h(t)&&a(t)})),e.appendChild(i),this}remove(t){const e=this.$el,i=this.buttons,s=this.get(t);let r=-1;return s?(r=i.indexOf(s),r>-1&&(i.splice(r,1),this.attr("buttons").splice(r,1)),this._disable(t),e.removeChild(s.$el),this):this}_disable(t){const e=this.get(t),i=this.commands.get(t);return!e||e.disabled||(e.disabled=!0,i&&this.commands.del(i),g(e.$el,St)),this}_enable(t){const e=this.get(t),i=this.commands.get(t);return e&&e.disabled?(e.disabled=!1,i&&this.commands.add(i),et(e.$el,St),this):this}disable(t){const e=this.attr("afterDisabled");return t?this._disable(t):(g(this.$el,St),this.removeListeners(),this.disabled=!0,l(e)&&e.call(this)),this}enable(t){const e=this.attr("afterEnabled");return t?this._enable(t):(this.disabled=!1,et(this.$el,St),this.addListeners(),l(e)&&e.call(this)),this}show(t){const e=this.attr("afterOpened"),i=this.get(t),s=this.$el;if(t){if(!i)return this;et(i.$el,Ct)}else et(s,Ct),this.closed=!1,l(e)&&a((()=>{e.call(this)}),310);return this}hide(t){const e=this.attr("afterClosed"),i=this.get(t),s=this.$el;if(t){if(!i)return this;g(i.$el,Ct)}else g(s,Ct),this.closed=!0,l(e)&&a((()=>{e.call(this)}),310);return this}toggle(t){return this.isClosed()?this.show(t):this.hide(t),this}highlight(t){const e=this.get(t);let i;return e?(i=e.$el,p(i,Lt)?et(i,Lt):g(i,Lt),this):this}destroy(){const t=this.attr("beforeDestroy"),e=this.attr("afterDestroy");return l(t)&&t.call(this),this.commands.clear(),this.removeListeners()._remove()._default(),l(e)&&e.call(this),this}execute(t){return this.isDisabled(t)||this.commands.execute(t),this}onExecute(t){const e=t.delegateTarget;let i="";return e&&(i=e.getAttribute("data-cmd"),i&&this.execute(i)),this}_updateToolbar({top:t,min:e,max:i}){const s=Math.ceil(t);return s<=e?(this.hide("up"),this.show("down")):s>=i?(this.hide("down"),this.show("up")):s>e&&s{t[`on${i}`]=t=>{C(i,{event:t,speech:e})}})),speechSynthesis.onvoiceschanged=t=>{C("voiceschanged",{event:t,speech:e})},this}}kt.isSupport="speechSynthesis"in window;const Mt=(t,e)=>{let i,s=t;for(;s;)i=s.tagName.toLowerCase(),"script"!==i&&"style"!==i&&g(s,"outline-reader_sibling"),s=e?s.previousElementSibling:s.nextElementSibling},At="进入阅读模式,按 ESC 键可退出阅读模式";class Ot extends M{constructor(t){super(),this._default(),t&&this.initialize(t)}_default(){return this.attrs=u(Ot.DEFAULTS),this.reading=!1,this.$target=null,this.$el=null,this.$paper=null,this.$title=null,this.$article=null,this.$progress=null,this.toolbar=null,this.speech=null,this}initialize(t){let e;return this.attr(t),e=this.attr("target"),d(e)?this.$target=document.querySelector(e):m(e)&&(this.$target=e),this.$target?(kt.isSupport&&(this.speech=new kt),this.render().addListeners(),this):this}isSpeaking(){var t;return null==this||null===(t=this.speech)||void 0===t?void 0:t.isSpeaking()}render(){return this._renderEdge()._paint(this.$target),this}erase(){return this.$article.innerHTML="",this}_paint(t){const e=document.createDocumentFragment(),s=i(n,t.cloneNode(!0).children);return a((()=>{s.forEach((t=>{e.appendChild(t)})),this.$article.appendChild(e)})),this}_remove(){const t=this.$el,e=this.toolbar;return t&&document.body.removeChild(t),e&&e.destroy(),this}refresh(){return this.erase()._paint(this.$target),this}_animateTimeline(){return window.ScrollTimeline&&bt()?(this.$progress.animate({scale:["0 1","1 1"]},{timeline:new ScrollTimeline({source:this.$article,axis:"block"})}),this):this}_renderEdge(){const t=this.$target,e=bt()?26:20;let i,s,r,n,o,l,h=this.attr("title");o=X("div",{className:"outline-reader__progress"}),this.$progress=o,r=t.querySelector("h1"),m(h)&&(r=h),m(r)&&(h=r.innerText),r=X("h1",{className:"outline-reader__title"},h),this.$title=r,n=X("article",{id:"outline-reader__article",className:"outline-reader__article"},bt()?[]:[o.cloneNode()]),this.$article=n,s=X("div",{id:"outline-reader__paper",className:"outline-reader__paper"},[r,n]),this.$paper=s;const c=[];return c.push({name:"print",icon:"print",size:e,action:{context:this,handler:this.print}}),kt.isSupport&&this.attr("allowSpeak")&&c.push({name:"speak",icon:"sound",size:e,action:{context:this,handler:this.speak}}),c.push({name:"exit",icon:"close",size:e,action:{context:this,handler:this.exit}}),this.toolbar=new zt({placement:"rtl",buttons:c}),i=X("section",{id:"outline-reader",className:"outline-reader outline-reader_hidden"},[o,s,this.toolbar.$el]),this.$el=i,document.body.appendChild(i),this._animateTimeline(),a((()=>{l=i.previousElementSibling,Mt(l,!0),l=i.nextElementSibling,Mt(l)})),this}enter(){const t="outline-reader",e=`${t}--reading`,i=`${t}_hidden`,s=this.$el,r=document.querySelectorAll(".outline-reader_sibling"),n=this.attr("enterReadingTip")||At;return this.reading||!s||(r.forEach((t=>{g(t,i)})),g(s,e),et(s,i),this.toolbar.show(),this.reading=!0,xt.info({round:!0,message:n}),this.$emit("reader:enter")),this}exit(){const t="speak",e="outline-reader",i=`${e}--reading`,s=`${e}_hidden`,r=this.$el,n=document.querySelectorAll(".outline-reader_sibling"),o=this.speech,l=this.toolbar;return this.reading&&r?(g(r,s),et(r,i),n.forEach((t=>{et(t,s)})),l.hide(),this.reading=!1,o&&(l.isHighlight(t)&&l.highlight(t),o.cancel()),this.$emit("reader:exit"),this):this}toggle(){return this.reading?this.exit():this.enter(),this}speak(){const t=this.$article.innerText,e=this.speech;return kt.isSupport&&e?(this.toolbar.highlight("speak"),this.isSpeaking()?e.cancel():e.speak(t),this):this}print(){return l(print)?(print(),this):this}destroy(){return this.$el?(this.removeListeners()._remove()._default(),this):this}onPrint(){return this.print(),this}onEnterReading(){return this.toggle(),this}onExitReading(t){return 27===t.keyCode&&this.reading&&(this.toggle(),V(t)),this}onRefresh(){return this.refresh(),this}addListeners(){return this.$el?(ut(document,"keyup",this.onExitReading,this,!0),this.$on("toolbar:action:print",this.onPrint),this.$on("toolbar:action:reading",this.onEnterReading),this.$on("reader:print",this.onPrint),this.$on("reader:refresh",this.onRefresh),this.$on("reader:enter",this.enter),this.$on("reader:exit",this.exit),this.$on("reader:toggle",this.toggle),this):this}removeListeners(){return this.$el?(B(document,"keyup",this.onExitReading),this.$off("toolbar:action:print"),this.$off("toolbar:action:reading"),this.$off("reader:refresh"),this.$off("reader:toggle"),this):this}}var Nt;Ot.DEFAULTS=u({target:"",title:"",enterReadingTip:At,allowSpeak:!1});class Ht extends M{constructor(t){super(),this.version="3.39.0",this._default(),t&&this.initialize(t)}_default(){const t=Ht.DEFAULTS;return this.attrs=u(t),this.$article=null,this.$scrollElement=null,this.buttons=[],this.anchors=null,this.drawer=null,this.navigator=null,this.reader=null,this.toolbar=null,this}initialize(t){let e="",i="",s=null;return this.attr(t),e=this.attr("articleElement"),i=this.attr("scrollElement"),d(e)?s=document.querySelector(e):m(e)&&(s=e),this.$article=s,this.$scrollElement=y(i),this.$emit("created",r({},this.attr())),this.render().addListeners(),this}isExpanded(){const t=this.attr("position"),e=this.drawer,i=this.navigator;return!(this.count()<0)&&("relative"===t?!e.isClosed():!i.isClosed())}getChapters(t=!1){const e=this.$article,i=this.attr("selector"),s=this.attr("showCode"),r=this.attr("chapterTextFilter");return _({articleElement:e,selector:i,showCode:s,chapterTextFilter:r,isTreeStructured:t})}count(){return this.getChapters().length}render(){const t=this.attr("hasToolbar"),e=this.$scrollElement;return this._renderReader()._renderAnchors()._renderNavigator()._renderToolbar(),e&&t&&this.$emit("toolbar:update",{top:e.scrollTop,min:0,max:e.scrollHeight}),this.$emit("mounted"),this}_renderReader(){const t=this.attr("reader");return t.target?(g(this.$article,"outline-article"),this.reader=new Ot(t),this):this}_renderAnchors(){const t=this.attr("articleElement"),e=this.attr("selector"),i=this.attr("stickyHeight"),s=this.attr("scrollElement"),r=this.attr("showCode"),n=this.attr("anchorURL"),o=this.attr("afterScroll"),l=this.attr("chapterTextFilter"),a=this.attr("anchorLinkFilter");return this.anchors=new st({articleElement:t,stickyHeight:i,scrollElement:s,selector:e,showCode:r,anchorURL:n,afterScroll:o,chapterTextFilter:l,anchorLinkFilter:a}),this}_renderNavigator(){const t=this.attr("title"),e=this.attr("stickyHeight"),i=this.attr("scrollElement"),s=this.attr("customClass"),r=this.attr("showCode"),n=this.attr("animationCurrent"),o=this.attr("closeOnClickModal"),l=this.attr("showNavModalFirst"),a=this.attr("position"),h=this.attr("placement"),c=this.attr("afterSticky"),u=this.attr("afterToggle"),d=this.attr("afterScroll"),m=this.count();let p,g=this.attr("parentElement");return m<1||(p={scrollElement:i,showCode:r,animationCurrent:n,position:a,title:t,stickyHeight:e,chapters:this.getChapters(),afterSticky:c,afterToggle:u,afterScroll:d},"relative"===a?(this.drawer=new ct({placement:h,title:t,size:"tiny",hasOffset:!0,hasPadding:!1,closeOnClickModal:o,customClass:s,afterClosed:()=>{this.toolbar.toggle()}}),g=this.drawer.$main,l&&this.drawer.open()):p.customClass=s,p.parentElement=g,this.navigator=new ft(p)),this}_renderToolbar(){const t=this.attr("position"),e=this.attr("hasToolbar"),s=this.attr("showNavModalFirst"),r=this.attr("placement"),o=this.attr("homepage"),a=this.attr("git"),h=this.attr("tags"),c=this.attr("issues"),u=this.attr("tools"),d=this.attr("reader"),m=this.count(),p={name:"up",icon:"up",size:20,action:{context:this,handler:this.toTop}},g={name:"homepage",icon:"homepage",size:20,link:o},f={name:"github",icon:"github",size:20,link:a},b={name:"tags",icon:"tags",size:20,link:h},y={name:"issues",icon:"issues",size:20,link:c},v={name:"toggle",icon:"menu",size:18,action:{context:this,handler:this.toggle}},$={name:"reading",icon:"file",size:18,action:{context:this,handler:"toolbar:action:reading"}},_={name:"print",icon:"print",size:20,action:{handler:"toolbar:action:print"}},x={name:"down",icon:"down",size:20,action:{context:this,handler:this.toBottom}},w=[];return e?(w.push(p),m>0&&w.push(v),o&&w.push(g),a&&w.push(f),h&&w.push(b),c&&w.push(y),d.target&&(w.push($),l(print)&&w.push(_)),(null==u?void 0:u.length)>0&&w.push.apply(w,i(n,u)),w.push(x),this.buttons=[].concat(w),this.toolbar=new zt({placement:r,buttons:w}),"relative"===t&&s&&this.toolbar.hide(),this):this}refresh(){const t=this.getChapters();return this.$emit("anchors:refresh",t),this.$emit("navigator:refresh",t),this.$emit("reader:refresh"),this.$emit("refresh",t),this}addButton(t){const e=this.buttons;return e.splice(-1,0,t),this.$emit("toolbar:add:button",e),this}removeButton(t){return this.$emit("toolbar:remove:button",t),this}toTop(){const t=this.attr("afterScroll"),e=this.toolbar,i=this.navigator,s=this.count();return s>0&&(i.playing=!0),this.scrollTo(0,(()=>{e.hide("up"),e.show("down"),s>0&&(i.highlight(0),i.playing=!1,b(i.$main,0)),l(t)&&t.call(e,"up")})),this}toBottom(){const t=this.attr("afterScroll"),e=this.$scrollElement,i=this.toolbar,s=this.navigator,r=this.count(),n=Math.floor(e.scrollHeight-e.clientHeight);return r>0&&(s.playing=!0),this.scrollTo(n,(()=>{const e=s.$main;i.hide("down"),i.show("up"),r>0&&(s.highlight(r-1),b(e,e.scrollHeight),s.playing=!1),l(t)&&t.call(i,"bottom")})),this}scrollTo(t,e){return b(this.$scrollElement,t,e),this}enterReading(){return this.$emit("toolbar:toggle"),this.$emit("reader:enter"),this}exitReading(){return this.$emit("toolbar:toggle"),this.$emit("reader:exit"),this}switchReading(){return this.$emit("toolbar:toggle"),this.$emit("reader:toggle"),this}expand(){const t=this.attr("position"),e=this.toolbar,i=this.drawer,s=this.navigator;return this.count()<1||("relative"!==t?(s.show(),e.highlight("toggle")):(e.hide(),a((()=>{i.open()})))),this}collapses(){const t=this.attr("position"),e=this.toolbar,i=this.drawer,s=this.navigator;return this.count()<1||("relative"!==t?(s.hide(),e.highlight("toggle")):(e.show(),a((()=>{i.close()})))),this}toggle(){return this.isExpanded()?this.collapses():this.expand(),this}print(){return this.$emit("reader:print"),this}_destroy(){const t=this.count();let e=this.anchors,i=this.navigator,s=this.drawer,r=this.reader,n=this.toolbar,o=!1;return this.removeListeners(),r&&r.destroy(),t>0&&i&&(o=i.isOutside(),i.destroy(),o&&s&&s.destroy()),e&&e.destroy(),n&&n.destroy(),this}destroy(){return this.$emit("beforeDestroy"),this._destroy()._default(),this.$emit("destroyed"),this}addListeners(){return this.attr("hasToolbar")?(this.$on("toolbar:update",this.onToolbarUpdate),this):this}removeListeners(){return this.attr("hasToolbar")?(this.$off("toolbar:update"),this):this}}if(Ht.DEFAULTS=u({articleElement:"#article",selector:"h2,h3,h4,h5,h6",parentElement:"#aside",scrollElement:"html,body",title:"目录",position:"relative",placement:"rtl",animationCurrent:!0,showCode:!1,hasToolbar:!0,closeOnClickModal:!0,showNavModalFirst:!1,anchorURL:"",stickyHeight:0,homepage:"",git:"",tags:"",issues:"",tools:[],reader:{target:"",title:"",enterReadingTip:"进入阅读模式,按 ESC 键可退出阅读模式",allowSpeak:!1},customClass:"",afterSticky:null,afterToggle:null,afterScroll:null,chapterTextFilter:null,anchorLinkFilter:null}),null!==(Nt=window)&&void 0!==Nt&&Nt.jQuery){const t=window.jQuery;t.extend(t.fn,{outline:function(e){let i=t(this);return new Ht(t.extend({},e,{articleElement:i}))}})}return Ht})); //# sourceMappingURL=outline.min.js.map diff --git a/outline.min.js.map b/outline.min.js.map index a584aa03..7ce3caff 100644 --- a/outline.min.js.map +++ b/outline.min.js.map @@ -1 +1 @@ -{"version":3,"file":"outline.min.js","sources":["utils/lang/toString.js","utils/types/isFunction.js","utils/lang/later.js","utils/types/isObject.js","utils/types/isArray.js","utils/lang/cloneDeep.js","utils/types/isString.js","utils/types/isElement.js","utils/dom/hasClass.js","utils/dom/addClass.js","utils/lang/easeInQuad.js","utils/dom/_getScrollElement.js","utils/dom/scrollTo.js","utils/lang/trim.js","getChaptersByHeadings.js","utils/lang/stripTags.js","_getChapterParentIdByDiffer.js","_getChaptersWithCode.js","getChapters.js","utils/lang/toTree.js","utils/lang/hasOwn.js","utils/lang/extend.js","utils/observer/_subscribers.js","utils/observer/_hasDirectSubscribersFor.js","utils/observer/has.js","utils/observer/_hasSubscribers.js","utils/observer/emit.js","utils/types/isTypedArray.js","utils/lang/guid.js","utils/observer/_removeSubscriber.js","utils/observer/off.js","utils/observer/_removeSubscriberByToken.js","base.js","utils/observer/on.js","utils/lang/timeSlice.js","utils/dom/offsetTop.js","utils/dom/matches.js","utils/dom/getParentOrHost.js","utils/event/enum.js","utils/event/_off.js","utils/event/_delete.js","utils/event/purgeElement.js","utils/event/getListeners.js","utils/event/off.js","utils/event/on.js","utils/event/getTarget.js","utils/dom/resolveTextNode.js","utils/dom/closest.js","utils/event/stop.js","utils/icons/symbols.js","utils/icons/defaults.js","utils/icons/getSymbols.js","utils/icons/getSymbol.js","utils/icons/paint.js","utils/icons/add.js","utils/types/isDOM.js","utils/types/isHTMLCollection.js","utils/types/isFragment.js","utils/types/isTextNode.js","utils/dom/setAttribute.js","utils/dom/setAttributes.js","utils/dom/createElement.js","utils/icons/createElement.js","utils/types/isSVG.js","utils/icons/icon.js","utils/dom/removeClass.js","_removeHeading.js","utils/types/isEmpty.js","anchors.js","_updateHeading.js","utils/types/tags.js","utils/types/isHTML.js","utils/lang/stripScripts.js","utils/dom/setProperty.js","zIndex.js","drawer.js","utils/dom/html.js","utils/event/at.js","utils/dom/getStyle.js","navigator.js","_paintChapters.js","utils/dom/inBounding.js","utils/dom/intersection.js","utils/types/isObjectLike.js","utils/types/isPlainObject.js","utils/lang/encodeHTML.js","message.js","command.js","commands.js","_createButton.js","toolbar.js","speech.js","_updateSiblingElements.js","utils/dom/isMobile.js","reader.js","outline.js"],"sourcesContent":["/**\r\n * Object 对象原型上的 toString 方法\r\n * ========================================================================\r\n * @method toString\r\n * @param {*} val\r\n * @returns {string}\r\n */\r\nconst toString = (val) => {\r\n return Object.prototype.toString.apply(val)\r\n}\r\n\r\nexport default toString\r\n","import toString from '../lang/toString'\r\n\r\n/**\r\n * 检测测试数据是否为 Function 类型\r\n * ========================================================================\r\n * @method isFunction\r\n * @param {*} val - (必须)待检测的数据\r\n * @returns {boolean} 'val' 是 Function 类型返回 true,否则返回 false\r\n */\r\nconst isFunction = (val) => {\r\n return typeof val === 'function' || toString(val) === '[object Function]'\r\n}\r\n\r\nexport default isFunction\r\n","import isFunction from '../types/isFunction'\r\n\r\n/**\r\n * later - 延迟执行方法\r\n * ========================================================================\r\n * @method later\r\n * @param {Function} fn\r\n * @param {Number} [delay]\r\n * @returns {number|boolean}\r\n */\r\nconst later = (fn, delay = 300) => {\r\n if (!isFunction(fn)) {\r\n return false\r\n }\r\n\r\n return setTimeout(() => {\r\n fn()\r\n }, delay)\r\n}\r\n\r\nexport default later\r\n","import toString from '../lang/toString'\r\nimport isFunction from './isFunction'\r\n\r\n/**\r\n * 检测数据是否为 Object 类型\r\n * ========================================================================\r\n * @method isObject\r\n * @param {*} o\r\n * @returns {boolean}\r\n */\r\nconst isObject = (o) => {\r\n return (\r\n (toString(o) === '[object Object]' ||\r\n typeof o === 'object' ||\r\n isFunction(o)) &&\r\n o !== null\r\n )\r\n}\r\n\r\nexport default isObject\r\n","import toString from '../lang/toString'\r\n\r\n/**\r\n * 检测数据是否为 Array 类型\r\n * ========================================================================\r\n * @method isArray\r\n * @param {*} o\r\n * @returns {boolean}\r\n */\r\nconst isArray = (o) => {\r\n if (Array.isArray) {\r\n return Array.isArray(o)\r\n } else {\r\n return toString(o) === '[object Array]'\r\n }\r\n}\r\n\r\nexport default isArray\r\n","import isObject from '../types/isObject'\r\nimport isArray from '../types/isArray'\r\n\r\n/**\r\n * 深拷贝对象函数\r\n * ========================================================================\r\n * @methods cloneDeep\r\n * @param {Object} obj - 深拷贝的对象\r\n * @returns {Array|Object|*}\r\n *\r\n * @example\r\n * const arr = cloneDeep([2,3,4,6])\r\n * => [2,3,4,6]\r\n */\r\nconst cloneDeep = (obj) => {\r\n let clone = {}\r\n\r\n if (obj === null) {\r\n return null\r\n }\r\n\r\n if (isArray(obj)) {\r\n clone = Array.from(obj)\r\n } else {\r\n clone = Object.assign({}, obj)\r\n Object.keys(clone).forEach((key) => {\r\n return (clone[key] = isObject(obj[key]) ? cloneDeep(obj[key]) : obj[key])\r\n })\r\n }\r\n\r\n return clone\r\n}\r\n\r\nexport default cloneDeep\r\n","/**\r\n * 检测数据是否为 String 类型\r\n * ========================================================================\r\n * @method isArray\r\n * @param {*} str\r\n * @returns {boolean}\r\n */\r\nconst isString = (str) => {\r\n return typeof str === 'string'\r\n}\r\n\r\nexport default isString\r\n","import isObject from './isObject'\r\n\r\n/**\r\n * 检测数据是否为 HTMLElement DOM 节点\r\n * ========================================================================\r\n * @method isElement\r\n * @param {*} o\r\n * @returns {boolean}\r\n */\r\nconst isElement = (o) => {\r\n return !!(isObject(o) && o.nodeName && o.tagName && o.nodeType === 1)\r\n}\r\n\r\nexport default isElement\r\n","import isElement from '../types/isElement'\r\n/**\r\n * 检测 DOM 节点是否包含名为 className 的样式\r\n * ========================================================================\r\n * @method hasClass\r\n * @param {HTMLElement} el - DOM 节点\r\n * @param {String} className - 样式名称\r\n * @returns {Boolean}\r\n */\r\nconst hasClass = (el, className) => {\r\n const pattern = new RegExp('(\\\\s|^)' + className + '(\\\\s|$)')\r\n let allClass\r\n let classList\r\n\r\n if (!isElement(el)) {\r\n return false\r\n }\r\n\r\n allClass = el.className\r\n\r\n if (!allClass) {\r\n return false\r\n }\r\n\r\n classList = el.classList\r\n\r\n if (classList && classList.contains) {\r\n return el.classList.contains(className)\r\n }\r\n\r\n return !!pattern.exec(allClass)\r\n}\r\n\r\nexport default hasClass\r\n","import hasClass from './hasClass'\r\n\r\n/**\r\n * 给 DOM 节点添加名为 className 的样式\r\n * ========================================================================\r\n * @method addClass\r\n * @param {HTMLElement} el - DOM 节点\r\n * @param {String} className - 样式名称\r\n * @returns {Boolean}\r\n */\r\nconst addClass = (el, className) => {\r\n let classList\r\n let allClass\r\n\r\n if (hasClass(el, className)) {\r\n return false\r\n }\r\n\r\n classList = el.classList\r\n\r\n if (classList?.add) {\r\n if (className.indexOf(' ') > -1) {\r\n className.split(' ').forEach((name) => {\r\n classList.add(name)\r\n })\r\n } else {\r\n classList.add(className)\r\n }\r\n } else {\r\n allClass = el.className\r\n allClass += allClass.length > 0 ? ' ' + className : className\r\n el.className = allClass\r\n }\r\n}\r\n\r\nexport default addClass\r\n","/**\r\n * 返回给定值的平方值\r\n * ========================================================================\r\n * @method easeInQuad\r\n * @param {Number} x\r\n * @returns {number}\r\n */\r\nconst easeInQuad = (x) => {\r\n return x * x\r\n}\r\n\r\nexport default easeInQuad\r\n","import isString from '../types/isString'\r\nimport isElement from '../types/isElement'\r\n\r\n/**\r\n * 通过给的 scrollElement 参数,获取滚动 DOM 元素\r\n * ========================================================================\r\n * @method _getScrollElement\r\n * @param {String|HTMLElement} scrollElement\r\n * @returns {Element}\r\n * @private\r\n */\r\nconst _getScrollElement = (scrollElement = null) => {\r\n let $rootElements\r\n let $scrollElement\r\n\r\n if (!scrollElement) {\r\n $rootElements = document.querySelectorAll('html,body')\r\n $scrollElement =\r\n $rootElements[0].scrollTop - $rootElements[1].scrollTop >= 0\r\n ? $rootElements[0]\r\n : $rootElements[1]\r\n } else {\r\n if (isString(scrollElement)) {\r\n $scrollElement = document.querySelector(scrollElement)\r\n } else if (isElement(scrollElement)) {\r\n $scrollElement = scrollElement\r\n }\r\n }\r\n\r\n return $scrollElement\r\n}\r\n\r\nexport default _getScrollElement\r\n","import easeInQuad from '../lang/easeInQuad'\r\nimport isFunction from '../types/isFunction'\r\nimport _getScrollElement from './_getScrollElement'\r\n\r\n/**\r\n * 指定 rootElement DOM 节点滚动到指定 top 位置\r\n * ========================================================================\r\n * @method scrollTo\r\n * @param {HTMLElement|Object} [scrollElement] - (必须)要滚动的 DOM 节点\r\n * @param {Number} top - (必须)滚动的 scrollTop 数值\r\n * @param {Function} [afterStop] - (可选)滚动完成的回调函数\r\n */\r\nconst scrollTo = (scrollElement, top, afterStop) => {\r\n const $scrollElement = _getScrollElement(scrollElement)\r\n let scrollTop = $scrollElement.scrollTop\r\n let step = 0\r\n const distance = top - scrollTop\r\n const MAX_HEIGHT = $scrollElement.scrollHeight\r\n const MAX_TOP = top - MAX_HEIGHT <= 0 ? top : MAX_HEIGHT\r\n const stop = (top) => {\r\n if (isFunction(afterStop)) {\r\n afterStop(top)\r\n }\r\n\r\n return false\r\n }\r\n const play = () => {\r\n step += 1\r\n\r\n // 向上滚动\r\n if (distance < 0) {\r\n scrollTop -= easeInQuad(step)\r\n $scrollElement.scrollTop = scrollTop\r\n\r\n console.log(\r\n '$scrollElement up',\r\n scrollElement,\r\n $scrollElement,\r\n scrollTop,\r\n $scrollElement.scrollTop\r\n )\r\n\r\n if (scrollTop <= top) {\r\n $scrollElement.scrollTop = top\r\n return stop(top)\r\n }\r\n } else {\r\n scrollTop += easeInQuad(step)\r\n $scrollElement.scrollTop = scrollTop\r\n\r\n console.log(\r\n '$scrollElement down',\r\n scrollElement,\r\n $scrollElement,\r\n scrollTop,\r\n $scrollElement.scrollTop\r\n )\r\n\r\n if (scrollTop >= MAX_TOP) {\r\n $scrollElement.scrollTop = MAX_TOP\r\n return stop(MAX_TOP)\r\n }\r\n }\r\n\r\n // eslint-disable-next-line compat/compat\r\n requestAnimationFrame(play)\r\n }\r\n\r\n // eslint-disable-next-line compat/compat\r\n requestAnimationFrame(play)\r\n}\r\n\r\nexport default scrollTo\r\n","import isString from '../types/isString'\r\n\r\n/**\r\n * 清楚字符串起始位置所有的空格\r\n * ========================================================================\r\n * @method trim\r\n * @param {string} str\r\n * @returns {string|Boolean}\r\n */\r\nconst trim = (str) => {\r\n if (!isString(str)) {\r\n return false\r\n }\r\n return str.replace(/(^\\s+)|(\\s+$)/g, '')\r\n}\r\n\r\nexport default trim\r\n","import trim from './utils/lang/trim'\r\nimport stripTags from './utils/lang/stripTags'\r\nimport isFunction from './utils/types/isFunction'\r\n\r\nimport _getChapterParentIdByDiffer from './_getChapterParentIdByDiffer'\r\nimport _getChaptersWithCode from './_getChaptersWithCode'\r\n\r\n/**\r\n * 根据文章中的 h1~h6 标签,自动分析返回文章章节数据\r\n * ========================================================================\r\n * @method getChaptersByHeadings\r\n * @param {Array} headings\r\n * @param {Boolean} [showCode]\r\n * @param {Function} [chapterTextFilter]\r\n * @return {*|*[]}\r\n */\r\nconst getChaptersByHeadings = (\r\n headings,\r\n showCode = false,\r\n chapterTextFilter = null\r\n) => {\r\n const pattern = /^\\d(\\.|(\\.\\d+)*)\\s?/gi\r\n const chapters = []\r\n let previous = 1\r\n let level = 0\r\n let text = ''\r\n\r\n headings.forEach((heading, i) => {\r\n const tagName = heading.tagName\r\n const headingLevel = tagName.replace(/h/i, '')\r\n let current = parseInt(headingLevel, 10)\r\n let pid = -1\r\n\r\n // 场景1:当前标题是前一个标题的子标题\r\n // 当前标题的(标题标签)序号 > 前一个标题的序号:两个相连的标题是父标题 -> 子标题关系;\r\n // h2 (前一个标题)\r\n // h3 (当前标题)\r\n if (current > previous) {\r\n level += 1\r\n\r\n // 第一层级的 pid 是 -1\r\n if (level === 1) {\r\n pid = -1\r\n } else {\r\n pid = i - 1\r\n }\r\n }\r\n // 场景2:当前标题和前一个标题层级相同\r\n // 当前标题的(标题标签)序号 = 前一个标题的序号\r\n // h2 (前一个标题)\r\n // h2 (当前标题)\r\n // 当前标题的(标题标签)序号 < 前一个标题的序号,并且当前标题序号 > 当前的级别\r\n // h2\r\n // h4 (前一个标题)\r\n // h3 (当前标题:这种情况我们还是任务 h3 是 h2 的下一级章节)\r\n else if (current === previous || (current < previous && current > level)) {\r\n // H1 的层级肯定是 1\r\n if (current === 1) {\r\n level = 1\r\n pid = -1\r\n } else {\r\n pid = chapters[i - 1].pid\r\n }\r\n }\r\n // 场景3:当前标题比前一个标题层级高\r\n else if (current <= level) {\r\n // H1 的层级肯定是 1\r\n if (current === 1) {\r\n level = 1\r\n } else {\r\n level = level - (previous - current)\r\n\r\n if (level <= 1) {\r\n level = 1\r\n }\r\n }\r\n\r\n // 第一级的标题\r\n if (level === 1) {\r\n pid = -1\r\n } else {\r\n // 通过当前标题和前一个标题之间的等级差,获得当前标题的父标题ID\r\n pid = _getChapterParentIdByDiffer(chapters, previous - current, i)\r\n }\r\n }\r\n\r\n previous = current\r\n\r\n text = trim(stripTags(heading.innerHTML))\r\n\r\n // 如果自动生成章节编号,则去掉标题中自带的编号文本\r\n if (showCode) {\r\n text = trim(text.replace(pattern, ''))\r\n }\r\n\r\n if (isFunction(chapterTextFilter)) {\r\n text = chapterTextFilter(text)\r\n }\r\n\r\n chapters.push({\r\n id: i,\r\n pid: pid,\r\n level: level,\r\n rel: `heading-${i}`,\r\n text,\r\n tagName\r\n })\r\n })\r\n\r\n return showCode ? _getChaptersWithCode(chapters) : chapters\r\n}\r\n\r\nexport default getChaptersByHeadings\r\n","import isString from '../types/isString'\r\n\r\n/**\r\n * 过滤所有 HTML 标签\r\n * ========================================================================\r\n * @method stripTags\r\n * @param {string} str\r\n * @returns {string}\r\n */\r\nconst stripTags = (str) => {\r\n if (!isString(str)) {\r\n return ''\r\n }\r\n return str.replace(/<\\/?[^>]+(>|$)/g, '')\r\n}\r\n\r\nexport default stripTags\r\n","const _getChapterParentIdByDiffer = (chapters, differ, index) => {\r\n let previous = chapters[index - 1]\r\n let pid\r\n let i\r\n\r\n for (i = 0; i < differ; i += 1) {\r\n pid = previous.pid\r\n previous = chapters[pid]\r\n }\r\n\r\n pid = previous.pid\r\n\r\n return pid\r\n}\r\n\r\nexport default _getChapterParentIdByDiffer\r\n","import isArray from './utils/types/isArray'\r\n\r\nconst _getChaptersWithCode = (chapters) => {\r\n const groups = {}\r\n const cb = (o) => {\r\n return [o.pid]\r\n }\r\n\r\n chapters.forEach((o) => {\r\n const group = JSON.stringify(cb(o))\r\n\r\n groups[group] = groups[group] || []\r\n groups[group].push(o)\r\n\r\n o.index = groups[group].length\r\n\r\n if (o.pid === -1) {\r\n o.code = String(o.index)\r\n }\r\n })\r\n\r\n Object.keys(groups).forEach((group) => {\r\n groups[group].forEach((c) => {\r\n const subjects = groups[`[${c.id}]`]\r\n\r\n if (!subjects || !isArray(subjects)) {\r\n return false\r\n }\r\n\r\n subjects.forEach((o) => {\r\n o.code = c.code + '.' + o.index\r\n })\r\n })\r\n })\r\n\r\n return chapters\r\n}\r\n\r\nexport default _getChaptersWithCode\r\n","import isString from './utils/types/isString'\r\nimport isFunction from './utils/types/isFunction'\r\nimport isElement from './utils/types/isElement'\r\nimport toTree from './utils/lang/toTree'\r\n\r\nimport getChaptersByHeadings from './getChaptersByHeadings'\r\n\r\n/**\r\n *\r\n * @param {Object} [options]\r\n * @param {String|HTMLElement} [options.articleElement]\r\n * @param {String} [options.selector]\r\n * @param {Boolean} [options.showCode]\r\n * @param {Function} [options.chapterTextFilter]\r\n * @param {Boolean} [options.isTreeStructured]\r\n * @returns {Array}\r\n */\r\nconst getChapters = (options) => {\r\n const {\r\n articleElement,\r\n selector,\r\n showCode,\r\n chapterTextFilter,\r\n isTreeStructured\r\n } = options\r\n let $article = document.querySelector('#article')\r\n let $headings = []\r\n let chapters = []\r\n let filter = null\r\n\r\n if (isString(articleElement)) {\r\n $article = document.querySelector(articleElement)\r\n } else if (isElement(articleElement)) {\r\n $article = articleElement\r\n }\r\n\r\n if (!$article) {\r\n return chapters\r\n }\r\n\r\n if (isFunction(chapterTextFilter)) {\r\n filter = chapterTextFilter\r\n } else {\r\n if (chapterTextFilter === true) {\r\n filter = (text) => {\r\n return text.replace(/\\(.*?\\)/, '()')\r\n }\r\n }\r\n }\r\n\r\n $headings = [...$article.querySelectorAll(selector || 'h1,h2,h3,h4,h5,h6')]\r\n chapters = getChaptersByHeadings($headings, showCode, filter)\r\n\r\n return isTreeStructured === true ? toTree(chapters, 'id', 'pid') : chapters\r\n}\r\n\r\nexport default getChapters\r\n","const toTree = (list, nodeKey, parentKey) => {\r\n const map = {}\r\n const roots = []\r\n\r\n list.forEach((item, i) => {\r\n // initialize the map\r\n map[item[nodeKey]] = i\r\n // initialize the children\r\n item.children = []\r\n })\r\n\r\n list.forEach((item) => {\r\n const node = list[map[item[parentKey]]]\r\n\r\n if (item[parentKey] !== -1) {\r\n // if you have dangling branches check that map[node.parentId] exists\r\n node.children.push(item)\r\n } else {\r\n roots.push(item)\r\n }\r\n })\r\n\r\n return roots\r\n}\r\n\r\nexport default toTree\r\n","/**\r\n * 检测对象自身属性中是否具有指定的属性。\r\n * ========================================================================\r\n * @method hasOwn\r\n * @param {Object} obj - (必须)检测的目标对象\r\n * @param {String} prop - (必须)属性名\r\n * @returns {Boolean}\r\n */\r\nconst hasOwn = (obj, prop) => {\r\n const hasOwnProperty = Object.prototype.hasOwnProperty\r\n return obj && hasOwnProperty.call(obj, prop)\r\n}\r\n\r\nexport default hasOwn\r\n","import hasOwn from './hasOwn'\r\n\r\n/**\r\n * 扩展对象\r\n * ========================================================================\r\n * @method extend\r\n * @param {Object} origin\r\n * @param {Object} source\r\n */\r\nconst extend = (origin, source) => {\r\n const keys = Object.keys(source)\r\n\r\n keys.forEach((prop) => {\r\n if (hasOwn(source, prop)) {\r\n origin[prop] = source[prop]\r\n }\r\n })\r\n}\r\n\r\nexport default extend\r\n","/**\r\n * 存储订阅者(主题和处理器的)私有对象\r\n * ========================================================================\r\n * @type {{}}\r\n * @private\r\n */\r\nconst _subscribers = {}\r\n\r\nexport default _subscribers\r\n","import _subscribers from './_subscribers'\r\nimport hasOwn from '../lang/hasOwn'\r\n\r\n/**\r\n * 判断是否存在与给定 topic 完全匹配的订阅者信息\r\n * ========================================================================\r\n * @method _hasDirectSubscribersFor\r\n * @param {String} topic - (必须)订阅主题字符串\r\n * @returns {Boolean}\r\n */\r\nconst _hasDirectSubscribersFor = (topic) => {\r\n return hasOwn(_subscribers, topic) && _subscribers[topic].length > 0\r\n}\r\n\r\nexport default _hasDirectSubscribersFor\r\n","import _hasDirectSubscribersFor from './_hasDirectSubscribersFor'\r\nimport _hasSubscribers from './_hasSubscribers'\r\n\r\n/**\r\n * 判断是否存在包含 topic 指定的订阅者信息\r\n * ========================================================================\r\n * @method has\r\n * @param {String} topic - (必须)主题名称\r\n * @param {Boolean} [isDirect] - (可选)是否为直接的主题,默认值:true\r\n * @returns {Boolean}\r\n */\r\nconst has = (topic, isDirect = true) => {\r\n return isDirect ? _hasDirectSubscribersFor(topic) : _hasSubscribers(topic)\r\n}\r\n\r\nexport default has\r\n","import _hasDirectSubscribersFor from './_hasDirectSubscribersFor'\r\n\r\n/**\r\n * 判断是否存在包含给定 topic 相关的订阅者信息\r\n * ========================================================================\r\n * @method _hasSubscribers\r\n * @param {String} topic - (必须)订阅主题字符串\r\n * @returns {Boolean}\r\n */\r\nconst _hasSubscribers = (topic) => {\r\n let found = _hasDirectSubscribersFor(topic)\r\n let position = topic.lastIndexOf('.')\r\n\r\n while (!found && position !== -1) {\r\n topic = topic.substring(0, position)\r\n position = topic.lastIndexOf('.')\r\n found = _hasDirectSubscribersFor(topic)\r\n }\r\n\r\n return found\r\n}\r\n\r\nexport default _hasSubscribers\r\n","import isTypedArray from '../types/isTypedArray'\r\nimport _subscribers from './_subscribers'\r\nimport has from './has'\r\nimport _hasDirectSubscribersFor from './_hasDirectSubscribersFor'\r\n\r\n/**\r\n * (异步)发布订阅主题信息\r\n * ========================================================================\r\n * 主题默认是异步发布的。确保在消费者处理主题时,主题的发起者不会被阻止。\r\n * ========================================================================\r\n * @method emit\r\n * @param {String} topic - (必须)主题名称\r\n * @param {Object} [data] - (可选)数据对象\r\n * @param {Boolean} [async] - (可选) 是否异步发布\r\n */\r\nconst emit = (topic, data, async = true) => {\r\n const execute = (topic) => {\r\n if (!_hasDirectSubscribersFor(topic)) {\r\n return false\r\n }\r\n\r\n _subscribers[topic].forEach((subscriber) => {\r\n // 针对 mqtt 消息服务返回的 Uint8Array 类似的 typed arrays 格式的数据\r\n // 采用 toString() 方法转化为普通(JSON)字符串\r\n const message = isTypedArray(data) ? data.toString() : data\r\n\r\n subscriber.callback.call(subscriber.context || subscriber, message)\r\n })\r\n }\r\n const deliver = () => {\r\n let subscriber = topic\r\n let position = topic.lastIndexOf('.')\r\n\r\n while (position !== -1) {\r\n subscriber = subscriber.substring(0, position)\r\n position = subscriber.lastIndexOf('.')\r\n\r\n execute(subscriber)\r\n }\r\n\r\n // 执行 topic 对应的处理器\r\n execute(topic)\r\n // 执行特殊 topic:'*'(监听全部消息的发布)\r\n execute('*')\r\n }\r\n\r\n if (!has(topic)) {\r\n return false\r\n }\r\n\r\n if (async) {\r\n setTimeout(deliver, 10)\r\n } else {\r\n deliver()\r\n }\r\n}\r\n\r\nexport default emit\r\n","import toString from '../lang/toString'\r\n/**\r\n * 判断检测数据是否为 Typed Arrays 类型的数据\r\n * ========================================================================\r\n * @param {*} val\r\n * @returns {boolean}\r\n */\r\nconst isTypedArray = (val) => {\r\n const TYPES = [\r\n '[object Int8Array]',\r\n '[object Uint8Array]',\r\n '[object Uint8ClampedArray]',\r\n '[object Int16Array]',\r\n '[object Uint16Array]',\r\n '[object Int32Array]',\r\n '[object Uint32Array]',\r\n '[object Float32Array]',\r\n '[object Float64Array]',\r\n '[object BigInt64Array]',\r\n '[object BigUint64Array]'\r\n ]\r\n\r\n return TYPES.indexOf(toString(val)) > -1\r\n}\r\n\r\nexport default isTypedArray\r\n","/**\r\n * 生成唯一 id 字符串的函数\r\n * ========================================================================\r\n * @method guid\r\n * @param {String} [prefix] - 生成 id 的前缀字符串\r\n * @return {String} 返回一个表示唯一 id 的字符串\r\n */\r\nconst guid = (() => {\r\n let uuid = 0\r\n\r\n return (prefix) => {\r\n uuid += 1\r\n\r\n return prefix ? prefix + '-' + uuid : 'guid-' + uuid\r\n }\r\n})()\r\n\r\nexport default guid\r\n","import _subscribers from './_subscribers'\r\nimport hasOwn from '../lang/hasOwn'\r\n\r\n/**\r\n * 删除与给定 topic 相同的订阅者信息\r\n * ========================================================================\r\n * @method _removeSubscriber\r\n * @param {String} topic - (必须)订阅主题字符串\r\n * @returns {Boolean}\r\n */\r\nconst _removeSubscriber = (topic) => {\r\n if (!hasOwn(_subscribers, topic)) {\r\n return false\r\n }\r\n\r\n delete _subscribers[topic]\r\n}\r\n\r\nexport default _removeSubscriber\r\n","import has from './has'\r\nimport _removeSubscriber from './_removeSubscriber'\r\nimport _removeSubscriberByToken from './_removeSubscriberByToken'\r\n\r\n/**\r\n * 取消订阅主题\r\n * ========================================================================\r\n * @method off\r\n * @param {String} topic - (必须)订阅的主题\r\n * @param {Function|String} [token] - (可选)订阅主题的处理器函数或者唯一 Id 值\r\n */\r\nconst off = (topic, token) => {\r\n if (!has(topic)) {\r\n return false\r\n }\r\n\r\n if (token) {\r\n _removeSubscriberByToken(token)\r\n } else {\r\n _removeSubscriber(topic)\r\n }\r\n}\r\n\r\nexport default off\r\n","import _subscribers from './_subscribers'\r\nimport _removeSubscriber from './_removeSubscriber'\r\n\r\n/**\r\n * 通过订阅者 token 值删除订阅者信息\r\n * ========================================================================\r\n * @method _removeSubscriberByToken\r\n * @param {String} token - 订阅者 token 字符串\r\n * @returns {boolean}\r\n * @private\r\n */\r\nconst _removeSubscriberByToken = (token) => {\r\n const keys = Object.keys(_subscribers)\r\n let index = -1\r\n\r\n if (!token || keys.length < 1) {\r\n return false\r\n }\r\n\r\n keys.forEach((subject) => {\r\n const subscriber = _subscribers[subject]\r\n let topic\r\n\r\n subscriber.forEach((execution, j) => {\r\n if (execution.callback === token || execution.token === token) {\r\n topic = execution.topic\r\n subscriber.splice(index, j)\r\n }\r\n })\r\n\r\n /* istanbul ignore else */\r\n if (subscriber.length < 1) {\r\n _removeSubscriber(topic)\r\n }\r\n })\r\n}\r\n\r\nexport default _removeSubscriberByToken\r\n","import isString from './utils/types/isString'\r\nimport hasOwn from './utils/lang/hasOwn'\r\nimport isObject from './utils/types/isObject'\r\nimport extend from './utils/lang/extend'\r\nimport publish from './utils/observer/emit'\r\nimport subscribe from './utils/observer/on'\r\nimport unsubscribe from './utils/observer/off'\r\n\r\nclass Base {\r\n constructor(options) {\r\n this.attrs = {}\r\n\r\n if (options) {\r\n this.initialize(options)\r\n }\r\n }\r\n\r\n initialize(options) {\r\n this.attr(options).render().addListeners()\r\n return this\r\n }\r\n\r\n attr(prop, value) {\r\n const attrs = this.attrs\r\n\r\n if (isString(prop)) {\r\n // 只能扩展 attrs 中已有的属性\r\n if (value && hasOwn(attrs, prop)) {\r\n // 更新单个配置信息\r\n attrs[prop] = value\r\n return this\r\n }\r\n\r\n // 只传递 prop 参数,则返回对应的属性值\r\n return attrs[prop]\r\n } else if (isObject(prop)) {\r\n // 批量更新配置信息\r\n extend(attrs, prop)\r\n\r\n return this\r\n } else if (arguments.length === 0) {\r\n // 不传递参数,直接返回整个\r\n return attrs\r\n }\r\n\r\n return this\r\n }\r\n\r\n render() {\r\n return this\r\n }\r\n\r\n refresh() {\r\n return this\r\n }\r\n\r\n destroy() {\r\n this.removeListeners()\r\n return this\r\n }\r\n\r\n reload(options) {\r\n let attrs = this.attr()\r\n\r\n if (options) {\r\n attrs = this.attr(options)\r\n }\r\n\r\n this.destroy().initialize(attrs)\r\n\r\n return this\r\n }\r\n\r\n $emit(event, data) {\r\n publish(event, data)\r\n return this\r\n }\r\n\r\n $on(event, callback) {\r\n subscribe(event, callback, this)\r\n return this\r\n }\r\n\r\n $off(event, callback) {\r\n unsubscribe(event, callback)\r\n return this\r\n }\r\n\r\n addListeners() {\r\n return this\r\n }\r\n\r\n removeListeners() {\r\n return this\r\n }\r\n}\r\n\r\nexport default Base\r\n","import _subscribers from './_subscribers'\r\nimport isFunction from '../types/isFunction'\r\nimport guid from '../lang/guid'\r\n\r\n/**\r\n * 订阅主题,并给出处理器函数\r\n * ========================================================================\r\n * @method on\r\n * @param {String} topic - (必须)主题名称\r\n * @param {Function} handler - (必须)主题的处理器函数\r\n * @param {Object} [context] - (可选)指定 this 执行上下文\r\n * @return {String} - 唯一的 token 字符串,例如:'guid-1'。\r\n */\r\nconst on = (topic, handler, context = null) => {\r\n const token = guid()\r\n let subject = typeof topic === 'symbol' ? topic.toString() : topic\r\n\r\n if (!isFunction(handler)) {\r\n return ''\r\n }\r\n\r\n /* istanbul ignore else */\r\n if (!_subscribers[subject]) {\r\n _subscribers[subject] = []\r\n }\r\n\r\n _subscribers[subject].push({\r\n topic: subject,\r\n callback: handler,\r\n context,\r\n token\r\n })\r\n\r\n return token\r\n}\r\n\r\nexport default on\r\n","/**\r\n * timeSlice.js 时间切片功能函数\r\n * ====================================================\r\n * Created By: Yaohaixiao\r\n * Update: 2023.09.04\r\n */\r\nimport isFunction from '../types/isFunction'\r\nimport later from './later'\r\n\r\nconst queue = []\r\nlet isHandling\r\nlet done\r\n\r\n// Shim from https://developers.google.com/web/updates/2015/08/using-requestidlecallback\r\nif (typeof window.requestIdleCallback === 'undefined') {\r\n window.requestIdleCallback = function (cb) {\r\n const start = Date.now()\r\n return later(function () {\r\n cb({\r\n didTimeout: false,\r\n timeRemaining: function () {\r\n return Math.max(0, 50 - (Date.now() - start))\r\n }\r\n })\r\n }, 10)\r\n }\r\n\r\n window.cancelIdleCallback = function (id) {\r\n clearTimeout(id)\r\n }\r\n}\r\n\r\nfunction runIdle(idleDeadline) {\r\n while (idleDeadline.timeRemaining() > 0 && queue.length) {\r\n const fn = queue.shift()\r\n\r\n if (!isFunction(fn)) {\r\n return false\r\n }\r\n\r\n fn()\r\n }\r\n\r\n if (queue.length) {\r\n isHandling = requestIdleCallback(runIdle)\r\n } else {\r\n isHandling = 0\r\n\r\n if (isFunction(done)) {\r\n done()\r\n done = null\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * 时间切片功能函数:主要用于优化长时任务的性能,将长时任务分解成\r\n * 多个短时间任务\r\n * ====================================================\r\n * @param {Function} fn - 需要在空闲时执行的回调函数\r\n * @param {Function} afterComplete - queen 的\r\n * @return {(function(): (boolean|undefined))|*|boolean}\r\n */\r\nconst timeSlice = (fn, afterComplete = null) => {\r\n queue.push(fn)\r\n\r\n if (isFunction(afterComplete)) {\r\n done = afterComplete\r\n }\r\n\r\n if (!isHandling) {\r\n requestIdleCallback(runIdle)\r\n }\r\n}\r\n\r\nexport default timeSlice\r\n","/**\r\n * 获取 DOM 节点相对于窗口的 left (纵坐标)值\r\n * ========================================================================\r\n * @method offsetTop\r\n * @param {HTMLElement} el - DOM 节点\r\n * @returns {Number}\r\n */\r\nconst offsetTop = (el) => {\r\n let top = el.offsetTop\r\n\r\n if (el.offsetParent !== null) {\r\n top += offsetTop(el.offsetParent)\r\n }\r\n\r\n return top\r\n}\r\n\r\nexport default offsetTop\r\n","/**\r\n * 获取 options 节点下匹配 selector 选择器的 DOM 节点\r\n * ========================================================================\r\n * Element.matches() 方法可以用来判断 DOM 元素是否与给定的选择器匹配,事件代理判断是\r\n * 否触发绑定的代理事件回调函数,关键就是使用 Element.matches() 辨别当前事件触发的目\r\n * 标 DOM 元素是否为事件代理所期望触发的目标。\r\n * ========================================================================\r\n * @method matches\r\n * @see https://developer.mozilla.org/en-US/docs/web/api/element/matches\r\n * @param {HTMLElement} el - (必须)DOM 元素\r\n * @param {String} selector - (必须)匹配 DOM 元素的选择器\r\n * @returns {Boolean}\r\n */\r\nconst matches = (el, selector = '') => {\r\n const sel = selector.replace(/^>/i, '')\r\n\r\n if (!selector || !sel || !el) {\r\n return false\r\n }\r\n\r\n /* istanbul ignore else */\r\n if (el.matches) {\r\n return el.matches(sel)\r\n } else if (el.msMatchesSelector) {\r\n return el.msMatchesSelector(sel)\r\n } else {\r\n return false\r\n }\r\n}\r\n\r\nexport default matches\r\n","/**\r\n * 获取 DOM 元素的父节点\r\n * ========================================================================\r\n * @method getParentOrHost\r\n * @param {*|HTMLElement} el - (必须)要获取父节点的 DOM 元素\r\n * @returns {*|HTMLElement}\r\n */\r\nconst getParentOrHost = (el) => {\r\n return el.host && el !== document && el.host.nodeType\r\n ? el.host\r\n : el.parentNode\r\n}\r\n\r\nexport default getParentOrHost\r\n","export const CAPTURE_EVENTS = [\r\n 'focusout',\r\n 'blur',\r\n 'focusin',\r\n 'focus',\r\n 'load',\r\n 'unload',\r\n 'mouseenter',\r\n 'mouseleave'\r\n]\r\n","import { CAPTURE_EVENTS } from './enum'\r\nimport _delete from './_delete'\r\n\r\n/**\r\n * (私有方法)取消 type 类型的代理事件绑定\r\n * ========================================================================\r\n * 如果没有设置 handler,则销毁 this.$options 绑定的所有符合 type 事件类型的事件绑定\r\n * ========================================================================\r\n * @method _off\r\n * @param {HTMLElement} el - (必须)取消事件绑定的 DOM 元素\r\n * @param {String} type - (必须)事件类型\r\n * @param {Function} fn - (必须)事件处理器回调函数\r\n * @private\r\n */\r\nconst _off = (el, type, fn) => {\r\n const capture = CAPTURE_EVENTS.indexOf(type) > -1\r\n\r\n /* istanbul ignore else */\r\n if (fn._delegateListener) {\r\n fn = fn._delegateListener\r\n delete fn._delegateListener\r\n }\r\n\r\n // 移除缓存的 _listeners 数据\r\n _delete(el, type, fn)\r\n\r\n el.removeEventListener(type, fn, capture)\r\n}\r\n\r\nexport default _off\r\n","/**\r\n * 删除 DOM 元素缓存的 _listeners 数据\r\n * ========================================================================\r\n * @method _delete\r\n * @param {HTMLElement} el - 要删除 listener 的 DOM 元素\r\n * @param {String} type - 事件类型(名称)\r\n * @param {Function} [fn] - 事件处理器回调函数\r\n */\r\nconst _delete = function (el, type, fn) {\r\n const listeners = el._listeners\r\n let index = -1\r\n\r\n if (listeners.length < 1) {\r\n return false\r\n }\r\n\r\n // 移除缓存的 _listeners 数据\r\n listeners.forEach((listener, i) => {\r\n const handler = listener.fn\r\n\r\n if (type === listener.type) {\r\n index = i\r\n\r\n if (handler === fn) {\r\n index = i\r\n }\r\n }\r\n })\r\n\r\n /* istanbul ignore else */\r\n if (index > -1) {\r\n listeners.splice(index, 1)\r\n }\r\n}\r\n\r\nexport default _delete\r\n","import isString from '../types/isString'\r\nimport isElement from '../types/isElement'\r\nimport getListeners from './getListeners'\r\nimport _off from './_off'\r\n\r\n/**\r\n * 销毁(type 类型的)代理事件绑定\r\n * ========================================================================\r\n * 1. 设置了事件类型 type,则销毁指定类型的事件绑定,否则清除所有代理事件绑定\r\n * 2. recurse 设置为 true,递归销毁子节点全部事件绑定\r\n * ========================================================================\r\n * @method purgeElement\r\n * @param {HTMLElement|String} el - (必须)DOM 元素或者其选择器\r\n * @param {String|Boolean} type - (必须)事件类型\r\n * @param {Boolean} [recurse] - (可选)是否递归销毁子节点所有事件绑定\r\n */\r\nconst purgeElement = function (el, type, recurse = false) {\r\n const $element = isString(el) ? document.querySelector(el) : el\r\n const $children = $element.childNodes\r\n const listeners = getListeners($element, type)\r\n\r\n listeners.forEach((listener) => {\r\n _off($element, listener.type, listener.fn)\r\n })\r\n\r\n if (\r\n (recurse || type === true || arguments.length === 1) &&\r\n $element &&\r\n $children\r\n ) {\r\n $children.forEach(($child) => {\r\n if (isElement($child)) {\r\n purgeElement($child, type, recurse)\r\n }\r\n })\r\n }\r\n}\r\n\r\nexport default purgeElement\r\n","import isString from '../types/isString'\r\n\r\n/**\r\n * 获取 DOM 元素(type 事件类型)事件绑定信息\r\n * ========================================================================\r\n * 如果设置了事件类型 type, 则返回指定类型的事件绑定信息,否则返回所有事件绑定信息\r\n * ========================================================================\r\n * @methods getListeners\r\n * @param {HTMLElement} el - (必须)要获取事件绑定信息的 DOM 元素\r\n * @param {String} [type] - (可选)事件类型\r\n * @returns {Array} - 已绑定的事件信息\r\n */\r\nconst getListeners = (el, type) => {\r\n let listeners = el._listeners || []\r\n\r\n if (isString(type) && type) {\r\n listeners = listeners.filter((listener) => {\r\n return listener.type === type\r\n })\r\n }\r\n\r\n return listeners\r\n}\r\n\r\nexport default getListeners\r\n","import purgeElement from './purgeElement'\r\nimport isFunction from '../types/isFunction'\r\nimport _off from './_off'\r\n\r\n/**\r\n * 取消 type 类型的代理事件绑定\r\n * ========================================================================\r\n * 如果没有设置 handler,则销毁 this.$options 绑定的所有符合 type 事件类型的事件绑定\r\n * ========================================================================\r\n * @method off\r\n * @param {HTMLElement|Object} el - (必须)取消事件绑定的 DOM 元素\r\n * @param {String} type - (必须)事件类型\r\n * @param {Function} [fn] - (可选)事件处理器回调函数\r\n */\r\nconst off = (el, type, fn) => {\r\n // 如果不设置 fn 参数,默认清除 el 元素上绑定的所有事件处理器\r\n if (!isFunction(fn)) {\r\n purgeElement(el, type)\r\n return false\r\n }\r\n\r\n _off(el, type, fn)\r\n}\r\n\r\nexport default off\r\n","import closest from '../dom/closest'\r\nimport off from './off'\r\nimport getTarget from './getTarget'\r\n\r\nimport { CAPTURE_EVENTS } from './enum'\r\n\r\n/**\r\n * 绑定代理事件\r\n * ========================================================================\r\n * @method on\r\n * @param {HTMLElement|String|Object} el - (必须)绑定代理事件的 DOM 节点\r\n * @param {String} selector - (必须)事件代理目标 DOM 元素的选择器\r\n * @param {String|Function} type - (必须)事件类型或者事件处理器回调函数\r\n * @param {Function|Object} fn - (可选) 事件处理器回调函数或者传递给事件处理器回调函数的数据对象\r\n * @param {Object|Boolean} [data] - (可选)传递给事件处理器回调函数的数据对象或者事件处理器回调函数的 this 上下文指向,\r\n * @param {Object|Boolean} [context] - (可选)事件处理器回调函数的 this 上下文指向,或者是否仅触发一次\r\n * 当设置为 true 时,则事件处理器回调函数的 this 上下文指向为 data 对象\r\n * @param {Boolean} once - (可选)是否仅触发一次\r\n */\r\nconst on = (el, selector, type, fn, data, context, once = false) => {\r\n // CAPTURE_EVENTS 中的特殊事件,采用事件捕获模型\r\n const capture = CAPTURE_EVENTS.indexOf(type) > -1\r\n\r\n const listener = function (evt) {\r\n const target = getTarget(evt)\r\n // 通过 Element.matches 方法获得点击的目标元素\r\n const delegateTarget = closest(target, selector, el)\r\n let overrideContext = context || el\r\n\r\n evt.delegateTarget = delegateTarget\r\n\r\n // 当设置为 true 时,则事件处理器回调函数的\r\n // this 上下文指向为 data 对象\r\n if (context === true) {\r\n overrideContext = data\r\n }\r\n\r\n /* istanbul ignore else */\r\n if (delegateTarget) {\r\n // 仅触发一次\r\n /* istanbul ignore else */\r\n if (once === true) {\r\n off(el, type, listener)\r\n }\r\n\r\n fn.call(overrideContext, evt, data)\r\n }\r\n }\r\n\r\n if (!el) {\r\n return false\r\n }\r\n\r\n if (!el._listeners) {\r\n el._listeners = []\r\n }\r\n\r\n // 缓存 options 元素绑定的事件处理器\r\n el._listeners.push({\r\n el,\r\n selector,\r\n type,\r\n fn: listener,\r\n data,\r\n context,\r\n capture\r\n })\r\n\r\n // 缓存包装后的事件处理器\r\n fn._delegateListener = listener\r\n\r\n el.addEventListener(type, listener, capture)\r\n}\r\n\r\nexport default on\r\n","import resolveTextNode from '../dom/resolveTextNode'\r\n\r\n/**\r\n * 返回触发事件的 target DOM 元素\r\n * ========================================================================\r\n * @method getTarget\r\n * @param {Event} evt - Event 对象\r\n * @return {HTMLElement} - Event 对象的 target DOM 元素\r\n */\r\nconst getTarget = function (evt) {\r\n const target = evt.target\r\n\r\n return resolveTextNode(target)\r\n}\r\n\r\nexport default getTarget\r\n","/**\r\n * 在某些情况下,某些浏览器(例如:Safari 浏览器)会返回实际的目标元素内部的文本节点。\r\n * resolveTextNode() 方法则会返回实际的目标节点。\r\n * ========================================================================\r\n * @method resolveTextNode\r\n * @param {HTMLElement|Text} el - 要解析的节点\r\n * @return {*|HTMLElement} - 实际的目标 DOM 节点\r\n */\r\nconst resolveTextNode = function (el) {\r\n if (el && el.nodeType === 3) {\r\n return el.parentNode\r\n }\r\n\r\n return el\r\n}\r\n\r\nexport default resolveTextNode\r\n","import matches from './matches'\r\nimport getParentOrHost from './getParentOrHost'\r\n\r\n/**\r\n * 获取 options 元素父元素最近的包含 selector 选择器的元素\r\n * ========================================================================\r\n * @method closest\r\n * @param {HTMLElement} el - (必须)DOM 元素\r\n * @param {String} selector - (必须)DOM 元素的选择其\r\n * @param {HTMLElement} [ctx] - (必须)比对的 DOM 元素\r\n * @param {Boolean} [includeCTX] - (必须)是否包含 context DOM 元素\r\n * @returns {null|HTMLElement} - 返回最接近的 DOM 元素\r\n */\r\nconst closest = (el, selector, ctx, includeCTX) => {\r\n const context = ctx || document\r\n\r\n if (!el) {\r\n return null\r\n }\r\n\r\n do {\r\n /* istanbul ignore else */\r\n if (\r\n (selector != null &&\r\n (selector.startsWith('>')\r\n ? el.parentNode === context && matches(el, selector)\r\n : matches(el, selector))) ||\r\n (includeCTX && el === context)\r\n ) {\r\n return el\r\n }\r\n\r\n /* istanbul ignore else */\r\n if (el === context) {\r\n break\r\n }\r\n\r\n /* jshint boss:true */\r\n } while ((el = getParentOrHost(el)))\r\n}\r\n\r\nexport default closest\r\n","/**\r\n * 停止事件(阻止默认行为和阻止事件的捕获或冒泡)\r\n * ========================================================================\r\n * @method stop\r\n * @param {Event} evt - 事件对象\r\n *\r\n * @example\r\n *
\r\n * Service\r\n * Help\r\n *
\r\n *\r\n * const $nav = document.querySelector('#nav')\r\n * const $service = document.querySelector('.anchor')\r\n *\r\n * on($nav, 'click', function(evt) {\r\n * console.log('你点击了导航栏')\r\n * })\r\n *\r\n * on($anchor, 'click', function(evt) {\r\n * console.log('tagName', this.tagName)\r\n *\r\n * // 工作台输出:'a'\r\n * // 不会触发事件冒泡,输出:'你点击了导航栏'\r\n * // 也不会切换到 href 属性的页面,阻止了点击链接的默认行为\r\n * stopEvent(evt)\r\n * })\r\n */\r\nconst stop = function (evt) {\r\n evt.stopPropagation()\r\n evt.preventDefault()\r\n}\r\n\r\nexport default stop\r\n","import DEFAULTS from './defaults'\r\n\r\nconst SYMBOLS = [...DEFAULTS]\r\n\r\nexport default SYMBOLS\r\n","const DEFAULTS = [\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n ''\r\n]\r\n\r\nexport default DEFAULTS\r\n","import isString from '../types/isString'\r\nimport getSymbol from './getSymbol'\r\nimport SYMBOLS from './symbols'\r\n\r\n/**\r\n *\r\n * @method getSymbols\r\n * @param {String} [name]\r\n * @param {String} [iconSet]\r\n * @returns {string[]|*}\r\n */\r\nconst getSymbols = (name, iconSet = 'icon') => {\r\n if (isString(name)) {\r\n return getSymbol(name, iconSet)\r\n }\r\n\r\n return [...SYMBOLS]\r\n}\r\n\r\nexport default getSymbols\r\n","import SYMBOLS from './symbols'\r\n\r\n/**\r\n * @method getSymbol\r\n * @param {String} name\r\n * @param {String} [iconSet]\r\n * @returns {String}\r\n */\r\nconst getSymbol = (name, iconSet = 'icon') => {\r\n const patternName = /id=\"(.*?)\"/\r\n const patternSet = /^(\\w+)-/\r\n const symbols = SYMBOLS\r\n\r\n return symbols.find((symbol) => {\r\n const names = patternName.exec(symbol)\r\n const fullName = names[1]\r\n const sets = patternSet.exec(fullName)\r\n const setName = sets[1]\r\n const iconName =\r\n iconSet === 'icon' ? `${iconSet}-${name}` : `${iconSet}-icon-${name}`\r\n\r\n return setName === iconSet && fullName === iconName\r\n })\r\n}\r\n\r\nexport default getSymbol\r\n","import add from './add'\r\nimport getSymbols from './getSymbols'\r\n\r\n/**\r\n * 绘制 SVG 图标集\r\n * ========================================================================\r\n * @method paint\r\n * @param {String|Array} symbol\r\n */\r\nconst paint = (symbol = '') => {\r\n const $body = document.body\r\n let $icons = document.querySelector('#outline-icons')\r\n let symbols = []\r\n\r\n add(symbol)\r\n symbols = getSymbols()\r\n\r\n if ($icons) {\r\n $icons.innerHTML = symbols.join('')\r\n } else {\r\n $icons = document.createElement('div')\r\n $icons.innerHTML =\r\n ``\r\n $body.insertBefore($icons.firstChild, $body.firstChild)\r\n }\r\n}\r\n\r\nexport default paint\r\n","import isArray from '../types/isArray'\r\nimport isString from '../types/isString'\r\nimport SYMBOLS from './symbols'\r\n\r\n/**\r\n * @method add\r\n * @param {Array|String} symbols\r\n * @return {Boolean}\r\n */\r\nconst add = (symbols) => {\r\n if (!symbols) {\r\n return false\r\n }\r\n\r\n if (isArray(symbols) && symbols.length > 0) {\r\n symbols.forEach((symbol) => {\r\n /* istanbul ignore else */\r\n if (SYMBOLS.indexOf(symbol) === -1 && isString(symbol)) {\r\n SYMBOLS.push(symbol)\r\n }\r\n })\r\n } else {\r\n /* istanbul ignore else */\r\n if (isString(symbols)) {\r\n SYMBOLS.push(symbols)\r\n }\r\n }\r\n}\r\n\r\nexport default add\r\n","import isObject from './isObject'\r\nimport isElement from './isElement'\r\nimport isHTMLCollection from './isHTMLCollection'\r\nimport isFragment from './isFragment'\r\nimport isTextNode from './isTextNode'\r\n\r\nconst isDOM = (el) => {\r\n return !!(\r\n isObject(el) &&\r\n (isElement(el) || isHTMLCollection(el) || isFragment(el) || isTextNode(el))\r\n )\r\n}\r\n\r\nexport default isDOM\r\n","import toString from '../lang/toString'\r\nimport isObject from './isObject'\r\n\r\nconst isHTMLCollection = (el) => {\r\n return !!(isObject(el) && toString(el) === '[object NodeList]')\r\n}\r\n\r\nexport default isHTMLCollection\r\n","import toString from '../lang/toString'\r\nimport isObject from './isObject'\r\n\r\nconst isFragment = (fragment) => {\r\n return !!(\r\n isObject(fragment) && toString(fragment) === '[object DocumentFragment]'\r\n )\r\n}\r\n\r\nexport default isFragment\r\n","import toString from '../lang/toString'\r\nimport isObject from './isObject'\r\n\r\nconst isTextNode = (el) => {\r\n return !!(\r\n isObject(el) &&\r\n (toString(el) === '[object Text]' || (el.tagName && el.nodeType === 3))\r\n )\r\n}\r\n\r\nexport default isTextNode\r\n","import addClass from './addClass.js'\r\n\r\n/**\r\n * 给 DOM 节点设置属性/值\r\n * ========================================================================\r\n * @method setAttribute\r\n * @param {HTMLElement} el - DOM 节点\r\n * @param {String} attr - 属性名称\r\n * @param {String|Number|Boolean} value - 属性值\r\n */\r\nconst setAttribute = (el, attr, value) => {\r\n let tagName = el.tagName.toLowerCase()\r\n\r\n switch (attr) {\r\n case 'style':\r\n el.style.cssText = value\r\n break\r\n case 'value':\r\n if (tagName === 'input' || tagName === 'textarea') {\r\n el.value = value\r\n } else {\r\n el.setAttribute(attr, value)\r\n }\r\n break\r\n case 'htmlFor':\r\n el.setAttribute('for', value)\r\n break\r\n case 'className':\r\n addClass(el, value)\r\n break\r\n case 'innerHTML':\r\n el.innerHTML = value\r\n break\r\n case 'innerText':\r\n el.innerText = value\r\n break\r\n default:\r\n el.setAttribute(attr, value)\r\n break\r\n }\r\n}\r\n\r\nexport default setAttribute\r\n","import isObject from '../types/isObject'\r\nimport hasOwn from '../lang/hasOwn'\r\nimport setAttribute from './setAttribute'\r\n\r\nconst setAttributes = (el, attrs) => {\r\n if (!el || !isObject(attrs)) {\r\n return false\r\n }\r\n\r\n Object.keys(attrs).forEach((attr) => {\r\n const value = attrs[attr]\r\n if (hasOwn(attrs, attr)) {\r\n setAttribute(el, attr, value)\r\n }\r\n })\r\n}\r\n\r\nexport default setAttributes\r\n","import isObject from '../types/isObject'\r\nimport isString from '../types/isString'\r\nimport isArray from '../types/isArray'\r\nimport isDOM from '../types/isDOM'\r\nimport setAttributes from './setAttributes'\r\n\r\n/**\r\n * 创建 DOM 节点,并添加属性和子节点\r\n * ========================================================================\r\n * @method createElement\r\n * @param {String} tagName - 标签名称\r\n * @param {Object|Array|HTMLElement|DocumentFragment|String} attrs - 属性对象或者子节点\r\n * @param {Array|HTMLElement|DocumentFragment|String} [children] - 子节点数组\r\n * @returns {HTMLElement}\r\n */\r\nconst createElement = (tagName, attrs, children) => {\r\n const $fragment = document.createDocumentFragment()\r\n const $el = document.createElement(tagName)\r\n const isValidChild = (child) => {\r\n return isDOM(child) || isString(child)\r\n }\r\n const append = (child) => {\r\n let $child\r\n\r\n if (!isValidChild(child)) {\r\n return false\r\n }\r\n\r\n if (isDOM(child)) {\r\n $child = child\r\n } else if (isString(child)) {\r\n $child = document.createTextNode(child)\r\n }\r\n\r\n $fragment.appendChild($child)\r\n }\r\n\r\n if (isObject(attrs)) {\r\n setAttributes($el, attrs)\r\n } else if (isArray(attrs) && attrs.every((attr) => isValidChild(attr))) {\r\n attrs.forEach((child) => {\r\n append(child)\r\n })\r\n } else if (isDOM(attrs)) {\r\n append(attrs)\r\n } else if (isString(attrs)) {\r\n append(document.createTextNode(attrs))\r\n }\r\n\r\n if (isArray(children)) {\r\n children.forEach((child) => {\r\n append(child)\r\n })\r\n } else {\r\n append(children)\r\n }\r\n\r\n $el.appendChild($fragment)\r\n\r\n return $el\r\n}\r\n\r\nexport default createElement\r\n","import isArray from '../types/isArray'\r\nimport isString from '../types/isString'\r\nimport isSVG from '../types/isSVG'\r\nimport setAttributes from '../dom/setAttributes'\r\n\r\n/**\r\n * 创建 SVG 图标 DOM 元素\r\n * ========================================================================\r\n * @method createElement\r\n * @param {String} name\r\n * @param {Object} [options]\r\n * @param {Number|Array} [options.size]\r\n * @param {String} [options.color]\r\n * @param {String} [options.iconSet]\r\n * @param {Object} [options.attrs]\r\n * @returns {HTMLElement}\r\n */\r\nconst createElement = (name, options = {}) => {\r\n const ICON = 'outline-icon'\r\n const size = options.size || 0\r\n const color = options.color || ''\r\n const iconSet = options.iconSet || ''\r\n const width = isArray(size) ? size[0] : size\r\n const height = isArray(size) ? size[1] : size\r\n const defaultRules = size ? `width:${width}px;height:${height}px;` : ''\r\n const cssRules = color ? defaultRules + `color:${color}` : defaultRules\r\n const attrs = options.attrs || {}\r\n const $icon = document.createElement('i')\r\n let binds = ''\r\n let svg = ''\r\n let $svg\r\n\r\n if (!isString(name)) {\r\n return null\r\n }\r\n\r\n if (isSVG(name)) {\r\n svg = name\r\n } else {\r\n binds =\r\n iconSet && iconSet !== 'icon'\r\n ? `xlink:href=\"#${iconSet}-icon-${name}\"`\r\n : `xlink:href=\"#icon-${name}\"`\r\n svg = ``\r\n }\r\n\r\n $icon.innerHTML = svg\r\n\r\n if (attrs.className) {\r\n attrs.className = `${ICON} ${attrs.className}`\r\n } else {\r\n attrs.className = ICON\r\n }\r\n\r\n setAttributes($icon, attrs)\r\n\r\n $svg = $icon.querySelector('svg')\r\n setAttributes($svg, {\r\n 'aria-hidden': true,\r\n xmlns: 'http://www.w3.org/2000/svg',\r\n class: 'outline-icon__svg',\r\n width: 200,\r\n height: 200,\r\n style: cssRules\r\n })\r\n\r\n return $icon\r\n}\r\n\r\nexport default createElement\r\n","import isString from './isString'\r\n\r\nconst isSVG = (str) => {\r\n const declaration = '(?:<\\\\?xml[^>]*>\\\\s*)?'\r\n const doctype =\r\n '(?:<\\\\!doctype svg[^>]*\\\\s*(?:\\\\[?(?:\\\\s*]*>\\\\s*)*\\\\]?)*[^>]*>\\\\s*)?'\r\n const content = ']*>[^]*<\\\\/svg>\\\\s*$'\r\n const svg = `^\\\\s*${declaration}${doctype}${content}\\\\s*$`\r\n const pattern = new RegExp(svg, 'i')\r\n\r\n return isString(str) && pattern.test(str)\r\n}\r\n\r\nexport default isSVG\r\n","import createElement from './createElement'\r\n\r\n/**\r\n * 创建 SVG 图标 DOM 元素\r\n * ========================================================================\r\n * @method icon\r\n * @alias createElement\r\n * @see createElement\r\n * @param {String} name\r\n * @param {Object} [options]\r\n * @param {Number|Array} [options.size]\r\n * @param {String} [options.color]\r\n * @param {String} [options.iconSet]\r\n * @returns {HTMLElement}\r\n */\r\nconst icon = (name, options = {}) => {\r\n return createElement(name, options)\r\n}\r\n\r\nexport default icon\r\n","import trim from '../lang/trim'\r\nimport hasClass from './hasClass'\r\n\r\n/**\r\n * 移除 DOM 节点的 className 样式\r\n * ========================================================================\r\n * @method removeClass\r\n * @param {HTMLElement} el - DOM 节点\r\n * @param {String} className - 样式名称\r\n * @returns {Boolean}\r\n */\r\nconst removeClass = (el, className) => {\r\n let allClass = el.className\r\n let classList\r\n\r\n if (!allClass || !hasClass(el, className)) {\r\n return false\r\n }\r\n\r\n classList = el.classList\r\n\r\n if (classList?.remove) {\r\n classList.remove(className)\r\n } else {\r\n allClass = trim(allClass.replace(className, ''))\r\n el.className = allClass\r\n }\r\n}\r\n\r\nexport default removeClass\r\n","import removeClass from './utils/dom/removeClass'\r\nimport isEmpty from './utils/types/isEmpty'\r\nimport trim from './utils/lang/trim'\r\n\r\nconst _removeHeading = ($heading, hasAnchor = true, isAtStart = true) => {\r\n const CLS_HEADING = 'outline-heading'\r\n const text = $heading.innerHTML\r\n const pattern = /^\\d+(\\.?\\d+)*\\s?/gi\r\n let $anchor\r\n\r\n $heading.innerHTML = text.replace(pattern, '')\r\n $heading.removeAttribute('id')\r\n $heading.removeAttribute('data-id')\r\n\r\n removeClass($heading, CLS_HEADING)\r\n\r\n if (!hasAnchor) {\r\n return false\r\n }\r\n\r\n $anchor = $heading.querySelector(`.${CLS_HEADING}__anchor`)\r\n\r\n if (isAtStart) {\r\n removeClass($heading, `${CLS_HEADING}_start`)\r\n }\r\n\r\n if (isEmpty(trim($heading.className))) {\r\n $heading.removeAttribute('class')\r\n }\r\n\r\n // 存在锚点才移除\r\n if ($anchor) {\r\n $heading.removeChild($anchor)\r\n }\r\n}\r\n\r\nexport default _removeHeading\r\n","import isString from './isString'\r\n/**\r\n * 检测数据是否为空字符串\r\n * ========================================================================\r\n * @method isEmpty\r\n * @param {String} str\r\n * @returns {boolean}\r\n */\r\nconst isEmpty = (str) => {\r\n return isString(str) && str === ''\r\n}\r\n\r\nexport default isEmpty\r\n","import isString from './utils/types/isString'\r\nimport isFunction from './utils/types/isFunction'\r\nimport isElement from './utils/types/isElement'\r\nimport cloneDeep from './utils/lang/cloneDeep'\r\nimport timeSlice from './utils/lang/timeSlice'\r\nimport later from './utils/lang/later'\r\nimport scrollTo from './utils/dom/scrollTo'\r\nimport _getScrollElement from './utils/dom/_getScrollElement'\r\nimport offsetTop from './utils/dom/offsetTop'\r\nimport on from './utils/event/on'\r\nimport off from './utils/event/off'\r\nimport stop from './utils/event/stop'\r\nimport paint from './utils/icons/paint'\r\n\r\nimport _updateHeading from './_updateHeading'\r\nimport _removeHeading from './_removeHeading'\r\nimport getChapters from './getChapters'\r\n\r\nimport Base from './base'\r\n\r\nclass Anchors extends Base {\r\n constructor(options) {\r\n super()\r\n\r\n this._default()\r\n\r\n if (options) {\r\n this.initialize(options)\r\n }\r\n }\r\n\r\n _default() {\r\n this.attrs = cloneDeep(Anchors.DEFAULTS)\r\n\r\n this.$articleElement = null\r\n this.$scrollElement = null\r\n this.$headings = []\r\n\r\n return this\r\n }\r\n\r\n initialize(options) {\r\n let created\r\n let scrollElement\r\n let $articleElement\r\n let articleElement\r\n\r\n this.attr(options)\r\n\r\n articleElement = this.attr('articleElement')\r\n scrollElement = this.attr('scrollElement')\r\n created = this.attr('created')\r\n\r\n if (isString(articleElement)) {\r\n $articleElement = document.querySelector(articleElement)\r\n } else if (isElement(articleElement)) {\r\n $articleElement = articleElement\r\n }\r\n\r\n if (!$articleElement) {\r\n return this\r\n }\r\n\r\n this.$articleElement = $articleElement\r\n this.$scrollElement = _getScrollElement(scrollElement)\r\n this.$headings = this.getHeadings()\r\n\r\n if (this.$headings.length < 1) {\r\n return this\r\n }\r\n\r\n if (isFunction(created)) {\r\n created.call(this)\r\n }\r\n\r\n this.render().addListeners()\r\n\r\n return this\r\n }\r\n\r\n getHeadings() {\r\n const $articleElement = this.$articleElement\r\n const selector = this.attr('selector')\r\n\r\n return [...$articleElement.querySelectorAll(selector)]\r\n }\r\n\r\n count() {\r\n return this.getHeadings().length\r\n }\r\n\r\n render() {\r\n const articleElement = this.attr('articleElement')\r\n const selector = this.attr('selector')\r\n const showCode = this.attr('showCode')\r\n const chapterTextFilter = this.attr('chapterTextFilter')\r\n const mounted = this.attr('mounted')\r\n const chapters = getChapters({\r\n articleElement,\r\n selector,\r\n showCode,\r\n chapterTextFilter\r\n })\r\n\r\n paint()\r\n\r\n this._paint(chapters)\r\n\r\n if (isFunction(mounted)) {\r\n mounted.call(this)\r\n }\r\n\r\n return this\r\n }\r\n\r\n erase() {\r\n this._remove()\r\n\r\n return this\r\n }\r\n\r\n _paint(chapters) {\r\n const LIMIT = 400\r\n const hasAnchor = this.attr('hasAnchor')\r\n const isAtStart = this.attr('isAtStart')\r\n const showCode = this.attr('showCode')\r\n const anchorURL = this.attr('anchorURL')\r\n const anchorLinkFilter = this.attr('anchorLinkFilter')\r\n const count = this.count()\r\n const $headings = [...this.$headings]\r\n const update = (headings, group) => {\r\n headings.forEach(($heading, i) => {\r\n const id = i + group * LIMIT\r\n const chapterCode = chapters[id].code\r\n _updateHeading($heading, id, {\r\n hasAnchor,\r\n isAtStart,\r\n showCode,\r\n chapterCode,\r\n anchorURL,\r\n anchorLinkFilter\r\n })\r\n })\r\n }\r\n let groupIndex = -1\r\n\r\n // 针对超长的文章,进行 timeSlice 处理\r\n if (count > LIMIT) {\r\n groupIndex += 1\r\n // 同步绘制 Limit 以内的标题链接(可以确保 50ms 完成绘制)\r\n update($headings.splice(0, LIMIT), 0)\r\n // 采用 timeSlice 处理机制绘制剩余的标题\r\n while ($headings.length > 0) {\r\n const once = $headings.splice(0, LIMIT)\r\n timeSlice(\r\n () => {\r\n update(once, (groupIndex += 1))\r\n },\r\n () => {\r\n this.$emit('anchors:all:paint')\r\n }\r\n )\r\n }\r\n } else {\r\n update($headings, 0)\r\n }\r\n\r\n return this\r\n }\r\n\r\n _remove() {\r\n const hasAnchor = this.attr('hasAnchor')\r\n const isAtStart = this.attr('isAtStart')\r\n const $headings = this.$headings\r\n\r\n $headings.forEach(($heading) => {\r\n _removeHeading($heading, hasAnchor, isAtStart)\r\n })\r\n\r\n return this\r\n }\r\n\r\n refresh(chapters) {\r\n const articleElement = this.attr('articleElement')\r\n const selector = this.attr('selector')\r\n const showCode = this.attr('showCode')\r\n const chapterTextFilter = this.attr('chapterTextFilter')\r\n\r\n this.$headings = this.getHeadings()\r\n\r\n this.erase()._paint(\r\n chapters ||\r\n getChapters({\r\n articleElement,\r\n selector,\r\n showCode,\r\n chapterTextFilter\r\n })\r\n )\r\n\r\n return this\r\n }\r\n\r\n scrollTo(top, after) {\r\n const el = this.$scrollElement\r\n\r\n scrollTo(el, top, after)\r\n\r\n return this\r\n }\r\n\r\n destroy() {\r\n const beforeDestroy = this.attr('beforeDestroy')\r\n const afterDestroy = this.attr('afterDestroy')\r\n\r\n if (isFunction(beforeDestroy)) {\r\n beforeDestroy.call(this)\r\n }\r\n\r\n this.removeListeners()._remove()._default()\r\n\r\n if (isFunction(afterDestroy)) {\r\n afterDestroy.call(this)\r\n }\r\n\r\n return this\r\n }\r\n\r\n onAnchorTrigger(evt) {\r\n const anchorURL = this.attr('anchorURL')\r\n const afterScroll = this.attr('afterScroll')\r\n const stickyHeight = this.attr('stickyHeight')\r\n const $anchor = evt.delegateTarget\r\n const $heading = $anchor.parentNode\r\n const top = offsetTop($heading) - (stickyHeight + 10)\r\n const $scrollElement = this.$scrollElement\r\n const min = 0\r\n const max = $scrollElement.scrollHeight - $scrollElement.clientHeight\r\n const after = () => {\r\n if (isFunction(afterScroll)) {\r\n afterScroll.call(this, 'anchor')\r\n }\r\n\r\n later(() => {\r\n this.$emit('toolbar:update', {\r\n top,\r\n min,\r\n max\r\n })\r\n })\r\n }\r\n\r\n this.scrollTo(top, after)\r\n\r\n if (!anchorURL) {\r\n stop(evt)\r\n }\r\n\r\n return this\r\n }\r\n\r\n onRefresh(chapters) {\r\n this.refresh(chapters)\r\n\r\n return this\r\n }\r\n\r\n addListeners() {\r\n const $articleElement = this.$articleElement\r\n\r\n if (this.count() < 1) {\r\n return this\r\n }\r\n\r\n on(\r\n $articleElement,\r\n '.outline-heading__anchor',\r\n 'click',\r\n this.onAnchorTrigger,\r\n this,\r\n true\r\n )\r\n\r\n this.$on('anchors:refresh', this.onRefresh)\r\n\r\n return this\r\n }\r\n\r\n removeListeners() {\r\n const $articleElement = this.$articleElement\r\n\r\n if (this.count() < 1) {\r\n return this\r\n }\r\n\r\n off($articleElement, 'click', this.onAnchorTrigger)\r\n this.$off('anchors:refresh', this.onRefresh)\r\n\r\n return this\r\n }\r\n}\r\n\r\nAnchors.DEFAULTS = (() => {\r\n const OPTIONS = {\r\n scrollElement: 'html,body',\r\n articleElement: '#article',\r\n selector: 'h1,h2,h3,h4,h5,h6',\r\n stickyHeight: 0,\r\n anchorURL: '',\r\n hasAnchor: true,\r\n isAtStart: true,\r\n showCode: false,\r\n created: null,\r\n mounted: null,\r\n afterScroll: null,\r\n beforeDestroy: null,\r\n afterDestroy: null,\r\n chapterTextFilter: null,\r\n anchorLinkFilter: null\r\n }\r\n\r\n return cloneDeep(OPTIONS)\r\n})()\r\n\r\nexport default Anchors\r\n","import isFunction from './utils/types/isFunction'\r\nimport trim from './utils/lang/trim'\r\nimport createElement from './utils/dom/createElement'\r\nimport setAttributes from './utils/dom/setAttributes'\r\n\r\nimport icon from './utils/icons/icon'\r\n\r\nconst _updateHeading = ($heading, i, options) => {\r\n const CLS_HEADING = 'outline-heading'\r\n const hasAnchor = options.hasAnchor || true\r\n const isAtStart = options.isAtStart || true\r\n const showCode = options.showCode || false\r\n const chapterCode = options.chapterCode || ''\r\n const anchorURL = options.anchorURL || ''\r\n const anchorLinkFilter = options.anchorLinkFilter || null\r\n const headingId = `heading-${i}`\r\n const attrs = {\r\n id: headingId,\r\n className: isAtStart ? `${CLS_HEADING} ${CLS_HEADING}_start` : CLS_HEADING,\r\n 'data-id': i\r\n }\r\n const text = trim($heading.innerHTML)\r\n let url\r\n let $anchor\r\n let $icon\r\n\r\n if (showCode) {\r\n attrs.innerHTML = chapterCode + ' ' + text\r\n attrs['data-code'] = chapterCode\r\n }\r\n setAttributes($heading, attrs)\r\n\r\n if (!hasAnchor) {\r\n return false\r\n }\r\n\r\n if (anchorURL) {\r\n url = anchorURL\r\n } else {\r\n if (isFunction(anchorLinkFilter)) {\r\n url = anchorLinkFilter($heading.tagName.toLowerCase(), text, i)\r\n } else {\r\n url = `#${headingId}`\r\n }\r\n }\r\n\r\n $icon = icon('hash', { iconSet: 'outline' })\r\n $anchor = createElement(\r\n 'a',\r\n {\r\n id: `anchor-${i}`,\r\n className: `${CLS_HEADING}__anchor anchor-${i}`,\r\n href: url,\r\n target: anchorURL ? '_blank' : 'self',\r\n 'data-id': i\r\n },\r\n $icon\r\n )\r\n $heading.appendChild($anchor)\r\n}\r\n\r\nexport default _updateHeading\r\n","// HTML 合法的标签\r\nconst TAGS = [\r\n 'a',\r\n 'abbr',\r\n 'address',\r\n 'area',\r\n 'article',\r\n 'aside',\r\n 'audio',\r\n 'b',\r\n 'base',\r\n 'bdi',\r\n 'bdo',\r\n 'blockquote',\r\n 'body',\r\n 'br',\r\n 'button',\r\n 'canvas',\r\n 'caption',\r\n 'cite',\r\n 'code',\r\n 'col',\r\n 'colgroup',\r\n 'data',\r\n 'datalist',\r\n 'dd',\r\n 'del',\r\n 'details',\r\n 'dfn',\r\n 'dialog',\r\n 'div',\r\n 'dl',\r\n 'dt',\r\n 'em',\r\n 'embed',\r\n 'fieldset',\r\n 'figcaption',\r\n 'figure',\r\n 'footer',\r\n 'form',\r\n 'h1',\r\n 'h2',\r\n 'h3',\r\n 'h4',\r\n 'h5',\r\n 'h6',\r\n 'head',\r\n 'header',\r\n 'hgroup',\r\n 'hr',\r\n 'html',\r\n 'i',\r\n 'iframe',\r\n 'img',\r\n 'input',\r\n 'ins',\r\n 'kbd',\r\n 'label',\r\n 'legend',\r\n 'li',\r\n 'link',\r\n 'main',\r\n 'map',\r\n 'mark',\r\n 'math',\r\n 'menu',\r\n 'menuitem',\r\n 'meta',\r\n 'meter',\r\n 'nav',\r\n 'noscript',\r\n 'object',\r\n 'ol',\r\n 'optgroup',\r\n 'option',\r\n 'output',\r\n 'p',\r\n 'param',\r\n 'picture',\r\n 'pre',\r\n 'progress',\r\n 'q',\r\n 'rb',\r\n 'rp',\r\n 'rt',\r\n 'rtc',\r\n 'ruby',\r\n 's',\r\n 'samp',\r\n 'script',\r\n 'search',\r\n 'section',\r\n 'select',\r\n 'slot',\r\n 'small',\r\n 'source',\r\n 'span',\r\n 'strong',\r\n 'style',\r\n 'sub',\r\n 'summary',\r\n 'sup',\r\n 'svg',\r\n 'table',\r\n 'tbody',\r\n 'td',\r\n 'template',\r\n 'textarea',\r\n 'tfoot',\r\n 'th',\r\n 'thead',\r\n 'time',\r\n 'title',\r\n 'tr',\r\n 'track',\r\n 'u',\r\n 'ul',\r\n 'var',\r\n 'video',\r\n 'wbr'\r\n]\r\n\r\nexport default TAGS\r\n","import isString from './isString'\r\nimport trim from '../lang/trim'\r\nimport TAGS from './tags'\r\n\r\n/**\r\n * 检测测试数据是否为合法的 HTML 代码\r\n * ========================================================================\r\n * @method isHTML\r\n * @category Lang\r\n * @see https://github.com/sindresorhus/html-tags\r\n * @see https://github.com/sindresorhus/is-html\r\n * @param {String} str - 要检测的数据\r\n * @returns {Boolean} 'val' 为合法的 HTML 代码,返回 true,否则返回 false\r\n */\r\nconst isHTML = (str) => {\r\n let html\r\n let basic\r\n let full\r\n\r\n if (!isString(str)) {\r\n return false\r\n }\r\n\r\n // 为了提高性能,我们将其限制在合理的长度内。\r\n html = trim(str).slice(0, 1000)\r\n basic = /\\s*|]*>|]*>|]+>/i\r\n full = new RegExp(TAGS.map((tag) => `<${tag}\\\\b[^>]*>`).join('|'), 'i')\r\n\r\n return basic.test(html) || full.test(html)\r\n}\r\n\r\nexport default isHTML\r\n","/**\r\n * 移除字符串中的 JavaScript 代码\r\n * ====================================================\r\n * @param {String} str\r\n * @returns {String}\r\n */\r\nconst stripScripts = (str) => {\r\n return str.replace(/]*>.*?<\\/script>/gi, '')\r\n}\r\n\r\nexport default stripScripts\r\n","const setProperty = (prop, value) => {\r\n const documentElement = document.documentElement\r\n documentElement.style.setProperty(prop, value)\r\n}\r\n\r\nexport default setProperty\r\n","import setProperty from './utils/dom/setProperty'\r\n\r\nlet index = 2000\r\n\r\nconst zIndex = (idx) => {\r\n if (idx) {\r\n index = idx\r\n } else {\r\n index += 1\r\n }\r\n\r\n setProperty('--outline-zIndex', `${index}`)\r\n\r\n return index\r\n}\r\n\r\nexport default zIndex\r\n","import Base from './base'\r\n\r\nimport later from './utils/lang/later'\r\nimport cloneDeep from './utils/lang/cloneDeep'\r\nimport isFunction from './utils/types/isFunction'\r\nimport isDOM from './utils/types/isDOM'\r\nimport isHTML from './utils/types/isHTML'\r\nimport addClass from './utils/dom/addClass'\r\nimport removeClass from './utils/dom/removeClass'\r\nimport html from './utils/dom/html'\r\nimport createElement from './utils/dom/createElement'\r\nimport on from './utils/event/on'\r\nimport off from './utils/event/off'\r\n\r\nimport paint from './utils/icons/paint'\r\nimport icon from './utils/icons/icon'\r\nimport zIndex from './zIndex'\r\n\r\nclass Drawer extends Base {\r\n constructor(options) {\r\n super()\r\n\r\n this._default()\r\n\r\n this.zIndex = 0\r\n\r\n if (options) {\r\n this.initialize(options)\r\n }\r\n }\r\n\r\n _default() {\r\n this.attrs = cloneDeep(Drawer.DEFAULTS)\r\n this.title = ''\r\n this.closed = false\r\n\r\n this.$el = null\r\n this.$modal = null\r\n this.$header = null\r\n this.$title = null\r\n this.$close = null\r\n this.$main = null\r\n this.$footer = null\r\n this.$overlay = null\r\n\r\n return this\r\n }\r\n\r\n initialize(options) {\r\n let created\r\n\r\n this.attr(options)\r\n\r\n this.title = this.attr('title')\r\n created = this.attr('created')\r\n\r\n if (isFunction(created)) {\r\n created.call(this)\r\n }\r\n\r\n this.render().addListeners()\r\n return this\r\n }\r\n\r\n setTitle(title) {\r\n this.attr('title', title)\r\n this.title = title\r\n this.$title.innerHTML = title\r\n\r\n return this\r\n }\r\n\r\n isClosed() {\r\n return this.closed\r\n }\r\n\r\n render() {\r\n const mounted = this.attr('mounted')\r\n const size = this.attr('size')\r\n const placement = this.attr('placement')\r\n const hasClose = this.attr('hasClose')\r\n const hasOverlay = this.attr('hasOverlay')\r\n const hasOffset = this.attr('hasOffset')\r\n const hasPadding = this.attr('hasPadding')\r\n const autoHeight = this.attr('autoHeight')\r\n const overflow = this.attr('overflow')\r\n const customClass = this.attr('customClass')\r\n let mainClassName = 'outline-drawer__main'\r\n let $el\r\n let $modal\r\n let $header\r\n let $title\r\n let $close\r\n let $main\r\n let $footer\r\n let $overlay\r\n\r\n paint()\r\n this.zIndex = zIndex()\r\n\r\n $title = createElement(\r\n 'h2',\r\n {\r\n className: 'outline-drawer__title'\r\n },\r\n this.title\r\n )\r\n this.$title = $title\r\n\r\n if (hasClose) {\r\n $close = createElement(\r\n 'div',\r\n {\r\n className: 'outline-drawer__close'\r\n },\r\n icon('close', { iconSet: 'outline', size: 20 })\r\n )\r\n this.$close = $close\r\n }\r\n\r\n $header = createElement(\r\n 'header',\r\n {\r\n className: 'outline-drawer__header'\r\n },\r\n [$title, $close]\r\n )\r\n this.$header = $header\r\n\r\n if (overflow === 'hidden') {\r\n mainClassName += ' overflow-hidden'\r\n }\r\n\r\n $main = createElement('div', {\r\n className: mainClassName\r\n })\r\n this.$main = $main\r\n\r\n if (!hasPadding) {\r\n addClass($main, 'outline-drawer_full')\r\n }\r\n\r\n $footer = createElement('footer', {\r\n className: 'outline-drawer__footer'\r\n })\r\n this.$footer = $footer\r\n\r\n $modal = createElement(\r\n 'div',\r\n {\r\n className: `outline-drawer__modal outline-drawer_${placement} outline-drawer_${size} outline-drawer_closed`\r\n },\r\n [$header, $main, $footer]\r\n )\r\n this.$modal = $modal\r\n\r\n if (hasOffset) {\r\n addClass($modal, 'outline-drawer_offset')\r\n }\r\n\r\n if (autoHeight) {\r\n addClass($modal, 'outline-drawer_auto')\r\n }\r\n\r\n if (customClass) {\r\n addClass($modal, customClass)\r\n }\r\n\r\n if (hasOverlay) {\r\n $overlay = createElement('div', {\r\n className: 'outline-drawer__overlay'\r\n })\r\n this.$overlay = $overlay\r\n }\r\n\r\n $el = createElement(\r\n 'div',\r\n {\r\n className: `outline-drawer`\r\n },\r\n [$modal, $overlay]\r\n )\r\n this.$el = $el\r\n document.body.appendChild($el)\r\n\r\n if (isFunction(mounted)) {\r\n mounted.call(this)\r\n }\r\n\r\n return this\r\n }\r\n\r\n erase() {\r\n this.$main.innerHTML = ''\r\n return this\r\n }\r\n\r\n _paint(content) {\r\n let $content = null\r\n\r\n if (isFunction(content)) {\r\n $content = content()\r\n } else if (isDOM(content)) {\r\n $content = content\r\n } else if (isHTML(content)) {\r\n $content = html(content)\r\n }\r\n\r\n if ($content) {\r\n this.$main.appendChild($content)\r\n }\r\n\r\n return this\r\n }\r\n\r\n _remove() {\r\n document.body.removeChild(this.$el)\r\n return this\r\n }\r\n\r\n refresh(content) {\r\n this.erase()._paint(content)\r\n return this\r\n }\r\n\r\n open() {\r\n const opened = this.attr('afterOpened')\r\n const $modal = this.$modal\r\n\r\n addClass(this.$el, 'outline-drawer_opened')\r\n removeClass($modal, 'outline-drawer_closed')\r\n addClass($modal, 'outline-drawer_opened')\r\n\r\n later(() => {\r\n this.closed = false\r\n\r\n if (isFunction(opened)) {\r\n opened.call(this)\r\n }\r\n })\r\n\r\n return this\r\n }\r\n\r\n close() {\r\n const closed = this.attr('afterClosed')\r\n const $modal = this.$modal\r\n\r\n removeClass($modal, 'outline-drawer_opened')\r\n addClass($modal, 'outline-drawer_closed')\r\n\r\n later(() => {\r\n removeClass(this.$el, 'outline-drawer_opened')\r\n this.closed = true\r\n\r\n if (isFunction(closed)) {\r\n closed.call(this)\r\n }\r\n })\r\n\r\n return this\r\n }\r\n\r\n toggle() {\r\n const afterToggle = this.attr('afterToggle')\r\n const closed = this.isClosed()\r\n\r\n if (closed) {\r\n this.open()\r\n } else {\r\n this.close()\r\n }\r\n\r\n if (isFunction(afterToggle)) {\r\n later(() => {\r\n afterToggle.call(this, closed)\r\n })\r\n }\r\n\r\n return this\r\n }\r\n\r\n destroy() {\r\n const afterDestroy = this.attr('afterDestroy')\r\n const beforeDestroy = this.attr('beforeDestroy')\r\n let index = this.zIndex\r\n\r\n if (isFunction(beforeDestroy)) {\r\n beforeDestroy.call(this)\r\n }\r\n\r\n this.removeListeners()._remove()._default()\r\n\r\n index -= 1\r\n zIndex(index)\r\n this.zIndex = 0\r\n\r\n if (isFunction(afterDestroy)) {\r\n afterDestroy.call(this)\r\n }\r\n\r\n return this\r\n }\r\n\r\n onClose() {\r\n this.close()\r\n return this\r\n }\r\n\r\n addListeners() {\r\n const hasClose = this.attr('hasClose')\r\n const hasOverlay = this.attr('hasOverlay')\r\n const closeOnClickModal = this.attr('closeOnClickModal')\r\n const $el = this.$el\r\n\r\n if (hasClose) {\r\n on($el, '.outline-drawer__close', 'click', this.onClose, this, true)\r\n }\r\n\r\n if (hasOverlay && closeOnClickModal) {\r\n on($el, '.outline-drawer__overlay', 'click', this.onClose, this, true)\r\n }\r\n\r\n return this\r\n }\r\n\r\n removeListeners() {\r\n const hasClose = this.attr('hasClose')\r\n const hasOverlay = this.attr('hasOverlay')\r\n const $el = this.$el\r\n\r\n if (!hasClose && !hasOverlay) {\r\n return this\r\n }\r\n\r\n off($el, 'click', this.onClose)\r\n\r\n return this\r\n }\r\n}\r\n\r\nDrawer.DEFAULTS = (() => {\r\n const OPTIONS = {\r\n placement: 'rtl',\r\n title: '标题',\r\n size: 'regular',\r\n hasClose: true,\r\n hasOverlay: true,\r\n hasOffset: false,\r\n hasPadding: true,\r\n autoHeight: true,\r\n closeOnClickModal: true,\r\n overflow: 'auto',\r\n created: null,\r\n mounted: null,\r\n afterClosed: null,\r\n afterOpened: null,\r\n afterScroll: null,\r\n beforeDestroy: null,\r\n afterDestroy: null,\r\n afterToggle: null\r\n }\r\n\r\n return cloneDeep(OPTIONS)\r\n})()\r\n\r\nexport default Drawer\r\n","import isHTML from '../types/isHTML'\r\nimport isString from '../types/isString'\r\nimport isElement from '../types/isElement'\r\nimport stripScripts from '../lang/stripScripts'\r\nimport createElement from './createElement'\r\n\r\n/**\r\n * 获取或者设置 DOM 元素的 innerHTML 属性值,或者通过 HTML 字符串,创建 DOM 元素\r\n * ========================================================================\r\n * @method html\r\n * @param {HTMLElement|String} el\r\n * @param {String} [strHTML]\r\n * @return {DocumentFragment|null|*}\r\n */\r\nconst html = (el, strHTML) => {\r\n const $fragment = document.createDocumentFragment()\r\n\r\n if (!el || (!isHTML(el) && !isString(el) && !isElement(el))) {\r\n return null\r\n }\r\n\r\n if (isHTML(el)) {\r\n const template = createElement('div')\r\n let children = []\r\n\r\n template.innerHTML = stripScripts(el)\r\n children = [...template.childNodes]\r\n children.forEach((child) => {\r\n $fragment.appendChild(child)\r\n })\r\n\r\n return $fragment\r\n } else if (isString(strHTML)) {\r\n el.innerHTML = stripScripts(strHTML)\r\n } else {\r\n return el.innerHTML\r\n }\r\n}\r\n\r\nexport default html\r\n","import isFunction from '../types/isFunction'\r\nimport off from './off'\r\n\r\nimport { CAPTURE_EVENTS } from './enum'\r\n\r\n/**\r\n * 绑定事件\r\n * ========================================================================\r\n * @method at\r\n * @param {HTMLElement|String|Object} el - (必须)绑定代理事件的 DOM 节点\r\n * @param {String|Function} type - (必须)事件类型或者事件处理器回调函数\r\n * @param {Function|Object} fn - (必须) 事件处理器回调函数或者传递给事件处理器回调函数的数据对象\r\n * @param {Object|Boolean} [data] - (可选)传递给事件处理器回调函数的数据对象或者事件处理器回调函数的 this 上下文指向,\r\n * @param {Object|Boolean} [context] - (可选)事件处理器回调函数的 this 上下文指向,或者是否仅触发一次\r\n * 当设置为 true 时,则事件处理器回调函数的 this 上下文指向为 data 对象\r\n * @param {Boolean} once - (可选)是否仅触发一次\r\n */\r\nconst at = (el, type, fn, data, context, once = false) => {\r\n // CAPTURE_EVENTS 中的特殊事件,采用事件捕获模型\r\n const capture = CAPTURE_EVENTS.indexOf(type) > -1\r\n const listener = function (evt) {\r\n let overrideContext = context || el\r\n\r\n // 当设置为 true 时,则事件处理器回调函数的\r\n // this 上下文指向为 data 对象\r\n if (context === true) {\r\n overrideContext = data\r\n }\r\n\r\n // 仅触发一次\r\n /* istanbul ignore else */\r\n if (once === true) {\r\n off(el, type, listener)\r\n }\r\n\r\n fn.call(overrideContext, evt, data)\r\n }\r\n\r\n if (!isFunction(fn)) {\r\n return false\r\n }\r\n\r\n if (!el._listeners) {\r\n el._listeners = []\r\n }\r\n\r\n // 缓存 options 元素绑定的事件处理器\r\n el._listeners.push({\r\n el,\r\n type,\r\n fn: listener,\r\n data,\r\n context,\r\n capture\r\n })\r\n\r\n // 缓存包装后的事件处理器\r\n fn._delegateListener = listener\r\n\r\n el.addEventListener(type, listener, capture)\r\n}\r\n\r\nexport default at\r\n","/**\r\n * 获取HTML元素的某个CSS样式值\r\n * ====================================================\r\n * @param el\r\n * @param ruleName\r\n * @returns {*}\r\n */\r\nconst getStyle = (el, ruleName) => {\r\n return getComputedStyle(el)[ruleName]\r\n}\r\n\r\nexport default getStyle\r\n","import isString from './utils/types/isString'\r\nimport isFunction from './utils/types/isFunction'\r\nimport isElement from './utils/types/isElement'\r\nimport later from './utils/lang/later'\r\nimport at from './utils/event/at'\r\nimport on from './utils/event/on'\r\nimport off from './utils/event/off'\r\nimport stop from './utils/event/stop'\r\nimport createElement from './utils/dom/createElement'\r\nimport scrollTo from './utils/dom/scrollTo'\r\nimport addClass from './utils/dom/addClass'\r\nimport intersection from './utils/dom/intersection'\r\nimport removeClass from './utils/dom/removeClass'\r\nimport offsetTop from './utils/dom/offsetTop'\r\nimport getStyle from './utils/dom/getStyle'\r\nimport setProperty from './utils/dom/setProperty'\r\nimport _getScrollElement from './utils/dom/_getScrollElement'\r\nimport cloneDeep from './utils/lang/cloneDeep'\r\n\r\nimport _paintChapters from './_paintChapters'\r\nimport inBounding from './utils/dom/inBounding'\r\n\r\nimport Base from './base'\r\n\r\nconst HIDDEN = 'outline-navigator_hidden'\r\nconst EXPANDED = 'outline-navigator_expanded'\r\nconst FOLDED = 'outline-navigator_folded'\r\n\r\nclass Navigator extends Base {\r\n constructor(options) {\r\n super()\r\n\r\n this._default()\r\n\r\n this.scrollTimer = null\r\n this.resizeTimer = null\r\n this.observerTimer = null\r\n this.Observer = null\r\n\r\n if (options) {\r\n this.initialize(options)\r\n }\r\n }\r\n\r\n _default() {\r\n this.attrs = cloneDeep(Navigator.DEFAULTS)\r\n\r\n this.$el = null\r\n this.$title = null\r\n this.$main = null\r\n this.$list = null\r\n this.$placeholder = null\r\n this.$parentElement = null\r\n this.$scrollElement = null\r\n this.$active = null\r\n\r\n this.chapters = []\r\n this.active = 0\r\n this.offsetWidth = 0\r\n this.offsetTop = 0\r\n this.playing = false\r\n this.closed = false\r\n\r\n return this\r\n }\r\n\r\n initialize(options) {\r\n let created\r\n let parentElement\r\n let scrollElement\r\n let $parent\r\n\r\n this.attr(options)\r\n\r\n created = this.attr('created')\r\n parentElement = this.attr('parentElement')\r\n scrollElement = this.attr('scrollElement')\r\n\r\n if (isString(parentElement)) {\r\n $parent = document.querySelector(parentElement)\r\n } else if (isElement(parentElement)) {\r\n $parent = parentElement\r\n }\r\n this.$parentElement = $parent\r\n this.$scrollElement = _getScrollElement(scrollElement)\r\n\r\n this.chapters = this.attr('chapters')\r\n this.closed = this.attr('closed')\r\n this.active = this.attr('active')\r\n\r\n if (isFunction(created)) {\r\n created.call(this)\r\n }\r\n\r\n if (this.chapters.length < 1) {\r\n return this\r\n }\r\n\r\n this.render().addListeners()\r\n\r\n this.$active = document.querySelector(`#chapter-${this.active}`)\r\n\r\n return this\r\n }\r\n\r\n isClosed() {\r\n return this.closed\r\n }\r\n\r\n isSticky() {\r\n const position = this.attr('position')\r\n return position === 'sticky'\r\n }\r\n\r\n isFixed() {\r\n const position = this.attr('position')\r\n return position === 'fixed'\r\n }\r\n\r\n isInside() {\r\n return this.isFixed() || this.isSticky()\r\n }\r\n\r\n isOutside() {\r\n return !this.isInside()\r\n }\r\n\r\n count() {\r\n return this.chapters.length\r\n }\r\n\r\n _paintEdge() {\r\n const $fragment = document.createDocumentFragment()\r\n const STICKY = 'outline-navigator_sticky'\r\n const title = this.attr('title')\r\n const animationCurrent = this.attr('animationCurrent')\r\n const customClass = this.attr('customClass')\r\n const $parentElement = this.$parentElement\r\n const children = []\r\n const contents = []\r\n let $title = null\r\n let $el\r\n let $main\r\n let $list\r\n let $placeholder\r\n\r\n if (!$parentElement) {\r\n return this\r\n }\r\n\r\n if (this.isInside() && title) {\r\n $title = createElement(\r\n 'h2',\r\n {\r\n className: 'outline-navigator__title'\r\n },\r\n title\r\n )\r\n this.$title = $title\r\n contents.push($title)\r\n }\r\n\r\n $list = createElement('ul', {\r\n // 为优化性能,添加了 _fixed 和 _hidden\r\n // fixed 为了让 $list 脱离流布局\r\n // hidden 让 $list 不可见\r\n className: `outline-navigator__list`\r\n })\r\n this.$list = $list\r\n children.push($list)\r\n\r\n if (animationCurrent) {\r\n $placeholder = createElement('div', {\r\n className: 'outline-navigator__placeholder'\r\n })\r\n this.$placeholder = $placeholder\r\n children.push($placeholder)\r\n }\r\n\r\n $main = createElement(\r\n 'div',\r\n {\r\n className: 'outline-navigator__main'\r\n },\r\n children\r\n )\r\n this.$main = $main\r\n contents.push($main)\r\n\r\n $el = createElement(\r\n 'nav',\r\n {\r\n id: 'outline-navigator',\r\n className: `outline-navigator ${HIDDEN}`\r\n },\r\n contents\r\n )\r\n this.$el = $el\r\n\r\n if (this.isSticky()) {\r\n this.calculateStickyHeight()\r\n addClass($el, STICKY)\r\n }\r\n\r\n if (customClass) {\r\n addClass($el, customClass)\r\n }\r\n $fragment.appendChild($el)\r\n $parentElement.appendChild($fragment)\r\n\r\n return this\r\n }\r\n\r\n render() {\r\n const mounted = this.attr('mounted')\r\n const $parentElement = this.$parentElement\r\n const chapters = this.chapters\r\n const count = this.count()\r\n let $el\r\n\r\n if (!$parentElement || chapters.length < 1) {\r\n return this\r\n }\r\n\r\n if (this.isInside()) {\r\n addClass($parentElement, 'outline-navigator-parent')\r\n }\r\n\r\n this._paintEdge()\r\n $el = this.$el\r\n\r\n this._paint(chapters)\r\n\r\n later(() => {\r\n this.highlight(this.active)\r\n }, 60)\r\n\r\n this.offsetTop = offsetTop($el)\r\n this.offsetWidth = $el.offsetWidth\r\n\r\n if (this.isFixed()) {\r\n this.sticky()\r\n setProperty('--outline-navigator-width', `${this.offsetWidth}px`)\r\n }\r\n\r\n if (isFunction(mounted)) {\r\n mounted.call(this)\r\n }\r\n\r\n if (count < 400) {\r\n this.onObserver()\r\n }\r\n\r\n return this\r\n }\r\n\r\n erase() {\r\n this.$list.innerHTML = ''\r\n\r\n return this\r\n }\r\n\r\n _paint(chapters) {\r\n const showCode = this.attr('showCode')\r\n const $el = this.$el\r\n const $list = this.$list\r\n\r\n _paintChapters($list, chapters, showCode)\r\n removeClass($el, HIDDEN)\r\n addClass($el, EXPANDED)\r\n\r\n return this\r\n }\r\n\r\n _remove() {\r\n this.$parentElement.removeChild(this.$el)\r\n return this\r\n }\r\n\r\n refresh(chapters) {\r\n const $el = this.$el\r\n\r\n removeClass($el, HIDDEN)\r\n this.erase()._paint(chapters)\r\n\r\n return this\r\n }\r\n\r\n _getPlaceholderOffset(index) {\r\n const $main = this.$main\r\n const $list = this.$list\r\n const $anchor = $list.querySelector('.outline-navigator__anchor')\r\n const mainPaddingTop = parseInt(getStyle($main, 'padding-top'), 10)\r\n const mainBorderTop = parseInt(getStyle($main, 'border-top-width'), 10)\r\n const placeholderPaddingTop = parseInt(getStyle($list, 'padding-top'), 10)\r\n const placeholderMarginTop = parseInt(getStyle($list, 'margin-top'), 10)\r\n const placeholderBorderTop = parseInt(\r\n getStyle($list, 'border-top-width'),\r\n 10\r\n )\r\n let height = $anchor.offsetHeight\r\n let offsetTop = 0\r\n let top\r\n\r\n if (mainPaddingTop) {\r\n offsetTop += mainPaddingTop\r\n }\r\n\r\n if (placeholderPaddingTop) {\r\n offsetTop += placeholderPaddingTop\r\n }\r\n\r\n if (placeholderMarginTop) {\r\n offsetTop += placeholderMarginTop\r\n }\r\n\r\n if (mainBorderTop) {\r\n offsetTop += mainBorderTop\r\n }\r\n\r\n if (placeholderBorderTop) {\r\n offsetTop += placeholderBorderTop\r\n }\r\n\r\n top = height * index\r\n\r\n return offsetTop + top\r\n }\r\n\r\n positionPlaceholder(index) {\r\n const $list = this.$list\r\n const $placeholder = this.$placeholder\r\n const $anchor = $list.querySelector('.outline-navigator__anchor')\r\n const animationCurrent = this.attr('animationCurrent')\r\n const height = $anchor.offsetHeight\r\n let offsetTop = 0\r\n\r\n if (!animationCurrent) {\r\n return this\r\n }\r\n\r\n offsetTop = this._getPlaceholderOffset(index)\r\n\r\n $placeholder.style.cssText = `transform: translateY(${offsetTop}px);height:${height}px;`\r\n\r\n return this\r\n }\r\n\r\n highlight(id) {\r\n const $el = this.$el\r\n const animationCurrent = this.attr('animationCurrent')\r\n const position = this.attr('position')\r\n const ACTIVE = 'outline-navigator_active'\r\n const HIGHLIGHT = 'outline-navigator_highlight'\r\n let $parent = position === 'relative' ? this.$parentElement : this.$main\r\n let $anchor = null\r\n let placeholderOffsetTop = 0\r\n\r\n if (!$el) {\r\n return this\r\n }\r\n\r\n $anchor = $el.querySelector(`#chapter__anchor-${id}`)\r\n\r\n if (!$anchor) {\r\n return this\r\n }\r\n\r\n this.active = parseInt($anchor.getAttribute('data-id'), 10)\r\n\r\n if (this.$active) {\r\n removeClass(this.$active, HIGHLIGHT)\r\n removeClass(this.$active, ACTIVE)\r\n }\r\n\r\n this.$active = $anchor\r\n addClass(this.$active, ACTIVE)\r\n\r\n if (animationCurrent) {\r\n this.positionPlaceholder(this.active)\r\n } else {\r\n addClass(this.$active, HIGHLIGHT)\r\n }\r\n\r\n later(() => {\r\n if (!inBounding(this.$active, $parent)) {\r\n placeholderOffsetTop = this._getPlaceholderOffset(this.active)\r\n scrollTo($parent, placeholderOffsetTop)\r\n }\r\n })\r\n\r\n return this\r\n }\r\n\r\n sticky() {\r\n const afterSticky = this.attr('afterSticky')\r\n const FIXED = 'outline-navigator_fixed'\r\n const $el = this.$el\r\n const top = this.offsetTop\r\n const scrollTop = this.$scrollElement.scrollTop\r\n let isStickying\r\n\r\n if (!this.isFixed()) {\r\n return this\r\n }\r\n\r\n isStickying = scrollTop >= top\r\n\r\n if (isStickying) {\r\n addClass($el, FIXED)\r\n } else {\r\n removeClass($el, FIXED)\r\n }\r\n\r\n if (isFunction(afterSticky)) {\r\n afterSticky.call(this, this.isClosed(), isStickying)\r\n }\r\n\r\n return this\r\n }\r\n\r\n calculateStickyHeight() {\r\n const documentElement = document.documentElement\r\n const height = Math.max(\r\n documentElement.clientHeight || 0,\r\n window.innerHeight || 0\r\n )\r\n setProperty('--outline-sticky-height', `${height}px`)\r\n return this\r\n }\r\n\r\n scrollTo(top, after) {\r\n const el = this.$scrollElement\r\n\r\n scrollTo(el, top, after)\r\n\r\n return this\r\n }\r\n\r\n show() {\r\n const opened = this.attr('afterOpened')\r\n const count = this.count()\r\n const $el = this.$el\r\n const $parent = this.$parentElement\r\n\r\n if (this.isInside()) {\r\n if (count > 800) {\r\n removeClass($parent, HIDDEN)\r\n } else {\r\n removeClass($parent, HIDDEN)\r\n later(() => {\r\n removeClass($parent, FOLDED)\r\n addClass($parent, EXPANDED)\r\n }, 30)\r\n }\r\n } else {\r\n removeClass($el, HIDDEN)\r\n }\r\n this.closed = false\r\n\r\n if (isFunction(opened)) {\r\n opened.call(this)\r\n }\r\n\r\n return this\r\n }\r\n\r\n hide() {\r\n const closed = this.attr('afterClosed')\r\n const count = this.count()\r\n const $el = this.$el\r\n const $parent = this.$parentElement\r\n\r\n if (this.isInside()) {\r\n if (count > 800) {\r\n addClass($parent, HIDDEN)\r\n } else {\r\n addClass($parent, FOLDED)\r\n removeClass($parent, EXPANDED)\r\n later(() => {\r\n addClass($parent, HIDDEN)\r\n })\r\n }\r\n } else {\r\n addClass($el, HIDDEN)\r\n }\r\n this.closed = true\r\n\r\n if (isFunction(closed)) {\r\n closed.call(this)\r\n }\r\n\r\n return this\r\n }\r\n\r\n toggle() {\r\n const afterToggle = this.attr('afterToggle')\r\n const top = this.offsetTop\r\n const scrollTop = this.$scrollElement.scrollTop\r\n let isStickying\r\n\r\n if (this.isClosed()) {\r\n this.show()\r\n } else {\r\n this.hide()\r\n }\r\n\r\n if (isFunction(afterToggle)) {\r\n later(() => {\r\n isStickying = scrollTop >= top\r\n afterToggle.call(this, this.isClosed(), isStickying)\r\n })\r\n }\r\n\r\n return this\r\n }\r\n\r\n destroy() {\r\n const beforeDestroy = this.attr('beforeDestroy')\r\n const afterDestroy = this.attr('afterDestroy')\r\n\r\n if (isFunction(beforeDestroy)) {\r\n beforeDestroy.call(this)\r\n }\r\n\r\n this.removeListeners()._remove()._default()\r\n\r\n if (this.scrollTimer) {\r\n clearTimeout(this.scrollTimer)\r\n this.scrollTimer = null\r\n }\r\n\r\n if (this.resizeTimer) {\r\n clearTimeout(this.resizeTimer)\r\n this.resizeTimer = null\r\n }\r\n\r\n if (this.observerTimer) {\r\n clearTimeout(this.observerTimer)\r\n this.observerTimer = null\r\n }\r\n\r\n if (this.Observer) {\r\n this.Observer = null\r\n }\r\n\r\n if (isFunction(afterDestroy)) {\r\n afterDestroy.call(this)\r\n }\r\n\r\n return this\r\n }\r\n\r\n onObserver() {\r\n const selector = this.attr('selector')\r\n\r\n this.Observer = intersection(\r\n ($heading) => {\r\n const id = $heading.getAttribute('data-id')\r\n\r\n if (this.playing) {\r\n return false\r\n }\r\n\r\n if (this.observerTimer) {\r\n clearTimeout(this.observerTimer)\r\n }\r\n\r\n this.observerTimer = later(() => {\r\n this.highlight(id)\r\n }, 100)\r\n },\r\n {\r\n selector,\r\n context: this\r\n }\r\n )\r\n\r\n return this\r\n }\r\n\r\n onSelect(evt) {\r\n const stickyHeight = this.attr('stickyHeight')\r\n const $anchor = evt.delegateTarget\r\n const id = $anchor.getAttribute('data-id')\r\n const headingId = $anchor.href.split('#')[1]\r\n const $heading = document.querySelector(`#${headingId}`)\r\n const top = offsetTop($heading) - (stickyHeight + 10)\r\n const min = 0\r\n const max = this.$scrollElement.scrollHeight\r\n const afterScroll = this.attr('afterScroll')\r\n const after = () => {\r\n if (isFunction(afterScroll)) {\r\n afterScroll.call(this, 'chapter')\r\n }\r\n\r\n later(() => {\r\n this.playing = false\r\n this.$emit('toolbar:update', {\r\n top,\r\n min,\r\n max\r\n })\r\n })\r\n }\r\n\r\n this.playing = true\r\n if (this.isFixed()) {\r\n this.sticky()\r\n later(() => {\r\n this.scrollTo(top, after)\r\n this.highlight(id)\r\n }, 10)\r\n } else {\r\n this.scrollTo(top, after)\r\n this.highlight(id)\r\n }\r\n\r\n stop(evt)\r\n\r\n return this\r\n }\r\n\r\n onScroll() {\r\n const $scrollElement = this.$scrollElement\r\n\r\n if (this.scrollTimer) {\r\n clearTimeout(this.scrollTimer)\r\n }\r\n\r\n this.scrollTimer = later(() => {\r\n const top = $scrollElement.scrollTop\r\n const min = 0\r\n const max = $scrollElement.scrollHeight - $scrollElement.clientHeight\r\n\r\n if (this.isFixed()) {\r\n this.sticky()\r\n }\r\n\r\n this.$emit('toolbar:update', {\r\n top,\r\n min,\r\n max\r\n })\r\n }, 100)\r\n\r\n return this\r\n }\r\n\r\n onResize() {\r\n // 添加判断\r\n if (!this.isSticky()) {\r\n return this\r\n }\r\n\r\n if (this.resizeTimer) {\r\n clearTimeout(this.resizeTimer)\r\n }\r\n\r\n this.resizeTimer = later(() => {\r\n this.calculateStickyHeight()\r\n })\r\n\r\n return this\r\n }\r\n\r\n onRefresh(chapters) {\r\n this.refresh(chapters)\r\n\r\n return this\r\n }\r\n\r\n addListeners() {\r\n const $el = this.$el\r\n const $scrollElement = this.$scrollElement\r\n const tagName = $scrollElement.tagName.toLowerCase()\r\n let $element = $scrollElement\r\n\r\n if (this.count() < 1) {\r\n return this\r\n }\r\n\r\n if (tagName === 'html' || tagName === 'body') {\r\n $element = window\r\n }\r\n\r\n on($el, '.outline-navigator__anchor', 'click', this.onSelect, this, true)\r\n at($element, 'scroll', this.onScroll, this, true)\r\n if (this.isSticky()) {\r\n at(window, 'resize', this.onResize, this, true)\r\n }\r\n\r\n this.$on('anchors:all:paint', this.onObserver, this)\r\n this.$on('navigator:refresh', this.onRefresh, this)\r\n\r\n return this\r\n }\r\n\r\n removeListeners() {\r\n const selector = this.attr('selector')\r\n const $el = this.$el\r\n const $scrollElement = this.$scrollElement\r\n const tagName = $scrollElement.tagName.toLowerCase()\r\n let $element = $scrollElement\r\n\r\n if (this.count() < 1) {\r\n return this\r\n }\r\n\r\n if (tagName === 'html' || tagName === 'body') {\r\n $element = window\r\n }\r\n\r\n off($el, 'click', this.onSelect)\r\n off($element, 'scroll', this.onScroll)\r\n if (this.isSticky()) {\r\n off(window, 'resize', this.onResize)\r\n }\r\n this.$off('anchors:all:paint')\r\n this.$off('navigator:refresh')\r\n\r\n if (this.Observer) {\r\n document.querySelectorAll(selector).forEach((section) => {\r\n this.Observer.unobserve(section)\r\n })\r\n }\r\n\r\n return this\r\n }\r\n}\r\n\r\nNavigator.DEFAULTS = (() => {\r\n const OPTIONS = {\r\n parentElement: '',\r\n scrollElement: '',\r\n selector: '.outline-heading',\r\n active: 0,\r\n closed: false,\r\n showCode: true,\r\n animationCurrent: true,\r\n position: 'relative',\r\n stickyHeight: 0,\r\n chapters: [],\r\n created: null,\r\n mounted: null,\r\n afterClosed: null,\r\n afterOpened: null,\r\n afterScroll: null,\r\n beforeDestroy: null,\r\n afterDestroy: null,\r\n afterSticky: null\r\n }\r\n\r\n return cloneDeep(OPTIONS)\r\n})()\r\n\r\nexport default Navigator\r\n","import createElement from './utils/dom/createElement'\r\nimport timeSlice from './utils/lang/timeSlice'\r\n\r\nconst _paintChapters = ($list, chapters, showCode = false) => {\r\n const LIMIT = 400\r\n const count = chapters.length\r\n const clones = [...chapters]\r\n const paint = (parts) => {\r\n const byId = (id) => $list.querySelector(`#${id}`)\r\n parts.forEach((chapter) => {\r\n const pid = chapter.pid\r\n const id = chapter.id\r\n const code = chapter.code\r\n const rel = chapter.rel\r\n const children = []\r\n const $text = createElement(\r\n 'span',\r\n {\r\n className: 'outline-navigator__text'\r\n },\r\n chapter.text\r\n )\r\n let $link\r\n let $code\r\n let $li\r\n let $subject\r\n let $chapter\r\n\r\n if (showCode) {\r\n $code = createElement(\r\n 'span',\r\n {\r\n className: 'outline-navigator__code',\r\n 'data-id': id\r\n },\r\n chapter.code\r\n )\r\n\r\n children.push($code)\r\n }\r\n\r\n children.push($text)\r\n\r\n $link = createElement(\r\n 'a',\r\n {\r\n id: `chapter__anchor-${id}`,\r\n className: 'outline-navigator__anchor',\r\n href: '#' + rel,\r\n rel: rel,\r\n 'data-id': id,\r\n 'data-code': code\r\n },\r\n children\r\n )\r\n\r\n $li = createElement(\r\n 'li',\r\n {\r\n id: `chapter-${id}`,\r\n className: 'outline-navigator__item',\r\n 'data-id': id,\r\n 'data-code': code\r\n },\r\n $link\r\n )\r\n\r\n if (pid === -1) {\r\n $list.appendChild($li)\r\n } else {\r\n $chapter = byId(`chapter-${pid}`)\r\n $subject = byId(`subject-${pid}`)\r\n\r\n if (!$subject) {\r\n $subject = createElement(\r\n 'ul',\r\n {\r\n id: 'subject-' + pid,\r\n className: 'outline-navigator__subject'\r\n },\r\n $li\r\n )\r\n\r\n $chapter.appendChild($subject)\r\n } else {\r\n $subject.appendChild($li)\r\n }\r\n }\r\n })\r\n }\r\n\r\n // 在大量 DOM 菜单绘制的时候,使用 TIME SLICE 拆分绘制任务\r\n // 以避免一次绘制大量 DOM 导致占用资源过高,导致卡死\r\n if (count > LIMIT) {\r\n // 同步绘制\r\n paint(clones.splice(0, LIMIT))\r\n\r\n // 剩余的采用 timeSlice 机制绘制\r\n while (clones.length > 0) {\r\n const once = clones.splice(0, LIMIT)\r\n timeSlice(() => {\r\n paint(once)\r\n })\r\n }\r\n } else {\r\n paint(clones)\r\n }\r\n}\r\n\r\nexport default _paintChapters\r\n","import isElement from '../types/isElement'\r\n\r\n/**\r\n * 检测某个 DOM 节点的位置是否在另个一个 DOM 节点范围内\r\n * ========================================================================\r\n * @method inBounding\r\n * @param {HTMLElement} child\r\n * @param {HTMLElement} parent\r\n * @return {Boolean}\r\n */\r\nconst inBounding = (child, parent) => {\r\n let isInBounding = false\r\n let parentRect\r\n let childRect\r\n\r\n if (!isElement(child) || !isElement(parent)) {\r\n return isInBounding\r\n }\r\n\r\n parentRect = parent.getBoundingClientRect()\r\n childRect = child.getBoundingClientRect()\r\n\r\n isInBounding = !!(\r\n childRect.top >= parentRect.top &&\r\n childRect.right <= parentRect.right &&\r\n childRect.bottom <= parentRect.bottom &&\r\n childRect.left >= parentRect.left\r\n )\r\n\r\n return isInBounding\r\n}\r\n\r\nexport default inBounding\r\n","import isFunction from '../types/isFunction'\r\nimport isElement from '../types/isElement'\r\n\r\n/**\r\n * 通用的 IntersectionObserver 观察者处理器\r\n * ========================================================================\r\n * @method intersection\r\n * @param {Function} fn\r\n * @param {Object} [props]\r\n * @param {Object|HTMLElement} [props.root]\r\n * @param {String} [props.selector]\r\n * @param {Object} [props.context]\r\n * @param {String} [props.attr]\r\n * @param {String} [props.rootMargin]\r\n */\r\nconst intersection = (fn, props = {}) => {\r\n const root = props.root || null\r\n const selector = props.selector || '.outline-heading'\r\n const context = props.context || null\r\n const rootMargin = props.rootMargin || '0px 0px -90% 0px'\r\n const options = {\r\n rootMargin: rootMargin\r\n }\r\n // eslint-disable-next-line compat/compat\r\n const Observer = new IntersectionObserver((entries) => {\r\n entries.forEach((entry) => {\r\n if (entry.intersectionRatio > 0) {\r\n if (isFunction(fn)) {\r\n fn.call(context || entry.target, entry.target)\r\n }\r\n }\r\n })\r\n }, options)\r\n const $root = isElement(root) ? root : document\r\n\r\n if (root) {\r\n options.root = root\r\n }\r\n\r\n $root.querySelectorAll(selector).forEach((section) => {\r\n Observer.observe(section)\r\n })\r\n\r\n return Observer\r\n}\r\n\r\nexport default intersection\r\n","import isObject from './isObject'\r\n\r\n/**\r\n * 检测测试数据是否为类似 Object 类型\r\n * ========================================================================\r\n * @method isObjectLike\r\n * @param {Object} val - 要检测的数据\r\n * @returns {Boolean} 'val' 是类似 Object 类型,返回 true,否则返回 false\r\n */\r\nconst isObjectLike = (val) => {\r\n return isObject(val) && val !== null\r\n}\r\n\r\nexport default isObjectLike\r\n","import isObjectLike from './isObjectLike'\r\n\r\n/**\r\n * 检测测试数据是否为普通对象\r\n * ========================================================================\r\n * @method isPlainObject\r\n * @param {Object} val - 要检测的数据\r\n * @returns {Boolean} 'val' 是普通对象,返回 true,否则返回 false\r\n */\r\nconst isPlainObject = (val) => {\r\n const getPrototypeOf = Object.getPrototypeOf\r\n let proto\r\n\r\n // Detect obvious negatives\r\n if (!isObjectLike(val)) {\r\n return false\r\n }\r\n\r\n proto = val.prototype\r\n\r\n // JavaScript 对象分为两种:普通对象和函数对象\r\n // 普通对象:原型是 __proto__,没有 prototype 原型(属性)\r\n // 函数对象:原型是 prototype ,prototype 只存在于函数对象上\r\n if (!proto) {\r\n return true\r\n }\r\n\r\n proto = val\r\n\r\n while (getPrototypeOf(proto) !== null) {\r\n proto = getPrototypeOf(proto)\r\n }\r\n\r\n return getPrototypeOf(val) === proto\r\n}\r\n\r\nexport default isPlainObject\r\n","/**\r\n * 转义字符串中的 HTML 标签\r\n * ========================================================================\r\n * @param {String} str - 需要转义的字符串\r\n * @returns {String}\r\n */\r\nconst encodeHTML = (str) => {\r\n const CHARTS = {\r\n '&': '&',\r\n '<': '<',\r\n '>': '>',\r\n \"'\": ''',\r\n '\"': '"'\r\n }\r\n\r\n return str.replace(/[&<>'\"]/g, (tag) => {\r\n return CHARTS[tag] || tag\r\n })\r\n}\r\n\r\nexport default encodeHTML\r\n","import isString from './utils/types/isString'\r\nimport isPlainObject from './utils/types/isPlainObject'\r\nimport isFunction from './utils/types/isFunction'\r\n\r\nimport extend from './utils/lang/extend'\r\nimport later from './utils/lang/later'\r\nimport stripScripts from './utils/lang/stripScripts'\r\nimport encodeHTML from './utils/lang/encodeHTML'\r\nimport cloneDeep from './utils/lang/cloneDeep'\r\nimport guid from './utils/lang/guid'\r\n\r\nimport createElement from './utils/dom/createElement'\r\nimport addClass from './utils/dom/addClass'\r\nimport removeClass from './utils/dom/removeClass'\r\nimport setAttribute from './utils/dom/setAttribute'\r\nimport setAttributes from './utils/dom/setAttributes'\r\n\r\nimport icon from './utils/icons/icon'\r\nimport paint from './utils/icons/paint'\r\nimport on from './utils/event/on'\r\nimport off from './utils/event/off'\r\n\r\nimport Base from './base'\r\n\r\nconst TYPES = ['info', 'success', 'warning', 'error']\r\nconst instances = []\r\nlet instance\r\n\r\npaint()\r\n\r\nclass Message extends Base {\r\n constructor(options) {\r\n super()\r\n\r\n this._default()\r\n\r\n if (options) {\r\n this.initialize(options)\r\n }\r\n }\r\n\r\n _default() {\r\n this.attrs = cloneDeep(Message.DEFAULTS)\r\n\r\n this.$el = null\r\n this.id = ''\r\n this.closed = false\r\n this.visible = false\r\n this.offset = -50\r\n this.timer = null\r\n this.destroyed = false\r\n\r\n return this\r\n }\r\n\r\n initialize(options) {\r\n this.attr(options)\r\n this.id = this.attr('id')\r\n this.offset = this.attr('offset') || -50\r\n\r\n this.$emit('created', { ...this.attr() })\r\n\r\n this.render().addListeners()\r\n\r\n if (this.attr('visible')) {\r\n this.open()\r\n }\r\n\r\n return this\r\n }\r\n\r\n isClosed() {\r\n return this.closed\r\n }\r\n\r\n isDestroyed() {\r\n return this.destroyed\r\n }\r\n\r\n _getClassName() {\r\n const type = this.attr('type')\r\n const effect = this.attr('effect')\r\n const round = this.attr('round')\r\n const closable = this.attr('closable')\r\n const visible = this.attr('visible')\r\n const customClass = this.attr('customClass')\r\n const className = [\r\n 'outline-message',\r\n `outline-message_${type}`,\r\n `outline-message_${effect}`\r\n ]\r\n\r\n if (round) {\r\n className.push('outline-message_round')\r\n }\r\n\r\n if (!closable) {\r\n className.push('outline-message_full-width')\r\n }\r\n\r\n if (visible) {\r\n className.push('outline-message_visible')\r\n }\r\n\r\n if (customClass) {\r\n className.push(customClass)\r\n }\r\n\r\n return className\r\n }\r\n\r\n render() {\r\n const type = this.attr('type')\r\n const message = this.attr('message')\r\n const effect = this.attr('effect')\r\n const round = this.attr('round')\r\n const closable = this.attr('closable')\r\n const dangerouslyUseHTMLString = this.attr('dangerouslyUseHTMLString')\r\n const className = this._getClassName()\r\n const iconName = effect === 'light' ? `circle-${type}` : type\r\n const children = []\r\n let iconSize = 20\r\n let $type\r\n let $message\r\n let $text\r\n let $close\r\n let $el\r\n\r\n if (round && effect === 'default') {\r\n iconSize = 12\r\n }\r\n\r\n if (effect !== 'plain') {\r\n $type = icon(iconName, {\r\n iconSet: 'outline',\r\n size: iconSize\r\n })\r\n addClass($type, 'outline-message__icon')\r\n children.push($type)\r\n }\r\n\r\n if (!dangerouslyUseHTMLString) {\r\n $text = document.createTextNode(encodeHTML(stripScripts(message)))\r\n } else {\r\n $text = document.createDocumentFragment()\r\n $text.innerHTML = message\r\n }\r\n $message = createElement(\r\n 'p',\r\n {\r\n className: 'outline-message__content'\r\n },\r\n [$text]\r\n )\r\n children.push($message)\r\n\r\n if (closable) {\r\n $close = icon('close', {\r\n iconSet: 'outline',\r\n size: 18\r\n })\r\n addClass($close, 'outline-message__close')\r\n children.push($close)\r\n }\r\n\r\n $el = createElement(\r\n 'div',\r\n {\r\n className: className.join(' ')\r\n },\r\n children\r\n )\r\n $el.style.cssText = `top:-50px;`\r\n this.$el = $el\r\n document.body.appendChild(this.$el)\r\n\r\n this.$emit('mounted')\r\n\r\n return this\r\n }\r\n\r\n _refreshIcon() {\r\n const HIDDEN = '.outline-message_hidden'\r\n const $el = this.$el\r\n let iconSize = 20\r\n let type\r\n let effect\r\n let round\r\n let iconName\r\n let $icon\r\n let $svg\r\n let $use\r\n\r\n if (this.isDestroyed()) {\r\n return this\r\n }\r\n\r\n $icon = $el.querySelector('.outline-icon')\r\n\r\n if (!$icon) {\r\n return this\r\n }\r\n\r\n type = this.attr('type')\r\n effect = this.attr('effect')\r\n round = this.attr('round')\r\n\r\n if (effect === 'plain') {\r\n addClass($icon, HIDDEN)\r\n } else {\r\n removeClass($icon, HIDDEN)\r\n\r\n if (round && effect === 'default') {\r\n iconSize = 12\r\n }\r\n }\r\n\r\n $svg = $icon.querySelector('.outline-icon__svg')\r\n setAttributes($svg, {\r\n style: `width:${iconSize}px;height:${iconSize}px;`\r\n })\r\n\r\n $use = $svg.querySelector('use')\r\n iconName = effect === 'light' ? `circle-${type}` : type\r\n setAttribute($use, 'xlink:href', `#outline-icon-${iconName}`)\r\n\r\n return this\r\n }\r\n\r\n _refreshMessage() {\r\n const $el = this.$el\r\n let $message\r\n let dangerouslyUseHTMLString\r\n let message\r\n let text\r\n\r\n if (this.isDestroyed()) {\r\n return this\r\n }\r\n\r\n $message = $el.querySelector('.outline-message__content')\r\n dangerouslyUseHTMLString = this.attr('dangerouslyUseHTMLString')\r\n message = this.attr('message')\r\n\r\n if (!dangerouslyUseHTMLString) {\r\n text = encodeHTML(stripScripts(message))\r\n } else {\r\n text = message\r\n }\r\n\r\n $message.innerHTML = text\r\n\r\n return this\r\n }\r\n\r\n _refreshClose() {\r\n const HIDDEN = '.outline-message_hidden'\r\n const $el = this.$el\r\n let $close\r\n let closable\r\n\r\n if (this.isDestroyed()) {\r\n return this\r\n }\r\n\r\n $close = $el.querySelector('.outline-message__close')\r\n closable = this.attr('closable')\r\n\r\n if ($close) {\r\n if (closable) {\r\n addClass($close, HIDDEN)\r\n } else {\r\n removeClass($close, HIDDEN)\r\n }\r\n }\r\n\r\n return this\r\n }\r\n\r\n _refreshEl() {\r\n const $el = this.$el\r\n let className\r\n\r\n if (this.isDestroyed()) {\r\n return this\r\n }\r\n\r\n className = this._getClassName()\r\n setAttribute($el, 'className', className.join(' '))\r\n\r\n return this\r\n }\r\n\r\n refresh(options) {\r\n if (!isPlainObject(options)) {\r\n return this\r\n }\r\n\r\n this.attr(options)\r\n ._refreshIcon()\r\n ._refreshMessage()\r\n ._refreshClose()\r\n ._refreshEl()\r\n\r\n return this\r\n }\r\n\r\n clearTimer() {\r\n if (this.isDestroyed()) {\r\n return this\r\n }\r\n\r\n if (this.timer) {\r\n clearTimeout(this.timer)\r\n this.timer = null\r\n }\r\n\r\n return this\r\n }\r\n\r\n startTimer(duration) {\r\n if (this.isDestroyed()) {\r\n return this\r\n }\r\n\r\n this.timer = later(() => {\r\n this.$emit('opened')\r\n this.close()\r\n }, duration * 1000)\r\n\r\n return this\r\n }\r\n\r\n open(options) {\r\n const $el = this.$el\r\n let offset\r\n let duration\r\n let top\r\n let cssRules\r\n\r\n if (this.isDestroyed()) {\r\n return this\r\n }\r\n\r\n if (this.isClosed()) {\r\n this.refresh(options)\r\n }\r\n\r\n offset = this.attr('offset')\r\n duration = this.attr('duration')\r\n top = offset && offset >= this.offset ? offset : this.offset\r\n cssRules = `top:${top}px;`\r\n\r\n this.clearTimer()\r\n\r\n this.$emit('beforeOpen')\r\n\r\n later(() => {\r\n this.visible = true\r\n\r\n addClass($el, 'outline-message_visible')\r\n $el.style.cssText = cssRules\r\n\r\n if (duration > 0) {\r\n this.startTimer(duration)\r\n }\r\n }, 100)\r\n\r\n return this\r\n }\r\n\r\n close() {\r\n const $el = this.$el\r\n const cssRules = `top:-50px;`\r\n let destroyAfterClosed\r\n let beforeClose\r\n\r\n if (this.isDestroyed()) {\r\n return this\r\n }\r\n\r\n destroyAfterClosed = this.attr('destroyAfterClosed')\r\n beforeClose = this.attr('beforeClose')\r\n\r\n if (isFunction(beforeClose)) {\r\n beforeClose.call(this)\r\n }\r\n\r\n $el.style.cssText = cssRules\r\n removeClass($el, 'outline-message_visible')\r\n\r\n this.visible = false\r\n this.closed = true\r\n\r\n later(() => {\r\n this.$emit('closed')\r\n\r\n if (destroyAfterClosed) {\r\n this.destroy()\r\n }\r\n }, 500)\r\n\r\n return this\r\n }\r\n\r\n destroy() {\r\n this.$emit('beforeDestroy')\r\n\r\n if (this.isDestroyed()) {\r\n return this\r\n }\r\n\r\n this.removeListeners()\r\n\r\n document.body.removeChild(this.$el)\r\n\r\n clearTimeout(this.timer)\r\n this._default()\r\n\r\n this.$emit('afterDestroy')\r\n\r\n return this\r\n }\r\n\r\n onMouseEnter() {\r\n this.clearTimer()\r\n return this\r\n }\r\n\r\n onMouseLeave() {\r\n const duration = this.attr('duration')\r\n const delay = this.attr('delay')\r\n\r\n if (duration <= 0) {\r\n return this\r\n }\r\n\r\n this.startTimer(delay)\r\n\r\n return this\r\n }\r\n\r\n onClose() {\r\n this.clearTimer()\r\n this.close()\r\n return this\r\n }\r\n\r\n addListeners() {\r\n const $el = this.$el\r\n\r\n on(\r\n $el,\r\n '.outline-message__content',\r\n 'mouseenter',\r\n this.onMouseEnter,\r\n this,\r\n true\r\n )\r\n on(\r\n $el,\r\n '.outline-message__content',\r\n 'mouseleave',\r\n this.onMouseLeave,\r\n this,\r\n true\r\n )\r\n on($el, '.outline-message__close', 'click', this.onClose, this, true)\r\n\r\n return this\r\n }\r\n\r\n removeListeners() {\r\n const $el = this.$el\r\n\r\n off($el, 'mouseenter', this.onMouseEnter)\r\n off($el, 'mouseleave', this.onMouseLeave)\r\n off($el, 'click', this.onClose)\r\n\r\n return this\r\n }\r\n}\r\n\r\nMessage.DEFAULTS = (() => {\r\n const OPTIONS = {\r\n id: '',\r\n type: 'info',\r\n effect: 'default',\r\n round: false,\r\n offset: 30,\r\n duration: 3,\r\n delay: 2,\r\n message: '',\r\n customClass: '',\r\n closable: true,\r\n visible: true,\r\n dangerouslyUseHTMLString: false,\r\n destroyAfterClosed: true,\r\n beforeClose: null\r\n }\r\n\r\n return cloneDeep(OPTIONS)\r\n})()\r\n\r\nTYPES.forEach((type) => {\r\n Message[type] = (options) => {\r\n const config = {}\r\n const id = guid(`outline-message-`)\r\n const beforeClose = options.beforeClose || null\r\n let offset = options.offset || 30\r\n\r\n if (isString(options)) {\r\n config.message = options\r\n } else {\r\n if (isPlainObject(options)) {\r\n extend(config, options)\r\n }\r\n }\r\n config.id = id\r\n config.type = type\r\n config.offset = offset\r\n config.visible = false\r\n config.beforeClose = () => {\r\n Message.close(id, beforeClose)\r\n }\r\n\r\n instance = new Message(config)\r\n instances.forEach((item) => {\r\n offset += item.$el.offsetHeight + 16\r\n })\r\n instance.offset = offset\r\n instance.open()\r\n instances.push(instance)\r\n\r\n return instance\r\n }\r\n})\r\n\r\n// 关闭指定 id 消息的静态方法\r\nMessage.close = (id, beforeClose) => {\r\n const len = instances.length\r\n let index = -1\r\n let i\r\n let offsetHeight\r\n\r\n instances.forEach((instance, i) => {\r\n // 在 instances 中通过 id 找到要关闭的消息\r\n if (id === instance.id) {\r\n offsetHeight = instance.$el.offsetHeight\r\n index = i\r\n\r\n // 关闭消息\r\n if (isFunction(beforeClose)) {\r\n beforeClose.call(instance)\r\n }\r\n\r\n instances.splice(i, 1)\r\n }\r\n })\r\n\r\n if (len <= 1 || index === -1 || index > instances.length - 1) {\r\n return false\r\n }\r\n\r\n i = index\r\n\r\n // 界面中的消息逐个向上收起\r\n for (; i < len - 1; i += 1) {\r\n const dom = instances[i].$el\r\n\r\n dom.style['top'] = parseInt(dom.style['top'], 10) - offsetHeight - 16 + 'px'\r\n }\r\n}\r\n\r\n// 关闭所有消息的静态方法\r\nMessage.clear = () => {\r\n let i = instances.length - 1\r\n for (; i >= 0; i -= 1) {\r\n instances[i].close()\r\n }\r\n}\r\n\r\nexport default Message\r\n","import isFunction from './utils/types/isFunction'\r\n\r\nclass Command {\r\n constructor(name, action) {\r\n this.name = name\r\n\r\n if (isFunction(action)) {\r\n this.action = action\r\n }\r\n }\r\n\r\n execute() {\r\n this.action()\r\n\r\n return this\r\n }\r\n}\r\n\r\nexport default Command\r\n","import isFunction from './utils/types/isFunction'\r\n\r\nclass Commands {\r\n constructor() {\r\n this.commands = []\r\n }\r\n\r\n get(name) {\r\n return this.commands.find((cmd) => cmd.name === name)\r\n }\r\n\r\n add(command) {\r\n this.commands.push(command)\r\n\r\n return this\r\n }\r\n\r\n del(name) {\r\n const commands = this.commands\r\n const command = commands.find((cmd) => cmd.name === name)\r\n const index = command ? commands.indexOf(command) : -1\r\n\r\n if (index > -1) {\r\n commands.splice(index, 1)\r\n }\r\n\r\n return this\r\n }\r\n\r\n clear() {\r\n this.commands = []\r\n\r\n return this\r\n }\r\n\r\n execute(name) {\r\n const command = this.commands.find((cmd) => cmd.name === name)\r\n\r\n if (isFunction(command?.execute)) {\r\n command.execute()\r\n }\r\n\r\n return this\r\n }\r\n}\r\n\r\nexport default Commands\r\n","import icon from './utils/icons/icon'\r\nimport createElement from './utils/dom/createElement'\r\nimport addClass from './utils/dom/addClass'\r\n\r\nconst _createButton = (button, rounded = true) => {\r\n const $icon = icon(button.icon, {\r\n iconSet: button.iconSet || 'outline',\r\n color: button.color || '',\r\n size: button.size\r\n })\r\n const $anchor = createElement(\r\n 'a',\r\n {\r\n className: `outline-toolbar__anchor`,\r\n href: button.link\r\n },\r\n $icon\r\n )\r\n const $button = createElement(\r\n 'div',\r\n {\r\n className: `outline-toolbar__button ${button.name}`,\r\n 'data-cmd': button.name\r\n },\r\n [button.link ? $anchor : $icon]\r\n )\r\n\r\n addClass($icon, 'outline-toolbar__icon')\r\n\r\n if (rounded) {\r\n addClass($button, 'outline-toolbar_rounded')\r\n }\r\n\r\n if (button.disabled) {\r\n addClass($button, 'outline-toolbar_disabled')\r\n }\r\n\r\n return $button\r\n}\r\n\r\nexport default _createButton\r\n","import isString from './utils/types/isString'\r\nimport isFunction from './utils/types/isFunction'\r\nimport isObject from './utils/types/isObject'\r\nimport isArray from './utils/types/isArray'\r\nimport later from './utils/lang/later'\r\nimport guid from './utils/lang/guid'\r\nimport cloneDeep from './utils/lang/cloneDeep'\r\nimport createElement from './utils/dom/createElement'\r\nimport addClass from './utils/dom/addClass'\r\nimport hasClass from './utils/dom/hasClass'\r\nimport removeClass from './utils/dom/removeClass'\r\nimport on from './utils/event/on'\r\nimport off from './utils/event/off'\r\nimport paint from './utils/icons/paint'\r\n\r\nimport Base from './base'\r\nimport Command from './command'\r\nimport Commands from './commands'\r\n\r\nimport _createButton from './_createButton'\r\n\r\nconst DISABLED = 'outline-toolbar_disabled'\r\nconst HIDDEN = 'outline-toolbar_hidden'\r\nconst ACTIVE = 'outline-toolbar_active'\r\n\r\nclass Toolbar extends Base {\r\n constructor(options) {\r\n super()\r\n\r\n this._default()\r\n\r\n if (options) {\r\n this.initialize(options)\r\n }\r\n }\r\n\r\n _default() {\r\n this.attrs = cloneDeep(Toolbar.DEFAULTS)\r\n\r\n this.disabled = false\r\n this.closed = false\r\n\r\n this.$el = null\r\n this.buttons = []\r\n this.commands = null\r\n\r\n return this\r\n }\r\n\r\n initialize(options) {\r\n let created\r\n\r\n this.attr(options)\r\n\r\n this.disabled = this.attr('disabled')\r\n this.closed = this.attr('closed')\r\n this.commands = new Commands()\r\n\r\n created = this.attr('created')\r\n\r\n if (isFunction(created)) {\r\n created.call(this)\r\n }\r\n\r\n this.render().addListeners()\r\n\r\n return this\r\n }\r\n\r\n isHighlight(name) {\r\n const button = this.get(name)\r\n\r\n if (!button) {\r\n return false\r\n }\r\n\r\n return hasClass(button.$el, ACTIVE)\r\n }\r\n\r\n isDisabled(name) {\r\n let button\r\n\r\n if (name) {\r\n button = this.get(name)\r\n\r\n return button.disabled\r\n }\r\n\r\n return this.disabled\r\n }\r\n\r\n isExist(name) {\r\n const button = this.get(name)\r\n return !!button\r\n }\r\n\r\n isClosed() {\r\n return this.closed\r\n }\r\n\r\n _getCommand(button) {\r\n const _self = this\r\n const { action, name } = button\r\n let command = null\r\n let handler = null\r\n let context\r\n let listener\r\n\r\n if (!action) {\r\n return command\r\n }\r\n\r\n handler = action.handler\r\n context = action.context || this\r\n\r\n if (isFunction(handler)) {\r\n listener = handler\r\n } else if (isString(handler)) {\r\n listener = function () {\r\n _self.$emit(handler, name)\r\n }\r\n }\r\n\r\n if (isFunction(listener)) {\r\n command = new Command(name, listener.bind(context))\r\n }\r\n\r\n return command\r\n }\r\n\r\n get(name) {\r\n return this.buttons.find((button) => button.name === name)\r\n }\r\n\r\n render() {\r\n const mounted = this.attr('mounted')\r\n const buttons = this.attr('buttons') || []\r\n const placement = this.attr('placement')\r\n\r\n paint()\r\n\r\n this.$el = createElement('div', {\r\n id: guid('outline-toolbar'),\r\n className: `outline-toolbar outline-toolbar_${placement}`\r\n })\r\n this._paint(buttons)\r\n document.body.appendChild(this.$el)\r\n\r\n if (this.closed) {\r\n this.hide()\r\n }\r\n\r\n if (this.disabled) {\r\n this.disable()\r\n }\r\n\r\n if (isFunction(mounted)) {\r\n mounted.call(this)\r\n }\r\n\r\n return this\r\n }\r\n\r\n erase() {\r\n this.$el.innerHTML = ''\r\n return this\r\n }\r\n\r\n _paint(buttons) {\r\n const rounded = this.attr('rounded')\r\n const $fragment = document.createDocumentFragment()\r\n\r\n buttons.forEach((button) => {\r\n const $button = _createButton(button, rounded)\r\n const command = this._getCommand(button)\r\n const { name, disabled, context } = button\r\n\r\n $fragment.appendChild($button)\r\n\r\n if (!this.isExist(name)) {\r\n this.buttons.push({\r\n $el: $button,\r\n name,\r\n disabled: disabled || false,\r\n context: context || this\r\n })\r\n\r\n if (command) {\r\n this.commands.add(command)\r\n }\r\n }\r\n })\r\n\r\n this.$el.appendChild($fragment)\r\n\r\n return this\r\n }\r\n\r\n _remove() {\r\n document.body.removeChild(this.$el)\r\n return this\r\n }\r\n\r\n refresh(buttons) {\r\n this.attr({ buttons })\r\n this.erase()._paint(buttons)\r\n return this\r\n }\r\n\r\n add(button) {\r\n const $el = this.$el\r\n const $fragment = document.createDocumentFragment()\r\n const buttons = this.attr('buttons') || []\r\n const { name, disabled, context } = button\r\n const command = this._getCommand(button)\r\n const _add = (button) => {\r\n const $button = _createButton(button)\r\n\r\n $fragment.appendChild($button)\r\n\r\n buttons.push(button)\r\n this.buttons.push({\r\n $el: $button,\r\n name,\r\n disabled: disabled || false,\r\n context: context || this,\r\n command\r\n })\r\n\r\n if (command) {\r\n this.commands.add(command)\r\n }\r\n }\r\n\r\n if (isObject(button)) {\r\n _add(button)\r\n } else if (isArray(button)) {\r\n button.forEach((item) => {\r\n if (isObject(item)) {\r\n _add(item)\r\n }\r\n })\r\n }\r\n $el.appendChild($fragment)\r\n\r\n return this\r\n }\r\n\r\n remove(name) {\r\n const $el = this.$el\r\n const buttons = this.buttons\r\n const button = this.get(name)\r\n let index = -1\r\n\r\n if (!button) {\r\n return this\r\n }\r\n\r\n index = buttons.indexOf(button)\r\n\r\n if (index > -1) {\r\n buttons.splice(index, 1)\r\n this.attr('buttons').splice(index, 1)\r\n }\r\n\r\n this._disable(name)\r\n $el.removeChild(button.$el)\r\n\r\n return this\r\n }\r\n\r\n _disable(name) {\r\n const button = this.get(name)\r\n const command = this.commands.get(name)\r\n\r\n if (!button || button.disabled) {\r\n return this\r\n }\r\n\r\n button.disabled = true\r\n\r\n if (command) {\r\n this.commands.del(command)\r\n }\r\n\r\n addClass(button.$el, DISABLED)\r\n\r\n return this\r\n }\r\n\r\n _enable(name) {\r\n const button = this.get(name)\r\n const command = this.commands.get(name)\r\n\r\n if (!button || !button.disabled) {\r\n return this\r\n }\r\n\r\n button.disabled = false\r\n\r\n if (command) {\r\n this.commands.add(command)\r\n }\r\n\r\n removeClass(button.$el, DISABLED)\r\n\r\n return this\r\n }\r\n\r\n disable(name) {\r\n const disabled = this.attr('afterDisabled')\r\n\r\n if (name) {\r\n this._disable(name)\r\n } else {\r\n addClass(this.$el, DISABLED)\r\n this.removeListeners()\r\n this.disabled = true\r\n\r\n if (isFunction(disabled)) {\r\n disabled.call(this)\r\n }\r\n }\r\n\r\n return this\r\n }\r\n\r\n enable(name) {\r\n const enabled = this.attr('afterEnabled')\r\n\r\n if (name) {\r\n this._enable(name)\r\n } else {\r\n this.disabled = false\r\n removeClass(this.$el, DISABLED)\r\n this.addListeners()\r\n\r\n if (isFunction(enabled)) {\r\n enabled.call(this)\r\n }\r\n }\r\n\r\n return this\r\n }\r\n\r\n show(name) {\r\n const opened = this.attr('afterOpened')\r\n const button = this.get(name)\r\n const $el = this.$el\r\n\r\n if (name) {\r\n if (!button) {\r\n return this\r\n }\r\n\r\n removeClass(button.$el, HIDDEN)\r\n } else {\r\n removeClass($el, HIDDEN)\r\n this.closed = false\r\n\r\n if (isFunction(opened)) {\r\n later(() => {\r\n opened.call(this)\r\n }, 310)\r\n }\r\n }\r\n\r\n return this\r\n }\r\n\r\n hide(name) {\r\n const closed = this.attr('afterClosed')\r\n const button = this.get(name)\r\n const $el = this.$el\r\n\r\n if (name) {\r\n if (!button) {\r\n return this\r\n }\r\n\r\n addClass(button.$el, HIDDEN)\r\n } else {\r\n addClass($el, HIDDEN)\r\n this.closed = true\r\n\r\n if (isFunction(closed)) {\r\n later(() => {\r\n closed.call(this)\r\n }, 310)\r\n }\r\n }\r\n\r\n return this\r\n }\r\n\r\n toggle(name) {\r\n if (this.isClosed()) {\r\n this.show(name)\r\n } else {\r\n this.hide(name)\r\n }\r\n\r\n return this\r\n }\r\n\r\n highlight(name) {\r\n const button = this.get(name)\r\n let $button\r\n\r\n if (!button) {\r\n return this\r\n }\r\n\r\n $button = button.$el\r\n\r\n if (hasClass($button, ACTIVE)) {\r\n removeClass($button, ACTIVE)\r\n } else {\r\n addClass($button, ACTIVE)\r\n }\r\n\r\n return this\r\n }\r\n\r\n destroy() {\r\n const beforeDestroy = this.attr('beforeDestroy')\r\n const afterDestroy = this.attr('afterDestroy')\r\n\r\n if (isFunction(beforeDestroy)) {\r\n beforeDestroy.call(this)\r\n }\r\n\r\n this.commands.clear()\r\n this.removeListeners()._remove()._default()\r\n\r\n if (isFunction(afterDestroy)) {\r\n afterDestroy.call(this)\r\n }\r\n\r\n return this\r\n }\r\n\r\n execute(name) {\r\n if (this.isDisabled(name)) {\r\n return this\r\n }\r\n\r\n this.commands.execute(name)\r\n\r\n return this\r\n }\r\n\r\n onExecute(evt) {\r\n const $button = evt.delegateTarget\r\n let cmd = ''\r\n\r\n if ($button) {\r\n cmd = $button.getAttribute('data-cmd')\r\n\r\n if (cmd) {\r\n this.execute(cmd)\r\n }\r\n }\r\n\r\n return this\r\n }\r\n\r\n _updateToolbar({ top, min, max }) {\r\n const current = Math.ceil(top)\r\n\r\n if (current <= min) {\r\n this.hide('up')\r\n this.show('down')\r\n } else if (current >= max) {\r\n this.hide('down')\r\n this.show('up')\r\n } else if (current > min && current < max) {\r\n this.show('up')\r\n this.show('down')\r\n }\r\n\r\n return this\r\n }\r\n\r\n onToolbarUpdate({ top, min, max }) {\r\n this._updateToolbar({ top, min, max })\r\n return this\r\n }\r\n\r\n onAddButton(buttons) {\r\n this.attr({\r\n buttons\r\n })\r\n this.refresh(buttons)\r\n\r\n return this\r\n }\r\n\r\n onRemoveButton(name) {\r\n this.remove(name)\r\n return this\r\n }\r\n\r\n addListeners() {\r\n const buttons = this.attr('buttons') || []\r\n const $el = this.$el\r\n\r\n if (!buttons || buttons.length < 1) {\r\n return this\r\n }\r\n\r\n on($el, `.outline-toolbar__button`, 'click', this.onExecute, this, true)\r\n\r\n this.$on('toolbar:update', this.onToolbarUpdate)\r\n this.$on('toolbar:add:button', this.onAddButton)\r\n this.$on('toolbar:remove:button', this.onRemoveButton)\r\n this.$on('toolbar:toggle', this.toggle)\r\n\r\n return this\r\n }\r\n\r\n removeListeners() {\r\n const buttons = this.attr('buttons') || []\r\n const $el = this.$el\r\n\r\n if (!buttons || buttons.length < 1) {\r\n return this\r\n }\r\n\r\n off($el, '.outline-toolbar__button', this.onExecute)\r\n\r\n this.$off('toolbar:update')\r\n this.$off('toolbar:add:button')\r\n this.$off('toolbar:remove:button')\r\n this.$off('toolbar:toggle')\r\n\r\n return this\r\n }\r\n}\r\n\r\nToolbar.DEFAULTS = (() => {\r\n const OPTIONS = {\r\n placement: 'ltr',\r\n closed: false,\r\n disabled: false,\r\n rounded: true,\r\n buttons: [],\r\n created: null,\r\n mounted: null,\r\n afterClosed: null,\r\n afterOpened: null,\r\n afterDisabled: null,\r\n afterEnabled: null,\r\n beforeDestroy: null,\r\n afterDestroy: null\r\n }\r\n\r\n return cloneDeep(OPTIONS)\r\n})()\r\n\r\nexport default Toolbar\r\n","import publish from './utils/observer/emit'\r\n\r\nclass Speech {\r\n constructor(options) {\r\n this.utterance = new SpeechSynthesisUtterance()\r\n\r\n if (options) {\r\n this.initialize(options)\r\n }\r\n }\r\n\r\n _initialize(options) {\r\n if (options.lang) {\r\n this.setLang(options.lang)\r\n }\r\n\r\n if (options.pitch) {\r\n this.setPitch(options.pitch)\r\n }\r\n\r\n if (options.rate) {\r\n this.setRate(options.rate)\r\n }\r\n\r\n if (options.text) {\r\n this.setText(options.text)\r\n }\r\n\r\n if (options.voice) {\r\n this.setVoice(options.voice)\r\n }\r\n\r\n if (options.volume) {\r\n this.setVolume(options.volume)\r\n }\r\n\r\n return this\r\n }\r\n\r\n initialize(options) {\r\n this._initialize(options)._addListeners()\r\n return this\r\n }\r\n\r\n isSpeaking() {\r\n return speechSynthesis.speaking\r\n }\r\n\r\n isPending() {\r\n return speechSynthesis.pending\r\n }\r\n\r\n isPaused() {\r\n return speechSynthesis.paused\r\n }\r\n\r\n getVoices() {\r\n return speechSynthesis.getVoices()\r\n }\r\n\r\n setLang(lang) {\r\n this.utterance.lang = lang\r\n return this\r\n }\r\n\r\n setPitch(pitch) {\r\n this.utterance.pitch = pitch\r\n return this\r\n }\r\n\r\n setRate(rate) {\r\n this.utterance.rate = rate\r\n return this\r\n }\r\n\r\n setText(text) {\r\n this.utterance.text = text\r\n return this\r\n }\r\n\r\n setVoice(voice) {\r\n this.utterance.voice = voice\r\n return this\r\n }\r\n\r\n setVolume(volume) {\r\n this.utterance.volume = volume\r\n return this\r\n }\r\n\r\n speak(text) {\r\n if (text) {\r\n this.setText(text)\r\n }\r\n\r\n speechSynthesis.speak(this.utterance)\r\n\r\n return this\r\n }\r\n\r\n pause() {\r\n speechSynthesis.pause()\r\n return this\r\n }\r\n\r\n resume() {\r\n speechSynthesis.resume()\r\n return this\r\n }\r\n\r\n cancel() {\r\n speechSynthesis.cancel()\r\n this.setText('')\r\n return this\r\n }\r\n\r\n _addListeners() {\r\n const UTTERANCE_EVENTS = [\r\n 'boundary',\r\n 'end',\r\n 'error',\r\n 'start',\r\n 'mark',\r\n 'pause',\r\n 'resume'\r\n ]\r\n const utterance = this.utterance\r\n const speech = this\r\n\r\n UTTERANCE_EVENTS.forEach((name) => {\r\n utterance[`on${name}`] = (event) => {\r\n publish(name, {\r\n event,\r\n speech\r\n })\r\n }\r\n })\r\n\r\n speechSynthesis.onvoiceschanged = (event) => {\r\n publish('voiceschanged', {\r\n event,\r\n speech\r\n })\r\n }\r\n\r\n return this\r\n }\r\n}\r\n\r\nSpeech.isSupport = (() => {\r\n return 'speechSynthesis' in window\r\n})()\r\n\r\nexport default Speech\r\n","import addClass from './utils/dom/addClass'\r\n\r\nconst _updateSiblingElements = (siblingElement, isPrev) => {\r\n let tagName\r\n let $sibling = siblingElement\r\n\r\n while ($sibling) {\r\n tagName = $sibling.tagName.toLowerCase()\r\n\r\n if (tagName !== 'script' && tagName !== 'style') {\r\n addClass($sibling, 'outline-reader_sibling')\r\n }\r\n\r\n if (isPrev) {\r\n $sibling = $sibling.previousElementSibling\r\n } else {\r\n $sibling = $sibling.nextElementSibling\r\n }\r\n }\r\n}\r\n\r\nexport default _updateSiblingElements\r\n","/**\r\n * 检测当前设备是否为移动设备\r\n * ========================================================================\r\n * @method isMobile\r\n * @return {boolean}\r\n */\r\nconst isMobile = () => {\r\n const ua = navigator.userAgent\r\n\r\n return /Mobile|mini|Fennec|Android|iP(ad|od|hone)|NokiaN[^/]*/.test(ua)\r\n}\r\n\r\nexport default isMobile\r\n","import cloneDeep from './utils/lang/cloneDeep'\r\nimport later from './utils/lang/later'\r\nimport isString from './utils/types/isString'\r\nimport isElement from './utils/types/isElement'\r\nimport isFunction from './utils/types/isFunction'\r\nimport createElement from './utils/dom/createElement'\r\nimport addClass from './utils/dom/addClass'\r\nimport removeClass from './utils/dom/removeClass'\r\nimport at from './utils/event/at'\r\nimport stop from './utils/event/stop'\r\nimport off from './utils/event/off'\r\n\r\nimport Base from './base'\r\nimport Message from './message'\r\nimport Toolbar from './toolbar'\r\nimport Speech from './speech'\r\n\r\nimport _updateSiblingElements from './_updateSiblingElements'\r\nimport isMobile from './utils/dom/isMobile'\r\n\r\nconst ENTER_READING_TIP = '进入阅读模式,按 ESC 键可退出阅读模式'\r\n\r\nclass Reader extends Base {\r\n constructor(options) {\r\n super()\r\n\r\n this._default()\r\n\r\n if (options) {\r\n this.initialize(options)\r\n }\r\n }\r\n\r\n _default() {\r\n this.attrs = cloneDeep(Reader.DEFAULTS)\r\n this.reading = false\r\n\r\n this.$target = null\r\n this.$el = null\r\n this.$paper = null\r\n this.$title = null\r\n this.$article = null\r\n this.$progress = null\r\n\r\n this.toolbar = null\r\n this.speech = null\r\n\r\n return this\r\n }\r\n\r\n initialize(options) {\r\n let target\r\n\r\n this.attr(options)\r\n\r\n target = this.attr('target')\r\n\r\n if (isString(target)) {\r\n this.$target = document.querySelector(target)\r\n } else if (isElement(target)) {\r\n this.$target = target\r\n }\r\n\r\n if (!this.$target) {\r\n return this\r\n }\r\n\r\n if (Speech.isSupport) {\r\n this.speech = new Speech()\r\n }\r\n\r\n this.render().addListeners()\r\n\r\n return this\r\n }\r\n\r\n isSpeaking() {\r\n return this?.speech?.isSpeaking()\r\n }\r\n\r\n render() {\r\n this._renderEdge()._paint(this.$target)\r\n return this\r\n }\r\n\r\n erase() {\r\n this.$article.innerHTML = ''\r\n return this\r\n }\r\n\r\n _paint($content) {\r\n const $fragment = document.createDocumentFragment()\r\n const $children = [...$content.cloneNode(true).children]\r\n\r\n later(() => {\r\n $children.forEach(($child) => {\r\n $fragment.appendChild($child)\r\n })\r\n\r\n this.$article.appendChild($fragment)\r\n })\r\n\r\n return this\r\n }\r\n\r\n _remove() {\r\n const $el = this.$el\r\n const toolbar = this.toolbar\r\n\r\n if ($el) {\r\n document.body.removeChild($el)\r\n }\r\n\r\n if (toolbar) {\r\n toolbar.destroy()\r\n }\r\n\r\n return this\r\n }\r\n\r\n refresh() {\r\n this.erase()._paint(this.$target)\r\n return this\r\n }\r\n\r\n _animateTimeline() {\r\n // eslint-disable-next-line\r\n if (!window.ScrollTimeline || !isMobile()) {\r\n return this\r\n }\r\n\r\n this.$progress.animate(\r\n {\r\n // from\r\n scale: ['0 1', '1 1']\r\n },\r\n {\r\n // eslint-disable-next-line\r\n timeline: new ScrollTimeline({\r\n source: this.$article,\r\n axis: 'block'\r\n })\r\n }\r\n )\r\n\r\n return this\r\n }\r\n\r\n _renderEdge() {\r\n const $target = this.$target\r\n const mobile = isMobile()\r\n const size = mobile ? 26 : 20\r\n let title = this.attr('title')\r\n let $el\r\n let $paper\r\n let $title\r\n let $article\r\n let $progress\r\n let $sibling\r\n\r\n $progress = createElement('div', {\r\n className: 'outline-reader__progress'\r\n })\r\n this.$progress = $progress\r\n\r\n $title = $target.querySelector('h1')\r\n\r\n if (isElement(title)) {\r\n $title = title\r\n }\r\n\r\n if (isElement($title)) {\r\n title = $title.innerText\r\n }\r\n\r\n $title = createElement(\r\n 'h1',\r\n {\r\n className: 'outline-reader__title'\r\n },\r\n title\r\n )\r\n this.$title = $title\r\n\r\n $article = createElement(\r\n 'article',\r\n {\r\n id: 'outline-reader__article',\r\n className: 'outline-reader__article'\r\n },\r\n isMobile() ? [] : [$progress.cloneNode()]\r\n )\r\n this.$article = $article\r\n\r\n $paper = createElement(\r\n 'div',\r\n {\r\n id: 'outline-reader__paper',\r\n className: 'outline-reader__paper'\r\n },\r\n [$title, $article]\r\n )\r\n this.$paper = $paper\r\n\r\n const buttons = []\r\n\r\n buttons.push({\r\n name: 'print',\r\n icon: 'print',\r\n size,\r\n action: {\r\n context: this,\r\n handler: this.print\r\n }\r\n })\r\n\r\n if (Speech.isSupport && this.attr('allowSpeak')) {\r\n buttons.push({\r\n name: 'speak',\r\n icon: 'sound',\r\n size,\r\n action: {\r\n context: this,\r\n handler: this.speak\r\n }\r\n })\r\n }\r\n\r\n buttons.push({\r\n name: 'exit',\r\n icon: 'close',\r\n size,\r\n action: {\r\n context: this,\r\n handler: this.exit\r\n }\r\n })\r\n\r\n this.toolbar = new Toolbar({\r\n placement: 'rtl',\r\n buttons\r\n })\r\n\r\n $el = createElement(\r\n 'section',\r\n {\r\n id: 'outline-reader',\r\n className: 'outline-reader outline-reader_hidden'\r\n },\r\n [$progress, $paper, this.toolbar.$el]\r\n )\r\n this.$el = $el\r\n\r\n document.body.appendChild($el)\r\n\r\n this._animateTimeline()\r\n\r\n later(() => {\r\n // 设置邻居节点的打印样式\r\n $sibling = $el.previousElementSibling\r\n _updateSiblingElements($sibling, true)\r\n\r\n $sibling = $el.nextElementSibling\r\n _updateSiblingElements($sibling)\r\n })\r\n\r\n return this\r\n }\r\n\r\n enter() {\r\n const READER = 'outline-reader'\r\n const READING = `${READER}--reading`\r\n const HIDDEN = `${READER}_hidden`\r\n const $el = this.$el\r\n const $siblings = document.querySelectorAll('.outline-reader_sibling')\r\n const enterReadingTip = this.attr('enterReadingTip') || ENTER_READING_TIP\r\n\r\n if (this.reading || !$el) {\r\n return this\r\n }\r\n\r\n $siblings.forEach(($sibling) => {\r\n addClass($sibling, HIDDEN)\r\n })\r\n addClass($el, READING)\r\n removeClass($el, HIDDEN)\r\n this.toolbar.show()\r\n this.reading = true\r\n\r\n Message.info({\r\n round: true,\r\n message: enterReadingTip\r\n })\r\n\r\n this.$emit('reader:enter')\r\n\r\n return this\r\n }\r\n\r\n exit() {\r\n const SPEAK = 'speak'\r\n const READER = 'outline-reader'\r\n const READING = `${READER}--reading`\r\n const HIDDEN = `${READER}_hidden`\r\n const $el = this.$el\r\n const $siblings = document.querySelectorAll('.outline-reader_sibling')\r\n const speech = this.speech\r\n const toolbar = this.toolbar\r\n\r\n if (!this.reading || !$el) {\r\n return this\r\n }\r\n\r\n addClass($el, HIDDEN)\r\n removeClass($el, READING)\r\n $siblings.forEach(($sibling) => {\r\n removeClass($sibling, HIDDEN)\r\n })\r\n toolbar.hide()\r\n this.reading = false\r\n\r\n if (speech) {\r\n if (toolbar.isHighlight(SPEAK)) {\r\n toolbar.highlight(SPEAK)\r\n }\r\n\r\n speech.cancel()\r\n }\r\n\r\n this.$emit('reader:exit')\r\n\r\n return this\r\n }\r\n\r\n toggle() {\r\n if (this.reading) {\r\n this.exit()\r\n } else {\r\n this.enter()\r\n }\r\n\r\n return this\r\n }\r\n\r\n speak() {\r\n const text = this.$article.innerText\r\n const speech = this.speech\r\n\r\n if (!Speech.isSupport || !speech) {\r\n return this\r\n }\r\n\r\n this.toolbar.highlight('speak')\r\n\r\n if (this.isSpeaking()) {\r\n speech.cancel()\r\n } else {\r\n speech.speak(text)\r\n }\r\n\r\n return this\r\n }\r\n\r\n print() {\r\n if (!isFunction(print)) {\r\n return this\r\n }\r\n\r\n print()\r\n\r\n return this\r\n }\r\n\r\n destroy() {\r\n const $el = this.$el\r\n\r\n if (!$el) {\r\n return this\r\n }\r\n\r\n this.removeListeners()._remove()._default()\r\n\r\n return this\r\n }\r\n\r\n onPrint() {\r\n this.print()\r\n return this\r\n }\r\n\r\n onEnterReading() {\r\n this.toggle()\r\n return this\r\n }\r\n\r\n onExitReading(evt) {\r\n const keyCode = evt.keyCode\r\n\r\n if (keyCode === 27 && this.reading) {\r\n this.toggle()\r\n stop(evt)\r\n }\r\n\r\n return this\r\n }\r\n\r\n onRefresh() {\r\n this.refresh()\r\n\r\n return this\r\n }\r\n\r\n addListeners() {\r\n const $el = this.$el\r\n\r\n if (!$el) {\r\n return this\r\n }\r\n\r\n at(document, 'keyup', this.onExitReading, this, true)\r\n\r\n this.$on('toolbar:action:print', this.onPrint)\r\n this.$on('toolbar:action:reading', this.onEnterReading)\r\n this.$on('reader:print', this.onPrint)\r\n this.$on('reader:refresh', this.onRefresh)\r\n this.$on('reader:enter', this.enter)\r\n this.$on('reader:exit', this.exit)\r\n this.$on('reader:toggle', this.toggle)\r\n\r\n return this\r\n }\r\n\r\n removeListeners() {\r\n const $el = this.$el\r\n\r\n if (!$el) {\r\n return this\r\n }\r\n\r\n off(document, 'keyup', this.onExitReading)\r\n\r\n this.$off('toolbar:action:print')\r\n this.$off('toolbar:action:reading')\r\n this.$off('reader:refresh')\r\n this.$off('reader:toggle')\r\n\r\n return this\r\n }\r\n}\r\n\r\nReader.DEFAULTS = (() => {\r\n const OPTIONS = {\r\n target: '',\r\n title: '',\r\n enterReadingTip: ENTER_READING_TIP,\r\n allowSpeak: false\r\n }\r\n\r\n return cloneDeep(OPTIONS)\r\n})()\r\n\r\nexport default Reader\r\n","import later from './utils/lang/later'\r\nimport cloneDeep from './utils/lang/cloneDeep'\r\nimport isFunction from './utils/types/isFunction'\r\nimport isString from './utils/types/isString'\r\nimport isElement from './utils/types/isElement'\r\nimport addClass from './utils/dom/addClass'\r\nimport scrollTo from './utils/dom/scrollTo'\r\nimport _getScrollElement from './utils/dom/_getScrollElement'\r\n\r\nimport getChapters from './getChapters'\r\n\r\nimport Base from './base'\r\nimport Anchors from './anchors'\r\nimport Drawer from './drawer'\r\nimport Navigator from './navigator'\r\nimport Reader from './reader'\r\nimport Toolbar from './toolbar'\r\n\r\nclass Outline extends Base {\r\n constructor(options) {\r\n super()\r\n\r\n this.version = '3.39.0'\r\n this._default()\r\n\r\n if (options) {\r\n this.initialize(options)\r\n }\r\n }\r\n\r\n _default() {\r\n const options = Outline.DEFAULTS\r\n\r\n this.attrs = cloneDeep(options)\r\n this.$article = null\r\n this.$scrollElement = null\r\n this.buttons = []\r\n\r\n this.anchors = null\r\n this.drawer = null\r\n this.navigator = null\r\n this.reader = null\r\n this.toolbar = null\r\n\r\n return this\r\n }\r\n\r\n initialize(options) {\r\n let articleElement = ''\r\n let scrollElement = ''\r\n let $article = null\r\n\r\n this.attr(options)\r\n\r\n articleElement = this.attr('articleElement')\r\n scrollElement = this.attr('scrollElement')\r\n\r\n if (isString(articleElement)) {\r\n $article = document.querySelector(articleElement)\r\n } else if (isElement(articleElement)) {\r\n $article = articleElement\r\n }\r\n this.$article = $article\r\n this.$scrollElement = _getScrollElement(scrollElement)\r\n\r\n this.$emit('created', { ...this.attr() })\r\n this.render().addListeners()\r\n\r\n return this\r\n }\r\n\r\n isExpanded() {\r\n const position = this.attr('position')\r\n const drawer = this.drawer\r\n const navigator = this.navigator\r\n const count = this.count()\r\n\r\n if (count < 0) {\r\n return false\r\n }\r\n\r\n if (position === 'relative') {\r\n return !drawer.isClosed()\r\n } else {\r\n return !navigator.isClosed()\r\n }\r\n }\r\n\r\n getChapters(isTreeStructured = false) {\r\n const articleElement = this.$article\r\n const selector = this.attr('selector')\r\n const showCode = this.attr('showCode')\r\n const chapterTextFilter = this.attr('chapterTextFilter')\r\n\r\n return getChapters({\r\n articleElement,\r\n selector,\r\n showCode,\r\n chapterTextFilter,\r\n isTreeStructured\r\n })\r\n }\r\n\r\n count() {\r\n return this.getChapters().length\r\n }\r\n\r\n render() {\r\n const hasToolbar = this.attr('hasToolbar')\r\n const $scrollElement = this.$scrollElement\r\n\r\n this._renderReader()._renderAnchors()._renderNavigator()._renderToolbar()\r\n\r\n if ($scrollElement && hasToolbar) {\r\n this.$emit('toolbar:update', {\r\n top: $scrollElement.scrollTop,\r\n min: 0,\r\n max: $scrollElement.scrollHeight\r\n })\r\n }\r\n\r\n this.$emit('mounted')\r\n\r\n return this\r\n }\r\n\r\n _renderReader() {\r\n const option = this.attr('reader')\r\n\r\n if (!option.target) {\r\n return this\r\n }\r\n\r\n addClass(this.$article, 'outline-article')\r\n\r\n this.reader = new Reader(option)\r\n\r\n return this\r\n }\r\n\r\n _renderAnchors() {\r\n const articleElement = this.attr('articleElement')\r\n const selector = this.attr('selector')\r\n const stickyHeight = this.attr('stickyHeight')\r\n const scrollElement = this.attr('scrollElement')\r\n const showCode = this.attr('showCode')\r\n const anchorURL = this.attr('anchorURL')\r\n const afterScroll = this.attr('afterScroll')\r\n const chapterTextFilter = this.attr('chapterTextFilter')\r\n const anchorLinkFilter = this.attr('anchorLinkFilter')\r\n\r\n this.anchors = new Anchors({\r\n articleElement,\r\n stickyHeight,\r\n scrollElement,\r\n selector,\r\n showCode,\r\n anchorURL,\r\n afterScroll,\r\n chapterTextFilter,\r\n anchorLinkFilter\r\n })\r\n\r\n return this\r\n }\r\n\r\n _renderNavigator() {\r\n const title = this.attr('title')\r\n const stickyHeight = this.attr('stickyHeight')\r\n const scrollElement = this.attr('scrollElement')\r\n const customClass = this.attr('customClass')\r\n const showCode = this.attr('showCode')\r\n const animationCurrent = this.attr('animationCurrent')\r\n const closeOnClickModal = this.attr('closeOnClickModal')\r\n const showNavModalFirst = this.attr('showNavModalFirst')\r\n const position = this.attr('position')\r\n const placement = this.attr('placement')\r\n const afterSticky = this.attr('afterSticky')\r\n const afterToggle = this.attr('afterToggle')\r\n const afterScroll = this.attr('afterScroll')\r\n const count = this.count()\r\n let parentElement = this.attr('parentElement')\r\n let OPTIONS\r\n\r\n if (count < 1) {\r\n return this\r\n }\r\n\r\n OPTIONS = {\r\n scrollElement,\r\n showCode,\r\n animationCurrent,\r\n position,\r\n title,\r\n stickyHeight,\r\n chapters: this.getChapters(),\r\n afterSticky,\r\n afterToggle,\r\n afterScroll\r\n }\r\n\r\n if (position === 'relative') {\r\n this.drawer = new Drawer({\r\n placement,\r\n title,\r\n size: 'tiny',\r\n hasOffset: true,\r\n hasPadding: false,\r\n closeOnClickModal,\r\n customClass,\r\n afterClosed: () => {\r\n const toolbar = this.toolbar\r\n toolbar.toggle()\r\n }\r\n })\r\n parentElement = this.drawer.$main\r\n\r\n if (showNavModalFirst) {\r\n this.drawer.open()\r\n }\r\n } else {\r\n OPTIONS.customClass = customClass\r\n }\r\n\r\n OPTIONS.parentElement = parentElement\r\n this.navigator = new Navigator(OPTIONS)\r\n\r\n return this\r\n }\r\n\r\n _renderToolbar() {\r\n const position = this.attr('position')\r\n const hasToolbar = this.attr('hasToolbar')\r\n const showNavModalFirst = this.attr('showNavModalFirst')\r\n const placement = this.attr('placement')\r\n const homepage = this.attr('homepage')\r\n const git = this.attr('git')\r\n const tags = this.attr('tags')\r\n const issues = this.attr('issues')\r\n const tools = this.attr('tools')\r\n const option = this.attr('reader')\r\n const count = this.count()\r\n const UP = {\r\n name: 'up',\r\n icon: 'up',\r\n size: 20,\r\n action: {\r\n context: this,\r\n handler: this.toTop\r\n }\r\n }\r\n const HOME = {\r\n name: 'homepage',\r\n icon: 'homepage',\r\n size: 20,\r\n link: homepage\r\n }\r\n const GIT = {\r\n name: 'github',\r\n icon: 'github',\r\n size: 20,\r\n link: git\r\n }\r\n const TAGS = {\r\n name: 'tags',\r\n icon: 'tags',\r\n size: 20,\r\n link: tags\r\n }\r\n const ISSUES = {\r\n name: 'issues',\r\n icon: 'issues',\r\n size: 20,\r\n link: issues\r\n }\r\n const MENU = {\r\n name: 'toggle',\r\n icon: 'menu',\r\n size: 18,\r\n action: {\r\n context: this,\r\n handler: this.toggle\r\n }\r\n }\r\n const READING = {\r\n name: 'reading',\r\n icon: 'file',\r\n size: 18,\r\n action: {\r\n context: this,\r\n handler: 'toolbar:action:reading'\r\n }\r\n }\r\n const PRINT = {\r\n name: 'print',\r\n icon: 'print',\r\n size: 20,\r\n action: {\r\n handler: 'toolbar:action:print'\r\n }\r\n }\r\n const DOWN = {\r\n name: 'down',\r\n icon: 'down',\r\n size: 20,\r\n action: {\r\n context: this,\r\n handler: this.toBottom\r\n }\r\n }\r\n const buttons = []\r\n\r\n if (!hasToolbar) {\r\n return this\r\n }\r\n\r\n buttons.push(UP)\r\n if (count > 0) {\r\n buttons.push(MENU)\r\n }\r\n if (homepage) {\r\n buttons.push(HOME)\r\n }\r\n if (git) {\r\n buttons.push(GIT)\r\n }\r\n if (tags) {\r\n buttons.push(TAGS)\r\n }\r\n if (issues) {\r\n buttons.push(ISSUES)\r\n }\r\n if (option.target) {\r\n buttons.push(READING)\r\n if (isFunction(print)) {\r\n buttons.push(PRINT)\r\n }\r\n }\r\n if (tools?.length > 0) {\r\n buttons.push(...tools)\r\n }\r\n buttons.push(DOWN)\r\n this.buttons = [...buttons]\r\n\r\n this.toolbar = new Toolbar({\r\n placement,\r\n buttons\r\n })\r\n\r\n if (position === 'relative' && showNavModalFirst) {\r\n this.toolbar.hide()\r\n }\r\n\r\n return this\r\n }\r\n\r\n refresh() {\r\n const chapters = this.getChapters()\r\n\r\n this.$emit('anchors:refresh', chapters)\r\n this.$emit('navigator:refresh', chapters)\r\n this.$emit('reader:refresh')\r\n\r\n this.$emit('refresh', chapters)\r\n\r\n return this\r\n }\r\n\r\n addButton(button) {\r\n const buttons = this.buttons\r\n\r\n buttons.splice(-1, 0, button)\r\n this.$emit('toolbar:add:button', buttons)\r\n\r\n return this\r\n }\r\n\r\n removeButton(name) {\r\n this.$emit('toolbar:remove:button', name)\r\n return this\r\n }\r\n\r\n toTop() {\r\n const afterScroll = this.attr('afterScroll')\r\n const toolbar = this.toolbar\r\n const navigator = this.navigator\r\n const count = this.count()\r\n const afterTop = () => {\r\n toolbar.hide('up')\r\n toolbar.show('down')\r\n\r\n if (count > 0) {\r\n navigator.highlight(0)\r\n navigator.playing = false\r\n scrollTo(navigator.$main, 0)\r\n }\r\n\r\n if (isFunction(afterScroll)) {\r\n afterScroll.call(toolbar, 'up')\r\n }\r\n }\r\n\r\n if (count > 0) {\r\n navigator.playing = true\r\n }\r\n this.scrollTo(0, afterTop)\r\n\r\n return this\r\n }\r\n\r\n toBottom() {\r\n const afterScroll = this.attr('afterScroll')\r\n const $scrollElement = this.$scrollElement\r\n const toolbar = this.toolbar\r\n const navigator = this.navigator\r\n const count = this.count()\r\n const top = Math.floor(\r\n $scrollElement.scrollHeight - $scrollElement.clientHeight\r\n )\r\n const afterDown = () => {\r\n const $main = navigator.$main\r\n toolbar.hide('down')\r\n toolbar.show('up')\r\n\r\n if (count > 0) {\r\n navigator.highlight(count - 1)\r\n scrollTo($main, $main.scrollHeight)\r\n navigator.playing = false\r\n }\r\n\r\n if (isFunction(afterScroll)) {\r\n afterScroll.call(toolbar, 'bottom')\r\n }\r\n }\r\n\r\n if (count > 0) {\r\n navigator.playing = true\r\n }\r\n\r\n this.scrollTo(top, afterDown)\r\n\r\n return this\r\n }\r\n\r\n scrollTo(top, afterScroll) {\r\n scrollTo(this.$scrollElement, top, afterScroll)\r\n return this\r\n }\r\n\r\n enterReading() {\r\n this.$emit('toolbar:toggle')\r\n this.$emit('reader:enter')\r\n\r\n return this\r\n }\r\n\r\n exitReading() {\r\n this.$emit('toolbar:toggle')\r\n this.$emit('reader:exit')\r\n\r\n return this\r\n }\r\n\r\n switchReading() {\r\n this.$emit('toolbar:toggle')\r\n this.$emit('reader:toggle')\r\n\r\n return this\r\n }\r\n\r\n expand() {\r\n const position = this.attr('position')\r\n const toolbar = this.toolbar\r\n const drawer = this.drawer\r\n const navigator = this.navigator\r\n const count = this.count()\r\n\r\n if (count < 1) {\r\n return this\r\n }\r\n\r\n if (position !== 'relative') {\r\n navigator.show()\r\n toolbar.highlight('toggle')\r\n } else {\r\n toolbar.hide()\r\n\r\n later(() => {\r\n drawer.open()\r\n })\r\n }\r\n\r\n return this\r\n }\r\n\r\n collapses() {\r\n const position = this.attr('position')\r\n const toolbar = this.toolbar\r\n const drawer = this.drawer\r\n const navigator = this.navigator\r\n const count = this.count()\r\n\r\n if (count < 1) {\r\n return this\r\n }\r\n\r\n if (position !== 'relative') {\r\n navigator.hide()\r\n toolbar.highlight('toggle')\r\n } else {\r\n toolbar.show()\r\n\r\n later(() => {\r\n drawer.close()\r\n })\r\n }\r\n\r\n return this\r\n }\r\n\r\n toggle() {\r\n if (this.isExpanded()) {\r\n this.collapses()\r\n } else {\r\n this.expand()\r\n }\r\n\r\n return this\r\n }\r\n\r\n print() {\r\n this.$emit('reader:print')\r\n\r\n return this\r\n }\r\n\r\n _destroy() {\r\n const count = this.count()\r\n let anchors = this.anchors\r\n let navigator = this.navigator\r\n let drawer = this.drawer\r\n let reader = this.reader\r\n let toolbar = this.toolbar\r\n let isOutside = false\r\n\r\n this.removeListeners()\r\n\r\n if (reader) {\r\n reader.destroy()\r\n }\r\n\r\n if (count > 0 && navigator) {\r\n isOutside = navigator.isOutside()\r\n\r\n navigator.destroy()\r\n\r\n if (isOutside && drawer) {\r\n drawer.destroy()\r\n }\r\n }\r\n\r\n if (anchors) {\r\n anchors.destroy()\r\n }\r\n\r\n if (toolbar) {\r\n toolbar.destroy()\r\n }\r\n\r\n return this\r\n }\r\n\r\n destroy() {\r\n this.$emit('beforeDestroy')\r\n\r\n this._destroy()._default()\r\n\r\n this.$emit('destroyed')\r\n\r\n return this\r\n }\r\n\r\n addListeners() {\r\n const hasToolbar = this.attr('hasToolbar')\r\n\r\n if (!hasToolbar) {\r\n return this\r\n }\r\n\r\n this.$on('toolbar:update', this.onToolbarUpdate)\r\n\r\n return this\r\n }\r\n\r\n removeListeners() {\r\n const hasToolbar = this.attr('hasToolbar')\r\n\r\n if (!hasToolbar) {\r\n return this\r\n }\r\n\r\n this.$off('toolbar:update')\r\n\r\n return this\r\n }\r\n}\r\n\r\nOutline.DEFAULTS = (() => {\r\n const OPTIONS = {\r\n articleElement: '#article',\r\n selector: 'h2,h3,h4,h5,h6',\r\n parentElement: '#aside',\r\n scrollElement: 'html,body',\r\n title: '目录',\r\n position: 'relative',\r\n placement: 'rtl',\r\n animationCurrent: true,\r\n showCode: false,\r\n hasToolbar: true,\r\n closeOnClickModal: true,\r\n showNavModalFirst: false,\r\n anchorURL: '',\r\n stickyHeight: 0,\r\n homepage: '',\r\n git: '',\r\n tags: '',\r\n issues: '',\r\n tools: [],\r\n reader: {\r\n target: '',\r\n title: '',\r\n enterReadingTip: '进入阅读模式,按 ESC 键可退出阅读模式',\r\n allowSpeak: false\r\n },\r\n customClass: '',\r\n afterSticky: null,\r\n afterToggle: null,\r\n afterScroll: null,\r\n chapterTextFilter: null,\r\n anchorLinkFilter: null\r\n }\r\n\r\n return cloneDeep(OPTIONS)\r\n})()\r\n\r\nif (window?.jQuery) {\r\n const $ = window.jQuery\r\n\r\n // 将 Outline 扩展为一个 jquery 插件\r\n // eslint-disable-next-line no-undef\r\n $.extend($.fn, {\r\n outline: function (options) {\r\n // eslint-disable-next-line no-undef\r\n let $article = $(this)\r\n\r\n return new Outline(\r\n // eslint-disable-next-line no-undef\r\n $.extend({}, options, {\r\n articleElement: $article\r\n })\r\n )\r\n }\r\n })\r\n}\r\n\r\nexport default Outline\r\n"],"names":["toString","val","Object","prototype","apply","isFunction","later","fn","delay","setTimeout","isObject","o","isArray","Array","cloneDeep","obj","clone","from","assign","keys","forEach","key","isString","str","isElement","nodeName","tagName","nodeType","hasClass","el","className","pattern","RegExp","allClass","classList","contains","exec","addClass","_classList","add","indexOf","split","name","length","easeInQuad","x","_getScrollElement","scrollElement","$rootElements","$scrollElement","document","querySelector","querySelectorAll","scrollTop","scrollTo","top","afterStop","step","distance","MAX_HEIGHT","scrollHeight","MAX_TOP","stop","play","console","log","requestAnimationFrame","trim","replace","getChaptersByHeadings","headings","showCode","chapterTextFilter","chapters","previous","level","text","heading","i","headingLevel","current","parseInt","pid","_getChapterParentIdByDiffer","differ","index","innerHTML","push","id","rel","groups","group","JSON","stringify","cb","code","String","c","subjects","_getChaptersWithCode","getChapters","options","articleElement","selector","isTreeStructured","$article","$headings","filter","_maybeArrayLike","_toConsumableArray","toTree","list","nodeKey","parentKey","map","roots","item","children","node","hasOwn","prop","hasOwnProperty","call","extend","origin","source","_subscribers","_hasDirectSubscribersFor","topic","has","isDirect","found","position","lastIndexOf","substring","_hasSubscribers","emit","data","async","execute","subscriber","message","callback","context","deliver","guid","uuid","prefix","_removeSubscriber","off","token","subject","execution","j","splice","_removeSubscriberByToken","Base","constructor","this","attrs","initialize","attr","render","addListeners","value","arguments","refresh","destroy","removeListeners","reload","$emit","event","publish","$on","on","handler","subscribe","$off","unsubscribe","queue","isHandling","done","runIdle","idleDeadline","timeRemaining","shift","requestIdleCallback","window","start","Date","now","didTimeout","Math","max","cancelIdleCallback","clearTimeout","timeSlice","afterComplete","offsetTop","offsetParent","matches","sel","msMatchesSelector","getParentOrHost","host","parentNode","CAPTURE_EVENTS","_off","type","capture","_delegateListener","listeners","_listeners","listener","_delete","removeEventListener","purgeElement","recurse","$element","$children","childNodes","getListeners","$child","once","evt","target","getTarget","delegateTarget","closest","ctx","includeCTX","startsWith","overrideContext","addEventListener","stopPropagation","preventDefault","SYMBOLS","getSymbols","iconSet","getSymbol","patternName","patternSet","find","symbol","fullName","paint","$body","body","$icons","symbols","join","createElement","insertBefore","firstChild","isDOM","isHTMLCollection","fragment","isTextNode","setAttribute","toLowerCase","style","cssText","innerText","setAttributes","$fragment","createDocumentFragment","$el","isValidChild","child","append","createTextNode","appendChild","every","ICON","size","color","width","height","defaultRules","cssRules","$icon","$svg","binds","svg","test","isSVG","xmlns","class","icon","removeClass","remove","_removeHeading","$heading","hasAnchor","isAtStart","CLS_HEADING","$anchor","removeAttribute","removeChild","Anchors","super","_default","DEFAULTS","$articleElement","created","getHeadings","count","mounted","_paint","erase","_remove","LIMIT","anchorURL","anchorLinkFilter","update","chapterCode","_updateHeading","headingId","url","href","groupIndex","after","beforeDestroy","afterDestroy","onAnchorTrigger","afterScroll","stickyHeight","clientHeight","min","onRefresh","TAGS","isHTML","html","basic","full","slice","tag","stripScripts","setProperty","documentElement","zIndex","idx","Drawer","title","closed","$modal","$header","$title","$close","$main","$footer","$overlay","setTitle","isClosed","placement","hasClose","hasOverlay","hasOffset","hasPadding","autoHeight","overflow","customClass","mainClassName","content","$content","strHTML","template","open","opened","close","toggle","afterToggle","onClose","closeOnClickModal","afterClosed","afterOpened","at","getStyle","ruleName","getComputedStyle","HIDDEN","EXPANDED","FOLDED","Navigator","scrollTimer","resizeTimer","observerTimer","Observer","$list","$placeholder","$parentElement","$active","active","offsetWidth","playing","parentElement","$parent","isSticky","isFixed","isInside","isOutside","_paintEdge","animationCurrent","contents","calculateStickyHeight","highlight","sticky","onObserver","_paintChapters","clones","parts","byId","chapter","$text","$link","$code","$li","$subject","$chapter","_getPlaceholderOffset","mainPaddingTop","mainBorderTop","placeholderPaddingTop","placeholderMarginTop","placeholderBorderTop","offsetHeight","positionPlaceholder","ACTIVE","HIGHLIGHT","placeholderOffsetTop","getAttribute","inBounding","parent","parentRect","childRect","isInBounding","getBoundingClientRect","right","bottom","left","afterSticky","FIXED","isStickying","innerHeight","show","hide","intersection","props","root","rootMargin","IntersectionObserver","entries","entry","intersectionRatio","$root","section","observe","onSelect","onScroll","onResize","unobserve","isPlainObject","getPrototypeOf","proto","isObjectLike","encodeHTML","CHARTS","instances","instance","Message","visible","offset","timer","destroyed","_objectSpread","isDestroyed","_getClassName","effect","round","closable","dangerouslyUseHTMLString","$type","$message","iconSize","_refreshIcon","iconName","$use","_refreshMessage","_refreshClose","_refreshEl","clearTimer","startTimer","duration","destroyAfterClosed","beforeClose","onMouseEnter","onMouseLeave","config","len","dom","clear","Command","action","Commands","commands","get","cmd","command","del","_createButton","button","rounded","link","$button","disabled","DISABLED","Toolbar","buttons","isHighlight","isDisabled","isExist","_getCommand","_self","bind","disable","_add","_disable","_enable","enable","enabled","onExecute","_updateToolbar","ceil","onToolbarUpdate","onAddButton","onRemoveButton","afterDisabled","afterEnabled","Speech","utterance","SpeechSynthesisUtterance","_initialize","lang","setLang","pitch","setPitch","rate","setRate","setText","voice","setVoice","volume","setVolume","_addListeners","isSpeaking","speechSynthesis","speaking","isPending","pending","isPaused","paused","getVoices","speak","pause","resume","cancel","speech","onvoiceschanged","isSupport","_updateSiblingElements","siblingElement","isPrev","$sibling","previousElementSibling","nextElementSibling","isMobile","ua","navigator","userAgent","ENTER_READING_TIP","Reader","reading","$target","$paper","$progress","toolbar","_this$speech","_renderEdge","cloneNode","_animateTimeline","ScrollTimeline","animate","scale","timeline","axis","print","exit","enter","READER","READING","$siblings","enterReadingTip","info","SPEAK","onPrint","onEnterReading","onExitReading","keyCode","allowSpeak","Outline","version","anchors","drawer","reader","isExpanded","hasToolbar","_renderReader","_renderAnchors","_renderNavigator","_renderToolbar","option","showNavModalFirst","OPTIONS","homepage","git","tags","issues","tools","UP","toTop","HOME","GIT","ISSUES","MENU","PRINT","DOWN","toBottom","concat","addButton","removeButton","afterTop","floor","afterDown","enterReading","exitReading","switchReading","expand","collapses","_destroy","_window","jQuery","$","outline"],"mappings":"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kB,YAAa,KACbH,cAAe,KACfC,aAAc,KACd3P,kBAAmB,KACnBiP,iBAAkB,OE7TtB,MAAMiB,GAAO,CACX,IACA,OACA,UACA,OACA,UACA,QACA,QACA,IACA,OACA,MACA,MACA,aACA,OACA,KACA,SACA,SACA,UACA,OACA,OACA,MACA,WACA,OACA,WACA,KACA,MACA,UACA,MACA,SACA,MACA,KACA,KACA,KACA,QACA,WACA,aACA,SACA,SACA,OACA,KACA,KACA,KACA,KACA,KACA,KACA,OACA,SACA,SACA,KACA,OACA,IACA,SACA,MACA,QACA,MACA,MACA,QACA,SACA,KACA,OACA,OACA,MACA,OACA,OACA,OACA,WACA,OACA,QACA,MACA,WACA,SACA,KACA,WACA,SACA,SACA,IACA,QACA,UACA,MACA,WACA,IACA,KACA,KACA,KACA,MACA,OACA,IACA,OACA,SACA,SACA,UACA,SACA,OACA,QACA,SACA,OACA,SACA,QACA,MACA,UACA,MACA,MACA,QACA,QACA,KACA,WACA,WACA,QACA,KACA,QACA,OACA,QACA,KACA,QACA,IACA,KACA,MACA,QACA,OCzGIC,GAAUpT,IACd,IAAIqT,EACAC,EACAC,EAEJ,QAAKxT,EAASC,KAKdqT,EAAOzQ,EAAK5C,GAAKwT,MAAM,EAAG,KAC1BF,EAAQ,4DACRC,EAAO,IAAI9S,OAAO0S,GAAKxN,KAAK8N,GAAQ,IAAIA,eAAgBtF,KAAK,KAAM,KAE5DmF,EAAMjD,KAAKgD,IAASE,EAAKlD,KAAKgD,GAAK,ECtBtCK,GAAgB1T,GACbA,EAAI6C,QAAQ,+BAAgC,ICP/C8Q,GAAcA,CAAC1N,EAAM4C,KACDlH,SAASiS,gBACjB/E,MAAM8E,YAAY1N,EAAM4C,EAAM,ECAhD,IAAI/E,GAAQ,IAEZ,MAAM+P,GAAUC,IACVA,EACFhQ,GAAQgQ,EAERhQ,IAAS,EAGX6P,GAAY,mBAAoB,GAAG7P,MAE5BA,ICKT,MAAMiQ,WAAe1L,EACnBC,WAAAA,CAAYxD,GACVuM,QAEA9I,KAAK+I,WAEL/I,KAAKsL,OAAS,EAEV/O,GACFy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"} \ No newline at end of file +{"version":3,"file":"outline.min.js","sources":["utils/lang/toString.js","utils/types/isFunction.js","utils/lang/later.js","utils/types/isObject.js","utils/types/isArray.js","utils/lang/cloneDeep.js","utils/types/isString.js","utils/types/isElement.js","utils/dom/hasClass.js","utils/dom/addClass.js","utils/lang/easeInQuad.js","utils/dom/scrollTo.js","navigator/utils/_getScrollElement.js","utils/dom/getScrollElement.js","utils/lang/trim.js","chapters/getChaptersByHeadings.js","utils/lang/stripTags.js","chapters/_getChapterParentIdByDiffer.js","chapters/_getChaptersWithCode.js","chapters/getChapters.js","utils/lang/toTree.js","utils/lang/hasOwn.js","utils/lang/extend.js","utils/observer/_subscribers.js","utils/observer/_hasDirectSubscribersFor.js","utils/observer/has.js","utils/observer/_hasSubscribers.js","utils/observer/emit.js","utils/types/isTypedArray.js","utils/lang/guid.js","utils/observer/_removeSubscriber.js","utils/observer/off.js","utils/observer/_removeSubscriberByToken.js","component.js","utils/observer/on.js","utils/lang/timeSlice.js","utils/dom/offsetTop.js","utils/dom/matches.js","utils/dom/getParentOrHost.js","utils/event/enum.js","utils/event/_off.js","utils/event/_delete.js","utils/event/purgeElement.js","utils/event/getListeners.js","utils/event/off.js","utils/event/on.js","utils/event/getTarget.js","utils/dom/resolveTextNode.js","utils/dom/closest.js","utils/event/stop.js","utils/icons/symbols.js","utils/icons/defaults.js","utils/icons/getSymbols.js","utils/icons/getSymbol.js","utils/icons/paint.js","utils/icons/add.js","utils/types/isDOM.js","utils/types/isHTMLCollection.js","utils/types/isFragment.js","utils/types/isTextNode.js","utils/dom/setAttribute.js","utils/dom/setAttributes.js","utils/dom/createElement.js","utils/icons/createElement.js","utils/types/isSVG.js","utils/icons/icon.js","utils/dom/removeClass.js","anchors/utils/_removeHeading.js","utils/types/isEmpty.js","anchors/anchors.js","anchors/utils/_updateHeading.js","utils/types/tags.js","utils/types/isHTML.js","utils/lang/stripScripts.js","utils/dom/setProperty.js","utils/dom/zIndex.js","drawer/drawer.js","utils/dom/html.js","utils/event/at.js","utils/dom/getStyle.js","navigator/navigator.js","navigator/utils/_paintChapters.js","utils/dom/inBounding.js","utils/dom/intersection.js","utils/dom/isMobile.js","utils/types/isPlainObject.js","utils/types/isObjectLike.js","utils/lang/encodeHTML.js","message/message.js","command.js","commands.js","toolbar/utils/_createButton.js","toolbar/toolbar.js","speech.js","reader/utils/_updateSiblingElements.js","reader/reader.js","outline.js"],"sourcesContent":["/**\r\n * Object 对象原型上的 toString 方法\r\n * ========================================================================\r\n * @method toString\r\n * @param {*} val\r\n * @returns {string}\r\n */\r\nconst toString = (val) => {\r\n return Object.prototype.toString.apply(val)\r\n}\r\n\r\nexport default toString\r\n","import toString from '@/utils/lang/toString'\r\n\r\n/**\r\n * 检测测试数据是否为 Function 类型\r\n * ========================================================================\r\n * @method isFunction\r\n * @param {*} val - (必须)待检测的数据\r\n * @returns {boolean} 'val' 是 Function 类型返回 true,否则返回 false\r\n */\r\nconst isFunction = (val) => {\r\n return typeof val === 'function' || toString(val) === '[object Function]'\r\n}\r\n\r\nexport default isFunction\r\n","import isFunction from '@/utils/types/isFunction'\r\n\r\n/**\r\n * later - 延迟执行方法\r\n * ========================================================================\r\n * @method later\r\n * @param {Function} fn\r\n * @param {Number} [delay]\r\n * @returns {number|boolean}\r\n */\r\nconst later = (fn, delay = 300) => {\r\n if (!isFunction(fn)) {\r\n return false\r\n }\r\n\r\n return setTimeout(() => {\r\n fn()\r\n }, delay)\r\n}\r\n\r\nexport default later\r\n","import toString from '../lang/toString'\r\nimport isFunction from './isFunction'\r\n\r\n/**\r\n * 检测数据是否为 Object 类型\r\n * ========================================================================\r\n * @method isObject\r\n * @param {*} o\r\n * @returns {boolean}\r\n */\r\nconst isObject = (o) => {\r\n return (\r\n (toString(o) === '[object Object]' ||\r\n typeof o === 'object' ||\r\n isFunction(o)) &&\r\n o !== null\r\n )\r\n}\r\n\r\nexport default isObject\r\n","import toString from '@/utils/lang/toString'\r\n\r\n/**\r\n * 检测数据是否为 Array 类型\r\n * ========================================================================\r\n * @method isArray\r\n * @param {*} o\r\n * @returns {boolean}\r\n */\r\nconst isArray = (o) => {\r\n if (Array.isArray) {\r\n return Array.isArray(o)\r\n } else {\r\n return toString(o) === '[object Array]'\r\n }\r\n}\r\n\r\nexport default isArray\r\n","import isObject from '@/utils/types/isObject'\r\nimport isArray from '@/utils/types/isArray'\r\n\r\n/**\r\n * 深拷贝对象函数\r\n * ========================================================================\r\n * @methods cloneDeep\r\n * @param {Object} obj - 深拷贝的对象\r\n * @returns {Array|Object|*}\r\n *\r\n * @example\r\n * const arr = cloneDeep([2,3,4,6])\r\n * => [2,3,4,6]\r\n */\r\nconst cloneDeep = (obj) => {\r\n let clone = {}\r\n\r\n if (obj === null) {\r\n return null\r\n }\r\n\r\n if (isArray(obj)) {\r\n clone = Array.from(obj)\r\n } else {\r\n clone = Object.assign({}, obj)\r\n Object.keys(clone).forEach((key) => {\r\n return (clone[key] = isObject(obj[key]) ? cloneDeep(obj[key]) : obj[key])\r\n })\r\n }\r\n\r\n return clone\r\n}\r\n\r\nexport default cloneDeep\r\n","/**\r\n * 检测数据是否为 String 类型\r\n * ========================================================================\r\n * @method isArray\r\n * @param {*} str\r\n * @returns {boolean}\r\n */\r\nconst isString = (str) => {\r\n return typeof str === 'string'\r\n}\r\n\r\nexport default isString\r\n","import isObject from './isObject'\r\n\r\n/**\r\n * 检测数据是否为 HTMLElement DOM 节点\r\n * ========================================================================\r\n * @method isElement\r\n * @param {*} o\r\n * @returns {boolean}\r\n */\r\nconst isElement = (o) => {\r\n return !!(isObject(o) && o.nodeName && o.tagName && o.nodeType === 1)\r\n}\r\n\r\nexport default isElement\r\n","import isElement from '../types/isElement'\r\n/**\r\n * 检测 DOM 节点是否包含名为 className 的样式\r\n * ========================================================================\r\n * @method hasClass\r\n * @param {HTMLElement} el - DOM 节点\r\n * @param {String} className - 样式名称\r\n * @returns {Boolean}\r\n */\r\nconst hasClass = (el, className) => {\r\n const pattern = new RegExp('(\\\\s|^)' + className + '(\\\\s|$)')\r\n let allClass\r\n let classList\r\n\r\n if (!isElement(el)) {\r\n return false\r\n }\r\n\r\n allClass = el.className\r\n\r\n if (!allClass) {\r\n return false\r\n }\r\n\r\n classList = el.classList\r\n\r\n if (classList && classList.contains) {\r\n return el.classList.contains(className)\r\n }\r\n\r\n return !!pattern.exec(allClass)\r\n}\r\n\r\nexport default hasClass\r\n","import hasClass from './hasClass'\r\n\r\n/**\r\n * 给 DOM 节点添加名为 className 的样式\r\n * ========================================================================\r\n * @method addClass\r\n * @param {HTMLElement} el - DOM 节点\r\n * @param {String} className - 样式名称\r\n * @returns {Boolean}\r\n */\r\nconst addClass = (el, className) => {\r\n let classList\r\n let allClass\r\n\r\n if (hasClass(el, className)) {\r\n return false\r\n }\r\n\r\n classList = el.classList\r\n\r\n if (classList?.add) {\r\n if (className.indexOf(' ') > -1) {\r\n className.split(' ').forEach((name) => {\r\n classList.add(name)\r\n })\r\n } else {\r\n classList.add(className)\r\n }\r\n } else {\r\n allClass = el.className\r\n allClass += allClass.length > 0 ? ' ' + className : className\r\n el.className = allClass\r\n }\r\n}\r\n\r\nexport default addClass\r\n","/**\r\n * 返回给定值的平方值\r\n * ========================================================================\r\n * @method easeInQuad\r\n * @param {Number} x\r\n * @returns {number}\r\n */\r\nconst easeInQuad = (x) => {\r\n return x * x\r\n}\r\n\r\nexport default easeInQuad\r\n","import easeInQuad from '../lang/easeInQuad'\r\nimport isFunction from '../types/isFunction'\r\nimport _getScrollElement from '../../navigator/utils/_getScrollElement'\r\n\r\n/**\r\n * 指定 rootElement DOM 节点滚动到指定 top 位置\r\n * ========================================================================\r\n * @method scrollTo\r\n * @param {HTMLElement|Object} [scrollElement] - (必须)要滚动的 DOM 节点\r\n * @param {Number} top - (必须)滚动的 scrollTop 数值\r\n * @param {Function} [afterStop] - (可选)滚动完成的回调函数\r\n */\r\nconst scrollTo = (scrollElement, top, afterStop) => {\r\n const $scrollElement = _getScrollElement(scrollElement)\r\n let scrollTop = $scrollElement.scrollTop\r\n let step = 0\r\n const distance = top - scrollTop\r\n const MAX_HEIGHT = $scrollElement.scrollHeight\r\n const MAX_TOP = top - MAX_HEIGHT <= 0 ? top : MAX_HEIGHT\r\n const stop = (top) => {\r\n if (isFunction(afterStop)) {\r\n afterStop(top)\r\n }\r\n\r\n return false\r\n }\r\n const play = () => {\r\n step += 1\r\n\r\n // 向上滚动\r\n if (distance < 0) {\r\n scrollTop -= easeInQuad(step)\r\n $scrollElement.scrollTop = scrollTop\r\n\r\n if (scrollTop <= top) {\r\n $scrollElement.scrollTop = top\r\n return stop(top)\r\n }\r\n } else {\r\n scrollTop += easeInQuad(step)\r\n $scrollElement.scrollTop = scrollTop\r\n\r\n if (scrollTop >= MAX_TOP) {\r\n $scrollElement.scrollTop = MAX_TOP\r\n return stop(MAX_TOP)\r\n }\r\n }\r\n\r\n // eslint-disable-next-line compat/compat\r\n requestAnimationFrame(play)\r\n }\r\n\r\n // eslint-disable-next-line compat/compat\r\n requestAnimationFrame(play)\r\n}\r\n\r\nexport default scrollTo\r\n","import isString from '../../utils/types/isString'\r\nimport isElement from '../../utils/types/isElement'\r\n\r\n/**\r\n * 通过给的 scrollElement 参数,获取滚动 DOM 元素\r\n * ========================================================================\r\n * @method _getScrollElement\r\n * @param {String|HTMLElement} scrollElement\r\n * @returns {Element}\r\n * @private\r\n */\r\nconst _getScrollElement = (scrollElement = null) => {\r\n let $rootElements\r\n let $scrollElement\r\n\r\n if (!scrollElement) {\r\n $rootElements = document.querySelectorAll('html,body')\r\n $scrollElement =\r\n $rootElements[0].scrollTop - $rootElements[1].scrollTop >= 0\r\n ? $rootElements[0]\r\n : $rootElements[1]\r\n } else {\r\n if (isString(scrollElement)) {\r\n $scrollElement = document.querySelector(scrollElement)\r\n } else if (isElement(scrollElement)) {\r\n $scrollElement = scrollElement\r\n }\r\n }\r\n\r\n return $scrollElement\r\n}\r\n\r\nexport default _getScrollElement\r\n","import isString from '../types/isString'\r\nimport isElement from '../types/isElement'\r\n\r\n/**\r\n * 通过给的 scrollElement 参数,获取滚动 DOM 元素\r\n * ========================================================================\r\n * @method getScrollElement\r\n * @param {String|HTMLElement} scrollElement\r\n * @returns {Element}\r\n * @private\r\n */\r\nconst getScrollElement = (scrollElement = null) => {\r\n let $rootElements\r\n let $scrollElement\r\n\r\n if (!scrollElement) {\r\n $rootElements = document.querySelectorAll('html,body')\r\n $scrollElement =\r\n $rootElements[0].scrollTop - $rootElements[1].scrollTop >= 0\r\n ? $rootElements[0]\r\n : $rootElements[1]\r\n } else {\r\n if (isString(scrollElement)) {\r\n $scrollElement = document.querySelector(scrollElement)\r\n } else if (isElement(scrollElement)) {\r\n $scrollElement = scrollElement\r\n }\r\n }\r\n\r\n return $scrollElement\r\n}\r\n\r\nexport default getScrollElement\r\n","import isString from '@/utils/types/isString'\r\n\r\n/**\r\n * 清楚字符串起始位置所有的空格\r\n * ========================================================================\r\n * @method trim\r\n * @param {string} str\r\n * @returns {string|Boolean}\r\n */\r\nconst trim = (str) => {\r\n if (!isString(str)) {\r\n return false\r\n }\r\n return str.replace(/(^\\s+)|(\\s+$)/g, '')\r\n}\r\n\r\nexport default trim\r\n","import trim from '../utils/lang/trim'\r\nimport stripTags from '../utils/lang/stripTags'\r\nimport isFunction from '../utils/types/isFunction'\r\n\r\nimport _getChapterParentIdByDiffer from './_getChapterParentIdByDiffer'\r\nimport _getChaptersWithCode from './_getChaptersWithCode'\r\n\r\n/**\r\n * 根据文章中的 h1~h6 标签,自动分析返回文章章节数据\r\n * ========================================================================\r\n * @method getChaptersByHeadings\r\n * @param {Array} headings\r\n * @param {Boolean} [showCode]\r\n * @param {Function} [chapterTextFilter]\r\n * @return {*|*[]}\r\n */\r\nconst getChaptersByHeadings = (\r\n headings,\r\n showCode = false,\r\n chapterTextFilter = null\r\n) => {\r\n const pattern = /^\\d(\\.|(\\.\\d+)*)\\s?/gi\r\n const chapters = []\r\n let previous = 1\r\n let level = 0\r\n let text = ''\r\n\r\n headings.forEach((heading, i) => {\r\n const tagName = heading.tagName\r\n const headingLevel = tagName.replace(/h/i, '')\r\n let current = parseInt(headingLevel, 10)\r\n let pid = -1\r\n\r\n // 场景1:当前标题是前一个标题的子标题\r\n // 当前标题的(标题标签)序号 > 前一个标题的序号:两个相连的标题是父标题 -> 子标题关系;\r\n // h2 (前一个标题)\r\n // h3 (当前标题)\r\n if (current > previous) {\r\n level += 1\r\n\r\n // 第一层级的 pid 是 -1\r\n if (level === 1) {\r\n pid = -1\r\n } else {\r\n pid = i - 1\r\n }\r\n }\r\n // 场景2:当前标题和前一个标题层级相同\r\n // 当前标题的(标题标签)序号 = 前一个标题的序号\r\n // h2 (前一个标题)\r\n // h2 (当前标题)\r\n // 当前标题的(标题标签)序号 < 前一个标题的序号,并且当前标题序号 > 当前的级别\r\n // h2\r\n // h4 (前一个标题)\r\n // h3 (当前标题:这种情况我们还是任务 h3 是 h2 的下一级章节)\r\n else if (current === previous || (current < previous && current > level)) {\r\n // H1 的层级肯定是 1\r\n if (current === 1) {\r\n level = 1\r\n pid = -1\r\n } else {\r\n pid = chapters[i - 1].pid\r\n }\r\n }\r\n // 场景3:当前标题比前一个标题层级高\r\n else if (current <= level) {\r\n // H1 的层级肯定是 1\r\n if (current === 1) {\r\n level = 1\r\n } else {\r\n level = level - (previous - current)\r\n\r\n if (level <= 1) {\r\n level = 1\r\n }\r\n }\r\n\r\n // 第一级的标题\r\n if (level === 1) {\r\n pid = -1\r\n } else {\r\n // 通过当前标题和前一个标题之间的等级差,获得当前标题的父标题ID\r\n pid = _getChapterParentIdByDiffer(chapters, previous - current, i)\r\n }\r\n }\r\n\r\n previous = current\r\n\r\n text = trim(stripTags(heading.innerHTML))\r\n\r\n // 如果自动生成章节编号,则去掉标题中自带的编号文本\r\n if (showCode) {\r\n text = trim(text.replace(pattern, ''))\r\n }\r\n\r\n if (isFunction(chapterTextFilter)) {\r\n text = chapterTextFilter(text)\r\n }\r\n\r\n chapters.push({\r\n id: i,\r\n pid: pid,\r\n level: level,\r\n rel: `heading-${i}`,\r\n text,\r\n tagName\r\n })\r\n })\r\n\r\n return showCode ? _getChaptersWithCode(chapters) : chapters\r\n}\r\n\r\nexport default getChaptersByHeadings\r\n","import isString from '@/utils/types/isString'\r\n\r\n/**\r\n * 过滤所有 HTML 标签\r\n * ========================================================================\r\n * @method stripTags\r\n * @param {string} str\r\n * @returns {string}\r\n */\r\nconst stripTags = (str) => {\r\n if (!isString(str)) {\r\n return ''\r\n }\r\n return str.replace(/<\\/?[^>]+(>|$)/g, '')\r\n}\r\n\r\nexport default stripTags\r\n","const _getChapterParentIdByDiffer = (chapters, differ, index) => {\r\n let previous = chapters[index - 1]\r\n let pid\r\n let i\r\n\r\n for (i = 0; i < differ; i += 1) {\r\n pid = previous.pid\r\n previous = chapters[pid]\r\n }\r\n\r\n pid = previous.pid\r\n\r\n return pid\r\n}\r\n\r\nexport default _getChapterParentIdByDiffer\r\n","import isArray from '../utils/types/isArray'\r\n\r\nconst _getChaptersWithCode = (chapters) => {\r\n const groups = {}\r\n const cb = (o) => {\r\n return [o.pid]\r\n }\r\n\r\n chapters.forEach((o) => {\r\n const group = JSON.stringify(cb(o))\r\n\r\n groups[group] = groups[group] || []\r\n groups[group].push(o)\r\n\r\n o.index = groups[group].length\r\n\r\n if (o.pid === -1) {\r\n o.code = String(o.index)\r\n }\r\n })\r\n\r\n Object.keys(groups).forEach((group) => {\r\n groups[group].forEach((c) => {\r\n const subjects = groups[`[${c.id}]`]\r\n\r\n if (!subjects || !isArray(subjects)) {\r\n return false\r\n }\r\n\r\n subjects.forEach((o) => {\r\n o.code = c.code + '.' + o.index\r\n })\r\n })\r\n })\r\n\r\n return chapters\r\n}\r\n\r\nexport default _getChaptersWithCode\r\n","import isString from '../utils/types/isString'\r\nimport isFunction from '../utils/types/isFunction'\r\nimport isElement from '../utils/types/isElement'\r\nimport toTree from '../utils/lang/toTree'\r\n\r\nimport getChaptersByHeadings from './getChaptersByHeadings'\r\n\r\n/**\r\n *\r\n * @param {Object} [options]\r\n * @param {String|HTMLElement} [options.articleElement]\r\n * @param {String} [options.selector]\r\n * @param {Boolean} [options.showCode]\r\n * @param {Function} [options.chapterTextFilter]\r\n * @param {Boolean} [options.isTreeStructured]\r\n * @returns {Array}\r\n */\r\nconst getChapters = (options) => {\r\n const {\r\n articleElement,\r\n selector,\r\n showCode,\r\n chapterTextFilter,\r\n isTreeStructured\r\n } = options\r\n let $article = document.querySelector('#article')\r\n let $headings = []\r\n let chapters = []\r\n let filter = null\r\n\r\n if (isString(articleElement)) {\r\n $article = document.querySelector(articleElement)\r\n } else if (isElement(articleElement)) {\r\n $article = articleElement\r\n }\r\n\r\n if (!$article) {\r\n return chapters\r\n }\r\n\r\n if (isFunction(chapterTextFilter)) {\r\n filter = chapterTextFilter\r\n } else {\r\n if (chapterTextFilter === true) {\r\n filter = (text) => {\r\n return text.replace(/\\(.*?\\)/, '()')\r\n }\r\n }\r\n }\r\n\r\n $headings = [...$article.querySelectorAll(selector || 'h1,h2,h3,h4,h5,h6')]\r\n chapters = getChaptersByHeadings($headings, showCode, filter)\r\n\r\n return isTreeStructured === true ? toTree(chapters, 'id', 'pid') : chapters\r\n}\r\n\r\nexport default getChapters\r\n","const toTree = (list, nodeKey, parentKey) => {\r\n const map = {}\r\n const roots = []\r\n\r\n list.forEach((item, i) => {\r\n // initialize the map\r\n map[item[nodeKey]] = i\r\n // initialize the children\r\n item.children = []\r\n })\r\n\r\n list.forEach((item) => {\r\n const node = list[map[item[parentKey]]]\r\n\r\n if (item[parentKey] !== -1) {\r\n // if you have dangling branches check that map[node.parentId] exists\r\n node.children.push(item)\r\n } else {\r\n roots.push(item)\r\n }\r\n })\r\n\r\n return roots\r\n}\r\n\r\nexport default toTree\r\n","/**\r\n * 检测对象自身属性中是否具有指定的属性。\r\n * ========================================================================\r\n * @method hasOwn\r\n * @param {Object} obj - (必须)检测的目标对象\r\n * @param {String} prop - (必须)属性名\r\n * @returns {Boolean}\r\n */\r\nconst hasOwn = (obj, prop) => {\r\n const hasOwnProperty = Object.prototype.hasOwnProperty\r\n return obj && hasOwnProperty.call(obj, prop)\r\n}\r\n\r\nexport default hasOwn\r\n","import hasOwn from './hasOwn'\r\n\r\n/**\r\n * 扩展对象\r\n * ========================================================================\r\n * @method extend\r\n * @param {Object} origin\r\n * @param {Object} source\r\n */\r\nconst extend = (origin, source) => {\r\n const keys = Object.keys(source)\r\n\r\n keys.forEach((prop) => {\r\n if (hasOwn(source, prop)) {\r\n origin[prop] = source[prop]\r\n }\r\n })\r\n}\r\n\r\nexport default extend\r\n","/**\r\n * 存储订阅者(主题和处理器的)私有对象\r\n * ========================================================================\r\n * @type {{}}\r\n * @private\r\n */\r\nconst _subscribers = {}\r\n\r\nexport default _subscribers\r\n","import hasOwn from '@/utils/lang/hasOwn'\r\nimport _subscribers from './_subscribers'\r\n\r\n/**\r\n * 判断是否存在与给定 topic 完全匹配的订阅者信息\r\n * ========================================================================\r\n * @method _hasDirectSubscribersFor\r\n * @param {String} topic - (必须)订阅主题字符串\r\n * @returns {Boolean}\r\n */\r\nconst _hasDirectSubscribersFor = (topic) => {\r\n return hasOwn(_subscribers, topic) && _subscribers[topic].length > 0\r\n}\r\n\r\nexport default _hasDirectSubscribersFor\r\n","import _hasDirectSubscribersFor from './_hasDirectSubscribersFor'\r\nimport _hasSubscribers from './_hasSubscribers'\r\n\r\n/**\r\n * 判断是否存在包含 topic 指定的订阅者信息\r\n * ========================================================================\r\n * @method has\r\n * @param {String} topic - (必须)主题名称\r\n * @param {Boolean} [isDirect] - (可选)是否为直接的主题,默认值:true\r\n * @returns {Boolean}\r\n */\r\nconst has = (topic, isDirect = true) => {\r\n return isDirect ? _hasDirectSubscribersFor(topic) : _hasSubscribers(topic)\r\n}\r\n\r\nexport default has\r\n","import _hasDirectSubscribersFor from './_hasDirectSubscribersFor'\r\n\r\n/**\r\n * 判断是否存在包含给定 topic 相关的订阅者信息\r\n * ========================================================================\r\n * @method _hasSubscribers\r\n * @param {String} topic - (必须)订阅主题字符串\r\n * @returns {Boolean}\r\n */\r\nconst _hasSubscribers = (topic) => {\r\n let found = _hasDirectSubscribersFor(topic)\r\n let position = topic.lastIndexOf('.')\r\n\r\n while (!found && position !== -1) {\r\n topic = topic.substring(0, position)\r\n position = topic.lastIndexOf('.')\r\n found = _hasDirectSubscribersFor(topic)\r\n }\r\n\r\n return found\r\n}\r\n\r\nexport default _hasSubscribers\r\n","import isTypedArray from '@/utils/types/isTypedArray'\r\nimport has from './has'\r\nimport _hasDirectSubscribersFor from './_hasDirectSubscribersFor'\r\nimport _subscribers from './_subscribers'\r\n\r\n/**\r\n * (异步)发布订阅主题信息\r\n * ========================================================================\r\n * 主题默认是异步发布的。确保在消费者处理主题时,主题的发起者不会被阻止。\r\n * ========================================================================\r\n * @method emit\r\n * @param {String} topic - (必须)主题名称\r\n * @param {Object} [data] - (可选)数据对象\r\n * @param {Boolean} [async] - (可选) 是否异步发布\r\n */\r\nconst emit = (topic, data, async = true) => {\r\n const execute = (topic) => {\r\n if (!_hasDirectSubscribersFor(topic)) {\r\n return false\r\n }\r\n\r\n _subscribers[topic].forEach((subscriber) => {\r\n // 针对 mqtt 消息服务返回的 Uint8Array 类似的 typed arrays 格式的数据\r\n // 采用 toString() 方法转化为普通(JSON)字符串\r\n const message = isTypedArray(data) ? data.toString() : data\r\n\r\n subscriber.callback.call(subscriber.context || subscriber, message)\r\n })\r\n }\r\n const deliver = () => {\r\n let subscriber = topic\r\n let position = topic.lastIndexOf('.')\r\n\r\n while (position !== -1) {\r\n subscriber = subscriber.substring(0, position)\r\n position = subscriber.lastIndexOf('.')\r\n\r\n execute(subscriber)\r\n }\r\n\r\n // 执行 topic 对应的处理器\r\n execute(topic)\r\n // 执行特殊 topic:'*'(监听全部消息的发布)\r\n execute('*')\r\n }\r\n\r\n if (!has(topic)) {\r\n return false\r\n }\r\n\r\n if (async) {\r\n setTimeout(deliver, 10)\r\n } else {\r\n deliver()\r\n }\r\n}\r\n\r\nexport default emit\r\n","import toString from '@/utils/lang/toString'\r\n/**\r\n * 判断检测数据是否为 Typed Arrays 类型的数据\r\n * ========================================================================\r\n * @param {*} val\r\n * @returns {boolean}\r\n */\r\nconst isTypedArray = (val) => {\r\n const TYPES = [\r\n '[object Int8Array]',\r\n '[object Uint8Array]',\r\n '[object Uint8ClampedArray]',\r\n '[object Int16Array]',\r\n '[object Uint16Array]',\r\n '[object Int32Array]',\r\n '[object Uint32Array]',\r\n '[object Float32Array]',\r\n '[object Float64Array]',\r\n '[object BigInt64Array]',\r\n '[object BigUint64Array]'\r\n ]\r\n\r\n return TYPES.indexOf(toString(val)) > -1\r\n}\r\n\r\nexport default isTypedArray\r\n","/**\r\n * 生成唯一 id 字符串的函数\r\n * ========================================================================\r\n * @method guid\r\n * @param {String} [prefix] - 生成 id 的前缀字符串\r\n * @return {String} 返回一个表示唯一 id 的字符串\r\n */\r\nconst guid = (() => {\r\n let uuid = 0\r\n\r\n return (prefix) => {\r\n uuid += 1\r\n\r\n return prefix ? prefix + '-' + uuid : 'guid-' + uuid\r\n }\r\n})()\r\n\r\nexport default guid\r\n","import hasOwn from '@/utils/lang/hasOwn'\r\nimport _subscribers from './_subscribers'\r\n\r\n/**\r\n * 删除与给定 topic 相同的订阅者信息\r\n * ========================================================================\r\n * @method _removeSubscriber\r\n * @param {String} topic - (必须)订阅主题字符串\r\n * @returns {Boolean}\r\n */\r\nconst _removeSubscriber = (topic) => {\r\n if (!hasOwn(_subscribers, topic)) {\r\n return false\r\n }\r\n\r\n delete _subscribers[topic]\r\n}\r\n\r\nexport default _removeSubscriber\r\n","import has from './has'\r\nimport _removeSubscriber from './_removeSubscriber'\r\nimport _removeSubscriberByToken from './_removeSubscriberByToken'\r\n\r\n/**\r\n * 取消订阅主题\r\n * ========================================================================\r\n * @method off\r\n * @param {String} topic - (必须)订阅的主题\r\n * @param {Function|String} [token] - (可选)订阅主题的处理器函数或者唯一 Id 值\r\n */\r\nconst off = (topic, token) => {\r\n if (!has(topic)) {\r\n return false\r\n }\r\n\r\n if (token) {\r\n _removeSubscriberByToken(token)\r\n } else {\r\n _removeSubscriber(topic)\r\n }\r\n}\r\n\r\nexport default off\r\n","import _subscribers from './_subscribers'\r\nimport _removeSubscriber from './_removeSubscriber'\r\n\r\n/**\r\n * 通过订阅者 token 值删除订阅者信息\r\n * ========================================================================\r\n * @method _removeSubscriberByToken\r\n * @param {String} token - 订阅者 token 字符串\r\n * @returns {boolean}\r\n * @private\r\n */\r\nconst _removeSubscriberByToken = (token) => {\r\n const keys = Object.keys(_subscribers)\r\n let index = -1\r\n\r\n if (!token || keys.length < 1) {\r\n return false\r\n }\r\n\r\n keys.forEach((subject) => {\r\n const subscriber = _subscribers[subject]\r\n let topic\r\n\r\n subscriber.forEach((execution, j) => {\r\n if (execution.callback === token || execution.token === token) {\r\n topic = execution.topic\r\n subscriber.splice(index, j)\r\n }\r\n })\r\n\r\n /* istanbul ignore else */\r\n if (subscriber.length < 1) {\r\n _removeSubscriber(topic)\r\n }\r\n })\r\n}\r\n\r\nexport default _removeSubscriberByToken\r\n","import isString from './utils/types/isString'\r\n\r\nimport extend from './utils/lang/extend'\r\nimport hasOwn from './utils/lang/hasOwn'\r\n\r\nimport isObject from './utils/types/isObject'\r\n\r\nimport publish from './utils/observer/emit'\r\nimport subscribe from './utils/observer/on'\r\nimport unsubscribe from './utils/observer/off'\r\n\r\nclass Component {\r\n constructor(options) {\r\n this.attrs = {}\r\n this.name = 'component'\r\n\r\n if (options) {\r\n this.initialize(options)\r\n }\r\n }\r\n\r\n initialize(options) {\r\n this.attr(options).render().addListeners()\r\n return this\r\n }\r\n\r\n attr(prop, value) {\r\n const attrs = this.attrs\r\n\r\n if (isString(prop)) {\r\n // 只能扩展 attrs 中已有的属性\r\n if (value && hasOwn(attrs, prop)) {\r\n // 更新单个配置信息\r\n attrs[prop] = value\r\n return this\r\n }\r\n\r\n // 只传递 prop 参数,则返回对应的属性值\r\n return attrs[prop]\r\n } else if (isObject(prop)) {\r\n // 批量更新配置信息\r\n extend(attrs, prop)\r\n\r\n return this\r\n } else if (arguments.length === 0) {\r\n // 不传递参数,直接返回整个\r\n return attrs\r\n }\r\n\r\n return this\r\n }\r\n\r\n render() {\r\n return this\r\n }\r\n\r\n refresh() {\r\n return this\r\n }\r\n\r\n destroy() {\r\n this.removeListeners()\r\n return this\r\n }\r\n\r\n reload(options) {\r\n let attrs = this.attr()\r\n\r\n if (options) {\r\n attrs = this.attr(options)\r\n }\r\n\r\n this.destroy().initialize(attrs)\r\n\r\n return this\r\n }\r\n\r\n $emit(event, data) {\r\n publish(event, data)\r\n return this\r\n }\r\n\r\n $on(event, callback) {\r\n subscribe(event, callback, this)\r\n return this\r\n }\r\n\r\n $off(event, callback) {\r\n unsubscribe(event, callback)\r\n return this\r\n }\r\n\r\n addListeners() {\r\n return this\r\n }\r\n\r\n removeListeners() {\r\n return this\r\n }\r\n}\r\n\r\nexport default Component\r\n","import isFunction from '@/utils/types/isFunction'\r\nimport guid from '@/utils/lang/guid'\r\n\r\nimport _subscribers from './_subscribers'\r\n\r\n/**\r\n * 订阅主题,并给出处理器函数\r\n * ========================================================================\r\n * @method on\r\n * @param {String} topic - (必须)主题名称\r\n * @param {Function} handler - (必须)主题的处理器函数\r\n * @param {Object} [context] - (可选)指定 this 执行上下文\r\n * @return {String} - 唯一的 token 字符串,例如:'guid-1'。\r\n */\r\nconst on = (topic, handler, context = null) => {\r\n const token = guid()\r\n let subject = typeof topic === 'symbol' ? topic.toString() : topic\r\n\r\n if (!isFunction(handler)) {\r\n return ''\r\n }\r\n\r\n /* istanbul ignore else */\r\n if (!_subscribers[subject]) {\r\n _subscribers[subject] = []\r\n }\r\n\r\n _subscribers[subject].push({\r\n topic: subject,\r\n callback: handler,\r\n context,\r\n token\r\n })\r\n\r\n return token\r\n}\r\n\r\nexport default on\r\n","/**\r\n * timeSlice.js 时间切片功能函数\r\n * ====================================================\r\n * Created By: Yaohaixiao\r\n * Update: 2023.09.04\r\n */\r\nimport isFunction from '@/utils/types/isFunction'\r\nimport later from './later'\r\n\r\nconst queue = []\r\nlet isHandling\r\nlet done\r\n\r\n// Shim from https://developers.google.com/web/updates/2015/08/using-requestidlecallback\r\nif (typeof window.requestIdleCallback === 'undefined') {\r\n window.requestIdleCallback = function (cb) {\r\n const start = Date.now()\r\n return later(function () {\r\n cb({\r\n didTimeout: false,\r\n timeRemaining: function () {\r\n return Math.max(0, 50 - (Date.now() - start))\r\n }\r\n })\r\n }, 10)\r\n }\r\n\r\n window.cancelIdleCallback = function (id) {\r\n clearTimeout(id)\r\n }\r\n}\r\n\r\nfunction runIdle(idleDeadline) {\r\n while (idleDeadline.timeRemaining() > 0 && queue.length) {\r\n const fn = queue.shift()\r\n\r\n if (!isFunction(fn)) {\r\n return false\r\n }\r\n\r\n fn()\r\n }\r\n\r\n if (queue.length) {\r\n isHandling = requestIdleCallback(runIdle)\r\n } else {\r\n isHandling = 0\r\n\r\n if (isFunction(done)) {\r\n done()\r\n done = null\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * 时间切片功能函数:主要用于优化长时任务的性能,将长时任务分解成\r\n * 多个短时间任务\r\n * ====================================================\r\n * @param {Function} fn - 需要在空闲时执行的回调函数\r\n * @param {Function} afterComplete - queen 的\r\n * @return {(function(): (boolean|undefined))|*|boolean}\r\n */\r\nconst timeSlice = (fn, afterComplete = null) => {\r\n queue.push(fn)\r\n\r\n if (isFunction(afterComplete)) {\r\n done = afterComplete\r\n }\r\n\r\n if (!isHandling) {\r\n requestIdleCallback(runIdle)\r\n }\r\n}\r\n\r\nexport default timeSlice\r\n","/**\r\n * 获取 DOM 节点相对于窗口的 left (纵坐标)值\r\n * ========================================================================\r\n * @method offsetTop\r\n * @param {HTMLElement} el - DOM 节点\r\n * @returns {Number}\r\n */\r\nconst offsetTop = (el) => {\r\n let top = el.offsetTop\r\n\r\n if (el.offsetParent !== null) {\r\n top += offsetTop(el.offsetParent)\r\n }\r\n\r\n return top\r\n}\r\n\r\nexport default offsetTop\r\n","/**\r\n * 获取 options 节点下匹配 selector 选择器的 DOM 节点\r\n * ========================================================================\r\n * Element.matches() 方法可以用来判断 DOM 元素是否与给定的选择器匹配,事件代理判断是\r\n * 否触发绑定的代理事件回调函数,关键就是使用 Element.matches() 辨别当前事件触发的目\r\n * 标 DOM 元素是否为事件代理所期望触发的目标。\r\n * ========================================================================\r\n * @method matches\r\n * @see https://developer.mozilla.org/en-US/docs/web/api/element/matches\r\n * @param {HTMLElement} el - (必须)DOM 元素\r\n * @param {String} selector - (必须)匹配 DOM 元素的选择器\r\n * @returns {Boolean}\r\n */\r\nconst matches = (el, selector = '') => {\r\n const sel = selector.replace(/^>/i, '')\r\n\r\n if (!selector || !sel || !el) {\r\n return false\r\n }\r\n\r\n /* istanbul ignore else */\r\n if (el.matches) {\r\n return el.matches(sel)\r\n } else if (el.msMatchesSelector) {\r\n return el.msMatchesSelector(sel)\r\n } else {\r\n return false\r\n }\r\n}\r\n\r\nexport default matches\r\n","/**\r\n * 获取 DOM 元素的父节点\r\n * ========================================================================\r\n * @method getParentOrHost\r\n * @param {*|HTMLElement} el - (必须)要获取父节点的 DOM 元素\r\n * @returns {*|HTMLElement}\r\n */\r\nconst getParentOrHost = (el) => {\r\n return el.host && el !== document && el.host.nodeType\r\n ? el.host\r\n : el.parentNode\r\n}\r\n\r\nexport default getParentOrHost\r\n","export const CAPTURE_EVENTS = [\r\n 'focusout',\r\n 'blur',\r\n 'focusin',\r\n 'focus',\r\n 'load',\r\n 'unload',\r\n 'mouseenter',\r\n 'mouseleave'\r\n]\r\n","import { CAPTURE_EVENTS } from './enum'\r\nimport _delete from './_delete'\r\n\r\n/**\r\n * (私有方法)取消 type 类型的代理事件绑定\r\n * ========================================================================\r\n * 如果没有设置 handler,则销毁 this.$options 绑定的所有符合 type 事件类型的事件绑定\r\n * ========================================================================\r\n * @method _off\r\n * @param {HTMLElement} el - (必须)取消事件绑定的 DOM 元素\r\n * @param {String} type - (必须)事件类型\r\n * @param {Function} fn - (必须)事件处理器回调函数\r\n * @private\r\n */\r\nconst _off = (el, type, fn) => {\r\n const capture = CAPTURE_EVENTS.indexOf(type) > -1\r\n\r\n /* istanbul ignore else */\r\n if (fn._delegateListener) {\r\n fn = fn._delegateListener\r\n delete fn._delegateListener\r\n }\r\n\r\n // 移除缓存的 _listeners 数据\r\n _delete(el, type, fn)\r\n\r\n el.removeEventListener(type, fn, capture)\r\n}\r\n\r\nexport default _off\r\n","/**\r\n * 删除 DOM 元素缓存的 _listeners 数据\r\n * ========================================================================\r\n * @method _delete\r\n * @param {HTMLElement} el - 要删除 listener 的 DOM 元素\r\n * @param {String} type - 事件类型(名称)\r\n * @param {Function} [fn] - 事件处理器回调函数\r\n */\r\nconst _delete = function (el, type, fn) {\r\n const listeners = el._listeners\r\n let index = -1\r\n\r\n if (listeners.length < 1) {\r\n return false\r\n }\r\n\r\n // 移除缓存的 _listeners 数据\r\n listeners.forEach((listener, i) => {\r\n const handler = listener.fn\r\n\r\n if (type === listener.type) {\r\n index = i\r\n\r\n if (handler === fn) {\r\n index = i\r\n }\r\n }\r\n })\r\n\r\n /* istanbul ignore else */\r\n if (index > -1) {\r\n listeners.splice(index, 1)\r\n }\r\n}\r\n\r\nexport default _delete\r\n","import isString from '@/utils/types/isString'\r\nimport isElement from '@/utils/types/isElement'\r\nimport getListeners from './getListeners'\r\nimport _off from './_off'\r\n\r\n/**\r\n * 销毁(type 类型的)代理事件绑定\r\n * ========================================================================\r\n * 1. 设置了事件类型 type,则销毁指定类型的事件绑定,否则清除所有代理事件绑定\r\n * 2. recurse 设置为 true,递归销毁子节点全部事件绑定\r\n * ========================================================================\r\n * @method purgeElement\r\n * @param {HTMLElement|String} el - (必须)DOM 元素或者其选择器\r\n * @param {String|Boolean} type - (必须)事件类型\r\n * @param {Boolean} [recurse] - (可选)是否递归销毁子节点所有事件绑定\r\n */\r\nconst purgeElement = function (el, type, recurse = false) {\r\n const $element = isString(el) ? document.querySelector(el) : el\r\n const $children = $element.childNodes\r\n const listeners = getListeners($element, type)\r\n\r\n listeners.forEach((listener) => {\r\n _off($element, listener.type, listener.fn)\r\n })\r\n\r\n if (\r\n (recurse || type === true || arguments.length === 1) &&\r\n $element &&\r\n $children\r\n ) {\r\n $children.forEach(($child) => {\r\n if (isElement($child)) {\r\n purgeElement($child, type, recurse)\r\n }\r\n })\r\n }\r\n}\r\n\r\nexport default purgeElement\r\n","import isString from '@/utils/types/isString'\r\n\r\n/**\r\n * 获取 DOM 元素(type 事件类型)事件绑定信息\r\n * ========================================================================\r\n * 如果设置了事件类型 type, 则返回指定类型的事件绑定信息,否则返回所有事件绑定信息\r\n * ========================================================================\r\n * @methods getListeners\r\n * @param {HTMLElement} el - (必须)要获取事件绑定信息的 DOM 元素\r\n * @param {String} [type] - (可选)事件类型\r\n * @returns {Array} - 已绑定的事件信息\r\n */\r\nconst getListeners = (el, type) => {\r\n let listeners = el._listeners || []\r\n\r\n if (isString(type) && type) {\r\n listeners = listeners.filter((listener) => {\r\n return listener.type === type\r\n })\r\n }\r\n\r\n return listeners\r\n}\r\n\r\nexport default getListeners\r\n","import purgeElement from './purgeElement'\r\nimport isFunction from '../types/isFunction'\r\nimport _off from './_off'\r\n\r\n/**\r\n * 取消 type 类型的代理事件绑定\r\n * ========================================================================\r\n * 如果没有设置 handler,则销毁 this.$options 绑定的所有符合 type 事件类型的事件绑定\r\n * ========================================================================\r\n * @method off\r\n * @param {HTMLElement|Object} el - (必须)取消事件绑定的 DOM 元素\r\n * @param {String} type - (必须)事件类型\r\n * @param {Function} [fn] - (可选)事件处理器回调函数\r\n */\r\nconst off = (el, type, fn) => {\r\n // 如果不设置 fn 参数,默认清除 el 元素上绑定的所有事件处理器\r\n if (!isFunction(fn)) {\r\n purgeElement(el, type)\r\n return false\r\n }\r\n\r\n _off(el, type, fn)\r\n}\r\n\r\nexport default off\r\n","import closest from '@/utils/dom/closest'\r\nimport off from './off'\r\nimport getTarget from './getTarget'\r\n\r\nimport { CAPTURE_EVENTS } from './enum'\r\n\r\n/**\r\n * 绑定代理事件\r\n * ========================================================================\r\n * @method on\r\n * @param {HTMLElement|String|Object} el - (必须)绑定代理事件的 DOM 节点\r\n * @param {String} selector - (必须)事件代理目标 DOM 元素的选择器\r\n * @param {String|Function} type - (必须)事件类型或者事件处理器回调函数\r\n * @param {Function|Object} fn - (可选) 事件处理器回调函数或者传递给事件处理器回调函数的数据对象\r\n * @param {Object|Boolean} [data] - (可选)传递给事件处理器回调函数的数据对象或者事件处理器回调函数的 this 上下文指向,\r\n * @param {Object|Boolean} [context] - (可选)事件处理器回调函数的 this 上下文指向,或者是否仅触发一次\r\n * 当设置为 true 时,则事件处理器回调函数的 this 上下文指向为 data 对象\r\n * @param {Boolean} once - (可选)是否仅触发一次\r\n */\r\nconst on = (el, selector, type, fn, data, context, once = false) => {\r\n // CAPTURE_EVENTS 中的特殊事件,采用事件捕获模型\r\n const capture = CAPTURE_EVENTS.indexOf(type) > -1\r\n\r\n const listener = function (evt) {\r\n const target = getTarget(evt)\r\n // 通过 Element.matches 方法获得点击的目标元素\r\n const delegateTarget = closest(target, selector, el)\r\n let overrideContext = context || el\r\n\r\n evt.delegateTarget = delegateTarget\r\n\r\n // 当设置为 true 时,则事件处理器回调函数的\r\n // this 上下文指向为 data 对象\r\n if (context === true) {\r\n overrideContext = data\r\n }\r\n\r\n /* istanbul ignore else */\r\n if (delegateTarget) {\r\n // 仅触发一次\r\n /* istanbul ignore else */\r\n if (once === true) {\r\n off(el, type, listener)\r\n }\r\n\r\n fn.call(overrideContext, evt, data)\r\n }\r\n }\r\n\r\n if (!el) {\r\n return false\r\n }\r\n\r\n if (!el._listeners) {\r\n el._listeners = []\r\n }\r\n\r\n // 缓存 options 元素绑定的事件处理器\r\n el._listeners.push({\r\n el,\r\n selector,\r\n type,\r\n fn: listener,\r\n data,\r\n context,\r\n capture\r\n })\r\n\r\n // 缓存包装后的事件处理器\r\n fn._delegateListener = listener\r\n\r\n el.addEventListener(type, listener, capture)\r\n}\r\n\r\nexport default on\r\n","import resolveTextNode from '@/utils/dom/resolveTextNode'\r\n\r\n/**\r\n * 返回触发事件的 target DOM 元素\r\n * ========================================================================\r\n * @method getTarget\r\n * @param {Event} evt - Event 对象\r\n * @return {HTMLElement} - Event 对象的 target DOM 元素\r\n */\r\nconst getTarget = function (evt) {\r\n const target = evt.target\r\n\r\n return resolveTextNode(target)\r\n}\r\n\r\nexport default getTarget\r\n","/**\r\n * 在某些情况下,某些浏览器(例如:Safari 浏览器)会返回实际的目标元素内部的文本节点。\r\n * resolveTextNode() 方法则会返回实际的目标节点。\r\n * ========================================================================\r\n * @method resolveTextNode\r\n * @param {HTMLElement|Text} el - 要解析的节点\r\n * @return {*|HTMLElement} - 实际的目标 DOM 节点\r\n */\r\nconst resolveTextNode = function (el) {\r\n if (el && el.nodeType === 3) {\r\n return el.parentNode\r\n }\r\n\r\n return el\r\n}\r\n\r\nexport default resolveTextNode\r\n","import matches from './matches'\r\nimport getParentOrHost from './getParentOrHost'\r\n\r\n/**\r\n * 获取 options 元素父元素最近的包含 selector 选择器的元素\r\n * ========================================================================\r\n * @method closest\r\n * @param {HTMLElement} el - (必须)DOM 元素\r\n * @param {String} selector - (必须)DOM 元素的选择其\r\n * @param {HTMLElement} [ctx] - (必须)比对的 DOM 元素\r\n * @param {Boolean} [includeCTX] - (必须)是否包含 context DOM 元素\r\n * @returns {null|HTMLElement} - 返回最接近的 DOM 元素\r\n */\r\nconst closest = (el, selector, ctx, includeCTX) => {\r\n const context = ctx || document\r\n\r\n if (!el) {\r\n return null\r\n }\r\n\r\n do {\r\n /* istanbul ignore else */\r\n if (\r\n (selector != null &&\r\n (selector.startsWith('>')\r\n ? el.parentNode === context && matches(el, selector)\r\n : matches(el, selector))) ||\r\n (includeCTX && el === context)\r\n ) {\r\n return el\r\n }\r\n\r\n /* istanbul ignore else */\r\n if (el === context) {\r\n break\r\n }\r\n\r\n /* jshint boss:true */\r\n } while ((el = getParentOrHost(el)))\r\n}\r\n\r\nexport default closest\r\n","/**\r\n * 停止事件(阻止默认行为和阻止事件的捕获或冒泡)\r\n * ========================================================================\r\n * @method stop\r\n * @param {Event} evt - 事件对象\r\n *\r\n * @example\r\n *
\r\n * Service\r\n * Help\r\n *
\r\n *\r\n * const $nav = document.querySelector('#nav')\r\n * const $service = document.querySelector('.anchor')\r\n *\r\n * on($nav, 'click', function(evt) {\r\n * console.log('你点击了导航栏')\r\n * })\r\n *\r\n * on($anchor, 'click', function(evt) {\r\n * console.log('tagName', this.tagName)\r\n *\r\n * // 工作台输出:'a'\r\n * // 不会触发事件冒泡,输出:'你点击了导航栏'\r\n * // 也不会切换到 href 属性的页面,阻止了点击链接的默认行为\r\n * stopEvent(evt)\r\n * })\r\n */\r\nconst stop = function (evt) {\r\n evt.stopPropagation()\r\n evt.preventDefault()\r\n}\r\n\r\nexport default stop\r\n","import DEFAULTS from './defaults'\r\n\r\nconst SYMBOLS = [...DEFAULTS]\r\n\r\nexport default SYMBOLS\r\n","const DEFAULTS = [\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n ''\r\n]\r\n\r\nexport default DEFAULTS\r\n","import isString from '@/utils/types/isString'\r\nimport getSymbol from './getSymbol'\r\nimport SYMBOLS from './symbols'\r\n\r\n/**\r\n *\r\n * @method getSymbols\r\n * @param {String} [name]\r\n * @param {String} [iconSet]\r\n * @returns {string[]|*}\r\n */\r\nconst getSymbols = (name, iconSet = 'icon') => {\r\n if (isString(name)) {\r\n return getSymbol(name, iconSet)\r\n }\r\n\r\n return [...SYMBOLS]\r\n}\r\n\r\nexport default getSymbols\r\n","import SYMBOLS from './symbols'\r\n\r\n/**\r\n * @method getSymbol\r\n * @param {String} name\r\n * @param {String} [iconSet]\r\n * @returns {String}\r\n */\r\nconst getSymbol = (name, iconSet = 'icon') => {\r\n const patternName = /id=\"(.*?)\"/\r\n const patternSet = /^(\\w+)-/\r\n const symbols = SYMBOLS\r\n\r\n return symbols.find((symbol) => {\r\n const names = patternName.exec(symbol)\r\n const fullName = names[1]\r\n const sets = patternSet.exec(fullName)\r\n const setName = sets[1]\r\n const iconName =\r\n iconSet === 'icon' ? `${iconSet}-${name}` : `${iconSet}-icon-${name}`\r\n\r\n return setName === iconSet && fullName === iconName\r\n })\r\n}\r\n\r\nexport default getSymbol\r\n","import add from './add'\r\nimport getSymbols from './getSymbols'\r\n\r\n/**\r\n * 绘制 SVG 图标集\r\n * ========================================================================\r\n * @method paint\r\n * @param {String|Array} symbol\r\n */\r\nconst paint = (symbol = '') => {\r\n const $body = document.body\r\n let $icons = document.querySelector('#outline-icons')\r\n let symbols = []\r\n\r\n add(symbol)\r\n symbols = getSymbols()\r\n\r\n if ($icons) {\r\n $icons.innerHTML = symbols.join('')\r\n } else {\r\n $icons = document.createElement('div')\r\n $icons.innerHTML =\r\n ``\r\n $body.insertBefore($icons.firstChild, $body.firstChild)\r\n }\r\n}\r\n\r\nexport default paint\r\n","import isArray from '@/utils/types/isArray'\r\nimport isString from '@/utils/types/isString'\r\nimport SYMBOLS from './symbols'\r\n\r\n/**\r\n * @method add\r\n * @param {Array|String} symbols\r\n * @return {Boolean}\r\n */\r\nconst add = (symbols) => {\r\n if (!symbols) {\r\n return false\r\n }\r\n\r\n if (isArray(symbols) && symbols.length > 0) {\r\n symbols.forEach((symbol) => {\r\n /* istanbul ignore else */\r\n if (SYMBOLS.indexOf(symbol) === -1 && isString(symbol)) {\r\n SYMBOLS.push(symbol)\r\n }\r\n })\r\n } else {\r\n /* istanbul ignore else */\r\n if (isString(symbols)) {\r\n SYMBOLS.push(symbols)\r\n }\r\n }\r\n}\r\n\r\nexport default add\r\n","import isObject from './isObject'\r\nimport isElement from './isElement'\r\nimport isHTMLCollection from './isHTMLCollection'\r\nimport isFragment from './isFragment'\r\nimport isTextNode from './isTextNode'\r\n\r\nconst isDOM = (el) => {\r\n return !!(\r\n isObject(el) &&\r\n (isElement(el) || isHTMLCollection(el) || isFragment(el) || isTextNode(el))\r\n )\r\n}\r\n\r\nexport default isDOM\r\n","import toString from '@/utils/lang/toString'\r\nimport isObject from './isObject'\r\n\r\nconst isHTMLCollection = (el) => {\r\n return !!(isObject(el) && toString(el) === '[object NodeList]')\r\n}\r\n\r\nexport default isHTMLCollection\r\n","import toString from '@/utils/lang/toString'\r\nimport isObject from './isObject'\r\n\r\nconst isFragment = (fragment) => {\r\n return !!(\r\n isObject(fragment) && toString(fragment) === '[object DocumentFragment]'\r\n )\r\n}\r\n\r\nexport default isFragment\r\n","import toString from '@/utils/lang/toString'\r\nimport isObject from './isObject'\r\n\r\nconst isTextNode = (el) => {\r\n return !!(\r\n isObject(el) &&\r\n (toString(el) === '[object Text]' || (el.tagName && el.nodeType === 3))\r\n )\r\n}\r\n\r\nexport default isTextNode\r\n","import addClass from './addClass.js'\r\n\r\n/**\r\n * 给 DOM 节点设置属性/值\r\n * ========================================================================\r\n * @method setAttribute\r\n * @param {HTMLElement} el - DOM 节点\r\n * @param {String} attr - 属性名称\r\n * @param {String|Number|Boolean} value - 属性值\r\n */\r\nconst setAttribute = (el, attr, value) => {\r\n let tagName = el.tagName.toLowerCase()\r\n\r\n switch (attr) {\r\n case 'style':\r\n el.style.cssText = value\r\n break\r\n case 'value':\r\n if (tagName === 'input' || tagName === 'textarea') {\r\n el.value = value\r\n } else {\r\n el.setAttribute(attr, value)\r\n }\r\n break\r\n case 'htmlFor':\r\n el.setAttribute('for', value)\r\n break\r\n case 'className':\r\n addClass(el, value)\r\n break\r\n case 'innerHTML':\r\n el.innerHTML = value\r\n break\r\n case 'innerText':\r\n el.innerText = value\r\n break\r\n default:\r\n el.setAttribute(attr, value)\r\n break\r\n }\r\n}\r\n\r\nexport default setAttribute\r\n","import isObject from '../types/isObject'\r\nimport hasOwn from '../lang/hasOwn'\r\nimport setAttribute from './setAttribute'\r\n\r\nconst setAttributes = (el, attrs) => {\r\n if (!el || !isObject(attrs)) {\r\n return false\r\n }\r\n\r\n Object.keys(attrs).forEach((attr) => {\r\n const value = attrs[attr]\r\n if (hasOwn(attrs, attr)) {\r\n setAttribute(el, attr, value)\r\n }\r\n })\r\n}\r\n\r\nexport default setAttributes\r\n","import isObject from '../types/isObject'\r\nimport isString from '../types/isString'\r\nimport isArray from '../types/isArray'\r\nimport isDOM from '../types/isDOM'\r\nimport setAttributes from './setAttributes'\r\n\r\n/**\r\n * 创建 DOM 节点,并添加属性和子节点\r\n * ========================================================================\r\n * @method createElement\r\n * @param {String} tagName - 标签名称\r\n * @param {Object|Array|HTMLElement|DocumentFragment|String} attrs - 属性对象或者子节点\r\n * @param {Array|HTMLElement|DocumentFragment|String} [children] - 子节点数组\r\n * @returns {HTMLElement}\r\n */\r\nconst createElement = (tagName, attrs, children) => {\r\n const $fragment = document.createDocumentFragment()\r\n const $el = document.createElement(tagName)\r\n const isValidChild = (child) => {\r\n return isDOM(child) || isString(child)\r\n }\r\n const append = (child) => {\r\n let $child\r\n\r\n if (!isValidChild(child)) {\r\n return false\r\n }\r\n\r\n if (isDOM(child)) {\r\n $child = child\r\n } else if (isString(child)) {\r\n $child = document.createTextNode(child)\r\n }\r\n\r\n $fragment.appendChild($child)\r\n }\r\n\r\n if (isObject(attrs)) {\r\n setAttributes($el, attrs)\r\n } else if (isArray(attrs) && attrs.every((attr) => isValidChild(attr))) {\r\n attrs.forEach((child) => {\r\n append(child)\r\n })\r\n } else if (isDOM(attrs)) {\r\n append(attrs)\r\n } else if (isString(attrs)) {\r\n append(document.createTextNode(attrs))\r\n }\r\n\r\n if (isArray(children)) {\r\n children.forEach((child) => {\r\n append(child)\r\n })\r\n } else {\r\n append(children)\r\n }\r\n\r\n $el.appendChild($fragment)\r\n\r\n return $el\r\n}\r\n\r\nexport default createElement\r\n","import isArray from '@/utils/types/isArray'\r\nimport isString from '@/utils/types/isString'\r\nimport isSVG from '@/utils/types/isSVG'\r\nimport setAttributes from '@/utils/dom/setAttributes'\r\n\r\n/**\r\n * 创建 SVG 图标 DOM 元素\r\n * ========================================================================\r\n * @method createElement\r\n * @param {String} name\r\n * @param {Object} [options]\r\n * @param {Number|Array} [options.size]\r\n * @param {String} [options.color]\r\n * @param {String} [options.iconSet]\r\n * @param {Object} [options.attrs]\r\n * @returns {HTMLElement}\r\n */\r\nconst createElement = (name, options = {}) => {\r\n const ICON = 'outline-icon'\r\n const size = options.size || 0\r\n const color = options.color || ''\r\n const iconSet = options.iconSet || ''\r\n const width = isArray(size) ? size[0] : size\r\n const height = isArray(size) ? size[1] : size\r\n const defaultRules = size ? `width:${width}px;height:${height}px;` : ''\r\n const cssRules = color ? defaultRules + `color:${color}` : defaultRules\r\n const attrs = options.attrs || {}\r\n const $icon = document.createElement('i')\r\n let binds = ''\r\n let svg = ''\r\n let $svg\r\n\r\n if (!isString(name)) {\r\n return null\r\n }\r\n\r\n if (isSVG(name)) {\r\n svg = name\r\n } else {\r\n binds =\r\n iconSet && iconSet !== 'icon'\r\n ? `xlink:href=\"#${iconSet}-icon-${name}\"`\r\n : `xlink:href=\"#icon-${name}\"`\r\n svg = ``\r\n }\r\n\r\n $icon.innerHTML = svg\r\n\r\n if (attrs.className) {\r\n attrs.className = `${ICON} ${attrs.className}`\r\n } else {\r\n attrs.className = ICON\r\n }\r\n\r\n setAttributes($icon, attrs)\r\n\r\n $svg = $icon.querySelector('svg')\r\n setAttributes($svg, {\r\n 'aria-hidden': true,\r\n xmlns: 'http://www.w3.org/2000/svg',\r\n class: 'outline-icon__svg',\r\n width: 200,\r\n height: 200,\r\n style: cssRules\r\n })\r\n\r\n return $icon\r\n}\r\n\r\nexport default createElement\r\n","import isString from './isString'\r\n\r\nconst isSVG = (str) => {\r\n const declaration = '(?:<\\\\?xml[^>]*>\\\\s*)?'\r\n const doctype =\r\n '(?:<\\\\!doctype svg[^>]*\\\\s*(?:\\\\[?(?:\\\\s*]*>\\\\s*)*\\\\]?)*[^>]*>\\\\s*)?'\r\n const content = ']*>[^]*<\\\\/svg>\\\\s*$'\r\n const svg = `^\\\\s*${declaration}${doctype}${content}\\\\s*$`\r\n const pattern = new RegExp(svg, 'i')\r\n\r\n return isString(str) && pattern.test(str)\r\n}\r\n\r\nexport default isSVG\r\n","import createElement from './createElement'\r\n\r\n/**\r\n * 创建 SVG 图标 DOM 元素\r\n * ========================================================================\r\n * @method icon\r\n * @alias createElement\r\n * @see createElement\r\n * @param {String} name\r\n * @param {Object} [options]\r\n * @param {Number|Array} [options.size]\r\n * @param {String} [options.color]\r\n * @param {String} [options.iconSet]\r\n * @returns {HTMLElement}\r\n */\r\nconst icon = (name, options = {}) => {\r\n return createElement(name, options)\r\n}\r\n\r\nexport default icon\r\n","import trim from '../lang/trim'\r\nimport hasClass from './hasClass'\r\n\r\n/**\r\n * 移除 DOM 节点的 className 样式\r\n * ========================================================================\r\n * @method removeClass\r\n * @param {HTMLElement} el - DOM 节点\r\n * @param {String} className - 样式名称\r\n * @returns {Boolean}\r\n */\r\nconst removeClass = (el, className) => {\r\n let allClass = el.className\r\n let classList\r\n\r\n if (!allClass || !hasClass(el, className)) {\r\n return false\r\n }\r\n\r\n classList = el.classList\r\n\r\n if (classList?.remove) {\r\n classList.remove(className)\r\n } else {\r\n allClass = trim(allClass.replace(className, ''))\r\n el.className = allClass\r\n }\r\n}\r\n\r\nexport default removeClass\r\n","import removeClass from '@/utils/dom/removeClass'\r\nimport isEmpty from '@/utils/types/isEmpty'\r\nimport trim from '@/utils/lang/trim'\r\n\r\nconst _removeHeading = ($heading, hasAnchor = true, isAtStart = true) => {\r\n const CLS_HEADING = 'outline-heading'\r\n const text = $heading.innerHTML\r\n const pattern = /^\\d+(\\.?\\d+)*\\s?/gi\r\n let $anchor\r\n\r\n $heading.innerHTML = text.replace(pattern, '')\r\n $heading.removeAttribute('id')\r\n $heading.removeAttribute('data-id')\r\n\r\n removeClass($heading, CLS_HEADING)\r\n\r\n if (!hasAnchor) {\r\n return false\r\n }\r\n\r\n $anchor = $heading.querySelector(`.${CLS_HEADING}__anchor`)\r\n\r\n if (isAtStart) {\r\n removeClass($heading, `${CLS_HEADING}_start`)\r\n }\r\n\r\n if (isEmpty(trim($heading.className))) {\r\n $heading.removeAttribute('class')\r\n }\r\n\r\n // 存在锚点才移除\r\n if ($anchor) {\r\n $heading.removeChild($anchor)\r\n }\r\n}\r\n\r\nexport default _removeHeading\r\n","import isString from './isString'\r\n/**\r\n * 检测数据是否为空字符串\r\n * ========================================================================\r\n * @method isEmpty\r\n * @param {String} str\r\n * @returns {boolean}\r\n */\r\nconst isEmpty = (str) => {\r\n return isString(str) && str === ''\r\n}\r\n\r\nexport default isEmpty\r\n","import isString from '@/utils/types/isString'\r\nimport isFunction from '@/utils/types/isFunction'\r\nimport isElement from '@/utils/types/isElement'\r\n\r\nimport cloneDeep from '@/utils/lang/cloneDeep'\r\nimport timeSlice from '@/utils/lang/timeSlice'\r\nimport later from '@/utils/lang/later'\r\n\r\nimport scrollTo from '@/utils/dom/scrollTo'\r\nimport getScrollElement from '@/utils/dom/getScrollElement'\r\nimport offsetTop from '@/utils/dom/offsetTop'\r\n\r\nimport on from '@/utils/event/on'\r\nimport off from '@/utils/event/off'\r\nimport stop from '@/utils/event/stop'\r\n\r\nimport paint from '@/utils/icons/paint'\r\n\r\nimport getChapters from '@/chapters/getChapters'\r\n\r\nimport Component from '@/component'\r\n\r\nimport _updateHeading from './utils/_updateHeading'\r\nimport _removeHeading from './utils/_removeHeading'\r\n\r\nimport './anchors.less'\r\n\r\nclass Anchors extends Component {\r\n constructor(options) {\r\n super()\r\n\r\n this._default()\r\n\r\n if (options) {\r\n this.initialize(options)\r\n }\r\n }\r\n\r\n _default() {\r\n this.attrs = cloneDeep(Anchors.DEFAULTS)\r\n\r\n this.$articleElement = null\r\n this.$scrollElement = null\r\n this.$headings = []\r\n\r\n return this\r\n }\r\n\r\n initialize(options) {\r\n let created\r\n let scrollElement\r\n let $articleElement\r\n let articleElement\r\n\r\n this.attr(options)\r\n\r\n articleElement = this.attr('articleElement')\r\n scrollElement = this.attr('scrollElement')\r\n created = this.attr('created')\r\n\r\n if (isString(articleElement)) {\r\n $articleElement = document.querySelector(articleElement)\r\n } else if (isElement(articleElement)) {\r\n $articleElement = articleElement\r\n }\r\n\r\n if (!$articleElement) {\r\n return this\r\n }\r\n\r\n this.$articleElement = $articleElement\r\n this.$scrollElement = getScrollElement(scrollElement)\r\n this.$headings = this.getHeadings()\r\n\r\n if (this.$headings.length < 1) {\r\n return this\r\n }\r\n\r\n if (isFunction(created)) {\r\n created.call(this)\r\n }\r\n\r\n this.render().addListeners()\r\n\r\n return this\r\n }\r\n\r\n getHeadings() {\r\n const $articleElement = this.$articleElement\r\n const selector = this.attr('selector')\r\n\r\n return [...$articleElement.querySelectorAll(selector)]\r\n }\r\n\r\n count() {\r\n return this.getHeadings().length\r\n }\r\n\r\n render() {\r\n const articleElement = this.attr('articleElement')\r\n const selector = this.attr('selector')\r\n const showCode = this.attr('showCode')\r\n const chapterTextFilter = this.attr('chapterTextFilter')\r\n const mounted = this.attr('mounted')\r\n const chapters = getChapters({\r\n articleElement,\r\n selector,\r\n showCode,\r\n chapterTextFilter\r\n })\r\n\r\n paint()\r\n\r\n this._paint(chapters)\r\n\r\n if (isFunction(mounted)) {\r\n mounted.call(this)\r\n }\r\n\r\n return this\r\n }\r\n\r\n erase() {\r\n this._remove()\r\n\r\n return this\r\n }\r\n\r\n _paint(chapters) {\r\n const LIMIT = 400\r\n const hasAnchor = this.attr('hasAnchor')\r\n const isAtStart = this.attr('isAtStart')\r\n const showCode = this.attr('showCode')\r\n const anchorURL = this.attr('anchorURL')\r\n const anchorLinkFilter = this.attr('anchorLinkFilter')\r\n const count = this.count()\r\n const $headings = [...this.$headings]\r\n const update = (headings, group) => {\r\n headings.forEach(($heading, i) => {\r\n const id = i + group * LIMIT\r\n const chapterCode = chapters[id].code\r\n _updateHeading($heading, id, {\r\n hasAnchor,\r\n isAtStart,\r\n showCode,\r\n chapterCode,\r\n anchorURL,\r\n anchorLinkFilter\r\n })\r\n })\r\n }\r\n let groupIndex = -1\r\n\r\n // 针对超长的文章,进行 timeSlice 处理\r\n if (count > LIMIT) {\r\n groupIndex += 1\r\n // 同步绘制 Limit 以内的标题链接(可以确保 50ms 完成绘制)\r\n update($headings.splice(0, LIMIT), 0)\r\n // 采用 timeSlice 处理机制绘制剩余的标题\r\n while ($headings.length > 0) {\r\n const once = $headings.splice(0, LIMIT)\r\n timeSlice(\r\n () => {\r\n update(once, (groupIndex += 1))\r\n },\r\n () => {\r\n this.$emit('anchors:all:paint')\r\n }\r\n )\r\n }\r\n } else {\r\n update($headings, 0)\r\n }\r\n\r\n return this\r\n }\r\n\r\n _remove() {\r\n const hasAnchor = this.attr('hasAnchor')\r\n const isAtStart = this.attr('isAtStart')\r\n const $headings = this.$headings\r\n\r\n $headings.forEach(($heading) => {\r\n _removeHeading($heading, hasAnchor, isAtStart)\r\n })\r\n\r\n return this\r\n }\r\n\r\n refresh(chapters) {\r\n const articleElement = this.attr('articleElement')\r\n const selector = this.attr('selector')\r\n const showCode = this.attr('showCode')\r\n const chapterTextFilter = this.attr('chapterTextFilter')\r\n\r\n this.$headings = this.getHeadings()\r\n\r\n this.erase()._paint(\r\n chapters ||\r\n getChapters({\r\n articleElement,\r\n selector,\r\n showCode,\r\n chapterTextFilter\r\n })\r\n )\r\n\r\n return this\r\n }\r\n\r\n scrollTo(top, after) {\r\n const el = this.$scrollElement\r\n\r\n scrollTo(el, top, after)\r\n\r\n return this\r\n }\r\n\r\n destroy() {\r\n const beforeDestroy = this.attr('beforeDestroy')\r\n const afterDestroy = this.attr('afterDestroy')\r\n\r\n if (isFunction(beforeDestroy)) {\r\n beforeDestroy.call(this)\r\n }\r\n\r\n this.removeListeners()._remove()._default()\r\n\r\n if (isFunction(afterDestroy)) {\r\n afterDestroy.call(this)\r\n }\r\n\r\n return this\r\n }\r\n\r\n onAnchorTrigger(evt) {\r\n const anchorURL = this.attr('anchorURL')\r\n const afterScroll = this.attr('afterScroll')\r\n const stickyHeight = this.attr('stickyHeight')\r\n const $anchor = evt.delegateTarget\r\n const $heading = $anchor.parentNode\r\n const top = offsetTop($heading) - (stickyHeight + 10)\r\n const $scrollElement = this.$scrollElement\r\n const min = 0\r\n const max = $scrollElement.scrollHeight - $scrollElement.clientHeight\r\n const after = () => {\r\n if (isFunction(afterScroll)) {\r\n afterScroll.call(this, 'anchor')\r\n }\r\n\r\n later(() => {\r\n this.$emit('toolbar:update', {\r\n top,\r\n min,\r\n max\r\n })\r\n })\r\n }\r\n\r\n this.scrollTo(top, after)\r\n\r\n if (!anchorURL) {\r\n stop(evt)\r\n }\r\n\r\n return this\r\n }\r\n\r\n onRefresh(chapters) {\r\n this.refresh(chapters)\r\n\r\n return this\r\n }\r\n\r\n addListeners() {\r\n const $articleElement = this.$articleElement\r\n\r\n if (this.count() < 1) {\r\n return this\r\n }\r\n\r\n on(\r\n $articleElement,\r\n '.outline-heading__anchor',\r\n 'click',\r\n this.onAnchorTrigger,\r\n this,\r\n true\r\n )\r\n\r\n this.$on('anchors:refresh', this.onRefresh)\r\n\r\n return this\r\n }\r\n\r\n removeListeners() {\r\n const $articleElement = this.$articleElement\r\n\r\n if (this.count() < 1) {\r\n return this\r\n }\r\n\r\n off($articleElement, 'click', this.onAnchorTrigger)\r\n this.$off('anchors:refresh', this.onRefresh)\r\n\r\n return this\r\n }\r\n}\r\n\r\nAnchors.DEFAULTS = (() => {\r\n const OPTIONS = {\r\n scrollElement: 'html,body',\r\n articleElement: '#article',\r\n selector: 'h1,h2,h3,h4,h5,h6',\r\n stickyHeight: 0,\r\n anchorURL: '',\r\n hasAnchor: true,\r\n isAtStart: true,\r\n showCode: false,\r\n created: null,\r\n mounted: null,\r\n afterScroll: null,\r\n beforeDestroy: null,\r\n afterDestroy: null,\r\n chapterTextFilter: null,\r\n anchorLinkFilter: null\r\n }\r\n\r\n return cloneDeep(OPTIONS)\r\n})()\r\n\r\nexport default Anchors\r\n","import isFunction from '@/utils/types/isFunction'\r\nimport trim from '@/utils/lang/trim'\r\nimport createElement from '@/utils/dom/createElement'\r\nimport setAttributes from '@/utils/dom/setAttributes'\r\n\r\nimport icon from '@/utils/icons/icon'\r\n\r\nconst _updateHeading = ($heading, i, options) => {\r\n const CLS_HEADING = 'outline-heading'\r\n const hasAnchor = options.hasAnchor || true\r\n const isAtStart = options.isAtStart || true\r\n const showCode = options.showCode || false\r\n const chapterCode = options.chapterCode || ''\r\n const anchorURL = options.anchorURL || ''\r\n const anchorLinkFilter = options.anchorLinkFilter || null\r\n const headingId = `heading-${i}`\r\n const attrs = {\r\n id: headingId,\r\n className: isAtStart ? `${CLS_HEADING} ${CLS_HEADING}_start` : CLS_HEADING,\r\n 'data-id': i\r\n }\r\n const text = trim($heading.innerHTML)\r\n let url\r\n let $anchor\r\n let $icon\r\n\r\n if (showCode) {\r\n attrs.innerHTML = chapterCode + ' ' + text\r\n attrs['data-code'] = chapterCode\r\n }\r\n setAttributes($heading, attrs)\r\n\r\n if (!hasAnchor) {\r\n return false\r\n }\r\n\r\n if (anchorURL) {\r\n url = anchorURL\r\n } else {\r\n if (isFunction(anchorLinkFilter)) {\r\n url = anchorLinkFilter($heading.tagName.toLowerCase(), text, i)\r\n } else {\r\n url = `#${headingId}`\r\n }\r\n }\r\n\r\n $icon = icon('hash', { iconSet: 'outline' })\r\n $anchor = createElement(\r\n 'a',\r\n {\r\n id: `anchor-${i}`,\r\n className: `${CLS_HEADING}__anchor anchor-${i}`,\r\n href: url,\r\n target: anchorURL ? '_blank' : 'self',\r\n 'data-id': i\r\n },\r\n $icon\r\n )\r\n $heading.appendChild($anchor)\r\n}\r\n\r\nexport default _updateHeading\r\n","// HTML 合法的标签\r\nconst TAGS = [\r\n 'a',\r\n 'abbr',\r\n 'address',\r\n 'area',\r\n 'article',\r\n 'aside',\r\n 'audio',\r\n 'b',\r\n 'base',\r\n 'bdi',\r\n 'bdo',\r\n 'blockquote',\r\n 'body',\r\n 'br',\r\n 'button',\r\n 'canvas',\r\n 'caption',\r\n 'cite',\r\n 'code',\r\n 'col',\r\n 'colgroup',\r\n 'data',\r\n 'datalist',\r\n 'dd',\r\n 'del',\r\n 'details',\r\n 'dfn',\r\n 'dialog',\r\n 'div',\r\n 'dl',\r\n 'dt',\r\n 'em',\r\n 'embed',\r\n 'fieldset',\r\n 'figcaption',\r\n 'figure',\r\n 'footer',\r\n 'form',\r\n 'h1',\r\n 'h2',\r\n 'h3',\r\n 'h4',\r\n 'h5',\r\n 'h6',\r\n 'head',\r\n 'header',\r\n 'hgroup',\r\n 'hr',\r\n 'html',\r\n 'i',\r\n 'iframe',\r\n 'img',\r\n 'input',\r\n 'ins',\r\n 'kbd',\r\n 'label',\r\n 'legend',\r\n 'li',\r\n 'link',\r\n 'main',\r\n 'map',\r\n 'mark',\r\n 'math',\r\n 'menu',\r\n 'menuitem',\r\n 'meta',\r\n 'meter',\r\n 'nav',\r\n 'noscript',\r\n 'object',\r\n 'ol',\r\n 'optgroup',\r\n 'option',\r\n 'output',\r\n 'p',\r\n 'param',\r\n 'picture',\r\n 'pre',\r\n 'progress',\r\n 'q',\r\n 'rb',\r\n 'rp',\r\n 'rt',\r\n 'rtc',\r\n 'ruby',\r\n 's',\r\n 'samp',\r\n 'script',\r\n 'search',\r\n 'section',\r\n 'select',\r\n 'slot',\r\n 'small',\r\n 'source',\r\n 'span',\r\n 'strong',\r\n 'style',\r\n 'sub',\r\n 'summary',\r\n 'sup',\r\n 'svg',\r\n 'table',\r\n 'tbody',\r\n 'td',\r\n 'template',\r\n 'textarea',\r\n 'tfoot',\r\n 'th',\r\n 'thead',\r\n 'time',\r\n 'title',\r\n 'tr',\r\n 'track',\r\n 'u',\r\n 'ul',\r\n 'var',\r\n 'video',\r\n 'wbr'\r\n]\r\n\r\nexport default TAGS\r\n","import trim from '@/utils/lang/trim'\r\nimport isString from './isString'\r\nimport TAGS from './tags'\r\n\r\n/**\r\n * 检测测试数据是否为合法的 HTML 代码\r\n * ========================================================================\r\n * @method isHTML\r\n * @category Lang\r\n * @see https://github.com/sindresorhus/html-tags\r\n * @see https://github.com/sindresorhus/is-html\r\n * @param {String} str - 要检测的数据\r\n * @returns {Boolean} 'val' 为合法的 HTML 代码,返回 true,否则返回 false\r\n */\r\nconst isHTML = (str) => {\r\n let html\r\n let basic\r\n let full\r\n\r\n if (!isString(str)) {\r\n return false\r\n }\r\n\r\n // 为了提高性能,我们将其限制在合理的长度内。\r\n html = trim(str).slice(0, 1000)\r\n basic = /\\s*|]*>|]*>|]+>/i\r\n full = new RegExp(TAGS.map((tag) => `<${tag}\\\\b[^>]*>`).join('|'), 'i')\r\n\r\n return basic.test(html) || full.test(html)\r\n}\r\n\r\nexport default isHTML\r\n","/**\r\n * 移除字符串中的 JavaScript 代码\r\n * ====================================================\r\n * @param {String} str\r\n * @returns {String}\r\n */\r\nconst stripScripts = (str) => {\r\n return str.replace(/]*>.*?<\\/script>/gi, '')\r\n}\r\n\r\nexport default stripScripts\r\n","const setProperty = (prop, value) => {\r\n const documentElement = document.documentElement\r\n documentElement.style.setProperty(prop, value)\r\n}\r\n\r\nexport default setProperty\r\n","import setProperty from './setProperty'\r\n\r\nlet index = 2000\r\n\r\nconst zIndex = (idx) => {\r\n if (idx) {\r\n index = idx\r\n } else {\r\n index += 1\r\n }\r\n\r\n setProperty('--outline-zIndex', `${index}`)\r\n\r\n return index\r\n}\r\n\r\nexport default zIndex\r\n","import later from '@/utils/lang/later'\r\nimport cloneDeep from '@/utils/lang/cloneDeep'\r\nimport isFunction from '@/utils/types/isFunction'\r\nimport isDOM from '@/utils/types/isDOM'\r\nimport isHTML from '@/utils/types/isHTML'\r\nimport addClass from '@/utils/dom/addClass'\r\nimport removeClass from '@/utils/dom/removeClass'\r\nimport html from '@/utils/dom/html'\r\nimport createElement from '@/utils/dom/createElement'\r\nimport zIndex from '@/utils/dom/zIndex'\r\nimport on from '@/utils/event/on'\r\nimport off from '@/utils/event/off'\r\n\r\nimport paint from '@/utils/icons/paint'\r\nimport icon from '@/utils/icons/icon'\r\n\r\nimport Component from '@/component'\r\n\r\nimport './drawer.less'\r\n\r\nclass Drawer extends Component {\r\n constructor(options) {\r\n super()\r\n\r\n this._default()\r\n\r\n this.zIndex = 0\r\n\r\n if (options) {\r\n this.initialize(options)\r\n }\r\n }\r\n\r\n _default() {\r\n this.attrs = cloneDeep(Drawer.DEFAULTS)\r\n this.title = ''\r\n this.closed = false\r\n\r\n this.$el = null\r\n this.$modal = null\r\n this.$header = null\r\n this.$title = null\r\n this.$close = null\r\n this.$main = null\r\n this.$footer = null\r\n this.$overlay = null\r\n\r\n return this\r\n }\r\n\r\n initialize(options) {\r\n let created\r\n\r\n this.attr(options)\r\n\r\n this.title = this.attr('title')\r\n created = this.attr('created')\r\n\r\n if (isFunction(created)) {\r\n created.call(this)\r\n }\r\n\r\n this.render().addListeners()\r\n return this\r\n }\r\n\r\n setTitle(title) {\r\n this.attr('title', title)\r\n this.title = title\r\n this.$title.innerHTML = title\r\n\r\n return this\r\n }\r\n\r\n isClosed() {\r\n return this.closed\r\n }\r\n\r\n render() {\r\n const mounted = this.attr('mounted')\r\n const size = this.attr('size')\r\n const placement = this.attr('placement')\r\n const hasClose = this.attr('hasClose')\r\n const hasOverlay = this.attr('hasOverlay')\r\n const hasOffset = this.attr('hasOffset')\r\n const hasPadding = this.attr('hasPadding')\r\n const autoHeight = this.attr('autoHeight')\r\n const overflow = this.attr('overflow')\r\n const customClass = this.attr('customClass')\r\n let mainClassName = 'outline-drawer__main'\r\n let $el\r\n let $modal\r\n let $header\r\n let $title\r\n let $close\r\n let $main\r\n let $footer\r\n let $overlay\r\n\r\n paint()\r\n this.zIndex = zIndex()\r\n\r\n $title = createElement(\r\n 'h2',\r\n {\r\n className: 'outline-drawer__title'\r\n },\r\n this.title\r\n )\r\n this.$title = $title\r\n\r\n if (hasClose) {\r\n $close = createElement(\r\n 'div',\r\n {\r\n className: 'outline-drawer__close'\r\n },\r\n icon('close', { iconSet: 'outline', size: 20 })\r\n )\r\n this.$close = $close\r\n }\r\n\r\n $header = createElement(\r\n 'header',\r\n {\r\n className: 'outline-drawer__header'\r\n },\r\n [$title, $close]\r\n )\r\n this.$header = $header\r\n\r\n if (overflow === 'hidden') {\r\n mainClassName += ' overflow-hidden'\r\n }\r\n\r\n $main = createElement('div', {\r\n className: mainClassName\r\n })\r\n this.$main = $main\r\n\r\n if (!hasPadding) {\r\n addClass($main, 'outline-drawer_full')\r\n }\r\n\r\n $footer = createElement('footer', {\r\n className: 'outline-drawer__footer'\r\n })\r\n this.$footer = $footer\r\n\r\n $modal = createElement(\r\n 'div',\r\n {\r\n className: `outline-drawer__modal outline-drawer_${placement} outline-drawer_${size} outline-drawer_closed`\r\n },\r\n [$header, $main, $footer]\r\n )\r\n this.$modal = $modal\r\n\r\n if (hasOffset) {\r\n addClass($modal, 'outline-drawer_offset')\r\n }\r\n\r\n if (autoHeight) {\r\n addClass($modal, 'outline-drawer_auto')\r\n }\r\n\r\n if (customClass) {\r\n addClass($modal, customClass)\r\n }\r\n\r\n if (hasOverlay) {\r\n $overlay = createElement('div', {\r\n className: 'outline-drawer__overlay'\r\n })\r\n this.$overlay = $overlay\r\n }\r\n\r\n $el = createElement(\r\n 'div',\r\n {\r\n className: `outline-drawer`\r\n },\r\n [$modal, $overlay]\r\n )\r\n this.$el = $el\r\n document.body.appendChild($el)\r\n\r\n if (isFunction(mounted)) {\r\n mounted.call(this)\r\n }\r\n\r\n return this\r\n }\r\n\r\n erase() {\r\n this.$main.innerHTML = ''\r\n return this\r\n }\r\n\r\n _paint(content) {\r\n let $content = null\r\n\r\n if (isFunction(content)) {\r\n $content = content()\r\n } else if (isDOM(content)) {\r\n $content = content\r\n } else if (isHTML(content)) {\r\n $content = html(content)\r\n }\r\n\r\n if ($content) {\r\n this.$main.appendChild($content)\r\n }\r\n\r\n return this\r\n }\r\n\r\n _remove() {\r\n document.body.removeChild(this.$el)\r\n return this\r\n }\r\n\r\n refresh(content) {\r\n this.erase()._paint(content)\r\n return this\r\n }\r\n\r\n open() {\r\n const opened = this.attr('afterOpened')\r\n const $modal = this.$modal\r\n\r\n addClass(this.$el, 'outline-drawer_opened')\r\n removeClass($modal, 'outline-drawer_closed')\r\n addClass($modal, 'outline-drawer_opened')\r\n\r\n later(() => {\r\n this.closed = false\r\n\r\n if (isFunction(opened)) {\r\n opened.call(this)\r\n }\r\n })\r\n\r\n return this\r\n }\r\n\r\n close() {\r\n const closed = this.attr('afterClosed')\r\n const $modal = this.$modal\r\n\r\n removeClass($modal, 'outline-drawer_opened')\r\n addClass($modal, 'outline-drawer_closed')\r\n\r\n later(() => {\r\n removeClass(this.$el, 'outline-drawer_opened')\r\n this.closed = true\r\n\r\n if (isFunction(closed)) {\r\n closed.call(this)\r\n }\r\n })\r\n\r\n return this\r\n }\r\n\r\n toggle() {\r\n const afterToggle = this.attr('afterToggle')\r\n const closed = this.isClosed()\r\n\r\n if (closed) {\r\n this.open()\r\n } else {\r\n this.close()\r\n }\r\n\r\n if (isFunction(afterToggle)) {\r\n later(() => {\r\n afterToggle.call(this, closed)\r\n })\r\n }\r\n\r\n return this\r\n }\r\n\r\n destroy() {\r\n const afterDestroy = this.attr('afterDestroy')\r\n const beforeDestroy = this.attr('beforeDestroy')\r\n let index = this.zIndex\r\n\r\n if (isFunction(beforeDestroy)) {\r\n beforeDestroy.call(this)\r\n }\r\n\r\n this.removeListeners()._remove()._default()\r\n\r\n index -= 1\r\n zIndex(index)\r\n this.zIndex = 0\r\n\r\n if (isFunction(afterDestroy)) {\r\n afterDestroy.call(this)\r\n }\r\n\r\n return this\r\n }\r\n\r\n onClose() {\r\n this.close()\r\n return this\r\n }\r\n\r\n addListeners() {\r\n const hasClose = this.attr('hasClose')\r\n const hasOverlay = this.attr('hasOverlay')\r\n const closeOnClickModal = this.attr('closeOnClickModal')\r\n const $el = this.$el\r\n\r\n if (hasClose) {\r\n on($el, '.outline-drawer__close', 'click', this.onClose, this, true)\r\n }\r\n\r\n if (hasOverlay && closeOnClickModal) {\r\n on($el, '.outline-drawer__overlay', 'click', this.onClose, this, true)\r\n }\r\n\r\n return this\r\n }\r\n\r\n removeListeners() {\r\n const hasClose = this.attr('hasClose')\r\n const hasOverlay = this.attr('hasOverlay')\r\n const $el = this.$el\r\n\r\n if (!hasClose && !hasOverlay) {\r\n return this\r\n }\r\n\r\n off($el, 'click', this.onClose)\r\n\r\n return this\r\n }\r\n}\r\n\r\nDrawer.DEFAULTS = (() => {\r\n const OPTIONS = {\r\n placement: 'rtl',\r\n title: '标题',\r\n size: 'regular',\r\n hasClose: true,\r\n hasOverlay: true,\r\n hasOffset: false,\r\n hasPadding: true,\r\n autoHeight: true,\r\n closeOnClickModal: true,\r\n overflow: 'auto',\r\n created: null,\r\n mounted: null,\r\n afterClosed: null,\r\n afterOpened: null,\r\n afterScroll: null,\r\n beforeDestroy: null,\r\n afterDestroy: null,\r\n afterToggle: null\r\n }\r\n\r\n return cloneDeep(OPTIONS)\r\n})()\r\n\r\nexport default Drawer\r\n","import isHTML from '../types/isHTML'\r\nimport isString from '../types/isString'\r\nimport isElement from '../types/isElement'\r\nimport stripScripts from '../lang/stripScripts'\r\nimport createElement from './createElement'\r\n\r\n/**\r\n * 获取或者设置 DOM 元素的 innerHTML 属性值,或者通过 HTML 字符串,创建 DOM 元素\r\n * ========================================================================\r\n * @method html\r\n * @param {HTMLElement|String} el\r\n * @param {String} [strHTML]\r\n * @return {DocumentFragment|null|*}\r\n */\r\nconst html = (el, strHTML) => {\r\n const $fragment = document.createDocumentFragment()\r\n\r\n if (!el || (!isHTML(el) && !isString(el) && !isElement(el))) {\r\n return null\r\n }\r\n\r\n if (isHTML(el)) {\r\n const template = createElement('div')\r\n let children = []\r\n\r\n template.innerHTML = stripScripts(el)\r\n children = [...template.childNodes]\r\n children.forEach((child) => {\r\n $fragment.appendChild(child)\r\n })\r\n\r\n return $fragment\r\n } else if (isString(strHTML)) {\r\n el.innerHTML = stripScripts(strHTML)\r\n } else {\r\n return el.innerHTML\r\n }\r\n}\r\n\r\nexport default html\r\n","import isFunction from '@/utils/types/isFunction'\r\nimport off from './off'\r\n\r\nimport { CAPTURE_EVENTS } from './enum'\r\n\r\n/**\r\n * 绑定事件\r\n * ========================================================================\r\n * @method at\r\n * @param {HTMLElement|String|Object} el - (必须)绑定代理事件的 DOM 节点\r\n * @param {String|Function} type - (必须)事件类型或者事件处理器回调函数\r\n * @param {Function|Object} fn - (必须) 事件处理器回调函数或者传递给事件处理器回调函数的数据对象\r\n * @param {Object|Boolean} [data] - (可选)传递给事件处理器回调函数的数据对象或者事件处理器回调函数的 this 上下文指向,\r\n * @param {Object|Boolean} [context] - (可选)事件处理器回调函数的 this 上下文指向,或者是否仅触发一次\r\n * 当设置为 true 时,则事件处理器回调函数的 this 上下文指向为 data 对象\r\n * @param {Boolean} once - (可选)是否仅触发一次\r\n */\r\nconst at = (el, type, fn, data, context, once = false) => {\r\n // CAPTURE_EVENTS 中的特殊事件,采用事件捕获模型\r\n const capture = CAPTURE_EVENTS.indexOf(type) > -1\r\n const listener = function (evt) {\r\n let overrideContext = context || el\r\n\r\n // 当设置为 true 时,则事件处理器回调函数的\r\n // this 上下文指向为 data 对象\r\n if (context === true) {\r\n overrideContext = data\r\n }\r\n\r\n // 仅触发一次\r\n /* istanbul ignore else */\r\n if (once === true) {\r\n off(el, type, listener)\r\n }\r\n\r\n fn.call(overrideContext, evt, data)\r\n }\r\n\r\n if (!isFunction(fn)) {\r\n return false\r\n }\r\n\r\n if (!el._listeners) {\r\n el._listeners = []\r\n }\r\n\r\n // 缓存 options 元素绑定的事件处理器\r\n el._listeners.push({\r\n el,\r\n type,\r\n fn: listener,\r\n data,\r\n context,\r\n capture\r\n })\r\n\r\n // 缓存包装后的事件处理器\r\n fn._delegateListener = listener\r\n\r\n el.addEventListener(type, listener, capture)\r\n}\r\n\r\nexport default at\r\n","/**\r\n * 获取HTML元素的某个CSS样式值\r\n * ====================================================\r\n * @param el\r\n * @param ruleName\r\n * @returns {*}\r\n */\r\nconst getStyle = (el, ruleName) => {\r\n return getComputedStyle(el)[ruleName]\r\n}\r\n\r\nexport default getStyle\r\n","import isString from '@/utils/types/isString'\r\nimport isFunction from '@/utils/types/isFunction'\r\nimport isElement from '@/utils/types/isElement'\r\nimport later from '@/utils/lang/later'\r\nimport cloneDeep from '@/utils/lang/cloneDeep'\r\n\r\nimport at from '@/utils/event/at'\r\nimport on from '@/utils/event/on'\r\nimport off from '@/utils/event/off'\r\nimport stop from '@/utils/event/stop'\r\n\r\nimport createElement from '@/utils/dom/createElement'\r\nimport scrollTo from '@/utils/dom/scrollTo'\r\nimport addClass from '@/utils/dom/addClass'\r\nimport intersection from '@/utils/dom/intersection'\r\nimport removeClass from '@/utils/dom/removeClass'\r\nimport offsetTop from '@/utils/dom/offsetTop'\r\nimport getStyle from '@/utils/dom/getStyle'\r\nimport setProperty from '@/utils/dom/setProperty'\r\nimport inBounding from '@/utils/dom/inBounding'\r\nimport getScrollElement from '@/utils/dom/getScrollElement'\r\n\r\nimport Component from '@/component'\r\n\r\nimport _paintChapters from './utils/_paintChapters'\r\n\r\nimport './navigator.less'\r\n\r\nconst HIDDEN = 'outline-navigator_hidden'\r\nconst EXPANDED = 'outline-navigator_expanded'\r\nconst FOLDED = 'outline-navigator_folded'\r\n\r\nclass Navigator extends Component {\r\n constructor(options) {\r\n super()\r\n\r\n this._default()\r\n\r\n this.scrollTimer = null\r\n this.resizeTimer = null\r\n this.observerTimer = null\r\n this.Observer = null\r\n\r\n if (options) {\r\n this.initialize(options)\r\n }\r\n }\r\n\r\n _default() {\r\n this.attrs = cloneDeep(Navigator.DEFAULTS)\r\n\r\n this.$el = null\r\n this.$title = null\r\n this.$main = null\r\n this.$list = null\r\n this.$placeholder = null\r\n this.$parentElement = null\r\n this.$scrollElement = null\r\n this.$active = null\r\n\r\n this.chapters = []\r\n this.active = 0\r\n this.offsetWidth = 0\r\n this.offsetTop = 0\r\n this.playing = false\r\n this.closed = false\r\n\r\n return this\r\n }\r\n\r\n initialize(options) {\r\n let created\r\n let parentElement\r\n let scrollElement\r\n let $parent\r\n\r\n this.attr(options)\r\n\r\n created = this.attr('created')\r\n parentElement = this.attr('parentElement')\r\n scrollElement = this.attr('scrollElement')\r\n\r\n if (isString(parentElement)) {\r\n $parent = document.querySelector(parentElement)\r\n } else if (isElement(parentElement)) {\r\n $parent = parentElement\r\n }\r\n this.$parentElement = $parent\r\n this.$scrollElement = getScrollElement(scrollElement)\r\n\r\n this.chapters = this.attr('chapters')\r\n this.closed = this.attr('closed')\r\n this.active = this.attr('active')\r\n\r\n if (isFunction(created)) {\r\n created.call(this)\r\n }\r\n\r\n if (this.chapters.length < 1) {\r\n return this\r\n }\r\n\r\n this.render().addListeners()\r\n\r\n this.$active = document.querySelector(`#chapter-${this.active}`)\r\n\r\n return this\r\n }\r\n\r\n isClosed() {\r\n return this.closed\r\n }\r\n\r\n isSticky() {\r\n const position = this.attr('position')\r\n return position === 'sticky'\r\n }\r\n\r\n isFixed() {\r\n const position = this.attr('position')\r\n return position === 'fixed'\r\n }\r\n\r\n isInside() {\r\n return this.isFixed() || this.isSticky()\r\n }\r\n\r\n isOutside() {\r\n return !this.isInside()\r\n }\r\n\r\n count() {\r\n return this.chapters.length\r\n }\r\n\r\n _paintEdge() {\r\n const $fragment = document.createDocumentFragment()\r\n const STICKY = 'outline-navigator_sticky'\r\n const title = this.attr('title')\r\n const animationCurrent = this.attr('animationCurrent')\r\n const customClass = this.attr('customClass')\r\n const $parentElement = this.$parentElement\r\n const children = []\r\n const contents = []\r\n let $title = null\r\n let $el\r\n let $main\r\n let $list\r\n let $placeholder\r\n\r\n if (!$parentElement) {\r\n return this\r\n }\r\n\r\n if (this.isInside() && title) {\r\n $title = createElement(\r\n 'h2',\r\n {\r\n className: 'outline-navigator__title'\r\n },\r\n title\r\n )\r\n this.$title = $title\r\n contents.push($title)\r\n }\r\n\r\n $list = createElement('ul', {\r\n // 为优化性能,添加了 _fixed 和 _hidden\r\n // fixed 为了让 $list 脱离流布局\r\n // hidden 让 $list 不可见\r\n className: `outline-navigator__list`\r\n })\r\n this.$list = $list\r\n children.push($list)\r\n\r\n if (animationCurrent) {\r\n $placeholder = createElement('div', {\r\n className: 'outline-navigator__placeholder'\r\n })\r\n this.$placeholder = $placeholder\r\n children.push($placeholder)\r\n }\r\n\r\n $main = createElement(\r\n 'div',\r\n {\r\n className: 'outline-navigator__main'\r\n },\r\n children\r\n )\r\n this.$main = $main\r\n contents.push($main)\r\n\r\n $el = createElement(\r\n 'nav',\r\n {\r\n id: 'outline-navigator',\r\n className: `outline-navigator ${HIDDEN}`\r\n },\r\n contents\r\n )\r\n this.$el = $el\r\n\r\n if (this.isSticky()) {\r\n this.calculateStickyHeight()\r\n addClass($el, STICKY)\r\n }\r\n\r\n if (customClass) {\r\n addClass($el, customClass)\r\n }\r\n $fragment.appendChild($el)\r\n $parentElement.appendChild($fragment)\r\n\r\n return this\r\n }\r\n\r\n render() {\r\n const mounted = this.attr('mounted')\r\n const $parentElement = this.$parentElement\r\n const chapters = this.chapters\r\n const count = this.count()\r\n let $el\r\n\r\n if (!$parentElement || chapters.length < 1) {\r\n return this\r\n }\r\n\r\n if (this.isInside()) {\r\n addClass($parentElement, 'outline-navigator-parent')\r\n }\r\n\r\n this._paintEdge()\r\n $el = this.$el\r\n\r\n this._paint(chapters)\r\n\r\n later(() => {\r\n this.highlight(this.active)\r\n }, 60)\r\n\r\n this.offsetTop = offsetTop($el)\r\n this.offsetWidth = $el.offsetWidth\r\n\r\n if (this.isFixed()) {\r\n this.sticky()\r\n setProperty('--outline-navigator-width', `${this.offsetWidth}px`)\r\n }\r\n\r\n if (isFunction(mounted)) {\r\n mounted.call(this)\r\n }\r\n\r\n if (count < 400) {\r\n this.onObserver()\r\n }\r\n\r\n return this\r\n }\r\n\r\n erase() {\r\n this.$list.innerHTML = ''\r\n\r\n return this\r\n }\r\n\r\n _paint(chapters) {\r\n const showCode = this.attr('showCode')\r\n const $el = this.$el\r\n const $list = this.$list\r\n\r\n _paintChapters($list, chapters, showCode)\r\n removeClass($el, HIDDEN)\r\n addClass($el, EXPANDED)\r\n\r\n return this\r\n }\r\n\r\n _remove() {\r\n this.$parentElement.removeChild(this.$el)\r\n return this\r\n }\r\n\r\n refresh(chapters) {\r\n const $el = this.$el\r\n\r\n removeClass($el, HIDDEN)\r\n this.erase()._paint(chapters)\r\n\r\n return this\r\n }\r\n\r\n _getPlaceholderOffset(index) {\r\n const $main = this.$main\r\n const $list = this.$list\r\n const $anchor = $list.querySelector('.outline-navigator__anchor')\r\n const mainPaddingTop = parseInt(getStyle($main, 'padding-top'), 10)\r\n const mainBorderTop = parseInt(getStyle($main, 'border-top-width'), 10)\r\n const placeholderPaddingTop = parseInt(getStyle($list, 'padding-top'), 10)\r\n const placeholderMarginTop = parseInt(getStyle($list, 'margin-top'), 10)\r\n const placeholderBorderTop = parseInt(\r\n getStyle($list, 'border-top-width'),\r\n 10\r\n )\r\n let height = $anchor.offsetHeight\r\n let offsetTop = 0\r\n let top\r\n\r\n if (mainPaddingTop) {\r\n offsetTop += mainPaddingTop\r\n }\r\n\r\n if (placeholderPaddingTop) {\r\n offsetTop += placeholderPaddingTop\r\n }\r\n\r\n if (placeholderMarginTop) {\r\n offsetTop += placeholderMarginTop\r\n }\r\n\r\n if (mainBorderTop) {\r\n offsetTop += mainBorderTop\r\n }\r\n\r\n if (placeholderBorderTop) {\r\n offsetTop += placeholderBorderTop\r\n }\r\n\r\n top = height * index\r\n\r\n return offsetTop + top\r\n }\r\n\r\n positionPlaceholder(index) {\r\n const $list = this.$list\r\n const $placeholder = this.$placeholder\r\n const $anchor = $list.querySelector('.outline-navigator__anchor')\r\n const animationCurrent = this.attr('animationCurrent')\r\n const height = $anchor.offsetHeight\r\n let offsetTop = 0\r\n\r\n if (!animationCurrent) {\r\n return this\r\n }\r\n\r\n offsetTop = this._getPlaceholderOffset(index)\r\n\r\n $placeholder.style.cssText = `transform: translateY(${offsetTop}px);height:${height}px;`\r\n\r\n return this\r\n }\r\n\r\n highlight(id) {\r\n const $el = this.$el\r\n const animationCurrent = this.attr('animationCurrent')\r\n const position = this.attr('position')\r\n const ACTIVE = 'outline-navigator_active'\r\n const HIGHLIGHT = 'outline-navigator_highlight'\r\n let $parent = position === 'relative' ? this.$parentElement : this.$main\r\n let $anchor = null\r\n let placeholderOffsetTop = 0\r\n\r\n if (!$el) {\r\n return this\r\n }\r\n\r\n $anchor = $el.querySelector(`#chapter__anchor-${id}`)\r\n\r\n if (!$anchor) {\r\n return this\r\n }\r\n\r\n this.active = parseInt($anchor.getAttribute('data-id'), 10)\r\n\r\n if (this.$active) {\r\n removeClass(this.$active, HIGHLIGHT)\r\n removeClass(this.$active, ACTIVE)\r\n }\r\n\r\n this.$active = $anchor\r\n addClass(this.$active, ACTIVE)\r\n\r\n if (animationCurrent) {\r\n this.positionPlaceholder(this.active)\r\n } else {\r\n addClass(this.$active, HIGHLIGHT)\r\n }\r\n\r\n later(() => {\r\n if (!inBounding(this.$active, $parent)) {\r\n placeholderOffsetTop = this._getPlaceholderOffset(this.active)\r\n scrollTo($parent, placeholderOffsetTop)\r\n }\r\n })\r\n\r\n return this\r\n }\r\n\r\n sticky() {\r\n const afterSticky = this.attr('afterSticky')\r\n const FIXED = 'outline-navigator_fixed'\r\n const $el = this.$el\r\n const top = this.offsetTop\r\n const scrollTop = this.$scrollElement.scrollTop\r\n let isStickying\r\n\r\n if (!this.isFixed()) {\r\n return this\r\n }\r\n\r\n isStickying = scrollTop >= top\r\n\r\n if (isStickying) {\r\n addClass($el, FIXED)\r\n } else {\r\n removeClass($el, FIXED)\r\n }\r\n\r\n if (isFunction(afterSticky)) {\r\n afterSticky.call(this, this.isClosed(), isStickying)\r\n }\r\n\r\n return this\r\n }\r\n\r\n calculateStickyHeight() {\r\n const documentElement = document.documentElement\r\n const height = Math.max(\r\n documentElement.clientHeight || 0,\r\n window.innerHeight || 0\r\n )\r\n setProperty('--outline-sticky-height', `${height}px`)\r\n return this\r\n }\r\n\r\n scrollTo(top, after) {\r\n const el = this.$scrollElement\r\n\r\n scrollTo(el, top, after)\r\n\r\n return this\r\n }\r\n\r\n show() {\r\n const opened = this.attr('afterOpened')\r\n const count = this.count()\r\n const $el = this.$el\r\n const $parent = this.$parentElement\r\n\r\n if (this.isInside()) {\r\n if (count > 800) {\r\n removeClass($parent, HIDDEN)\r\n } else {\r\n removeClass($parent, HIDDEN)\r\n later(() => {\r\n removeClass($parent, FOLDED)\r\n addClass($parent, EXPANDED)\r\n }, 30)\r\n }\r\n } else {\r\n removeClass($el, HIDDEN)\r\n }\r\n this.closed = false\r\n\r\n if (isFunction(opened)) {\r\n opened.call(this)\r\n }\r\n\r\n return this\r\n }\r\n\r\n hide() {\r\n const closed = this.attr('afterClosed')\r\n const count = this.count()\r\n const $el = this.$el\r\n const $parent = this.$parentElement\r\n\r\n if (this.isInside()) {\r\n if (count > 800) {\r\n addClass($parent, HIDDEN)\r\n } else {\r\n addClass($parent, FOLDED)\r\n removeClass($parent, EXPANDED)\r\n later(() => {\r\n addClass($parent, HIDDEN)\r\n })\r\n }\r\n } else {\r\n addClass($el, HIDDEN)\r\n }\r\n this.closed = true\r\n\r\n if (isFunction(closed)) {\r\n closed.call(this)\r\n }\r\n\r\n return this\r\n }\r\n\r\n toggle() {\r\n const afterToggle = this.attr('afterToggle')\r\n const top = this.offsetTop\r\n const scrollTop = this.$scrollElement.scrollTop\r\n let isStickying\r\n\r\n if (this.isClosed()) {\r\n this.show()\r\n } else {\r\n this.hide()\r\n }\r\n\r\n if (isFunction(afterToggle)) {\r\n later(() => {\r\n isStickying = scrollTop >= top\r\n afterToggle.call(this, this.isClosed(), isStickying)\r\n })\r\n }\r\n\r\n return this\r\n }\r\n\r\n destroy() {\r\n const beforeDestroy = this.attr('beforeDestroy')\r\n const afterDestroy = this.attr('afterDestroy')\r\n\r\n if (isFunction(beforeDestroy)) {\r\n beforeDestroy.call(this)\r\n }\r\n\r\n this.removeListeners()._remove()._default()\r\n\r\n if (this.scrollTimer) {\r\n clearTimeout(this.scrollTimer)\r\n this.scrollTimer = null\r\n }\r\n\r\n if (this.resizeTimer) {\r\n clearTimeout(this.resizeTimer)\r\n this.resizeTimer = null\r\n }\r\n\r\n if (this.observerTimer) {\r\n clearTimeout(this.observerTimer)\r\n this.observerTimer = null\r\n }\r\n\r\n if (this.Observer) {\r\n this.Observer = null\r\n }\r\n\r\n if (isFunction(afterDestroy)) {\r\n afterDestroy.call(this)\r\n }\r\n\r\n return this\r\n }\r\n\r\n onObserver() {\r\n const selector = this.attr('selector')\r\n\r\n this.Observer = intersection(\r\n ($heading) => {\r\n const id = $heading.getAttribute('data-id')\r\n\r\n if (this.playing) {\r\n return false\r\n }\r\n\r\n if (this.observerTimer) {\r\n clearTimeout(this.observerTimer)\r\n }\r\n\r\n this.observerTimer = later(() => {\r\n this.highlight(id)\r\n }, 100)\r\n },\r\n {\r\n selector,\r\n context: this\r\n }\r\n )\r\n\r\n return this\r\n }\r\n\r\n onSelect(evt) {\r\n const stickyHeight = this.attr('stickyHeight')\r\n const $anchor = evt.delegateTarget\r\n const id = $anchor.getAttribute('data-id')\r\n const headingId = $anchor.href.split('#')[1]\r\n const $heading = document.querySelector(`#${headingId}`)\r\n const top = offsetTop($heading) - (stickyHeight + 10)\r\n const min = 0\r\n const max = this.$scrollElement.scrollHeight\r\n const afterScroll = this.attr('afterScroll')\r\n const after = () => {\r\n if (isFunction(afterScroll)) {\r\n afterScroll.call(this, 'chapter')\r\n }\r\n\r\n later(() => {\r\n this.playing = false\r\n this.$emit('toolbar:update', {\r\n top,\r\n min,\r\n max\r\n })\r\n })\r\n }\r\n\r\n this.playing = true\r\n if (this.isFixed()) {\r\n this.sticky()\r\n later(() => {\r\n this.scrollTo(top, after)\r\n this.highlight(id)\r\n }, 10)\r\n } else {\r\n this.scrollTo(top, after)\r\n this.highlight(id)\r\n }\r\n\r\n stop(evt)\r\n\r\n return this\r\n }\r\n\r\n onScroll() {\r\n const $scrollElement = this.$scrollElement\r\n\r\n if (this.scrollTimer) {\r\n clearTimeout(this.scrollTimer)\r\n }\r\n\r\n this.scrollTimer = later(() => {\r\n const top = $scrollElement.scrollTop\r\n const min = 0\r\n const max = $scrollElement.scrollHeight - $scrollElement.clientHeight\r\n\r\n if (this.isFixed()) {\r\n this.sticky()\r\n }\r\n\r\n this.$emit('toolbar:update', {\r\n top,\r\n min,\r\n max\r\n })\r\n }, 100)\r\n\r\n return this\r\n }\r\n\r\n onResize() {\r\n // 添加判断\r\n if (!this.isSticky()) {\r\n return this\r\n }\r\n\r\n if (this.resizeTimer) {\r\n clearTimeout(this.resizeTimer)\r\n }\r\n\r\n this.resizeTimer = later(() => {\r\n this.calculateStickyHeight()\r\n })\r\n\r\n return this\r\n }\r\n\r\n onRefresh(chapters) {\r\n this.refresh(chapters)\r\n\r\n return this\r\n }\r\n\r\n addListeners() {\r\n const $el = this.$el\r\n const $scrollElement = this.$scrollElement\r\n const tagName = $scrollElement.tagName.toLowerCase()\r\n let $element = $scrollElement\r\n\r\n if (this.count() < 1) {\r\n return this\r\n }\r\n\r\n if (tagName === 'html' || tagName === 'body') {\r\n $element = window\r\n }\r\n\r\n on($el, '.outline-navigator__anchor', 'click', this.onSelect, this, true)\r\n at($element, 'scroll', this.onScroll, this, true)\r\n if (this.isSticky()) {\r\n at(window, 'resize', this.onResize, this, true)\r\n }\r\n\r\n this.$on('anchors:all:paint', this.onObserver, this)\r\n this.$on('navigator:refresh', this.onRefresh, this)\r\n\r\n return this\r\n }\r\n\r\n removeListeners() {\r\n const selector = this.attr('selector')\r\n const $el = this.$el\r\n const $scrollElement = this.$scrollElement\r\n const tagName = $scrollElement.tagName.toLowerCase()\r\n let $element = $scrollElement\r\n\r\n if (this.count() < 1) {\r\n return this\r\n }\r\n\r\n if (tagName === 'html' || tagName === 'body') {\r\n $element = window\r\n }\r\n\r\n off($el, 'click', this.onSelect)\r\n off($element, 'scroll', this.onScroll)\r\n if (this.isSticky()) {\r\n off(window, 'resize', this.onResize)\r\n }\r\n this.$off('anchors:all:paint')\r\n this.$off('navigator:refresh')\r\n\r\n if (this.Observer) {\r\n document.querySelectorAll(selector).forEach((section) => {\r\n this.Observer.unobserve(section)\r\n })\r\n }\r\n\r\n return this\r\n }\r\n}\r\n\r\nNavigator.DEFAULTS = (() => {\r\n const OPTIONS = {\r\n parentElement: '',\r\n scrollElement: '',\r\n selector: '.outline-heading',\r\n active: 0,\r\n closed: false,\r\n showCode: true,\r\n animationCurrent: true,\r\n position: 'relative',\r\n stickyHeight: 0,\r\n chapters: [],\r\n created: null,\r\n mounted: null,\r\n afterClosed: null,\r\n afterOpened: null,\r\n afterScroll: null,\r\n beforeDestroy: null,\r\n afterDestroy: null,\r\n afterSticky: null\r\n }\r\n\r\n return cloneDeep(OPTIONS)\r\n})()\r\n\r\nexport default Navigator\r\n","import createElement from '@/utils/dom/createElement'\r\nimport timeSlice from '@/utils/lang/timeSlice'\r\n\r\nconst _paintChapters = ($list, chapters, showCode = false) => {\r\n const LIMIT = 400\r\n const count = chapters.length\r\n const clones = [...chapters]\r\n const paint = (parts) => {\r\n const byId = (id) => $list.querySelector(`#${id}`)\r\n parts.forEach((chapter) => {\r\n const pid = chapter.pid\r\n const id = chapter.id\r\n const code = chapter.code\r\n const rel = chapter.rel\r\n const children = []\r\n const $text = createElement(\r\n 'span',\r\n {\r\n className: 'outline-navigator__text'\r\n },\r\n chapter.text\r\n )\r\n let $link\r\n let $code\r\n let $li\r\n let $subject\r\n let $chapter\r\n\r\n if (showCode) {\r\n $code = createElement(\r\n 'span',\r\n {\r\n className: 'outline-navigator__code',\r\n 'data-id': id\r\n },\r\n chapter.code\r\n )\r\n\r\n children.push($code)\r\n }\r\n\r\n children.push($text)\r\n\r\n $link = createElement(\r\n 'a',\r\n {\r\n id: `chapter__anchor-${id}`,\r\n className: 'outline-navigator__anchor',\r\n href: '#' + rel,\r\n rel: rel,\r\n 'data-id': id,\r\n 'data-code': code\r\n },\r\n children\r\n )\r\n\r\n $li = createElement(\r\n 'li',\r\n {\r\n id: `chapter-${id}`,\r\n className: 'outline-navigator__item',\r\n 'data-id': id,\r\n 'data-code': code\r\n },\r\n $link\r\n )\r\n\r\n if (pid === -1) {\r\n $list.appendChild($li)\r\n } else {\r\n $chapter = byId(`chapter-${pid}`)\r\n $subject = byId(`subject-${pid}`)\r\n\r\n if (!$subject) {\r\n $subject = createElement(\r\n 'ul',\r\n {\r\n id: 'subject-' + pid,\r\n className: 'outline-navigator__subject'\r\n },\r\n $li\r\n )\r\n\r\n $chapter.appendChild($subject)\r\n } else {\r\n $subject.appendChild($li)\r\n }\r\n }\r\n })\r\n }\r\n\r\n // 在大量 DOM 菜单绘制的时候,使用 TIME SLICE 拆分绘制任务\r\n // 以避免一次绘制大量 DOM 导致占用资源过高,导致卡死\r\n if (count > LIMIT) {\r\n // 同步绘制\r\n paint(clones.splice(0, LIMIT))\r\n\r\n // 剩余的采用 timeSlice 机制绘制\r\n while (clones.length > 0) {\r\n const once = clones.splice(0, LIMIT)\r\n timeSlice(() => {\r\n paint(once)\r\n })\r\n }\r\n } else {\r\n paint(clones)\r\n }\r\n}\r\n\r\nexport default _paintChapters\r\n","import isElement from '../types/isElement'\r\n\r\n/**\r\n * 检测某个 DOM 节点的位置是否在另个一个 DOM 节点范围内\r\n * ========================================================================\r\n * @method inBounding\r\n * @param {HTMLElement} child\r\n * @param {HTMLElement} parent\r\n * @return {Boolean}\r\n */\r\nconst inBounding = (child, parent) => {\r\n let isInBounding = false\r\n let parentRect\r\n let childRect\r\n\r\n if (!isElement(child) || !isElement(parent)) {\r\n return isInBounding\r\n }\r\n\r\n parentRect = parent.getBoundingClientRect()\r\n childRect = child.getBoundingClientRect()\r\n\r\n isInBounding = !!(\r\n childRect.top >= parentRect.top &&\r\n childRect.right <= parentRect.right &&\r\n childRect.bottom <= parentRect.bottom &&\r\n childRect.left >= parentRect.left\r\n )\r\n\r\n return isInBounding\r\n}\r\n\r\nexport default inBounding\r\n","import isFunction from '../types/isFunction'\r\nimport isElement from '../types/isElement'\r\n\r\n/**\r\n * 通用的 IntersectionObserver 观察者处理器\r\n * ========================================================================\r\n * @method intersection\r\n * @param {Function} fn\r\n * @param {Object} [props]\r\n * @param {Object|HTMLElement} [props.root]\r\n * @param {String} [props.selector]\r\n * @param {Object} [props.context]\r\n * @param {String} [props.attr]\r\n * @param {String} [props.rootMargin]\r\n */\r\nconst intersection = (fn, props = {}) => {\r\n const root = props.root || null\r\n const selector = props.selector || '.outline-heading'\r\n const context = props.context || null\r\n const rootMargin = props.rootMargin || '0px 0px -90% 0px'\r\n const options = {\r\n rootMargin: rootMargin\r\n }\r\n // eslint-disable-next-line compat/compat\r\n const Observer = new IntersectionObserver((entries) => {\r\n entries.forEach((entry) => {\r\n if (entry.intersectionRatio > 0) {\r\n if (isFunction(fn)) {\r\n fn.call(context || entry.target, entry.target)\r\n }\r\n }\r\n })\r\n }, options)\r\n const $root = isElement(root) ? root : document\r\n\r\n if (root) {\r\n options.root = root\r\n }\r\n\r\n $root.querySelectorAll(selector).forEach((section) => {\r\n Observer.observe(section)\r\n })\r\n\r\n return Observer\r\n}\r\n\r\nexport default intersection\r\n","/**\r\n * 检测当前设备是否为移动设备\r\n * ========================================================================\r\n * @method isMobile\r\n * @return {boolean}\r\n */\r\nconst isMobile = () => {\r\n const ua = navigator.userAgent\r\n\r\n return /Mobile|mini|Fennec|Android|iP(ad|od|hone)|NokiaN[^/]*/.test(ua)\r\n}\r\n\r\nexport default isMobile\r\n","import isObjectLike from './isObjectLike'\r\n\r\n/**\r\n * 检测测试数据是否为普通对象\r\n * ========================================================================\r\n * @method isPlainObject\r\n * @param {Object} val - 要检测的数据\r\n * @returns {Boolean} 'val' 是普通对象,返回 true,否则返回 false\r\n */\r\nconst isPlainObject = (val) => {\r\n const getPrototypeOf = Object.getPrototypeOf\r\n let proto\r\n\r\n // Detect obvious negatives\r\n if (!isObjectLike(val)) {\r\n return false\r\n }\r\n\r\n proto = val.prototype\r\n\r\n // JavaScript 对象分为两种:普通对象和函数对象\r\n // 普通对象:原型是 __proto__,没有 prototype 原型(属性)\r\n // 函数对象:原型是 prototype ,prototype 只存在于函数对象上\r\n if (!proto) {\r\n return true\r\n }\r\n\r\n proto = val\r\n\r\n while (getPrototypeOf(proto) !== null) {\r\n proto = getPrototypeOf(proto)\r\n }\r\n\r\n return getPrototypeOf(val) === proto\r\n}\r\n\r\nexport default isPlainObject\r\n","import isObject from './isObject'\r\n\r\n/**\r\n * 检测测试数据是否为类似 Object 类型\r\n * ========================================================================\r\n * @method isObjectLike\r\n * @param {Object} val - 要检测的数据\r\n * @returns {Boolean} 'val' 是类似 Object 类型,返回 true,否则返回 false\r\n */\r\nconst isObjectLike = (val) => {\r\n return isObject(val) && val !== null\r\n}\r\n\r\nexport default isObjectLike\r\n","/**\r\n * 转义字符串中的 HTML 标签\r\n * ========================================================================\r\n * @param {String} str - 需要转义的字符串\r\n * @returns {String}\r\n */\r\nconst encodeHTML = (str) => {\r\n const CHARTS = {\r\n '&': '&',\r\n '<': '<',\r\n '>': '>',\r\n \"'\": ''',\r\n '\"': '"'\r\n }\r\n\r\n return str.replace(/[&<>'\"]/g, (tag) => {\r\n return CHARTS[tag] || tag\r\n })\r\n}\r\n\r\nexport default encodeHTML\r\n","import isString from '@/utils/types/isString'\r\nimport isPlainObject from '@/utils/types/isPlainObject'\r\nimport isFunction from '@/utils/types/isFunction'\r\n\r\nimport extend from '@/utils/lang/extend'\r\nimport later from '@/utils/lang/later'\r\nimport stripScripts from '@/utils/lang/stripScripts'\r\nimport encodeHTML from '@/utils/lang/encodeHTML'\r\nimport cloneDeep from '@/utils/lang/cloneDeep'\r\nimport guid from '@/utils/lang/guid'\r\n\r\nimport createElement from '@/utils/dom/createElement'\r\nimport addClass from '@/utils/dom/addClass'\r\nimport removeClass from '@/utils/dom/removeClass'\r\nimport setAttribute from '@/utils/dom/setAttribute'\r\nimport setAttributes from '@/utils/dom/setAttributes'\r\n\r\nimport icon from '@/utils/icons/icon'\r\nimport paint from '@/utils/icons/paint'\r\n\r\nimport on from '@/utils/event/on'\r\nimport off from '@/utils/event/off'\r\n\r\nimport Component from '@/component'\r\n\r\nimport './message.less'\r\n\r\nconst TYPES = ['info', 'success', 'warning', 'error']\r\nconst instances = []\r\nlet instance\r\n\r\npaint()\r\n\r\nclass Message extends Component {\r\n constructor(options) {\r\n super()\r\n\r\n this._default()\r\n\r\n if (options) {\r\n this.initialize(options)\r\n }\r\n }\r\n\r\n _default() {\r\n this.attrs = cloneDeep(Message.DEFAULTS)\r\n\r\n this.$el = null\r\n this.id = ''\r\n this.closed = false\r\n this.visible = false\r\n this.offset = -50\r\n this.timer = null\r\n this.destroyed = false\r\n\r\n return this\r\n }\r\n\r\n initialize(options) {\r\n this.attr(options)\r\n this.id = this.attr('id')\r\n this.offset = this.attr('offset') || -50\r\n\r\n this.$emit('created', { ...this.attr() })\r\n\r\n this.render().addListeners()\r\n\r\n if (this.attr('visible')) {\r\n this.open()\r\n }\r\n\r\n return this\r\n }\r\n\r\n isClosed() {\r\n return this.closed\r\n }\r\n\r\n isDestroyed() {\r\n return this.destroyed\r\n }\r\n\r\n _getClassName() {\r\n const type = this.attr('type')\r\n const effect = this.attr('effect')\r\n const round = this.attr('round')\r\n const closable = this.attr('closable')\r\n const visible = this.attr('visible')\r\n const customClass = this.attr('customClass')\r\n const className = [\r\n 'outline-message',\r\n `outline-message_${type}`,\r\n `outline-message_${effect}`\r\n ]\r\n\r\n if (round) {\r\n className.push('outline-message_round')\r\n }\r\n\r\n if (!closable) {\r\n className.push('outline-message_full-width')\r\n }\r\n\r\n if (visible) {\r\n className.push('outline-message_visible')\r\n }\r\n\r\n if (customClass) {\r\n className.push(customClass)\r\n }\r\n\r\n return className\r\n }\r\n\r\n render() {\r\n const type = this.attr('type')\r\n const message = this.attr('message')\r\n const effect = this.attr('effect')\r\n const round = this.attr('round')\r\n const closable = this.attr('closable')\r\n const dangerouslyUseHTMLString = this.attr('dangerouslyUseHTMLString')\r\n const className = this._getClassName()\r\n const iconName = effect === 'light' ? `circle-${type}` : type\r\n const children = []\r\n let iconSize = 20\r\n let $type\r\n let $message\r\n let $text\r\n let $close\r\n let $el\r\n\r\n if (round && effect === 'default') {\r\n iconSize = 12\r\n }\r\n\r\n if (effect !== 'plain') {\r\n $type = icon(iconName, {\r\n iconSet: 'outline',\r\n size: iconSize\r\n })\r\n addClass($type, 'outline-message__icon')\r\n children.push($type)\r\n }\r\n\r\n if (!dangerouslyUseHTMLString) {\r\n $text = document.createTextNode(encodeHTML(stripScripts(message)))\r\n } else {\r\n $text = document.createDocumentFragment()\r\n $text.innerHTML = message\r\n }\r\n $message = createElement(\r\n 'p',\r\n {\r\n className: 'outline-message__content'\r\n },\r\n [$text]\r\n )\r\n children.push($message)\r\n\r\n if (closable) {\r\n $close = icon('close', {\r\n iconSet: 'outline',\r\n size: 18\r\n })\r\n addClass($close, 'outline-message__close')\r\n children.push($close)\r\n }\r\n\r\n $el = createElement(\r\n 'div',\r\n {\r\n className: className.join(' ')\r\n },\r\n children\r\n )\r\n $el.style.cssText = `top:-50px;`\r\n this.$el = $el\r\n document.body.appendChild(this.$el)\r\n\r\n this.$emit('mounted')\r\n\r\n return this\r\n }\r\n\r\n _refreshIcon() {\r\n const HIDDEN = '.outline-message_hidden'\r\n const $el = this.$el\r\n let iconSize = 20\r\n let type\r\n let effect\r\n let round\r\n let iconName\r\n let $icon\r\n let $svg\r\n let $use\r\n\r\n if (this.isDestroyed()) {\r\n return this\r\n }\r\n\r\n $icon = $el.querySelector('.outline-icon')\r\n\r\n if (!$icon) {\r\n return this\r\n }\r\n\r\n type = this.attr('type')\r\n effect = this.attr('effect')\r\n round = this.attr('round')\r\n\r\n if (effect === 'plain') {\r\n addClass($icon, HIDDEN)\r\n } else {\r\n removeClass($icon, HIDDEN)\r\n\r\n if (round && effect === 'default') {\r\n iconSize = 12\r\n }\r\n }\r\n\r\n $svg = $icon.querySelector('.outline-icon__svg')\r\n setAttributes($svg, {\r\n style: `width:${iconSize}px;height:${iconSize}px;`\r\n })\r\n\r\n $use = $svg.querySelector('use')\r\n iconName = effect === 'light' ? `circle-${type}` : type\r\n setAttribute($use, 'xlink:href', `#outline-icon-${iconName}`)\r\n\r\n return this\r\n }\r\n\r\n _refreshMessage() {\r\n const $el = this.$el\r\n let $message\r\n let dangerouslyUseHTMLString\r\n let message\r\n let text\r\n\r\n if (this.isDestroyed()) {\r\n return this\r\n }\r\n\r\n $message = $el.querySelector('.outline-message__content')\r\n dangerouslyUseHTMLString = this.attr('dangerouslyUseHTMLString')\r\n message = this.attr('message')\r\n\r\n if (!dangerouslyUseHTMLString) {\r\n text = encodeHTML(stripScripts(message))\r\n } else {\r\n text = message\r\n }\r\n\r\n $message.innerHTML = text\r\n\r\n return this\r\n }\r\n\r\n _refreshClose() {\r\n const HIDDEN = '.outline-message_hidden'\r\n const $el = this.$el\r\n let $close\r\n let closable\r\n\r\n if (this.isDestroyed()) {\r\n return this\r\n }\r\n\r\n $close = $el.querySelector('.outline-message__close')\r\n closable = this.attr('closable')\r\n\r\n if ($close) {\r\n if (closable) {\r\n addClass($close, HIDDEN)\r\n } else {\r\n removeClass($close, HIDDEN)\r\n }\r\n }\r\n\r\n return this\r\n }\r\n\r\n _refreshEl() {\r\n const $el = this.$el\r\n let className\r\n\r\n if (this.isDestroyed()) {\r\n return this\r\n }\r\n\r\n className = this._getClassName()\r\n setAttribute($el, 'className', className.join(' '))\r\n\r\n return this\r\n }\r\n\r\n refresh(options) {\r\n if (!isPlainObject(options)) {\r\n return this\r\n }\r\n\r\n this.attr(options)\r\n ._refreshIcon()\r\n ._refreshMessage()\r\n ._refreshClose()\r\n ._refreshEl()\r\n\r\n return this\r\n }\r\n\r\n clearTimer() {\r\n if (this.isDestroyed()) {\r\n return this\r\n }\r\n\r\n if (this.timer) {\r\n clearTimeout(this.timer)\r\n this.timer = null\r\n }\r\n\r\n return this\r\n }\r\n\r\n startTimer(duration) {\r\n if (this.isDestroyed()) {\r\n return this\r\n }\r\n\r\n this.timer = later(() => {\r\n this.$emit('opened')\r\n this.close()\r\n }, duration * 1000)\r\n\r\n return this\r\n }\r\n\r\n open(options) {\r\n const $el = this.$el\r\n let offset\r\n let duration\r\n let top\r\n let cssRules\r\n\r\n if (this.isDestroyed()) {\r\n return this\r\n }\r\n\r\n if (this.isClosed()) {\r\n this.refresh(options)\r\n }\r\n\r\n offset = this.attr('offset')\r\n duration = this.attr('duration')\r\n top = offset && offset >= this.offset ? offset : this.offset\r\n cssRules = `top:${top}px;`\r\n\r\n this.clearTimer()\r\n\r\n this.$emit('beforeOpen')\r\n\r\n later(() => {\r\n this.visible = true\r\n\r\n addClass($el, 'outline-message_visible')\r\n $el.style.cssText = cssRules\r\n\r\n if (duration > 0) {\r\n this.startTimer(duration)\r\n }\r\n }, 100)\r\n\r\n return this\r\n }\r\n\r\n close() {\r\n const $el = this.$el\r\n const cssRules = `top:-50px;`\r\n let destroyAfterClosed\r\n let beforeClose\r\n\r\n if (this.isDestroyed()) {\r\n return this\r\n }\r\n\r\n destroyAfterClosed = this.attr('destroyAfterClosed')\r\n beforeClose = this.attr('beforeClose')\r\n\r\n if (isFunction(beforeClose)) {\r\n beforeClose.call(this)\r\n }\r\n\r\n $el.style.cssText = cssRules\r\n removeClass($el, 'outline-message_visible')\r\n\r\n this.visible = false\r\n this.closed = true\r\n\r\n later(() => {\r\n this.$emit('closed')\r\n\r\n if (destroyAfterClosed) {\r\n this.destroy()\r\n }\r\n }, 500)\r\n\r\n return this\r\n }\r\n\r\n destroy() {\r\n this.$emit('beforeDestroy')\r\n\r\n if (this.isDestroyed()) {\r\n return this\r\n }\r\n\r\n this.removeListeners()\r\n\r\n document.body.removeChild(this.$el)\r\n\r\n clearTimeout(this.timer)\r\n this._default()\r\n\r\n this.$emit('afterDestroy')\r\n\r\n return this\r\n }\r\n\r\n onMouseEnter() {\r\n this.clearTimer()\r\n return this\r\n }\r\n\r\n onMouseLeave() {\r\n const duration = this.attr('duration')\r\n const delay = this.attr('delay')\r\n\r\n if (duration <= 0) {\r\n return this\r\n }\r\n\r\n this.startTimer(delay)\r\n\r\n return this\r\n }\r\n\r\n onClose() {\r\n this.clearTimer()\r\n this.close()\r\n return this\r\n }\r\n\r\n addListeners() {\r\n const $el = this.$el\r\n\r\n on(\r\n $el,\r\n '.outline-message__content',\r\n 'mouseenter',\r\n this.onMouseEnter,\r\n this,\r\n true\r\n )\r\n on(\r\n $el,\r\n '.outline-message__content',\r\n 'mouseleave',\r\n this.onMouseLeave,\r\n this,\r\n true\r\n )\r\n on($el, '.outline-message__close', 'click', this.onClose, this, true)\r\n\r\n return this\r\n }\r\n\r\n removeListeners() {\r\n const $el = this.$el\r\n\r\n off($el, 'mouseenter', this.onMouseEnter)\r\n off($el, 'mouseleave', this.onMouseLeave)\r\n off($el, 'click', this.onClose)\r\n\r\n return this\r\n }\r\n}\r\n\r\nMessage.DEFAULTS = (() => {\r\n const OPTIONS = {\r\n id: '',\r\n type: 'info',\r\n effect: 'default',\r\n round: false,\r\n offset: 30,\r\n duration: 3,\r\n delay: 2,\r\n message: '',\r\n customClass: '',\r\n closable: true,\r\n visible: true,\r\n dangerouslyUseHTMLString: false,\r\n destroyAfterClosed: true,\r\n beforeClose: null\r\n }\r\n\r\n return cloneDeep(OPTIONS)\r\n})()\r\n\r\nTYPES.forEach((type) => {\r\n Message[type] = (options) => {\r\n const config = {}\r\n const id = guid(`outline-message-`)\r\n const beforeClose = options.beforeClose || null\r\n let offset = options.offset || 30\r\n\r\n if (isString(options)) {\r\n config.message = options\r\n } else {\r\n if (isPlainObject(options)) {\r\n extend(config, options)\r\n }\r\n }\r\n config.id = id\r\n config.type = type\r\n config.offset = offset\r\n config.visible = false\r\n config.beforeClose = () => {\r\n Message.close(id, beforeClose)\r\n }\r\n\r\n instance = new Message(config)\r\n instances.forEach((item) => {\r\n offset += item.$el.offsetHeight + 16\r\n })\r\n instance.offset = offset\r\n instance.open()\r\n instances.push(instance)\r\n\r\n return instance\r\n }\r\n})\r\n\r\n// 关闭指定 id 消息的静态方法\r\nMessage.close = (id, beforeClose) => {\r\n const len = instances.length\r\n let index = -1\r\n let i\r\n let offsetHeight\r\n\r\n instances.forEach((instance, i) => {\r\n // 在 instances 中通过 id 找到要关闭的消息\r\n if (id === instance.id) {\r\n offsetHeight = instance.$el.offsetHeight\r\n index = i\r\n\r\n // 关闭消息\r\n if (isFunction(beforeClose)) {\r\n beforeClose.call(instance)\r\n }\r\n\r\n instances.splice(i, 1)\r\n }\r\n })\r\n\r\n if (len <= 1 || index === -1 || index > instances.length - 1) {\r\n return false\r\n }\r\n\r\n i = index\r\n\r\n // 界面中的消息逐个向上收起\r\n for (; i < len - 1; i += 1) {\r\n const dom = instances[i].$el\r\n\r\n dom.style['top'] = parseInt(dom.style['top'], 10) - offsetHeight - 16 + 'px'\r\n }\r\n}\r\n\r\n// 关闭所有消息的静态方法\r\nMessage.clear = () => {\r\n let i = instances.length - 1\r\n for (; i >= 0; i -= 1) {\r\n instances[i].close()\r\n }\r\n}\r\n\r\nexport default Message\r\n","import isFunction from './utils/types/isFunction'\r\n\r\nclass Command {\r\n constructor(name, action) {\r\n this.name = name\r\n\r\n if (isFunction(action)) {\r\n this.action = action\r\n }\r\n }\r\n\r\n execute() {\r\n this.action()\r\n\r\n return this\r\n }\r\n}\r\n\r\nexport default Command\r\n","import isFunction from './utils/types/isFunction'\r\n\r\nclass Commands {\r\n constructor() {\r\n this.commands = []\r\n }\r\n\r\n get(name) {\r\n return this.commands.find((cmd) => cmd.name === name)\r\n }\r\n\r\n add(command) {\r\n this.commands.push(command)\r\n\r\n return this\r\n }\r\n\r\n del(name) {\r\n const commands = this.commands\r\n const command = commands.find((cmd) => cmd.name === name)\r\n const index = command ? commands.indexOf(command) : -1\r\n\r\n if (index > -1) {\r\n commands.splice(index, 1)\r\n }\r\n\r\n return this\r\n }\r\n\r\n clear() {\r\n this.commands = []\r\n\r\n return this\r\n }\r\n\r\n execute(name) {\r\n const command = this.commands.find((cmd) => cmd.name === name)\r\n\r\n if (isFunction(command?.execute)) {\r\n command.execute()\r\n }\r\n\r\n return this\r\n }\r\n}\r\n\r\nexport default Commands\r\n","import icon from '../../utils/icons/icon'\r\nimport createElement from '../../utils/dom/createElement'\r\nimport addClass from '../../utils/dom/addClass'\r\n\r\nconst _createButton = (button, rounded = true) => {\r\n const $icon = icon(button.icon, {\r\n iconSet: button.iconSet || 'outline',\r\n color: button.color || '',\r\n size: button.size\r\n })\r\n const $anchor = createElement(\r\n 'a',\r\n {\r\n className: `outline-toolbar__anchor`,\r\n href: button.link\r\n },\r\n $icon\r\n )\r\n const $button = createElement(\r\n 'div',\r\n {\r\n className: `outline-toolbar__button ${button.name}`,\r\n 'data-cmd': button.name\r\n },\r\n [button.link ? $anchor : $icon]\r\n )\r\n\r\n addClass($icon, 'outline-toolbar__icon')\r\n\r\n if (rounded) {\r\n addClass($button, 'outline-toolbar_rounded')\r\n }\r\n\r\n if (button.disabled) {\r\n addClass($button, 'outline-toolbar_disabled')\r\n }\r\n\r\n return $button\r\n}\r\n\r\nexport default _createButton\r\n","import isString from '@/utils/types/isString'\r\nimport isFunction from '@/utils/types/isFunction'\r\nimport isObject from '@/utils/types/isObject'\r\nimport isArray from '@/utils/types/isArray'\r\n\r\nimport later from '@/utils/lang/later'\r\nimport guid from '@/utils/lang/guid'\r\nimport cloneDeep from '@/utils/lang/cloneDeep'\r\n\r\nimport createElement from '@/utils/dom/createElement'\r\nimport addClass from '@/utils/dom/addClass'\r\nimport hasClass from '@/utils/dom/hasClass'\r\nimport removeClass from '@/utils/dom/removeClass'\r\n\r\nimport on from '@/utils/event/on'\r\nimport off from '@/utils/event/off'\r\n\r\nimport paint from '@/utils/icons/paint'\r\n\r\nimport Command from '@/command'\r\nimport Commands from '@/commands'\r\nimport Component from '@/component'\r\n\r\nimport _createButton from './utils/_createButton'\r\n\r\nimport './toolbar.less'\r\n\r\nconst DISABLED = 'outline-toolbar_disabled'\r\nconst HIDDEN = 'outline-toolbar_hidden'\r\nconst ACTIVE = 'outline-toolbar_active'\r\n\r\nclass Toolbar extends Component {\r\n constructor(options) {\r\n super()\r\n\r\n this._default()\r\n\r\n if (options) {\r\n this.initialize(options)\r\n }\r\n }\r\n\r\n _default() {\r\n this.attrs = cloneDeep(Toolbar.DEFAULTS)\r\n\r\n this.disabled = false\r\n this.closed = false\r\n\r\n this.$el = null\r\n this.buttons = []\r\n this.commands = null\r\n\r\n return this\r\n }\r\n\r\n initialize(options) {\r\n let created\r\n\r\n this.attr(options)\r\n\r\n this.disabled = this.attr('disabled')\r\n this.closed = this.attr('closed')\r\n this.commands = new Commands()\r\n\r\n created = this.attr('created')\r\n\r\n if (isFunction(created)) {\r\n created.call(this)\r\n }\r\n\r\n this.render().addListeners()\r\n\r\n return this\r\n }\r\n\r\n isHighlight(name) {\r\n const button = this.get(name)\r\n\r\n if (!button) {\r\n return false\r\n }\r\n\r\n return hasClass(button.$el, ACTIVE)\r\n }\r\n\r\n isDisabled(name) {\r\n let button\r\n\r\n if (name) {\r\n button = this.get(name)\r\n\r\n return button.disabled\r\n }\r\n\r\n return this.disabled\r\n }\r\n\r\n isExist(name) {\r\n const button = this.get(name)\r\n return !!button\r\n }\r\n\r\n isClosed() {\r\n return this.closed\r\n }\r\n\r\n _getCommand(button) {\r\n const _self = this\r\n const { action, name } = button\r\n let command = null\r\n let handler = null\r\n let context\r\n let listener\r\n\r\n if (!action) {\r\n return command\r\n }\r\n\r\n handler = action.handler\r\n context = action.context || this\r\n\r\n if (isFunction(handler)) {\r\n listener = handler\r\n } else if (isString(handler)) {\r\n listener = function () {\r\n _self.$emit(handler, name)\r\n }\r\n }\r\n\r\n if (isFunction(listener)) {\r\n command = new Command(name, listener.bind(context))\r\n }\r\n\r\n return command\r\n }\r\n\r\n get(name) {\r\n return this.buttons.find((button) => button.name === name)\r\n }\r\n\r\n render() {\r\n const mounted = this.attr('mounted')\r\n const buttons = this.attr('buttons') || []\r\n const placement = this.attr('placement')\r\n\r\n paint()\r\n\r\n this.$el = createElement('div', {\r\n id: guid('outline-toolbar'),\r\n className: `outline-toolbar outline-toolbar_${placement}`\r\n })\r\n this._paint(buttons)\r\n document.body.appendChild(this.$el)\r\n\r\n if (this.closed) {\r\n this.hide()\r\n }\r\n\r\n if (this.disabled) {\r\n this.disable()\r\n }\r\n\r\n if (isFunction(mounted)) {\r\n mounted.call(this)\r\n }\r\n\r\n return this\r\n }\r\n\r\n erase() {\r\n this.$el.innerHTML = ''\r\n return this\r\n }\r\n\r\n _paint(buttons) {\r\n const rounded = this.attr('rounded')\r\n const $fragment = document.createDocumentFragment()\r\n\r\n buttons.forEach((button) => {\r\n const $button = _createButton(button, rounded)\r\n const command = this._getCommand(button)\r\n const { name, disabled, context } = button\r\n\r\n $fragment.appendChild($button)\r\n\r\n if (!this.isExist(name)) {\r\n this.buttons.push({\r\n $el: $button,\r\n name,\r\n disabled: disabled || false,\r\n context: context || this\r\n })\r\n\r\n if (command) {\r\n this.commands.add(command)\r\n }\r\n }\r\n })\r\n\r\n this.$el.appendChild($fragment)\r\n\r\n return this\r\n }\r\n\r\n _remove() {\r\n document.body.removeChild(this.$el)\r\n return this\r\n }\r\n\r\n refresh(buttons) {\r\n this.attr({ buttons })\r\n this.erase()._paint(buttons)\r\n return this\r\n }\r\n\r\n add(button) {\r\n const $el = this.$el\r\n const $fragment = document.createDocumentFragment()\r\n const buttons = this.attr('buttons') || []\r\n const { name, disabled, context } = button\r\n const command = this._getCommand(button)\r\n const _add = (button) => {\r\n const $button = _createButton(button)\r\n\r\n $fragment.appendChild($button)\r\n\r\n buttons.push(button)\r\n this.buttons.push({\r\n $el: $button,\r\n name,\r\n disabled: disabled || false,\r\n context: context || this,\r\n command\r\n })\r\n\r\n if (command) {\r\n this.commands.add(command)\r\n }\r\n }\r\n\r\n if (isObject(button)) {\r\n _add(button)\r\n } else if (isArray(button)) {\r\n button.forEach((item) => {\r\n if (isObject(item)) {\r\n _add(item)\r\n }\r\n })\r\n }\r\n $el.appendChild($fragment)\r\n\r\n return this\r\n }\r\n\r\n remove(name) {\r\n const $el = this.$el\r\n const buttons = this.buttons\r\n const button = this.get(name)\r\n let index = -1\r\n\r\n if (!button) {\r\n return this\r\n }\r\n\r\n index = buttons.indexOf(button)\r\n\r\n if (index > -1) {\r\n buttons.splice(index, 1)\r\n this.attr('buttons').splice(index, 1)\r\n }\r\n\r\n this._disable(name)\r\n $el.removeChild(button.$el)\r\n\r\n return this\r\n }\r\n\r\n _disable(name) {\r\n const button = this.get(name)\r\n const command = this.commands.get(name)\r\n\r\n if (!button || button.disabled) {\r\n return this\r\n }\r\n\r\n button.disabled = true\r\n\r\n if (command) {\r\n this.commands.del(command)\r\n }\r\n\r\n addClass(button.$el, DISABLED)\r\n\r\n return this\r\n }\r\n\r\n _enable(name) {\r\n const button = this.get(name)\r\n const command = this.commands.get(name)\r\n\r\n if (!button || !button.disabled) {\r\n return this\r\n }\r\n\r\n button.disabled = false\r\n\r\n if (command) {\r\n this.commands.add(command)\r\n }\r\n\r\n removeClass(button.$el, DISABLED)\r\n\r\n return this\r\n }\r\n\r\n disable(name) {\r\n const disabled = this.attr('afterDisabled')\r\n\r\n if (name) {\r\n this._disable(name)\r\n } else {\r\n addClass(this.$el, DISABLED)\r\n this.removeListeners()\r\n this.disabled = true\r\n\r\n if (isFunction(disabled)) {\r\n disabled.call(this)\r\n }\r\n }\r\n\r\n return this\r\n }\r\n\r\n enable(name) {\r\n const enabled = this.attr('afterEnabled')\r\n\r\n if (name) {\r\n this._enable(name)\r\n } else {\r\n this.disabled = false\r\n removeClass(this.$el, DISABLED)\r\n this.addListeners()\r\n\r\n if (isFunction(enabled)) {\r\n enabled.call(this)\r\n }\r\n }\r\n\r\n return this\r\n }\r\n\r\n show(name) {\r\n const opened = this.attr('afterOpened')\r\n const button = this.get(name)\r\n const $el = this.$el\r\n\r\n if (name) {\r\n if (!button) {\r\n return this\r\n }\r\n\r\n removeClass(button.$el, HIDDEN)\r\n } else {\r\n removeClass($el, HIDDEN)\r\n this.closed = false\r\n\r\n if (isFunction(opened)) {\r\n later(() => {\r\n opened.call(this)\r\n }, 310)\r\n }\r\n }\r\n\r\n return this\r\n }\r\n\r\n hide(name) {\r\n const closed = this.attr('afterClosed')\r\n const button = this.get(name)\r\n const $el = this.$el\r\n\r\n if (name) {\r\n if (!button) {\r\n return this\r\n }\r\n\r\n addClass(button.$el, HIDDEN)\r\n } else {\r\n addClass($el, HIDDEN)\r\n this.closed = true\r\n\r\n if (isFunction(closed)) {\r\n later(() => {\r\n closed.call(this)\r\n }, 310)\r\n }\r\n }\r\n\r\n return this\r\n }\r\n\r\n toggle(name) {\r\n if (this.isClosed()) {\r\n this.show(name)\r\n } else {\r\n this.hide(name)\r\n }\r\n\r\n return this\r\n }\r\n\r\n highlight(name) {\r\n const button = this.get(name)\r\n let $button\r\n\r\n if (!button) {\r\n return this\r\n }\r\n\r\n $button = button.$el\r\n\r\n if (hasClass($button, ACTIVE)) {\r\n removeClass($button, ACTIVE)\r\n } else {\r\n addClass($button, ACTIVE)\r\n }\r\n\r\n return this\r\n }\r\n\r\n destroy() {\r\n const beforeDestroy = this.attr('beforeDestroy')\r\n const afterDestroy = this.attr('afterDestroy')\r\n\r\n if (isFunction(beforeDestroy)) {\r\n beforeDestroy.call(this)\r\n }\r\n\r\n this.commands.clear()\r\n this.removeListeners()._remove()._default()\r\n\r\n if (isFunction(afterDestroy)) {\r\n afterDestroy.call(this)\r\n }\r\n\r\n return this\r\n }\r\n\r\n execute(name) {\r\n if (this.isDisabled(name)) {\r\n return this\r\n }\r\n\r\n this.commands.execute(name)\r\n\r\n return this\r\n }\r\n\r\n onExecute(evt) {\r\n const $button = evt.delegateTarget\r\n let cmd = ''\r\n\r\n if ($button) {\r\n cmd = $button.getAttribute('data-cmd')\r\n\r\n if (cmd) {\r\n this.execute(cmd)\r\n }\r\n }\r\n\r\n return this\r\n }\r\n\r\n _updateToolbar({ top, min, max }) {\r\n const current = Math.ceil(top)\r\n\r\n if (current <= min) {\r\n this.hide('up')\r\n this.show('down')\r\n } else if (current >= max) {\r\n this.hide('down')\r\n this.show('up')\r\n } else if (current > min && current < max) {\r\n this.show('up')\r\n this.show('down')\r\n }\r\n\r\n return this\r\n }\r\n\r\n onToolbarUpdate({ top, min, max }) {\r\n this._updateToolbar({ top, min, max })\r\n return this\r\n }\r\n\r\n onAddButton(buttons) {\r\n this.attr({\r\n buttons\r\n })\r\n this.refresh(buttons)\r\n\r\n return this\r\n }\r\n\r\n onRemoveButton(name) {\r\n this.remove(name)\r\n return this\r\n }\r\n\r\n addListeners() {\r\n const buttons = this.attr('buttons') || []\r\n const $el = this.$el\r\n\r\n if (!buttons || buttons.length < 1) {\r\n return this\r\n }\r\n\r\n on($el, `.outline-toolbar__button`, 'click', this.onExecute, this, true)\r\n\r\n this.$on('toolbar:update', this.onToolbarUpdate)\r\n this.$on('toolbar:add:button', this.onAddButton)\r\n this.$on('toolbar:remove:button', this.onRemoveButton)\r\n this.$on('toolbar:toggle', this.toggle)\r\n\r\n return this\r\n }\r\n\r\n removeListeners() {\r\n const buttons = this.attr('buttons') || []\r\n const $el = this.$el\r\n\r\n if (!buttons || buttons.length < 1) {\r\n return this\r\n }\r\n\r\n off($el, '.outline-toolbar__button', this.onExecute)\r\n\r\n this.$off('toolbar:update')\r\n this.$off('toolbar:add:button')\r\n this.$off('toolbar:remove:button')\r\n this.$off('toolbar:toggle')\r\n\r\n return this\r\n }\r\n}\r\n\r\nToolbar.DEFAULTS = (() => {\r\n const OPTIONS = {\r\n placement: 'ltr',\r\n closed: false,\r\n disabled: false,\r\n rounded: true,\r\n buttons: [],\r\n created: null,\r\n mounted: null,\r\n afterClosed: null,\r\n afterOpened: null,\r\n afterDisabled: null,\r\n afterEnabled: null,\r\n beforeDestroy: null,\r\n afterDestroy: null\r\n }\r\n\r\n return cloneDeep(OPTIONS)\r\n})()\r\n\r\nexport default Toolbar\r\n","import publish from './utils/observer/emit'\r\n\r\nclass Speech {\r\n constructor(options) {\r\n this.utterance = new SpeechSynthesisUtterance()\r\n\r\n if (options) {\r\n this.initialize(options)\r\n }\r\n }\r\n\r\n _initialize(options) {\r\n if (options.lang) {\r\n this.setLang(options.lang)\r\n }\r\n\r\n if (options.pitch) {\r\n this.setPitch(options.pitch)\r\n }\r\n\r\n if (options.rate) {\r\n this.setRate(options.rate)\r\n }\r\n\r\n if (options.text) {\r\n this.setText(options.text)\r\n }\r\n\r\n if (options.voice) {\r\n this.setVoice(options.voice)\r\n }\r\n\r\n if (options.volume) {\r\n this.setVolume(options.volume)\r\n }\r\n\r\n return this\r\n }\r\n\r\n initialize(options) {\r\n this._initialize(options)._addListeners()\r\n return this\r\n }\r\n\r\n isSpeaking() {\r\n return speechSynthesis.speaking\r\n }\r\n\r\n isPending() {\r\n return speechSynthesis.pending\r\n }\r\n\r\n isPaused() {\r\n return speechSynthesis.paused\r\n }\r\n\r\n getVoices() {\r\n return speechSynthesis.getVoices()\r\n }\r\n\r\n setLang(lang) {\r\n this.utterance.lang = lang\r\n return this\r\n }\r\n\r\n setPitch(pitch) {\r\n this.utterance.pitch = pitch\r\n return this\r\n }\r\n\r\n setRate(rate) {\r\n this.utterance.rate = rate\r\n return this\r\n }\r\n\r\n setText(text) {\r\n this.utterance.text = text\r\n return this\r\n }\r\n\r\n setVoice(voice) {\r\n this.utterance.voice = voice\r\n return this\r\n }\r\n\r\n setVolume(volume) {\r\n this.utterance.volume = volume\r\n return this\r\n }\r\n\r\n speak(text) {\r\n if (text) {\r\n this.setText(text)\r\n }\r\n\r\n speechSynthesis.speak(this.utterance)\r\n\r\n return this\r\n }\r\n\r\n pause() {\r\n speechSynthesis.pause()\r\n return this\r\n }\r\n\r\n resume() {\r\n speechSynthesis.resume()\r\n return this\r\n }\r\n\r\n cancel() {\r\n speechSynthesis.cancel()\r\n this.setText('')\r\n return this\r\n }\r\n\r\n _addListeners() {\r\n const UTTERANCE_EVENTS = [\r\n 'boundary',\r\n 'end',\r\n 'error',\r\n 'start',\r\n 'mark',\r\n 'pause',\r\n 'resume'\r\n ]\r\n const utterance = this.utterance\r\n const speech = this\r\n\r\n UTTERANCE_EVENTS.forEach((name) => {\r\n utterance[`on${name}`] = (event) => {\r\n publish(name, {\r\n event,\r\n speech\r\n })\r\n }\r\n })\r\n\r\n speechSynthesis.onvoiceschanged = (event) => {\r\n publish('voiceschanged', {\r\n event,\r\n speech\r\n })\r\n }\r\n\r\n return this\r\n }\r\n}\r\n\r\nSpeech.isSupport = (() => {\r\n return 'speechSynthesis' in window\r\n})()\r\n\r\nexport default Speech\r\n","import addClass from '../../utils/dom/addClass'\r\n\r\nconst _updateSiblingElements = (siblingElement, isPrev) => {\r\n let tagName\r\n let $sibling = siblingElement\r\n\r\n while ($sibling) {\r\n tagName = $sibling.tagName.toLowerCase()\r\n\r\n if (tagName !== 'script' && tagName !== 'style') {\r\n addClass($sibling, 'outline-reader_sibling')\r\n }\r\n\r\n if (isPrev) {\r\n $sibling = $sibling.previousElementSibling\r\n } else {\r\n $sibling = $sibling.nextElementSibling\r\n }\r\n }\r\n}\r\n\r\nexport default _updateSiblingElements\r\n","import cloneDeep from '@/utils/lang/cloneDeep'\r\nimport later from '@/utils/lang/later'\r\nimport isString from '@/utils/types/isString'\r\nimport isElement from '@/utils/types/isElement'\r\nimport isFunction from '@/utils/types/isFunction'\r\nimport createElement from '@/utils/dom/createElement'\r\nimport addClass from '@/utils/dom/addClass'\r\nimport removeClass from '@/utils/dom/removeClass'\r\nimport isMobile from '@/utils/dom/isMobile'\r\n\r\nimport at from '@/utils/event/at'\r\nimport stop from '@/utils/event/stop'\r\nimport off from '@/utils/event/off'\r\n\r\nimport Message from '@/message/message'\r\nimport Toolbar from '@/toolbar/toolbar'\r\n\r\nimport Speech from '@/speech'\r\nimport Component from '@/component'\r\n\r\nimport _updateSiblingElements from './utils/_updateSiblingElements'\r\n\r\nimport './reader.less'\r\n\r\nconst ENTER_READING_TIP = '进入阅读模式,按 ESC 键可退出阅读模式'\r\n\r\nclass Reader extends Component {\r\n constructor(options) {\r\n super()\r\n\r\n this._default()\r\n\r\n if (options) {\r\n this.initialize(options)\r\n }\r\n }\r\n\r\n _default() {\r\n this.attrs = cloneDeep(Reader.DEFAULTS)\r\n this.reading = false\r\n\r\n this.$target = null\r\n this.$el = null\r\n this.$paper = null\r\n this.$title = null\r\n this.$article = null\r\n this.$progress = null\r\n\r\n this.toolbar = null\r\n this.speech = null\r\n\r\n return this\r\n }\r\n\r\n initialize(options) {\r\n let target\r\n\r\n this.attr(options)\r\n\r\n target = this.attr('target')\r\n\r\n if (isString(target)) {\r\n this.$target = document.querySelector(target)\r\n } else if (isElement(target)) {\r\n this.$target = target\r\n }\r\n\r\n if (!this.$target) {\r\n return this\r\n }\r\n\r\n if (Speech.isSupport) {\r\n this.speech = new Speech()\r\n }\r\n\r\n this.render().addListeners()\r\n\r\n return this\r\n }\r\n\r\n isSpeaking() {\r\n return this?.speech?.isSpeaking()\r\n }\r\n\r\n render() {\r\n this._renderEdge()._paint(this.$target)\r\n return this\r\n }\r\n\r\n erase() {\r\n this.$article.innerHTML = ''\r\n return this\r\n }\r\n\r\n _paint($content) {\r\n const $fragment = document.createDocumentFragment()\r\n const $children = [...$content.cloneNode(true).children]\r\n\r\n later(() => {\r\n $children.forEach(($child) => {\r\n $fragment.appendChild($child)\r\n })\r\n\r\n this.$article.appendChild($fragment)\r\n })\r\n\r\n return this\r\n }\r\n\r\n _remove() {\r\n const $el = this.$el\r\n const toolbar = this.toolbar\r\n\r\n if ($el) {\r\n document.body.removeChild($el)\r\n }\r\n\r\n if (toolbar) {\r\n toolbar.destroy()\r\n }\r\n\r\n return this\r\n }\r\n\r\n refresh() {\r\n this.erase()._paint(this.$target)\r\n return this\r\n }\r\n\r\n _animateTimeline() {\r\n // eslint-disable-next-line\r\n if (!window.ScrollTimeline || !isMobile()) {\r\n return this\r\n }\r\n\r\n this.$progress.animate(\r\n {\r\n // from\r\n scale: ['0 1', '1 1']\r\n },\r\n {\r\n // eslint-disable-next-line\r\n timeline: new ScrollTimeline({\r\n source: this.$article,\r\n axis: 'block'\r\n })\r\n }\r\n )\r\n\r\n return this\r\n }\r\n\r\n _renderEdge() {\r\n const $target = this.$target\r\n const mobile = isMobile()\r\n const size = mobile ? 26 : 20\r\n let title = this.attr('title')\r\n let $el\r\n let $paper\r\n let $title\r\n let $article\r\n let $progress\r\n let $sibling\r\n\r\n $progress = createElement('div', {\r\n className: 'outline-reader__progress'\r\n })\r\n this.$progress = $progress\r\n\r\n $title = $target.querySelector('h1')\r\n\r\n if (isElement(title)) {\r\n $title = title\r\n }\r\n\r\n if (isElement($title)) {\r\n title = $title.innerText\r\n }\r\n\r\n $title = createElement(\r\n 'h1',\r\n {\r\n className: 'outline-reader__title'\r\n },\r\n title\r\n )\r\n this.$title = $title\r\n\r\n $article = createElement(\r\n 'article',\r\n {\r\n id: 'outline-reader__article',\r\n className: 'outline-reader__article'\r\n },\r\n isMobile() ? [] : [$progress.cloneNode()]\r\n )\r\n this.$article = $article\r\n\r\n $paper = createElement(\r\n 'div',\r\n {\r\n id: 'outline-reader__paper',\r\n className: 'outline-reader__paper'\r\n },\r\n [$title, $article]\r\n )\r\n this.$paper = $paper\r\n\r\n const buttons = []\r\n\r\n buttons.push({\r\n name: 'print',\r\n icon: 'print',\r\n size,\r\n action: {\r\n context: this,\r\n handler: this.print\r\n }\r\n })\r\n\r\n if (Speech.isSupport && this.attr('allowSpeak')) {\r\n buttons.push({\r\n name: 'speak',\r\n icon: 'sound',\r\n size,\r\n action: {\r\n context: this,\r\n handler: this.speak\r\n }\r\n })\r\n }\r\n\r\n buttons.push({\r\n name: 'exit',\r\n icon: 'close',\r\n size,\r\n action: {\r\n context: this,\r\n handler: this.exit\r\n }\r\n })\r\n\r\n this.toolbar = new Toolbar({\r\n placement: 'rtl',\r\n buttons\r\n })\r\n\r\n $el = createElement(\r\n 'section',\r\n {\r\n id: 'outline-reader',\r\n className: 'outline-reader outline-reader_hidden'\r\n },\r\n [$progress, $paper, this.toolbar.$el]\r\n )\r\n this.$el = $el\r\n\r\n document.body.appendChild($el)\r\n\r\n this._animateTimeline()\r\n\r\n later(() => {\r\n // 设置邻居节点的打印样式\r\n $sibling = $el.previousElementSibling\r\n _updateSiblingElements($sibling, true)\r\n\r\n $sibling = $el.nextElementSibling\r\n _updateSiblingElements($sibling)\r\n })\r\n\r\n return this\r\n }\r\n\r\n enter() {\r\n const READER = 'outline-reader'\r\n const READING = `${READER}--reading`\r\n const HIDDEN = `${READER}_hidden`\r\n const $el = this.$el\r\n const $siblings = document.querySelectorAll('.outline-reader_sibling')\r\n const enterReadingTip = this.attr('enterReadingTip') || ENTER_READING_TIP\r\n\r\n if (this.reading || !$el) {\r\n return this\r\n }\r\n\r\n $siblings.forEach(($sibling) => {\r\n addClass($sibling, HIDDEN)\r\n })\r\n addClass($el, READING)\r\n removeClass($el, HIDDEN)\r\n this.toolbar.show()\r\n this.reading = true\r\n\r\n Message.info({\r\n round: true,\r\n message: enterReadingTip\r\n })\r\n\r\n this.$emit('reader:enter')\r\n\r\n return this\r\n }\r\n\r\n exit() {\r\n const SPEAK = 'speak'\r\n const READER = 'outline-reader'\r\n const READING = `${READER}--reading`\r\n const HIDDEN = `${READER}_hidden`\r\n const $el = this.$el\r\n const $siblings = document.querySelectorAll('.outline-reader_sibling')\r\n const speech = this.speech\r\n const toolbar = this.toolbar\r\n\r\n if (!this.reading || !$el) {\r\n return this\r\n }\r\n\r\n addClass($el, HIDDEN)\r\n removeClass($el, READING)\r\n $siblings.forEach(($sibling) => {\r\n removeClass($sibling, HIDDEN)\r\n })\r\n toolbar.hide()\r\n this.reading = false\r\n\r\n if (speech) {\r\n if (toolbar.isHighlight(SPEAK)) {\r\n toolbar.highlight(SPEAK)\r\n }\r\n\r\n speech.cancel()\r\n }\r\n\r\n this.$emit('reader:exit')\r\n\r\n return this\r\n }\r\n\r\n toggle() {\r\n if (this.reading) {\r\n this.exit()\r\n } else {\r\n this.enter()\r\n }\r\n\r\n return this\r\n }\r\n\r\n speak() {\r\n const text = this.$article.innerText\r\n const speech = this.speech\r\n\r\n if (!Speech.isSupport || !speech) {\r\n return this\r\n }\r\n\r\n this.toolbar.highlight('speak')\r\n\r\n if (this.isSpeaking()) {\r\n speech.cancel()\r\n } else {\r\n speech.speak(text)\r\n }\r\n\r\n return this\r\n }\r\n\r\n print() {\r\n if (!isFunction(print)) {\r\n return this\r\n }\r\n\r\n print()\r\n\r\n return this\r\n }\r\n\r\n destroy() {\r\n const $el = this.$el\r\n\r\n if (!$el) {\r\n return this\r\n }\r\n\r\n this.removeListeners()._remove()._default()\r\n\r\n return this\r\n }\r\n\r\n onPrint() {\r\n this.print()\r\n return this\r\n }\r\n\r\n onEnterReading() {\r\n this.toggle()\r\n return this\r\n }\r\n\r\n onExitReading(evt) {\r\n const keyCode = evt.keyCode\r\n\r\n if (keyCode === 27 && this.reading) {\r\n this.toggle()\r\n stop(evt)\r\n }\r\n\r\n return this\r\n }\r\n\r\n onRefresh() {\r\n this.refresh()\r\n\r\n return this\r\n }\r\n\r\n addListeners() {\r\n const $el = this.$el\r\n\r\n if (!$el) {\r\n return this\r\n }\r\n\r\n at(document, 'keyup', this.onExitReading, this, true)\r\n\r\n this.$on('toolbar:action:print', this.onPrint)\r\n this.$on('toolbar:action:reading', this.onEnterReading)\r\n this.$on('reader:print', this.onPrint)\r\n this.$on('reader:refresh', this.onRefresh)\r\n this.$on('reader:enter', this.enter)\r\n this.$on('reader:exit', this.exit)\r\n this.$on('reader:toggle', this.toggle)\r\n\r\n return this\r\n }\r\n\r\n removeListeners() {\r\n const $el = this.$el\r\n\r\n if (!$el) {\r\n return this\r\n }\r\n\r\n off(document, 'keyup', this.onExitReading)\r\n\r\n this.$off('toolbar:action:print')\r\n this.$off('toolbar:action:reading')\r\n this.$off('reader:refresh')\r\n this.$off('reader:toggle')\r\n\r\n return this\r\n }\r\n}\r\n\r\nReader.DEFAULTS = (() => {\r\n const OPTIONS = {\r\n target: '',\r\n title: '',\r\n enterReadingTip: ENTER_READING_TIP,\r\n allowSpeak: false\r\n }\r\n\r\n return cloneDeep(OPTIONS)\r\n})()\r\n\r\nexport default Reader\r\n","import later from './utils/lang/later'\r\nimport cloneDeep from './utils/lang/cloneDeep'\r\n\r\nimport isFunction from './utils/types/isFunction'\r\nimport isString from './utils/types/isString'\r\nimport isElement from './utils/types/isElement'\r\n\r\nimport addClass from './utils/dom/addClass'\r\nimport scrollTo from './utils/dom/scrollTo'\r\nimport getScrollElement from './utils/dom/getScrollElement'\r\n\r\nimport getChapters from './chapters/getChapters'\r\n\r\nimport Component from './component'\r\nimport Anchors from './anchors/anchors'\r\nimport Drawer from './drawer/drawer'\r\nimport Navigator from './navigator/navigator'\r\nimport Reader from './reader/reader'\r\nimport Toolbar from './toolbar/toolbar'\r\n\r\nclass Outline extends Component {\r\n constructor(options) {\r\n super()\r\n\r\n this.version = '3.39.0'\r\n this._default()\r\n\r\n if (options) {\r\n this.initialize(options)\r\n }\r\n }\r\n\r\n _default() {\r\n const options = Outline.DEFAULTS\r\n\r\n this.attrs = cloneDeep(options)\r\n this.$article = null\r\n this.$scrollElement = null\r\n this.buttons = []\r\n\r\n this.anchors = null\r\n this.drawer = null\r\n this.navigator = null\r\n this.reader = null\r\n this.toolbar = null\r\n\r\n return this\r\n }\r\n\r\n initialize(options) {\r\n let articleElement = ''\r\n let scrollElement = ''\r\n let $article = null\r\n\r\n this.attr(options)\r\n\r\n articleElement = this.attr('articleElement')\r\n scrollElement = this.attr('scrollElement')\r\n\r\n if (isString(articleElement)) {\r\n $article = document.querySelector(articleElement)\r\n } else if (isElement(articleElement)) {\r\n $article = articleElement\r\n }\r\n this.$article = $article\r\n this.$scrollElement = getScrollElement(scrollElement)\r\n\r\n this.$emit('created', { ...this.attr() })\r\n this.render().addListeners()\r\n\r\n return this\r\n }\r\n\r\n isExpanded() {\r\n const position = this.attr('position')\r\n const drawer = this.drawer\r\n const navigator = this.navigator\r\n const count = this.count()\r\n\r\n if (count < 0) {\r\n return false\r\n }\r\n\r\n if (position === 'relative') {\r\n return !drawer.isClosed()\r\n } else {\r\n return !navigator.isClosed()\r\n }\r\n }\r\n\r\n getChapters(isTreeStructured = false) {\r\n const articleElement = this.$article\r\n const selector = this.attr('selector')\r\n const showCode = this.attr('showCode')\r\n const chapterTextFilter = this.attr('chapterTextFilter')\r\n\r\n return getChapters({\r\n articleElement,\r\n selector,\r\n showCode,\r\n chapterTextFilter,\r\n isTreeStructured\r\n })\r\n }\r\n\r\n count() {\r\n return this.getChapters().length\r\n }\r\n\r\n render() {\r\n const hasToolbar = this.attr('hasToolbar')\r\n const $scrollElement = this.$scrollElement\r\n\r\n this._renderReader()._renderAnchors()._renderNavigator()._renderToolbar()\r\n\r\n if ($scrollElement && hasToolbar) {\r\n this.$emit('toolbar:update', {\r\n top: $scrollElement.scrollTop,\r\n min: 0,\r\n max: $scrollElement.scrollHeight\r\n })\r\n }\r\n\r\n this.$emit('mounted')\r\n\r\n return this\r\n }\r\n\r\n _renderReader() {\r\n const option = this.attr('reader')\r\n\r\n if (!option.target) {\r\n return this\r\n }\r\n\r\n addClass(this.$article, 'outline-article')\r\n\r\n this.reader = new Reader(option)\r\n\r\n return this\r\n }\r\n\r\n _renderAnchors() {\r\n const articleElement = this.attr('articleElement')\r\n const selector = this.attr('selector')\r\n const stickyHeight = this.attr('stickyHeight')\r\n const scrollElement = this.attr('scrollElement')\r\n const showCode = this.attr('showCode')\r\n const anchorURL = this.attr('anchorURL')\r\n const afterScroll = this.attr('afterScroll')\r\n const chapterTextFilter = this.attr('chapterTextFilter')\r\n const anchorLinkFilter = this.attr('anchorLinkFilter')\r\n\r\n this.anchors = new Anchors({\r\n articleElement,\r\n stickyHeight,\r\n scrollElement,\r\n selector,\r\n showCode,\r\n anchorURL,\r\n afterScroll,\r\n chapterTextFilter,\r\n anchorLinkFilter\r\n })\r\n\r\n return this\r\n }\r\n\r\n _renderNavigator() {\r\n const title = this.attr('title')\r\n const stickyHeight = this.attr('stickyHeight')\r\n const scrollElement = this.attr('scrollElement')\r\n const customClass = this.attr('customClass')\r\n const showCode = this.attr('showCode')\r\n const animationCurrent = this.attr('animationCurrent')\r\n const closeOnClickModal = this.attr('closeOnClickModal')\r\n const showNavModalFirst = this.attr('showNavModalFirst')\r\n const position = this.attr('position')\r\n const placement = this.attr('placement')\r\n const afterSticky = this.attr('afterSticky')\r\n const afterToggle = this.attr('afterToggle')\r\n const afterScroll = this.attr('afterScroll')\r\n const count = this.count()\r\n let parentElement = this.attr('parentElement')\r\n let OPTIONS\r\n\r\n if (count < 1) {\r\n return this\r\n }\r\n\r\n OPTIONS = {\r\n scrollElement,\r\n showCode,\r\n animationCurrent,\r\n position,\r\n title,\r\n stickyHeight,\r\n chapters: this.getChapters(),\r\n afterSticky,\r\n afterToggle,\r\n afterScroll\r\n }\r\n\r\n if (position === 'relative') {\r\n this.drawer = new Drawer({\r\n placement,\r\n title,\r\n size: 'tiny',\r\n hasOffset: true,\r\n hasPadding: false,\r\n closeOnClickModal,\r\n customClass,\r\n afterClosed: () => {\r\n const toolbar = this.toolbar\r\n toolbar.toggle()\r\n }\r\n })\r\n parentElement = this.drawer.$main\r\n\r\n if (showNavModalFirst) {\r\n this.drawer.open()\r\n }\r\n } else {\r\n OPTIONS.customClass = customClass\r\n }\r\n\r\n OPTIONS.parentElement = parentElement\r\n this.navigator = new Navigator(OPTIONS)\r\n\r\n return this\r\n }\r\n\r\n _renderToolbar() {\r\n const position = this.attr('position')\r\n const hasToolbar = this.attr('hasToolbar')\r\n const showNavModalFirst = this.attr('showNavModalFirst')\r\n const placement = this.attr('placement')\r\n const homepage = this.attr('homepage')\r\n const git = this.attr('git')\r\n const tags = this.attr('tags')\r\n const issues = this.attr('issues')\r\n const tools = this.attr('tools')\r\n const option = this.attr('reader')\r\n const count = this.count()\r\n const UP = {\r\n name: 'up',\r\n icon: 'up',\r\n size: 20,\r\n action: {\r\n context: this,\r\n handler: this.toTop\r\n }\r\n }\r\n const HOME = {\r\n name: 'homepage',\r\n icon: 'homepage',\r\n size: 20,\r\n link: homepage\r\n }\r\n const GIT = {\r\n name: 'github',\r\n icon: 'github',\r\n size: 20,\r\n link: git\r\n }\r\n const TAGS = {\r\n name: 'tags',\r\n icon: 'tags',\r\n size: 20,\r\n link: tags\r\n }\r\n const ISSUES = {\r\n name: 'issues',\r\n icon: 'issues',\r\n size: 20,\r\n link: issues\r\n }\r\n const MENU = {\r\n name: 'toggle',\r\n icon: 'menu',\r\n size: 18,\r\n action: {\r\n context: this,\r\n handler: this.toggle\r\n }\r\n }\r\n const READING = {\r\n name: 'reading',\r\n icon: 'file',\r\n size: 18,\r\n action: {\r\n context: this,\r\n handler: 'toolbar:action:reading'\r\n }\r\n }\r\n const PRINT = {\r\n name: 'print',\r\n icon: 'print',\r\n size: 20,\r\n action: {\r\n handler: 'toolbar:action:print'\r\n }\r\n }\r\n const DOWN = {\r\n name: 'down',\r\n icon: 'down',\r\n size: 20,\r\n action: {\r\n context: this,\r\n handler: this.toBottom\r\n }\r\n }\r\n const buttons = []\r\n\r\n if (!hasToolbar) {\r\n return this\r\n }\r\n\r\n buttons.push(UP)\r\n if (count > 0) {\r\n buttons.push(MENU)\r\n }\r\n if (homepage) {\r\n buttons.push(HOME)\r\n }\r\n if (git) {\r\n buttons.push(GIT)\r\n }\r\n if (tags) {\r\n buttons.push(TAGS)\r\n }\r\n if (issues) {\r\n buttons.push(ISSUES)\r\n }\r\n if (option.target) {\r\n buttons.push(READING)\r\n if (isFunction(print)) {\r\n buttons.push(PRINT)\r\n }\r\n }\r\n if (tools?.length > 0) {\r\n buttons.push(...tools)\r\n }\r\n buttons.push(DOWN)\r\n this.buttons = [...buttons]\r\n\r\n this.toolbar = new Toolbar({\r\n placement,\r\n buttons\r\n })\r\n\r\n if (position === 'relative' && showNavModalFirst) {\r\n this.toolbar.hide()\r\n }\r\n\r\n return this\r\n }\r\n\r\n refresh() {\r\n const chapters = this.getChapters()\r\n\r\n this.$emit('anchors:refresh', chapters)\r\n this.$emit('navigator:refresh', chapters)\r\n this.$emit('reader:refresh')\r\n\r\n this.$emit('refresh', chapters)\r\n\r\n return this\r\n }\r\n\r\n addButton(button) {\r\n const buttons = this.buttons\r\n\r\n buttons.splice(-1, 0, button)\r\n this.$emit('toolbar:add:button', buttons)\r\n\r\n return this\r\n }\r\n\r\n removeButton(name) {\r\n this.$emit('toolbar:remove:button', name)\r\n return this\r\n }\r\n\r\n toTop() {\r\n const afterScroll = this.attr('afterScroll')\r\n const toolbar = this.toolbar\r\n const navigator = this.navigator\r\n const count = this.count()\r\n const afterTop = () => {\r\n toolbar.hide('up')\r\n toolbar.show('down')\r\n\r\n if (count > 0) {\r\n navigator.highlight(0)\r\n navigator.playing = false\r\n scrollTo(navigator.$main, 0)\r\n }\r\n\r\n if (isFunction(afterScroll)) {\r\n afterScroll.call(toolbar, 'up')\r\n }\r\n }\r\n\r\n if (count > 0) {\r\n navigator.playing = true\r\n }\r\n this.scrollTo(0, afterTop)\r\n\r\n return this\r\n }\r\n\r\n toBottom() {\r\n const afterScroll = this.attr('afterScroll')\r\n const $scrollElement = this.$scrollElement\r\n const toolbar = this.toolbar\r\n const navigator = this.navigator\r\n const count = this.count()\r\n const top = Math.floor(\r\n $scrollElement.scrollHeight - $scrollElement.clientHeight\r\n )\r\n const afterDown = () => {\r\n const $main = navigator.$main\r\n toolbar.hide('down')\r\n toolbar.show('up')\r\n\r\n if (count > 0) {\r\n navigator.highlight(count - 1)\r\n scrollTo($main, $main.scrollHeight)\r\n navigator.playing = false\r\n }\r\n\r\n if (isFunction(afterScroll)) {\r\n afterScroll.call(toolbar, 'bottom')\r\n }\r\n }\r\n\r\n if (count > 0) {\r\n navigator.playing = true\r\n }\r\n\r\n this.scrollTo(top, afterDown)\r\n\r\n return this\r\n }\r\n\r\n scrollTo(top, afterScroll) {\r\n scrollTo(this.$scrollElement, top, afterScroll)\r\n return this\r\n }\r\n\r\n enterReading() {\r\n this.$emit('toolbar:toggle')\r\n this.$emit('reader:enter')\r\n\r\n return this\r\n }\r\n\r\n exitReading() {\r\n this.$emit('toolbar:toggle')\r\n this.$emit('reader:exit')\r\n\r\n return this\r\n }\r\n\r\n switchReading() {\r\n this.$emit('toolbar:toggle')\r\n this.$emit('reader:toggle')\r\n\r\n return this\r\n }\r\n\r\n expand() {\r\n const position = this.attr('position')\r\n const toolbar = this.toolbar\r\n const drawer = this.drawer\r\n const navigator = this.navigator\r\n const count = this.count()\r\n\r\n if (count < 1) {\r\n return this\r\n }\r\n\r\n if (position !== 'relative') {\r\n navigator.show()\r\n toolbar.highlight('toggle')\r\n } else {\r\n toolbar.hide()\r\n\r\n later(() => {\r\n drawer.open()\r\n })\r\n }\r\n\r\n return this\r\n }\r\n\r\n collapses() {\r\n const position = this.attr('position')\r\n const toolbar = this.toolbar\r\n const drawer = this.drawer\r\n const navigator = this.navigator\r\n const count = this.count()\r\n\r\n if (count < 1) {\r\n return this\r\n }\r\n\r\n if (position !== 'relative') {\r\n navigator.hide()\r\n toolbar.highlight('toggle')\r\n } else {\r\n toolbar.show()\r\n\r\n later(() => {\r\n drawer.close()\r\n })\r\n }\r\n\r\n return this\r\n }\r\n\r\n toggle() {\r\n if (this.isExpanded()) {\r\n this.collapses()\r\n } else {\r\n this.expand()\r\n }\r\n\r\n return this\r\n }\r\n\r\n print() {\r\n this.$emit('reader:print')\r\n\r\n return this\r\n }\r\n\r\n _destroy() {\r\n const count = this.count()\r\n let anchors = this.anchors\r\n let navigator = this.navigator\r\n let drawer = this.drawer\r\n let reader = this.reader\r\n let toolbar = this.toolbar\r\n let isOutside = false\r\n\r\n this.removeListeners()\r\n\r\n if (reader) {\r\n reader.destroy()\r\n }\r\n\r\n if (count > 0 && navigator) {\r\n isOutside = navigator.isOutside()\r\n\r\n navigator.destroy()\r\n\r\n if (isOutside && drawer) {\r\n drawer.destroy()\r\n }\r\n }\r\n\r\n if (anchors) {\r\n anchors.destroy()\r\n }\r\n\r\n if (toolbar) {\r\n toolbar.destroy()\r\n }\r\n\r\n return this\r\n }\r\n\r\n destroy() {\r\n this.$emit('beforeDestroy')\r\n\r\n this._destroy()._default()\r\n\r\n this.$emit('destroyed')\r\n\r\n return this\r\n }\r\n\r\n addListeners() {\r\n const hasToolbar = this.attr('hasToolbar')\r\n\r\n if (!hasToolbar) {\r\n return this\r\n }\r\n\r\n this.$on('toolbar:update', this.onToolbarUpdate)\r\n\r\n return this\r\n }\r\n\r\n removeListeners() {\r\n const hasToolbar = this.attr('hasToolbar')\r\n\r\n if (!hasToolbar) {\r\n return this\r\n }\r\n\r\n this.$off('toolbar:update')\r\n\r\n return this\r\n }\r\n}\r\n\r\nOutline.DEFAULTS = (() => {\r\n const OPTIONS = {\r\n articleElement: '#article',\r\n selector: 'h2,h3,h4,h5,h6',\r\n parentElement: '#aside',\r\n scrollElement: 'html,body',\r\n title: '目录',\r\n position: 'relative',\r\n placement: 'rtl',\r\n animationCurrent: true,\r\n showCode: false,\r\n hasToolbar: true,\r\n closeOnClickModal: true,\r\n showNavModalFirst: false,\r\n anchorURL: '',\r\n stickyHeight: 0,\r\n homepage: '',\r\n git: '',\r\n tags: '',\r\n issues: '',\r\n tools: [],\r\n reader: {\r\n target: '',\r\n title: '',\r\n enterReadingTip: '进入阅读模式,按 ESC 键可退出阅读模式',\r\n allowSpeak: false\r\n },\r\n customClass: '',\r\n afterSticky: null,\r\n afterToggle: null,\r\n afterScroll: null,\r\n chapterTextFilter: null,\r\n anchorLinkFilter: null\r\n }\r\n\r\n return cloneDeep(OPTIONS)\r\n})()\r\n\r\nif (window?.jQuery) {\r\n const $ = window.jQuery\r\n\r\n // 将 Outline 扩展为一个 jquery 插件\r\n // eslint-disable-next-line no-undef\r\n $.extend($.fn, {\r\n outline: function (options) {\r\n // eslint-disable-next-line no-undef\r\n let $article = $(this)\r\n\r\n return new Outline(\r\n // eslint-disable-next-line no-undef\r\n $.extend({}, options, {\r\n articleElement: $article\r\n })\r\n )\r\n }\r\n })\r\n}\r\n\r\nexport default Outline\r\n"],"names":["toString","val","Object","prototype","apply","isFunction","later","fn","delay","setTimeout","isObject","o","isArray","Array","cloneDeep","obj","clone","from","assign","keys","forEach","key","isString","str","isElement","nodeName","tagName","nodeType","hasClass","el","className","pattern","RegExp","allClass","classList","contains","exec","addClass","_classList","add","indexOf","split","name","length","easeInQuad","x","scrollTo","scrollElement","top","afterStop","$scrollElement","_getScrollElement","$rootElements","document","querySelector","querySelectorAll","scrollTop","step","distance","MAX_HEIGHT","scrollHeight","MAX_TOP","stop","play","requestAnimationFrame","getScrollElement","trim","replace","getChaptersByHeadings","headings","showCode","chapterTextFilter","chapters","previous","level","text","heading","i","headingLevel","current","parseInt","pid","_getChapterParentIdByDiffer","differ","index","innerHTML","push","id","rel","groups","group","JSON","stringify","cb","code","String","c","subjects","_getChaptersWithCode","getChapters","options","articleElement","selector","isTreeStructured","$article","$headings","filter","_maybeArrayLike","_toConsumableArray","toTree","list","nodeKey","parentKey","map","roots","item","children","node","hasOwn","prop","hasOwnProperty","call","extend","origin","source","_subscribers","_hasDirectSubscribersFor","topic","has","isDirect","found","position","lastIndexOf","substring","_hasSubscribers","emit","data","async","execute","subscriber","message","callback","context","deliver","guid","uuid","prefix","_removeSubscriber","off","token","subject","execution","j","splice","_removeSubscriberByToken","Component","constructor","this","attrs","initialize","attr","render","addListeners","value","arguments","refresh","destroy","removeListeners","reload","$emit","event","publish","$on","on","handler","subscribe","$off","unsubscribe","queue","isHandling","done","runIdle","idleDeadline","timeRemaining","shift","requestIdleCallback","window","start","Date","now","didTimeout","Math","max","cancelIdleCallback","clearTimeout","timeSlice","afterComplete","offsetTop","offsetParent","matches","sel","msMatchesSelector","getParentOrHost","host","parentNode","CAPTURE_EVENTS","_off","type","capture","_delegateListener","listeners","_listeners","listener","_delete","removeEventListener","purgeElement","recurse","$element","$children","childNodes","getListeners","$child","once","evt","target","getTarget","delegateTarget","closest","ctx","includeCTX","startsWith","overrideContext","addEventListener","stopPropagation","preventDefault","SYMBOLS","getSymbols","iconSet","getSymbol","patternName","patternSet","find","symbol","fullName","paint","$body","body","$icons","symbols","join","createElement","insertBefore","firstChild","isDOM","isHTMLCollection","fragment","isTextNode","setAttribute","toLowerCase","style","cssText","innerText","setAttributes","$fragment","createDocumentFragment","$el","isValidChild","child","append","createTextNode","appendChild","every","ICON","size","color","width","height","defaultRules","cssRules","$icon","$svg","binds","svg","test","isSVG","xmlns","class","icon","removeClass","remove","_removeHeading","$heading","hasAnchor","isAtStart","CLS_HEADING","$anchor","removeAttribute","removeChild","Anchors","super","_default","DEFAULTS","$articleElement","created","getHeadings","count","mounted","_paint","erase","_remove","LIMIT","anchorURL","anchorLinkFilter","update","chapterCode","_updateHeading","headingId","url","href","groupIndex","after","beforeDestroy","afterDestroy","onAnchorTrigger","afterScroll","stickyHeight","clientHeight","min","onRefresh","TAGS","isHTML","html","basic","full","slice","tag","stripScripts","setProperty","documentElement","zIndex","idx","Drawer","title","closed","$modal","$header","$title","$close","$main","$footer","$overlay","setTitle","isClosed","placement","hasClose","hasOverlay","hasOffset","hasPadding","autoHeight","overflow","customClass","mainClassName","content","$content","strHTML","template","open","opened","close","toggle","afterToggle","onClose","closeOnClickModal","afterClosed","afterOpened","at","getStyle","ruleName","getComputedStyle","HIDDEN","EXPANDED","FOLDED","Navigator","scrollTimer","resizeTimer","observerTimer","Observer","$list","$placeholder","$parentElement","$active","active","offsetWidth","playing","parentElement","$parent","isSticky","isFixed","isInside","isOutside","_paintEdge","animationCurrent","contents","calculateStickyHeight","highlight","sticky","onObserver","_paintChapters","clones","parts","byId","chapter","$text","$link","$code","$li","$subject","$chapter","_getPlaceholderOffset","mainPaddingTop","mainBorderTop","placeholderPaddingTop","placeholderMarginTop","placeholderBorderTop","offsetHeight","positionPlaceholder","ACTIVE","HIGHLIGHT","placeholderOffsetTop","getAttribute","inBounding","parent","parentRect","childRect","isInBounding","getBoundingClientRect","right","bottom","left","afterSticky","FIXED","isStickying","innerHeight","show","hide","intersection","props","root","rootMargin","IntersectionObserver","entries","entry","intersectionRatio","$root","section","observe","onSelect","onScroll","onResize","unobserve","isMobile","ua","navigator","userAgent","isPlainObject","getPrototypeOf","proto","isObjectLike","encodeHTML","CHARTS","instances","instance","Message","visible","offset","timer","destroyed","_objectSpread","isDestroyed","_getClassName","effect","round","closable","dangerouslyUseHTMLString","$type","$message","iconSize","_refreshIcon","iconName","$use","_refreshMessage","_refreshClose","_refreshEl","clearTimer","startTimer","duration","destroyAfterClosed","beforeClose","onMouseEnter","onMouseLeave","config","len","dom","clear","Command","action","Commands","commands","get","cmd","command","del","_createButton","button","rounded","link","$button","disabled","DISABLED","Toolbar","buttons","isHighlight","isDisabled","isExist","_getCommand","_self","bind","disable","_add","_disable","_enable","enable","enabled","onExecute","_updateToolbar","ceil","onToolbarUpdate","onAddButton","onRemoveButton","afterDisabled","afterEnabled","Speech","utterance","SpeechSynthesisUtterance","_initialize","lang","setLang","pitch","setPitch","rate","setRate","setText","voice","setVoice","volume","setVolume","_addListeners","isSpeaking","speechSynthesis","speaking","isPending","pending","isPaused","paused","getVoices","speak","pause","resume","cancel","speech","onvoiceschanged","isSupport","_updateSiblingElements","siblingElement","isPrev","$sibling","previousElementSibling","nextElementSibling","ENTER_READING_TIP","Reader","reading","$target","$paper","$progress","toolbar","_this$speech","_renderEdge","cloneNode","_animateTimeline","ScrollTimeline","animate","scale","timeline","axis","print","exit","enter","READER","READING","$siblings","enterReadingTip","info","SPEAK","onPrint","onEnterReading","onExitReading","keyCode","allowSpeak","Outline","version","anchors","drawer","reader","isExpanded","hasToolbar","_renderReader","_renderAnchors","_renderNavigator","_renderToolbar","option","showNavModalFirst","OPTIONS","homepage","git","tags","issues","tools","UP","toTop","HOME","GIT","ISSUES","MENU","PRINT","DOWN","toBottom","concat","addButton","removeButton","afterTop","floor","afterDown","enterReading","exitReading","switchReading","expand","collapses","_destroy","_window","jQuery","$","outline"],"mappings":"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F6I,GAAQG,SAmBC/R,EAlBS,CACdiC,cAAe,YACfsD,eAAgB,WAChBC,SAAU,oBACV+N,aAAc,EACdd,UAAW,GACXnB,WAAW,EACXC,WAAW,EACX/N,UAAU,EACVyO,QAAS,KACTG,QAAS,KACTkB,YAAa,KACbH,cAAe,KACfC,aAAc,KACd3P,kBAAmB,KACnBiP,iBAAkB,OEpUtB,MAAMiB,GAAO,CACX,IACA,OACA,UACA,OACA,UACA,QACA,QACA,IACA,OACA,MACA,MACA,aACA,OACA,KACA,SACA,SACA,UACA,OACA,OACA,MACA,WACA,OACA,WACA,KACA,MACA,UACA,MACA,SACA,MACA,KACA,KACA,KACA,QACA,WACA,aACA,SACA,SACA,OACA,KACA,KACA,KACA,KACA,KACA,KACA,OACA,SACA,SACA,KACA,OACA,IACA,SACA,MACA,QACA,MACA,MACA,QACA,SACA,KACA,OACA,OACA,MACA,OACA,OACA,OACA,WACA,OACA,QACA,MACA,WACA,SACA,KACA,WACA,SACA,SACA,IACA,QACA,UACA,MACA,WACA,IACA,KACA,KACA,KACA,MACA,OACA,IACA,OACA,SACA,SACA,UACA,SACA,OACA,QACA,SACA,OACA,SACA,QACA,MACA,UACA,MACA,MACA,QACA,QACA,KACA,WACA,WACA,QACA,KACA,QACA,OACA,QACA,KACA,QACA,IACA,KACA,MACA,QACA,OCzGIC,GAAUnT,IACd,IAAIoT,EACAC,EACAC,EAEJ,QAAKvT,EAASC,KAKdoT,EAAOzQ,EAAK3C,GAAKuT,MAAM,EAAG,KAC1BF,EAAQ,4DACRC,EAAO,IAAI7S,OAAOyS,GAAKxN,KAAK8N,GAAQ,IAAIA,eAAgBtF,KAAK,KAAM,KAE5DmF,EAAMjD,KAAKgD,IAASE,EAAKlD,KAAKgD,GAAK,ECtBtCK,GAAgBzT,GACbA,EAAI4C,QAAQ,+BAAgC,ICP/C8Q,GAAcA,CAAC1N,EAAM4C,KACD9G,SAAS6R,gBACjB/E,MAAM8E,YAAY1N,EAAM4C,EAAM,ECAhD,IAAI/E,GAAQ,IAEZ,MAAM+P,GAAUC,IACVA,EAC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"} \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 0855aeae..6c701f5d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@yaohaixiao/outline.js", - "version": "3.39.2", + "version": "3.39.3", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@yaohaixiao/outline.js", - "version": "3.39.2", + "version": "3.39.3", "license": "MIT", "devDependencies": { "@babel/core": "^7.21.0", @@ -17,6 +17,7 @@ "@commitlint/cli": "^17.4.4", "@commitlint/config-angular": "^19.0.3", "@commitlint/config-conventional": "^17.4.4", + "@rollup/plugin-alias": "^5.1.0", "@rollup/plugin-babel": "^6.0.4", "@rollup/plugin-commonjs": "^25.0.2", "@rollup/plugin-node-resolve": "^15.1.0", @@ -29,6 +30,7 @@ "commitlint": "^17.4.4", "conventional-changelog": "^5.1.0", "conventional-changelog-cli": "^2.2.2", + "cssnano": "^7.0.5", "eslint": "^8.34.0", "eslint-config-prettier": "^8.6.0", "eslint-import-resolver-jest": "^3.0.2", @@ -53,12 +55,14 @@ "jest": "^29.5.0", "jest-environment-jsdom": "^29.6.1", "jest-html-reporter": "^3.7.0", + "less": "^4.2.0", "less-plugin-autoprefix": "^2.0.0", "lint-staged": "^13.1.2", "os": "^0.1.2", "prettier": "^2.8.4", "puppeteer": "^22.6.1", - "rollup": "^3.26.0" + "rollup": "^3.26.0", + "rollup-plugin-postcss": "^4.0.2" } }, "node_modules/@ampproject/remapping": { @@ -2493,6 +2497,29 @@ "node": ">=0.4.0" } }, + "node_modules/@gulp-sourcemaps/identity-map/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, + "node_modules/@gulp-sourcemaps/identity-map/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dev": true, + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, "node_modules/@gulp-sourcemaps/identity-map/node_modules/source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -3496,6 +3523,38 @@ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true }, + "node_modules/@rollup/plugin-alias": { + "version": "5.1.0", + "resolved": "https://registry.npmmirror.com/@rollup/plugin-alias/-/plugin-alias-5.1.0.tgz", + "integrity": "sha512-lpA3RZ9PdIG7qqhEfv79tBffNaoDuukFDrmhLqg9ifv99u/ehn+lOg30x2zmhf8AQqQUZaMk/B9fZraQ6/acDQ==", + "dev": true, + "dependencies": { + "slash": "^4.0.0" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/plugin-alias/node_modules/slash": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/slash/-/slash-4.0.0.tgz", + "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/@rollup/plugin-babel": { "version": "6.0.4", "resolved": "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-6.0.4.tgz", @@ -3655,6 +3714,15 @@ "integrity": "sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==", "dev": true }, + "node_modules/@trysound/sax": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", + "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==", + "dev": true, + "engines": { + "node": ">=10.13.0" + } + }, "node_modules/@tsconfig/node10": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz", @@ -5122,6 +5190,12 @@ "safe-json-parse": "~1.0.1" } }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "dev": true + }, "node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -5154,9 +5228,9 @@ } }, "node_modules/browserslist": { - "version": "4.23.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.0.tgz", - "integrity": "sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==", + "version": "4.23.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.3.tgz", + "integrity": "sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA==", "dev": true, "funding": [ { @@ -5173,10 +5247,10 @@ } ], "dependencies": { - "caniuse-lite": "^1.0.30001587", - "electron-to-chromium": "^1.4.668", - "node-releases": "^2.0.14", - "update-browserslist-db": "^1.0.13" + "caniuse-lite": "^1.0.30001646", + "electron-to-chromium": "^1.5.4", + "node-releases": "^2.0.18", + "update-browserslist-db": "^1.1.0" }, "bin": { "browserslist": "cli.js" @@ -5337,10 +5411,22 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/caniuse-api": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", + "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", + "dev": true, + "dependencies": { + "browserslist": "^4.0.0", + "caniuse-lite": "^1.0.0", + "lodash.memoize": "^4.1.2", + "lodash.uniq": "^4.5.0" + } + }, "node_modules/caniuse-lite": { - "version": "1.0.30001621", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001621.tgz", - "integrity": "sha512-+NLXZiviFFKX0fk8Piwv3PfLPGtRqJeq2TiNoUff/qB5KJgwecJTvCXDpmlyP/eCI/GUEmp/h/y5j0yckiiZrA==", + "version": "1.0.30001655", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001655.tgz", + "integrity": "sha512-jRGVy3iSGO5Uutn2owlb5gR6qsGngTw9ZTb4ali9f3glshcNmJ2noam4Mo9zia5P9Dk3jNNydy7vQjuE5dQmfg==", "dev": true, "funding": [ { @@ -5759,6 +5845,12 @@ "color-support": "bin.js" } }, + "node_modules/colord": { + "version": "2.9.3", + "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz", + "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==", + "dev": true + }, "node_modules/colorette": { "version": "2.0.20", "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", @@ -5860,6 +5952,24 @@ "typedarray": "^0.0.6" } }, + "node_modules/concat-with-sourcemaps": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/concat-with-sourcemaps/-/concat-with-sourcemaps-1.1.0.tgz", + "integrity": "sha512-4gEjHJFT9e+2W/77h/DS5SGUgwDaOwprX8L/gl5+3ixnzkVJJsZWDSelmN3Oilw3LNDZjZV0yqH1hLG3k6nghg==", + "dev": true, + "dependencies": { + "source-map": "^0.6.1" + } + }, + "node_modules/concat-with-sourcemaps/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/connect": { "version": "3.7.0", "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz", @@ -6985,6 +7095,59 @@ "source-map-resolve": "^0.6.0" } }, + "node_modules/css-declaration-sorter": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-7.2.0.tgz", + "integrity": "sha512-h70rUM+3PNFuaBDTLe8wF/cdWu+dOZmb7pJt8Z2sedYbAcQVQV/tEchueg3GWxwqS0cxtbxmaHEdkNACqcvsow==", + "dev": true, + "engines": { + "node": "^14 || ^16 || >=18" + }, + "peerDependencies": { + "postcss": "^8.0.9" + } + }, + "node_modules/css-select": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", + "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", + "dev": true, + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css-tree": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz", + "integrity": "sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==", + "dev": true, + "dependencies": { + "mdn-data": "2.0.30", + "source-map-js": "^1.0.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" + } + }, + "node_modules/css-what": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", + "dev": true, + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, "node_modules/css/node_modules/source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -6994,6 +7157,139 @@ "node": ">=0.10.0" } }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true, + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cssnano": { + "version": "7.0.5", + "resolved": "https://registry.npmmirror.com/cssnano/-/cssnano-7.0.5.tgz", + "integrity": "sha512-Aq0vqBLtpTT5Yxj+hLlLfNPFuRQCDIjx5JQAhhaedQKLNDvDGeVziF24PS+S1f0Z5KCxWvw0QVI3VNHNBITxVQ==", + "dev": true, + "dependencies": { + "cssnano-preset-default": "^7.0.5", + "lilconfig": "^3.1.2" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/cssnano" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/cssnano-preset-default": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-7.0.5.tgz", + "integrity": "sha512-Jbzja0xaKwc5JzxPQoc+fotKpYtWEu4wQLMQe29CM0FjjdRjA4omvbGHl2DTGgARKxSTpPssBsok+ixv8uTBqw==", + "dev": true, + "dependencies": { + "browserslist": "^4.23.3", + "css-declaration-sorter": "^7.2.0", + "cssnano-utils": "^5.0.0", + "postcss-calc": "^10.0.1", + "postcss-colormin": "^7.0.2", + "postcss-convert-values": "^7.0.3", + "postcss-discard-comments": "^7.0.2", + "postcss-discard-duplicates": "^7.0.1", + "postcss-discard-empty": "^7.0.0", + "postcss-discard-overridden": "^7.0.0", + "postcss-merge-longhand": "^7.0.3", + "postcss-merge-rules": "^7.0.3", + "postcss-minify-font-values": "^7.0.0", + "postcss-minify-gradients": "^7.0.0", + "postcss-minify-params": "^7.0.2", + "postcss-minify-selectors": "^7.0.3", + "postcss-normalize-charset": "^7.0.0", + "postcss-normalize-display-values": "^7.0.0", + "postcss-normalize-positions": "^7.0.0", + "postcss-normalize-repeat-style": "^7.0.0", + "postcss-normalize-string": "^7.0.0", + "postcss-normalize-timing-functions": "^7.0.0", + "postcss-normalize-unicode": "^7.0.2", + "postcss-normalize-url": "^7.0.0", + "postcss-normalize-whitespace": "^7.0.0", + "postcss-ordered-values": "^7.0.1", + "postcss-reduce-initial": "^7.0.2", + "postcss-reduce-transforms": "^7.0.0", + "postcss-svgo": "^7.0.1", + "postcss-unique-selectors": "^7.0.2" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/cssnano-utils": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-5.0.0.tgz", + "integrity": "sha512-Uij0Xdxc24L6SirFr25MlwC2rCFX6scyUmuKpzI+JQ7cyqDEwD42fJ0xfB3yLfOnRDU5LKGgjQ9FA6LYh76GWQ==", + "dev": true, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/cssnano/node_modules/lilconfig": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.2.tgz", + "integrity": "sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antonk52" + } + }, + "node_modules/csso": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/csso/-/csso-5.0.5.tgz", + "integrity": "sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==", + "dev": true, + "dependencies": { + "css-tree": "~2.2.0" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/csso/node_modules/css-tree": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.2.1.tgz", + "integrity": "sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==", + "dev": true, + "dependencies": { + "mdn-data": "2.0.28", + "source-map-js": "^1.0.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/csso/node_modules/mdn-data": { + "version": "2.0.28", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.28.tgz", + "integrity": "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==", + "dev": true + }, "node_modules/cssom": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.5.0.tgz", @@ -7656,6 +7952,32 @@ "integrity": "sha512-LLBi6pEqS6Do3EKQ3J0NqHWV5hhb78Pi8vvESYwyOy2c31ZEZVdtitdzsQsKb7878PEERhzUk0ftqGhG6Mz+pQ==", "dev": true }, + "node_modules/dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "dev": true, + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ] + }, "node_modules/domexception": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/domexception/-/domexception-4.0.0.tgz", @@ -7669,6 +7991,35 @@ "node": ">=12" } }, + "node_modules/domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "dev": true, + "dependencies": { + "domelementtype": "^2.3.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/domutils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", + "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", + "dev": true, + "dependencies": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, "node_modules/dot-prop": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", @@ -7761,9 +8112,9 @@ "dev": true }, "node_modules/electron-to-chromium": { - "version": "1.4.783", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.783.tgz", - "integrity": "sha512-bT0jEz/Xz1fahQpbZ1D7LgmPYZ3iHVY39NcWWro1+hA2IvjiPeaXtfSqrQ+nXjApMvQRE2ASt1itSLRrebHMRQ==", + "version": "1.5.13", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.13.tgz", + "integrity": "sha512-lbBcvtIJ4J6sS4tb5TLp1b4LyfCdMkwStzXPyAgVgTRAsep4bvrAGaBOP7ZJtQMNJpSQ9SqG4brWOroNaQtm7Q==", "dev": true }, "node_modules/emittery": { @@ -9508,6 +9859,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/generic-names": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/generic-names/-/generic-names-4.0.0.tgz", + "integrity": "sha512-ySFolZQfw9FoDb3ed9d80Cm9f0+r7qj+HJkWjeD9RBfpxEVTlVhol+gvaQB/78WbwYfbnNh8nWHHBSlg072y6A==", + "dev": true, + "dependencies": { + "loader-utils": "^3.2.0" + } + }, "node_modules/gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", @@ -12474,6 +12834,24 @@ "node": ">=0.10.0" } }, + "node_modules/icss-replace-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz", + "integrity": "sha512-chIaY3Vh2mh2Q3RGXttaDIzeiPvaVXJ+C4DAh/w3c37SKZ/U6PGMmuicR2EQQp9bKG8zLMCl7I+PtIoOOPp8Gg==", + "dev": true + }, + "node_modules/icss-utils": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", + "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", + "dev": true, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, "node_modules/ieee754": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", @@ -12516,6 +12894,18 @@ "node": ">=0.10.0" } }, + "node_modules/import-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/import-cwd/-/import-cwd-3.0.0.tgz", + "integrity": "sha512-4pnzH16plW+hgvRECbDWpQl3cqtvSofHWh44met7ESfZ8UZOWWddm8hEyDTqREJ9RbYHY8gi8DqmaelApoOGMg==", + "dev": true, + "dependencies": { + "import-from": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/import-fresh": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", @@ -12541,6 +12931,18 @@ "node": ">=4" } }, + "node_modules/import-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/import-from/-/import-from-3.0.0.tgz", + "integrity": "sha512-CiuXOFFSzkU5x/CR0+z7T91Iht4CXgfCxVOFRhh2Zyhg5wOpWvvDLQUsWl+gcN+QscYBjez8hDCt85O7RLDttQ==", + "dev": true, + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/import-local": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", @@ -15491,7 +15893,7 @@ }, "node_modules/less": { "version": "4.2.0", - "resolved": "https://registry.npmjs.org/less/-/less-4.2.0.tgz", + "resolved": "https://registry.npmmirror.com/less/-/less-4.2.0.tgz", "integrity": "sha512-P3b3HJDBtSzsXUl0im2L7gTO5Ubg8mEN6G8qoTS77iXxXX4Hvu4Qj540PZDvQ8V6DmX6iXo98k7Md0Cm1PrLaA==", "dev": true, "dependencies": { @@ -15956,6 +16358,15 @@ "node": ">=4" } }, + "node_modules/loader-utils": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.3.1.tgz", + "integrity": "sha512-FMJTLMXfCLMLfJxcX9PFqX5qD88Z5MRGaZCVzfuqeZSPsyiBzs+pahDQjbIWz2QIzPZz0NX9Zy4FX3lmK6YHIg==", + "dev": true, + "engines": { + "node": ">= 12.13.0" + } + }, "node_modules/locate-path": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", @@ -16630,6 +17041,12 @@ "integrity": "sha512-rUxjysqif/BZQH2yhd5Aaq7vXMSx9NdEsQcyA07uEzIvxgI7zIr33gGsh+RU0/XjmQpCW7RsVof1vlkvQVCK5A==", "dev": true }, + "node_modules/mdn-data": { + "version": "2.0.30", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz", + "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==", + "dev": true + }, "node_modules/memoizee": { "version": "0.4.17", "resolved": "https://registry.npmjs.org/memoizee/-/memoizee-0.4.17.tgz", @@ -17132,6 +17549,25 @@ "dev": true, "optional": true }, + "node_modules/nanoid": { + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "peer": true, + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, "node_modules/nanomatch": { "version": "1.2.13", "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", @@ -17301,9 +17737,9 @@ "dev": true }, "node_modules/node-releases": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", - "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz", + "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==", "dev": true }, "node_modules/normalize-package-data": { @@ -17351,6 +17787,18 @@ "node": ">=0.10.0" } }, + "node_modules/normalize-url": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", + "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/now-and-later": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/now-and-later/-/now-and-later-2.0.1.tgz", @@ -17375,12 +17823,24 @@ "node": ">=8" } }, - "node_modules/num2fraction": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", - "integrity": "sha512-Y1wZESM7VUThYY+4W+X4ySH2maqcA+p7UR+w8VWNWVAd6lwuXXWz/w/Cz43J/dI2I+PS6wD5N+bJUF+gjWvIqg==", - "dev": true - }, + "node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "dev": true, + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/num2fraction": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", + "integrity": "sha512-Y1wZESM7VUThYY+4W+X4ySH2maqcA+p7UR+w8VWNWVAd6lwuXXWz/w/Cz43J/dI2I+PS6wD5N+bJUF+gjWvIqg==", + "dev": true + }, "node_modules/number-is-nan": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", @@ -17707,6 +18167,15 @@ "node": ">=0.10.0" } }, + "node_modules/p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", + "dev": true, + "engines": { + "node": ">=4" + } + }, "node_modules/p-limit": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", @@ -17737,6 +18206,40 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/p-queue": { + "version": "6.6.2", + "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-6.6.2.tgz", + "integrity": "sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ==", + "dev": true, + "dependencies": { + "eventemitter3": "^4.0.4", + "p-timeout": "^3.2.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-queue/node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "dev": true + }, + "node_modules/p-timeout": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-3.2.0.tgz", + "integrity": "sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==", + "dev": true, + "dependencies": { + "p-finally": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/p-try": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", @@ -18277,426 +18780,1086 @@ } }, "node_modules/postcss": { - "version": "7.0.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", - "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "version": "8.4.44", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.44.tgz", + "integrity": "sha512-Aweb9unOEpQ3ezu4Q00DPvvM2ZTUitJdNKeP/+uQgr1IBIqu574IaZoURId7BKtWMREwzKa9OgzPzezWGPWFQw==", "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "peer": true, "dependencies": { - "picocolors": "^0.2.1", - "source-map": "^0.6.1" + "nanoid": "^3.3.7", + "picocolors": "^1.0.1", + "source-map-js": "^1.2.0" }, "engines": { - "node": ">=6.0.0" + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-calc": { + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-10.0.2.tgz", + "integrity": "sha512-DT/Wwm6fCKgpYVI7ZEWuPJ4az8hiEHtCUeYjZXqU7Ou4QqYh1Df2yCQ7Ca6N7xqKPFkxN3fhf+u9KSoOCJNAjg==", + "dev": true, + "dependencies": { + "postcss-selector-parser": "^6.1.2", + "postcss-value-parser": "^4.2.0" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" + "engines": { + "node": "^18.12 || ^20.9 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.38" } }, - "node_modules/postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "node_modules/postcss-calc/node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", "dev": true }, - "node_modules/postcss/node_modules/picocolors": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", - "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "node_modules/postcss-colormin": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-7.0.2.tgz", + "integrity": "sha512-YntRXNngcvEvDbEjTdRWGU606eZvB5prmHG4BF0yLmVpamXbpsRJzevyy6MZVyuecgzI2AWAlvFi8DAeCqwpvA==", + "dev": true, + "dependencies": { + "browserslist": "^4.23.3", + "caniuse-api": "^3.0.0", + "colord": "^2.9.3", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-colormin/node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", "dev": true }, - "node_modules/postcss/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "node_modules/postcss-convert-values": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-7.0.3.tgz", + "integrity": "sha512-yJhocjCs2SQer0uZ9lXTMOwDowbxvhwFVrZeS6NPEij/XXthl73ggUmfwVvJM+Vaj5gtCKJV1jiUu4IhAUkX/Q==", "dev": true, + "dependencies": { + "browserslist": "^4.23.3", + "postcss-value-parser": "^4.2.0" + }, "engines": { - "node": ">=0.10.0" + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" } }, - "node_modules/prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "node_modules/postcss-convert-values/node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true + }, + "node_modules/postcss-discard-comments": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-7.0.2.tgz", + "integrity": "sha512-/Hje9Ls1IYcB9duELO/AyDUJI6aQVY3h5Rj1ziXgaLYCTi1iVBLnjg/TS0D6NszR/kDG6I86OwLmAYe+bvJjiQ==", "dev": true, + "dependencies": { + "postcss-selector-parser": "^6.1.1" + }, "engines": { - "node": ">= 0.8.0" + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" } }, - "node_modules/preserve": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", - "integrity": "sha512-s/46sYeylUfHNjI+sA/78FAHlmIuKqI9wNnzEOGehAlUUYeObv5C2mOinXBjyUyWmJ2SfcS2/ydApH4hTF4WXQ==", + "node_modules/postcss-discard-duplicates": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-7.0.1.tgz", + "integrity": "sha512-oZA+v8Jkpu1ct/xbbrntHRsfLGuzoP+cpt0nJe5ED2FQF8n8bJtn7Bo28jSmBYwqgqnqkuSXJfSUEE7if4nClQ==", "dev": true, "engines": { - "node": ">=0.10.0" + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" } }, - "node_modules/prettier": { - "version": "2.8.8", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", - "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", + "node_modules/postcss-discard-empty": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-7.0.0.tgz", + "integrity": "sha512-e+QzoReTZ8IAwhnSdp/++7gBZ/F+nBq9y6PomfwORfP7q9nBpK5AMP64kOt0bA+lShBFbBDcgpJ3X4etHg4lzA==", "dev": true, - "bin": { - "prettier": "bin-prettier.js" - }, "engines": { - "node": ">=10.13.0" + "node": "^18.12.0 || ^20.9.0 || >=22.0" }, - "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" + "peerDependencies": { + "postcss": "^8.4.31" } }, - "node_modules/prettier-linter-helpers": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", - "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", + "node_modules/postcss-discard-overridden": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-7.0.0.tgz", + "integrity": "sha512-GmNAzx88u3k2+sBTZrJSDauR0ccpE24omTQCVmaTTZFz1du6AasspjaUPMJ2ud4RslZpoFKyf+6MSPETLojc6w==", "dev": true, - "dependencies": { - "fast-diff": "^1.1.2" - }, "engines": { - "node": ">=6.0.0" + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" } }, - "node_modules/pretty-format": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", - "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "node_modules/postcss-load-config": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.1.4.tgz", + "integrity": "sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==", "dev": true, "dependencies": { - "@jest/schemas": "^29.6.3", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" + "lilconfig": "^2.0.5", + "yaml": "^1.10.2" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">= 10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": ">=8.0.9", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "postcss": { + "optional": true + }, + "ts-node": { + "optional": true + } } }, - "node_modules/pretty-format/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "node_modules/postcss-load-config/node_modules/yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", "dev": true, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "node": ">= 6" } }, - "node_modules/pretty-hrtime": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", - "integrity": "sha512-66hKPCr+72mlfiSjlEB1+45IjXSqvVAIy6mocupoww4tBFE9R9IhwwUGoI4G++Tc9Aq+2rxOt0RFU6gPcrte0A==", + "node_modules/postcss-merge-longhand": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-7.0.3.tgz", + "integrity": "sha512-8waYomFxshdv6M9Em3QRM9MettRLDRcH2JQi2l0Z1KlYD/vhal3gbkeSES0NuACXOlZBB0V/B0AseHZaklzWOA==", "dev": true, + "dependencies": { + "postcss-value-parser": "^4.2.0", + "stylehacks": "^7.0.3" + }, "engines": { - "node": ">= 0.8" + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" } }, - "node_modules/process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "node_modules/postcss-merge-longhand/node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", "dev": true }, - "node_modules/progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "node_modules/postcss-merge-rules": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-7.0.3.tgz", + "integrity": "sha512-2eSas2p3voPxNfdI5sQrvIkMaeUHpVc3EezgVs18hz/wRTQAC9U99tp9j3W5Jx9/L3qHkEDvizEx/LdnmumIvQ==", "dev": true, + "dependencies": { + "browserslist": "^4.23.3", + "caniuse-api": "^3.0.0", + "cssnano-utils": "^5.0.0", + "postcss-selector-parser": "^6.1.1" + }, "engines": { - "node": ">=0.4.0" + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" } }, - "node_modules/promise": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", - "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", + "node_modules/postcss-minify-font-values": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-7.0.0.tgz", + "integrity": "sha512-2ckkZtgT0zG8SMc5aoNwtm5234eUx1GGFJKf2b1bSp8UflqaeFzR50lid4PfqVI9NtGqJ2J4Y7fwvnP/u1cQog==", "dev": true, "dependencies": { - "asap": "~2.0.3" + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" } }, - "node_modules/prompts": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", - "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "node_modules/postcss-minify-font-values/node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true + }, + "node_modules/postcss-minify-gradients": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-7.0.0.tgz", + "integrity": "sha512-pdUIIdj/C93ryCHew0UgBnL2DtUS3hfFa5XtERrs4x+hmpMYGhbzo6l/Ir5de41O0GaKVpK1ZbDNXSY6GkXvtg==", "dev": true, "dependencies": { - "kleur": "^3.0.3", - "sisteransi": "^1.0.5" + "colord": "^2.9.3", + "cssnano-utils": "^5.0.0", + "postcss-value-parser": "^4.2.0" }, "engines": { - "node": ">= 6" + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" } }, - "node_modules/proxy-agent": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-6.4.0.tgz", - "integrity": "sha512-u0piLU+nCOHMgGjRbimiXmA9kM/L9EHh3zL81xCdp7m+Y2pHIsnmbdDoEDoAz5geaonNR6q6+yOPQs6n4T6sBQ==", + "node_modules/postcss-minify-gradients/node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true + }, + "node_modules/postcss-minify-params": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-7.0.2.tgz", + "integrity": "sha512-nyqVLu4MFl9df32zTsdcLqCFfE/z2+f8GE1KHPxWOAmegSo6lpV2GNy5XQvrzwbLmiU7d+fYay4cwto1oNdAaQ==", "dev": true, "dependencies": { - "agent-base": "^7.0.2", - "debug": "^4.3.4", - "http-proxy-agent": "^7.0.1", - "https-proxy-agent": "^7.0.3", - "lru-cache": "^7.14.1", - "pac-proxy-agent": "^7.0.1", - "proxy-from-env": "^1.1.0", - "socks-proxy-agent": "^8.0.2" + "browserslist": "^4.23.3", + "cssnano-utils": "^5.0.0", + "postcss-value-parser": "^4.2.0" }, "engines": { - "node": ">= 14" + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" } }, - "node_modules/proxy-agent/node_modules/agent-base": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", - "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", + "node_modules/postcss-minify-params/node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true + }, + "node_modules/postcss-minify-selectors": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-7.0.3.tgz", + "integrity": "sha512-SxTgUQSgBk6wEqzQZKEv1xQYIp9UBju6no9q+npohzSdhuSICQdkqmD1UMKkZWItS3olJSJMDDEY9WOJ5oGJew==", "dev": true, "dependencies": { - "debug": "^4.3.4" + "cssesc": "^3.0.0", + "postcss-selector-parser": "^6.1.1" }, "engines": { - "node": ">= 14" + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" } }, - "node_modules/proxy-agent/node_modules/http-proxy-agent": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", - "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", + "node_modules/postcss-modules": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/postcss-modules/-/postcss-modules-4.3.1.tgz", + "integrity": "sha512-ItUhSUxBBdNamkT3KzIZwYNNRFKmkJrofvC2nWab3CPKhYBQ1f27XXh1PAPE27Psx58jeelPsxWB/+og+KEH0Q==", "dev": true, "dependencies": { - "agent-base": "^7.1.0", - "debug": "^4.3.4" + "generic-names": "^4.0.0", + "icss-replace-symbols": "^1.1.0", + "lodash.camelcase": "^4.3.0", + "postcss-modules-extract-imports": "^3.0.0", + "postcss-modules-local-by-default": "^4.0.0", + "postcss-modules-scope": "^3.0.0", + "postcss-modules-values": "^4.0.0", + "string-hash": "^1.1.1" }, - "engines": { - "node": ">= 14" + "peerDependencies": { + "postcss": "^8.0.0" } }, - "node_modules/proxy-agent/node_modules/https-proxy-agent": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.4.tgz", - "integrity": "sha512-wlwpilI7YdjSkWaQ/7omYBMTliDcmCN8OLihO6I9B86g06lMyAoqgoDpV0XqoaPOKj+0DIdAvnsWfyAAhmimcg==", + "node_modules/postcss-modules-extract-imports": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.1.0.tgz", + "integrity": "sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==", "dev": true, - "dependencies": { - "agent-base": "^7.0.2", - "debug": "4" - }, "engines": { - "node": ">= 14" + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" } }, - "node_modules/proxy-agent/node_modules/lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "node_modules/postcss-modules-local-by-default": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.5.tgz", + "integrity": "sha512-6MieY7sIfTK0hYfafw1OMEG+2bg8Q1ocHCpoWLqOKj3JXlKu4G7btkmM/B7lFubYkYWmRSPLZi5chid63ZaZYw==", "dev": true, + "dependencies": { + "icss-utils": "^5.0.0", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.1.0" + }, "engines": { - "node": ">=12" + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" } }, - "node_modules/proxy-from-env": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "node_modules/postcss-modules-local-by-default/node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", "dev": true }, - "node_modules/prr": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", - "integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==", + "node_modules/postcss-modules-scope": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.2.0.tgz", + "integrity": "sha512-oq+g1ssrsZOsx9M96c5w8laRmvEu9C3adDSjI8oTcbfkrTE8hx/zfyobUoWIxaKPO8bt6S62kxpw5GqypEw1QQ==", "dev": true, - "optional": true - }, - "node_modules/psl": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", - "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", - "dev": true + "dependencies": { + "postcss-selector-parser": "^6.0.4" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } }, - "node_modules/pug": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/pug/-/pug-3.0.3.tgz", - "integrity": "sha512-uBi6kmc9f3SZ3PXxqcHiUZLmIXgfgWooKWXcwSGwQd2Zi5Rb0bT14+8CJjJgI8AB+nndLaNgHGrcc6bPIB665g==", + "node_modules/postcss-modules-values": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", + "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", "dev": true, "dependencies": { - "pug-code-gen": "^3.0.3", - "pug-filters": "^4.0.0", - "pug-lexer": "^5.0.1", - "pug-linker": "^4.0.0", - "pug-load": "^3.0.0", - "pug-parser": "^6.0.0", - "pug-runtime": "^3.0.1", - "pug-strip-comments": "^2.0.0" + "icss-utils": "^5.0.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" } }, - "node_modules/pug-attrs": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pug-attrs/-/pug-attrs-3.0.0.tgz", - "integrity": "sha512-azINV9dUtzPMFQktvTXciNAfAuVh/L/JCl0vtPCwvOA21uZrC08K/UnmrL+SXGEVc1FwzjW62+xw5S/uaLj6cA==", + "node_modules/postcss-normalize-charset": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-7.0.0.tgz", + "integrity": "sha512-ABisNUXMeZeDNzCQxPxBCkXexvBrUHV+p7/BXOY+ulxkcjUZO0cp8ekGBwvIh2LbCwnWbyMPNJVtBSdyhM2zYQ==", "dev": true, - "dependencies": { - "constantinople": "^4.0.1", - "js-stringify": "^1.0.2", - "pug-runtime": "^3.0.0" + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" } }, - "node_modules/pug-code-gen": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/pug-code-gen/-/pug-code-gen-3.0.3.tgz", - "integrity": "sha512-cYQg0JW0w32Ux+XTeZnBEeuWrAY7/HNE6TWnhiHGnnRYlCgyAUPoyh9KzCMa9WhcJlJ1AtQqpEYHc+vbCzA+Aw==", + "node_modules/postcss-normalize-display-values": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-7.0.0.tgz", + "integrity": "sha512-lnFZzNPeDf5uGMPYgGOw7v0BfB45+irSRz9gHQStdkkhiM0gTfvWkWB5BMxpn0OqgOQuZG/mRlZyJxp0EImr2Q==", "dev": true, "dependencies": { - "constantinople": "^4.0.1", - "doctypes": "^1.1.0", - "js-stringify": "^1.0.2", - "pug-attrs": "^3.0.0", - "pug-error": "^2.1.0", - "pug-runtime": "^3.0.1", - "void-elements": "^3.1.0", - "with": "^7.0.0" + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" } }, - "node_modules/pug-error": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/pug-error/-/pug-error-2.1.0.tgz", - "integrity": "sha512-lv7sU9e5Jk8IeUheHata6/UThZ7RK2jnaaNztxfPYUY+VxZyk/ePVaNZ/vwmH8WqGvDz3LrNYt/+gA55NDg6Pg==", + "node_modules/postcss-normalize-display-values/node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", "dev": true }, - "node_modules/pug-filters": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/pug-filters/-/pug-filters-4.0.0.tgz", - "integrity": "sha512-yeNFtq5Yxmfz0f9z2rMXGw/8/4i1cCFecw/Q7+D0V2DdtII5UvqE12VaZ2AY7ri6o5RNXiweGH79OCq+2RQU4A==", + "node_modules/postcss-normalize-positions": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-7.0.0.tgz", + "integrity": "sha512-I0yt8wX529UKIGs2y/9Ybs2CelSvItfmvg/DBIjTnoUSrPxSV7Z0yZ8ShSVtKNaV/wAY+m7bgtyVQLhB00A1NQ==", "dev": true, "dependencies": { - "constantinople": "^4.0.1", - "jstransformer": "1.0.0", - "pug-error": "^2.0.0", - "pug-walk": "^2.0.0", - "resolve": "^1.15.1" + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" } }, - "node_modules/pug-lexer": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/pug-lexer/-/pug-lexer-5.0.1.tgz", - "integrity": "sha512-0I6C62+keXlZPZkOJeVam9aBLVP2EnbeDw3An+k0/QlqdwH6rv8284nko14Na7c0TtqtogfWXcRoFE4O4Ff20w==", - "dev": true, - "dependencies": { - "character-parser": "^2.2.0", - "is-expression": "^4.0.0", - "pug-error": "^2.0.0" - } + "node_modules/postcss-normalize-positions/node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true }, - "node_modules/pug-linker": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/pug-linker/-/pug-linker-4.0.0.tgz", - "integrity": "sha512-gjD1yzp0yxbQqnzBAdlhbgoJL5qIFJw78juN1NpTLt/mfPJ5VgC4BvkoD3G23qKzJtIIXBbcCt6FioLSFLOHdw==", + "node_modules/postcss-normalize-repeat-style": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-7.0.0.tgz", + "integrity": "sha512-o3uSGYH+2q30ieM3ppu9GTjSXIzOrRdCUn8UOMGNw7Af61bmurHTWI87hRybrP6xDHvOe5WlAj3XzN6vEO8jLw==", "dev": true, "dependencies": { - "pug-error": "^2.0.0", - "pug-walk": "^2.0.0" + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" } }, - "node_modules/pug-load": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pug-load/-/pug-load-3.0.0.tgz", - "integrity": "sha512-OCjTEnhLWZBvS4zni/WUMjH2YSUosnsmjGBB1An7CsKQarYSWQ0GCVyd4eQPMFJqZ8w9xgs01QdiZXKVjk92EQ==", + "node_modules/postcss-normalize-repeat-style/node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true + }, + "node_modules/postcss-normalize-string": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-7.0.0.tgz", + "integrity": "sha512-w/qzL212DFVOpMy3UGyxrND+Kb0fvCiBBujiaONIihq7VvtC7bswjWgKQU/w4VcRyDD8gpfqUiBQ4DUOwEJ6Qg==", "dev": true, "dependencies": { - "object-assign": "^4.1.1", - "pug-walk": "^2.0.0" + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" } }, - "node_modules/pug-parser": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/pug-parser/-/pug-parser-6.0.0.tgz", - "integrity": "sha512-ukiYM/9cH6Cml+AOl5kETtM9NR3WulyVP2y4HOU45DyMim1IeP/OOiyEWRr6qk5I5klpsBnbuHpwKmTx6WURnw==", + "node_modules/postcss-normalize-string/node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true + }, + "node_modules/postcss-normalize-timing-functions": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-7.0.0.tgz", + "integrity": "sha512-tNgw3YV0LYoRwg43N3lTe3AEWZ66W7Dh7lVEpJbHoKOuHc1sLrzMLMFjP8SNULHaykzsonUEDbKedv8C+7ej6g==", "dev": true, "dependencies": { - "pug-error": "^2.0.0", - "token-stream": "1.0.0" + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" } }, - "node_modules/pug-runtime": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/pug-runtime/-/pug-runtime-3.0.1.tgz", - "integrity": "sha512-L50zbvrQ35TkpHwv0G6aLSuueDRwc/97XdY8kL3tOT0FmhgG7UypU3VztfV/LATAvmUfYi4wNxSajhSAeNN+Kg==", + "node_modules/postcss-normalize-timing-functions/node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", "dev": true }, - "node_modules/pug-strip-comments": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pug-strip-comments/-/pug-strip-comments-2.0.0.tgz", - "integrity": "sha512-zo8DsDpH7eTkPHCXFeAk1xZXJbyoTfdPlNR0bK7rpOMuhBYb0f5qUVCO1xlsitYd3w5FQTK7zpNVKb3rZoUrrQ==", + "node_modules/postcss-normalize-unicode": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-7.0.2.tgz", + "integrity": "sha512-ztisabK5C/+ZWBdYC+Y9JCkp3M9qBv/XFvDtSw0d/XwfT3UaKeW/YTm/MD/QrPNxuecia46vkfEhewjwcYFjkg==", "dev": true, "dependencies": { - "pug-error": "^2.0.0" + "browserslist": "^4.23.3", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" } }, - "node_modules/pug-walk": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pug-walk/-/pug-walk-2.0.0.tgz", - "integrity": "sha512-yYELe9Q5q9IQhuvqsZNwA5hfPkMJ8u92bQLIMcsMxf/VADjNtEYptU+inlufAFYcWdHlwNfZOEnOOQrZrcyJCQ==", + "node_modules/postcss-normalize-unicode/node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", "dev": true }, - "node_modules/pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "node_modules/postcss-normalize-url": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-7.0.0.tgz", + "integrity": "sha512-+d7+PpE+jyPX1hDQZYG+NaFD+Nd2ris6r8fPTBAjE8z/U41n/bib3vze8x7rKs5H1uEw5ppe9IojewouHk0klQ==", "dev": true, "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" } }, - "node_modules/pumpify": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", - "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", + "node_modules/postcss-normalize-url/node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true + }, + "node_modules/postcss-normalize-whitespace": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-7.0.0.tgz", + "integrity": "sha512-37/toN4wwZErqohedXYqWgvcHUGlT8O/m2jVkAfAe9Bd4MzRqlBmXrJRePH0e9Wgnz2X7KymTgTOaaFizQe3AQ==", "dev": true, "dependencies": { - "duplexify": "^3.6.0", - "inherits": "^2.0.3", - "pump": "^2.0.0" + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" } }, - "node_modules/pumpify/node_modules/pump": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", - "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", + "node_modules/postcss-normalize-whitespace/node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true + }, + "node_modules/postcss-ordered-values": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-7.0.1.tgz", + "integrity": "sha512-irWScWRL6nRzYmBOXReIKch75RRhNS86UPUAxXdmW/l0FcAsg0lvAXQCby/1lymxn/o0gVa6Rv/0f03eJOwHxw==", "dev": true, "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" + "cssnano-utils": "^5.0.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" } }, - "node_modules/punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "node_modules/postcss-ordered-values/node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true + }, + "node_modules/postcss-reduce-initial": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-7.0.2.tgz", + "integrity": "sha512-pOnu9zqQww7dEKf62Nuju6JgsW2V0KRNBHxeKohU+JkHd/GAH5uvoObqFLqkeB2n20mr6yrlWDvo5UBU5GnkfA==", "dev": true, + "dependencies": { + "browserslist": "^4.23.3", + "caniuse-api": "^3.0.0" + }, "engines": { - "node": ">=6" + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" } }, - "node_modules/puppeteer": { - "version": "22.10.0", - "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-22.10.0.tgz", - "integrity": "sha512-ZOkZd6a6t0BdKcWb0wAYHWQqCfdlN1PPnXOmg/XNrbo6gJhYWFX4qCNb6ahSn8TpAqBqLCoD4Q010F7GwOM7mA==", + "node_modules/postcss-reduce-transforms": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-7.0.0.tgz", + "integrity": "sha512-pnt1HKKZ07/idH8cpATX/ujMbtOGhUfE+m8gbqwJE05aTaNw8gbo34a2e3if0xc0dlu75sUOiqvwCGY3fzOHew==", "dev": true, - "hasInstallScript": true, "dependencies": { - "@puppeteer/browsers": "2.2.3", - "cosmiconfig": "9.0.0", - "devtools-protocol": "0.0.1286932", - "puppeteer-core": "22.10.0" - }, - "bin": { - "puppeteer": "lib/esm/puppeteer/node/cli.js" + "postcss-value-parser": "^4.2.0" }, "engines": { - "node": ">=18" + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-reduce-transforms/node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true + }, + "node_modules/postcss-selector-parser": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", + "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", + "dev": true, + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-svgo": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-7.0.1.tgz", + "integrity": "sha512-0WBUlSL4lhD9rA5k1e5D8EN5wCEyZD6HJk0jIvRxl+FDVOMlJ7DePHYWGGVc5QRqrJ3/06FTXM0bxjmJpmTPSA==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.2.0", + "svgo": "^3.3.2" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >= 18" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-svgo/node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true + }, + "node_modules/postcss-unique-selectors": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-7.0.2.tgz", + "integrity": "sha512-CjSam+7Vf8cflJQsHrMS0P2hmy9u0+n/P001kb5eAszLmhjMqrt/i5AqQuNFihhViwDvEAezqTmXqaYXL2ugMw==", + "dev": true, + "dependencies": { + "postcss-selector-parser": "^6.1.1" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/preserve": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", + "integrity": "sha512-s/46sYeylUfHNjI+sA/78FAHlmIuKqI9wNnzEOGehAlUUYeObv5C2mOinXBjyUyWmJ2SfcS2/ydApH4hTF4WXQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/prettier": { + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", + "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", + "dev": true, + "bin": { + "prettier": "bin-prettier.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/prettier-linter-helpers": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", + "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", + "dev": true, + "dependencies": { + "fast-diff": "^1.1.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "dev": true, + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/pretty-hrtime": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", + "integrity": "sha512-66hKPCr+72mlfiSjlEB1+45IjXSqvVAIy6mocupoww4tBFE9R9IhwwUGoI4G++Tc9Aq+2rxOt0RFU6gPcrte0A==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, + "node_modules/progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/promise": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", + "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", + "dev": true, + "dependencies": { + "asap": "~2.0.3" + } + }, + "node_modules/promise.series": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/promise.series/-/promise.series-0.2.0.tgz", + "integrity": "sha512-VWQJyU2bcDTgZw8kpfBpB/ejZASlCrzwz5f2hjb/zlujOEB4oeiAhHygAWq8ubsX2GVkD4kCU5V2dwOTaCY5EQ==", + "dev": true, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "dev": true, + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/proxy-agent": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-6.4.0.tgz", + "integrity": "sha512-u0piLU+nCOHMgGjRbimiXmA9kM/L9EHh3zL81xCdp7m+Y2pHIsnmbdDoEDoAz5geaonNR6q6+yOPQs6n4T6sBQ==", + "dev": true, + "dependencies": { + "agent-base": "^7.0.2", + "debug": "^4.3.4", + "http-proxy-agent": "^7.0.1", + "https-proxy-agent": "^7.0.3", + "lru-cache": "^7.14.1", + "pac-proxy-agent": "^7.0.1", + "proxy-from-env": "^1.1.0", + "socks-proxy-agent": "^8.0.2" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/proxy-agent/node_modules/agent-base": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", + "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", + "dev": true, + "dependencies": { + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/proxy-agent/node_modules/http-proxy-agent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", + "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", + "dev": true, + "dependencies": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/proxy-agent/node_modules/https-proxy-agent": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.4.tgz", + "integrity": "sha512-wlwpilI7YdjSkWaQ/7omYBMTliDcmCN8OLihO6I9B86g06lMyAoqgoDpV0XqoaPOKj+0DIdAvnsWfyAAhmimcg==", + "dev": true, + "dependencies": { + "agent-base": "^7.0.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/proxy-agent/node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "dev": true + }, + "node_modules/prr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==", + "dev": true, + "optional": true + }, + "node_modules/psl": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", + "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", + "dev": true + }, + "node_modules/pug": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/pug/-/pug-3.0.3.tgz", + "integrity": "sha512-uBi6kmc9f3SZ3PXxqcHiUZLmIXgfgWooKWXcwSGwQd2Zi5Rb0bT14+8CJjJgI8AB+nndLaNgHGrcc6bPIB665g==", + "dev": true, + "dependencies": { + "pug-code-gen": "^3.0.3", + "pug-filters": "^4.0.0", + "pug-lexer": "^5.0.1", + "pug-linker": "^4.0.0", + "pug-load": "^3.0.0", + "pug-parser": "^6.0.0", + "pug-runtime": "^3.0.1", + "pug-strip-comments": "^2.0.0" + } + }, + "node_modules/pug-attrs": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pug-attrs/-/pug-attrs-3.0.0.tgz", + "integrity": "sha512-azINV9dUtzPMFQktvTXciNAfAuVh/L/JCl0vtPCwvOA21uZrC08K/UnmrL+SXGEVc1FwzjW62+xw5S/uaLj6cA==", + "dev": true, + "dependencies": { + "constantinople": "^4.0.1", + "js-stringify": "^1.0.2", + "pug-runtime": "^3.0.0" + } + }, + "node_modules/pug-code-gen": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/pug-code-gen/-/pug-code-gen-3.0.3.tgz", + "integrity": "sha512-cYQg0JW0w32Ux+XTeZnBEeuWrAY7/HNE6TWnhiHGnnRYlCgyAUPoyh9KzCMa9WhcJlJ1AtQqpEYHc+vbCzA+Aw==", + "dev": true, + "dependencies": { + "constantinople": "^4.0.1", + "doctypes": "^1.1.0", + "js-stringify": "^1.0.2", + "pug-attrs": "^3.0.0", + "pug-error": "^2.1.0", + "pug-runtime": "^3.0.1", + "void-elements": "^3.1.0", + "with": "^7.0.0" + } + }, + "node_modules/pug-error": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/pug-error/-/pug-error-2.1.0.tgz", + "integrity": "sha512-lv7sU9e5Jk8IeUheHata6/UThZ7RK2jnaaNztxfPYUY+VxZyk/ePVaNZ/vwmH8WqGvDz3LrNYt/+gA55NDg6Pg==", + "dev": true + }, + "node_modules/pug-filters": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/pug-filters/-/pug-filters-4.0.0.tgz", + "integrity": "sha512-yeNFtq5Yxmfz0f9z2rMXGw/8/4i1cCFecw/Q7+D0V2DdtII5UvqE12VaZ2AY7ri6o5RNXiweGH79OCq+2RQU4A==", + "dev": true, + "dependencies": { + "constantinople": "^4.0.1", + "jstransformer": "1.0.0", + "pug-error": "^2.0.0", + "pug-walk": "^2.0.0", + "resolve": "^1.15.1" + } + }, + "node_modules/pug-lexer": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/pug-lexer/-/pug-lexer-5.0.1.tgz", + "integrity": "sha512-0I6C62+keXlZPZkOJeVam9aBLVP2EnbeDw3An+k0/QlqdwH6rv8284nko14Na7c0TtqtogfWXcRoFE4O4Ff20w==", + "dev": true, + "dependencies": { + "character-parser": "^2.2.0", + "is-expression": "^4.0.0", + "pug-error": "^2.0.0" + } + }, + "node_modules/pug-linker": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/pug-linker/-/pug-linker-4.0.0.tgz", + "integrity": "sha512-gjD1yzp0yxbQqnzBAdlhbgoJL5qIFJw78juN1NpTLt/mfPJ5VgC4BvkoD3G23qKzJtIIXBbcCt6FioLSFLOHdw==", + "dev": true, + "dependencies": { + "pug-error": "^2.0.0", + "pug-walk": "^2.0.0" + } + }, + "node_modules/pug-load": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pug-load/-/pug-load-3.0.0.tgz", + "integrity": "sha512-OCjTEnhLWZBvS4zni/WUMjH2YSUosnsmjGBB1An7CsKQarYSWQ0GCVyd4eQPMFJqZ8w9xgs01QdiZXKVjk92EQ==", + "dev": true, + "dependencies": { + "object-assign": "^4.1.1", + "pug-walk": "^2.0.0" + } + }, + "node_modules/pug-parser": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/pug-parser/-/pug-parser-6.0.0.tgz", + "integrity": "sha512-ukiYM/9cH6Cml+AOl5kETtM9NR3WulyVP2y4HOU45DyMim1IeP/OOiyEWRr6qk5I5klpsBnbuHpwKmTx6WURnw==", + "dev": true, + "dependencies": { + "pug-error": "^2.0.0", + "token-stream": "1.0.0" + } + }, + "node_modules/pug-runtime": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/pug-runtime/-/pug-runtime-3.0.1.tgz", + "integrity": "sha512-L50zbvrQ35TkpHwv0G6aLSuueDRwc/97XdY8kL3tOT0FmhgG7UypU3VztfV/LATAvmUfYi4wNxSajhSAeNN+Kg==", + "dev": true + }, + "node_modules/pug-strip-comments": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pug-strip-comments/-/pug-strip-comments-2.0.0.tgz", + "integrity": "sha512-zo8DsDpH7eTkPHCXFeAk1xZXJbyoTfdPlNR0bK7rpOMuhBYb0f5qUVCO1xlsitYd3w5FQTK7zpNVKb3rZoUrrQ==", + "dev": true, + "dependencies": { + "pug-error": "^2.0.0" + } + }, + "node_modules/pug-walk": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pug-walk/-/pug-walk-2.0.0.tgz", + "integrity": "sha512-yYELe9Q5q9IQhuvqsZNwA5hfPkMJ8u92bQLIMcsMxf/VADjNtEYptU+inlufAFYcWdHlwNfZOEnOOQrZrcyJCQ==", + "dev": true + }, + "node_modules/pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/pumpify": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", + "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", + "dev": true, + "dependencies": { + "duplexify": "^3.6.0", + "inherits": "^2.0.3", + "pump": "^2.0.0" + } + }, + "node_modules/pumpify/node_modules/pump": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", + "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", + "dev": true, + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/puppeteer": { + "version": "22.10.0", + "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-22.10.0.tgz", + "integrity": "sha512-ZOkZd6a6t0BdKcWb0wAYHWQqCfdlN1PPnXOmg/XNrbo6gJhYWFX4qCNb6ahSn8TpAqBqLCoD4Q010F7GwOM7mA==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "@puppeteer/browsers": "2.2.3", + "cosmiconfig": "9.0.0", + "devtools-protocol": "0.0.1286932", + "puppeteer-core": "22.10.0" + }, + "bin": { + "puppeteer": "lib/esm/puppeteer/node/cli.js" + }, + "engines": { + "node": ">=18" } }, "node_modules/puppeteer-core": { @@ -18705,1035 +19868,1821 @@ "integrity": "sha512-I54J4Vy4I07UHsgB1QSmuFoF7KNQjJWcvFBPhtY+ezMdBfwgGDr8dzYrJa11aPgP9kxIUHjhktcMmmfJkOAtTw==", "dev": true, "dependencies": { - "@puppeteer/browsers": "2.2.3", - "chromium-bidi": "0.5.19", - "debug": "4.3.4", - "devtools-protocol": "0.0.1286932", - "ws": "8.17.0" + "@puppeteer/browsers": "2.2.3", + "chromium-bidi": "0.5.19", + "debug": "4.3.4", + "devtools-protocol": "0.0.1286932", + "ws": "8.17.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/puppeteer/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/puppeteer/node_modules/cosmiconfig": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz", + "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==", + "dev": true, + "dependencies": { + "env-paths": "^2.2.1", + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/puppeteer/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/pure-rand": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.1.0.tgz", + "integrity": "sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/dubzzz" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fast-check" + } + ] + }, + "node_modules/q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==", + "dev": true, + "engines": { + "node": ">=0.6.0", + "teleport": ">=0.2.0" + } + }, + "node_modules/qs": { + "version": "6.12.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.12.1.tgz", + "integrity": "sha512-zWmv4RSuB9r2mYQw3zxQuHWeU+42aKi1wWig/j4ele4ygELZ7PEO6MM7rim9oAQH2A5MWfsAVf/jPvTPgCbvUQ==", + "dev": true, + "dependencies": { + "side-channel": "^1.0.6" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", + "dev": true + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/queue-tick": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/queue-tick/-/queue-tick-1.0.1.tgz", + "integrity": "sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==", + "dev": true + }, + "node_modules/quick-lru": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", + "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/randomatic": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.1.1.tgz", + "integrity": "sha512-TuDE5KxZ0J461RVjrJZCJc+J+zCkTb1MbH9AQUq68sMhOMcy9jLcb3BrZKgp9q9Ncltdg4QVqWrH02W2EFFVYw==", + "dev": true, + "dependencies": { + "is-number": "^4.0.0", + "kind-of": "^6.0.0", + "math-random": "^1.0.1" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/randomatic/node_modules/is-number": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", + "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/randomatic/node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-1.1.7.tgz", + "integrity": "sha512-WmJJU2e9Y6M5UzTOkHaM7xJGAPQD8PNzx3bAd2+uhZAim6wDk6dAZxPVYLF67XhbR4hmKGh33Lpmh4XWrCH5Mg==", + "dev": true, + "dependencies": { + "bytes": "1", + "string_decoder": "0.10" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/raw-body/node_modules/string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==", + "dev": true + }, + "node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "dev": true + }, + "node_modules/read-pkg": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-8.1.0.tgz", + "integrity": "sha512-PORM8AgzXeskHO/WEv312k9U03B8K9JSiWF/8N9sUuFjBa+9SF2u6K7VClzXwDXab51jCd8Nd36CNM+zR97ScQ==", + "dev": true, + "dependencies": { + "@types/normalize-package-data": "^2.4.1", + "normalize-package-data": "^6.0.0", + "parse-json": "^7.0.0", + "type-fest": "^4.2.0" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-pkg-up": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-10.1.0.tgz", + "integrity": "sha512-aNtBq4jR8NawpKJQldrQcSW9y/d+KWH4v24HWkHljOZ7H0av+YTGANBzRh9A5pw7v/bLVsLVPpOhJ7gHNVy8lA==", + "dev": true, + "dependencies": { + "find-up": "^6.3.0", + "read-pkg": "^8.1.0", + "type-fest": "^4.2.0" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-pkg-up/node_modules/find-up": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz", + "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==", + "dev": true, + "dependencies": { + "locate-path": "^7.1.0", + "path-exists": "^5.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-pkg-up/node_modules/locate-path": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", + "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==", + "dev": true, + "dependencies": { + "p-locate": "^6.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-pkg-up/node_modules/p-limit": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", + "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^1.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-pkg-up/node_modules/p-locate": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", + "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", + "dev": true, + "dependencies": { + "p-limit": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-pkg-up/node_modules/path-exists": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", + "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, + "node_modules/read-pkg-up/node_modules/type-fest": { + "version": "4.18.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.18.2.tgz", + "integrity": "sha512-+suCYpfJLAe4OXS6+PPXjW3urOS4IoP9waSiLuXfLgqZODKw/aWwASvzqE886wA0kQgGy0mIWyhd87VpqIy6Xg==", + "dev": true, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-pkg-up/node_modules/yocto-queue": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", + "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", + "dev": true, + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-pkg/node_modules/json-parse-even-better-errors": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.2.tgz", + "integrity": "sha512-fi0NG4bPjCHunUJffmLd0gxssIgkNmArMvis4iNah6Owg1MCJjWhEcDLmsK6iGkJq3tHwbDkTlce70/tmXN4cQ==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/read-pkg/node_modules/lines-and-columns": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-2.0.4.tgz", + "integrity": "sha512-wM1+Z03eypVAVUCE7QdSqpVIvelbOakn1M0bPDoA4SGWPx3sNDVUiMo3L6To6WWGClB7VyXnhQ4Sn7gxiJbE6A==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, + "node_modules/read-pkg/node_modules/parse-json": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-7.1.1.tgz", + "integrity": "sha512-SgOTCX/EZXtZxBE5eJ97P4yGM5n37BwRU+YMsH4vNzFqJV/oWFXXCmwFlgWUM4PrakybVOueJJ6pwHqSVhTFDw==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.21.4", + "error-ex": "^1.3.2", + "json-parse-even-better-errors": "^3.0.0", + "lines-and-columns": "^2.0.3", + "type-fest": "^3.8.0" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-pkg/node_modules/parse-json/node_modules/type-fest": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-3.13.1.tgz", + "integrity": "sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==", + "dev": true, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-pkg/node_modules/type-fest": { + "version": "4.18.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.18.2.tgz", + "integrity": "sha512-+suCYpfJLAe4OXS6+PPXjW3urOS4IoP9waSiLuXfLgqZODKw/aWwASvzqE886wA0kQgGy0mIWyhd87VpqIy6Xg==", + "dev": true, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/readdirp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/readdirp/node_modules/arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readdirp/node_modules/define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "dependencies": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readdirp/node_modules/extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", + "dev": true, + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readdirp/node_modules/is-descriptor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.3.tgz", + "integrity": "sha512-JCNNGbwWZEVaSPtS45mdtrneRWJFp07LLmykxeFV5F6oBvNF8vHSfJuJgoT472pSfk+Mf8VnlrspaFBHWM8JAw==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "^1.0.1", + "is-data-descriptor": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/readdirp/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readdirp/node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readdirp/node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readdirp/node_modules/micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "dependencies": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" }, "engines": { - "node": ">=18" + "node": ">=0.10.0" } }, - "node_modules/puppeteer/node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true + "node_modules/rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", + "dev": true, + "dependencies": { + "resolve": "^1.1.6" + }, + "engines": { + "node": ">= 0.10" + } }, - "node_modules/puppeteer/node_modules/cosmiconfig": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz", - "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==", + "node_modules/redent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", + "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", "dev": true, "dependencies": { - "env-paths": "^2.2.1", - "import-fresh": "^3.3.0", - "js-yaml": "^4.1.0", - "parse-json": "^5.2.0" + "indent-string": "^4.0.0", + "strip-indent": "^3.0.0" }, "engines": { - "node": ">=14" + "node": ">=8" + } + }, + "node_modules/regenerate": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", + "dev": true + }, + "node_modules/regenerate-unicode-properties": { + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.1.tgz", + "integrity": "sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q==", + "dev": true, + "dependencies": { + "regenerate": "^1.4.2" }, - "funding": { - "url": "https://github.com/sponsors/d-fischer" + "engines": { + "node": ">=4" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", + "dev": true + }, + "node_modules/regenerator-transform": { + "version": "0.15.2", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz", + "integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.8.4" + } + }, + "node_modules/regex-cache": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", + "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", + "dev": true, + "dependencies": { + "is-equal-shallow": "^0.1.3" }, - "peerDependencies": { - "typescript": ">=4.9.5" + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "dev": true, + "dependencies": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "engines": { + "node": ">=0.10.0" } }, - "node_modules/puppeteer/node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "node_modules/regex-not/node_modules/extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", "dev": true, "dependencies": { - "argparse": "^2.0.1" + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" }, - "bin": { - "js-yaml": "bin/js-yaml.js" + "engines": { + "node": ">=0.10.0" } }, - "node_modules/pure-rand": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.1.0.tgz", - "integrity": "sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==", + "node_modules/regex-not/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/dubzzz" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/fast-check" - } - ] + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } }, - "node_modules/q": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", - "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==", + "node_modules/regex-not/node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", "dev": true, + "dependencies": { + "isobject": "^3.0.1" + }, "engines": { - "node": ">=0.6.0", - "teleport": ">=0.2.0" + "node": ">=0.10.0" } }, - "node_modules/qs": { - "version": "6.12.1", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.12.1.tgz", - "integrity": "sha512-zWmv4RSuB9r2mYQw3zxQuHWeU+42aKi1wWig/j4ele4ygELZ7PEO6MM7rim9oAQH2A5MWfsAVf/jPvTPgCbvUQ==", + "node_modules/regexp.prototype.flags": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz", + "integrity": "sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==", "dev": true, "dependencies": { - "side-channel": "^1.0.6" + "call-bind": "^1.0.6", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "set-function-name": "^2.0.1" }, "engines": { - "node": ">=0.6" + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/querystringify": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", - "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", - "dev": true + "node_modules/regexpp": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", + "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==", + "dev": true, + "engines": { + "node": ">=6.5.0" + } }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "node_modules/regexpu-core": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz", + "integrity": "sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==", "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] + "dependencies": { + "@babel/regjsgen": "^0.8.0", + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^10.1.0", + "regjsparser": "^0.9.1", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.1.0" + }, + "engines": { + "node": ">=4" + } }, - "node_modules/queue-tick": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/queue-tick/-/queue-tick-1.0.1.tgz", - "integrity": "sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==", - "dev": true + "node_modules/regjsparser": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", + "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", + "dev": true, + "dependencies": { + "jsesc": "~0.5.0" + }, + "bin": { + "regjsparser": "bin/parser" + } }, - "node_modules/quick-lru": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", - "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==", + "node_modules/regjsparser/node_modules/jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", "dev": true, - "engines": { - "node": ">=8" + "bin": { + "jsesc": "bin/jsesc" } }, - "node_modules/randomatic": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.1.1.tgz", - "integrity": "sha512-TuDE5KxZ0J461RVjrJZCJc+J+zCkTb1MbH9AQUq68sMhOMcy9jLcb3BrZKgp9q9Ncltdg4QVqWrH02W2EFFVYw==", + "node_modules/remove-bom-buffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/remove-bom-buffer/-/remove-bom-buffer-3.0.0.tgz", + "integrity": "sha512-8v2rWhaakv18qcvNeli2mZ/TMTL2nEyAKRvzo1WtnZBl15SHyEhrCu2/xKlJyUFKHiHgfXIyuY6g2dObJJycXQ==", "dev": true, "dependencies": { - "is-number": "^4.0.0", - "kind-of": "^6.0.0", - "math-random": "^1.0.1" + "is-buffer": "^1.1.5", + "is-utf8": "^0.2.1" }, "engines": { - "node": ">= 0.10.0" + "node": ">=0.10.0" } }, - "node_modules/randomatic/node_modules/is-number": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", - "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", + "node_modules/remove-bom-stream": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/remove-bom-stream/-/remove-bom-stream-1.2.0.tgz", + "integrity": "sha512-wigO8/O08XHb8YPzpDDT+QmRANfW6vLqxfaXm1YXhnFf3AkSLyjfG3GEFg4McZkmgL7KvCj5u2KczkvSP6NfHA==", "dev": true, + "dependencies": { + "remove-bom-buffer": "^3.0.0", + "safe-buffer": "^5.1.0", + "through2": "^2.0.3" + }, "engines": { - "node": ">=0.10.0" + "node": ">= 0.10" } }, - "node_modules/randomatic/node_modules/kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "node_modules/remove-bom-stream/node_modules/through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", "dev": true, - "engines": { - "node": ">=0.10.0" + "dependencies": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" } }, - "node_modules/randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "node_modules/remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==", + "dev": true + }, + "node_modules/repeat-element": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.4.tgz", + "integrity": "sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==", "dev": true, - "dependencies": { - "safe-buffer": "^5.1.0" + "engines": { + "node": ">=0.10.0" } }, - "node_modules/range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "node_modules/repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==", "dev": true, "engines": { - "node": ">= 0.6" + "node": ">=0.10" } }, - "node_modules/raw-body": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-1.1.7.tgz", - "integrity": "sha512-WmJJU2e9Y6M5UzTOkHaM7xJGAPQD8PNzx3bAd2+uhZAim6wDk6dAZxPVYLF67XhbR4hmKGh33Lpmh4XWrCH5Mg==", + "node_modules/repeating": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", + "integrity": "sha512-ZqtSMuVybkISo2OWvqvm7iHSWngvdaW3IpsT9/uP8v4gMi591LY6h35wdOfvQdWCKFWZWm2Y1Opp4kV7vQKT6A==", "dev": true, "dependencies": { - "bytes": "1", - "string_decoder": "0.10" + "is-finite": "^1.0.0" }, "engines": { - "node": ">= 0.8.0" + "node": ">=0.10.0" } }, - "node_modules/raw-body/node_modules/string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==", - "dev": true - }, - "node_modules/react-is": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", - "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", - "dev": true - }, - "node_modules/read-pkg": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-8.1.0.tgz", - "integrity": "sha512-PORM8AgzXeskHO/WEv312k9U03B8K9JSiWF/8N9sUuFjBa+9SF2u6K7VClzXwDXab51jCd8Nd36CNM+zR97ScQ==", + "node_modules/replace-ext": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-2.0.0.tgz", + "integrity": "sha512-UszKE5KVK6JvyD92nzMn9cDapSk6w/CaFZ96CnmDMUqH9oowfxF/ZjRITD25H4DnOQClLA4/j7jLGXXLVKxAug==", "dev": true, - "dependencies": { - "@types/normalize-package-data": "^2.4.1", - "normalize-package-data": "^6.0.0", - "parse-json": "^7.0.0", - "type-fest": "^4.2.0" - }, "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 10" } }, - "node_modules/read-pkg-up": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-10.1.0.tgz", - "integrity": "sha512-aNtBq4jR8NawpKJQldrQcSW9y/d+KWH4v24HWkHljOZ7H0av+YTGANBzRh9A5pw7v/bLVsLVPpOhJ7gHNVy8lA==", + "node_modules/replace-homedir": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/replace-homedir/-/replace-homedir-1.0.0.tgz", + "integrity": "sha512-CHPV/GAglbIB1tnQgaiysb8H2yCy8WQ7lcEwQ/eT+kLj0QHV8LnJW0zpqpE7RSkrMSRoa+EBoag86clf7WAgSg==", "dev": true, "dependencies": { - "find-up": "^6.3.0", - "read-pkg": "^8.1.0", - "type-fest": "^4.2.0" + "homedir-polyfill": "^1.0.1", + "is-absolute": "^1.0.0", + "remove-trailing-separator": "^1.1.0" }, "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 0.10" } }, - "node_modules/read-pkg-up/node_modules/find-up": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz", - "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==", + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", "dev": true, - "dependencies": { - "locate-path": "^7.1.0", - "path-exists": "^5.0.0" - }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=0.10.0" } }, - "node_modules/read-pkg-up/node_modules/locate-path": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", - "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==", + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", "dev": true, - "dependencies": { - "p-locate": "^6.0.0" - }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=0.10.0" } }, - "node_modules/read-pkg-up/node_modules/p-limit": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", - "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", + "node_modules/require-main-filename": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha512-IqSUtOVP4ksd1C/ej5zeEh/BIP2ajqpn8c5x+q99gvcIG/Qf0cud5raVnE/Dwd0ua9TXYDoDc0RE5hBSdz22Ug==", + "dev": true + }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", + "dev": true + }, + "node_modules/resolve": { + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", "dev": true, "dependencies": { - "yocto-queue": "^1.0.0" + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "bin": { + "resolve": "bin/resolve" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/read-pkg-up/node_modules/p-locate": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", - "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", + "node_modules/resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", "dev": true, "dependencies": { - "p-limit": "^4.0.0" + "resolve-from": "^5.0.0" }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=8" } }, - "node_modules/read-pkg-up/node_modules/path-exists": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", - "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", + "node_modules/resolve-dir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", + "integrity": "sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg==", "dev": true, + "dependencies": { + "expand-tilde": "^2.0.0", + "global-modules": "^1.0.0" + }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": ">=0.10.0" } }, - "node_modules/read-pkg-up/node_modules/type-fest": { - "version": "4.18.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.18.2.tgz", - "integrity": "sha512-+suCYpfJLAe4OXS6+PPXjW3urOS4IoP9waSiLuXfLgqZODKw/aWwASvzqE886wA0kQgGy0mIWyhd87VpqIy6Xg==", + "node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "dev": true, "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=8" } }, - "node_modules/read-pkg-up/node_modules/yocto-queue": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", - "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", + "node_modules/resolve-global": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-global/-/resolve-global-1.0.0.tgz", + "integrity": "sha512-zFa12V4OLtT5XUX/Q4VLvTfBf+Ok0SPc1FNGM/z9ctUdiU618qwKpWnd0CHs3+RqROfyEg/DhuHbMWYqcgljEw==", "dev": true, - "engines": { - "node": ">=12.20" + "dependencies": { + "global-dirs": "^0.1.1" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": ">=8" } }, - "node_modules/read-pkg/node_modules/json-parse-even-better-errors": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.2.tgz", - "integrity": "sha512-fi0NG4bPjCHunUJffmLd0gxssIgkNmArMvis4iNah6Owg1MCJjWhEcDLmsK6iGkJq3tHwbDkTlce70/tmXN4cQ==", + "node_modules/resolve-options": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/resolve-options/-/resolve-options-1.1.0.tgz", + "integrity": "sha512-NYDgziiroVeDC29xq7bp/CacZERYsA9bXYd1ZmcJlF3BcrZv5pTb4NG7SjdyKDnXZ84aC4vo2u6sNKIA1LCu/A==", "dev": true, + "dependencies": { + "value-or-function": "^3.0.0" + }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": ">= 0.10" } }, - "node_modules/read-pkg/node_modules/lines-and-columns": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-2.0.4.tgz", - "integrity": "sha512-wM1+Z03eypVAVUCE7QdSqpVIvelbOakn1M0bPDoA4SGWPx3sNDVUiMo3L6To6WWGClB7VyXnhQ4Sn7gxiJbE6A==", + "node_modules/resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg==", + "deprecated": "https://github.com/lydell/resolve-url#deprecated", + "dev": true + }, + "node_modules/resolve.exports": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.2.tgz", + "integrity": "sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==", "dev": true, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": ">=10" } }, - "node_modules/read-pkg/node_modules/parse-json": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-7.1.1.tgz", - "integrity": "sha512-SgOTCX/EZXtZxBE5eJ97P4yGM5n37BwRU+YMsH4vNzFqJV/oWFXXCmwFlgWUM4PrakybVOueJJ6pwHqSVhTFDw==", + "node_modules/restore-cursor": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-4.0.0.tgz", + "integrity": "sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.21.4", - "error-ex": "^1.3.2", - "json-parse-even-better-errors": "^3.0.0", - "lines-and-columns": "^2.0.3", - "type-fest": "^3.8.0" + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" }, "engines": { - "node": ">=16" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/read-pkg/node_modules/parse-json/node_modules/type-fest": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-3.13.1.tgz", - "integrity": "sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==", + "node_modules/ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", "dev": true, "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=0.12" } }, - "node_modules/read-pkg/node_modules/type-fest": { - "version": "4.18.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.18.2.tgz", - "integrity": "sha512-+suCYpfJLAe4OXS6+PPXjW3urOS4IoP9waSiLuXfLgqZODKw/aWwASvzqE886wA0kQgGy0mIWyhd87VpqIy6Xg==", + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", "dev": true, "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "iojs": ">=1.0.0", + "node": ">=0.10.0" } }, - "node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "node_modules/rfdc": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.1.tgz", + "integrity": "sha512-r5a3l5HzYlIC68TpmYKlxWjmOP6wiPJ1vWv2HeLhNsRZMrCkxeqxiHlQ21oXmQ4F3SiryXBHhAD7JZqvOJjFmg==", + "dev": true + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", "dev": true, "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/readdirp": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", - "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "node_modules/rimraf/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "dev": true, "dependencies": { - "graceful-fs": "^4.1.11", - "micromatch": "^3.1.10", - "readable-stream": "^2.0.2" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" }, "engines": { - "node": ">=0.10" + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/readdirp/node_modules/arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA==", + "node_modules/rollup": { + "version": "3.29.4", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.29.4.tgz", + "integrity": "sha512-oWzmBZwvYrU0iJHtDmhsm662rC15FRXmcjCk1xD771dFDx5jJ02ufAQQTn0etB2emNk4J9EZg/yWKpsn9BWGRw==", "dev": true, + "bin": { + "rollup": "dist/bin/rollup" + }, "engines": { - "node": ">=0.10.0" + "node": ">=14.18.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" } }, - "node_modules/readdirp/node_modules/define-property": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "node_modules/rollup-plugin-postcss": { + "version": "4.0.2", + "resolved": "https://registry.npmmirror.com/rollup-plugin-postcss/-/rollup-plugin-postcss-4.0.2.tgz", + "integrity": "sha512-05EaY6zvZdmvPUDi3uCcAQoESDcYnv8ogJJQRp6V5kZ6J6P7uAVJlrTZcaaA20wTH527YTnKfkAoPxWI/jPp4w==", "dev": true, "dependencies": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" + "chalk": "^4.1.0", + "concat-with-sourcemaps": "^1.1.0", + "cssnano": "^5.0.1", + "import-cwd": "^3.0.0", + "p-queue": "^6.6.2", + "pify": "^5.0.0", + "postcss-load-config": "^3.0.0", + "postcss-modules": "^4.0.0", + "promise.series": "^0.2.0", + "resolve": "^1.19.0", + "rollup-pluginutils": "^2.8.2", + "safe-identifier": "^0.4.2", + "style-inject": "^0.3.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=10" + }, + "peerDependencies": { + "postcss": "8.x" } }, - "node_modules/readdirp/node_modules/extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", + "node_modules/rollup-plugin-postcss/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "dependencies": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" + "color-convert": "^2.0.1" }, "engines": { - "node": ">=0.10.0" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/readdirp/node_modules/is-descriptor": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.3.tgz", - "integrity": "sha512-JCNNGbwWZEVaSPtS45mdtrneRWJFp07LLmykxeFV5F6oBvNF8vHSfJuJgoT472pSfk+Mf8VnlrspaFBHWM8JAw==", + "node_modules/rollup-plugin-postcss/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "dependencies": { - "is-accessor-descriptor": "^1.0.1", - "is-data-descriptor": "^1.0.1" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { - "node": ">= 0.4" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/readdirp/node_modules/is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "node_modules/rollup-plugin-postcss/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "dependencies": { - "is-plain-object": "^2.0.4" + "color-name": "~1.1.4" }, "engines": { - "node": ">=0.10.0" + "node": ">=7.0.0" } }, - "node_modules/readdirp/node_modules/is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "node_modules/rollup-plugin-postcss/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/rollup-plugin-postcss/node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", "dev": true, - "dependencies": { - "isobject": "^3.0.1" - }, "engines": { - "node": ">=0.10.0" + "node": ">= 10" } }, - "node_modules/readdirp/node_modules/kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "node_modules/rollup-plugin-postcss/node_modules/css-declaration-sorter": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.4.1.tgz", + "integrity": "sha512-rtdthzxKuyq6IzqX6jEcIzQF/YqccluefyCYheovBOLhFT/drQA9zj/UbRAa9J7C0o6EG6u3E6g+vKkay7/k3g==", "dev": true, "engines": { - "node": ">=0.10.0" + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.0.9" } }, - "node_modules/readdirp/node_modules/micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "node_modules/rollup-plugin-postcss/node_modules/css-select": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", + "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", "dev": true, "dependencies": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" + "boolbase": "^1.0.0", + "css-what": "^6.0.1", + "domhandler": "^4.3.1", + "domutils": "^2.8.0", + "nth-check": "^2.0.1" }, - "engines": { - "node": ">=0.10.0" + "funding": { + "url": "https://github.com/sponsors/fb55" } }, - "node_modules/rechoir": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", - "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", + "node_modules/rollup-plugin-postcss/node_modules/css-tree": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", + "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", "dev": true, "dependencies": { - "resolve": "^1.1.6" + "mdn-data": "2.0.14", + "source-map": "^0.6.1" }, "engines": { - "node": ">= 0.10" + "node": ">=8.0.0" } }, - "node_modules/redent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", - "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", + "node_modules/rollup-plugin-postcss/node_modules/cssnano": { + "version": "5.1.15", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-5.1.15.tgz", + "integrity": "sha512-j+BKgDcLDQA+eDifLx0EO4XSA56b7uut3BQFH+wbSaSTuGLuiyTa/wbRYthUXX8LC9mLg+WWKe8h+qJuwTAbHw==", "dev": true, "dependencies": { - "indent-string": "^4.0.0", - "strip-indent": "^3.0.0" + "cssnano-preset-default": "^5.2.14", + "lilconfig": "^2.0.3", + "yaml": "^1.10.2" }, "engines": { - "node": ">=8" + "node": "^10 || ^12 || >=14.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/cssnano" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/rollup-plugin-postcss/node_modules/cssnano-preset-default": { + "version": "5.2.14", + "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.2.14.tgz", + "integrity": "sha512-t0SFesj/ZV2OTylqQVOrFgEh5uanxbO6ZAdeCrNsUQ6fVuXwYTxJPNAGvGTxHbD68ldIJNec7PyYZDBrfDQ+6A==", + "dev": true, + "dependencies": { + "css-declaration-sorter": "^6.3.1", + "cssnano-utils": "^3.1.0", + "postcss-calc": "^8.2.3", + "postcss-colormin": "^5.3.1", + "postcss-convert-values": "^5.1.3", + "postcss-discard-comments": "^5.1.2", + "postcss-discard-duplicates": "^5.1.0", + "postcss-discard-empty": "^5.1.1", + "postcss-discard-overridden": "^5.1.0", + "postcss-merge-longhand": "^5.1.7", + "postcss-merge-rules": "^5.1.4", + "postcss-minify-font-values": "^5.1.0", + "postcss-minify-gradients": "^5.1.1", + "postcss-minify-params": "^5.1.4", + "postcss-minify-selectors": "^5.2.1", + "postcss-normalize-charset": "^5.1.0", + "postcss-normalize-display-values": "^5.1.0", + "postcss-normalize-positions": "^5.1.1", + "postcss-normalize-repeat-style": "^5.1.1", + "postcss-normalize-string": "^5.1.0", + "postcss-normalize-timing-functions": "^5.1.0", + "postcss-normalize-unicode": "^5.1.1", + "postcss-normalize-url": "^5.1.0", + "postcss-normalize-whitespace": "^5.1.1", + "postcss-ordered-values": "^5.1.3", + "postcss-reduce-initial": "^5.1.2", + "postcss-reduce-transforms": "^5.1.0", + "postcss-svgo": "^5.1.0", + "postcss-unique-selectors": "^5.1.1" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" } }, - "node_modules/regenerate": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", - "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", - "dev": true + "node_modules/rollup-plugin-postcss/node_modules/cssnano-utils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-3.1.0.tgz", + "integrity": "sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA==", + "dev": true, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } }, - "node_modules/regenerate-unicode-properties": { - "version": "10.1.1", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.1.tgz", - "integrity": "sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q==", + "node_modules/rollup-plugin-postcss/node_modules/csso": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz", + "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==", "dev": true, "dependencies": { - "regenerate": "^1.4.2" + "css-tree": "^1.1.2" }, "engines": { - "node": ">=4" + "node": ">=8.0.0" } }, - "node_modules/regenerator-runtime": { - "version": "0.14.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", - "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", - "dev": true - }, - "node_modules/regenerator-transform": { - "version": "0.15.2", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz", - "integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==", + "node_modules/rollup-plugin-postcss/node_modules/dom-serializer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", "dev": true, "dependencies": { - "@babel/runtime": "^7.8.4" + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" } }, - "node_modules/regex-cache": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", - "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", + "node_modules/rollup-plugin-postcss/node_modules/domhandler": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", "dev": true, "dependencies": { - "is-equal-shallow": "^0.1.3" + "domelementtype": "^2.2.0" }, "engines": { - "node": ">=0.10.0" + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" } }, - "node_modules/regex-not": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", - "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "node_modules/rollup-plugin-postcss/node_modules/domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", "dev": true, "dependencies": { - "extend-shallow": "^3.0.2", - "safe-regex": "^1.1.0" + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/rollup-plugin-postcss/node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "dev": true, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/rollup-plugin-postcss/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/regex-not/node_modules/extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", + "node_modules/rollup-plugin-postcss/node_modules/mdn-data": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", + "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==", + "dev": true + }, + "node_modules/rollup-plugin-postcss/node_modules/pify": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-5.0.0.tgz", + "integrity": "sha512-eW/gHNMlxdSP6dmG6uJip6FXN0EQBwm2clYYd8Wul42Cwu/DK8HEftzsapcNdYe2MfLiIwZqsDk2RDEsTE79hA==", "dev": true, - "dependencies": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - }, "engines": { - "node": ">=0.10.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/regex-not/node_modules/is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "node_modules/rollup-plugin-postcss/node_modules/postcss-calc": { + "version": "8.2.4", + "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-8.2.4.tgz", + "integrity": "sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q==", "dev": true, "dependencies": { - "is-plain-object": "^2.0.4" + "postcss-selector-parser": "^6.0.9", + "postcss-value-parser": "^4.2.0" }, - "engines": { - "node": ">=0.10.0" + "peerDependencies": { + "postcss": "^8.2.2" } }, - "node_modules/regex-not/node_modules/is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "node_modules/rollup-plugin-postcss/node_modules/postcss-colormin": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-5.3.1.tgz", + "integrity": "sha512-UsWQG0AqTFQmpBegeLLc1+c3jIqBNB0zlDGRWR+dQ3pRKJL1oeMzyqmH3o2PIfn9MBdNrVPWhDbT769LxCTLJQ==", "dev": true, "dependencies": { - "isobject": "^3.0.1" + "browserslist": "^4.21.4", + "caniuse-api": "^3.0.0", + "colord": "^2.9.1", + "postcss-value-parser": "^4.2.0" }, "engines": { - "node": ">=0.10.0" + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" } }, - "node_modules/regexp.prototype.flags": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz", - "integrity": "sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==", + "node_modules/rollup-plugin-postcss/node_modules/postcss-convert-values": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-5.1.3.tgz", + "integrity": "sha512-82pC1xkJZtcJEfiLw6UXnXVXScgtBrjlO5CBmuDQc+dlb88ZYheFsjTn40+zBVi3DkfF7iezO0nJUPLcJK3pvA==", "dev": true, "dependencies": { - "call-bind": "^1.0.6", - "define-properties": "^1.2.1", - "es-errors": "^1.3.0", - "set-function-name": "^2.0.1" + "browserslist": "^4.21.4", + "postcss-value-parser": "^4.2.0" }, "engines": { - "node": ">= 0.4" + "node": "^10 || ^12 || >=14.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "peerDependencies": { + "postcss": "^8.2.15" } }, - "node_modules/regexpp": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", - "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==", + "node_modules/rollup-plugin-postcss/node_modules/postcss-discard-comments": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-5.1.2.tgz", + "integrity": "sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ==", "dev": true, "engines": { - "node": ">=6.5.0" + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" } }, - "node_modules/regexpu-core": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz", - "integrity": "sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==", + "node_modules/rollup-plugin-postcss/node_modules/postcss-discard-duplicates": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-5.1.0.tgz", + "integrity": "sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw==", "dev": true, - "dependencies": { - "@babel/regjsgen": "^0.8.0", - "regenerate": "^1.4.2", - "regenerate-unicode-properties": "^10.1.0", - "regjsparser": "^0.9.1", - "unicode-match-property-ecmascript": "^2.0.0", - "unicode-match-property-value-ecmascript": "^2.1.0" - }, "engines": { - "node": ">=4" + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" } }, - "node_modules/regjsparser": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", - "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", + "node_modules/rollup-plugin-postcss/node_modules/postcss-discard-empty": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-5.1.1.tgz", + "integrity": "sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A==", "dev": true, - "dependencies": { - "jsesc": "~0.5.0" + "engines": { + "node": "^10 || ^12 || >=14.0" }, - "bin": { - "regjsparser": "bin/parser" + "peerDependencies": { + "postcss": "^8.2.15" } }, - "node_modules/regjsparser/node_modules/jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", + "node_modules/rollup-plugin-postcss/node_modules/postcss-discard-overridden": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-5.1.0.tgz", + "integrity": "sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw==", "dev": true, - "bin": { - "jsesc": "bin/jsesc" + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" } }, - "node_modules/remove-bom-buffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/remove-bom-buffer/-/remove-bom-buffer-3.0.0.tgz", - "integrity": "sha512-8v2rWhaakv18qcvNeli2mZ/TMTL2nEyAKRvzo1WtnZBl15SHyEhrCu2/xKlJyUFKHiHgfXIyuY6g2dObJJycXQ==", + "node_modules/rollup-plugin-postcss/node_modules/postcss-merge-longhand": { + "version": "5.1.7", + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.1.7.tgz", + "integrity": "sha512-YCI9gZB+PLNskrK0BB3/2OzPnGhPkBEwmwhfYk1ilBHYVAZB7/tkTHFBAnCrvBBOmeYyMYw3DMjT55SyxMBzjQ==", "dev": true, "dependencies": { - "is-buffer": "^1.1.5", - "is-utf8": "^0.2.1" + "postcss-value-parser": "^4.2.0", + "stylehacks": "^5.1.1" }, "engines": { - "node": ">=0.10.0" + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" } }, - "node_modules/remove-bom-stream": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/remove-bom-stream/-/remove-bom-stream-1.2.0.tgz", - "integrity": "sha512-wigO8/O08XHb8YPzpDDT+QmRANfW6vLqxfaXm1YXhnFf3AkSLyjfG3GEFg4McZkmgL7KvCj5u2KczkvSP6NfHA==", + "node_modules/rollup-plugin-postcss/node_modules/postcss-merge-rules": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-5.1.4.tgz", + "integrity": "sha512-0R2IuYpgU93y9lhVbO/OylTtKMVcHb67zjWIfCiKR9rWL3GUk1677LAqD/BcHizukdZEjT8Ru3oHRoAYoJy44g==", "dev": true, "dependencies": { - "remove-bom-buffer": "^3.0.0", - "safe-buffer": "^5.1.0", - "through2": "^2.0.3" + "browserslist": "^4.21.4", + "caniuse-api": "^3.0.0", + "cssnano-utils": "^3.1.0", + "postcss-selector-parser": "^6.0.5" }, "engines": { - "node": ">= 0.10" + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" } }, - "node_modules/remove-bom-stream/node_modules/through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "node_modules/rollup-plugin-postcss/node_modules/postcss-minify-font-values": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-5.1.0.tgz", + "integrity": "sha512-el3mYTgx13ZAPPirSVsHqFzl+BBBDrXvbySvPGFnQcTI4iNslrPaFq4muTkLZmKlGk4gyFAYUBMH30+HurREyA==", "dev": true, "dependencies": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" } }, - "node_modules/remove-trailing-separator": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", - "integrity": "sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==", - "dev": true - }, - "node_modules/repeat-element": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.4.tgz", - "integrity": "sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==", + "node_modules/rollup-plugin-postcss/node_modules/postcss-minify-gradients": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-5.1.1.tgz", + "integrity": "sha512-VGvXMTpCEo4qHTNSa9A0a3D+dxGFZCYwR6Jokk+/3oB6flu2/PnPXAh2x7x52EkY5xlIHLm+Le8tJxe/7TNhzw==", "dev": true, + "dependencies": { + "colord": "^2.9.1", + "cssnano-utils": "^3.1.0", + "postcss-value-parser": "^4.2.0" + }, "engines": { - "node": ">=0.10.0" + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" } }, - "node_modules/repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==", + "node_modules/rollup-plugin-postcss/node_modules/postcss-minify-params": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-5.1.4.tgz", + "integrity": "sha512-+mePA3MgdmVmv6g+30rn57USjOGSAyuxUmkfiWpzalZ8aiBkdPYjXWtHuwJGm1v5Ojy0Z0LaSYhHaLJQB0P8Jw==", "dev": true, + "dependencies": { + "browserslist": "^4.21.4", + "cssnano-utils": "^3.1.0", + "postcss-value-parser": "^4.2.0" + }, "engines": { - "node": ">=0.10" + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" } }, - "node_modules/repeating": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", - "integrity": "sha512-ZqtSMuVybkISo2OWvqvm7iHSWngvdaW3IpsT9/uP8v4gMi591LY6h35wdOfvQdWCKFWZWm2Y1Opp4kV7vQKT6A==", + "node_modules/rollup-plugin-postcss/node_modules/postcss-minify-selectors": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-5.2.1.tgz", + "integrity": "sha512-nPJu7OjZJTsVUmPdm2TcaiohIwxP+v8ha9NehQ2ye9szv4orirRU3SDdtUmKH+10nzn0bAyOXZ0UEr7OpvLehg==", "dev": true, "dependencies": { - "is-finite": "^1.0.0" + "postcss-selector-parser": "^6.0.5" }, "engines": { - "node": ">=0.10.0" + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" } }, - "node_modules/replace-ext": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-2.0.0.tgz", - "integrity": "sha512-UszKE5KVK6JvyD92nzMn9cDapSk6w/CaFZ96CnmDMUqH9oowfxF/ZjRITD25H4DnOQClLA4/j7jLGXXLVKxAug==", + "node_modules/rollup-plugin-postcss/node_modules/postcss-normalize-charset": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-5.1.0.tgz", + "integrity": "sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg==", "dev": true, "engines": { - "node": ">= 10" + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" } }, - "node_modules/replace-homedir": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/replace-homedir/-/replace-homedir-1.0.0.tgz", - "integrity": "sha512-CHPV/GAglbIB1tnQgaiysb8H2yCy8WQ7lcEwQ/eT+kLj0QHV8LnJW0zpqpE7RSkrMSRoa+EBoag86clf7WAgSg==", + "node_modules/rollup-plugin-postcss/node_modules/postcss-normalize-display-values": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-5.1.0.tgz", + "integrity": "sha512-WP4KIM4o2dazQXWmFaqMmcvsKmhdINFblgSeRgn8BJ6vxaMyaJkwAzpPpuvSIoG/rmX3M+IrRZEz2H0glrQNEA==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/rollup-plugin-postcss/node_modules/postcss-normalize-positions": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-5.1.1.tgz", + "integrity": "sha512-6UpCb0G4eofTCQLFVuI3EVNZzBNPiIKcA1AKVka+31fTVySphr3VUgAIULBhxZkKgwLImhzMR2Bw1ORK+37INg==", "dev": true, "dependencies": { - "homedir-polyfill": "^1.0.1", - "is-absolute": "^1.0.0", - "remove-trailing-separator": "^1.1.0" + "postcss-value-parser": "^4.2.0" }, "engines": { - "node": ">= 0.10" + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" } }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "node_modules/rollup-plugin-postcss/node_modules/postcss-normalize-repeat-style": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.1.1.tgz", + "integrity": "sha512-mFpLspGWkQtBcWIRFLmewo8aC3ImN2i/J3v8YCFUwDnPu3Xz4rLohDO26lGjwNsQxB3YF0KKRwspGzE2JEuS0g==", "dev": true, + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, "engines": { - "node": ">=0.10.0" + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" } }, - "node_modules/require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "node_modules/rollup-plugin-postcss/node_modules/postcss-normalize-string": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-5.1.0.tgz", + "integrity": "sha512-oYiIJOf4T9T1N4i+abeIc7Vgm/xPCGih4bZz5Nm0/ARVJ7K6xrDlLwvwqOydvyL3RHNf8qZk6vo3aatiw/go3w==", "dev": true, + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, "engines": { - "node": ">=0.10.0" + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" } }, - "node_modules/require-main-filename": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", - "integrity": "sha512-IqSUtOVP4ksd1C/ej5zeEh/BIP2ajqpn8c5x+q99gvcIG/Qf0cud5raVnE/Dwd0ua9TXYDoDc0RE5hBSdz22Ug==", - "dev": true - }, - "node_modules/requires-port": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", - "dev": true - }, - "node_modules/resolve": { - "version": "1.22.8", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", - "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "node_modules/rollup-plugin-postcss/node_modules/postcss-normalize-timing-functions": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-5.1.0.tgz", + "integrity": "sha512-DOEkzJ4SAXv5xkHl0Wa9cZLF3WCBhF3o1SKVxKQAa+0pYKlueTpCgvkFAHfk+Y64ezX9+nITGrDZeVGgITJXjg==", "dev": true, "dependencies": { - "is-core-module": "^2.13.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" + "postcss-value-parser": "^4.2.0" }, - "bin": { - "resolve": "bin/resolve" + "engines": { + "node": "^10 || ^12 || >=14.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "peerDependencies": { + "postcss": "^8.2.15" } }, - "node_modules/resolve-cwd": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", - "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "node_modules/rollup-plugin-postcss/node_modules/postcss-normalize-unicode": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-5.1.1.tgz", + "integrity": "sha512-qnCL5jzkNUmKVhZoENp1mJiGNPcsJCs1aaRmURmeJGES23Z/ajaln+EPTD+rBeNkSryI+2WTdW+lwcVdOikrpA==", "dev": true, "dependencies": { - "resolve-from": "^5.0.0" + "browserslist": "^4.21.4", + "postcss-value-parser": "^4.2.0" }, "engines": { - "node": ">=8" + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" } }, - "node_modules/resolve-dir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", - "integrity": "sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg==", + "node_modules/rollup-plugin-postcss/node_modules/postcss-normalize-url": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-5.1.0.tgz", + "integrity": "sha512-5upGeDO+PVthOxSmds43ZeMeZfKH+/DKgGRD7TElkkyS46JXAUhMzIKiCa7BabPeIy3AQcTkXwVVN7DbqsiCew==", "dev": true, "dependencies": { - "expand-tilde": "^2.0.0", - "global-modules": "^1.0.0" + "normalize-url": "^6.0.1", + "postcss-value-parser": "^4.2.0" }, "engines": { - "node": ">=0.10.0" + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" } }, - "node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "node_modules/rollup-plugin-postcss/node_modules/postcss-normalize-whitespace": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-5.1.1.tgz", + "integrity": "sha512-83ZJ4t3NUDETIHTa3uEg6asWjSBYL5EdkVB0sDncx9ERzOKBVJIUeDO9RyA9Zwtig8El1d79HBp0JEi8wvGQnA==", "dev": true, + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, "engines": { - "node": ">=8" + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" } }, - "node_modules/resolve-global": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/resolve-global/-/resolve-global-1.0.0.tgz", - "integrity": "sha512-zFa12V4OLtT5XUX/Q4VLvTfBf+Ok0SPc1FNGM/z9ctUdiU618qwKpWnd0CHs3+RqROfyEg/DhuHbMWYqcgljEw==", + "node_modules/rollup-plugin-postcss/node_modules/postcss-ordered-values": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-5.1.3.tgz", + "integrity": "sha512-9UO79VUhPwEkzbb3RNpqqghc6lcYej1aveQteWY+4POIwlqkYE21HKWaLDF6lWNuqCobEAyTovVhtI32Rbv2RQ==", "dev": true, "dependencies": { - "global-dirs": "^0.1.1" + "cssnano-utils": "^3.1.0", + "postcss-value-parser": "^4.2.0" }, "engines": { - "node": ">=8" + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" } }, - "node_modules/resolve-options": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/resolve-options/-/resolve-options-1.1.0.tgz", - "integrity": "sha512-NYDgziiroVeDC29xq7bp/CacZERYsA9bXYd1ZmcJlF3BcrZv5pTb4NG7SjdyKDnXZ84aC4vo2u6sNKIA1LCu/A==", + "node_modules/rollup-plugin-postcss/node_modules/postcss-reduce-initial": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-5.1.2.tgz", + "integrity": "sha512-dE/y2XRaqAi6OvjzD22pjTUQ8eOfc6m/natGHgKFBK9DxFmIm69YmaRVQrGgFlEfc1HePIurY0TmDeROK05rIg==", "dev": true, "dependencies": { - "value-or-function": "^3.0.0" + "browserslist": "^4.21.4", + "caniuse-api": "^3.0.0" }, "engines": { - "node": ">= 0.10" + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" } }, - "node_modules/resolve-url": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", - "integrity": "sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg==", - "deprecated": "https://github.com/lydell/resolve-url#deprecated", - "dev": true - }, - "node_modules/resolve.exports": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.2.tgz", - "integrity": "sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==", + "node_modules/rollup-plugin-postcss/node_modules/postcss-reduce-transforms": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-5.1.0.tgz", + "integrity": "sha512-2fbdbmgir5AvpW9RLtdONx1QoYG2/EtqpNQbFASDlixBbAYuTcJ0dECwlqNqH7VbaUnEnh8SrxOe2sRIn24XyQ==", "dev": true, + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, "engines": { - "node": ">=10" + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" } }, - "node_modules/restore-cursor": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-4.0.0.tgz", - "integrity": "sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==", + "node_modules/rollup-plugin-postcss/node_modules/postcss-svgo": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-5.1.0.tgz", + "integrity": "sha512-D75KsH1zm5ZrHyxPakAxJWtkyXew5qwS70v56exwvw542d9CRtTo78K0WeFxZB4G7JXKKMbEZtZayTGdIky/eA==", "dev": true, "dependencies": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" + "postcss-value-parser": "^4.2.0", + "svgo": "^2.7.0" }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": "^10 || ^12 || >=14.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependencies": { + "postcss": "^8.2.15" } }, - "node_modules/ret": { - "version": "0.1.15", - "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", - "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", + "node_modules/rollup-plugin-postcss/node_modules/postcss-unique-selectors": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-5.1.1.tgz", + "integrity": "sha512-5JiODlELrz8L2HwxfPnhOWZYWDxVHWL83ufOv84NrcgipI7TaeRsatAhK4Tr2/ZiYldpK/wBvw5BD3qfaK96GA==", "dev": true, + "dependencies": { + "postcss-selector-parser": "^6.0.5" + }, "engines": { - "node": ">=0.12" + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" } }, - "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "node_modules/rollup-plugin-postcss/node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true + }, + "node_modules/rollup-plugin-postcss/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, "engines": { - "iojs": ">=1.0.0", "node": ">=0.10.0" } }, - "node_modules/rfdc": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.1.tgz", - "integrity": "sha512-r5a3l5HzYlIC68TpmYKlxWjmOP6wiPJ1vWv2HeLhNsRZMrCkxeqxiHlQ21oXmQ4F3SiryXBHhAD7JZqvOJjFmg==", - "dev": true - }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "node_modules/rollup-plugin-postcss/node_modules/stylehacks": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-5.1.1.tgz", + "integrity": "sha512-sBpcd5Hx7G6seo7b1LkpttvTz7ikD0LlH5RmdcBNb6fFR0Fl7LQwHDFr300q4cwUqi+IYrFGmsIHieMBfnN/Bw==", "dev": true, "dependencies": { - "glob": "^7.1.3" + "browserslist": "^4.21.4", + "postcss-selector-parser": "^6.0.4" }, - "bin": { - "rimraf": "bin.js" + "engines": { + "node": "^10 || ^12 || >=14.0" }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "peerDependencies": { + "postcss": "^8.2.15" } }, - "node_modules/rimraf/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "node_modules/rollup-plugin-postcss/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "has-flag": "^4.0.0" }, "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": ">=8" } }, - "node_modules/rollup": { - "version": "3.29.4", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.29.4.tgz", - "integrity": "sha512-oWzmBZwvYrU0iJHtDmhsm662rC15FRXmcjCk1xD771dFDx5jJ02ufAQQTn0etB2emNk4J9EZg/yWKpsn9BWGRw==", + "node_modules/rollup-plugin-postcss/node_modules/svgo": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-2.8.0.tgz", + "integrity": "sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==", "dev": true, + "dependencies": { + "@trysound/sax": "0.2.0", + "commander": "^7.2.0", + "css-select": "^4.1.3", + "css-tree": "^1.1.3", + "csso": "^4.2.0", + "picocolors": "^1.0.0", + "stable": "^0.1.8" + }, "bin": { - "rollup": "dist/bin/rollup" + "svgo": "bin/svgo" }, "engines": { - "node": ">=14.18.0", - "npm": ">=8.0.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" + "node": ">=10.13.0" + } + }, + "node_modules/rollup-plugin-postcss/node_modules/yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/rollup-pluginutils": { + "version": "2.8.2", + "resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-2.8.2.tgz", + "integrity": "sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==", + "dev": true, + "dependencies": { + "estree-walker": "^0.6.1" } }, + "node_modules/rollup-pluginutils/node_modules/estree-walker": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.6.1.tgz", + "integrity": "sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==", + "dev": true + }, "node_modules/rollup/node_modules/fsevents": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", @@ -19828,6 +21777,12 @@ "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", "dev": true }, + "node_modules/safe-identifier": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/safe-identifier/-/safe-identifier-0.4.2.tgz", + "integrity": "sha512-6pNbSMW6OhAi9j+N8V+U715yBQsaWJ7eyEUaOrawX+isg5ZxhUlV1NipNtgaKHmFGiABwt+ZF04Ii+3Xjkg+8w==", + "dev": true + }, "node_modules/safe-json-parse": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/safe-json-parse/-/safe-json-parse-1.0.1.tgz", @@ -20474,6 +22429,15 @@ "node": ">=0.8.0" } }, + "node_modules/source-map-js": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", + "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/source-map-resolve": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.6.0.tgz", @@ -20628,6 +22592,13 @@ "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", "dev": true }, + "node_modules/stable": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", + "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", + "deprecated": "Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility", + "dev": true + }, "node_modules/stack-trace": { "version": "0.0.10", "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", @@ -20723,6 +22694,12 @@ "node": ">=0.6.19" } }, + "node_modules/string-hash": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/string-hash/-/string-hash-1.1.3.tgz", + "integrity": "sha512-kJUvRUFK49aub+a7T1nNE66EJbZBMnBgoC1UbCZ5n6bsZKBRga4KgBRTMn/pFkeCZSYtNeSyMxPDM0AXWELk2A==", + "dev": true + }, "node_modules/string-length": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", @@ -20923,6 +22900,28 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/style-inject": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/style-inject/-/style-inject-0.3.0.tgz", + "integrity": "sha512-IezA2qp+vcdlhJaVm5SOdPPTUu0FCEqfNSli2vRuSIBbu5Nq5UvygTk/VzeCqfLz2Atj3dVII5QBKGZRZ0edzw==", + "dev": true + }, + "node_modules/stylehacks": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-7.0.3.tgz", + "integrity": "sha512-4DqtecvI/Nd+2BCvW9YEF6lhBN5UM50IJ1R3rnEAhBwbCKf4VehRf+uqvnVArnBayjYD/WtT3g0G/HSRxWfTRg==", + "dev": true, + "dependencies": { + "browserslist": "^4.23.3", + "postcss-selector-parser": "^6.1.1" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, "node_modules/supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", @@ -20957,6 +22956,40 @@ "es6-symbol": "^3.1.1" } }, + "node_modules/svgo": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-3.3.2.tgz", + "integrity": "sha512-OoohrmuUlBs8B8o6MB2Aevn+pRIH9zDALSR+6hhqVfa6fRwG/Qw9VUMSMW9VNg2CFc/MTIfabtdOVl9ODIJjpw==", + "dev": true, + "dependencies": { + "@trysound/sax": "0.2.0", + "commander": "^7.2.0", + "css-select": "^5.1.0", + "css-tree": "^2.3.1", + "css-what": "^6.1.0", + "csso": "^5.0.5", + "picocolors": "^1.0.0" + }, + "bin": { + "svgo": "bin/svgo" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/svgo" + } + }, + "node_modules/svgo/node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "dev": true, + "engines": { + "node": ">= 10" + } + }, "node_modules/symbol-tree": { "version": "3.2.4", "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", @@ -22020,9 +24053,9 @@ } }, "node_modules/update-browserslist-db": { - "version": "1.0.16", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.16.tgz", - "integrity": "sha512-KVbTxlBYlckhF5wgfyZXTWnMn7MMZjMu9XG8bPlliUOP9ThaF4QnhP8qrjrH7DRzHfSk0oQv1wToW+iA5GajEQ==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz", + "integrity": "sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==", "dev": true, "funding": [ { diff --git a/package.json b/package.json index e5cbd725..8abe80bf 100644 --- a/package.json +++ b/package.json @@ -6,16 +6,9 @@ "scripts": { "start": "gulp start && gulp watch", "changelog": "conventional-changelog -p angular -i CHANGELOG.md -s", - "build:lib:style": "gulp buildLibStyles", - "build:lib:script": "rollup -c build/rollup.config.lib.js --bundleConfigAsCjs", - "build:lib": "npm run build:lib:script && npm run build:lib:style", - "build:api:docs": "gulp buildApi", - "build:api:examples": "gulp buildExamples", - "build:api:style": "gulp buildApiStyle", + "build:lib": "rollup -c build/rollup.config.lib.js --bundleConfigAsCjs", "build:api:script": "rollup -c build/rollup.config.api.js --bundleConfigAsCjs", "build:api": "gulp build", - "build:script": "npm run build:lib:script && npm run build:api:script", - "build:style": "npm run build:lib:style && npm run build:api:style", "build": "npm run build:lib && npm run build:api", "lint": "eslint \"./**/**/*.js\"", "lint:fix": "eslint \"./**/**/*.js\" --cache --fix", @@ -50,6 +43,7 @@ "@commitlint/cli": "^17.4.4", "@commitlint/config-angular": "^19.0.3", "@commitlint/config-conventional": "^17.4.4", + "@rollup/plugin-alias": "^5.1.0", "@rollup/plugin-babel": "^6.0.4", "@rollup/plugin-commonjs": "^25.0.2", "@rollup/plugin-node-resolve": "^15.1.0", @@ -62,6 +56,7 @@ "commitlint": "^17.4.4", "conventional-changelog": "^5.1.0", "conventional-changelog-cli": "^2.2.2", + "cssnano": "^7.0.5", "eslint": "^8.34.0", "eslint-config-prettier": "^8.6.0", "eslint-import-resolver-jest": "^3.0.2", @@ -86,12 +81,14 @@ "jest": "^29.5.0", "jest-environment-jsdom": "^29.6.1", "jest-html-reporter": "^3.7.0", + "less": "^4.2.0", "less-plugin-autoprefix": "^2.0.0", "lint-staged": "^13.1.2", "os": "^0.1.2", "prettier": "^2.8.4", "puppeteer": "^22.6.1", - "rollup": "^3.26.0" + "rollup": "^3.26.0", + "rollup-plugin-postcss": "^4.0.2" }, "gitHooks": { "pre-commit": "lint-staged", diff --git a/reader.min.js b/reader.min.js deleted file mode 100644 index 3d7c9a28..00000000 --- a/reader.min.js +++ /dev/null @@ -1,2 +0,0 @@ -!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(t="undefined"!=typeof globalThis?globalThis:t||self).Reader=e()}(this,(function(){"use strict";function t(t,e){(null==e||e>t.length)&&(e=t.length);for(var s=0,i=Array(e);sObject.prototype.toString.apply(t),o=t=>"function"==typeof t||"[object Function]"===n(t),l=t=>("[object Object]"===n(t)||"object"==typeof t||o(t))&&null!==t,a=t=>Array.isArray?Array.isArray(t):"[object Array]"===n(t),h=t=>{let e={};return null===t?null:(a(t)?e=Array.from(t):(e=Object.assign({},t),Object.keys(e).forEach((s=>e[s]=l(t[s])?h(t[s]):t[s]))),e)},c=(t,e=300)=>!!o(t)&&setTimeout((()=>{t()}),e),u=t=>"string"==typeof t,d=t=>!!(l(t)&&t.nodeName&&t.tagName&&1===t.nodeType),m=t=>{return!(!l(t)||!(d(t)||(t=>!(!l(t)||"[object NodeList]"!==n(t)))(t)||(e=t,l(e)&&"[object DocumentFragment]"===n(e))||(t=>!(!l(t)||!("[object Text]"===n(t)||t.tagName&&3===t.nodeType)))(t)));var e},p=(t,e)=>{const s=Object.prototype.hasOwnProperty;return t&&s.call(t,e)},f=(t,e)=>{const s=new RegExp("(\\s|^)"+e+"(\\s|$)");let i,r;return!!d(t)&&(i=t.className,!!i&&(r=t.classList,r&&r.contains?t.classList.contains(e):!!s.exec(i)))},b=(t,e)=>{var s;let i,r;if(f(t,e))return!1;i=t.classList,null!==(s=i)&&void 0!==s&&s.add?e.indexOf(" ")>-1?e.split(" ").forEach((t=>{i.add(t)})):i.add(e):(r=t.className,r+=r.length>0?" "+e:e,t.className=r)},g=(t,e,s)=>{let i=t.tagName.toLowerCase();switch(e){case"style":t.style.cssText=s;break;case"value":"input"===i||"textarea"===i?t.value=s:t.setAttribute(e,s);break;case"htmlFor":t.setAttribute("for",s);break;case"className":b(t,s);break;case"innerHTML":t.innerHTML=s;break;case"innerText":t.innerText=s;break;default:t.setAttribute(e,s)}},y=(t,e)=>{if(!t||!l(e))return!1;Object.keys(e).forEach((s=>{const i=e[s];p(e,s)&&g(t,s,i)}))},v=(t,e,s)=>{const i=document.createDocumentFragment(),r=document.createElement(t),n=t=>m(t)||u(t),o=t=>{let e;if(!n(t))return!1;m(t)?e=t:u(t)&&(e=document.createTextNode(t)),i.appendChild(e)};return l(e)?y(r,e):a(e)&&e.every((t=>n(t)))?e.forEach((t=>{o(t)})):m(e)?o(e):u(e)&&o(document.createTextNode(e)),a(s)?s.forEach((t=>{o(t)})):o(s),r.appendChild(i),r},$=(t,e)=>{var s;let i,r=t.className;if(!r||!f(t,e))return!1;var n;i=t.classList,null!==(s=i)&&void 0!==s&&s.remove?i.remove(e):(n=r.replace(e,""),r=!!u(n)&&n.replace(/(^\s+)|(\s+$)/g,""),t.className=r)},_=["focusout","blur","focusin","focus","load","unload","mouseenter","mouseleave"],x=(t,e,s)=>{const i=_.indexOf(e)>-1;s._delegateListener&&delete(s=s._delegateListener)._delegateListener,function(t,e,s){const i=t._listeners;let r=-1;if(i.length<1)return!1;i.forEach(((t,i)=>{const n=t.fn;e===t.type&&(r=i,n===s&&(r=i))})),r>-1&&i.splice(r,1)}(t,e,s),t.removeEventListener(e,s,i)},z=function(t,e,s=!1){const i=u(t)?document.querySelector(t):t,r=i.childNodes,n=((t,e)=>{let s=t._listeners||[];return u(e)&&e&&(s=s.filter((t=>t.type===e))),s})(i,e);n.forEach((t=>{x(i,t.type,t.fn)})),(s||!0===e||1===arguments.length)&&i&&r&&r.forEach((t=>{d(t)&&z(t,e,s)}))},w=(t,e,s)=>{if(!o(s))return z(t,e),!1;x(t,e,s)},M=(t,e)=>{Object.keys(e).forEach((s=>{p(e,s)&&(t[s]=e[s])}))},S={},L=t=>p(S,t)&&S[t].length>0,T=(t,e=!0)=>e?L(t):(t=>{let e=L(t),s=t.lastIndexOf(".");for(;!e&&-1!==s;)s=(t=t.substring(0,s)).lastIndexOf("."),e=L(t);return e})(t),E=(t,e,s=!0)=>{const i=t=>{if(!L(t))return!1;S[t].forEach((t=>{const s=["[object Int8Array]","[object Uint8Array]","[object Uint8ClampedArray]","[object Int16Array]","[object Uint16Array]","[object Int32Array]","[object Uint32Array]","[object Float32Array]","[object Float64Array]","[object BigInt64Array]","[object BigUint64Array]"].indexOf(n(e))>-1?e.toString():e;t.callback.call(t.context||t,s)}))},r=()=>{let e=t,s=t.lastIndexOf(".");for(;-1!==s;)e=e.substring(0,s),s=e.lastIndexOf("."),i(e);i(t),i("*")};if(!T(t))return!1;s?setTimeout(r,10):r()},C=(()=>{let t=0;return e=>(t+=1,e?e+"-"+t:"guid-"+t)})(),j=t=>{if(!p(S,t))return!1;delete S[t]},A=(t,e)=>{if(!T(t))return!1;e?(t=>{const e=Object.keys(S);if(!t||e.length<1)return!1;e.forEach((e=>{const s=S[e];let i;s.forEach(((e,r)=>{e.callback!==t&&e.token!==t||(i=e.topic,s.splice(-1,r))})),s.length<1&&j(i)}))})(e):j(t)};class k{constructor(t){this.attrs={},t&&this.initialize(t)}initialize(t){return this.attr(t).render().addListeners(),this}attr(t,e){const s=this.attrs;return u(t)?e&&p(s,t)?(s[t]=e,this):s[t]:l(t)?(M(s,t),this):0===arguments.length?s:this}render(){return this}refresh(){return this}destroy(){return this.removeListeners(),this}reload(t){let e=this.attr();return t&&(e=this.attr(t)),this.destroy().initialize(e),this}$emit(t,e){return E(t,e),this}$on(t,e){return((t,e,s=null)=>{const i=C();let r="symbol"==typeof t?t.toString():t;o(e)&&(S[r]||(S[r]=[]),S[r].push({topic:r,callback:e,context:s,token:i}))})(t,e,this),this}$off(t,e){return A(t,e),this}addListeners(){return this}removeListeners(){return this}}const O=t=>{const e=Object.getPrototypeOf;let s;if(!(t=>l(t)&&null!==t)(t))return!1;if(s=t.prototype,!s)return!0;for(s=t;null!==e(s);)s=e(s);return e(t)===s},N=t=>t.replace(/]*>.*?<\/script>/gi,""),D=t=>{const e={"&":"&","<":"<",">":">","'":"'",'"':"""};return t.replace(/[&<>'"]/g,(t=>e[t]||t))},B=(t,e={})=>{const s="outline-icon",i=e.size||0,r=e.color||"",n=e.iconSet||"",o=a(i)?i[0]:i,l=a(i)?i[1]:i,h=i?`width:${o}px;height:${l}px;`:"",c=r?h+`color:${r}`:h,d=e.attrs||{},m=document.createElement("i");let p,f="",b="";return u(t)?((t=>{const e=new RegExp("^\\s*(?:<\\?xml[^>]*>\\s*)?(?:<\\!doctype svg[^>]*\\s*(?:\\[?(?:\\s*]*>\\s*)*\\]?)*[^>]*>\\s*)?]*>[^]*<\\/svg>\\s*$\\s*$","i");return u(t)&&e.test(t)})(t)?b=t:(f=n&&"icon"!==n?`xlink:href="#${n}-icon-${t}"`:`xlink:href="#icon-${t}"`,b=``),m.innerHTML=b,d.className?d.className=`${s} ${d.className}`:d.className=s,y(m,d),p=m.querySelector("svg"),y(p,{"aria-hidden":!0,xmlns:"http://www.w3.org/2000/svg",class:"outline-icon__svg",width:200,height:200,style:c}),m):null},H=(t,e={})=>B(t,e),P=s(r,['','','','','','','','','','','','','','','','','','','','']),U=(t,e="icon")=>u(t)?((t,e="icon")=>{const s=/id="(.*?)"/,i=/^(\w+)-/;return P.find((r=>{const n=s.exec(r)[1];return i.exec(n)[1]===e&&n===("icon"===e?`${e}-${t}`:`${e}-icon-${t}`)}))})(t,e):s(r,P),F=(t="")=>{const e=document.body;let s=document.querySelector("#outline-icons"),i=[];(t=>{if(!t)return!1;a(t)&&t.length>0?t.forEach((t=>{-1===P.indexOf(t)&&u(t)&&P.push(t)})):u(t)&&P.push(t)})(t),i=U(),s?s.innerHTML=i.join(""):(s=document.createElement("div"),s.innerHTML=``,e.insertBefore(s.firstChild,e.firstChild))},V=(t,e="")=>{const s=e.replace(/^>/i,"");return!!(e&&s&&t)&&(t.matches?t.matches(s):!!t.msMatchesSelector&&t.msMatchesSelector(s))},q=t=>t.host&&t!==document&&t.host.nodeType?t.host:t.parentNode,R=(t,e,s,i,r,n,o=!1)=>{const l=_.indexOf(s)>-1,a=function(l){const h=function(t){const e=t.target;return(s=e)&&3===s.nodeType?s.parentNode:s;var s}(l),c=((t,e,s,i)=>{const r=s||document;if(!t)return null;do{if(null!=e&&(e.startsWith(">")?t.parentNode===r&&V(t,e):V(t,e))||i&&t===r)return t;if(t===r)break}while(t=q(t))})(h,e,t);let u=n||t;l.delegateTarget=c,!0===n&&(u=r),c&&(!0===o&&w(t,s,a),i.call(u,l,r))};if(!t)return!1;t._listeners||(t._listeners=[]),t._listeners.push({el:t,selector:e,type:s,fn:a,data:r,context:n,capture:l}),i._delegateListener=a,t.addEventListener(s,a,l)},I=[];let W;F();class G extends k{constructor(t){super(),this._default(),t&&this.initialize(t)}_default(){return this.attrs=h(G.DEFAULTS),this.$el=null,this.id="",this.closed=!1,this.visible=!1,this.offset=-50,this.timer=null,this.destroyed=!1,this}initialize(t){return this.attr(t),this.id=this.attr("id"),this.offset=this.attr("offset")||-50,this.$emit("created",function(t){for(var s=1;s{this.$emit("opened"),this.close()}),1e3*t)),this}open(t){const e=this.$el;let s,i,r,n;return this.isDestroyed()||(this.isClosed()&&this.refresh(t),s=this.attr("offset"),i=this.attr("duration"),r=s&&s>=this.offset?s:this.offset,n=`top:${r}px;`,this.clearTimer(),this.$emit("beforeOpen"),c((()=>{this.visible=!0,b(e,"outline-message_visible"),e.style.cssText=n,i>0&&this.startTimer(i)}),100)),this}close(){const t=this.$el;let e,s;return this.isDestroyed()||(e=this.attr("destroyAfterClosed"),s=this.attr("beforeClose"),o(s)&&s.call(this),t.style.cssText="top:-50px;",$(t,"outline-message_visible"),this.visible=!1,this.closed=!0,c((()=>{this.$emit("closed"),e&&this.destroy()}),500)),this}destroy(){return this.$emit("beforeDestroy"),this.isDestroyed()||(this.removeListeners(),document.body.removeChild(this.$el),clearTimeout(this.timer),this._default(),this.$emit("afterDestroy")),this}onMouseEnter(){return this.clearTimer(),this}onMouseLeave(){const t=this.attr("duration"),e=this.attr("delay");return t<=0||this.startTimer(e),this}onClose(){return this.clearTimer(),this.close(),this}addListeners(){const t=this.$el;return R(t,".outline-message__content","mouseenter",this.onMouseEnter,this,!0),R(t,".outline-message__content","mouseleave",this.onMouseLeave,this,!0),R(t,".outline-message__close","click",this.onClose,this,!0),this}removeListeners(){const t=this.$el;return w(t,"mouseenter",this.onMouseEnter),w(t,"mouseleave",this.onMouseLeave),w(t,"click",this.onClose),this}}G.DEFAULTS=h({id:"",type:"info",effect:"default",round:!1,offset:30,duration:3,delay:2,message:"",customClass:"",closable:!0,visible:!0,dangerouslyUseHTMLString:!1,destroyAfterClosed:!0,beforeClose:null}),["info","success","warning","error"].forEach((t=>{G[t]=e=>{const s={},i=C("outline-message-"),r=e.beforeClose||null;let n=e.offset||30;return u(e)?s.message=e:O(e)&&M(s,e),s.id=i,s.type=t,s.offset=n,s.visible=!1,s.beforeClose=()=>{G.close(i,r)},W=new G(s),I.forEach((t=>{n+=t.$el.offsetHeight+16})),W.offset=n,W.open(),I.push(W),W}})),G.close=(t,e)=>{const s=I.length;let i,r,n=-1;if(I.forEach(((s,i)=>{t===s.id&&(r=s.$el.offsetHeight,n=i,o(e)&&e.call(s),I.splice(i,1))})),s<=1||-1===n||n>I.length-1)return!1;for(i=n;i{let t=I.length-1;for(;t>=0;t-=1)I[t].close()};class J{constructor(t,e){this.name=t,o(e)&&(this.action=e)}execute(){return this.action(),this}}class K{constructor(){this.commands=[]}get(t){return this.commands.find((e=>e.name===t))}add(t){return this.commands.push(t),this}del(t){const e=this.commands,s=e.find((e=>e.name===t)),i=s?e.indexOf(s):-1;return i>-1&&e.splice(i,1),this}clear(){return this.commands=[],this}execute(t){const e=this.commands.find((e=>e.name===t));return o(null==e?void 0:e.execute)&&e.execute(),this}}const Q=(t,e=!0)=>{const s=H(t.icon,{iconSet:t.iconSet||"outline",color:t.color||"",size:t.size}),i=v("a",{className:"outline-toolbar__anchor",href:t.link},s),r=v("div",{className:`outline-toolbar__button ${t.name}`,"data-cmd":t.name},[t.link?i:s]);return b(s,"outline-toolbar__icon"),e&&b(r,"outline-toolbar_rounded"),t.disabled&&b(r,"outline-toolbar_disabled"),r},X="outline-toolbar_disabled",Y="outline-toolbar_hidden",Z="outline-toolbar_active";class tt extends k{constructor(t){super(),this._default(),t&&this.initialize(t)}_default(){return this.attrs=h(tt.DEFAULTS),this.disabled=!1,this.closed=!1,this.$el=null,this.buttons=[],this.commands=null,this}initialize(t){let e;return this.attr(t),this.disabled=this.attr("disabled"),this.closed=this.attr("closed"),this.commands=new K,e=this.attr("created"),o(e)&&e.call(this),this.render().addListeners(),this}isHighlight(t){const e=this.get(t);return!!e&&f(e.$el,Z)}isDisabled(t){let e;return t?(e=this.get(t),e.disabled):this.disabled}isExist(t){return!!this.get(t)}isClosed(){return this.closed}_getCommand(t){const e=this,{action:s,name:i}=t;let r,n,l=null,a=null;return s?(a=s.handler,r=s.context||this,o(a)?n=a:u(a)&&(n=function(){e.$emit(a,i)}),o(n)&&(l=new J(i,n.bind(r))),l):l}get(t){return this.buttons.find((e=>e.name===t))}render(){const t=this.attr("mounted"),e=this.attr("buttons")||[],s=this.attr("placement");return F(),this.$el=v("div",{id:C("outline-toolbar"),className:`outline-toolbar outline-toolbar_${s}`}),this._paint(e),document.body.appendChild(this.$el),this.closed&&this.hide(),this.disabled&&this.disable(),o(t)&&t.call(this),this}erase(){return this.$el.innerHTML="",this}_paint(t){const e=this.attr("rounded"),s=document.createDocumentFragment();return t.forEach((t=>{const i=Q(t,e),r=this._getCommand(t),{name:n,disabled:o,context:l}=t;s.appendChild(i),this.isExist(n)||(this.buttons.push({$el:i,name:n,disabled:o||!1,context:l||this}),r&&this.commands.add(r))})),this.$el.appendChild(s),this}_remove(){return document.body.removeChild(this.$el),this}refresh(t){return this.attr({buttons:t}),this.erase()._paint(t),this}add(t){const e=this.$el,s=document.createDocumentFragment(),i=this.attr("buttons")||[],{name:r,disabled:n,context:o}=t,h=this._getCommand(t),c=t=>{const e=Q(t);s.appendChild(e),i.push(t),this.buttons.push({$el:e,name:r,disabled:n||!1,context:o||this,command:h}),h&&this.commands.add(h)};return l(t)?c(t):a(t)&&t.forEach((t=>{l(t)&&c(t)})),e.appendChild(s),this}remove(t){const e=this.$el,s=this.buttons,i=this.get(t);let r=-1;return i?(r=s.indexOf(i),r>-1&&(s.splice(r,1),this.attr("buttons").splice(r,1)),this._disable(t),e.removeChild(i.$el),this):this}_disable(t){const e=this.get(t),s=this.commands.get(t);return!e||e.disabled||(e.disabled=!0,s&&this.commands.del(s),b(e.$el,X)),this}_enable(t){const e=this.get(t),s=this.commands.get(t);return e&&e.disabled?(e.disabled=!1,s&&this.commands.add(s),$(e.$el,X),this):this}disable(t){const e=this.attr("afterDisabled");return t?this._disable(t):(b(this.$el,X),this.removeListeners(),this.disabled=!0,o(e)&&e.call(this)),this}enable(t){const e=this.attr("afterEnabled");return t?this._enable(t):(this.disabled=!1,$(this.$el,X),this.addListeners(),o(e)&&e.call(this)),this}show(t){const e=this.attr("afterOpened"),s=this.get(t),i=this.$el;if(t){if(!s)return this;$(s.$el,Y)}else $(i,Y),this.closed=!1,o(e)&&c((()=>{e.call(this)}),310);return this}hide(t){const e=this.attr("afterClosed"),s=this.get(t),i=this.$el;if(t){if(!s)return this;b(s.$el,Y)}else b(i,Y),this.closed=!0,o(e)&&c((()=>{e.call(this)}),310);return this}toggle(t){return this.isClosed()?this.show(t):this.hide(t),this}highlight(t){const e=this.get(t);let s;return e?(s=e.$el,f(s,Z)?$(s,Z):b(s,Z),this):this}destroy(){const t=this.attr("beforeDestroy"),e=this.attr("afterDestroy");return o(t)&&t.call(this),this.commands.clear(),this.removeListeners()._remove()._default(),o(e)&&e.call(this),this}execute(t){return this.isDisabled(t)||this.commands.execute(t),this}onExecute(t){const e=t.delegateTarget;let s="";return e&&(s=e.getAttribute("data-cmd"),s&&this.execute(s)),this}_updateToolbar({top:t,min:e,max:s}){const i=Math.ceil(t);return i<=e?(this.hide("up"),this.show("down")):i>=s?(this.hide("down"),this.show("up")):i>e&&i{t[`on${s}`]=t=>{E(s,{event:t,speech:e})}})),speechSynthesis.onvoiceschanged=t=>{E("voiceschanged",{event:t,speech:e})},this}}et.isSupport="speechSynthesis"in window;const st=(t,e)=>{let s,i=t;for(;i;)s=i.tagName.toLowerCase(),"script"!==s&&"style"!==s&&b(i,"outline-reader_sibling"),i=e?i.previousElementSibling:i.nextElementSibling},it=()=>{const t=navigator.userAgent;return/Mobile|mini|Fennec|Android|iP(ad|od|hone)|NokiaN[^/]*/.test(t)},rt="进入阅读模式,按 ESC 键可退出阅读模式";class nt extends k{constructor(t){super(),this._default(),t&&this.initialize(t)}_default(){return this.attrs=h(nt.DEFAULTS),this.reading=!1,this.$target=null,this.$el=null,this.$paper=null,this.$title=null,this.$article=null,this.$progress=null,this.toolbar=null,this.speech=null,this}initialize(t){let e;return this.attr(t),e=this.attr("target"),u(e)?this.$target=document.querySelector(e):d(e)&&(this.$target=e),this.$target?(et.isSupport&&(this.speech=new et),this.render().addListeners(),this):this}isSpeaking(){var t;return null==this||null===(t=this.speech)||void 0===t?void 0:t.isSpeaking()}render(){return this._renderEdge()._paint(this.$target),this}erase(){return this.$article.innerHTML="",this}_paint(t){const e=document.createDocumentFragment(),i=s(r,t.cloneNode(!0).children);return c((()=>{i.forEach((t=>{e.appendChild(t)})),this.$article.appendChild(e)})),this}_remove(){const t=this.$el,e=this.toolbar;return t&&document.body.removeChild(t),e&&e.destroy(),this}refresh(){return this.erase()._paint(this.$target),this}_animateTimeline(){return window.ScrollTimeline&&it()?(this.$progress.animate({scale:["0 1","1 1"]},{timeline:new ScrollTimeline({source:this.$article,axis:"block"})}),this):this}_renderEdge(){const t=this.$target,e=it()?26:20;let s,i,r,n,o,l,a=this.attr("title");o=v("div",{className:"outline-reader__progress"}),this.$progress=o,r=t.querySelector("h1"),d(a)&&(r=a),d(r)&&(a=r.innerText),r=v("h1",{className:"outline-reader__title"},a),this.$title=r,n=v("article",{id:"outline-reader__article",className:"outline-reader__article"},it()?[]:[o.cloneNode()]),this.$article=n,i=v("div",{id:"outline-reader__paper",className:"outline-reader__paper"},[r,n]),this.$paper=i;const h=[];return h.push({name:"print",icon:"print",size:e,action:{context:this,handler:this.print}}),et.isSupport&&this.attr("allowSpeak")&&h.push({name:"speak",icon:"sound",size:e,action:{context:this,handler:this.speak}}),h.push({name:"exit",icon:"close",size:e,action:{context:this,handler:this.exit}}),this.toolbar=new tt({placement:"rtl",buttons:h}),s=v("section",{id:"outline-reader",className:"outline-reader outline-reader_hidden"},[o,i,this.toolbar.$el]),this.$el=s,document.body.appendChild(s),this._animateTimeline(),c((()=>{l=s.previousElementSibling,st(l,!0),l=s.nextElementSibling,st(l)})),this}enter(){const t="outline-reader",e=`${t}--reading`,s=`${t}_hidden`,i=this.$el,r=document.querySelectorAll(".outline-reader_sibling"),n=this.attr("enterReadingTip")||rt;return this.reading||!i||(r.forEach((t=>{b(t,s)})),b(i,e),$(i,s),this.toolbar.show(),this.reading=!0,G.info({round:!0,message:n}),this.$emit("reader:enter")),this}exit(){const t="speak",e="outline-reader",s=`${e}--reading`,i=`${e}_hidden`,r=this.$el,n=document.querySelectorAll(".outline-reader_sibling"),o=this.speech,l=this.toolbar;return this.reading&&r?(b(r,i),$(r,s),n.forEach((t=>{$(t,i)})),l.hide(),this.reading=!1,o&&(l.isHighlight(t)&&l.highlight(t),o.cancel()),this.$emit("reader:exit"),this):this}toggle(){return this.reading?this.exit():this.enter(),this}speak(){const t=this.$article.innerText,e=this.speech;return et.isSupport&&e?(this.toolbar.highlight("speak"),this.isSpeaking()?e.cancel():e.speak(t),this):this}print(){return o(print)?(print(),this):this}destroy(){return this.$el?(this.removeListeners()._remove()._default(),this):this}onPrint(){return this.print(),this}onEnterReading(){return this.toggle(),this}onExitReading(t){return 27===t.keyCode&&this.reading&&(this.toggle(),function(t){t.stopPropagation(),t.preventDefault()}(t)),this}onRefresh(){return this.refresh(),this}addListeners(){return this.$el?(((t,e,s,i,r,n=!1)=>{const l=_.indexOf(e)>-1,a=function(o){let l=r||t;!0===r&&(l=i),!0===n&&w(t,e,a),s.call(l,o,i)};if(!o(s))return!1;t._listeners||(t._listeners=[]),t._listeners.push({el:t,type:e,fn:a,data:i,context:r,capture:l}),s._delegateListener=a,t.addEventListener(e,a,l)})(document,"keyup",this.onExitReading,this,!0),this.$on("toolbar:action:print",this.onPrint),this.$on("toolbar:action:reading",this.onEnterReading),this.$on("reader:print",this.onPrint),this.$on("reader:refresh",this.onRefresh),this.$on("reader:enter",this.enter),this.$on("reader:exit",this.exit),this.$on("reader:toggle",this.toggle),this):this}removeListeners(){return this.$el?(w(document,"keyup",this.onExitReading),this.$off("toolbar:action:print"),this.$off("toolbar:action:reading"),this.$off("reader:refresh"),this.$off("reader:toggle"),this):this}}return nt.DEFAULTS=h({target:"",title:"",enterReadingTip:rt,allowSpeak:!1}),nt})); -//# sourceMappingURL=reader.min.js.map diff --git a/reader.min.js.map b/reader.min.js.map deleted file mode 100644 index 605f1052..00000000 --- a/reader.min.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"reader.min.js","sources":["utils/lang/toString.js","utils/types/isFunction.js","utils/types/isObject.js","utils/types/isArray.js","utils/lang/cloneDeep.js","utils/lang/later.js","utils/types/isString.js","utils/types/isElement.js","utils/types/isDOM.js","utils/types/isHTMLCollection.js","utils/types/isFragment.js","utils/types/isTextNode.js","utils/lang/hasOwn.js","utils/dom/hasClass.js","utils/dom/addClass.js","utils/dom/setAttribute.js","utils/dom/setAttributes.js","utils/dom/createElement.js","utils/dom/removeClass.js","utils/lang/trim.js","utils/event/enum.js","utils/event/_off.js","utils/event/_delete.js","utils/event/purgeElement.js","utils/event/getListeners.js","utils/event/off.js","utils/lang/extend.js","utils/observer/_subscribers.js","utils/observer/_hasDirectSubscribersFor.js","utils/observer/has.js","utils/observer/_hasSubscribers.js","utils/observer/emit.js","utils/types/isTypedArray.js","utils/lang/guid.js","utils/observer/_removeSubscriber.js","utils/observer/off.js","utils/observer/_removeSubscriberByToken.js","base.js","utils/observer/on.js","utils/types/isObjectLike.js","utils/types/isPlainObject.js","utils/lang/stripScripts.js","utils/lang/encodeHTML.js","utils/icons/createElement.js","utils/types/isSVG.js","utils/icons/icon.js","utils/icons/symbols.js","utils/icons/defaults.js","utils/icons/getSymbols.js","utils/icons/getSymbol.js","utils/icons/paint.js","utils/icons/add.js","utils/dom/matches.js","utils/dom/getParentOrHost.js","utils/event/on.js","utils/event/getTarget.js","utils/dom/resolveTextNode.js","utils/dom/closest.js","message.js","command.js","commands.js","_createButton.js","toolbar.js","speech.js","_updateSiblingElements.js","utils/dom/isMobile.js","reader.js","utils/event/stop.js","utils/event/at.js"],"sourcesContent":["/**\r\n * Object 对象原型上的 toString 方法\r\n * ========================================================================\r\n * @method toString\r\n * @param {*} val\r\n * @returns {string}\r\n */\r\nconst toString = (val) => {\r\n return Object.prototype.toString.apply(val)\r\n}\r\n\r\nexport default toString\r\n","import toString from '../lang/toString'\r\n\r\n/**\r\n * 检测测试数据是否为 Function 类型\r\n * ========================================================================\r\n * @method isFunction\r\n * @param {*} val - (必须)待检测的数据\r\n * @returns {boolean} 'val' 是 Function 类型返回 true,否则返回 false\r\n */\r\nconst isFunction = (val) => {\r\n return typeof val === 'function' || toString(val) === '[object Function]'\r\n}\r\n\r\nexport default isFunction\r\n","import toString from '../lang/toString'\r\nimport isFunction from './isFunction'\r\n\r\n/**\r\n * 检测数据是否为 Object 类型\r\n * ========================================================================\r\n * @method isObject\r\n * @param {*} o\r\n * @returns {boolean}\r\n */\r\nconst isObject = (o) => {\r\n return (\r\n (toString(o) === '[object Object]' ||\r\n typeof o === 'object' ||\r\n isFunction(o)) &&\r\n o !== null\r\n )\r\n}\r\n\r\nexport default isObject\r\n","import toString from '../lang/toString'\r\n\r\n/**\r\n * 检测数据是否为 Array 类型\r\n * ========================================================================\r\n * @method isArray\r\n * @param {*} o\r\n * @returns {boolean}\r\n */\r\nconst isArray = (o) => {\r\n if (Array.isArray) {\r\n return Array.isArray(o)\r\n } else {\r\n return toString(o) === '[object Array]'\r\n }\r\n}\r\n\r\nexport default isArray\r\n","import isObject from '../types/isObject'\r\nimport isArray from '../types/isArray'\r\n\r\n/**\r\n * 深拷贝对象函数\r\n * ========================================================================\r\n * @methods cloneDeep\r\n * @param {Object} obj - 深拷贝的对象\r\n * @returns {Array|Object|*}\r\n *\r\n * @example\r\n * const arr = cloneDeep([2,3,4,6])\r\n * => [2,3,4,6]\r\n */\r\nconst cloneDeep = (obj) => {\r\n let clone = {}\r\n\r\n if (obj === null) {\r\n return null\r\n }\r\n\r\n if (isArray(obj)) {\r\n clone = Array.from(obj)\r\n } else {\r\n clone = Object.assign({}, obj)\r\n Object.keys(clone).forEach((key) => {\r\n return (clone[key] = isObject(obj[key]) ? cloneDeep(obj[key]) : obj[key])\r\n })\r\n }\r\n\r\n return clone\r\n}\r\n\r\nexport default cloneDeep\r\n","import isFunction from '../types/isFunction'\r\n\r\n/**\r\n * later - 延迟执行方法\r\n * ========================================================================\r\n * @method later\r\n * @param {Function} fn\r\n * @param {Number} [delay]\r\n * @returns {number|boolean}\r\n */\r\nconst later = (fn, delay = 300) => {\r\n if (!isFunction(fn)) {\r\n return false\r\n }\r\n\r\n return setTimeout(() => {\r\n fn()\r\n }, delay)\r\n}\r\n\r\nexport default later\r\n","/**\r\n * 检测数据是否为 String 类型\r\n * ========================================================================\r\n * @method isArray\r\n * @param {*} str\r\n * @returns {boolean}\r\n */\r\nconst isString = (str) => {\r\n return typeof str === 'string'\r\n}\r\n\r\nexport default isString\r\n","import isObject from './isObject'\r\n\r\n/**\r\n * 检测数据是否为 HTMLElement DOM 节点\r\n * ========================================================================\r\n * @method isElement\r\n * @param {*} o\r\n * @returns {boolean}\r\n */\r\nconst isElement = (o) => {\r\n return !!(isObject(o) && o.nodeName && o.tagName && o.nodeType === 1)\r\n}\r\n\r\nexport default isElement\r\n","import isObject from './isObject'\r\nimport isElement from './isElement'\r\nimport isHTMLCollection from './isHTMLCollection'\r\nimport isFragment from './isFragment'\r\nimport isTextNode from './isTextNode'\r\n\r\nconst isDOM = (el) => {\r\n return !!(\r\n isObject(el) &&\r\n (isElement(el) || isHTMLCollection(el) || isFragment(el) || isTextNode(el))\r\n )\r\n}\r\n\r\nexport default isDOM\r\n","import toString from '../lang/toString'\r\nimport isObject from './isObject'\r\n\r\nconst isHTMLCollection = (el) => {\r\n return !!(isObject(el) && toString(el) === '[object NodeList]')\r\n}\r\n\r\nexport default isHTMLCollection\r\n","import toString from '../lang/toString'\r\nimport isObject from './isObject'\r\n\r\nconst isFragment = (fragment) => {\r\n return !!(\r\n isObject(fragment) && toString(fragment) === '[object DocumentFragment]'\r\n )\r\n}\r\n\r\nexport default isFragment\r\n","import toString from '../lang/toString'\r\nimport isObject from './isObject'\r\n\r\nconst isTextNode = (el) => {\r\n return !!(\r\n isObject(el) &&\r\n (toString(el) === '[object Text]' || (el.tagName && el.nodeType === 3))\r\n )\r\n}\r\n\r\nexport default isTextNode\r\n","/**\r\n * 检测对象自身属性中是否具有指定的属性。\r\n * ========================================================================\r\n * @method hasOwn\r\n * @param {Object} obj - (必须)检测的目标对象\r\n * @param {String} prop - (必须)属性名\r\n * @returns {Boolean}\r\n */\r\nconst hasOwn = (obj, prop) => {\r\n const hasOwnProperty = Object.prototype.hasOwnProperty\r\n return obj && hasOwnProperty.call(obj, prop)\r\n}\r\n\r\nexport default hasOwn\r\n","import isElement from '../types/isElement'\r\n/**\r\n * 检测 DOM 节点是否包含名为 className 的样式\r\n * ========================================================================\r\n * @method hasClass\r\n * @param {HTMLElement} el - DOM 节点\r\n * @param {String} className - 样式名称\r\n * @returns {Boolean}\r\n */\r\nconst hasClass = (el, className) => {\r\n const pattern = new RegExp('(\\\\s|^)' + className + '(\\\\s|$)')\r\n let allClass\r\n let classList\r\n\r\n if (!isElement(el)) {\r\n return false\r\n }\r\n\r\n allClass = el.className\r\n\r\n if (!allClass) {\r\n return false\r\n }\r\n\r\n classList = el.classList\r\n\r\n if (classList && classList.contains) {\r\n return el.classList.contains(className)\r\n }\r\n\r\n return !!pattern.exec(allClass)\r\n}\r\n\r\nexport default hasClass\r\n","import hasClass from './hasClass'\r\n\r\n/**\r\n * 给 DOM 节点添加名为 className 的样式\r\n * ========================================================================\r\n * @method addClass\r\n * @param {HTMLElement} el - DOM 节点\r\n * @param {String} className - 样式名称\r\n * @returns {Boolean}\r\n */\r\nconst addClass = (el, className) => {\r\n let classList\r\n let allClass\r\n\r\n if (hasClass(el, className)) {\r\n return false\r\n }\r\n\r\n classList = el.classList\r\n\r\n if (classList?.add) {\r\n if (className.indexOf(' ') > -1) {\r\n className.split(' ').forEach((name) => {\r\n classList.add(name)\r\n })\r\n } else {\r\n classList.add(className)\r\n }\r\n } else {\r\n allClass = el.className\r\n allClass += allClass.length > 0 ? ' ' + className : className\r\n el.className = allClass\r\n }\r\n}\r\n\r\nexport default addClass\r\n","import addClass from './addClass.js'\r\n\r\n/**\r\n * 给 DOM 节点设置属性/值\r\n * ========================================================================\r\n * @method setAttribute\r\n * @param {HTMLElement} el - DOM 节点\r\n * @param {String} attr - 属性名称\r\n * @param {String|Number|Boolean} value - 属性值\r\n */\r\nconst setAttribute = (el, attr, value) => {\r\n let tagName = el.tagName.toLowerCase()\r\n\r\n switch (attr) {\r\n case 'style':\r\n el.style.cssText = value\r\n break\r\n case 'value':\r\n if (tagName === 'input' || tagName === 'textarea') {\r\n el.value = value\r\n } else {\r\n el.setAttribute(attr, value)\r\n }\r\n break\r\n case 'htmlFor':\r\n el.setAttribute('for', value)\r\n break\r\n case 'className':\r\n addClass(el, value)\r\n break\r\n case 'innerHTML':\r\n el.innerHTML = value\r\n break\r\n case 'innerText':\r\n el.innerText = value\r\n break\r\n default:\r\n el.setAttribute(attr, value)\r\n break\r\n }\r\n}\r\n\r\nexport default setAttribute\r\n","import isObject from '../types/isObject'\r\nimport hasOwn from '../lang/hasOwn'\r\nimport setAttribute from './setAttribute'\r\n\r\nconst setAttributes = (el, attrs) => {\r\n if (!el || !isObject(attrs)) {\r\n return false\r\n }\r\n\r\n Object.keys(attrs).forEach((attr) => {\r\n const value = attrs[attr]\r\n if (hasOwn(attrs, attr)) {\r\n setAttribute(el, attr, value)\r\n }\r\n })\r\n}\r\n\r\nexport default setAttributes\r\n","import isObject from '../types/isObject'\r\nimport isString from '../types/isString'\r\nimport isArray from '../types/isArray'\r\nimport isDOM from '../types/isDOM'\r\nimport setAttributes from './setAttributes'\r\n\r\n/**\r\n * 创建 DOM 节点,并添加属性和子节点\r\n * ========================================================================\r\n * @method createElement\r\n * @param {String} tagName - 标签名称\r\n * @param {Object|Array|HTMLElement|DocumentFragment|String} attrs - 属性对象或者子节点\r\n * @param {Array|HTMLElement|DocumentFragment|String} [children] - 子节点数组\r\n * @returns {HTMLElement}\r\n */\r\nconst createElement = (tagName, attrs, children) => {\r\n const $fragment = document.createDocumentFragment()\r\n const $el = document.createElement(tagName)\r\n const isValidChild = (child) => {\r\n return isDOM(child) || isString(child)\r\n }\r\n const append = (child) => {\r\n let $child\r\n\r\n if (!isValidChild(child)) {\r\n return false\r\n }\r\n\r\n if (isDOM(child)) {\r\n $child = child\r\n } else if (isString(child)) {\r\n $child = document.createTextNode(child)\r\n }\r\n\r\n $fragment.appendChild($child)\r\n }\r\n\r\n if (isObject(attrs)) {\r\n setAttributes($el, attrs)\r\n } else if (isArray(attrs) && attrs.every((attr) => isValidChild(attr))) {\r\n attrs.forEach((child) => {\r\n append(child)\r\n })\r\n } else if (isDOM(attrs)) {\r\n append(attrs)\r\n } else if (isString(attrs)) {\r\n append(document.createTextNode(attrs))\r\n }\r\n\r\n if (isArray(children)) {\r\n children.forEach((child) => {\r\n append(child)\r\n })\r\n } else {\r\n append(children)\r\n }\r\n\r\n $el.appendChild($fragment)\r\n\r\n return $el\r\n}\r\n\r\nexport default createElement\r\n","import trim from '../lang/trim'\r\nimport hasClass from './hasClass'\r\n\r\n/**\r\n * 移除 DOM 节点的 className 样式\r\n * ========================================================================\r\n * @method removeClass\r\n * @param {HTMLElement} el - DOM 节点\r\n * @param {String} className - 样式名称\r\n * @returns {Boolean}\r\n */\r\nconst removeClass = (el, className) => {\r\n let allClass = el.className\r\n let classList\r\n\r\n if (!allClass || !hasClass(el, className)) {\r\n return false\r\n }\r\n\r\n classList = el.classList\r\n\r\n if (classList?.remove) {\r\n classList.remove(className)\r\n } else {\r\n allClass = trim(allClass.replace(className, ''))\r\n el.className = allClass\r\n }\r\n}\r\n\r\nexport default removeClass\r\n","import isString from '../types/isString'\r\n\r\n/**\r\n * 清楚字符串起始位置所有的空格\r\n * ========================================================================\r\n * @method trim\r\n * @param {string} str\r\n * @returns {string|Boolean}\r\n */\r\nconst trim = (str) => {\r\n if (!isString(str)) {\r\n return false\r\n }\r\n return str.replace(/(^\\s+)|(\\s+$)/g, '')\r\n}\r\n\r\nexport default trim\r\n","export const CAPTURE_EVENTS = [\r\n 'focusout',\r\n 'blur',\r\n 'focusin',\r\n 'focus',\r\n 'load',\r\n 'unload',\r\n 'mouseenter',\r\n 'mouseleave'\r\n]\r\n","import { CAPTURE_EVENTS } from './enum'\r\nimport _delete from './_delete'\r\n\r\n/**\r\n * (私有方法)取消 type 类型的代理事件绑定\r\n * ========================================================================\r\n * 如果没有设置 handler,则销毁 this.$options 绑定的所有符合 type 事件类型的事件绑定\r\n * ========================================================================\r\n * @method _off\r\n * @param {HTMLElement} el - (必须)取消事件绑定的 DOM 元素\r\n * @param {String} type - (必须)事件类型\r\n * @param {Function} fn - (必须)事件处理器回调函数\r\n * @private\r\n */\r\nconst _off = (el, type, fn) => {\r\n const capture = CAPTURE_EVENTS.indexOf(type) > -1\r\n\r\n /* istanbul ignore else */\r\n if (fn._delegateListener) {\r\n fn = fn._delegateListener\r\n delete fn._delegateListener\r\n }\r\n\r\n // 移除缓存的 _listeners 数据\r\n _delete(el, type, fn)\r\n\r\n el.removeEventListener(type, fn, capture)\r\n}\r\n\r\nexport default _off\r\n","/**\r\n * 删除 DOM 元素缓存的 _listeners 数据\r\n * ========================================================================\r\n * @method _delete\r\n * @param {HTMLElement} el - 要删除 listener 的 DOM 元素\r\n * @param {String} type - 事件类型(名称)\r\n * @param {Function} [fn] - 事件处理器回调函数\r\n */\r\nconst _delete = function (el, type, fn) {\r\n const listeners = el._listeners\r\n let index = -1\r\n\r\n if (listeners.length < 1) {\r\n return false\r\n }\r\n\r\n // 移除缓存的 _listeners 数据\r\n listeners.forEach((listener, i) => {\r\n const handler = listener.fn\r\n\r\n if (type === listener.type) {\r\n index = i\r\n\r\n if (handler === fn) {\r\n index = i\r\n }\r\n }\r\n })\r\n\r\n /* istanbul ignore else */\r\n if (index > -1) {\r\n listeners.splice(index, 1)\r\n }\r\n}\r\n\r\nexport default _delete\r\n","import isString from '../types/isString'\r\nimport isElement from '../types/isElement'\r\nimport getListeners from './getListeners'\r\nimport _off from './_off'\r\n\r\n/**\r\n * 销毁(type 类型的)代理事件绑定\r\n * ========================================================================\r\n * 1. 设置了事件类型 type,则销毁指定类型的事件绑定,否则清除所有代理事件绑定\r\n * 2. recurse 设置为 true,递归销毁子节点全部事件绑定\r\n * ========================================================================\r\n * @method purgeElement\r\n * @param {HTMLElement|String} el - (必须)DOM 元素或者其选择器\r\n * @param {String|Boolean} type - (必须)事件类型\r\n * @param {Boolean} [recurse] - (可选)是否递归销毁子节点所有事件绑定\r\n */\r\nconst purgeElement = function (el, type, recurse = false) {\r\n const $element = isString(el) ? document.querySelector(el) : el\r\n const $children = $element.childNodes\r\n const listeners = getListeners($element, type)\r\n\r\n listeners.forEach((listener) => {\r\n _off($element, listener.type, listener.fn)\r\n })\r\n\r\n if (\r\n (recurse || type === true || arguments.length === 1) &&\r\n $element &&\r\n $children\r\n ) {\r\n $children.forEach(($child) => {\r\n if (isElement($child)) {\r\n purgeElement($child, type, recurse)\r\n }\r\n })\r\n }\r\n}\r\n\r\nexport default purgeElement\r\n","import isString from '../types/isString'\r\n\r\n/**\r\n * 获取 DOM 元素(type 事件类型)事件绑定信息\r\n * ========================================================================\r\n * 如果设置了事件类型 type, 则返回指定类型的事件绑定信息,否则返回所有事件绑定信息\r\n * ========================================================================\r\n * @methods getListeners\r\n * @param {HTMLElement} el - (必须)要获取事件绑定信息的 DOM 元素\r\n * @param {String} [type] - (可选)事件类型\r\n * @returns {Array} - 已绑定的事件信息\r\n */\r\nconst getListeners = (el, type) => {\r\n let listeners = el._listeners || []\r\n\r\n if (isString(type) && type) {\r\n listeners = listeners.filter((listener) => {\r\n return listener.type === type\r\n })\r\n }\r\n\r\n return listeners\r\n}\r\n\r\nexport default getListeners\r\n","import purgeElement from './purgeElement'\r\nimport isFunction from '../types/isFunction'\r\nimport _off from './_off'\r\n\r\n/**\r\n * 取消 type 类型的代理事件绑定\r\n * ========================================================================\r\n * 如果没有设置 handler,则销毁 this.$options 绑定的所有符合 type 事件类型的事件绑定\r\n * ========================================================================\r\n * @method off\r\n * @param {HTMLElement|Object} el - (必须)取消事件绑定的 DOM 元素\r\n * @param {String} type - (必须)事件类型\r\n * @param {Function} [fn] - (可选)事件处理器回调函数\r\n */\r\nconst off = (el, type, fn) => {\r\n // 如果不设置 fn 参数,默认清除 el 元素上绑定的所有事件处理器\r\n if (!isFunction(fn)) {\r\n purgeElement(el, type)\r\n return false\r\n }\r\n\r\n _off(el, type, fn)\r\n}\r\n\r\nexport default off\r\n","import hasOwn from './hasOwn'\r\n\r\n/**\r\n * 扩展对象\r\n * ========================================================================\r\n * @method extend\r\n * @param {Object} origin\r\n * @param {Object} source\r\n */\r\nconst extend = (origin, source) => {\r\n const keys = Object.keys(source)\r\n\r\n keys.forEach((prop) => {\r\n if (hasOwn(source, prop)) {\r\n origin[prop] = source[prop]\r\n }\r\n })\r\n}\r\n\r\nexport default extend\r\n","/**\r\n * 存储订阅者(主题和处理器的)私有对象\r\n * ========================================================================\r\n * @type {{}}\r\n * @private\r\n */\r\nconst _subscribers = {}\r\n\r\nexport default _subscribers\r\n","import _subscribers from './_subscribers'\r\nimport hasOwn from '../lang/hasOwn'\r\n\r\n/**\r\n * 判断是否存在与给定 topic 完全匹配的订阅者信息\r\n * ========================================================================\r\n * @method _hasDirectSubscribersFor\r\n * @param {String} topic - (必须)订阅主题字符串\r\n * @returns {Boolean}\r\n */\r\nconst _hasDirectSubscribersFor = (topic) => {\r\n return hasOwn(_subscribers, topic) && _subscribers[topic].length > 0\r\n}\r\n\r\nexport default _hasDirectSubscribersFor\r\n","import _hasDirectSubscribersFor from './_hasDirectSubscribersFor'\r\nimport _hasSubscribers from './_hasSubscribers'\r\n\r\n/**\r\n * 判断是否存在包含 topic 指定的订阅者信息\r\n * ========================================================================\r\n * @method has\r\n * @param {String} topic - (必须)主题名称\r\n * @param {Boolean} [isDirect] - (可选)是否为直接的主题,默认值:true\r\n * @returns {Boolean}\r\n */\r\nconst has = (topic, isDirect = true) => {\r\n return isDirect ? _hasDirectSubscribersFor(topic) : _hasSubscribers(topic)\r\n}\r\n\r\nexport default has\r\n","import _hasDirectSubscribersFor from './_hasDirectSubscribersFor'\r\n\r\n/**\r\n * 判断是否存在包含给定 topic 相关的订阅者信息\r\n * ========================================================================\r\n * @method _hasSubscribers\r\n * @param {String} topic - (必须)订阅主题字符串\r\n * @returns {Boolean}\r\n */\r\nconst _hasSubscribers = (topic) => {\r\n let found = _hasDirectSubscribersFor(topic)\r\n let position = topic.lastIndexOf('.')\r\n\r\n while (!found && position !== -1) {\r\n topic = topic.substring(0, position)\r\n position = topic.lastIndexOf('.')\r\n found = _hasDirectSubscribersFor(topic)\r\n }\r\n\r\n return found\r\n}\r\n\r\nexport default _hasSubscribers\r\n","import isTypedArray from '../types/isTypedArray'\r\nimport _subscribers from './_subscribers'\r\nimport has from './has'\r\nimport _hasDirectSubscribersFor from './_hasDirectSubscribersFor'\r\n\r\n/**\r\n * (异步)发布订阅主题信息\r\n * ========================================================================\r\n * 主题默认是异步发布的。确保在消费者处理主题时,主题的发起者不会被阻止。\r\n * ========================================================================\r\n * @method emit\r\n * @param {String} topic - (必须)主题名称\r\n * @param {Object} [data] - (可选)数据对象\r\n * @param {Boolean} [async] - (可选) 是否异步发布\r\n */\r\nconst emit = (topic, data, async = true) => {\r\n const execute = (topic) => {\r\n if (!_hasDirectSubscribersFor(topic)) {\r\n return false\r\n }\r\n\r\n _subscribers[topic].forEach((subscriber) => {\r\n // 针对 mqtt 消息服务返回的 Uint8Array 类似的 typed arrays 格式的数据\r\n // 采用 toString() 方法转化为普通(JSON)字符串\r\n const message = isTypedArray(data) ? data.toString() : data\r\n\r\n subscriber.callback.call(subscriber.context || subscriber, message)\r\n })\r\n }\r\n const deliver = () => {\r\n let subscriber = topic\r\n let position = topic.lastIndexOf('.')\r\n\r\n while (position !== -1) {\r\n subscriber = subscriber.substring(0, position)\r\n position = subscriber.lastIndexOf('.')\r\n\r\n execute(subscriber)\r\n }\r\n\r\n // 执行 topic 对应的处理器\r\n execute(topic)\r\n // 执行特殊 topic:'*'(监听全部消息的发布)\r\n execute('*')\r\n }\r\n\r\n if (!has(topic)) {\r\n return false\r\n }\r\n\r\n if (async) {\r\n setTimeout(deliver, 10)\r\n } else {\r\n deliver()\r\n }\r\n}\r\n\r\nexport default emit\r\n","import toString from '../lang/toString'\r\n/**\r\n * 判断检测数据是否为 Typed Arrays 类型的数据\r\n * ========================================================================\r\n * @param {*} val\r\n * @returns {boolean}\r\n */\r\nconst isTypedArray = (val) => {\r\n const TYPES = [\r\n '[object Int8Array]',\r\n '[object Uint8Array]',\r\n '[object Uint8ClampedArray]',\r\n '[object Int16Array]',\r\n '[object Uint16Array]',\r\n '[object Int32Array]',\r\n '[object Uint32Array]',\r\n '[object Float32Array]',\r\n '[object Float64Array]',\r\n '[object BigInt64Array]',\r\n '[object BigUint64Array]'\r\n ]\r\n\r\n return TYPES.indexOf(toString(val)) > -1\r\n}\r\n\r\nexport default isTypedArray\r\n","/**\r\n * 生成唯一 id 字符串的函数\r\n * ========================================================================\r\n * @method guid\r\n * @param {String} [prefix] - 生成 id 的前缀字符串\r\n * @return {String} 返回一个表示唯一 id 的字符串\r\n */\r\nconst guid = (() => {\r\n let uuid = 0\r\n\r\n return (prefix) => {\r\n uuid += 1\r\n\r\n return prefix ? prefix + '-' + uuid : 'guid-' + uuid\r\n }\r\n})()\r\n\r\nexport default guid\r\n","import _subscribers from './_subscribers'\r\nimport hasOwn from '../lang/hasOwn'\r\n\r\n/**\r\n * 删除与给定 topic 相同的订阅者信息\r\n * ========================================================================\r\n * @method _removeSubscriber\r\n * @param {String} topic - (必须)订阅主题字符串\r\n * @returns {Boolean}\r\n */\r\nconst _removeSubscriber = (topic) => {\r\n if (!hasOwn(_subscribers, topic)) {\r\n return false\r\n }\r\n\r\n delete _subscribers[topic]\r\n}\r\n\r\nexport default _removeSubscriber\r\n","import has from './has'\r\nimport _removeSubscriber from './_removeSubscriber'\r\nimport _removeSubscriberByToken from './_removeSubscriberByToken'\r\n\r\n/**\r\n * 取消订阅主题\r\n * ========================================================================\r\n * @method off\r\n * @param {String} topic - (必须)订阅的主题\r\n * @param {Function|String} [token] - (可选)订阅主题的处理器函数或者唯一 Id 值\r\n */\r\nconst off = (topic, token) => {\r\n if (!has(topic)) {\r\n return false\r\n }\r\n\r\n if (token) {\r\n _removeSubscriberByToken(token)\r\n } else {\r\n _removeSubscriber(topic)\r\n }\r\n}\r\n\r\nexport default off\r\n","import _subscribers from './_subscribers'\r\nimport _removeSubscriber from './_removeSubscriber'\r\n\r\n/**\r\n * 通过订阅者 token 值删除订阅者信息\r\n * ========================================================================\r\n * @method _removeSubscriberByToken\r\n * @param {String} token - 订阅者 token 字符串\r\n * @returns {boolean}\r\n * @private\r\n */\r\nconst _removeSubscriberByToken = (token) => {\r\n const keys = Object.keys(_subscribers)\r\n let index = -1\r\n\r\n if (!token || keys.length < 1) {\r\n return false\r\n }\r\n\r\n keys.forEach((subject) => {\r\n const subscriber = _subscribers[subject]\r\n let topic\r\n\r\n subscriber.forEach((execution, j) => {\r\n if (execution.callback === token || execution.token === token) {\r\n topic = execution.topic\r\n subscriber.splice(index, j)\r\n }\r\n })\r\n\r\n /* istanbul ignore else */\r\n if (subscriber.length < 1) {\r\n _removeSubscriber(topic)\r\n }\r\n })\r\n}\r\n\r\nexport default _removeSubscriberByToken\r\n","import isString from './utils/types/isString'\r\nimport hasOwn from './utils/lang/hasOwn'\r\nimport isObject from './utils/types/isObject'\r\nimport extend from './utils/lang/extend'\r\nimport publish from './utils/observer/emit'\r\nimport subscribe from './utils/observer/on'\r\nimport unsubscribe from './utils/observer/off'\r\n\r\nclass Base {\r\n constructor(options) {\r\n this.attrs = {}\r\n\r\n if (options) {\r\n this.initialize(options)\r\n }\r\n }\r\n\r\n initialize(options) {\r\n this.attr(options).render().addListeners()\r\n return this\r\n }\r\n\r\n attr(prop, value) {\r\n const attrs = this.attrs\r\n\r\n if (isString(prop)) {\r\n // 只能扩展 attrs 中已有的属性\r\n if (value && hasOwn(attrs, prop)) {\r\n // 更新单个配置信息\r\n attrs[prop] = value\r\n return this\r\n }\r\n\r\n // 只传递 prop 参数,则返回对应的属性值\r\n return attrs[prop]\r\n } else if (isObject(prop)) {\r\n // 批量更新配置信息\r\n extend(attrs, prop)\r\n\r\n return this\r\n } else if (arguments.length === 0) {\r\n // 不传递参数,直接返回整个\r\n return attrs\r\n }\r\n\r\n return this\r\n }\r\n\r\n render() {\r\n return this\r\n }\r\n\r\n refresh() {\r\n return this\r\n }\r\n\r\n destroy() {\r\n this.removeListeners()\r\n return this\r\n }\r\n\r\n reload(options) {\r\n let attrs = this.attr()\r\n\r\n if (options) {\r\n attrs = this.attr(options)\r\n }\r\n\r\n this.destroy().initialize(attrs)\r\n\r\n return this\r\n }\r\n\r\n $emit(event, data) {\r\n publish(event, data)\r\n return this\r\n }\r\n\r\n $on(event, callback) {\r\n subscribe(event, callback, this)\r\n return this\r\n }\r\n\r\n $off(event, callback) {\r\n unsubscribe(event, callback)\r\n return this\r\n }\r\n\r\n addListeners() {\r\n return this\r\n }\r\n\r\n removeListeners() {\r\n return this\r\n }\r\n}\r\n\r\nexport default Base\r\n","import _subscribers from './_subscribers'\r\nimport isFunction from '../types/isFunction'\r\nimport guid from '../lang/guid'\r\n\r\n/**\r\n * 订阅主题,并给出处理器函数\r\n * ========================================================================\r\n * @method on\r\n * @param {String} topic - (必须)主题名称\r\n * @param {Function} handler - (必须)主题的处理器函数\r\n * @param {Object} [context] - (可选)指定 this 执行上下文\r\n * @return {String} - 唯一的 token 字符串,例如:'guid-1'。\r\n */\r\nconst on = (topic, handler, context = null) => {\r\n const token = guid()\r\n let subject = typeof topic === 'symbol' ? topic.toString() : topic\r\n\r\n if (!isFunction(handler)) {\r\n return ''\r\n }\r\n\r\n /* istanbul ignore else */\r\n if (!_subscribers[subject]) {\r\n _subscribers[subject] = []\r\n }\r\n\r\n _subscribers[subject].push({\r\n topic: subject,\r\n callback: handler,\r\n context,\r\n token\r\n })\r\n\r\n return token\r\n}\r\n\r\nexport default on\r\n","import isObject from './isObject'\r\n\r\n/**\r\n * 检测测试数据是否为类似 Object 类型\r\n * ========================================================================\r\n * @method isObjectLike\r\n * @param {Object} val - 要检测的数据\r\n * @returns {Boolean} 'val' 是类似 Object 类型,返回 true,否则返回 false\r\n */\r\nconst isObjectLike = (val) => {\r\n return isObject(val) && val !== null\r\n}\r\n\r\nexport default isObjectLike\r\n","import isObjectLike from './isObjectLike'\r\n\r\n/**\r\n * 检测测试数据是否为普通对象\r\n * ========================================================================\r\n * @method isPlainObject\r\n * @param {Object} val - 要检测的数据\r\n * @returns {Boolean} 'val' 是普通对象,返回 true,否则返回 false\r\n */\r\nconst isPlainObject = (val) => {\r\n const getPrototypeOf = Object.getPrototypeOf\r\n let proto\r\n\r\n // Detect obvious negatives\r\n if (!isObjectLike(val)) {\r\n return false\r\n }\r\n\r\n proto = val.prototype\r\n\r\n // JavaScript 对象分为两种:普通对象和函数对象\r\n // 普通对象:原型是 __proto__,没有 prototype 原型(属性)\r\n // 函数对象:原型是 prototype ,prototype 只存在于函数对象上\r\n if (!proto) {\r\n return true\r\n }\r\n\r\n proto = val\r\n\r\n while (getPrototypeOf(proto) !== null) {\r\n proto = getPrototypeOf(proto)\r\n }\r\n\r\n return getPrototypeOf(val) === proto\r\n}\r\n\r\nexport default isPlainObject\r\n","/**\r\n * 移除字符串中的 JavaScript 代码\r\n * ====================================================\r\n * @param {String} str\r\n * @returns {String}\r\n */\r\nconst stripScripts = (str) => {\r\n return str.replace(/]*>.*?<\\/script>/gi, '')\r\n}\r\n\r\nexport default stripScripts\r\n","/**\r\n * 转义字符串中的 HTML 标签\r\n * ========================================================================\r\n * @param {String} str - 需要转义的字符串\r\n * @returns {String}\r\n */\r\nconst encodeHTML = (str) => {\r\n const CHARTS = {\r\n '&': '&',\r\n '<': '<',\r\n '>': '>',\r\n \"'\": ''',\r\n '\"': '"'\r\n }\r\n\r\n return str.replace(/[&<>'\"]/g, (tag) => {\r\n return CHARTS[tag] || tag\r\n })\r\n}\r\n\r\nexport default encodeHTML\r\n","import isArray from '../types/isArray'\r\nimport isString from '../types/isString'\r\nimport isSVG from '../types/isSVG'\r\nimport setAttributes from '../dom/setAttributes'\r\n\r\n/**\r\n * 创建 SVG 图标 DOM 元素\r\n * ========================================================================\r\n * @method createElement\r\n * @param {String} name\r\n * @param {Object} [options]\r\n * @param {Number|Array} [options.size]\r\n * @param {String} [options.color]\r\n * @param {String} [options.iconSet]\r\n * @param {Object} [options.attrs]\r\n * @returns {HTMLElement}\r\n */\r\nconst createElement = (name, options = {}) => {\r\n const ICON = 'outline-icon'\r\n const size = options.size || 0\r\n const color = options.color || ''\r\n const iconSet = options.iconSet || ''\r\n const width = isArray(size) ? size[0] : size\r\n const height = isArray(size) ? size[1] : size\r\n const defaultRules = size ? `width:${width}px;height:${height}px;` : ''\r\n const cssRules = color ? defaultRules + `color:${color}` : defaultRules\r\n const attrs = options.attrs || {}\r\n const $icon = document.createElement('i')\r\n let binds = ''\r\n let svg = ''\r\n let $svg\r\n\r\n if (!isString(name)) {\r\n return null\r\n }\r\n\r\n if (isSVG(name)) {\r\n svg = name\r\n } else {\r\n binds =\r\n iconSet && iconSet !== 'icon'\r\n ? `xlink:href=\"#${iconSet}-icon-${name}\"`\r\n : `xlink:href=\"#icon-${name}\"`\r\n svg = ``\r\n }\r\n\r\n $icon.innerHTML = svg\r\n\r\n if (attrs.className) {\r\n attrs.className = `${ICON} ${attrs.className}`\r\n } else {\r\n attrs.className = ICON\r\n }\r\n\r\n setAttributes($icon, attrs)\r\n\r\n $svg = $icon.querySelector('svg')\r\n setAttributes($svg, {\r\n 'aria-hidden': true,\r\n xmlns: 'http://www.w3.org/2000/svg',\r\n class: 'outline-icon__svg',\r\n width: 200,\r\n height: 200,\r\n style: cssRules\r\n })\r\n\r\n return $icon\r\n}\r\n\r\nexport default createElement\r\n","import isString from './isString'\r\n\r\nconst isSVG = (str) => {\r\n const declaration = '(?:<\\\\?xml[^>]*>\\\\s*)?'\r\n const doctype =\r\n '(?:<\\\\!doctype svg[^>]*\\\\s*(?:\\\\[?(?:\\\\s*]*>\\\\s*)*\\\\]?)*[^>]*>\\\\s*)?'\r\n const content = ']*>[^]*<\\\\/svg>\\\\s*$'\r\n const svg = `^\\\\s*${declaration}${doctype}${content}\\\\s*$`\r\n const pattern = new RegExp(svg, 'i')\r\n\r\n return isString(str) && pattern.test(str)\r\n}\r\n\r\nexport default isSVG\r\n","import createElement from './createElement'\r\n\r\n/**\r\n * 创建 SVG 图标 DOM 元素\r\n * ========================================================================\r\n * @method icon\r\n * @alias createElement\r\n * @see createElement\r\n * @param {String} name\r\n * @param {Object} [options]\r\n * @param {Number|Array} [options.size]\r\n * @param {String} [options.color]\r\n * @param {String} [options.iconSet]\r\n * @returns {HTMLElement}\r\n */\r\nconst icon = (name, options = {}) => {\r\n return createElement(name, options)\r\n}\r\n\r\nexport default icon\r\n","import DEFAULTS from './defaults'\r\n\r\nconst SYMBOLS = [...DEFAULTS]\r\n\r\nexport default SYMBOLS\r\n","const DEFAULTS = [\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n ''\r\n]\r\n\r\nexport default DEFAULTS\r\n","import isString from '../types/isString'\r\nimport getSymbol from './getSymbol'\r\nimport SYMBOLS from './symbols'\r\n\r\n/**\r\n *\r\n * @method getSymbols\r\n * @param {String} [name]\r\n * @param {String} [iconSet]\r\n * @returns {string[]|*}\r\n */\r\nconst getSymbols = (name, iconSet = 'icon') => {\r\n if (isString(name)) {\r\n return getSymbol(name, iconSet)\r\n }\r\n\r\n return [...SYMBOLS]\r\n}\r\n\r\nexport default getSymbols\r\n","import SYMBOLS from './symbols'\r\n\r\n/**\r\n * @method getSymbol\r\n * @param {String} name\r\n * @param {String} [iconSet]\r\n * @returns {String}\r\n */\r\nconst getSymbol = (name, iconSet = 'icon') => {\r\n const patternName = /id=\"(.*?)\"/\r\n const patternSet = /^(\\w+)-/\r\n const symbols = SYMBOLS\r\n\r\n return symbols.find((symbol) => {\r\n const names = patternName.exec(symbol)\r\n const fullName = names[1]\r\n const sets = patternSet.exec(fullName)\r\n const setName = sets[1]\r\n const iconName =\r\n iconSet === 'icon' ? `${iconSet}-${name}` : `${iconSet}-icon-${name}`\r\n\r\n return setName === iconSet && fullName === iconName\r\n })\r\n}\r\n\r\nexport default getSymbol\r\n","import add from './add'\r\nimport getSymbols from './getSymbols'\r\n\r\n/**\r\n * 绘制 SVG 图标集\r\n * ========================================================================\r\n * @method paint\r\n * @param {String|Array} symbol\r\n */\r\nconst paint = (symbol = '') => {\r\n const $body = document.body\r\n let $icons = document.querySelector('#outline-icons')\r\n let symbols = []\r\n\r\n add(symbol)\r\n symbols = getSymbols()\r\n\r\n if ($icons) {\r\n $icons.innerHTML = symbols.join('')\r\n } else {\r\n $icons = document.createElement('div')\r\n $icons.innerHTML =\r\n ``\r\n $body.insertBefore($icons.firstChild, $body.firstChild)\r\n }\r\n}\r\n\r\nexport default paint\r\n","import isArray from '../types/isArray'\r\nimport isString from '../types/isString'\r\nimport SYMBOLS from './symbols'\r\n\r\n/**\r\n * @method add\r\n * @param {Array|String} symbols\r\n * @return {Boolean}\r\n */\r\nconst add = (symbols) => {\r\n if (!symbols) {\r\n return false\r\n }\r\n\r\n if (isArray(symbols) && symbols.length > 0) {\r\n symbols.forEach((symbol) => {\r\n /* istanbul ignore else */\r\n if (SYMBOLS.indexOf(symbol) === -1 && isString(symbol)) {\r\n SYMBOLS.push(symbol)\r\n }\r\n })\r\n } else {\r\n /* istanbul ignore else */\r\n if (isString(symbols)) {\r\n SYMBOLS.push(symbols)\r\n }\r\n }\r\n}\r\n\r\nexport default add\r\n","/**\r\n * 获取 options 节点下匹配 selector 选择器的 DOM 节点\r\n * ========================================================================\r\n * Element.matches() 方法可以用来判断 DOM 元素是否与给定的选择器匹配,事件代理判断是\r\n * 否触发绑定的代理事件回调函数,关键就是使用 Element.matches() 辨别当前事件触发的目\r\n * 标 DOM 元素是否为事件代理所期望触发的目标。\r\n * ========================================================================\r\n * @method matches\r\n * @see https://developer.mozilla.org/en-US/docs/web/api/element/matches\r\n * @param {HTMLElement} el - (必须)DOM 元素\r\n * @param {String} selector - (必须)匹配 DOM 元素的选择器\r\n * @returns {Boolean}\r\n */\r\nconst matches = (el, selector = '') => {\r\n const sel = selector.replace(/^>/i, '')\r\n\r\n if (!selector || !sel || !el) {\r\n return false\r\n }\r\n\r\n /* istanbul ignore else */\r\n if (el.matches) {\r\n return el.matches(sel)\r\n } else if (el.msMatchesSelector) {\r\n return el.msMatchesSelector(sel)\r\n } else {\r\n return false\r\n }\r\n}\r\n\r\nexport default matches\r\n","/**\r\n * 获取 DOM 元素的父节点\r\n * ========================================================================\r\n * @method getParentOrHost\r\n * @param {*|HTMLElement} el - (必须)要获取父节点的 DOM 元素\r\n * @returns {*|HTMLElement}\r\n */\r\nconst getParentOrHost = (el) => {\r\n return el.host && el !== document && el.host.nodeType\r\n ? el.host\r\n : el.parentNode\r\n}\r\n\r\nexport default getParentOrHost\r\n","import closest from '../dom/closest'\r\nimport off from './off'\r\nimport getTarget from './getTarget'\r\n\r\nimport { CAPTURE_EVENTS } from './enum'\r\n\r\n/**\r\n * 绑定代理事件\r\n * ========================================================================\r\n * @method on\r\n * @param {HTMLElement|String|Object} el - (必须)绑定代理事件的 DOM 节点\r\n * @param {String} selector - (必须)事件代理目标 DOM 元素的选择器\r\n * @param {String|Function} type - (必须)事件类型或者事件处理器回调函数\r\n * @param {Function|Object} fn - (可选) 事件处理器回调函数或者传递给事件处理器回调函数的数据对象\r\n * @param {Object|Boolean} [data] - (可选)传递给事件处理器回调函数的数据对象或者事件处理器回调函数的 this 上下文指向,\r\n * @param {Object|Boolean} [context] - (可选)事件处理器回调函数的 this 上下文指向,或者是否仅触发一次\r\n * 当设置为 true 时,则事件处理器回调函数的 this 上下文指向为 data 对象\r\n * @param {Boolean} once - (可选)是否仅触发一次\r\n */\r\nconst on = (el, selector, type, fn, data, context, once = false) => {\r\n // CAPTURE_EVENTS 中的特殊事件,采用事件捕获模型\r\n const capture = CAPTURE_EVENTS.indexOf(type) > -1\r\n\r\n const listener = function (evt) {\r\n const target = getTarget(evt)\r\n // 通过 Element.matches 方法获得点击的目标元素\r\n const delegateTarget = closest(target, selector, el)\r\n let overrideContext = context || el\r\n\r\n evt.delegateTarget = delegateTarget\r\n\r\n // 当设置为 true 时,则事件处理器回调函数的\r\n // this 上下文指向为 data 对象\r\n if (context === true) {\r\n overrideContext = data\r\n }\r\n\r\n /* istanbul ignore else */\r\n if (delegateTarget) {\r\n // 仅触发一次\r\n /* istanbul ignore else */\r\n if (once === true) {\r\n off(el, type, listener)\r\n }\r\n\r\n fn.call(overrideContext, evt, data)\r\n }\r\n }\r\n\r\n if (!el) {\r\n return false\r\n }\r\n\r\n if (!el._listeners) {\r\n el._listeners = []\r\n }\r\n\r\n // 缓存 options 元素绑定的事件处理器\r\n el._listeners.push({\r\n el,\r\n selector,\r\n type,\r\n fn: listener,\r\n data,\r\n context,\r\n capture\r\n })\r\n\r\n // 缓存包装后的事件处理器\r\n fn._delegateListener = listener\r\n\r\n el.addEventListener(type, listener, capture)\r\n}\r\n\r\nexport default on\r\n","import resolveTextNode from '../dom/resolveTextNode'\r\n\r\n/**\r\n * 返回触发事件的 target DOM 元素\r\n * ========================================================================\r\n * @method getTarget\r\n * @param {Event} evt - Event 对象\r\n * @return {HTMLElement} - Event 对象的 target DOM 元素\r\n */\r\nconst getTarget = function (evt) {\r\n const target = evt.target\r\n\r\n return resolveTextNode(target)\r\n}\r\n\r\nexport default getTarget\r\n","/**\r\n * 在某些情况下,某些浏览器(例如:Safari 浏览器)会返回实际的目标元素内部的文本节点。\r\n * resolveTextNode() 方法则会返回实际的目标节点。\r\n * ========================================================================\r\n * @method resolveTextNode\r\n * @param {HTMLElement|Text} el - 要解析的节点\r\n * @return {*|HTMLElement} - 实际的目标 DOM 节点\r\n */\r\nconst resolveTextNode = function (el) {\r\n if (el && el.nodeType === 3) {\r\n return el.parentNode\r\n }\r\n\r\n return el\r\n}\r\n\r\nexport default resolveTextNode\r\n","import matches from './matches'\r\nimport getParentOrHost from './getParentOrHost'\r\n\r\n/**\r\n * 获取 options 元素父元素最近的包含 selector 选择器的元素\r\n * ========================================================================\r\n * @method closest\r\n * @param {HTMLElement} el - (必须)DOM 元素\r\n * @param {String} selector - (必须)DOM 元素的选择其\r\n * @param {HTMLElement} [ctx] - (必须)比对的 DOM 元素\r\n * @param {Boolean} [includeCTX] - (必须)是否包含 context DOM 元素\r\n * @returns {null|HTMLElement} - 返回最接近的 DOM 元素\r\n */\r\nconst closest = (el, selector, ctx, includeCTX) => {\r\n const context = ctx || document\r\n\r\n if (!el) {\r\n return null\r\n }\r\n\r\n do {\r\n /* istanbul ignore else */\r\n if (\r\n (selector != null &&\r\n (selector.startsWith('>')\r\n ? el.parentNode === context && matches(el, selector)\r\n : matches(el, selector))) ||\r\n (includeCTX && el === context)\r\n ) {\r\n return el\r\n }\r\n\r\n /* istanbul ignore else */\r\n if (el === context) {\r\n break\r\n }\r\n\r\n /* jshint boss:true */\r\n } while ((el = getParentOrHost(el)))\r\n}\r\n\r\nexport default closest\r\n","import isString from './utils/types/isString'\r\nimport isPlainObject from './utils/types/isPlainObject'\r\nimport isFunction from './utils/types/isFunction'\r\n\r\nimport extend from './utils/lang/extend'\r\nimport later from './utils/lang/later'\r\nimport stripScripts from './utils/lang/stripScripts'\r\nimport encodeHTML from './utils/lang/encodeHTML'\r\nimport cloneDeep from './utils/lang/cloneDeep'\r\nimport guid from './utils/lang/guid'\r\n\r\nimport createElement from './utils/dom/createElement'\r\nimport addClass from './utils/dom/addClass'\r\nimport removeClass from './utils/dom/removeClass'\r\nimport setAttribute from './utils/dom/setAttribute'\r\nimport setAttributes from './utils/dom/setAttributes'\r\n\r\nimport icon from './utils/icons/icon'\r\nimport paint from './utils/icons/paint'\r\nimport on from './utils/event/on'\r\nimport off from './utils/event/off'\r\n\r\nimport Base from './base'\r\n\r\nconst TYPES = ['info', 'success', 'warning', 'error']\r\nconst instances = []\r\nlet instance\r\n\r\npaint()\r\n\r\nclass Message extends Base {\r\n constructor(options) {\r\n super()\r\n\r\n this._default()\r\n\r\n if (options) {\r\n this.initialize(options)\r\n }\r\n }\r\n\r\n _default() {\r\n this.attrs = cloneDeep(Message.DEFAULTS)\r\n\r\n this.$el = null\r\n this.id = ''\r\n this.closed = false\r\n this.visible = false\r\n this.offset = -50\r\n this.timer = null\r\n this.destroyed = false\r\n\r\n return this\r\n }\r\n\r\n initialize(options) {\r\n this.attr(options)\r\n this.id = this.attr('id')\r\n this.offset = this.attr('offset') || -50\r\n\r\n this.$emit('created', { ...this.attr() })\r\n\r\n this.render().addListeners()\r\n\r\n if (this.attr('visible')) {\r\n this.open()\r\n }\r\n\r\n return this\r\n }\r\n\r\n isClosed() {\r\n return this.closed\r\n }\r\n\r\n isDestroyed() {\r\n return this.destroyed\r\n }\r\n\r\n _getClassName() {\r\n const type = this.attr('type')\r\n const effect = this.attr('effect')\r\n const round = this.attr('round')\r\n const closable = this.attr('closable')\r\n const visible = this.attr('visible')\r\n const customClass = this.attr('customClass')\r\n const className = [\r\n 'outline-message',\r\n `outline-message_${type}`,\r\n `outline-message_${effect}`\r\n ]\r\n\r\n if (round) {\r\n className.push('outline-message_round')\r\n }\r\n\r\n if (!closable) {\r\n className.push('outline-message_full-width')\r\n }\r\n\r\n if (visible) {\r\n className.push('outline-message_visible')\r\n }\r\n\r\n if (customClass) {\r\n className.push(customClass)\r\n }\r\n\r\n return className\r\n }\r\n\r\n render() {\r\n const type = this.attr('type')\r\n const message = this.attr('message')\r\n const effect = this.attr('effect')\r\n const round = this.attr('round')\r\n const closable = this.attr('closable')\r\n const dangerouslyUseHTMLString = this.attr('dangerouslyUseHTMLString')\r\n const className = this._getClassName()\r\n const iconName = effect === 'light' ? `circle-${type}` : type\r\n const children = []\r\n let iconSize = 20\r\n let $type\r\n let $message\r\n let $text\r\n let $close\r\n let $el\r\n\r\n if (round && effect === 'default') {\r\n iconSize = 12\r\n }\r\n\r\n if (effect !== 'plain') {\r\n $type = icon(iconName, {\r\n iconSet: 'outline',\r\n size: iconSize\r\n })\r\n addClass($type, 'outline-message__icon')\r\n children.push($type)\r\n }\r\n\r\n if (!dangerouslyUseHTMLString) {\r\n $text = document.createTextNode(encodeHTML(stripScripts(message)))\r\n } else {\r\n $text = document.createDocumentFragment()\r\n $text.innerHTML = message\r\n }\r\n $message = createElement(\r\n 'p',\r\n {\r\n className: 'outline-message__content'\r\n },\r\n [$text]\r\n )\r\n children.push($message)\r\n\r\n if (closable) {\r\n $close = icon('close', {\r\n iconSet: 'outline',\r\n size: 18\r\n })\r\n addClass($close, 'outline-message__close')\r\n children.push($close)\r\n }\r\n\r\n $el = createElement(\r\n 'div',\r\n {\r\n className: className.join(' ')\r\n },\r\n children\r\n )\r\n $el.style.cssText = `top:-50px;`\r\n this.$el = $el\r\n document.body.appendChild(this.$el)\r\n\r\n this.$emit('mounted')\r\n\r\n return this\r\n }\r\n\r\n _refreshIcon() {\r\n const HIDDEN = '.outline-message_hidden'\r\n const $el = this.$el\r\n let iconSize = 20\r\n let type\r\n let effect\r\n let round\r\n let iconName\r\n let $icon\r\n let $svg\r\n let $use\r\n\r\n if (this.isDestroyed()) {\r\n return this\r\n }\r\n\r\n $icon = $el.querySelector('.outline-icon')\r\n\r\n if (!$icon) {\r\n return this\r\n }\r\n\r\n type = this.attr('type')\r\n effect = this.attr('effect')\r\n round = this.attr('round')\r\n\r\n if (effect === 'plain') {\r\n addClass($icon, HIDDEN)\r\n } else {\r\n removeClass($icon, HIDDEN)\r\n\r\n if (round && effect === 'default') {\r\n iconSize = 12\r\n }\r\n }\r\n\r\n $svg = $icon.querySelector('.outline-icon__svg')\r\n setAttributes($svg, {\r\n style: `width:${iconSize}px;height:${iconSize}px;`\r\n })\r\n\r\n $use = $svg.querySelector('use')\r\n iconName = effect === 'light' ? `circle-${type}` : type\r\n setAttribute($use, 'xlink:href', `#outline-icon-${iconName}`)\r\n\r\n return this\r\n }\r\n\r\n _refreshMessage() {\r\n const $el = this.$el\r\n let $message\r\n let dangerouslyUseHTMLString\r\n let message\r\n let text\r\n\r\n if (this.isDestroyed()) {\r\n return this\r\n }\r\n\r\n $message = $el.querySelector('.outline-message__content')\r\n dangerouslyUseHTMLString = this.attr('dangerouslyUseHTMLString')\r\n message = this.attr('message')\r\n\r\n if (!dangerouslyUseHTMLString) {\r\n text = encodeHTML(stripScripts(message))\r\n } else {\r\n text = message\r\n }\r\n\r\n $message.innerHTML = text\r\n\r\n return this\r\n }\r\n\r\n _refreshClose() {\r\n const HIDDEN = '.outline-message_hidden'\r\n const $el = this.$el\r\n let $close\r\n let closable\r\n\r\n if (this.isDestroyed()) {\r\n return this\r\n }\r\n\r\n $close = $el.querySelector('.outline-message__close')\r\n closable = this.attr('closable')\r\n\r\n if ($close) {\r\n if (closable) {\r\n addClass($close, HIDDEN)\r\n } else {\r\n removeClass($close, HIDDEN)\r\n }\r\n }\r\n\r\n return this\r\n }\r\n\r\n _refreshEl() {\r\n const $el = this.$el\r\n let className\r\n\r\n if (this.isDestroyed()) {\r\n return this\r\n }\r\n\r\n className = this._getClassName()\r\n setAttribute($el, 'className', className.join(' '))\r\n\r\n return this\r\n }\r\n\r\n refresh(options) {\r\n if (!isPlainObject(options)) {\r\n return this\r\n }\r\n\r\n this.attr(options)\r\n ._refreshIcon()\r\n ._refreshMessage()\r\n ._refreshClose()\r\n ._refreshEl()\r\n\r\n return this\r\n }\r\n\r\n clearTimer() {\r\n if (this.isDestroyed()) {\r\n return this\r\n }\r\n\r\n if (this.timer) {\r\n clearTimeout(this.timer)\r\n this.timer = null\r\n }\r\n\r\n return this\r\n }\r\n\r\n startTimer(duration) {\r\n if (this.isDestroyed()) {\r\n return this\r\n }\r\n\r\n this.timer = later(() => {\r\n this.$emit('opened')\r\n this.close()\r\n }, duration * 1000)\r\n\r\n return this\r\n }\r\n\r\n open(options) {\r\n const $el = this.$el\r\n let offset\r\n let duration\r\n let top\r\n let cssRules\r\n\r\n if (this.isDestroyed()) {\r\n return this\r\n }\r\n\r\n if (this.isClosed()) {\r\n this.refresh(options)\r\n }\r\n\r\n offset = this.attr('offset')\r\n duration = this.attr('duration')\r\n top = offset && offset >= this.offset ? offset : this.offset\r\n cssRules = `top:${top}px;`\r\n\r\n this.clearTimer()\r\n\r\n this.$emit('beforeOpen')\r\n\r\n later(() => {\r\n this.visible = true\r\n\r\n addClass($el, 'outline-message_visible')\r\n $el.style.cssText = cssRules\r\n\r\n if (duration > 0) {\r\n this.startTimer(duration)\r\n }\r\n }, 100)\r\n\r\n return this\r\n }\r\n\r\n close() {\r\n const $el = this.$el\r\n const cssRules = `top:-50px;`\r\n let destroyAfterClosed\r\n let beforeClose\r\n\r\n if (this.isDestroyed()) {\r\n return this\r\n }\r\n\r\n destroyAfterClosed = this.attr('destroyAfterClosed')\r\n beforeClose = this.attr('beforeClose')\r\n\r\n if (isFunction(beforeClose)) {\r\n beforeClose.call(this)\r\n }\r\n\r\n $el.style.cssText = cssRules\r\n removeClass($el, 'outline-message_visible')\r\n\r\n this.visible = false\r\n this.closed = true\r\n\r\n later(() => {\r\n this.$emit('closed')\r\n\r\n if (destroyAfterClosed) {\r\n this.destroy()\r\n }\r\n }, 500)\r\n\r\n return this\r\n }\r\n\r\n destroy() {\r\n this.$emit('beforeDestroy')\r\n\r\n if (this.isDestroyed()) {\r\n return this\r\n }\r\n\r\n this.removeListeners()\r\n\r\n document.body.removeChild(this.$el)\r\n\r\n clearTimeout(this.timer)\r\n this._default()\r\n\r\n this.$emit('afterDestroy')\r\n\r\n return this\r\n }\r\n\r\n onMouseEnter() {\r\n this.clearTimer()\r\n return this\r\n }\r\n\r\n onMouseLeave() {\r\n const duration = this.attr('duration')\r\n const delay = this.attr('delay')\r\n\r\n if (duration <= 0) {\r\n return this\r\n }\r\n\r\n this.startTimer(delay)\r\n\r\n return this\r\n }\r\n\r\n onClose() {\r\n this.clearTimer()\r\n this.close()\r\n return this\r\n }\r\n\r\n addListeners() {\r\n const $el = this.$el\r\n\r\n on(\r\n $el,\r\n '.outline-message__content',\r\n 'mouseenter',\r\n this.onMouseEnter,\r\n this,\r\n true\r\n )\r\n on(\r\n $el,\r\n '.outline-message__content',\r\n 'mouseleave',\r\n this.onMouseLeave,\r\n this,\r\n true\r\n )\r\n on($el, '.outline-message__close', 'click', this.onClose, this, true)\r\n\r\n return this\r\n }\r\n\r\n removeListeners() {\r\n const $el = this.$el\r\n\r\n off($el, 'mouseenter', this.onMouseEnter)\r\n off($el, 'mouseleave', this.onMouseLeave)\r\n off($el, 'click', this.onClose)\r\n\r\n return this\r\n }\r\n}\r\n\r\nMessage.DEFAULTS = (() => {\r\n const OPTIONS = {\r\n id: '',\r\n type: 'info',\r\n effect: 'default',\r\n round: false,\r\n offset: 30,\r\n duration: 3,\r\n delay: 2,\r\n message: '',\r\n customClass: '',\r\n closable: true,\r\n visible: true,\r\n dangerouslyUseHTMLString: false,\r\n destroyAfterClosed: true,\r\n beforeClose: null\r\n }\r\n\r\n return cloneDeep(OPTIONS)\r\n})()\r\n\r\nTYPES.forEach((type) => {\r\n Message[type] = (options) => {\r\n const config = {}\r\n const id = guid(`outline-message-`)\r\n const beforeClose = options.beforeClose || null\r\n let offset = options.offset || 30\r\n\r\n if (isString(options)) {\r\n config.message = options\r\n } else {\r\n if (isPlainObject(options)) {\r\n extend(config, options)\r\n }\r\n }\r\n config.id = id\r\n config.type = type\r\n config.offset = offset\r\n config.visible = false\r\n config.beforeClose = () => {\r\n Message.close(id, beforeClose)\r\n }\r\n\r\n instance = new Message(config)\r\n instances.forEach((item) => {\r\n offset += item.$el.offsetHeight + 16\r\n })\r\n instance.offset = offset\r\n instance.open()\r\n instances.push(instance)\r\n\r\n return instance\r\n }\r\n})\r\n\r\n// 关闭指定 id 消息的静态方法\r\nMessage.close = (id, beforeClose) => {\r\n const len = instances.length\r\n let index = -1\r\n let i\r\n let offsetHeight\r\n\r\n instances.forEach((instance, i) => {\r\n // 在 instances 中通过 id 找到要关闭的消息\r\n if (id === instance.id) {\r\n offsetHeight = instance.$el.offsetHeight\r\n index = i\r\n\r\n // 关闭消息\r\n if (isFunction(beforeClose)) {\r\n beforeClose.call(instance)\r\n }\r\n\r\n instances.splice(i, 1)\r\n }\r\n })\r\n\r\n if (len <= 1 || index === -1 || index > instances.length - 1) {\r\n return false\r\n }\r\n\r\n i = index\r\n\r\n // 界面中的消息逐个向上收起\r\n for (; i < len - 1; i += 1) {\r\n const dom = instances[i].$el\r\n\r\n dom.style['top'] = parseInt(dom.style['top'], 10) - offsetHeight - 16 + 'px'\r\n }\r\n}\r\n\r\n// 关闭所有消息的静态方法\r\nMessage.clear = () => {\r\n let i = instances.length - 1\r\n for (; i >= 0; i -= 1) {\r\n instances[i].close()\r\n }\r\n}\r\n\r\nexport default Message\r\n","import isFunction from './utils/types/isFunction'\r\n\r\nclass Command {\r\n constructor(name, action) {\r\n this.name = name\r\n\r\n if (isFunction(action)) {\r\n this.action = action\r\n }\r\n }\r\n\r\n execute() {\r\n this.action()\r\n\r\n return this\r\n }\r\n}\r\n\r\nexport default Command\r\n","import isFunction from './utils/types/isFunction'\r\n\r\nclass Commands {\r\n constructor() {\r\n this.commands = []\r\n }\r\n\r\n get(name) {\r\n return this.commands.find((cmd) => cmd.name === name)\r\n }\r\n\r\n add(command) {\r\n this.commands.push(command)\r\n\r\n return this\r\n }\r\n\r\n del(name) {\r\n const commands = this.commands\r\n const command = commands.find((cmd) => cmd.name === name)\r\n const index = command ? commands.indexOf(command) : -1\r\n\r\n if (index > -1) {\r\n commands.splice(index, 1)\r\n }\r\n\r\n return this\r\n }\r\n\r\n clear() {\r\n this.commands = []\r\n\r\n return this\r\n }\r\n\r\n execute(name) {\r\n const command = this.commands.find((cmd) => cmd.name === name)\r\n\r\n if (isFunction(command?.execute)) {\r\n command.execute()\r\n }\r\n\r\n return this\r\n }\r\n}\r\n\r\nexport default Commands\r\n","import icon from './utils/icons/icon'\r\nimport createElement from './utils/dom/createElement'\r\nimport addClass from './utils/dom/addClass'\r\n\r\nconst _createButton = (button, rounded = true) => {\r\n const $icon = icon(button.icon, {\r\n iconSet: button.iconSet || 'outline',\r\n color: button.color || '',\r\n size: button.size\r\n })\r\n const $anchor = createElement(\r\n 'a',\r\n {\r\n className: `outline-toolbar__anchor`,\r\n href: button.link\r\n },\r\n $icon\r\n )\r\n const $button = createElement(\r\n 'div',\r\n {\r\n className: `outline-toolbar__button ${button.name}`,\r\n 'data-cmd': button.name\r\n },\r\n [button.link ? $anchor : $icon]\r\n )\r\n\r\n addClass($icon, 'outline-toolbar__icon')\r\n\r\n if (rounded) {\r\n addClass($button, 'outline-toolbar_rounded')\r\n }\r\n\r\n if (button.disabled) {\r\n addClass($button, 'outline-toolbar_disabled')\r\n }\r\n\r\n return $button\r\n}\r\n\r\nexport default _createButton\r\n","import isString from './utils/types/isString'\r\nimport isFunction from './utils/types/isFunction'\r\nimport isObject from './utils/types/isObject'\r\nimport isArray from './utils/types/isArray'\r\nimport later from './utils/lang/later'\r\nimport guid from './utils/lang/guid'\r\nimport cloneDeep from './utils/lang/cloneDeep'\r\nimport createElement from './utils/dom/createElement'\r\nimport addClass from './utils/dom/addClass'\r\nimport hasClass from './utils/dom/hasClass'\r\nimport removeClass from './utils/dom/removeClass'\r\nimport on from './utils/event/on'\r\nimport off from './utils/event/off'\r\nimport paint from './utils/icons/paint'\r\n\r\nimport Base from './base'\r\nimport Command from './command'\r\nimport Commands from './commands'\r\n\r\nimport _createButton from './_createButton'\r\n\r\nconst DISABLED = 'outline-toolbar_disabled'\r\nconst HIDDEN = 'outline-toolbar_hidden'\r\nconst ACTIVE = 'outline-toolbar_active'\r\n\r\nclass Toolbar extends Base {\r\n constructor(options) {\r\n super()\r\n\r\n this._default()\r\n\r\n if (options) {\r\n this.initialize(options)\r\n }\r\n }\r\n\r\n _default() {\r\n this.attrs = cloneDeep(Toolbar.DEFAULTS)\r\n\r\n this.disabled = false\r\n this.closed = false\r\n\r\n this.$el = null\r\n this.buttons = []\r\n this.commands = null\r\n\r\n return this\r\n }\r\n\r\n initialize(options) {\r\n let created\r\n\r\n this.attr(options)\r\n\r\n this.disabled = this.attr('disabled')\r\n this.closed = this.attr('closed')\r\n this.commands = new Commands()\r\n\r\n created = this.attr('created')\r\n\r\n if (isFunction(created)) {\r\n created.call(this)\r\n }\r\n\r\n this.render().addListeners()\r\n\r\n return this\r\n }\r\n\r\n isHighlight(name) {\r\n const button = this.get(name)\r\n\r\n if (!button) {\r\n return false\r\n }\r\n\r\n return hasClass(button.$el, ACTIVE)\r\n }\r\n\r\n isDisabled(name) {\r\n let button\r\n\r\n if (name) {\r\n button = this.get(name)\r\n\r\n return button.disabled\r\n }\r\n\r\n return this.disabled\r\n }\r\n\r\n isExist(name) {\r\n const button = this.get(name)\r\n return !!button\r\n }\r\n\r\n isClosed() {\r\n return this.closed\r\n }\r\n\r\n _getCommand(button) {\r\n const _self = this\r\n const { action, name } = button\r\n let command = null\r\n let handler = null\r\n let context\r\n let listener\r\n\r\n if (!action) {\r\n return command\r\n }\r\n\r\n handler = action.handler\r\n context = action.context || this\r\n\r\n if (isFunction(handler)) {\r\n listener = handler\r\n } else if (isString(handler)) {\r\n listener = function () {\r\n _self.$emit(handler, name)\r\n }\r\n }\r\n\r\n if (isFunction(listener)) {\r\n command = new Command(name, listener.bind(context))\r\n }\r\n\r\n return command\r\n }\r\n\r\n get(name) {\r\n return this.buttons.find((button) => button.name === name)\r\n }\r\n\r\n render() {\r\n const mounted = this.attr('mounted')\r\n const buttons = this.attr('buttons') || []\r\n const placement = this.attr('placement')\r\n\r\n paint()\r\n\r\n this.$el = createElement('div', {\r\n id: guid('outline-toolbar'),\r\n className: `outline-toolbar outline-toolbar_${placement}`\r\n })\r\n this._paint(buttons)\r\n document.body.appendChild(this.$el)\r\n\r\n if (this.closed) {\r\n this.hide()\r\n }\r\n\r\n if (this.disabled) {\r\n this.disable()\r\n }\r\n\r\n if (isFunction(mounted)) {\r\n mounted.call(this)\r\n }\r\n\r\n return this\r\n }\r\n\r\n erase() {\r\n this.$el.innerHTML = ''\r\n return this\r\n }\r\n\r\n _paint(buttons) {\r\n const rounded = this.attr('rounded')\r\n const $fragment = document.createDocumentFragment()\r\n\r\n buttons.forEach((button) => {\r\n const $button = _createButton(button, rounded)\r\n const command = this._getCommand(button)\r\n const { name, disabled, context } = button\r\n\r\n $fragment.appendChild($button)\r\n\r\n if (!this.isExist(name)) {\r\n this.buttons.push({\r\n $el: $button,\r\n name,\r\n disabled: disabled || false,\r\n context: context || this\r\n })\r\n\r\n if (command) {\r\n this.commands.add(command)\r\n }\r\n }\r\n })\r\n\r\n this.$el.appendChild($fragment)\r\n\r\n return this\r\n }\r\n\r\n _remove() {\r\n document.body.removeChild(this.$el)\r\n return this\r\n }\r\n\r\n refresh(buttons) {\r\n this.attr({ buttons })\r\n this.erase()._paint(buttons)\r\n return this\r\n }\r\n\r\n add(button) {\r\n const $el = this.$el\r\n const $fragment = document.createDocumentFragment()\r\n const buttons = this.attr('buttons') || []\r\n const { name, disabled, context } = button\r\n const command = this._getCommand(button)\r\n const _add = (button) => {\r\n const $button = _createButton(button)\r\n\r\n $fragment.appendChild($button)\r\n\r\n buttons.push(button)\r\n this.buttons.push({\r\n $el: $button,\r\n name,\r\n disabled: disabled || false,\r\n context: context || this,\r\n command\r\n })\r\n\r\n if (command) {\r\n this.commands.add(command)\r\n }\r\n }\r\n\r\n if (isObject(button)) {\r\n _add(button)\r\n } else if (isArray(button)) {\r\n button.forEach((item) => {\r\n if (isObject(item)) {\r\n _add(item)\r\n }\r\n })\r\n }\r\n $el.appendChild($fragment)\r\n\r\n return this\r\n }\r\n\r\n remove(name) {\r\n const $el = this.$el\r\n const buttons = this.buttons\r\n const button = this.get(name)\r\n let index = -1\r\n\r\n if (!button) {\r\n return this\r\n }\r\n\r\n index = buttons.indexOf(button)\r\n\r\n if (index > -1) {\r\n buttons.splice(index, 1)\r\n this.attr('buttons').splice(index, 1)\r\n }\r\n\r\n this._disable(name)\r\n $el.removeChild(button.$el)\r\n\r\n return this\r\n }\r\n\r\n _disable(name) {\r\n const button = this.get(name)\r\n const command = this.commands.get(name)\r\n\r\n if (!button || button.disabled) {\r\n return this\r\n }\r\n\r\n button.disabled = true\r\n\r\n if (command) {\r\n this.commands.del(command)\r\n }\r\n\r\n addClass(button.$el, DISABLED)\r\n\r\n return this\r\n }\r\n\r\n _enable(name) {\r\n const button = this.get(name)\r\n const command = this.commands.get(name)\r\n\r\n if (!button || !button.disabled) {\r\n return this\r\n }\r\n\r\n button.disabled = false\r\n\r\n if (command) {\r\n this.commands.add(command)\r\n }\r\n\r\n removeClass(button.$el, DISABLED)\r\n\r\n return this\r\n }\r\n\r\n disable(name) {\r\n const disabled = this.attr('afterDisabled')\r\n\r\n if (name) {\r\n this._disable(name)\r\n } else {\r\n addClass(this.$el, DISABLED)\r\n this.removeListeners()\r\n this.disabled = true\r\n\r\n if (isFunction(disabled)) {\r\n disabled.call(this)\r\n }\r\n }\r\n\r\n return this\r\n }\r\n\r\n enable(name) {\r\n const enabled = this.attr('afterEnabled')\r\n\r\n if (name) {\r\n this._enable(name)\r\n } else {\r\n this.disabled = false\r\n removeClass(this.$el, DISABLED)\r\n this.addListeners()\r\n\r\n if (isFunction(enabled)) {\r\n enabled.call(this)\r\n }\r\n }\r\n\r\n return this\r\n }\r\n\r\n show(name) {\r\n const opened = this.attr('afterOpened')\r\n const button = this.get(name)\r\n const $el = this.$el\r\n\r\n if (name) {\r\n if (!button) {\r\n return this\r\n }\r\n\r\n removeClass(button.$el, HIDDEN)\r\n } else {\r\n removeClass($el, HIDDEN)\r\n this.closed = false\r\n\r\n if (isFunction(opened)) {\r\n later(() => {\r\n opened.call(this)\r\n }, 310)\r\n }\r\n }\r\n\r\n return this\r\n }\r\n\r\n hide(name) {\r\n const closed = this.attr('afterClosed')\r\n const button = this.get(name)\r\n const $el = this.$el\r\n\r\n if (name) {\r\n if (!button) {\r\n return this\r\n }\r\n\r\n addClass(button.$el, HIDDEN)\r\n } else {\r\n addClass($el, HIDDEN)\r\n this.closed = true\r\n\r\n if (isFunction(closed)) {\r\n later(() => {\r\n closed.call(this)\r\n }, 310)\r\n }\r\n }\r\n\r\n return this\r\n }\r\n\r\n toggle(name) {\r\n if (this.isClosed()) {\r\n this.show(name)\r\n } else {\r\n this.hide(name)\r\n }\r\n\r\n return this\r\n }\r\n\r\n highlight(name) {\r\n const button = this.get(name)\r\n let $button\r\n\r\n if (!button) {\r\n return this\r\n }\r\n\r\n $button = button.$el\r\n\r\n if (hasClass($button, ACTIVE)) {\r\n removeClass($button, ACTIVE)\r\n } else {\r\n addClass($button, ACTIVE)\r\n }\r\n\r\n return this\r\n }\r\n\r\n destroy() {\r\n const beforeDestroy = this.attr('beforeDestroy')\r\n const afterDestroy = this.attr('afterDestroy')\r\n\r\n if (isFunction(beforeDestroy)) {\r\n beforeDestroy.call(this)\r\n }\r\n\r\n this.commands.clear()\r\n this.removeListeners()._remove()._default()\r\n\r\n if (isFunction(afterDestroy)) {\r\n afterDestroy.call(this)\r\n }\r\n\r\n return this\r\n }\r\n\r\n execute(name) {\r\n if (this.isDisabled(name)) {\r\n return this\r\n }\r\n\r\n this.commands.execute(name)\r\n\r\n return this\r\n }\r\n\r\n onExecute(evt) {\r\n const $button = evt.delegateTarget\r\n let cmd = ''\r\n\r\n if ($button) {\r\n cmd = $button.getAttribute('data-cmd')\r\n\r\n if (cmd) {\r\n this.execute(cmd)\r\n }\r\n }\r\n\r\n return this\r\n }\r\n\r\n _updateToolbar({ top, min, max }) {\r\n const current = Math.ceil(top)\r\n\r\n if (current <= min) {\r\n this.hide('up')\r\n this.show('down')\r\n } else if (current >= max) {\r\n this.hide('down')\r\n this.show('up')\r\n } else if (current > min && current < max) {\r\n this.show('up')\r\n this.show('down')\r\n }\r\n\r\n return this\r\n }\r\n\r\n onToolbarUpdate({ top, min, max }) {\r\n this._updateToolbar({ top, min, max })\r\n return this\r\n }\r\n\r\n onAddButton(buttons) {\r\n this.attr({\r\n buttons\r\n })\r\n this.refresh(buttons)\r\n\r\n return this\r\n }\r\n\r\n onRemoveButton(name) {\r\n this.remove(name)\r\n return this\r\n }\r\n\r\n addListeners() {\r\n const buttons = this.attr('buttons') || []\r\n const $el = this.$el\r\n\r\n if (!buttons || buttons.length < 1) {\r\n return this\r\n }\r\n\r\n on($el, `.outline-toolbar__button`, 'click', this.onExecute, this, true)\r\n\r\n this.$on('toolbar:update', this.onToolbarUpdate)\r\n this.$on('toolbar:add:button', this.onAddButton)\r\n this.$on('toolbar:remove:button', this.onRemoveButton)\r\n this.$on('toolbar:toggle', this.toggle)\r\n\r\n return this\r\n }\r\n\r\n removeListeners() {\r\n const buttons = this.attr('buttons') || []\r\n const $el = this.$el\r\n\r\n if (!buttons || buttons.length < 1) {\r\n return this\r\n }\r\n\r\n off($el, '.outline-toolbar__button', this.onExecute)\r\n\r\n this.$off('toolbar:update')\r\n this.$off('toolbar:add:button')\r\n this.$off('toolbar:remove:button')\r\n this.$off('toolbar:toggle')\r\n\r\n return this\r\n }\r\n}\r\n\r\nToolbar.DEFAULTS = (() => {\r\n const OPTIONS = {\r\n placement: 'ltr',\r\n closed: false,\r\n disabled: false,\r\n rounded: true,\r\n buttons: [],\r\n created: null,\r\n mounted: null,\r\n afterClosed: null,\r\n afterOpened: null,\r\n afterDisabled: null,\r\n afterEnabled: null,\r\n beforeDestroy: null,\r\n afterDestroy: null\r\n }\r\n\r\n return cloneDeep(OPTIONS)\r\n})()\r\n\r\nexport default Toolbar\r\n","import publish from './utils/observer/emit'\r\n\r\nclass Speech {\r\n constructor(options) {\r\n this.utterance = new SpeechSynthesisUtterance()\r\n\r\n if (options) {\r\n this.initialize(options)\r\n }\r\n }\r\n\r\n _initialize(options) {\r\n if (options.lang) {\r\n this.setLang(options.lang)\r\n }\r\n\r\n if (options.pitch) {\r\n this.setPitch(options.pitch)\r\n }\r\n\r\n if (options.rate) {\r\n this.setRate(options.rate)\r\n }\r\n\r\n if (options.text) {\r\n this.setText(options.text)\r\n }\r\n\r\n if (options.voice) {\r\n this.setVoice(options.voice)\r\n }\r\n\r\n if (options.volume) {\r\n this.setVolume(options.volume)\r\n }\r\n\r\n return this\r\n }\r\n\r\n initialize(options) {\r\n this._initialize(options)._addListeners()\r\n return this\r\n }\r\n\r\n isSpeaking() {\r\n return speechSynthesis.speaking\r\n }\r\n\r\n isPending() {\r\n return speechSynthesis.pending\r\n }\r\n\r\n isPaused() {\r\n return speechSynthesis.paused\r\n }\r\n\r\n getVoices() {\r\n return speechSynthesis.getVoices()\r\n }\r\n\r\n setLang(lang) {\r\n this.utterance.lang = lang\r\n return this\r\n }\r\n\r\n setPitch(pitch) {\r\n this.utterance.pitch = pitch\r\n return this\r\n }\r\n\r\n setRate(rate) {\r\n this.utterance.rate = rate\r\n return this\r\n }\r\n\r\n setText(text) {\r\n this.utterance.text = text\r\n return this\r\n }\r\n\r\n setVoice(voice) {\r\n this.utterance.voice = voice\r\n return this\r\n }\r\n\r\n setVolume(volume) {\r\n this.utterance.volume = volume\r\n return this\r\n }\r\n\r\n speak(text) {\r\n if (text) {\r\n this.setText(text)\r\n }\r\n\r\n speechSynthesis.speak(this.utterance)\r\n\r\n return this\r\n }\r\n\r\n pause() {\r\n speechSynthesis.pause()\r\n return this\r\n }\r\n\r\n resume() {\r\n speechSynthesis.resume()\r\n return this\r\n }\r\n\r\n cancel() {\r\n speechSynthesis.cancel()\r\n this.setText('')\r\n return this\r\n }\r\n\r\n _addListeners() {\r\n const UTTERANCE_EVENTS = [\r\n 'boundary',\r\n 'end',\r\n 'error',\r\n 'start',\r\n 'mark',\r\n 'pause',\r\n 'resume'\r\n ]\r\n const utterance = this.utterance\r\n const speech = this\r\n\r\n UTTERANCE_EVENTS.forEach((name) => {\r\n utterance[`on${name}`] = (event) => {\r\n publish(name, {\r\n event,\r\n speech\r\n })\r\n }\r\n })\r\n\r\n speechSynthesis.onvoiceschanged = (event) => {\r\n publish('voiceschanged', {\r\n event,\r\n speech\r\n })\r\n }\r\n\r\n return this\r\n }\r\n}\r\n\r\nSpeech.isSupport = (() => {\r\n return 'speechSynthesis' in window\r\n})()\r\n\r\nexport default Speech\r\n","import addClass from './utils/dom/addClass'\r\n\r\nconst _updateSiblingElements = (siblingElement, isPrev) => {\r\n let tagName\r\n let $sibling = siblingElement\r\n\r\n while ($sibling) {\r\n tagName = $sibling.tagName.toLowerCase()\r\n\r\n if (tagName !== 'script' && tagName !== 'style') {\r\n addClass($sibling, 'outline-reader_sibling')\r\n }\r\n\r\n if (isPrev) {\r\n $sibling = $sibling.previousElementSibling\r\n } else {\r\n $sibling = $sibling.nextElementSibling\r\n }\r\n }\r\n}\r\n\r\nexport default _updateSiblingElements\r\n","/**\r\n * 检测当前设备是否为移动设备\r\n * ========================================================================\r\n * @method isMobile\r\n * @return {boolean}\r\n */\r\nconst isMobile = () => {\r\n const ua = navigator.userAgent\r\n\r\n return /Mobile|mini|Fennec|Android|iP(ad|od|hone)|NokiaN[^/]*/.test(ua)\r\n}\r\n\r\nexport default isMobile\r\n","import cloneDeep from './utils/lang/cloneDeep'\r\nimport later from './utils/lang/later'\r\nimport isString from './utils/types/isString'\r\nimport isElement from './utils/types/isElement'\r\nimport isFunction from './utils/types/isFunction'\r\nimport createElement from './utils/dom/createElement'\r\nimport addClass from './utils/dom/addClass'\r\nimport removeClass from './utils/dom/removeClass'\r\nimport at from './utils/event/at'\r\nimport stop from './utils/event/stop'\r\nimport off from './utils/event/off'\r\n\r\nimport Base from './base'\r\nimport Message from './message'\r\nimport Toolbar from './toolbar'\r\nimport Speech from './speech'\r\n\r\nimport _updateSiblingElements from './_updateSiblingElements'\r\nimport isMobile from './utils/dom/isMobile'\r\n\r\nconst ENTER_READING_TIP = '进入阅读模式,按 ESC 键可退出阅读模式'\r\n\r\nclass Reader extends Base {\r\n constructor(options) {\r\n super()\r\n\r\n this._default()\r\n\r\n if (options) {\r\n this.initialize(options)\r\n }\r\n }\r\n\r\n _default() {\r\n this.attrs = cloneDeep(Reader.DEFAULTS)\r\n this.reading = false\r\n\r\n this.$target = null\r\n this.$el = null\r\n this.$paper = null\r\n this.$title = null\r\n this.$article = null\r\n this.$progress = null\r\n\r\n this.toolbar = null\r\n this.speech = null\r\n\r\n return this\r\n }\r\n\r\n initialize(options) {\r\n let target\r\n\r\n this.attr(options)\r\n\r\n target = this.attr('target')\r\n\r\n if (isString(target)) {\r\n this.$target = document.querySelector(target)\r\n } else if (isElement(target)) {\r\n this.$target = target\r\n }\r\n\r\n if (!this.$target) {\r\n return this\r\n }\r\n\r\n if (Speech.isSupport) {\r\n this.speech = new Speech()\r\n }\r\n\r\n this.render().addListeners()\r\n\r\n return this\r\n }\r\n\r\n isSpeaking() {\r\n return this?.speech?.isSpeaking()\r\n }\r\n\r\n render() {\r\n this._renderEdge()._paint(this.$target)\r\n return this\r\n }\r\n\r\n erase() {\r\n this.$article.innerHTML = ''\r\n return this\r\n }\r\n\r\n _paint($content) {\r\n const $fragment = document.createDocumentFragment()\r\n const $children = [...$content.cloneNode(true).children]\r\n\r\n later(() => {\r\n $children.forEach(($child) => {\r\n $fragment.appendChild($child)\r\n })\r\n\r\n this.$article.appendChild($fragment)\r\n })\r\n\r\n return this\r\n }\r\n\r\n _remove() {\r\n const $el = this.$el\r\n const toolbar = this.toolbar\r\n\r\n if ($el) {\r\n document.body.removeChild($el)\r\n }\r\n\r\n if (toolbar) {\r\n toolbar.destroy()\r\n }\r\n\r\n return this\r\n }\r\n\r\n refresh() {\r\n this.erase()._paint(this.$target)\r\n return this\r\n }\r\n\r\n _animateTimeline() {\r\n // eslint-disable-next-line\r\n if (!window.ScrollTimeline || !isMobile()) {\r\n return this\r\n }\r\n\r\n this.$progress.animate(\r\n {\r\n // from\r\n scale: ['0 1', '1 1']\r\n },\r\n {\r\n // eslint-disable-next-line\r\n timeline: new ScrollTimeline({\r\n source: this.$article,\r\n axis: 'block'\r\n })\r\n }\r\n )\r\n\r\n return this\r\n }\r\n\r\n _renderEdge() {\r\n const $target = this.$target\r\n const mobile = isMobile()\r\n const size = mobile ? 26 : 20\r\n let title = this.attr('title')\r\n let $el\r\n let $paper\r\n let $title\r\n let $article\r\n let $progress\r\n let $sibling\r\n\r\n $progress = createElement('div', {\r\n className: 'outline-reader__progress'\r\n })\r\n this.$progress = $progress\r\n\r\n $title = $target.querySelector('h1')\r\n\r\n if (isElement(title)) {\r\n $title = title\r\n }\r\n\r\n if (isElement($title)) {\r\n title = $title.innerText\r\n }\r\n\r\n $title = createElement(\r\n 'h1',\r\n {\r\n className: 'outline-reader__title'\r\n },\r\n title\r\n )\r\n this.$title = $title\r\n\r\n $article = createElement(\r\n 'article',\r\n {\r\n id: 'outline-reader__article',\r\n className: 'outline-reader__article'\r\n },\r\n isMobile() ? [] : [$progress.cloneNode()]\r\n )\r\n this.$article = $article\r\n\r\n $paper = createElement(\r\n 'div',\r\n {\r\n id: 'outline-reader__paper',\r\n className: 'outline-reader__paper'\r\n },\r\n [$title, $article]\r\n )\r\n this.$paper = $paper\r\n\r\n const buttons = []\r\n\r\n buttons.push({\r\n name: 'print',\r\n icon: 'print',\r\n size,\r\n action: {\r\n context: this,\r\n handler: this.print\r\n }\r\n })\r\n\r\n if (Speech.isSupport && this.attr('allowSpeak')) {\r\n buttons.push({\r\n name: 'speak',\r\n icon: 'sound',\r\n size,\r\n action: {\r\n context: this,\r\n handler: this.speak\r\n }\r\n })\r\n }\r\n\r\n buttons.push({\r\n name: 'exit',\r\n icon: 'close',\r\n size,\r\n action: {\r\n context: this,\r\n handler: this.exit\r\n }\r\n })\r\n\r\n this.toolbar = new Toolbar({\r\n placement: 'rtl',\r\n buttons\r\n })\r\n\r\n $el = createElement(\r\n 'section',\r\n {\r\n id: 'outline-reader',\r\n className: 'outline-reader outline-reader_hidden'\r\n },\r\n [$progress, $paper, this.toolbar.$el]\r\n )\r\n this.$el = $el\r\n\r\n document.body.appendChild($el)\r\n\r\n this._animateTimeline()\r\n\r\n later(() => {\r\n // 设置邻居节点的打印样式\r\n $sibling = $el.previousElementSibling\r\n _updateSiblingElements($sibling, true)\r\n\r\n $sibling = $el.nextElementSibling\r\n _updateSiblingElements($sibling)\r\n })\r\n\r\n return this\r\n }\r\n\r\n enter() {\r\n const READER = 'outline-reader'\r\n const READING = `${READER}--reading`\r\n const HIDDEN = `${READER}_hidden`\r\n const $el = this.$el\r\n const $siblings = document.querySelectorAll('.outline-reader_sibling')\r\n const enterReadingTip = this.attr('enterReadingTip') || ENTER_READING_TIP\r\n\r\n if (this.reading || !$el) {\r\n return this\r\n }\r\n\r\n $siblings.forEach(($sibling) => {\r\n addClass($sibling, HIDDEN)\r\n })\r\n addClass($el, READING)\r\n removeClass($el, HIDDEN)\r\n this.toolbar.show()\r\n this.reading = true\r\n\r\n Message.info({\r\n round: true,\r\n message: enterReadingTip\r\n })\r\n\r\n this.$emit('reader:enter')\r\n\r\n return this\r\n }\r\n\r\n exit() {\r\n const SPEAK = 'speak'\r\n const READER = 'outline-reader'\r\n const READING = `${READER}--reading`\r\n const HIDDEN = `${READER}_hidden`\r\n const $el = this.$el\r\n const $siblings = document.querySelectorAll('.outline-reader_sibling')\r\n const speech = this.speech\r\n const toolbar = this.toolbar\r\n\r\n if (!this.reading || !$el) {\r\n return this\r\n }\r\n\r\n addClass($el, HIDDEN)\r\n removeClass($el, READING)\r\n $siblings.forEach(($sibling) => {\r\n removeClass($sibling, HIDDEN)\r\n })\r\n toolbar.hide()\r\n this.reading = false\r\n\r\n if (speech) {\r\n if (toolbar.isHighlight(SPEAK)) {\r\n toolbar.highlight(SPEAK)\r\n }\r\n\r\n speech.cancel()\r\n }\r\n\r\n this.$emit('reader:exit')\r\n\r\n return this\r\n }\r\n\r\n toggle() {\r\n if (this.reading) {\r\n this.exit()\r\n } else {\r\n this.enter()\r\n }\r\n\r\n return this\r\n }\r\n\r\n speak() {\r\n const text = this.$article.innerText\r\n const speech = this.speech\r\n\r\n if (!Speech.isSupport || !speech) {\r\n return this\r\n }\r\n\r\n this.toolbar.highlight('speak')\r\n\r\n if (this.isSpeaking()) {\r\n speech.cancel()\r\n } else {\r\n speech.speak(text)\r\n }\r\n\r\n return this\r\n }\r\n\r\n print() {\r\n if (!isFunction(print)) {\r\n return this\r\n }\r\n\r\n print()\r\n\r\n return this\r\n }\r\n\r\n destroy() {\r\n const $el = this.$el\r\n\r\n if (!$el) {\r\n return this\r\n }\r\n\r\n this.removeListeners()._remove()._default()\r\n\r\n return this\r\n }\r\n\r\n onPrint() {\r\n this.print()\r\n return this\r\n }\r\n\r\n onEnterReading() {\r\n this.toggle()\r\n return this\r\n }\r\n\r\n onExitReading(evt) {\r\n const keyCode = evt.keyCode\r\n\r\n if (keyCode === 27 && this.reading) {\r\n this.toggle()\r\n stop(evt)\r\n }\r\n\r\n return this\r\n }\r\n\r\n onRefresh() {\r\n this.refresh()\r\n\r\n return this\r\n }\r\n\r\n addListeners() {\r\n const $el = this.$el\r\n\r\n if (!$el) {\r\n return this\r\n }\r\n\r\n at(document, 'keyup', this.onExitReading, this, true)\r\n\r\n this.$on('toolbar:action:print', this.onPrint)\r\n this.$on('toolbar:action:reading', this.onEnterReading)\r\n this.$on('reader:print', this.onPrint)\r\n this.$on('reader:refresh', this.onRefresh)\r\n this.$on('reader:enter', this.enter)\r\n this.$on('reader:exit', this.exit)\r\n this.$on('reader:toggle', this.toggle)\r\n\r\n return this\r\n }\r\n\r\n removeListeners() {\r\n const $el = this.$el\r\n\r\n if (!$el) {\r\n return this\r\n }\r\n\r\n off(document, 'keyup', this.onExitReading)\r\n\r\n this.$off('toolbar:action:print')\r\n this.$off('toolbar:action:reading')\r\n this.$off('reader:refresh')\r\n this.$off('reader:toggle')\r\n\r\n return this\r\n }\r\n}\r\n\r\nReader.DEFAULTS = (() => {\r\n const OPTIONS = {\r\n target: '',\r\n title: '',\r\n enterReadingTip: ENTER_READING_TIP,\r\n allowSpeak: false\r\n }\r\n\r\n return cloneDeep(OPTIONS)\r\n})()\r\n\r\nexport default Reader\r\n","/**\r\n * 停止事件(阻止默认行为和阻止事件的捕获或冒泡)\r\n * ========================================================================\r\n * @method stop\r\n * @param {Event} evt - 事件对象\r\n *\r\n * @example\r\n *
\r\n * Service\r\n * Help\r\n *
\r\n *\r\n * const $nav = document.querySelector('#nav')\r\n * const $service = document.querySelector('.anchor')\r\n *\r\n * on($nav, 'click', function(evt) {\r\n * console.log('你点击了导航栏')\r\n * })\r\n *\r\n * on($anchor, 'click', function(evt) {\r\n * console.log('tagName', this.tagName)\r\n *\r\n * // 工作台输出:'a'\r\n * // 不会触发事件冒泡,输出:'你点击了导航栏'\r\n * // 也不会切换到 href 属性的页面,阻止了点击链接的默认行为\r\n * stopEvent(evt)\r\n * })\r\n */\r\nconst stop = function (evt) {\r\n evt.stopPropagation()\r\n evt.preventDefault()\r\n}\r\n\r\nexport default stop\r\n","import isFunction from '../types/isFunction'\r\nimport off from './off'\r\n\r\nimport { CAPTURE_EVENTS } from './enum'\r\n\r\n/**\r\n * 绑定事件\r\n * ========================================================================\r\n * @method at\r\n * @param {HTMLElement|String|Object} el - (必须)绑定代理事件的 DOM 节点\r\n * @param {String|Function} type - (必须)事件类型或者事件处理器回调函数\r\n * @param {Function|Object} fn - (必须) 事件处理器回调函数或者传递给事件处理器回调函数的数据对象\r\n * @param {Object|Boolean} [data] - (可选)传递给事件处理器回调函数的数据对象或者事件处理器回调函数的 this 上下文指向,\r\n * @param {Object|Boolean} [context] - (可选)事件处理器回调函数的 this 上下文指向,或者是否仅触发一次\r\n * 当设置为 true 时,则事件处理器回调函数的 this 上下文指向为 data 对象\r\n * @param {Boolean} once - (可选)是否仅触发一次\r\n */\r\nconst at = (el, type, fn, data, context, once = false) => {\r\n // CAPTURE_EVENTS 中的特殊事件,采用事件捕获模型\r\n const capture = CAPTURE_EVENTS.indexOf(type) > -1\r\n const listener = function (evt) {\r\n let overrideContext = context || el\r\n\r\n // 当设置为 true 时,则事件处理器回调函数的\r\n // this 上下文指向为 data 对象\r\n if (context === true) {\r\n overrideContext = data\r\n }\r\n\r\n // 仅触发一次\r\n /* istanbul ignore else */\r\n if (once === true) {\r\n off(el, type, listener)\r\n }\r\n\r\n fn.call(overrideContext, evt, data)\r\n }\r\n\r\n if (!isFunction(fn)) {\r\n return false\r\n }\r\n\r\n if (!el._listeners) {\r\n el._listeners = []\r\n }\r\n\r\n // 缓存 options 元素绑定的事件处理器\r\n el._listeners.push({\r\n el,\r\n type,\r\n fn: listener,\r\n data,\r\n context,\r\n capture\r\n })\r\n\r\n // 缓存包装后的事件处理器\r\n fn._delegateListener = listener\r\n\r\n el.addEventListener(type, listener, capture)\r\n}\r\n\r\nexport default at\r\n"],"names":["toString","val","Object","prototype","apply","isFunction","isObject","o","isArray","Array","cloneDeep","obj","clone","from","assign","keys","forEach","key","later","fn","delay","setTimeout","isString","str","isElement","nodeName","tagName","nodeType","isDOM","el","isHTMLCollection","fragment","isTextNode","hasOwn","prop","hasOwnProperty","call","hasClass","className","pattern","RegExp","allClass","classList","contains","exec","addClass","_classList","add","indexOf","split","name","length","setAttribute","attr","value","toLowerCase","style","cssText","innerHTML","innerText","setAttributes","attrs","createElement","children","$fragment","document","createDocumentFragment","$el","isValidChild","child","append","$child","createTextNode","appendChild","every","removeClass","remove","replace","CAPTURE_EVENTS","_off","type","capture","_delegateListener","listeners","_listeners","index","listener","i","handler","splice","_delete","removeEventListener","purgeElement","recurse","$element","querySelector","$children","childNodes","getListeners","filter","arguments","off","extend","origin","source","_subscribers","_hasDirectSubscribersFor","topic","has","isDirect","found","position","lastIndexOf","substring","_hasSubscribers","emit","data","async","execute","subscriber","message","callback","context","deliver","guid","uuid","prefix","_removeSubscriber","token","subject","execution","j","_removeSubscriberByToken","Base","constructor","options","this","initialize","render","addListeners","refresh","destroy","removeListeners","reload","$emit","event","publish","$on","on","push","subscribe","$off","unsubscribe","isPlainObject","getPrototypeOf","proto","isObjectLike","stripScripts","encodeHTML","CHARTS","tag","ICON","size","color","iconSet","width","height","defaultRules","cssRules","$icon","$svg","binds","svg","test","isSVG","xmlns","class","icon","SYMBOLS","_maybeArrayLike","_toConsumableArray","getSymbols","getSymbol","patternName","patternSet","find","symbol","fullName","paint","$body","body","$icons","symbols","join","insertBefore","firstChild","matches","selector","sel","msMatchesSelector","getParentOrHost","host","parentNode","once","evt","target","getTarget","delegateTarget","closest","ctx","includeCTX","startsWith","overrideContext","addEventListener","instances","instance","Message","super","_default","DEFAULTS","id","closed","visible","offset","timer","destroyed","_objectSpread","open","isClosed","isDestroyed","_getClassName","effect","round","closable","customClass","dangerouslyUseHTMLString","$type","$message","$text","$close","iconSize","_refreshIcon","HIDDEN","iconName","$use","_refreshMessage","text","_refreshClose","_refreshEl","clearTimer","clearTimeout","startTimer","duration","close","top","destroyAfterClosed","beforeClose","removeChild","onMouseEnter","onMouseLeave","onClose","config","item","offsetHeight","len","dom","parseInt","clear","Command","action","Commands","commands","get","cmd","command","del","_createButton","button","rounded","$anchor","href","link","$button","disabled","DISABLED","ACTIVE","Toolbar","buttons","created","isHighlight","isDisabled","isExist","_getCommand","_self","bind","mounted","placement","_paint","hide","disable","erase","_remove","_add","_disable","_enable","enable","enabled","show","opened","toggle","highlight","beforeDestroy","afterDestroy","onExecute","getAttribute","_updateToolbar","min","max","current","Math","ceil","onToolbarUpdate","onAddButton","onRemoveButton","afterClosed","afterOpened","afterDisabled","afterEnabled","Speech","utterance","SpeechSynthesisUtterance","_initialize","lang","setLang","pitch","setPitch","rate","setRate","setText","voice","setVoice","volume","setVolume","_addListeners","isSpeaking","speechSynthesis","speaking","isPending","pending","isPaused","paused","getVoices","speak","pause","resume","cancel","speech","onvoiceschanged","isSupport","window","_updateSiblingElements","siblingElement","isPrev","$sibling","previousElementSibling","nextElementSibling","isMobile","ua","navigator","userAgent","ENTER_READING_TIP","Reader","reading","$target","$paper","$title","$article","$progress","toolbar","_this$speech","_renderEdge","$content","cloneNode","_animateTimeline","ScrollTimeline","animate","scale","timeline","axis","title","print","exit","enter","READER","READING","$siblings","querySelectorAll","enterReadingTip","info","SPEAK","onPrint","onEnterReading","onExitReading","keyCode","stopPropagation","preventDefault","stop","onRefresh","at","allowSpeak"],"mappings":"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"} \ No newline at end of file diff --git a/reader/reader.css b/reader/reader.css new file mode 100644 index 00000000..f7a0903a --- /dev/null +++ b/reader/reader.css @@ -0,0 +1,3 @@ +.outline-icon{display:inline-block;position:relative;vertical-align:middle;z-index:1}.outline-icon,.outline-icon__svg{height:1em;overflow:hidden;width:1em}.outline-icon__svg{left:50%;position:absolute;top:50%;z-index:2;fill:currentcolor;transform:translate(-50%,-50%)}.outline-icon_hidden{display:none}.outline-message{background-color:#fff;border-radius:3px;box-shadow:0 0 6px 1px #dcdfe6;left:50%;opacity:.1;padding:0 50px;position:fixed;top:-50px;transform:translateX(-50%);transition:all .5s ease-in-out;z-index:9999}.outline-message,.outline-message__content{color:#666;font-size:13px;height:40px;line-height:40px;margin:0;overflow:hidden}.outline-message__content{max-width:700px;text-overflow:ellipsis;white-space:nowrap}.outline-message__close,.outline-message__icon{height:40px;line-height:40px;overflow:hidden;position:absolute;text-align:center;top:0;width:40px;z-index:2}.outline-message__icon{color:#fff;left:0}.outline-message__icon .outline-icon{left:50%;position:absolute;top:50%;transform:translate(-50%,-50%);z-index:2}.outline-message__close{color:#999;cursor:pointer;right:0}.outline-message__close .outline-icon{left:50%;position:absolute;top:50%;transform:translate(-50%,-50%);z-index:2}.outline-message__close:hover{color:#666}.outline-message_info .outline-message__icon{background-color:#507afe}.outline-message_warning .outline-message__icon{background-color:#ff9901}.outline-message_success .outline-message__icon{background-color:#058942}.outline-message_error .outline-message__icon{background-color:#ff5d5d}.outline-message_plain{min-width:190px;padding:0 50px 0 15px}.outline-message_plain.outline-message_info{background-color:#ecf8ff;border-left:5px solid #507afe}.outline-message_plain.outline-message_warning{background-color:#fffbe6;border-left:5px solid #ff9901}.outline-message_plain.outline-message_success{background-color:#e1f6eb;border-left:5px solid #058942}.outline-message_plain.outline-message_error{background-color:#fff1f0;border-left:5px solid #ff5d5d}.outline-message_plain .outline-message__icon{display:none;width:0}.outline-message_plain .outline-message__icon .outline-icon{display:none}.outline-message_light{min-width:180px;padding:0 40px}.outline-message_light.outline-message_info .outline-message__icon{color:#507afe}.outline-message_light.outline-message_warning .outline-message__icon{color:#ff9901}.outline-message_light.outline-message_success .outline-message__icon{color:#058942}.outline-message_light.outline-message_error .outline-message__icon{color:#ff5d5d}.outline-message_light .outline-message__icon{background-color:#fff}.outline-message_round{border-radius:20px}.outline-message_round.outline-message_default{min-width:180px;padding:0 40px}.outline-message_round.outline-message_default .outline-message__icon{border-radius:10px;height:20px;left:10px;line-height:20px;top:10px;width:20px}.outline-message_round.outline-message_default.outline-message_full-width{min-width:200px;padding:0 20px 0 40px}.outline-message_round.outline-message_plain{min-width:195px;padding:0 40px 0 20px}.outline-message_round.outline-message_plain.outline-message_full-width{min-width:215px;padding:0 20px}.outline-message_full-width{min-width:200px;padding:0 10px 0 50px}.outline-message_full-width.outline-message_plain{min-width:230px;padding:0 10px 0 15px}.outline-message_full-width.outline-message_light{min-width:210px;padding:0 10px 0 40px}.outline-message_visible{opacity:1}.outline-message_hidden{display:none} +.outline-toolbar{margin:0;overflow:hidden;position:fixed;transition-duration:.3s;z-index:99999}.outline-toolbar__button{background-color:#fff;border:1px solid #dcdfe6;border-radius:3px;box-shadow:0 0 6px 1px #dcdfe6;box-sizing:border-box;color:#999;cursor:pointer;height:36px;margin:10px;overflow:hidden;position:relative;text-align:center;transition:all .3s ease-in-out .1s;width:36px;z-index:1}.outline-toolbar__button:hover{border-color:#058942;color:#058942;transform:scale(1.35)}.outline-toolbar__button.hide{display:none}.outline-toolbar__anchor:hover,.outline-toolbar__anchor:link,.outline-toolbar__anchor:visited{color:#999;text-decoration:none}.outline-toolbar__anchor:hover{color:#058942}.outline-toolbar__icon{height:20px;left:50%;position:absolute;top:50%;transform:translate(-50%,-50%);width:20px;z-index:2;fill:currentcolor;overflow:hidden}.outline-toolbar_active.outline-toolbar__button{background-color:#058942;border-color:#058942;color:#fff}.outline-toolbar_active.outline-toolbar__button:hover{color:#fff}.outline-toolbar_active .outline-toolbar__anchor:hover,.outline-toolbar_active .outline-toolbar__anchor:link,.outline-toolbar_active .outline-toolbar__anchor:visited{color:#fff}.outline-toolbar_rounded.outline-toolbar__button{border-radius:18px}.outline-toolbar_disabled .outline-toolbar__anchor:hover,.outline-toolbar_disabled .outline-toolbar__anchor:link,.outline-toolbar_disabled .outline-toolbar__anchor:visited,.outline-toolbar_disabled .outline-toolbar__button,.outline-toolbar_disabled.outline-toolbar__anchor:hover,.outline-toolbar_disabled.outline-toolbar__anchor:link,.outline-toolbar_disabled.outline-toolbar__anchor:visited,.outline-toolbar_disabled.outline-toolbar__button{border-color:#999;color:#999;cursor:not-allowed}.outline-toolbar_disabled .outline-toolbar__anchor:hover:hover,.outline-toolbar_disabled .outline-toolbar__anchor:link:hover,.outline-toolbar_disabled .outline-toolbar__anchor:visited:hover,.outline-toolbar_disabled .outline-toolbar__button:hover,.outline-toolbar_disabled.outline-toolbar__anchor:hover:hover,.outline-toolbar_disabled.outline-toolbar__anchor:link:hover,.outline-toolbar_disabled.outline-toolbar__anchor:visited:hover,.outline-toolbar_disabled.outline-toolbar__button:hover{border-color:#999;color:#999}.outline-toolbar_disabled .outline-toolbar__button,.outline-toolbar_disabled.outline-toolbar__button{background-color:#f5f5f5}.outline-toolbar_btt,.outline-toolbar_ttb{left:50%;transform:translateX(-50%)}.outline-toolbar_btt .outline-toolbar__button,.outline-toolbar_ttb .outline-toolbar__button{display:inline-block}.outline-toolbar_ttb{top:12px}.outline-toolbar_ttb.outline-toolbar_hidden{top:-56px}.outline-toolbar_btt{bottom:12px}.outline-toolbar_btt.outline-toolbar_hidden{bottom:-56px}.outline-toolbar_ltr,.outline-toolbar_rtl{transform:translateY(-50%);width:56px}.outline-toolbar_rtl{right:12px;top:50%}.outline-toolbar_rtl.outline-toolbar_hidden{right:-86px}.outline-toolbar_ltr{left:12px;top:50%}.outline-toolbar_ltr.outline-toolbar_hidden{left:-86px}.outline-toolbar_btt .outline-toolbar__button.outline-toolbar_hidden,.outline-toolbar_ltr .outline-toolbar__button.outline-toolbar_hidden,.outline-toolbar_rtl .outline-toolbar__button.outline-toolbar_hidden,.outline-toolbar_ttb .outline-toolbar__button.outline-toolbar_hidden{display:none} +.outline-reader__progress{animation:outline-reader-progress linear;background-color:#507afe;height:4px;left:0;position:fixed;scale:0 1;top:0;transform-origin:left;width:100%;z-index:3;animation-timeline:--ProgressTimeline}.outline-reader__paper{background-color:#fff;box-shadow:0 0 6px 1px #ddd;box-sizing:border-box;margin:2em auto;max-width:1200px;overflow:hidden;padding:3.2em}.outline-reader__title{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Helvetica Neue,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Helvetica,Arial,sans-serif;font-size:4.2em;font-weight:400;line-height:1.3em;margin:.67em 0;overflow:hidden;text-align:center}.outline-reader__article .outline-reader__progress,.outline-reader_hidden{display:none}.outline-reader_hidden.outline-reader_sibling{display:none!important}.outline-reader_hidden.outline-reader_sibling.wrapper.post{display:none}.outline-reader--reading{background-color:#fafafa;box-sizing:border-box;display:block;height:100%;left:0;margin:0;padding:3em 4em;position:fixed;top:0;width:100%;z-index:2;scroll-timeline-name:--ProgressTimeline;overflow:scroll}@keyframes outline-reader-progress{to{scale:1 1}}@media (max-width:500px){.outline-reader{overflow:hidden}.outline-reader .outline-toolbar{align-items:center;align-self:auto;background-color:#fff;border-top:1px solid #ddd;box-sizing:border-box;display:flex;flex-direction:row;flex-wrap:nowrap;height:48px;padding:0 16px;right:0;top:100%;transform:translateY(-48px);width:100%}.outline-reader .outline-toolbar__button{border:none;border-radius:0;box-shadow:none;flex:1}.outline-reader--reading{background-color:#fff;box-sizing:border-box;padding:0}.outline-reader__paper{box-shadow:none;height:100%;margin:0;overflow:hidden;padding:0;position:relative;z-index:1}.outline-reader__title{background-color:#fff;border-bottom:1px solid #ddd;font-size:1.8em;font-weight:400;height:48px;left:0;line-height:48px;margin:0;overflow:hidden;position:absolute;text-overflow:ellipsis;top:0;white-space:nowrap;width:100%;z-index:3}.outline-reader__article{height:calc(100% - 96px);margin:48px 0;padding:0 1.25em;scroll-timeline-name:--MobileProgressTimeline;overflow-x:hidden;overflow-y:scroll}.outline-reader__article .outline-reader__progress{animation:outline-reader-progress linear;z-index:4;animation-timeline:--MobileProgressTimeline;display:block}}@media print{body,html{background-color:#fff;color:#333;font-size:12pt;height:auto!important}a:hover,a:link,a:visited{color:#507afe;text-decoration:underline!important}audio,video{display:none!important}table{border-collapse:collapse;width:100%}td,th{border:1px solid #dcdfe6;padding:8px 20px}.outline-message,.outline-toolbar{display:none!important}.outline-reader{display:block!important;overflow:hidden}.outline-reader__title{font-size:32pt!important;margin:13.4pt 0 28pt!important;text-align:center!important}.outline-reader--reading{background-color:#fff;height:auto!important;overflow:hidden!important;padding:0!important;position:relative!important}.outline-reader__progress{display:none!important}.outline-reader__paper{box-shadow:none}.outline-reader pre{border:1px solid #ddd!important;border-radius:4px!important;padding:1em!important}.outline-reader code,.outline-reader pre{background-color:#fff!important}.outline-reader img,.outline-reader svg,.outline-reader table{break-inside:avoid}.outline-reader_sibling{display:none!important}} \ No newline at end of file diff --git a/reader.js b/reader/reader.js similarity index 86% rename from reader.js rename to reader/reader.js index 04ad261b..de46719c 100644 --- a/reader.js +++ b/reader/reader.js @@ -1,462 +1,466 @@ -import cloneDeep from './utils/lang/cloneDeep' -import later from './utils/lang/later' -import isString from './utils/types/isString' -import isElement from './utils/types/isElement' -import isFunction from './utils/types/isFunction' -import createElement from './utils/dom/createElement' -import addClass from './utils/dom/addClass' -import removeClass from './utils/dom/removeClass' -import at from './utils/event/at' -import stop from './utils/event/stop' -import off from './utils/event/off' - -import Base from './base' -import Message from './message' -import Toolbar from './toolbar' -import Speech from './speech' - -import _updateSiblingElements from './_updateSiblingElements' -import isMobile from './utils/dom/isMobile' - -const ENTER_READING_TIP = '进入阅读模式,按 ESC 键可退出阅读模式' - -class Reader extends Base { - constructor(options) { - super() - - this._default() - - if (options) { - this.initialize(options) - } - } - - _default() { - this.attrs = cloneDeep(Reader.DEFAULTS) - this.reading = false - - this.$target = null - this.$el = null - this.$paper = null - this.$title = null - this.$article = null - this.$progress = null - - this.toolbar = null - this.speech = null - - return this - } - - initialize(options) { - let target - - this.attr(options) - - target = this.attr('target') - - if (isString(target)) { - this.$target = document.querySelector(target) - } else if (isElement(target)) { - this.$target = target - } - - if (!this.$target) { - return this - } - - if (Speech.isSupport) { - this.speech = new Speech() - } - - this.render().addListeners() - - return this - } - - isSpeaking() { - return this?.speech?.isSpeaking() - } - - render() { - this._renderEdge()._paint(this.$target) - return this - } - - erase() { - this.$article.innerHTML = '' - return this - } - - _paint($content) { - const $fragment = document.createDocumentFragment() - const $children = [...$content.cloneNode(true).children] - - later(() => { - $children.forEach(($child) => { - $fragment.appendChild($child) - }) - - this.$article.appendChild($fragment) - }) - - return this - } - - _remove() { - const $el = this.$el - const toolbar = this.toolbar - - if ($el) { - document.body.removeChild($el) - } - - if (toolbar) { - toolbar.destroy() - } - - return this - } - - refresh() { - this.erase()._paint(this.$target) - return this - } - - _animateTimeline() { - // eslint-disable-next-line - if (!window.ScrollTimeline || !isMobile()) { - return this - } - - this.$progress.animate( - { - // from - scale: ['0 1', '1 1'] - }, - { - // eslint-disable-next-line - timeline: new ScrollTimeline({ - source: this.$article, - axis: 'block' - }) - } - ) - - return this - } - - _renderEdge() { - const $target = this.$target - const mobile = isMobile() - const size = mobile ? 26 : 20 - let title = this.attr('title') - let $el - let $paper - let $title - let $article - let $progress - let $sibling - - $progress = createElement('div', { - className: 'outline-reader__progress' - }) - this.$progress = $progress - - $title = $target.querySelector('h1') - - if (isElement(title)) { - $title = title - } - - if (isElement($title)) { - title = $title.innerText - } - - $title = createElement( - 'h1', - { - className: 'outline-reader__title' - }, - title - ) - this.$title = $title - - $article = createElement( - 'article', - { - id: 'outline-reader__article', - className: 'outline-reader__article' - }, - isMobile() ? [] : [$progress.cloneNode()] - ) - this.$article = $article - - $paper = createElement( - 'div', - { - id: 'outline-reader__paper', - className: 'outline-reader__paper' - }, - [$title, $article] - ) - this.$paper = $paper - - const buttons = [] - - buttons.push({ - name: 'print', - icon: 'print', - size, - action: { - context: this, - handler: this.print - } - }) - - if (Speech.isSupport && this.attr('allowSpeak')) { - buttons.push({ - name: 'speak', - icon: 'sound', - size, - action: { - context: this, - handler: this.speak - } - }) - } - - buttons.push({ - name: 'exit', - icon: 'close', - size, - action: { - context: this, - handler: this.exit - } - }) - - this.toolbar = new Toolbar({ - placement: 'rtl', - buttons - }) - - $el = createElement( - 'section', - { - id: 'outline-reader', - className: 'outline-reader outline-reader_hidden' - }, - [$progress, $paper, this.toolbar.$el] - ) - this.$el = $el - - document.body.appendChild($el) - - this._animateTimeline() - - later(() => { - // 设置邻居节点的打印样式 - $sibling = $el.previousElementSibling - _updateSiblingElements($sibling, true) - - $sibling = $el.nextElementSibling - _updateSiblingElements($sibling) - }) - - return this - } - - enter() { - const READER = 'outline-reader' - const READING = `${READER}--reading` - const HIDDEN = `${READER}_hidden` - const $el = this.$el - const $siblings = document.querySelectorAll('.outline-reader_sibling') - const enterReadingTip = this.attr('enterReadingTip') || ENTER_READING_TIP - - if (this.reading || !$el) { - return this - } - - $siblings.forEach(($sibling) => { - addClass($sibling, HIDDEN) - }) - addClass($el, READING) - removeClass($el, HIDDEN) - this.toolbar.show() - this.reading = true - - Message.info({ - round: true, - message: enterReadingTip - }) - - this.$emit('reader:enter') - - return this - } - - exit() { - const SPEAK = 'speak' - const READER = 'outline-reader' - const READING = `${READER}--reading` - const HIDDEN = `${READER}_hidden` - const $el = this.$el - const $siblings = document.querySelectorAll('.outline-reader_sibling') - const speech = this.speech - const toolbar = this.toolbar - - if (!this.reading || !$el) { - return this - } - - addClass($el, HIDDEN) - removeClass($el, READING) - $siblings.forEach(($sibling) => { - removeClass($sibling, HIDDEN) - }) - toolbar.hide() - this.reading = false - - if (speech) { - if (toolbar.isHighlight(SPEAK)) { - toolbar.highlight(SPEAK) - } - - speech.cancel() - } - - this.$emit('reader:exit') - - return this - } - - toggle() { - if (this.reading) { - this.exit() - } else { - this.enter() - } - - return this - } - - speak() { - const text = this.$article.innerText - const speech = this.speech - - if (!Speech.isSupport || !speech) { - return this - } - - this.toolbar.highlight('speak') - - if (this.isSpeaking()) { - speech.cancel() - } else { - speech.speak(text) - } - - return this - } - - print() { - if (!isFunction(print)) { - return this - } - - print() - - return this - } - - destroy() { - const $el = this.$el - - if (!$el) { - return this - } - - this.removeListeners()._remove()._default() - - return this - } - - onPrint() { - this.print() - return this - } - - onEnterReading() { - this.toggle() - return this - } - - onExitReading(evt) { - const keyCode = evt.keyCode - - if (keyCode === 27 && this.reading) { - this.toggle() - stop(evt) - } - - return this - } - - onRefresh() { - this.refresh() - - return this - } - - addListeners() { - const $el = this.$el - - if (!$el) { - return this - } - - at(document, 'keyup', this.onExitReading, this, true) - - this.$on('toolbar:action:print', this.onPrint) - this.$on('toolbar:action:reading', this.onEnterReading) - this.$on('reader:print', this.onPrint) - this.$on('reader:refresh', this.onRefresh) - this.$on('reader:enter', this.enter) - this.$on('reader:exit', this.exit) - this.$on('reader:toggle', this.toggle) - - return this - } - - removeListeners() { - const $el = this.$el - - if (!$el) { - return this - } - - off(document, 'keyup', this.onExitReading) - - this.$off('toolbar:action:print') - this.$off('toolbar:action:reading') - this.$off('reader:refresh') - this.$off('reader:toggle') - - return this - } -} - -Reader.DEFAULTS = (() => { - const OPTIONS = { - target: '', - title: '', - enterReadingTip: ENTER_READING_TIP, - allowSpeak: false - } - - return cloneDeep(OPTIONS) -})() - -export default Reader +import cloneDeep from '@/utils/lang/cloneDeep' +import later from '@/utils/lang/later' +import isString from '@/utils/types/isString' +import isElement from '@/utils/types/isElement' +import isFunction from '@/utils/types/isFunction' +import createElement from '@/utils/dom/createElement' +import addClass from '@/utils/dom/addClass' +import removeClass from '@/utils/dom/removeClass' +import isMobile from '@/utils/dom/isMobile' + +import at from '@/utils/event/at' +import stop from '@/utils/event/stop' +import off from '@/utils/event/off' + +import Message from '@/message/message' +import Toolbar from '@/toolbar/toolbar' + +import Speech from '@/speech' +import Component from '@/component' + +import _updateSiblingElements from './utils/_updateSiblingElements' + +import './reader.less' + +const ENTER_READING_TIP = '进入阅读模式,按 ESC 键可退出阅读模式' + +class Reader extends Component { + constructor(options) { + super() + + this._default() + + if (options) { + this.initialize(options) + } + } + + _default() { + this.attrs = cloneDeep(Reader.DEFAULTS) + this.reading = false + + this.$target = null + this.$el = null + this.$paper = null + this.$title = null + this.$article = null + this.$progress = null + + this.toolbar = null + this.speech = null + + return this + } + + initialize(options) { + let target + + this.attr(options) + + target = this.attr('target') + + if (isString(target)) { + this.$target = document.querySelector(target) + } else if (isElement(target)) { + this.$target = target + } + + if (!this.$target) { + return this + } + + if (Speech.isSupport) { + this.speech = new Speech() + } + + this.render().addListeners() + + return this + } + + isSpeaking() { + return this?.speech?.isSpeaking() + } + + render() { + this._renderEdge()._paint(this.$target) + return this + } + + erase() { + this.$article.innerHTML = '' + return this + } + + _paint($content) { + const $fragment = document.createDocumentFragment() + const $children = [...$content.cloneNode(true).children] + + later(() => { + $children.forEach(($child) => { + $fragment.appendChild($child) + }) + + this.$article.appendChild($fragment) + }) + + return this + } + + _remove() { + const $el = this.$el + const toolbar = this.toolbar + + if ($el) { + document.body.removeChild($el) + } + + if (toolbar) { + toolbar.destroy() + } + + return this + } + + refresh() { + this.erase()._paint(this.$target) + return this + } + + _animateTimeline() { + // eslint-disable-next-line + if (!window.ScrollTimeline || !isMobile()) { + return this + } + + this.$progress.animate( + { + // from + scale: ['0 1', '1 1'] + }, + { + // eslint-disable-next-line + timeline: new ScrollTimeline({ + source: this.$article, + axis: 'block' + }) + } + ) + + return this + } + + _renderEdge() { + const $target = this.$target + const mobile = isMobile() + const size = mobile ? 26 : 20 + let title = this.attr('title') + let $el + let $paper + let $title + let $article + let $progress + let $sibling + + $progress = createElement('div', { + className: 'outline-reader__progress' + }) + this.$progress = $progress + + $title = $target.querySelector('h1') + + if (isElement(title)) { + $title = title + } + + if (isElement($title)) { + title = $title.innerText + } + + $title = createElement( + 'h1', + { + className: 'outline-reader__title' + }, + title + ) + this.$title = $title + + $article = createElement( + 'article', + { + id: 'outline-reader__article', + className: 'outline-reader__article' + }, + isMobile() ? [] : [$progress.cloneNode()] + ) + this.$article = $article + + $paper = createElement( + 'div', + { + id: 'outline-reader__paper', + className: 'outline-reader__paper' + }, + [$title, $article] + ) + this.$paper = $paper + + const buttons = [] + + buttons.push({ + name: 'print', + icon: 'print', + size, + action: { + context: this, + handler: this.print + } + }) + + if (Speech.isSupport && this.attr('allowSpeak')) { + buttons.push({ + name: 'speak', + icon: 'sound', + size, + action: { + context: this, + handler: this.speak + } + }) + } + + buttons.push({ + name: 'exit', + icon: 'close', + size, + action: { + context: this, + handler: this.exit + } + }) + + this.toolbar = new Toolbar({ + placement: 'rtl', + buttons + }) + + $el = createElement( + 'section', + { + id: 'outline-reader', + className: 'outline-reader outline-reader_hidden' + }, + [$progress, $paper, this.toolbar.$el] + ) + this.$el = $el + + document.body.appendChild($el) + + this._animateTimeline() + + later(() => { + // 设置邻居节点的打印样式 + $sibling = $el.previousElementSibling + _updateSiblingElements($sibling, true) + + $sibling = $el.nextElementSibling + _updateSiblingElements($sibling) + }) + + return this + } + + enter() { + const READER = 'outline-reader' + const READING = `${READER}--reading` + const HIDDEN = `${READER}_hidden` + const $el = this.$el + const $siblings = document.querySelectorAll('.outline-reader_sibling') + const enterReadingTip = this.attr('enterReadingTip') || ENTER_READING_TIP + + if (this.reading || !$el) { + return this + } + + $siblings.forEach(($sibling) => { + addClass($sibling, HIDDEN) + }) + addClass($el, READING) + removeClass($el, HIDDEN) + this.toolbar.show() + this.reading = true + + Message.info({ + round: true, + message: enterReadingTip + }) + + this.$emit('reader:enter') + + return this + } + + exit() { + const SPEAK = 'speak' + const READER = 'outline-reader' + const READING = `${READER}--reading` + const HIDDEN = `${READER}_hidden` + const $el = this.$el + const $siblings = document.querySelectorAll('.outline-reader_sibling') + const speech = this.speech + const toolbar = this.toolbar + + if (!this.reading || !$el) { + return this + } + + addClass($el, HIDDEN) + removeClass($el, READING) + $siblings.forEach(($sibling) => { + removeClass($sibling, HIDDEN) + }) + toolbar.hide() + this.reading = false + + if (speech) { + if (toolbar.isHighlight(SPEAK)) { + toolbar.highlight(SPEAK) + } + + speech.cancel() + } + + this.$emit('reader:exit') + + return this + } + + toggle() { + if (this.reading) { + this.exit() + } else { + this.enter() + } + + return this + } + + speak() { + const text = this.$article.innerText + const speech = this.speech + + if (!Speech.isSupport || !speech) { + return this + } + + this.toolbar.highlight('speak') + + if (this.isSpeaking()) { + speech.cancel() + } else { + speech.speak(text) + } + + return this + } + + print() { + if (!isFunction(print)) { + return this + } + + print() + + return this + } + + destroy() { + const $el = this.$el + + if (!$el) { + return this + } + + this.removeListeners()._remove()._default() + + return this + } + + onPrint() { + this.print() + return this + } + + onEnterReading() { + this.toggle() + return this + } + + onExitReading(evt) { + const keyCode = evt.keyCode + + if (keyCode === 27 && this.reading) { + this.toggle() + stop(evt) + } + + return this + } + + onRefresh() { + this.refresh() + + return this + } + + addListeners() { + const $el = this.$el + + if (!$el) { + return this + } + + at(document, 'keyup', this.onExitReading, this, true) + + this.$on('toolbar:action:print', this.onPrint) + this.$on('toolbar:action:reading', this.onEnterReading) + this.$on('reader:print', this.onPrint) + this.$on('reader:refresh', this.onRefresh) + this.$on('reader:enter', this.enter) + this.$on('reader:exit', this.exit) + this.$on('reader:toggle', this.toggle) + + return this + } + + removeListeners() { + const $el = this.$el + + if (!$el) { + return this + } + + off(document, 'keyup', this.onExitReading) + + this.$off('toolbar:action:print') + this.$off('toolbar:action:reading') + this.$off('reader:refresh') + this.$off('reader:toggle') + + return this + } +} + +Reader.DEFAULTS = (() => { + const OPTIONS = { + target: '', + title: '', + enterReadingTip: ENTER_READING_TIP, + allowSpeak: false + } + + return cloneDeep(OPTIONS) +})() + +export default Reader diff --git a/reader/reader.less b/reader/reader.less new file mode 100644 index 00000000..1359ecfd --- /dev/null +++ b/reader/reader.less @@ -0,0 +1,259 @@ +@import '../theme/colors'; +@import '../theme/font'; +@import '../theme/mixins'; + +.outline-reader { + &__progress { + position: fixed; + top: 0; + left: 0; + z-index: 3; + height: 4px; + width: 100%; + background-color: @primary_color; + scale: 0 1; + transform-origin: left; + animation: outline-reader-progress linear; + animation-timeline: --ProgressTimeline; + } + + &__paper { + .shadow_dark_regular(); + margin: 2em auto; + max-width: 1200px; + padding: 3.2em; + box-sizing: border-box; + background-color: @white; + overflow: hidden; + } + + &__title { + margin: 0.67em 0; + text-align: center; + font-family: @font_text_family; + font-weight: normal; + line-height: 1.3em; + font-size: 4.2em; + overflow: hidden; + } + + &__article { + .outline-reader__progress { + display: none; + } + } + + &_hidden { + display: none; + + &.outline-reader_sibling { + display: none !important; + + &.wrapper { + &.post { + display: none; + } + } + } + } + + &--reading { + display: block; + position: fixed; + z-index: 2; + top: 0; + left: 0; + width: 100%; + height: 100%; + margin: 0; + box-sizing: border-box; + padding: 3em 4em; + background-color: @bg_color; + scroll-timeline-name: --ProgressTimeline; + overflow: scroll; + } +} + +@keyframes outline-reader-progress { + to { + scale: 1 1; + } +} + +@media (max-width: 500px) { + .outline { + &-reader { + overflow: hidden; + + .outline-toolbar { + display: flex; + flex-direction: row; + flex-wrap: nowrap; + align-items: center; + align-self: auto; + top: 100%; + right: 0; + transform: translateY(-48px); + width: 100%; + height: 48px; + box-sizing: border-box; + border-top: 1px solid @border_color; + background-color: @white; + padding: 0 16px; + + &__button { + .radius_none(); + flex: 1; + border: none; + box-shadow: none; + } + } + + &--reading { + padding: 0; + background-color: @white; + box-sizing: border-box; + } + + &__paper { + position: relative; + z-index: 1; + margin: 0; + padding: 0; + height: 100%; + box-shadow: none; + overflow: hidden; + } + + &__title { + .ellipsis(1); + position: absolute; + z-index: 3; + top: 0; + left: 0; + margin: 0; + width: 100%; + height: 48px; + line-height: 48px; + border-bottom: 1px solid @border_color; + font-size: 1.8em; + font-weight: 400; + background-color: @white; + overflow: hidden; + } + + &__article { + margin: 48px 0; + height: calc(100% - 96px); + padding: 0 1.25em; + scroll-timeline-name: --MobileProgressTimeline; + overflow-x: hidden; + overflow-y: scroll; + + .outline-reader__progress { + z-index: 4; + animation: outline-reader-progress linear; + animation-timeline: --MobileProgressTimeline; + display: block; + } + } + } + } +} + +@media print { + html, + body { + /* 打印的基础字体大小 */ + font-size: 12pt; + /* 显示设置文字颜色和背景颜色 */ + background-color: @white; + color: @primary_text_color; + height: initial !important; + } + + /* 设置链接样式 */ + a:link, + a:visited, + a:hover { + text-decoration: underline !important; + color: @primary_color; + } + + /* 隐藏媒体标签 */ + video, + audio { + display: none !important; + } + + /* 确保表格在打印时的边框和对齐方式清晰 */ + table { + width: 100%; + border-collapse: collapse; + } + th, + td { + border: 1px solid @primary_border_color; + padding: 8px 20px; + } + + .outline { + &-message, + &-toolbar { + /* 隐藏了工具栏和信息提示框 */ + display: none !important; + } + + &-reader { + display: block !important; + overflow: hidden; + + &__title { + margin: 13.4pt 0 28pt !important; + text-align: center !important; + font-size: 32pt !important; + } + + /* 取消了绝对定位 */ + &--reading { + position: relative !important; + height: auto !important; + padding: 0 !important; + background-color: @white; + overflow: hidden !important; + } + + /* 隐藏阅读进度条 */ + &__progress { + display: none !important; + } + + /* 打印时不显示正文 DOM 的阴影效果 */ + &__paper { + box-shadow: none; + } + + pre { + padding: 1em !important; + border: 1px solid @border_color !important; + border-radius: 4px !important; + } + + pre, + code { + background-color: @white !important; + } + + table, + img, + svg { + break-inside: avoid; + } + + /* 所有文章内容 DOM 相关的邻居节点都隐藏了 */ + &_sibling { + display: none !important; + } + } + } +} diff --git a/reader/reader.min.css b/reader/reader.min.css new file mode 100644 index 00000000..8f440a26 --- /dev/null +++ b/reader/reader.min.css @@ -0,0 +1,6 @@ +.outline-heading{overflow:hidden;position:relative;z-index:1}.outline-heading__anchor{display:none}.outline-heading__anchor:hover,.outline-heading__anchor:link,.outline-heading__anchor:visited{color:#999;text-decoration:none}.outline-heading__anchor:hover{color:#507afe}.outline-heading:hover .outline-heading__anchor{display:inline-block}.outline-heading_start:hover{overflow:visible}.outline-heading_start .outline-heading__anchor{left:-1em;position:absolute;top:50%;transform:translateY(-50%);z-index:2} +:root{--outline-zIndex:2000;--outline-sticky-height:100%;--outline-navigator-width:100%}.outline-navigator{margin:0;overflow:auto;position:relative;width:var(--outline-navigator-width);z-index:1}.outline-navigator-parent{transition:.3s ease-in-out}.outline-navigator__title{border-bottom:1px solid #dcdfe6;font-size:16px;font-weight:400;height:40px;line-height:40px;margin:0 16px;overflow:hidden;padding:0 16px}.outline-navigator__main{margin:0;overflow:hidden;position:relative;z-index:1}.outline-navigator__item,.outline-navigator__list,.outline-navigator__subject{list-style-type:none;margin:0;overflow:hidden;padding:0;position:relative;z-index:2}.outline-navigator__list{padding:.5em 0}.outline-navigator__subject{padding-left:1em}.outline-navigator__item{font-size:13px;line-height:30px;margin:0;overflow:hidden}.outline-navigator__placeholder{background-color:#f7f8f9;border-left:2px solid #058942;box-sizing:border-box;height:30px;left:0;overflow:hidden;position:absolute;top:0;transition-duration:.2s;width:100%;z-index:1}.outline-navigator__anchor{display:block;overflow:hidden;padding:0 1.5em;text-overflow:ellipsis;white-space:nowrap}.outline-navigator__anchor:hover,.outline-navigator__anchor:link,.outline-navigator__anchor:visited{color:#555;text-decoration:none}.outline-navigator__anchor:hover{color:#058942}.outline-navigator__code{padding-right:.5em}.outline-navigator_highlight.outline-navigator__anchor:hover,.outline-navigator_highlight.outline-navigator__anchor:link,.outline-navigator_highlight.outline-navigator__anchor:visited{color:#058942;font-weight:700}.outline-navigator_fixed,.outline-navigator_sticky{display:flex;flex-direction:column;flex-wrap:nowrap;overflow:hidden;top:0;z-index:var(--outline-zIndex)}.outline-navigator_fixed .outline-navigator__main,.outline-navigator_fixed .outline-navigator__title,.outline-navigator_sticky .outline-navigator__main,.outline-navigator_sticky .outline-navigator__title{box-sizing:border-box}.outline-navigator_fixed .outline-navigator__title,.outline-navigator_sticky .outline-navigator__title{flex-shrink:0}.outline-navigator_fixed .outline-navigator__main,.outline-navigator_sticky .outline-navigator__main{flex:1;overflow:auto}.outline-navigator_sticky{max-height:var(--outline-sticky-height);position:sticky}.outline-navigator_fixed{max-height:100%;position:fixed}.outline-navigator_hidden{display:none}.outline-navigator_folded{overflow:hidden;width:0} +:root{--outline-zIndex:2000;--outline-sticky-height:100%;--outline-navigator-width:100%}.outline-drawer{box-sizing:border-box;height:100%;left:0;margin:0;overflow:hidden;position:relative;top:0;visibility:hidden;width:100%;z-index:-1}.outline-drawer__modal{background-color:#fff;box-shadow:0 0 6px 1px #dcdfe6;display:flex;flex-direction:column;flex-wrap:nowrap;height:100%;overflow:hidden;position:absolute;transition-duration:.4s;z-index:21}.outline-drawer__footer,.outline-drawer__header,.outline-drawer__main{box-sizing:border-box;width:100%}.outline-drawer__footer,.outline-drawer__header{flex-shrink:0}.outline-drawer__footer,.outline-drawer__main,.outline-drawer__title{padding:0 16px}.outline-drawer__header,.outline-drawer__title{height:52px;line-height:52px;margin:0 auto;overflow:hidden;position:relative;z-index:1}.outline-drawer__title{border-bottom:1px solid #dcdfe6;box-sizing:border-box;font-size:16px;font-weight:400;margin:0 16px}.outline-drawer__close{color:#999;cursor:pointer;font-size:20px;height:20px;line-height:20px;overflow:hidden;position:absolute;right:12px;text-align:center;top:50%;transform:translateY(-50%);width:20px;z-index:2}.outline-drawer__close .outline-icon{left:0;position:absolute;top:0;z-index:2}.outline-drawer__close:hover{color:#666}.outline-drawer__main{flex:1;overflow:auto}.outline-drawer__main.overflow-hidden{overflow:hidden}.outline-drawer__footer{margin:0 auto;overflow:hidden;text-align:right}.outline-drawer__overlay{background-color:#fff;content:"";height:100%;left:0;opacity:.1;overflow:hidden;position:relative;top:0;width:100%;z-index:1}.outline-drawer_ltr.outline-drawer_tiny,.outline-drawer_rtl.outline-drawer_tiny{width:280px}.outline-drawer_ltr.outline-drawer_mini,.outline-drawer_rtl.outline-drawer_mini{width:480px}.outline-drawer_ltr.outline-drawer_small,.outline-drawer_rtl.outline-drawer_small{width:540px}.outline-drawer_ltr.outline-drawer_regular,.outline-drawer_rtl.outline-drawer_regular{width:680px}.outline-drawer_ltr.outline-drawer_medium,.outline-drawer_rtl.outline-drawer_medium{width:720px}.outline-drawer_ltr.outline-drawer_large,.outline-drawer_rtl.outline-drawer_large{width:960px}.outline-drawer_rtl{border-left:1px solid #dcdfe6}.outline-drawer_rtl.outline-drawer_tiny.outline-drawer_closed{right:-290px}.outline-drawer_rtl.outline-drawer_mini.outline-drawer_closed{right:-490px}.outline-drawer_rtl.outline-drawer_small.outline-drawer_closed{right:-550px}.outline-drawer_rtl.outline-drawer_regular.outline-drawer_closed{right:-690px}.outline-drawer_rtl.outline-drawer_medium.outline-drawer_closed{right:-730px}.outline-drawer_rtl.outline-drawer_large.outline-drawer_closed{right:-970px}.outline-drawer_ltr{border-right:1px solid #dcdfe6}.outline-drawer_ltr.outline-drawer_tiny.outline-drawer_closed{left:-290px}.outline-drawer_ltr.outline-drawer_mini.outline-drawer_closed{left:-490px}.outline-drawer_ltr.outline-drawer_small.outline-drawer_closed{left:-550px}.outline-drawer_ltr.outline-drawer_regular.outline-drawer_closed{left:-690px}.outline-drawer_ltr.outline-drawer_medium.outline-drawer_closed{left:-730px}.outline-drawer_ltr.outline-drawer_large.outline-drawer_closed{left:-970px}.outline-drawer_btt,.outline-drawer_ttb{left:0;width:100%}.outline-drawer_btt.outline-drawer_tiny,.outline-drawer_ttb.outline-drawer_tiny{height:240px}.outline-drawer_btt.outline-drawer_mini,.outline-drawer_ttb.outline-drawer_mini{height:320px}.outline-drawer_btt.outline-drawer_small,.outline-drawer_ttb.outline-drawer_small{height:360px}.outline-drawer_btt.outline-drawer_regular,.outline-drawer_ttb.outline-drawer_regular{height:400px}.outline-drawer_btt.outline-drawer_medium,.outline-drawer_ttb.outline-drawer_medium{height:440px}.outline-drawer_btt.outline-drawer_large,.outline-drawer_ttb.outline-drawer_large{height:480px}.outline-drawer_ttb{border-bottom:1px solid #dcdfe6}.outline-drawer_ttb.outline-drawer_tiny.outline-drawer_closed{top:-250px}.outline-drawer_ttb.outline-drawer_mini.outline-drawer_closed{top:-330px}.outline-drawer_ttb.outline-drawer_small.outline-drawer_closed{top:-370px}.outline-drawer_ttb.outline-drawer_regular.outline-drawer_closed{top:-410px}.outline-drawer_ttb.outline-drawer_medium.outline-drawer_closed{top:-450px}.outline-drawer_ttb.outline-drawer_large.outline-drawer_closed{top:-490px}.outline-drawer_btt{border-top:1px solid #dcdfe6;top:auto}.outline-drawer_btt.outline-drawer_tiny.outline-drawer_closed{bottom:-250px}.outline-drawer_btt.outline-drawer_mini.outline-drawer_closed{bottom:-330px}.outline-drawer_btt.outline-drawer_small.outline-drawer_closed{bottom:-370px}.outline-drawer_btt.outline-drawer_regular.outline-drawer_closed{bottom:-410px}.outline-drawer_btt.outline-drawer_medium.outline-drawer_closed{bottom:-450px}.outline-drawer_btt.outline-drawer_large.outline-drawer_closed{bottom:-490px}.outline-drawer_opened{visibility:visible;z-index:var(--outline-zIndex)}.outline-drawer_opened.outline-drawer{position:fixed}.outline-drawer_opened.outline-drawer_rtl{right:0}.outline-drawer_opened.outline-drawer_ltr{left:0}.outline-drawer_opened.outline-drawer_ttb{top:0}.outline-drawer_opened.outline-drawer_btt{bottom:0}.outline-drawer_offset.outline-drawer_ltr,.outline-drawer_offset.outline-drawer_rtl{height:calc(100% - 4em);top:50%;transform:translateY(-50%)}.outline-drawer_offset.outline-drawer_btt,.outline-drawer_offset.outline-drawer_ttb{left:50%;transform:translateX(-50%);width:calc(100% - 4em)}.outline-drawer_offset.outline-drawer_opened.outline-drawer_rtl{right:2em}.outline-drawer_offset.outline-drawer_opened.outline-drawer_ltr{left:2em}.outline-drawer_offset.outline-drawer_opened.outline-drawer_ttb{top:2em}.outline-drawer_offset.outline-drawer_opened.outline-drawer_btt{bottom:2em}.outline-drawer_auto.outline-drawer_ltr,.outline-drawer_auto.outline-drawer_rtl{height:auto;max-height:calc(100% - 4em)}.outline-drawer_full{padding:0} +.outline-icon{display:inline-block;position:relative;vertical-align:middle;z-index:1}.outline-icon,.outline-icon__svg{height:1em;overflow:hidden;width:1em}.outline-icon__svg{left:50%;position:absolute;top:50%;z-index:2;fill:currentcolor;transform:translate(-50%,-50%)}.outline-icon_hidden{display:none}.outline-message{background-color:#fff;border-radius:3px;box-shadow:0 0 6px 1px #dcdfe6;left:50%;opacity:.1;padding:0 50px;position:fixed;top:-50px;transform:translateX(-50%);transition:all .5s ease-in-out;z-index:9999}.outline-message,.outline-message__content{color:#666;font-size:13px;height:40px;line-height:40px;margin:0;overflow:hidden}.outline-message__content{max-width:700px;text-overflow:ellipsis;white-space:nowrap}.outline-message__close,.outline-message__icon{height:40px;line-height:40px;overflow:hidden;position:absolute;text-align:center;top:0;width:40px;z-index:2}.outline-message__icon{color:#fff;left:0}.outline-message__icon .outline-icon{left:50%;position:absolute;top:50%;transform:translate(-50%,-50%);z-index:2}.outline-message__close{color:#999;cursor:pointer;right:0}.outline-message__close .outline-icon{left:50%;position:absolute;top:50%;transform:translate(-50%,-50%);z-index:2}.outline-message__close:hover{color:#666}.outline-message_info .outline-message__icon{background-color:#507afe}.outline-message_warning .outline-message__icon{background-color:#ff9901}.outline-message_success .outline-message__icon{background-color:#058942}.outline-message_error .outline-message__icon{background-color:#ff5d5d}.outline-message_plain{min-width:190px;padding:0 50px 0 15px}.outline-message_plain.outline-message_info{background-color:#ecf8ff;border-left:5px solid #507afe}.outline-message_plain.outline-message_warning{background-color:#fffbe6;border-left:5px solid #ff9901}.outline-message_plain.outline-message_success{background-color:#e1f6eb;border-left:5px solid #058942}.outline-message_plain.outline-message_error{background-color:#fff1f0;border-left:5px solid #ff5d5d}.outline-message_plain .outline-message__icon{display:none;width:0}.outline-message_plain .outline-message__icon .outline-icon{display:none}.outline-message_light{min-width:180px;padding:0 40px}.outline-message_light.outline-message_info .outline-message__icon{color:#507afe}.outline-message_light.outline-message_warning .outline-message__icon{color:#ff9901}.outline-message_light.outline-message_success .outline-message__icon{color:#058942}.outline-message_light.outline-message_error .outline-message__icon{color:#ff5d5d}.outline-message_light .outline-message__icon{background-color:#fff}.outline-message_round{border-radius:20px}.outline-message_round.outline-message_default{min-width:180px;padding:0 40px}.outline-message_round.outline-message_default .outline-message__icon{border-radius:10px;height:20px;left:10px;line-height:20px;top:10px;width:20px}.outline-message_round.outline-message_default.outline-message_full-width{min-width:200px;padding:0 20px 0 40px}.outline-message_round.outline-message_plain{min-width:195px;padding:0 40px 0 20px}.outline-message_round.outline-message_plain.outline-message_full-width{min-width:215px;padding:0 20px}.outline-message_full-width{min-width:200px;padding:0 10px 0 50px}.outline-message_full-width.outline-message_plain{min-width:230px;padding:0 10px 0 15px}.outline-message_full-width.outline-message_light{min-width:210px;padding:0 10px 0 40px}.outline-message_visible{opacity:1}.outline-message_hidden{display:none} +.outline-toolbar{margin:0;overflow:hidden;position:fixed;transition-duration:.3s;z-index:99999}.outline-toolbar__button{background-color:#fff;border:1px solid #dcdfe6;border-radius:3px;box-shadow:0 0 6px 1px #dcdfe6;box-sizing:border-box;color:#999;cursor:pointer;height:36px;margin:10px;overflow:hidden;position:relative;text-align:center;transition:all .3s ease-in-out .1s;width:36px;z-index:1}.outline-toolbar__button:hover{border-color:#058942;color:#058942;transform:scale(1.35)}.outline-toolbar__button.hide{display:none}.outline-toolbar__anchor:hover,.outline-toolbar__anchor:link,.outline-toolbar__anchor:visited{color:#999;text-decoration:none}.outline-toolbar__anchor:hover{color:#058942}.outline-toolbar__icon{height:20px;left:50%;position:absolute;top:50%;transform:translate(-50%,-50%);width:20px;z-index:2;fill:currentcolor;overflow:hidden}.outline-toolbar_active.outline-toolbar__button{background-color:#058942;border-color:#058942;color:#fff}.outline-toolbar_active.outline-toolbar__button:hover{color:#fff}.outline-toolbar_active .outline-toolbar__anchor:hover,.outline-toolbar_active .outline-toolbar__anchor:link,.outline-toolbar_active .outline-toolbar__anchor:visited{color:#fff}.outline-toolbar_rounded.outline-toolbar__button{border-radius:18px}.outline-toolbar_disabled .outline-toolbar__anchor:hover,.outline-toolbar_disabled .outline-toolbar__anchor:link,.outline-toolbar_disabled .outline-toolbar__anchor:visited,.outline-toolbar_disabled .outline-toolbar__button,.outline-toolbar_disabled.outline-toolbar__anchor:hover,.outline-toolbar_disabled.outline-toolbar__anchor:link,.outline-toolbar_disabled.outline-toolbar__anchor:visited,.outline-toolbar_disabled.outline-toolbar__button{border-color:#999;color:#999;cursor:not-allowed}.outline-toolbar_disabled .outline-toolbar__anchor:hover:hover,.outline-toolbar_disabled .outline-toolbar__anchor:link:hover,.outline-toolbar_disabled .outline-toolbar__anchor:visited:hover,.outline-toolbar_disabled .outline-toolbar__button:hover,.outline-toolbar_disabled.outline-toolbar__anchor:hover:hover,.outline-toolbar_disabled.outline-toolbar__anchor:link:hover,.outline-toolbar_disabled.outline-toolbar__anchor:visited:hover,.outline-toolbar_disabled.outline-toolbar__button:hover{border-color:#999;color:#999}.outline-toolbar_disabled .outline-toolbar__button,.outline-toolbar_disabled.outline-toolbar__button{background-color:#f5f5f5}.outline-toolbar_btt,.outline-toolbar_ttb{left:50%;transform:translateX(-50%)}.outline-toolbar_btt .outline-toolbar__button,.outline-toolbar_ttb .outline-toolbar__button{display:inline-block}.outline-toolbar_ttb{top:12px}.outline-toolbar_ttb.outline-toolbar_hidden{top:-56px}.outline-toolbar_btt{bottom:12px}.outline-toolbar_btt.outline-toolbar_hidden{bottom:-56px}.outline-toolbar_ltr,.outline-toolbar_rtl{transform:translateY(-50%);width:56px}.outline-toolbar_rtl{right:12px;top:50%}.outline-toolbar_rtl.outline-toolbar_hidden{right:-86px}.outline-toolbar_ltr{left:12px;top:50%}.outline-toolbar_ltr.outline-toolbar_hidden{left:-86px}.outline-toolbar_btt .outline-toolbar__button.outline-toolbar_hidden,.outline-toolbar_ltr .outline-toolbar__button.outline-toolbar_hidden,.outline-toolbar_rtl .outline-toolbar__button.outline-toolbar_hidden,.outline-toolbar_ttb .outline-toolbar__button.outline-toolbar_hidden{display:none} +.outline-reader__progress{animation:outline-reader-progress linear;background-color:#507afe;height:4px;left:0;position:fixed;scale:0 1;top:0;transform-origin:left;width:100%;z-index:3;animation-timeline:--ProgressTimeline}.outline-reader__paper{background-color:#fff;box-shadow:0 0 6px 1px #ddd;box-sizing:border-box;margin:2em auto;max-width:1200px;overflow:hidden;padding:3.2em}.outline-reader__title{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Helvetica Neue,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Helvetica,Arial,sans-serif;font-size:4.2em;font-weight:400;line-height:1.3em;margin:.67em 0;overflow:hidden;text-align:center}.outline-reader__article .outline-reader__progress,.outline-reader_hidden{display:none}.outline-reader_hidden.outline-reader_sibling{display:none!important}.outline-reader_hidden.outline-reader_sibling.wrapper.post{display:none}.outline-reader--reading{background-color:#fafafa;box-sizing:border-box;display:block;height:100%;left:0;margin:0;padding:3em 4em;position:fixed;top:0;width:100%;z-index:2;scroll-timeline-name:--ProgressTimeline;overflow:scroll}@keyframes outline-reader-progress{to{scale:1 1}}@media (max-width:500px){.outline-reader{overflow:hidden}.outline-reader .outline-toolbar{align-items:center;align-self:auto;background-color:#fff;border-top:1px solid #ddd;box-sizing:border-box;display:flex;flex-direction:row;flex-wrap:nowrap;height:48px;padding:0 16px;right:0;top:100%;transform:translateY(-48px);width:100%}.outline-reader .outline-toolbar__button{border:none;border-radius:0;box-shadow:none;flex:1}.outline-reader--reading{background-color:#fff;box-sizing:border-box;padding:0}.outline-reader__paper{box-shadow:none;height:100%;margin:0;overflow:hidden;padding:0;position:relative;z-index:1}.outline-reader__title{background-color:#fff;border-bottom:1px solid #ddd;font-size:1.8em;font-weight:400;height:48px;left:0;line-height:48px;margin:0;overflow:hidden;position:absolute;text-overflow:ellipsis;top:0;white-space:nowrap;width:100%;z-index:3}.outline-reader__article{height:calc(100% - 96px);margin:48px 0;padding:0 1.25em;scroll-timeline-name:--MobileProgressTimeline;overflow-x:hidden;overflow-y:scroll}.outline-reader__article .outline-reader__progress{animation:outline-reader-progress linear;z-index:4;animation-timeline:--MobileProgressTimeline;display:block}}@media print{body,html{background-color:#fff;color:#333;font-size:12pt;height:auto!important}a:hover,a:link,a:visited{color:#507afe;text-decoration:underline!important}audio,video{display:none!important}table{border-collapse:collapse;width:100%}td,th{border:1px solid #dcdfe6;padding:8px 20px}.outline-message,.outline-toolbar{display:none!important}.outline-reader{display:block!important;overflow:hidden}.outline-reader__title{font-size:32pt!important;margin:13.4pt 0 28pt!important;text-align:center!important}.outline-reader--reading{background-color:#fff;height:auto!important;overflow:hidden!important;padding:0!important;position:relative!important}.outline-reader__progress{display:none!important}.outline-reader__paper{box-shadow:none}.outline-reader pre{border:1px solid #ddd!important;border-radius:4px!important;padding:1em!important}.outline-reader code,.outline-reader pre{background-color:#fff!important}.outline-reader img,.outline-reader svg,.outline-reader table{break-inside:avoid}.outline-reader_sibling{display:none!important}} \ No newline at end of file diff --git a/reader/reader.min.js b/reader/reader.min.js new file mode 100644 index 00000000..06c6ec6b --- /dev/null +++ b/reader/reader.min.js @@ -0,0 +1,2 @@ +!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(t="undefined"!=typeof globalThis?globalThis:t||self).Reader=e()}(this,(function(){"use strict";function t(t,e){(null==e||e>t.length)&&(e=t.length);for(var s=0,i=Array(e);sObject.prototype.toString.apply(t),o=t=>"function"==typeof t||"[object Function]"===n(t),l=t=>("[object Object]"===n(t)||"object"==typeof t||o(t))&&null!==t,a=t=>Array.isArray?Array.isArray(t):"[object Array]"===n(t),h=t=>{let e={};return null===t?null:(a(t)?e=Array.from(t):(e=Object.assign({},t),Object.keys(e).forEach((s=>e[s]=l(t[s])?h(t[s]):t[s]))),e)},c=(t,e=300)=>!!o(t)&&setTimeout((()=>{t()}),e),u=t=>"string"==typeof t,d=t=>!!(l(t)&&t.nodeName&&t.tagName&&1===t.nodeType),m=t=>{return!(!l(t)||!(d(t)||(t=>!(!l(t)||"[object NodeList]"!==n(t)))(t)||(e=t,l(e)&&"[object DocumentFragment]"===n(e))||(t=>!(!l(t)||!("[object Text]"===n(t)||t.tagName&&3===t.nodeType)))(t)));var e},p=(t,e)=>{const s=Object.prototype.hasOwnProperty;return t&&s.call(t,e)},f=(t,e)=>{const s=new RegExp("(\\s|^)"+e+"(\\s|$)");let i,r;return!!d(t)&&(i=t.className,!!i&&(r=t.classList,r&&r.contains?t.classList.contains(e):!!s.exec(i)))},b=(t,e)=>{var s;let i,r;if(f(t,e))return!1;i=t.classList,null!==(s=i)&&void 0!==s&&s.add?e.indexOf(" ")>-1?e.split(" ").forEach((t=>{i.add(t)})):i.add(e):(r=t.className,r+=r.length>0?" "+e:e,t.className=r)},g=(t,e,s)=>{let i=t.tagName.toLowerCase();switch(e){case"style":t.style.cssText=s;break;case"value":"input"===i||"textarea"===i?t.value=s:t.setAttribute(e,s);break;case"htmlFor":t.setAttribute("for",s);break;case"className":b(t,s);break;case"innerHTML":t.innerHTML=s;break;case"innerText":t.innerText=s;break;default:t.setAttribute(e,s)}},y=(t,e)=>{if(!t||!l(e))return!1;Object.keys(e).forEach((s=>{const i=e[s];p(e,s)&&g(t,s,i)}))},v=(t,e,s)=>{const i=document.createDocumentFragment(),r=document.createElement(t),n=t=>m(t)||u(t),o=t=>{let e;if(!n(t))return!1;m(t)?e=t:u(t)&&(e=document.createTextNode(t)),i.appendChild(e)};return l(e)?y(r,e):a(e)&&e.every((t=>n(t)))?e.forEach((t=>{o(t)})):m(e)?o(e):u(e)&&o(document.createTextNode(e)),a(s)?s.forEach((t=>{o(t)})):o(s),r.appendChild(i),r},$=(t,e)=>{var s;let i,r=t.className;if(!r||!f(t,e))return!1;var n;i=t.classList,null!==(s=i)&&void 0!==s&&s.remove?i.remove(e):(n=r.replace(e,""),r=!!u(n)&&n.replace(/(^\s+)|(\s+$)/g,""),t.className=r)},_=()=>{const t=navigator.userAgent;return/Mobile|mini|Fennec|Android|iP(ad|od|hone)|NokiaN[^/]*/.test(t)},x=["focusout","blur","focusin","focus","load","unload","mouseenter","mouseleave"],z=(t,e,s)=>{const i=x.indexOf(e)>-1;s._delegateListener&&delete(s=s._delegateListener)._delegateListener,function(t,e,s){const i=t._listeners;let r=-1;if(i.length<1)return!1;i.forEach(((t,i)=>{const n=t.fn;e===t.type&&(r=i,n===s&&(r=i))})),r>-1&&i.splice(r,1)}(t,e,s),t.removeEventListener(e,s,i)},w=function(t,e,s=!1){const i=u(t)?document.querySelector(t):t,r=i.childNodes,n=((t,e)=>{let s=t._listeners||[];return u(e)&&e&&(s=s.filter((t=>t.type===e))),s})(i,e);n.forEach((t=>{z(i,t.type,t.fn)})),(s||!0===e||1===arguments.length)&&i&&r&&r.forEach((t=>{d(t)&&w(t,e,s)}))},M=(t,e,s)=>{if(!o(s))return w(t,e),!1;z(t,e,s)},S=t=>{const e=Object.getPrototypeOf;let s;if(!(t=>l(t)&&null!==t)(t))return!1;if(s=t.prototype,!s)return!0;for(s=t;null!==e(s);)s=e(s);return e(t)===s},L=(t,e)=>{Object.keys(e).forEach((s=>{p(e,s)&&(t[s]=e[s])}))},T=t=>t.replace(/]*>.*?<\/script>/gi,""),E=t=>{const e={"&":"&","<":"<",">":">","'":"'",'"':"""};return t.replace(/[&<>'"]/g,(t=>e[t]||t))},C=(()=>{let t=0;return e=>(t+=1,e?e+"-"+t:"guid-"+t)})(),j=(t,e={})=>{const s="outline-icon",i=e.size||0,r=e.color||"",n=e.iconSet||"",o=a(i)?i[0]:i,l=a(i)?i[1]:i,h=i?`width:${o}px;height:${l}px;`:"",c=r?h+`color:${r}`:h,d=e.attrs||{},m=document.createElement("i");let p,f="",b="";return u(t)?((t=>{const e=new RegExp("^\\s*(?:<\\?xml[^>]*>\\s*)?(?:<\\!doctype svg[^>]*\\s*(?:\\[?(?:\\s*]*>\\s*)*\\]?)*[^>]*>\\s*)?]*>[^]*<\\/svg>\\s*$\\s*$","i");return u(t)&&e.test(t)})(t)?b=t:(f=n&&"icon"!==n?`xlink:href="#${n}-icon-${t}"`:`xlink:href="#icon-${t}"`,b=``),m.innerHTML=b,d.className?d.className=`${s} ${d.className}`:d.className=s,y(m,d),p=m.querySelector("svg"),y(p,{"aria-hidden":!0,xmlns:"http://www.w3.org/2000/svg",class:"outline-icon__svg",width:200,height:200,style:c}),m):null},A=(t,e={})=>j(t,e),k=s(r,['','','','','','','','','','','','','','','','','','','','']),O=(t,e="icon")=>u(t)?((t,e="icon")=>{const s=/id="(.*?)"/,i=/^(\w+)-/;return k.find((r=>{const n=s.exec(r)[1];return i.exec(n)[1]===e&&n===("icon"===e?`${e}-${t}`:`${e}-icon-${t}`)}))})(t,e):s(r,k),N=(t="")=>{const e=document.body;let s=document.querySelector("#outline-icons"),i=[];(t=>{if(!t)return!1;a(t)&&t.length>0?t.forEach((t=>{-1===k.indexOf(t)&&u(t)&&k.push(t)})):u(t)&&k.push(t)})(t),i=O(),s?s.innerHTML=i.join(""):(s=document.createElement("div"),s.innerHTML=``,e.insertBefore(s.firstChild,e.firstChild))},D=(t,e="")=>{const s=e.replace(/^>/i,"");return!!(e&&s&&t)&&(t.matches?t.matches(s):!!t.msMatchesSelector&&t.msMatchesSelector(s))},B=t=>t.host&&t!==document&&t.host.nodeType?t.host:t.parentNode,H=(t,e,s,i,r,n,o=!1)=>{const l=x.indexOf(s)>-1,a=function(l){const h=function(t){const e=t.target;return(s=e)&&3===s.nodeType?s.parentNode:s;var s}(l),c=((t,e,s,i)=>{const r=s||document;if(!t)return null;do{if(null!=e&&(e.startsWith(">")?t.parentNode===r&&D(t,e):D(t,e))||i&&t===r)return t;if(t===r)break}while(t=B(t))})(h,e,t);let u=n||t;l.delegateTarget=c,!0===n&&(u=r),c&&(!0===o&&M(t,s,a),i.call(u,l,r))};if(!t)return!1;t._listeners||(t._listeners=[]),t._listeners.push({el:t,selector:e,type:s,fn:a,data:r,context:n,capture:l}),i._delegateListener=a,t.addEventListener(s,a,l)},P={},U=t=>p(P,t)&&P[t].length>0,F=(t,e=!0)=>e?U(t):(t=>{let e=U(t),s=t.lastIndexOf(".");for(;!e&&-1!==s;)s=(t=t.substring(0,s)).lastIndexOf("."),e=U(t);return e})(t),V=(t,e,s=!0)=>{const i=t=>{if(!U(t))return!1;P[t].forEach((t=>{const s=["[object Int8Array]","[object Uint8Array]","[object Uint8ClampedArray]","[object Int16Array]","[object Uint16Array]","[object Int32Array]","[object Uint32Array]","[object Float32Array]","[object Float64Array]","[object BigInt64Array]","[object BigUint64Array]"].indexOf(n(e))>-1?e.toString():e;t.callback.call(t.context||t,s)}))},r=()=>{let e=t,s=t.lastIndexOf(".");for(;-1!==s;)e=e.substring(0,s),s=e.lastIndexOf("."),i(e);i(t),i("*")};if(!F(t))return!1;s?setTimeout(r,10):r()},q=t=>{if(!p(P,t))return!1;delete P[t]},R=(t,e)=>{if(!F(t))return!1;e?(t=>{const e=Object.keys(P);if(!t||e.length<1)return!1;e.forEach((e=>{const s=P[e];let i;s.forEach(((e,r)=>{e.callback!==t&&e.token!==t||(i=e.topic,s.splice(-1,r))})),s.length<1&&q(i)}))})(e):q(t)};class I{constructor(t){this.attrs={},this.name="component",t&&this.initialize(t)}initialize(t){return this.attr(t).render().addListeners(),this}attr(t,e){const s=this.attrs;return u(t)?e&&p(s,t)?(s[t]=e,this):s[t]:l(t)?(L(s,t),this):0===arguments.length?s:this}render(){return this}refresh(){return this}destroy(){return this.removeListeners(),this}reload(t){let e=this.attr();return t&&(e=this.attr(t)),this.destroy().initialize(e),this}$emit(t,e){return V(t,e),this}$on(t,e){return((t,e,s=null)=>{const i=C();let r="symbol"==typeof t?t.toString():t;o(e)&&(P[r]||(P[r]=[]),P[r].push({topic:r,callback:e,context:s,token:i}))})(t,e,this),this}$off(t,e){return R(t,e),this}addListeners(){return this}removeListeners(){return this}}const W=[];let G;N();class J extends I{constructor(t){super(),this._default(),t&&this.initialize(t)}_default(){return this.attrs=h(J.DEFAULTS),this.$el=null,this.id="",this.closed=!1,this.visible=!1,this.offset=-50,this.timer=null,this.destroyed=!1,this}initialize(t){return this.attr(t),this.id=this.attr("id"),this.offset=this.attr("offset")||-50,this.$emit("created",function(t){for(var s=1;s{this.$emit("opened"),this.close()}),1e3*t)),this}open(t){const e=this.$el;let s,i,r,n;return this.isDestroyed()||(this.isClosed()&&this.refresh(t),s=this.attr("offset"),i=this.attr("duration"),r=s&&s>=this.offset?s:this.offset,n=`top:${r}px;`,this.clearTimer(),this.$emit("beforeOpen"),c((()=>{this.visible=!0,b(e,"outline-message_visible"),e.style.cssText=n,i>0&&this.startTimer(i)}),100)),this}close(){const t=this.$el;let e,s;return this.isDestroyed()||(e=this.attr("destroyAfterClosed"),s=this.attr("beforeClose"),o(s)&&s.call(this),t.style.cssText="top:-50px;",$(t,"outline-message_visible"),this.visible=!1,this.closed=!0,c((()=>{this.$emit("closed"),e&&this.destroy()}),500)),this}destroy(){return this.$emit("beforeDestroy"),this.isDestroyed()||(this.removeListeners(),document.body.removeChild(this.$el),clearTimeout(this.timer),this._default(),this.$emit("afterDestroy")),this}onMouseEnter(){return this.clearTimer(),this}onMouseLeave(){const t=this.attr("duration"),e=this.attr("delay");return t<=0||this.startTimer(e),this}onClose(){return this.clearTimer(),this.close(),this}addListeners(){const t=this.$el;return H(t,".outline-message__content","mouseenter",this.onMouseEnter,this,!0),H(t,".outline-message__content","mouseleave",this.onMouseLeave,this,!0),H(t,".outline-message__close","click",this.onClose,this,!0),this}removeListeners(){const t=this.$el;return M(t,"mouseenter",this.onMouseEnter),M(t,"mouseleave",this.onMouseLeave),M(t,"click",this.onClose),this}}J.DEFAULTS=h({id:"",type:"info",effect:"default",round:!1,offset:30,duration:3,delay:2,message:"",customClass:"",closable:!0,visible:!0,dangerouslyUseHTMLString:!1,destroyAfterClosed:!0,beforeClose:null}),["info","success","warning","error"].forEach((t=>{J[t]=e=>{const s={},i=C("outline-message-"),r=e.beforeClose||null;let n=e.offset||30;return u(e)?s.message=e:S(e)&&L(s,e),s.id=i,s.type=t,s.offset=n,s.visible=!1,s.beforeClose=()=>{J.close(i,r)},G=new J(s),W.forEach((t=>{n+=t.$el.offsetHeight+16})),G.offset=n,G.open(),W.push(G),G}})),J.close=(t,e)=>{const s=W.length;let i,r,n=-1;if(W.forEach(((s,i)=>{t===s.id&&(r=s.$el.offsetHeight,n=i,o(e)&&e.call(s),W.splice(i,1))})),s<=1||-1===n||n>W.length-1)return!1;for(i=n;i{let t=W.length-1;for(;t>=0;t-=1)W[t].close()};class K{constructor(t,e){this.name=t,o(e)&&(this.action=e)}execute(){return this.action(),this}}class Q{constructor(){this.commands=[]}get(t){return this.commands.find((e=>e.name===t))}add(t){return this.commands.push(t),this}del(t){const e=this.commands,s=e.find((e=>e.name===t)),i=s?e.indexOf(s):-1;return i>-1&&e.splice(i,1),this}clear(){return this.commands=[],this}execute(t){const e=this.commands.find((e=>e.name===t));return o(null==e?void 0:e.execute)&&e.execute(),this}}const X=(t,e=!0)=>{const s=A(t.icon,{iconSet:t.iconSet||"outline",color:t.color||"",size:t.size}),i=v("a",{className:"outline-toolbar__anchor",href:t.link},s),r=v("div",{className:`outline-toolbar__button ${t.name}`,"data-cmd":t.name},[t.link?i:s]);return b(s,"outline-toolbar__icon"),e&&b(r,"outline-toolbar_rounded"),t.disabled&&b(r,"outline-toolbar_disabled"),r},Y="outline-toolbar_disabled",Z="outline-toolbar_hidden",tt="outline-toolbar_active";class et extends I{constructor(t){super(),this._default(),t&&this.initialize(t)}_default(){return this.attrs=h(et.DEFAULTS),this.disabled=!1,this.closed=!1,this.$el=null,this.buttons=[],this.commands=null,this}initialize(t){let e;return this.attr(t),this.disabled=this.attr("disabled"),this.closed=this.attr("closed"),this.commands=new Q,e=this.attr("created"),o(e)&&e.call(this),this.render().addListeners(),this}isHighlight(t){const e=this.get(t);return!!e&&f(e.$el,tt)}isDisabled(t){let e;return t?(e=this.get(t),e.disabled):this.disabled}isExist(t){return!!this.get(t)}isClosed(){return this.closed}_getCommand(t){const e=this,{action:s,name:i}=t;let r,n,l=null,a=null;return s?(a=s.handler,r=s.context||this,o(a)?n=a:u(a)&&(n=function(){e.$emit(a,i)}),o(n)&&(l=new K(i,n.bind(r))),l):l}get(t){return this.buttons.find((e=>e.name===t))}render(){const t=this.attr("mounted"),e=this.attr("buttons")||[],s=this.attr("placement");return N(),this.$el=v("div",{id:C("outline-toolbar"),className:`outline-toolbar outline-toolbar_${s}`}),this._paint(e),document.body.appendChild(this.$el),this.closed&&this.hide(),this.disabled&&this.disable(),o(t)&&t.call(this),this}erase(){return this.$el.innerHTML="",this}_paint(t){const e=this.attr("rounded"),s=document.createDocumentFragment();return t.forEach((t=>{const i=X(t,e),r=this._getCommand(t),{name:n,disabled:o,context:l}=t;s.appendChild(i),this.isExist(n)||(this.buttons.push({$el:i,name:n,disabled:o||!1,context:l||this}),r&&this.commands.add(r))})),this.$el.appendChild(s),this}_remove(){return document.body.removeChild(this.$el),this}refresh(t){return this.attr({buttons:t}),this.erase()._paint(t),this}add(t){const e=this.$el,s=document.createDocumentFragment(),i=this.attr("buttons")||[],{name:r,disabled:n,context:o}=t,h=this._getCommand(t),c=t=>{const e=X(t);s.appendChild(e),i.push(t),this.buttons.push({$el:e,name:r,disabled:n||!1,context:o||this,command:h}),h&&this.commands.add(h)};return l(t)?c(t):a(t)&&t.forEach((t=>{l(t)&&c(t)})),e.appendChild(s),this}remove(t){const e=this.$el,s=this.buttons,i=this.get(t);let r=-1;return i?(r=s.indexOf(i),r>-1&&(s.splice(r,1),this.attr("buttons").splice(r,1)),this._disable(t),e.removeChild(i.$el),this):this}_disable(t){const e=this.get(t),s=this.commands.get(t);return!e||e.disabled||(e.disabled=!0,s&&this.commands.del(s),b(e.$el,Y)),this}_enable(t){const e=this.get(t),s=this.commands.get(t);return e&&e.disabled?(e.disabled=!1,s&&this.commands.add(s),$(e.$el,Y),this):this}disable(t){const e=this.attr("afterDisabled");return t?this._disable(t):(b(this.$el,Y),this.removeListeners(),this.disabled=!0,o(e)&&e.call(this)),this}enable(t){const e=this.attr("afterEnabled");return t?this._enable(t):(this.disabled=!1,$(this.$el,Y),this.addListeners(),o(e)&&e.call(this)),this}show(t){const e=this.attr("afterOpened"),s=this.get(t),i=this.$el;if(t){if(!s)return this;$(s.$el,Z)}else $(i,Z),this.closed=!1,o(e)&&c((()=>{e.call(this)}),310);return this}hide(t){const e=this.attr("afterClosed"),s=this.get(t),i=this.$el;if(t){if(!s)return this;b(s.$el,Z)}else b(i,Z),this.closed=!0,o(e)&&c((()=>{e.call(this)}),310);return this}toggle(t){return this.isClosed()?this.show(t):this.hide(t),this}highlight(t){const e=this.get(t);let s;return e?(s=e.$el,f(s,tt)?$(s,tt):b(s,tt),this):this}destroy(){const t=this.attr("beforeDestroy"),e=this.attr("afterDestroy");return o(t)&&t.call(this),this.commands.clear(),this.removeListeners()._remove()._default(),o(e)&&e.call(this),this}execute(t){return this.isDisabled(t)||this.commands.execute(t),this}onExecute(t){const e=t.delegateTarget;let s="";return e&&(s=e.getAttribute("data-cmd"),s&&this.execute(s)),this}_updateToolbar({top:t,min:e,max:s}){const i=Math.ceil(t);return i<=e?(this.hide("up"),this.show("down")):i>=s?(this.hide("down"),this.show("up")):i>e&&i{t[`on${s}`]=t=>{V(s,{event:t,speech:e})}})),speechSynthesis.onvoiceschanged=t=>{V("voiceschanged",{event:t,speech:e})},this}}st.isSupport="speechSynthesis"in window;const it=(t,e)=>{let s,i=t;for(;i;)s=i.tagName.toLowerCase(),"script"!==s&&"style"!==s&&b(i,"outline-reader_sibling"),i=e?i.previousElementSibling:i.nextElementSibling},rt="进入阅读模式,按 ESC 键可退出阅读模式";class nt extends I{constructor(t){super(),this._default(),t&&this.initialize(t)}_default(){return this.attrs=h(nt.DEFAULTS),this.reading=!1,this.$target=null,this.$el=null,this.$paper=null,this.$title=null,this.$article=null,this.$progress=null,this.toolbar=null,this.speech=null,this}initialize(t){let e;return this.attr(t),e=this.attr("target"),u(e)?this.$target=document.querySelector(e):d(e)&&(this.$target=e),this.$target?(st.isSupport&&(this.speech=new st),this.render().addListeners(),this):this}isSpeaking(){var t;return null==this||null===(t=this.speech)||void 0===t?void 0:t.isSpeaking()}render(){return this._renderEdge()._paint(this.$target),this}erase(){return this.$article.innerHTML="",this}_paint(t){const e=document.createDocumentFragment(),i=s(r,t.cloneNode(!0).children);return c((()=>{i.forEach((t=>{e.appendChild(t)})),this.$article.appendChild(e)})),this}_remove(){const t=this.$el,e=this.toolbar;return t&&document.body.removeChild(t),e&&e.destroy(),this}refresh(){return this.erase()._paint(this.$target),this}_animateTimeline(){return window.ScrollTimeline&&_()?(this.$progress.animate({scale:["0 1","1 1"]},{timeline:new ScrollTimeline({source:this.$article,axis:"block"})}),this):this}_renderEdge(){const t=this.$target,e=_()?26:20;let s,i,r,n,o,l,a=this.attr("title");o=v("div",{className:"outline-reader__progress"}),this.$progress=o,r=t.querySelector("h1"),d(a)&&(r=a),d(r)&&(a=r.innerText),r=v("h1",{className:"outline-reader__title"},a),this.$title=r,n=v("article",{id:"outline-reader__article",className:"outline-reader__article"},_()?[]:[o.cloneNode()]),this.$article=n,i=v("div",{id:"outline-reader__paper",className:"outline-reader__paper"},[r,n]),this.$paper=i;const h=[];return h.push({name:"print",icon:"print",size:e,action:{context:this,handler:this.print}}),st.isSupport&&this.attr("allowSpeak")&&h.push({name:"speak",icon:"sound",size:e,action:{context:this,handler:this.speak}}),h.push({name:"exit",icon:"close",size:e,action:{context:this,handler:this.exit}}),this.toolbar=new et({placement:"rtl",buttons:h}),s=v("section",{id:"outline-reader",className:"outline-reader outline-reader_hidden"},[o,i,this.toolbar.$el]),this.$el=s,document.body.appendChild(s),this._animateTimeline(),c((()=>{l=s.previousElementSibling,it(l,!0),l=s.nextElementSibling,it(l)})),this}enter(){const t="outline-reader",e=`${t}--reading`,s=`${t}_hidden`,i=this.$el,r=document.querySelectorAll(".outline-reader_sibling"),n=this.attr("enterReadingTip")||rt;return this.reading||!i||(r.forEach((t=>{b(t,s)})),b(i,e),$(i,s),this.toolbar.show(),this.reading=!0,J.info({round:!0,message:n}),this.$emit("reader:enter")),this}exit(){const t="speak",e="outline-reader",s=`${e}--reading`,i=`${e}_hidden`,r=this.$el,n=document.querySelectorAll(".outline-reader_sibling"),o=this.speech,l=this.toolbar;return this.reading&&r?(b(r,i),$(r,s),n.forEach((t=>{$(t,i)})),l.hide(),this.reading=!1,o&&(l.isHighlight(t)&&l.highlight(t),o.cancel()),this.$emit("reader:exit"),this):this}toggle(){return this.reading?this.exit():this.enter(),this}speak(){const t=this.$article.innerText,e=this.speech;return st.isSupport&&e?(this.toolbar.highlight("speak"),this.isSpeaking()?e.cancel():e.speak(t),this):this}print(){return o(print)?(print(),this):this}destroy(){return this.$el?(this.removeListeners()._remove()._default(),this):this}onPrint(){return this.print(),this}onEnterReading(){return this.toggle(),this}onExitReading(t){return 27===t.keyCode&&this.reading&&(this.toggle(),function(t){t.stopPropagation(),t.preventDefault()}(t)),this}onRefresh(){return this.refresh(),this}addListeners(){return this.$el?(((t,e,s,i,r,n=!1)=>{const l=x.indexOf(e)>-1,a=function(o){let l=r||t;!0===r&&(l=i),!0===n&&M(t,e,a),s.call(l,o,i)};if(!o(s))return!1;t._listeners||(t._listeners=[]),t._listeners.push({el:t,type:e,fn:a,data:i,context:r,capture:l}),s._delegateListener=a,t.addEventListener(e,a,l)})(document,"keyup",this.onExitReading,this,!0),this.$on("toolbar:action:print",this.onPrint),this.$on("toolbar:action:reading",this.onEnterReading),this.$on("reader:print",this.onPrint),this.$on("reader:refresh",this.onRefresh),this.$on("reader:enter",this.enter),this.$on("reader:exit",this.exit),this.$on("reader:toggle",this.toggle),this):this}removeListeners(){return this.$el?(M(document,"keyup",this.onExitReading),this.$off("toolbar:action:print"),this.$off("toolbar:action:reading"),this.$off("reader:refresh"),this.$off("reader:toggle"),this):this}}return nt.DEFAULTS=h({target:"",title:"",enterReadingTip:rt,allowSpeak:!1}),nt})); +//# sourceMappingURL=reader.min.js.map diff --git a/reader/reader.min.js.map b/reader/reader.min.js.map new file mode 100644 index 00000000..267ef867 --- /dev/null +++ b/reader/reader.min.js.map @@ -0,0 +1 @@ +{"version":3,"file":"reader.min.js","sources":["../utils/lang/toString.js","../utils/types/isFunction.js","../utils/types/isObject.js","../utils/types/isArray.js","../utils/lang/cloneDeep.js","../utils/lang/later.js","../utils/types/isString.js","../utils/types/isElement.js","../utils/types/isDOM.js","../utils/types/isHTMLCollection.js","../utils/types/isFragment.js","../utils/types/isTextNode.js","../utils/lang/hasOwn.js","../utils/dom/hasClass.js","../utils/dom/addClass.js","../utils/dom/setAttribute.js","../utils/dom/setAttributes.js","../utils/dom/createElement.js","../utils/dom/removeClass.js","../utils/lang/trim.js","../utils/dom/isMobile.js","../utils/event/enum.js","../utils/event/_off.js","../utils/event/_delete.js","../utils/event/purgeElement.js","../utils/event/getListeners.js","../utils/event/off.js","../utils/types/isPlainObject.js","../utils/types/isObjectLike.js","../utils/lang/extend.js","../utils/lang/stripScripts.js","../utils/lang/encodeHTML.js","../utils/lang/guid.js","../utils/icons/createElement.js","../utils/types/isSVG.js","../utils/icons/icon.js","../utils/icons/symbols.js","../utils/icons/defaults.js","../utils/icons/getSymbols.js","../utils/icons/getSymbol.js","../utils/icons/paint.js","../utils/icons/add.js","../utils/dom/matches.js","../utils/dom/getParentOrHost.js","../utils/event/on.js","../utils/event/getTarget.js","../utils/dom/resolveTextNode.js","../utils/dom/closest.js","../utils/observer/_subscribers.js","../utils/observer/_hasDirectSubscribersFor.js","../utils/observer/has.js","../utils/observer/_hasSubscribers.js","../utils/observer/emit.js","../utils/types/isTypedArray.js","../utils/observer/_removeSubscriber.js","../utils/observer/off.js","../utils/observer/_removeSubscriberByToken.js","../component.js","../utils/observer/on.js","../message/message.js","../command.js","../commands.js","../toolbar/utils/_createButton.js","../toolbar/toolbar.js","../speech.js","utils/_updateSiblingElements.js","reader.js","../utils/event/stop.js","../utils/event/at.js"],"sourcesContent":["/**\r\n * Object 对象原型上的 toString 方法\r\n * ========================================================================\r\n * @method toString\r\n * @param {*} val\r\n * @returns {string}\r\n */\r\nconst toString = (val) => {\r\n return Object.prototype.toString.apply(val)\r\n}\r\n\r\nexport default toString\r\n","import toString from '@/utils/lang/toString'\r\n\r\n/**\r\n * 检测测试数据是否为 Function 类型\r\n * ========================================================================\r\n * @method isFunction\r\n * @param {*} val - (必须)待检测的数据\r\n * @returns {boolean} 'val' 是 Function 类型返回 true,否则返回 false\r\n */\r\nconst isFunction = (val) => {\r\n return typeof val === 'function' || toString(val) === '[object Function]'\r\n}\r\n\r\nexport default isFunction\r\n","import toString from '../lang/toString'\r\nimport isFunction from './isFunction'\r\n\r\n/**\r\n * 检测数据是否为 Object 类型\r\n * ========================================================================\r\n * @method isObject\r\n * @param {*} o\r\n * @returns {boolean}\r\n */\r\nconst isObject = (o) => {\r\n return (\r\n (toString(o) === '[object Object]' ||\r\n typeof o === 'object' ||\r\n isFunction(o)) &&\r\n o !== null\r\n )\r\n}\r\n\r\nexport default isObject\r\n","import toString from '@/utils/lang/toString'\r\n\r\n/**\r\n * 检测数据是否为 Array 类型\r\n * ========================================================================\r\n * @method isArray\r\n * @param {*} o\r\n * @returns {boolean}\r\n */\r\nconst isArray = (o) => {\r\n if (Array.isArray) {\r\n return Array.isArray(o)\r\n } else {\r\n return toString(o) === '[object Array]'\r\n }\r\n}\r\n\r\nexport default isArray\r\n","import isObject from '@/utils/types/isObject'\r\nimport isArray from '@/utils/types/isArray'\r\n\r\n/**\r\n * 深拷贝对象函数\r\n * ========================================================================\r\n * @methods cloneDeep\r\n * @param {Object} obj - 深拷贝的对象\r\n * @returns {Array|Object|*}\r\n *\r\n * @example\r\n * const arr = cloneDeep([2,3,4,6])\r\n * => [2,3,4,6]\r\n */\r\nconst cloneDeep = (obj) => {\r\n let clone = {}\r\n\r\n if (obj === null) {\r\n return null\r\n }\r\n\r\n if (isArray(obj)) {\r\n clone = Array.from(obj)\r\n } else {\r\n clone = Object.assign({}, obj)\r\n Object.keys(clone).forEach((key) => {\r\n return (clone[key] = isObject(obj[key]) ? cloneDeep(obj[key]) : obj[key])\r\n })\r\n }\r\n\r\n return clone\r\n}\r\n\r\nexport default cloneDeep\r\n","import isFunction from '@/utils/types/isFunction'\r\n\r\n/**\r\n * later - 延迟执行方法\r\n * ========================================================================\r\n * @method later\r\n * @param {Function} fn\r\n * @param {Number} [delay]\r\n * @returns {number|boolean}\r\n */\r\nconst later = (fn, delay = 300) => {\r\n if (!isFunction(fn)) {\r\n return false\r\n }\r\n\r\n return setTimeout(() => {\r\n fn()\r\n }, delay)\r\n}\r\n\r\nexport default later\r\n","/**\r\n * 检测数据是否为 String 类型\r\n * ========================================================================\r\n * @method isArray\r\n * @param {*} str\r\n * @returns {boolean}\r\n */\r\nconst isString = (str) => {\r\n return typeof str === 'string'\r\n}\r\n\r\nexport default isString\r\n","import isObject from './isObject'\r\n\r\n/**\r\n * 检测数据是否为 HTMLElement DOM 节点\r\n * ========================================================================\r\n * @method isElement\r\n * @param {*} o\r\n * @returns {boolean}\r\n */\r\nconst isElement = (o) => {\r\n return !!(isObject(o) && o.nodeName && o.tagName && o.nodeType === 1)\r\n}\r\n\r\nexport default isElement\r\n","import isObject from './isObject'\r\nimport isElement from './isElement'\r\nimport isHTMLCollection from './isHTMLCollection'\r\nimport isFragment from './isFragment'\r\nimport isTextNode from './isTextNode'\r\n\r\nconst isDOM = (el) => {\r\n return !!(\r\n isObject(el) &&\r\n (isElement(el) || isHTMLCollection(el) || isFragment(el) || isTextNode(el))\r\n )\r\n}\r\n\r\nexport default isDOM\r\n","import toString from '@/utils/lang/toString'\r\nimport isObject from './isObject'\r\n\r\nconst isHTMLCollection = (el) => {\r\n return !!(isObject(el) && toString(el) === '[object NodeList]')\r\n}\r\n\r\nexport default isHTMLCollection\r\n","import toString from '@/utils/lang/toString'\r\nimport isObject from './isObject'\r\n\r\nconst isFragment = (fragment) => {\r\n return !!(\r\n isObject(fragment) && toString(fragment) === '[object DocumentFragment]'\r\n )\r\n}\r\n\r\nexport default isFragment\r\n","import toString from '@/utils/lang/toString'\r\nimport isObject from './isObject'\r\n\r\nconst isTextNode = (el) => {\r\n return !!(\r\n isObject(el) &&\r\n (toString(el) === '[object Text]' || (el.tagName && el.nodeType === 3))\r\n )\r\n}\r\n\r\nexport default isTextNode\r\n","/**\r\n * 检测对象自身属性中是否具有指定的属性。\r\n * ========================================================================\r\n * @method hasOwn\r\n * @param {Object} obj - (必须)检测的目标对象\r\n * @param {String} prop - (必须)属性名\r\n * @returns {Boolean}\r\n */\r\nconst hasOwn = (obj, prop) => {\r\n const hasOwnProperty = Object.prototype.hasOwnProperty\r\n return obj && hasOwnProperty.call(obj, prop)\r\n}\r\n\r\nexport default hasOwn\r\n","import isElement from '../types/isElement'\r\n/**\r\n * 检测 DOM 节点是否包含名为 className 的样式\r\n * ========================================================================\r\n * @method hasClass\r\n * @param {HTMLElement} el - DOM 节点\r\n * @param {String} className - 样式名称\r\n * @returns {Boolean}\r\n */\r\nconst hasClass = (el, className) => {\r\n const pattern = new RegExp('(\\\\s|^)' + className + '(\\\\s|$)')\r\n let allClass\r\n let classList\r\n\r\n if (!isElement(el)) {\r\n return false\r\n }\r\n\r\n allClass = el.className\r\n\r\n if (!allClass) {\r\n return false\r\n }\r\n\r\n classList = el.classList\r\n\r\n if (classList && classList.contains) {\r\n return el.classList.contains(className)\r\n }\r\n\r\n return !!pattern.exec(allClass)\r\n}\r\n\r\nexport default hasClass\r\n","import hasClass from './hasClass'\r\n\r\n/**\r\n * 给 DOM 节点添加名为 className 的样式\r\n * ========================================================================\r\n * @method addClass\r\n * @param {HTMLElement} el - DOM 节点\r\n * @param {String} className - 样式名称\r\n * @returns {Boolean}\r\n */\r\nconst addClass = (el, className) => {\r\n let classList\r\n let allClass\r\n\r\n if (hasClass(el, className)) {\r\n return false\r\n }\r\n\r\n classList = el.classList\r\n\r\n if (classList?.add) {\r\n if (className.indexOf(' ') > -1) {\r\n className.split(' ').forEach((name) => {\r\n classList.add(name)\r\n })\r\n } else {\r\n classList.add(className)\r\n }\r\n } else {\r\n allClass = el.className\r\n allClass += allClass.length > 0 ? ' ' + className : className\r\n el.className = allClass\r\n }\r\n}\r\n\r\nexport default addClass\r\n","import addClass from './addClass.js'\r\n\r\n/**\r\n * 给 DOM 节点设置属性/值\r\n * ========================================================================\r\n * @method setAttribute\r\n * @param {HTMLElement} el - DOM 节点\r\n * @param {String} attr - 属性名称\r\n * @param {String|Number|Boolean} value - 属性值\r\n */\r\nconst setAttribute = (el, attr, value) => {\r\n let tagName = el.tagName.toLowerCase()\r\n\r\n switch (attr) {\r\n case 'style':\r\n el.style.cssText = value\r\n break\r\n case 'value':\r\n if (tagName === 'input' || tagName === 'textarea') {\r\n el.value = value\r\n } else {\r\n el.setAttribute(attr, value)\r\n }\r\n break\r\n case 'htmlFor':\r\n el.setAttribute('for', value)\r\n break\r\n case 'className':\r\n addClass(el, value)\r\n break\r\n case 'innerHTML':\r\n el.innerHTML = value\r\n break\r\n case 'innerText':\r\n el.innerText = value\r\n break\r\n default:\r\n el.setAttribute(attr, value)\r\n break\r\n }\r\n}\r\n\r\nexport default setAttribute\r\n","import isObject from '../types/isObject'\r\nimport hasOwn from '../lang/hasOwn'\r\nimport setAttribute from './setAttribute'\r\n\r\nconst setAttributes = (el, attrs) => {\r\n if (!el || !isObject(attrs)) {\r\n return false\r\n }\r\n\r\n Object.keys(attrs).forEach((attr) => {\r\n const value = attrs[attr]\r\n if (hasOwn(attrs, attr)) {\r\n setAttribute(el, attr, value)\r\n }\r\n })\r\n}\r\n\r\nexport default setAttributes\r\n","import isObject from '../types/isObject'\r\nimport isString from '../types/isString'\r\nimport isArray from '../types/isArray'\r\nimport isDOM from '../types/isDOM'\r\nimport setAttributes from './setAttributes'\r\n\r\n/**\r\n * 创建 DOM 节点,并添加属性和子节点\r\n * ========================================================================\r\n * @method createElement\r\n * @param {String} tagName - 标签名称\r\n * @param {Object|Array|HTMLElement|DocumentFragment|String} attrs - 属性对象或者子节点\r\n * @param {Array|HTMLElement|DocumentFragment|String} [children] - 子节点数组\r\n * @returns {HTMLElement}\r\n */\r\nconst createElement = (tagName, attrs, children) => {\r\n const $fragment = document.createDocumentFragment()\r\n const $el = document.createElement(tagName)\r\n const isValidChild = (child) => {\r\n return isDOM(child) || isString(child)\r\n }\r\n const append = (child) => {\r\n let $child\r\n\r\n if (!isValidChild(child)) {\r\n return false\r\n }\r\n\r\n if (isDOM(child)) {\r\n $child = child\r\n } else if (isString(child)) {\r\n $child = document.createTextNode(child)\r\n }\r\n\r\n $fragment.appendChild($child)\r\n }\r\n\r\n if (isObject(attrs)) {\r\n setAttributes($el, attrs)\r\n } else if (isArray(attrs) && attrs.every((attr) => isValidChild(attr))) {\r\n attrs.forEach((child) => {\r\n append(child)\r\n })\r\n } else if (isDOM(attrs)) {\r\n append(attrs)\r\n } else if (isString(attrs)) {\r\n append(document.createTextNode(attrs))\r\n }\r\n\r\n if (isArray(children)) {\r\n children.forEach((child) => {\r\n append(child)\r\n })\r\n } else {\r\n append(children)\r\n }\r\n\r\n $el.appendChild($fragment)\r\n\r\n return $el\r\n}\r\n\r\nexport default createElement\r\n","import trim from '../lang/trim'\r\nimport hasClass from './hasClass'\r\n\r\n/**\r\n * 移除 DOM 节点的 className 样式\r\n * ========================================================================\r\n * @method removeClass\r\n * @param {HTMLElement} el - DOM 节点\r\n * @param {String} className - 样式名称\r\n * @returns {Boolean}\r\n */\r\nconst removeClass = (el, className) => {\r\n let allClass = el.className\r\n let classList\r\n\r\n if (!allClass || !hasClass(el, className)) {\r\n return false\r\n }\r\n\r\n classList = el.classList\r\n\r\n if (classList?.remove) {\r\n classList.remove(className)\r\n } else {\r\n allClass = trim(allClass.replace(className, ''))\r\n el.className = allClass\r\n }\r\n}\r\n\r\nexport default removeClass\r\n","import isString from '@/utils/types/isString'\r\n\r\n/**\r\n * 清楚字符串起始位置所有的空格\r\n * ========================================================================\r\n * @method trim\r\n * @param {string} str\r\n * @returns {string|Boolean}\r\n */\r\nconst trim = (str) => {\r\n if (!isString(str)) {\r\n return false\r\n }\r\n return str.replace(/(^\\s+)|(\\s+$)/g, '')\r\n}\r\n\r\nexport default trim\r\n","/**\r\n * 检测当前设备是否为移动设备\r\n * ========================================================================\r\n * @method isMobile\r\n * @return {boolean}\r\n */\r\nconst isMobile = () => {\r\n const ua = navigator.userAgent\r\n\r\n return /Mobile|mini|Fennec|Android|iP(ad|od|hone)|NokiaN[^/]*/.test(ua)\r\n}\r\n\r\nexport default isMobile\r\n","export const CAPTURE_EVENTS = [\r\n 'focusout',\r\n 'blur',\r\n 'focusin',\r\n 'focus',\r\n 'load',\r\n 'unload',\r\n 'mouseenter',\r\n 'mouseleave'\r\n]\r\n","import { CAPTURE_EVENTS } from './enum'\r\nimport _delete from './_delete'\r\n\r\n/**\r\n * (私有方法)取消 type 类型的代理事件绑定\r\n * ========================================================================\r\n * 如果没有设置 handler,则销毁 this.$options 绑定的所有符合 type 事件类型的事件绑定\r\n * ========================================================================\r\n * @method _off\r\n * @param {HTMLElement} el - (必须)取消事件绑定的 DOM 元素\r\n * @param {String} type - (必须)事件类型\r\n * @param {Function} fn - (必须)事件处理器回调函数\r\n * @private\r\n */\r\nconst _off = (el, type, fn) => {\r\n const capture = CAPTURE_EVENTS.indexOf(type) > -1\r\n\r\n /* istanbul ignore else */\r\n if (fn._delegateListener) {\r\n fn = fn._delegateListener\r\n delete fn._delegateListener\r\n }\r\n\r\n // 移除缓存的 _listeners 数据\r\n _delete(el, type, fn)\r\n\r\n el.removeEventListener(type, fn, capture)\r\n}\r\n\r\nexport default _off\r\n","/**\r\n * 删除 DOM 元素缓存的 _listeners 数据\r\n * ========================================================================\r\n * @method _delete\r\n * @param {HTMLElement} el - 要删除 listener 的 DOM 元素\r\n * @param {String} type - 事件类型(名称)\r\n * @param {Function} [fn] - 事件处理器回调函数\r\n */\r\nconst _delete = function (el, type, fn) {\r\n const listeners = el._listeners\r\n let index = -1\r\n\r\n if (listeners.length < 1) {\r\n return false\r\n }\r\n\r\n // 移除缓存的 _listeners 数据\r\n listeners.forEach((listener, i) => {\r\n const handler = listener.fn\r\n\r\n if (type === listener.type) {\r\n index = i\r\n\r\n if (handler === fn) {\r\n index = i\r\n }\r\n }\r\n })\r\n\r\n /* istanbul ignore else */\r\n if (index > -1) {\r\n listeners.splice(index, 1)\r\n }\r\n}\r\n\r\nexport default _delete\r\n","import isString from '@/utils/types/isString'\r\nimport isElement from '@/utils/types/isElement'\r\nimport getListeners from './getListeners'\r\nimport _off from './_off'\r\n\r\n/**\r\n * 销毁(type 类型的)代理事件绑定\r\n * ========================================================================\r\n * 1. 设置了事件类型 type,则销毁指定类型的事件绑定,否则清除所有代理事件绑定\r\n * 2. recurse 设置为 true,递归销毁子节点全部事件绑定\r\n * ========================================================================\r\n * @method purgeElement\r\n * @param {HTMLElement|String} el - (必须)DOM 元素或者其选择器\r\n * @param {String|Boolean} type - (必须)事件类型\r\n * @param {Boolean} [recurse] - (可选)是否递归销毁子节点所有事件绑定\r\n */\r\nconst purgeElement = function (el, type, recurse = false) {\r\n const $element = isString(el) ? document.querySelector(el) : el\r\n const $children = $element.childNodes\r\n const listeners = getListeners($element, type)\r\n\r\n listeners.forEach((listener) => {\r\n _off($element, listener.type, listener.fn)\r\n })\r\n\r\n if (\r\n (recurse || type === true || arguments.length === 1) &&\r\n $element &&\r\n $children\r\n ) {\r\n $children.forEach(($child) => {\r\n if (isElement($child)) {\r\n purgeElement($child, type, recurse)\r\n }\r\n })\r\n }\r\n}\r\n\r\nexport default purgeElement\r\n","import isString from '@/utils/types/isString'\r\n\r\n/**\r\n * 获取 DOM 元素(type 事件类型)事件绑定信息\r\n * ========================================================================\r\n * 如果设置了事件类型 type, 则返回指定类型的事件绑定信息,否则返回所有事件绑定信息\r\n * ========================================================================\r\n * @methods getListeners\r\n * @param {HTMLElement} el - (必须)要获取事件绑定信息的 DOM 元素\r\n * @param {String} [type] - (可选)事件类型\r\n * @returns {Array} - 已绑定的事件信息\r\n */\r\nconst getListeners = (el, type) => {\r\n let listeners = el._listeners || []\r\n\r\n if (isString(type) && type) {\r\n listeners = listeners.filter((listener) => {\r\n return listener.type === type\r\n })\r\n }\r\n\r\n return listeners\r\n}\r\n\r\nexport default getListeners\r\n","import purgeElement from './purgeElement'\r\nimport isFunction from '../types/isFunction'\r\nimport _off from './_off'\r\n\r\n/**\r\n * 取消 type 类型的代理事件绑定\r\n * ========================================================================\r\n * 如果没有设置 handler,则销毁 this.$options 绑定的所有符合 type 事件类型的事件绑定\r\n * ========================================================================\r\n * @method off\r\n * @param {HTMLElement|Object} el - (必须)取消事件绑定的 DOM 元素\r\n * @param {String} type - (必须)事件类型\r\n * @param {Function} [fn] - (可选)事件处理器回调函数\r\n */\r\nconst off = (el, type, fn) => {\r\n // 如果不设置 fn 参数,默认清除 el 元素上绑定的所有事件处理器\r\n if (!isFunction(fn)) {\r\n purgeElement(el, type)\r\n return false\r\n }\r\n\r\n _off(el, type, fn)\r\n}\r\n\r\nexport default off\r\n","import isObjectLike from './isObjectLike'\r\n\r\n/**\r\n * 检测测试数据是否为普通对象\r\n * ========================================================================\r\n * @method isPlainObject\r\n * @param {Object} val - 要检测的数据\r\n * @returns {Boolean} 'val' 是普通对象,返回 true,否则返回 false\r\n */\r\nconst isPlainObject = (val) => {\r\n const getPrototypeOf = Object.getPrototypeOf\r\n let proto\r\n\r\n // Detect obvious negatives\r\n if (!isObjectLike(val)) {\r\n return false\r\n }\r\n\r\n proto = val.prototype\r\n\r\n // JavaScript 对象分为两种:普通对象和函数对象\r\n // 普通对象:原型是 __proto__,没有 prototype 原型(属性)\r\n // 函数对象:原型是 prototype ,prototype 只存在于函数对象上\r\n if (!proto) {\r\n return true\r\n }\r\n\r\n proto = val\r\n\r\n while (getPrototypeOf(proto) !== null) {\r\n proto = getPrototypeOf(proto)\r\n }\r\n\r\n return getPrototypeOf(val) === proto\r\n}\r\n\r\nexport default isPlainObject\r\n","import isObject from './isObject'\r\n\r\n/**\r\n * 检测测试数据是否为类似 Object 类型\r\n * ========================================================================\r\n * @method isObjectLike\r\n * @param {Object} val - 要检测的数据\r\n * @returns {Boolean} 'val' 是类似 Object 类型,返回 true,否则返回 false\r\n */\r\nconst isObjectLike = (val) => {\r\n return isObject(val) && val !== null\r\n}\r\n\r\nexport default isObjectLike\r\n","import hasOwn from './hasOwn'\r\n\r\n/**\r\n * 扩展对象\r\n * ========================================================================\r\n * @method extend\r\n * @param {Object} origin\r\n * @param {Object} source\r\n */\r\nconst extend = (origin, source) => {\r\n const keys = Object.keys(source)\r\n\r\n keys.forEach((prop) => {\r\n if (hasOwn(source, prop)) {\r\n origin[prop] = source[prop]\r\n }\r\n })\r\n}\r\n\r\nexport default extend\r\n","/**\r\n * 移除字符串中的 JavaScript 代码\r\n * ====================================================\r\n * @param {String} str\r\n * @returns {String}\r\n */\r\nconst stripScripts = (str) => {\r\n return str.replace(/]*>.*?<\\/script>/gi, '')\r\n}\r\n\r\nexport default stripScripts\r\n","/**\r\n * 转义字符串中的 HTML 标签\r\n * ========================================================================\r\n * @param {String} str - 需要转义的字符串\r\n * @returns {String}\r\n */\r\nconst encodeHTML = (str) => {\r\n const CHARTS = {\r\n '&': '&',\r\n '<': '<',\r\n '>': '>',\r\n \"'\": ''',\r\n '\"': '"'\r\n }\r\n\r\n return str.replace(/[&<>'\"]/g, (tag) => {\r\n return CHARTS[tag] || tag\r\n })\r\n}\r\n\r\nexport default encodeHTML\r\n","/**\r\n * 生成唯一 id 字符串的函数\r\n * ========================================================================\r\n * @method guid\r\n * @param {String} [prefix] - 生成 id 的前缀字符串\r\n * @return {String} 返回一个表示唯一 id 的字符串\r\n */\r\nconst guid = (() => {\r\n let uuid = 0\r\n\r\n return (prefix) => {\r\n uuid += 1\r\n\r\n return prefix ? prefix + '-' + uuid : 'guid-' + uuid\r\n }\r\n})()\r\n\r\nexport default guid\r\n","import isArray from '@/utils/types/isArray'\r\nimport isString from '@/utils/types/isString'\r\nimport isSVG from '@/utils/types/isSVG'\r\nimport setAttributes from '@/utils/dom/setAttributes'\r\n\r\n/**\r\n * 创建 SVG 图标 DOM 元素\r\n * ========================================================================\r\n * @method createElement\r\n * @param {String} name\r\n * @param {Object} [options]\r\n * @param {Number|Array} [options.size]\r\n * @param {String} [options.color]\r\n * @param {String} [options.iconSet]\r\n * @param {Object} [options.attrs]\r\n * @returns {HTMLElement}\r\n */\r\nconst createElement = (name, options = {}) => {\r\n const ICON = 'outline-icon'\r\n const size = options.size || 0\r\n const color = options.color || ''\r\n const iconSet = options.iconSet || ''\r\n const width = isArray(size) ? size[0] : size\r\n const height = isArray(size) ? size[1] : size\r\n const defaultRules = size ? `width:${width}px;height:${height}px;` : ''\r\n const cssRules = color ? defaultRules + `color:${color}` : defaultRules\r\n const attrs = options.attrs || {}\r\n const $icon = document.createElement('i')\r\n let binds = ''\r\n let svg = ''\r\n let $svg\r\n\r\n if (!isString(name)) {\r\n return null\r\n }\r\n\r\n if (isSVG(name)) {\r\n svg = name\r\n } else {\r\n binds =\r\n iconSet && iconSet !== 'icon'\r\n ? `xlink:href=\"#${iconSet}-icon-${name}\"`\r\n : `xlink:href=\"#icon-${name}\"`\r\n svg = ``\r\n }\r\n\r\n $icon.innerHTML = svg\r\n\r\n if (attrs.className) {\r\n attrs.className = `${ICON} ${attrs.className}`\r\n } else {\r\n attrs.className = ICON\r\n }\r\n\r\n setAttributes($icon, attrs)\r\n\r\n $svg = $icon.querySelector('svg')\r\n setAttributes($svg, {\r\n 'aria-hidden': true,\r\n xmlns: 'http://www.w3.org/2000/svg',\r\n class: 'outline-icon__svg',\r\n width: 200,\r\n height: 200,\r\n style: cssRules\r\n })\r\n\r\n return $icon\r\n}\r\n\r\nexport default createElement\r\n","import isString from './isString'\r\n\r\nconst isSVG = (str) => {\r\n const declaration = '(?:<\\\\?xml[^>]*>\\\\s*)?'\r\n const doctype =\r\n '(?:<\\\\!doctype svg[^>]*\\\\s*(?:\\\\[?(?:\\\\s*]*>\\\\s*)*\\\\]?)*[^>]*>\\\\s*)?'\r\n const content = ']*>[^]*<\\\\/svg>\\\\s*$'\r\n const svg = `^\\\\s*${declaration}${doctype}${content}\\\\s*$`\r\n const pattern = new RegExp(svg, 'i')\r\n\r\n return isString(str) && pattern.test(str)\r\n}\r\n\r\nexport default isSVG\r\n","import createElement from './createElement'\r\n\r\n/**\r\n * 创建 SVG 图标 DOM 元素\r\n * ========================================================================\r\n * @method icon\r\n * @alias createElement\r\n * @see createElement\r\n * @param {String} name\r\n * @param {Object} [options]\r\n * @param {Number|Array} [options.size]\r\n * @param {String} [options.color]\r\n * @param {String} [options.iconSet]\r\n * @returns {HTMLElement}\r\n */\r\nconst icon = (name, options = {}) => {\r\n return createElement(name, options)\r\n}\r\n\r\nexport default icon\r\n","import DEFAULTS from './defaults'\r\n\r\nconst SYMBOLS = [...DEFAULTS]\r\n\r\nexport default SYMBOLS\r\n","const DEFAULTS = [\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n ''\r\n]\r\n\r\nexport default DEFAULTS\r\n","import isString from '@/utils/types/isString'\r\nimport getSymbol from './getSymbol'\r\nimport SYMBOLS from './symbols'\r\n\r\n/**\r\n *\r\n * @method getSymbols\r\n * @param {String} [name]\r\n * @param {String} [iconSet]\r\n * @returns {string[]|*}\r\n */\r\nconst getSymbols = (name, iconSet = 'icon') => {\r\n if (isString(name)) {\r\n return getSymbol(name, iconSet)\r\n }\r\n\r\n return [...SYMBOLS]\r\n}\r\n\r\nexport default getSymbols\r\n","import SYMBOLS from './symbols'\r\n\r\n/**\r\n * @method getSymbol\r\n * @param {String} name\r\n * @param {String} [iconSet]\r\n * @returns {String}\r\n */\r\nconst getSymbol = (name, iconSet = 'icon') => {\r\n const patternName = /id=\"(.*?)\"/\r\n const patternSet = /^(\\w+)-/\r\n const symbols = SYMBOLS\r\n\r\n return symbols.find((symbol) => {\r\n const names = patternName.exec(symbol)\r\n const fullName = names[1]\r\n const sets = patternSet.exec(fullName)\r\n const setName = sets[1]\r\n const iconName =\r\n iconSet === 'icon' ? `${iconSet}-${name}` : `${iconSet}-icon-${name}`\r\n\r\n return setName === iconSet && fullName === iconName\r\n })\r\n}\r\n\r\nexport default getSymbol\r\n","import add from './add'\r\nimport getSymbols from './getSymbols'\r\n\r\n/**\r\n * 绘制 SVG 图标集\r\n * ========================================================================\r\n * @method paint\r\n * @param {String|Array} symbol\r\n */\r\nconst paint = (symbol = '') => {\r\n const $body = document.body\r\n let $icons = document.querySelector('#outline-icons')\r\n let symbols = []\r\n\r\n add(symbol)\r\n symbols = getSymbols()\r\n\r\n if ($icons) {\r\n $icons.innerHTML = symbols.join('')\r\n } else {\r\n $icons = document.createElement('div')\r\n $icons.innerHTML =\r\n ``\r\n $body.insertBefore($icons.firstChild, $body.firstChild)\r\n }\r\n}\r\n\r\nexport default paint\r\n","import isArray from '@/utils/types/isArray'\r\nimport isString from '@/utils/types/isString'\r\nimport SYMBOLS from './symbols'\r\n\r\n/**\r\n * @method add\r\n * @param {Array|String} symbols\r\n * @return {Boolean}\r\n */\r\nconst add = (symbols) => {\r\n if (!symbols) {\r\n return false\r\n }\r\n\r\n if (isArray(symbols) && symbols.length > 0) {\r\n symbols.forEach((symbol) => {\r\n /* istanbul ignore else */\r\n if (SYMBOLS.indexOf(symbol) === -1 && isString(symbol)) {\r\n SYMBOLS.push(symbol)\r\n }\r\n })\r\n } else {\r\n /* istanbul ignore else */\r\n if (isString(symbols)) {\r\n SYMBOLS.push(symbols)\r\n }\r\n }\r\n}\r\n\r\nexport default add\r\n","/**\r\n * 获取 options 节点下匹配 selector 选择器的 DOM 节点\r\n * ========================================================================\r\n * Element.matches() 方法可以用来判断 DOM 元素是否与给定的选择器匹配,事件代理判断是\r\n * 否触发绑定的代理事件回调函数,关键就是使用 Element.matches() 辨别当前事件触发的目\r\n * 标 DOM 元素是否为事件代理所期望触发的目标。\r\n * ========================================================================\r\n * @method matches\r\n * @see https://developer.mozilla.org/en-US/docs/web/api/element/matches\r\n * @param {HTMLElement} el - (必须)DOM 元素\r\n * @param {String} selector - (必须)匹配 DOM 元素的选择器\r\n * @returns {Boolean}\r\n */\r\nconst matches = (el, selector = '') => {\r\n const sel = selector.replace(/^>/i, '')\r\n\r\n if (!selector || !sel || !el) {\r\n return false\r\n }\r\n\r\n /* istanbul ignore else */\r\n if (el.matches) {\r\n return el.matches(sel)\r\n } else if (el.msMatchesSelector) {\r\n return el.msMatchesSelector(sel)\r\n } else {\r\n return false\r\n }\r\n}\r\n\r\nexport default matches\r\n","/**\r\n * 获取 DOM 元素的父节点\r\n * ========================================================================\r\n * @method getParentOrHost\r\n * @param {*|HTMLElement} el - (必须)要获取父节点的 DOM 元素\r\n * @returns {*|HTMLElement}\r\n */\r\nconst getParentOrHost = (el) => {\r\n return el.host && el !== document && el.host.nodeType\r\n ? el.host\r\n : el.parentNode\r\n}\r\n\r\nexport default getParentOrHost\r\n","import closest from '@/utils/dom/closest'\r\nimport off from './off'\r\nimport getTarget from './getTarget'\r\n\r\nimport { CAPTURE_EVENTS } from './enum'\r\n\r\n/**\r\n * 绑定代理事件\r\n * ========================================================================\r\n * @method on\r\n * @param {HTMLElement|String|Object} el - (必须)绑定代理事件的 DOM 节点\r\n * @param {String} selector - (必须)事件代理目标 DOM 元素的选择器\r\n * @param {String|Function} type - (必须)事件类型或者事件处理器回调函数\r\n * @param {Function|Object} fn - (可选) 事件处理器回调函数或者传递给事件处理器回调函数的数据对象\r\n * @param {Object|Boolean} [data] - (可选)传递给事件处理器回调函数的数据对象或者事件处理器回调函数的 this 上下文指向,\r\n * @param {Object|Boolean} [context] - (可选)事件处理器回调函数的 this 上下文指向,或者是否仅触发一次\r\n * 当设置为 true 时,则事件处理器回调函数的 this 上下文指向为 data 对象\r\n * @param {Boolean} once - (可选)是否仅触发一次\r\n */\r\nconst on = (el, selector, type, fn, data, context, once = false) => {\r\n // CAPTURE_EVENTS 中的特殊事件,采用事件捕获模型\r\n const capture = CAPTURE_EVENTS.indexOf(type) > -1\r\n\r\n const listener = function (evt) {\r\n const target = getTarget(evt)\r\n // 通过 Element.matches 方法获得点击的目标元素\r\n const delegateTarget = closest(target, selector, el)\r\n let overrideContext = context || el\r\n\r\n evt.delegateTarget = delegateTarget\r\n\r\n // 当设置为 true 时,则事件处理器回调函数的\r\n // this 上下文指向为 data 对象\r\n if (context === true) {\r\n overrideContext = data\r\n }\r\n\r\n /* istanbul ignore else */\r\n if (delegateTarget) {\r\n // 仅触发一次\r\n /* istanbul ignore else */\r\n if (once === true) {\r\n off(el, type, listener)\r\n }\r\n\r\n fn.call(overrideContext, evt, data)\r\n }\r\n }\r\n\r\n if (!el) {\r\n return false\r\n }\r\n\r\n if (!el._listeners) {\r\n el._listeners = []\r\n }\r\n\r\n // 缓存 options 元素绑定的事件处理器\r\n el._listeners.push({\r\n el,\r\n selector,\r\n type,\r\n fn: listener,\r\n data,\r\n context,\r\n capture\r\n })\r\n\r\n // 缓存包装后的事件处理器\r\n fn._delegateListener = listener\r\n\r\n el.addEventListener(type, listener, capture)\r\n}\r\n\r\nexport default on\r\n","import resolveTextNode from '@/utils/dom/resolveTextNode'\r\n\r\n/**\r\n * 返回触发事件的 target DOM 元素\r\n * ========================================================================\r\n * @method getTarget\r\n * @param {Event} evt - Event 对象\r\n * @return {HTMLElement} - Event 对象的 target DOM 元素\r\n */\r\nconst getTarget = function (evt) {\r\n const target = evt.target\r\n\r\n return resolveTextNode(target)\r\n}\r\n\r\nexport default getTarget\r\n","/**\r\n * 在某些情况下,某些浏览器(例如:Safari 浏览器)会返回实际的目标元素内部的文本节点。\r\n * resolveTextNode() 方法则会返回实际的目标节点。\r\n * ========================================================================\r\n * @method resolveTextNode\r\n * @param {HTMLElement|Text} el - 要解析的节点\r\n * @return {*|HTMLElement} - 实际的目标 DOM 节点\r\n */\r\nconst resolveTextNode = function (el) {\r\n if (el && el.nodeType === 3) {\r\n return el.parentNode\r\n }\r\n\r\n return el\r\n}\r\n\r\nexport default resolveTextNode\r\n","import matches from './matches'\r\nimport getParentOrHost from './getParentOrHost'\r\n\r\n/**\r\n * 获取 options 元素父元素最近的包含 selector 选择器的元素\r\n * ========================================================================\r\n * @method closest\r\n * @param {HTMLElement} el - (必须)DOM 元素\r\n * @param {String} selector - (必须)DOM 元素的选择其\r\n * @param {HTMLElement} [ctx] - (必须)比对的 DOM 元素\r\n * @param {Boolean} [includeCTX] - (必须)是否包含 context DOM 元素\r\n * @returns {null|HTMLElement} - 返回最接近的 DOM 元素\r\n */\r\nconst closest = (el, selector, ctx, includeCTX) => {\r\n const context = ctx || document\r\n\r\n if (!el) {\r\n return null\r\n }\r\n\r\n do {\r\n /* istanbul ignore else */\r\n if (\r\n (selector != null &&\r\n (selector.startsWith('>')\r\n ? el.parentNode === context && matches(el, selector)\r\n : matches(el, selector))) ||\r\n (includeCTX && el === context)\r\n ) {\r\n return el\r\n }\r\n\r\n /* istanbul ignore else */\r\n if (el === context) {\r\n break\r\n }\r\n\r\n /* jshint boss:true */\r\n } while ((el = getParentOrHost(el)))\r\n}\r\n\r\nexport default closest\r\n","/**\r\n * 存储订阅者(主题和处理器的)私有对象\r\n * ========================================================================\r\n * @type {{}}\r\n * @private\r\n */\r\nconst _subscribers = {}\r\n\r\nexport default _subscribers\r\n","import hasOwn from '@/utils/lang/hasOwn'\r\nimport _subscribers from './_subscribers'\r\n\r\n/**\r\n * 判断是否存在与给定 topic 完全匹配的订阅者信息\r\n * ========================================================================\r\n * @method _hasDirectSubscribersFor\r\n * @param {String} topic - (必须)订阅主题字符串\r\n * @returns {Boolean}\r\n */\r\nconst _hasDirectSubscribersFor = (topic) => {\r\n return hasOwn(_subscribers, topic) && _subscribers[topic].length > 0\r\n}\r\n\r\nexport default _hasDirectSubscribersFor\r\n","import _hasDirectSubscribersFor from './_hasDirectSubscribersFor'\r\nimport _hasSubscribers from './_hasSubscribers'\r\n\r\n/**\r\n * 判断是否存在包含 topic 指定的订阅者信息\r\n * ========================================================================\r\n * @method has\r\n * @param {String} topic - (必须)主题名称\r\n * @param {Boolean} [isDirect] - (可选)是否为直接的主题,默认值:true\r\n * @returns {Boolean}\r\n */\r\nconst has = (topic, isDirect = true) => {\r\n return isDirect ? _hasDirectSubscribersFor(topic) : _hasSubscribers(topic)\r\n}\r\n\r\nexport default has\r\n","import _hasDirectSubscribersFor from './_hasDirectSubscribersFor'\r\n\r\n/**\r\n * 判断是否存在包含给定 topic 相关的订阅者信息\r\n * ========================================================================\r\n * @method _hasSubscribers\r\n * @param {String} topic - (必须)订阅主题字符串\r\n * @returns {Boolean}\r\n */\r\nconst _hasSubscribers = (topic) => {\r\n let found = _hasDirectSubscribersFor(topic)\r\n let position = topic.lastIndexOf('.')\r\n\r\n while (!found && position !== -1) {\r\n topic = topic.substring(0, position)\r\n position = topic.lastIndexOf('.')\r\n found = _hasDirectSubscribersFor(topic)\r\n }\r\n\r\n return found\r\n}\r\n\r\nexport default _hasSubscribers\r\n","import isTypedArray from '@/utils/types/isTypedArray'\r\nimport has from './has'\r\nimport _hasDirectSubscribersFor from './_hasDirectSubscribersFor'\r\nimport _subscribers from './_subscribers'\r\n\r\n/**\r\n * (异步)发布订阅主题信息\r\n * ========================================================================\r\n * 主题默认是异步发布的。确保在消费者处理主题时,主题的发起者不会被阻止。\r\n * ========================================================================\r\n * @method emit\r\n * @param {String} topic - (必须)主题名称\r\n * @param {Object} [data] - (可选)数据对象\r\n * @param {Boolean} [async] - (可选) 是否异步发布\r\n */\r\nconst emit = (topic, data, async = true) => {\r\n const execute = (topic) => {\r\n if (!_hasDirectSubscribersFor(topic)) {\r\n return false\r\n }\r\n\r\n _subscribers[topic].forEach((subscriber) => {\r\n // 针对 mqtt 消息服务返回的 Uint8Array 类似的 typed arrays 格式的数据\r\n // 采用 toString() 方法转化为普通(JSON)字符串\r\n const message = isTypedArray(data) ? data.toString() : data\r\n\r\n subscriber.callback.call(subscriber.context || subscriber, message)\r\n })\r\n }\r\n const deliver = () => {\r\n let subscriber = topic\r\n let position = topic.lastIndexOf('.')\r\n\r\n while (position !== -1) {\r\n subscriber = subscriber.substring(0, position)\r\n position = subscriber.lastIndexOf('.')\r\n\r\n execute(subscriber)\r\n }\r\n\r\n // 执行 topic 对应的处理器\r\n execute(topic)\r\n // 执行特殊 topic:'*'(监听全部消息的发布)\r\n execute('*')\r\n }\r\n\r\n if (!has(topic)) {\r\n return false\r\n }\r\n\r\n if (async) {\r\n setTimeout(deliver, 10)\r\n } else {\r\n deliver()\r\n }\r\n}\r\n\r\nexport default emit\r\n","import toString from '@/utils/lang/toString'\r\n/**\r\n * 判断检测数据是否为 Typed Arrays 类型的数据\r\n * ========================================================================\r\n * @param {*} val\r\n * @returns {boolean}\r\n */\r\nconst isTypedArray = (val) => {\r\n const TYPES = [\r\n '[object Int8Array]',\r\n '[object Uint8Array]',\r\n '[object Uint8ClampedArray]',\r\n '[object Int16Array]',\r\n '[object Uint16Array]',\r\n '[object Int32Array]',\r\n '[object Uint32Array]',\r\n '[object Float32Array]',\r\n '[object Float64Array]',\r\n '[object BigInt64Array]',\r\n '[object BigUint64Array]'\r\n ]\r\n\r\n return TYPES.indexOf(toString(val)) > -1\r\n}\r\n\r\nexport default isTypedArray\r\n","import hasOwn from '@/utils/lang/hasOwn'\r\nimport _subscribers from './_subscribers'\r\n\r\n/**\r\n * 删除与给定 topic 相同的订阅者信息\r\n * ========================================================================\r\n * @method _removeSubscriber\r\n * @param {String} topic - (必须)订阅主题字符串\r\n * @returns {Boolean}\r\n */\r\nconst _removeSubscriber = (topic) => {\r\n if (!hasOwn(_subscribers, topic)) {\r\n return false\r\n }\r\n\r\n delete _subscribers[topic]\r\n}\r\n\r\nexport default _removeSubscriber\r\n","import has from './has'\r\nimport _removeSubscriber from './_removeSubscriber'\r\nimport _removeSubscriberByToken from './_removeSubscriberByToken'\r\n\r\n/**\r\n * 取消订阅主题\r\n * ========================================================================\r\n * @method off\r\n * @param {String} topic - (必须)订阅的主题\r\n * @param {Function|String} [token] - (可选)订阅主题的处理器函数或者唯一 Id 值\r\n */\r\nconst off = (topic, token) => {\r\n if (!has(topic)) {\r\n return false\r\n }\r\n\r\n if (token) {\r\n _removeSubscriberByToken(token)\r\n } else {\r\n _removeSubscriber(topic)\r\n }\r\n}\r\n\r\nexport default off\r\n","import _subscribers from './_subscribers'\r\nimport _removeSubscriber from './_removeSubscriber'\r\n\r\n/**\r\n * 通过订阅者 token 值删除订阅者信息\r\n * ========================================================================\r\n * @method _removeSubscriberByToken\r\n * @param {String} token - 订阅者 token 字符串\r\n * @returns {boolean}\r\n * @private\r\n */\r\nconst _removeSubscriberByToken = (token) => {\r\n const keys = Object.keys(_subscribers)\r\n let index = -1\r\n\r\n if (!token || keys.length < 1) {\r\n return false\r\n }\r\n\r\n keys.forEach((subject) => {\r\n const subscriber = _subscribers[subject]\r\n let topic\r\n\r\n subscriber.forEach((execution, j) => {\r\n if (execution.callback === token || execution.token === token) {\r\n topic = execution.topic\r\n subscriber.splice(index, j)\r\n }\r\n })\r\n\r\n /* istanbul ignore else */\r\n if (subscriber.length < 1) {\r\n _removeSubscriber(topic)\r\n }\r\n })\r\n}\r\n\r\nexport default _removeSubscriberByToken\r\n","import isString from './utils/types/isString'\r\n\r\nimport extend from './utils/lang/extend'\r\nimport hasOwn from './utils/lang/hasOwn'\r\n\r\nimport isObject from './utils/types/isObject'\r\n\r\nimport publish from './utils/observer/emit'\r\nimport subscribe from './utils/observer/on'\r\nimport unsubscribe from './utils/observer/off'\r\n\r\nclass Component {\r\n constructor(options) {\r\n this.attrs = {}\r\n this.name = 'component'\r\n\r\n if (options) {\r\n this.initialize(options)\r\n }\r\n }\r\n\r\n initialize(options) {\r\n this.attr(options).render().addListeners()\r\n return this\r\n }\r\n\r\n attr(prop, value) {\r\n const attrs = this.attrs\r\n\r\n if (isString(prop)) {\r\n // 只能扩展 attrs 中已有的属性\r\n if (value && hasOwn(attrs, prop)) {\r\n // 更新单个配置信息\r\n attrs[prop] = value\r\n return this\r\n }\r\n\r\n // 只传递 prop 参数,则返回对应的属性值\r\n return attrs[prop]\r\n } else if (isObject(prop)) {\r\n // 批量更新配置信息\r\n extend(attrs, prop)\r\n\r\n return this\r\n } else if (arguments.length === 0) {\r\n // 不传递参数,直接返回整个\r\n return attrs\r\n }\r\n\r\n return this\r\n }\r\n\r\n render() {\r\n return this\r\n }\r\n\r\n refresh() {\r\n return this\r\n }\r\n\r\n destroy() {\r\n this.removeListeners()\r\n return this\r\n }\r\n\r\n reload(options) {\r\n let attrs = this.attr()\r\n\r\n if (options) {\r\n attrs = this.attr(options)\r\n }\r\n\r\n this.destroy().initialize(attrs)\r\n\r\n return this\r\n }\r\n\r\n $emit(event, data) {\r\n publish(event, data)\r\n return this\r\n }\r\n\r\n $on(event, callback) {\r\n subscribe(event, callback, this)\r\n return this\r\n }\r\n\r\n $off(event, callback) {\r\n unsubscribe(event, callback)\r\n return this\r\n }\r\n\r\n addListeners() {\r\n return this\r\n }\r\n\r\n removeListeners() {\r\n return this\r\n }\r\n}\r\n\r\nexport default Component\r\n","import isFunction from '@/utils/types/isFunction'\r\nimport guid from '@/utils/lang/guid'\r\n\r\nimport _subscribers from './_subscribers'\r\n\r\n/**\r\n * 订阅主题,并给出处理器函数\r\n * ========================================================================\r\n * @method on\r\n * @param {String} topic - (必须)主题名称\r\n * @param {Function} handler - (必须)主题的处理器函数\r\n * @param {Object} [context] - (可选)指定 this 执行上下文\r\n * @return {String} - 唯一的 token 字符串,例如:'guid-1'。\r\n */\r\nconst on = (topic, handler, context = null) => {\r\n const token = guid()\r\n let subject = typeof topic === 'symbol' ? topic.toString() : topic\r\n\r\n if (!isFunction(handler)) {\r\n return ''\r\n }\r\n\r\n /* istanbul ignore else */\r\n if (!_subscribers[subject]) {\r\n _subscribers[subject] = []\r\n }\r\n\r\n _subscribers[subject].push({\r\n topic: subject,\r\n callback: handler,\r\n context,\r\n token\r\n })\r\n\r\n return token\r\n}\r\n\r\nexport default on\r\n","import isString from '@/utils/types/isString'\r\nimport isPlainObject from '@/utils/types/isPlainObject'\r\nimport isFunction from '@/utils/types/isFunction'\r\n\r\nimport extend from '@/utils/lang/extend'\r\nimport later from '@/utils/lang/later'\r\nimport stripScripts from '@/utils/lang/stripScripts'\r\nimport encodeHTML from '@/utils/lang/encodeHTML'\r\nimport cloneDeep from '@/utils/lang/cloneDeep'\r\nimport guid from '@/utils/lang/guid'\r\n\r\nimport createElement from '@/utils/dom/createElement'\r\nimport addClass from '@/utils/dom/addClass'\r\nimport removeClass from '@/utils/dom/removeClass'\r\nimport setAttribute from '@/utils/dom/setAttribute'\r\nimport setAttributes from '@/utils/dom/setAttributes'\r\n\r\nimport icon from '@/utils/icons/icon'\r\nimport paint from '@/utils/icons/paint'\r\n\r\nimport on from '@/utils/event/on'\r\nimport off from '@/utils/event/off'\r\n\r\nimport Component from '@/component'\r\n\r\nimport './message.less'\r\n\r\nconst TYPES = ['info', 'success', 'warning', 'error']\r\nconst instances = []\r\nlet instance\r\n\r\npaint()\r\n\r\nclass Message extends Component {\r\n constructor(options) {\r\n super()\r\n\r\n this._default()\r\n\r\n if (options) {\r\n this.initialize(options)\r\n }\r\n }\r\n\r\n _default() {\r\n this.attrs = cloneDeep(Message.DEFAULTS)\r\n\r\n this.$el = null\r\n this.id = ''\r\n this.closed = false\r\n this.visible = false\r\n this.offset = -50\r\n this.timer = null\r\n this.destroyed = false\r\n\r\n return this\r\n }\r\n\r\n initialize(options) {\r\n this.attr(options)\r\n this.id = this.attr('id')\r\n this.offset = this.attr('offset') || -50\r\n\r\n this.$emit('created', { ...this.attr() })\r\n\r\n this.render().addListeners()\r\n\r\n if (this.attr('visible')) {\r\n this.open()\r\n }\r\n\r\n return this\r\n }\r\n\r\n isClosed() {\r\n return this.closed\r\n }\r\n\r\n isDestroyed() {\r\n return this.destroyed\r\n }\r\n\r\n _getClassName() {\r\n const type = this.attr('type')\r\n const effect = this.attr('effect')\r\n const round = this.attr('round')\r\n const closable = this.attr('closable')\r\n const visible = this.attr('visible')\r\n const customClass = this.attr('customClass')\r\n const className = [\r\n 'outline-message',\r\n `outline-message_${type}`,\r\n `outline-message_${effect}`\r\n ]\r\n\r\n if (round) {\r\n className.push('outline-message_round')\r\n }\r\n\r\n if (!closable) {\r\n className.push('outline-message_full-width')\r\n }\r\n\r\n if (visible) {\r\n className.push('outline-message_visible')\r\n }\r\n\r\n if (customClass) {\r\n className.push(customClass)\r\n }\r\n\r\n return className\r\n }\r\n\r\n render() {\r\n const type = this.attr('type')\r\n const message = this.attr('message')\r\n const effect = this.attr('effect')\r\n const round = this.attr('round')\r\n const closable = this.attr('closable')\r\n const dangerouslyUseHTMLString = this.attr('dangerouslyUseHTMLString')\r\n const className = this._getClassName()\r\n const iconName = effect === 'light' ? `circle-${type}` : type\r\n const children = []\r\n let iconSize = 20\r\n let $type\r\n let $message\r\n let $text\r\n let $close\r\n let $el\r\n\r\n if (round && effect === 'default') {\r\n iconSize = 12\r\n }\r\n\r\n if (effect !== 'plain') {\r\n $type = icon(iconName, {\r\n iconSet: 'outline',\r\n size: iconSize\r\n })\r\n addClass($type, 'outline-message__icon')\r\n children.push($type)\r\n }\r\n\r\n if (!dangerouslyUseHTMLString) {\r\n $text = document.createTextNode(encodeHTML(stripScripts(message)))\r\n } else {\r\n $text = document.createDocumentFragment()\r\n $text.innerHTML = message\r\n }\r\n $message = createElement(\r\n 'p',\r\n {\r\n className: 'outline-message__content'\r\n },\r\n [$text]\r\n )\r\n children.push($message)\r\n\r\n if (closable) {\r\n $close = icon('close', {\r\n iconSet: 'outline',\r\n size: 18\r\n })\r\n addClass($close, 'outline-message__close')\r\n children.push($close)\r\n }\r\n\r\n $el = createElement(\r\n 'div',\r\n {\r\n className: className.join(' ')\r\n },\r\n children\r\n )\r\n $el.style.cssText = `top:-50px;`\r\n this.$el = $el\r\n document.body.appendChild(this.$el)\r\n\r\n this.$emit('mounted')\r\n\r\n return this\r\n }\r\n\r\n _refreshIcon() {\r\n const HIDDEN = '.outline-message_hidden'\r\n const $el = this.$el\r\n let iconSize = 20\r\n let type\r\n let effect\r\n let round\r\n let iconName\r\n let $icon\r\n let $svg\r\n let $use\r\n\r\n if (this.isDestroyed()) {\r\n return this\r\n }\r\n\r\n $icon = $el.querySelector('.outline-icon')\r\n\r\n if (!$icon) {\r\n return this\r\n }\r\n\r\n type = this.attr('type')\r\n effect = this.attr('effect')\r\n round = this.attr('round')\r\n\r\n if (effect === 'plain') {\r\n addClass($icon, HIDDEN)\r\n } else {\r\n removeClass($icon, HIDDEN)\r\n\r\n if (round && effect === 'default') {\r\n iconSize = 12\r\n }\r\n }\r\n\r\n $svg = $icon.querySelector('.outline-icon__svg')\r\n setAttributes($svg, {\r\n style: `width:${iconSize}px;height:${iconSize}px;`\r\n })\r\n\r\n $use = $svg.querySelector('use')\r\n iconName = effect === 'light' ? `circle-${type}` : type\r\n setAttribute($use, 'xlink:href', `#outline-icon-${iconName}`)\r\n\r\n return this\r\n }\r\n\r\n _refreshMessage() {\r\n const $el = this.$el\r\n let $message\r\n let dangerouslyUseHTMLString\r\n let message\r\n let text\r\n\r\n if (this.isDestroyed()) {\r\n return this\r\n }\r\n\r\n $message = $el.querySelector('.outline-message__content')\r\n dangerouslyUseHTMLString = this.attr('dangerouslyUseHTMLString')\r\n message = this.attr('message')\r\n\r\n if (!dangerouslyUseHTMLString) {\r\n text = encodeHTML(stripScripts(message))\r\n } else {\r\n text = message\r\n }\r\n\r\n $message.innerHTML = text\r\n\r\n return this\r\n }\r\n\r\n _refreshClose() {\r\n const HIDDEN = '.outline-message_hidden'\r\n const $el = this.$el\r\n let $close\r\n let closable\r\n\r\n if (this.isDestroyed()) {\r\n return this\r\n }\r\n\r\n $close = $el.querySelector('.outline-message__close')\r\n closable = this.attr('closable')\r\n\r\n if ($close) {\r\n if (closable) {\r\n addClass($close, HIDDEN)\r\n } else {\r\n removeClass($close, HIDDEN)\r\n }\r\n }\r\n\r\n return this\r\n }\r\n\r\n _refreshEl() {\r\n const $el = this.$el\r\n let className\r\n\r\n if (this.isDestroyed()) {\r\n return this\r\n }\r\n\r\n className = this._getClassName()\r\n setAttribute($el, 'className', className.join(' '))\r\n\r\n return this\r\n }\r\n\r\n refresh(options) {\r\n if (!isPlainObject(options)) {\r\n return this\r\n }\r\n\r\n this.attr(options)\r\n ._refreshIcon()\r\n ._refreshMessage()\r\n ._refreshClose()\r\n ._refreshEl()\r\n\r\n return this\r\n }\r\n\r\n clearTimer() {\r\n if (this.isDestroyed()) {\r\n return this\r\n }\r\n\r\n if (this.timer) {\r\n clearTimeout(this.timer)\r\n this.timer = null\r\n }\r\n\r\n return this\r\n }\r\n\r\n startTimer(duration) {\r\n if (this.isDestroyed()) {\r\n return this\r\n }\r\n\r\n this.timer = later(() => {\r\n this.$emit('opened')\r\n this.close()\r\n }, duration * 1000)\r\n\r\n return this\r\n }\r\n\r\n open(options) {\r\n const $el = this.$el\r\n let offset\r\n let duration\r\n let top\r\n let cssRules\r\n\r\n if (this.isDestroyed()) {\r\n return this\r\n }\r\n\r\n if (this.isClosed()) {\r\n this.refresh(options)\r\n }\r\n\r\n offset = this.attr('offset')\r\n duration = this.attr('duration')\r\n top = offset && offset >= this.offset ? offset : this.offset\r\n cssRules = `top:${top}px;`\r\n\r\n this.clearTimer()\r\n\r\n this.$emit('beforeOpen')\r\n\r\n later(() => {\r\n this.visible = true\r\n\r\n addClass($el, 'outline-message_visible')\r\n $el.style.cssText = cssRules\r\n\r\n if (duration > 0) {\r\n this.startTimer(duration)\r\n }\r\n }, 100)\r\n\r\n return this\r\n }\r\n\r\n close() {\r\n const $el = this.$el\r\n const cssRules = `top:-50px;`\r\n let destroyAfterClosed\r\n let beforeClose\r\n\r\n if (this.isDestroyed()) {\r\n return this\r\n }\r\n\r\n destroyAfterClosed = this.attr('destroyAfterClosed')\r\n beforeClose = this.attr('beforeClose')\r\n\r\n if (isFunction(beforeClose)) {\r\n beforeClose.call(this)\r\n }\r\n\r\n $el.style.cssText = cssRules\r\n removeClass($el, 'outline-message_visible')\r\n\r\n this.visible = false\r\n this.closed = true\r\n\r\n later(() => {\r\n this.$emit('closed')\r\n\r\n if (destroyAfterClosed) {\r\n this.destroy()\r\n }\r\n }, 500)\r\n\r\n return this\r\n }\r\n\r\n destroy() {\r\n this.$emit('beforeDestroy')\r\n\r\n if (this.isDestroyed()) {\r\n return this\r\n }\r\n\r\n this.removeListeners()\r\n\r\n document.body.removeChild(this.$el)\r\n\r\n clearTimeout(this.timer)\r\n this._default()\r\n\r\n this.$emit('afterDestroy')\r\n\r\n return this\r\n }\r\n\r\n onMouseEnter() {\r\n this.clearTimer()\r\n return this\r\n }\r\n\r\n onMouseLeave() {\r\n const duration = this.attr('duration')\r\n const delay = this.attr('delay')\r\n\r\n if (duration <= 0) {\r\n return this\r\n }\r\n\r\n this.startTimer(delay)\r\n\r\n return this\r\n }\r\n\r\n onClose() {\r\n this.clearTimer()\r\n this.close()\r\n return this\r\n }\r\n\r\n addListeners() {\r\n const $el = this.$el\r\n\r\n on(\r\n $el,\r\n '.outline-message__content',\r\n 'mouseenter',\r\n this.onMouseEnter,\r\n this,\r\n true\r\n )\r\n on(\r\n $el,\r\n '.outline-message__content',\r\n 'mouseleave',\r\n this.onMouseLeave,\r\n this,\r\n true\r\n )\r\n on($el, '.outline-message__close', 'click', this.onClose, this, true)\r\n\r\n return this\r\n }\r\n\r\n removeListeners() {\r\n const $el = this.$el\r\n\r\n off($el, 'mouseenter', this.onMouseEnter)\r\n off($el, 'mouseleave', this.onMouseLeave)\r\n off($el, 'click', this.onClose)\r\n\r\n return this\r\n }\r\n}\r\n\r\nMessage.DEFAULTS = (() => {\r\n const OPTIONS = {\r\n id: '',\r\n type: 'info',\r\n effect: 'default',\r\n round: false,\r\n offset: 30,\r\n duration: 3,\r\n delay: 2,\r\n message: '',\r\n customClass: '',\r\n closable: true,\r\n visible: true,\r\n dangerouslyUseHTMLString: false,\r\n destroyAfterClosed: true,\r\n beforeClose: null\r\n }\r\n\r\n return cloneDeep(OPTIONS)\r\n})()\r\n\r\nTYPES.forEach((type) => {\r\n Message[type] = (options) => {\r\n const config = {}\r\n const id = guid(`outline-message-`)\r\n const beforeClose = options.beforeClose || null\r\n let offset = options.offset || 30\r\n\r\n if (isString(options)) {\r\n config.message = options\r\n } else {\r\n if (isPlainObject(options)) {\r\n extend(config, options)\r\n }\r\n }\r\n config.id = id\r\n config.type = type\r\n config.offset = offset\r\n config.visible = false\r\n config.beforeClose = () => {\r\n Message.close(id, beforeClose)\r\n }\r\n\r\n instance = new Message(config)\r\n instances.forEach((item) => {\r\n offset += item.$el.offsetHeight + 16\r\n })\r\n instance.offset = offset\r\n instance.open()\r\n instances.push(instance)\r\n\r\n return instance\r\n }\r\n})\r\n\r\n// 关闭指定 id 消息的静态方法\r\nMessage.close = (id, beforeClose) => {\r\n const len = instances.length\r\n let index = -1\r\n let i\r\n let offsetHeight\r\n\r\n instances.forEach((instance, i) => {\r\n // 在 instances 中通过 id 找到要关闭的消息\r\n if (id === instance.id) {\r\n offsetHeight = instance.$el.offsetHeight\r\n index = i\r\n\r\n // 关闭消息\r\n if (isFunction(beforeClose)) {\r\n beforeClose.call(instance)\r\n }\r\n\r\n instances.splice(i, 1)\r\n }\r\n })\r\n\r\n if (len <= 1 || index === -1 || index > instances.length - 1) {\r\n return false\r\n }\r\n\r\n i = index\r\n\r\n // 界面中的消息逐个向上收起\r\n for (; i < len - 1; i += 1) {\r\n const dom = instances[i].$el\r\n\r\n dom.style['top'] = parseInt(dom.style['top'], 10) - offsetHeight - 16 + 'px'\r\n }\r\n}\r\n\r\n// 关闭所有消息的静态方法\r\nMessage.clear = () => {\r\n let i = instances.length - 1\r\n for (; i >= 0; i -= 1) {\r\n instances[i].close()\r\n }\r\n}\r\n\r\nexport default Message\r\n","import isFunction from './utils/types/isFunction'\r\n\r\nclass Command {\r\n constructor(name, action) {\r\n this.name = name\r\n\r\n if (isFunction(action)) {\r\n this.action = action\r\n }\r\n }\r\n\r\n execute() {\r\n this.action()\r\n\r\n return this\r\n }\r\n}\r\n\r\nexport default Command\r\n","import isFunction from './utils/types/isFunction'\r\n\r\nclass Commands {\r\n constructor() {\r\n this.commands = []\r\n }\r\n\r\n get(name) {\r\n return this.commands.find((cmd) => cmd.name === name)\r\n }\r\n\r\n add(command) {\r\n this.commands.push(command)\r\n\r\n return this\r\n }\r\n\r\n del(name) {\r\n const commands = this.commands\r\n const command = commands.find((cmd) => cmd.name === name)\r\n const index = command ? commands.indexOf(command) : -1\r\n\r\n if (index > -1) {\r\n commands.splice(index, 1)\r\n }\r\n\r\n return this\r\n }\r\n\r\n clear() {\r\n this.commands = []\r\n\r\n return this\r\n }\r\n\r\n execute(name) {\r\n const command = this.commands.find((cmd) => cmd.name === name)\r\n\r\n if (isFunction(command?.execute)) {\r\n command.execute()\r\n }\r\n\r\n return this\r\n }\r\n}\r\n\r\nexport default Commands\r\n","import icon from '../../utils/icons/icon'\r\nimport createElement from '../../utils/dom/createElement'\r\nimport addClass from '../../utils/dom/addClass'\r\n\r\nconst _createButton = (button, rounded = true) => {\r\n const $icon = icon(button.icon, {\r\n iconSet: button.iconSet || 'outline',\r\n color: button.color || '',\r\n size: button.size\r\n })\r\n const $anchor = createElement(\r\n 'a',\r\n {\r\n className: `outline-toolbar__anchor`,\r\n href: button.link\r\n },\r\n $icon\r\n )\r\n const $button = createElement(\r\n 'div',\r\n {\r\n className: `outline-toolbar__button ${button.name}`,\r\n 'data-cmd': button.name\r\n },\r\n [button.link ? $anchor : $icon]\r\n )\r\n\r\n addClass($icon, 'outline-toolbar__icon')\r\n\r\n if (rounded) {\r\n addClass($button, 'outline-toolbar_rounded')\r\n }\r\n\r\n if (button.disabled) {\r\n addClass($button, 'outline-toolbar_disabled')\r\n }\r\n\r\n return $button\r\n}\r\n\r\nexport default _createButton\r\n","import isString from '@/utils/types/isString'\r\nimport isFunction from '@/utils/types/isFunction'\r\nimport isObject from '@/utils/types/isObject'\r\nimport isArray from '@/utils/types/isArray'\r\n\r\nimport later from '@/utils/lang/later'\r\nimport guid from '@/utils/lang/guid'\r\nimport cloneDeep from '@/utils/lang/cloneDeep'\r\n\r\nimport createElement from '@/utils/dom/createElement'\r\nimport addClass from '@/utils/dom/addClass'\r\nimport hasClass from '@/utils/dom/hasClass'\r\nimport removeClass from '@/utils/dom/removeClass'\r\n\r\nimport on from '@/utils/event/on'\r\nimport off from '@/utils/event/off'\r\n\r\nimport paint from '@/utils/icons/paint'\r\n\r\nimport Command from '@/command'\r\nimport Commands from '@/commands'\r\nimport Component from '@/component'\r\n\r\nimport _createButton from './utils/_createButton'\r\n\r\nimport './toolbar.less'\r\n\r\nconst DISABLED = 'outline-toolbar_disabled'\r\nconst HIDDEN = 'outline-toolbar_hidden'\r\nconst ACTIVE = 'outline-toolbar_active'\r\n\r\nclass Toolbar extends Component {\r\n constructor(options) {\r\n super()\r\n\r\n this._default()\r\n\r\n if (options) {\r\n this.initialize(options)\r\n }\r\n }\r\n\r\n _default() {\r\n this.attrs = cloneDeep(Toolbar.DEFAULTS)\r\n\r\n this.disabled = false\r\n this.closed = false\r\n\r\n this.$el = null\r\n this.buttons = []\r\n this.commands = null\r\n\r\n return this\r\n }\r\n\r\n initialize(options) {\r\n let created\r\n\r\n this.attr(options)\r\n\r\n this.disabled = this.attr('disabled')\r\n this.closed = this.attr('closed')\r\n this.commands = new Commands()\r\n\r\n created = this.attr('created')\r\n\r\n if (isFunction(created)) {\r\n created.call(this)\r\n }\r\n\r\n this.render().addListeners()\r\n\r\n return this\r\n }\r\n\r\n isHighlight(name) {\r\n const button = this.get(name)\r\n\r\n if (!button) {\r\n return false\r\n }\r\n\r\n return hasClass(button.$el, ACTIVE)\r\n }\r\n\r\n isDisabled(name) {\r\n let button\r\n\r\n if (name) {\r\n button = this.get(name)\r\n\r\n return button.disabled\r\n }\r\n\r\n return this.disabled\r\n }\r\n\r\n isExist(name) {\r\n const button = this.get(name)\r\n return !!button\r\n }\r\n\r\n isClosed() {\r\n return this.closed\r\n }\r\n\r\n _getCommand(button) {\r\n const _self = this\r\n const { action, name } = button\r\n let command = null\r\n let handler = null\r\n let context\r\n let listener\r\n\r\n if (!action) {\r\n return command\r\n }\r\n\r\n handler = action.handler\r\n context = action.context || this\r\n\r\n if (isFunction(handler)) {\r\n listener = handler\r\n } else if (isString(handler)) {\r\n listener = function () {\r\n _self.$emit(handler, name)\r\n }\r\n }\r\n\r\n if (isFunction(listener)) {\r\n command = new Command(name, listener.bind(context))\r\n }\r\n\r\n return command\r\n }\r\n\r\n get(name) {\r\n return this.buttons.find((button) => button.name === name)\r\n }\r\n\r\n render() {\r\n const mounted = this.attr('mounted')\r\n const buttons = this.attr('buttons') || []\r\n const placement = this.attr('placement')\r\n\r\n paint()\r\n\r\n this.$el = createElement('div', {\r\n id: guid('outline-toolbar'),\r\n className: `outline-toolbar outline-toolbar_${placement}`\r\n })\r\n this._paint(buttons)\r\n document.body.appendChild(this.$el)\r\n\r\n if (this.closed) {\r\n this.hide()\r\n }\r\n\r\n if (this.disabled) {\r\n this.disable()\r\n }\r\n\r\n if (isFunction(mounted)) {\r\n mounted.call(this)\r\n }\r\n\r\n return this\r\n }\r\n\r\n erase() {\r\n this.$el.innerHTML = ''\r\n return this\r\n }\r\n\r\n _paint(buttons) {\r\n const rounded = this.attr('rounded')\r\n const $fragment = document.createDocumentFragment()\r\n\r\n buttons.forEach((button) => {\r\n const $button = _createButton(button, rounded)\r\n const command = this._getCommand(button)\r\n const { name, disabled, context } = button\r\n\r\n $fragment.appendChild($button)\r\n\r\n if (!this.isExist(name)) {\r\n this.buttons.push({\r\n $el: $button,\r\n name,\r\n disabled: disabled || false,\r\n context: context || this\r\n })\r\n\r\n if (command) {\r\n this.commands.add(command)\r\n }\r\n }\r\n })\r\n\r\n this.$el.appendChild($fragment)\r\n\r\n return this\r\n }\r\n\r\n _remove() {\r\n document.body.removeChild(this.$el)\r\n return this\r\n }\r\n\r\n refresh(buttons) {\r\n this.attr({ buttons })\r\n this.erase()._paint(buttons)\r\n return this\r\n }\r\n\r\n add(button) {\r\n const $el = this.$el\r\n const $fragment = document.createDocumentFragment()\r\n const buttons = this.attr('buttons') || []\r\n const { name, disabled, context } = button\r\n const command = this._getCommand(button)\r\n const _add = (button) => {\r\n const $button = _createButton(button)\r\n\r\n $fragment.appendChild($button)\r\n\r\n buttons.push(button)\r\n this.buttons.push({\r\n $el: $button,\r\n name,\r\n disabled: disabled || false,\r\n context: context || this,\r\n command\r\n })\r\n\r\n if (command) {\r\n this.commands.add(command)\r\n }\r\n }\r\n\r\n if (isObject(button)) {\r\n _add(button)\r\n } else if (isArray(button)) {\r\n button.forEach((item) => {\r\n if (isObject(item)) {\r\n _add(item)\r\n }\r\n })\r\n }\r\n $el.appendChild($fragment)\r\n\r\n return this\r\n }\r\n\r\n remove(name) {\r\n const $el = this.$el\r\n const buttons = this.buttons\r\n const button = this.get(name)\r\n let index = -1\r\n\r\n if (!button) {\r\n return this\r\n }\r\n\r\n index = buttons.indexOf(button)\r\n\r\n if (index > -1) {\r\n buttons.splice(index, 1)\r\n this.attr('buttons').splice(index, 1)\r\n }\r\n\r\n this._disable(name)\r\n $el.removeChild(button.$el)\r\n\r\n return this\r\n }\r\n\r\n _disable(name) {\r\n const button = this.get(name)\r\n const command = this.commands.get(name)\r\n\r\n if (!button || button.disabled) {\r\n return this\r\n }\r\n\r\n button.disabled = true\r\n\r\n if (command) {\r\n this.commands.del(command)\r\n }\r\n\r\n addClass(button.$el, DISABLED)\r\n\r\n return this\r\n }\r\n\r\n _enable(name) {\r\n const button = this.get(name)\r\n const command = this.commands.get(name)\r\n\r\n if (!button || !button.disabled) {\r\n return this\r\n }\r\n\r\n button.disabled = false\r\n\r\n if (command) {\r\n this.commands.add(command)\r\n }\r\n\r\n removeClass(button.$el, DISABLED)\r\n\r\n return this\r\n }\r\n\r\n disable(name) {\r\n const disabled = this.attr('afterDisabled')\r\n\r\n if (name) {\r\n this._disable(name)\r\n } else {\r\n addClass(this.$el, DISABLED)\r\n this.removeListeners()\r\n this.disabled = true\r\n\r\n if (isFunction(disabled)) {\r\n disabled.call(this)\r\n }\r\n }\r\n\r\n return this\r\n }\r\n\r\n enable(name) {\r\n const enabled = this.attr('afterEnabled')\r\n\r\n if (name) {\r\n this._enable(name)\r\n } else {\r\n this.disabled = false\r\n removeClass(this.$el, DISABLED)\r\n this.addListeners()\r\n\r\n if (isFunction(enabled)) {\r\n enabled.call(this)\r\n }\r\n }\r\n\r\n return this\r\n }\r\n\r\n show(name) {\r\n const opened = this.attr('afterOpened')\r\n const button = this.get(name)\r\n const $el = this.$el\r\n\r\n if (name) {\r\n if (!button) {\r\n return this\r\n }\r\n\r\n removeClass(button.$el, HIDDEN)\r\n } else {\r\n removeClass($el, HIDDEN)\r\n this.closed = false\r\n\r\n if (isFunction(opened)) {\r\n later(() => {\r\n opened.call(this)\r\n }, 310)\r\n }\r\n }\r\n\r\n return this\r\n }\r\n\r\n hide(name) {\r\n const closed = this.attr('afterClosed')\r\n const button = this.get(name)\r\n const $el = this.$el\r\n\r\n if (name) {\r\n if (!button) {\r\n return this\r\n }\r\n\r\n addClass(button.$el, HIDDEN)\r\n } else {\r\n addClass($el, HIDDEN)\r\n this.closed = true\r\n\r\n if (isFunction(closed)) {\r\n later(() => {\r\n closed.call(this)\r\n }, 310)\r\n }\r\n }\r\n\r\n return this\r\n }\r\n\r\n toggle(name) {\r\n if (this.isClosed()) {\r\n this.show(name)\r\n } else {\r\n this.hide(name)\r\n }\r\n\r\n return this\r\n }\r\n\r\n highlight(name) {\r\n const button = this.get(name)\r\n let $button\r\n\r\n if (!button) {\r\n return this\r\n }\r\n\r\n $button = button.$el\r\n\r\n if (hasClass($button, ACTIVE)) {\r\n removeClass($button, ACTIVE)\r\n } else {\r\n addClass($button, ACTIVE)\r\n }\r\n\r\n return this\r\n }\r\n\r\n destroy() {\r\n const beforeDestroy = this.attr('beforeDestroy')\r\n const afterDestroy = this.attr('afterDestroy')\r\n\r\n if (isFunction(beforeDestroy)) {\r\n beforeDestroy.call(this)\r\n }\r\n\r\n this.commands.clear()\r\n this.removeListeners()._remove()._default()\r\n\r\n if (isFunction(afterDestroy)) {\r\n afterDestroy.call(this)\r\n }\r\n\r\n return this\r\n }\r\n\r\n execute(name) {\r\n if (this.isDisabled(name)) {\r\n return this\r\n }\r\n\r\n this.commands.execute(name)\r\n\r\n return this\r\n }\r\n\r\n onExecute(evt) {\r\n const $button = evt.delegateTarget\r\n let cmd = ''\r\n\r\n if ($button) {\r\n cmd = $button.getAttribute('data-cmd')\r\n\r\n if (cmd) {\r\n this.execute(cmd)\r\n }\r\n }\r\n\r\n return this\r\n }\r\n\r\n _updateToolbar({ top, min, max }) {\r\n const current = Math.ceil(top)\r\n\r\n if (current <= min) {\r\n this.hide('up')\r\n this.show('down')\r\n } else if (current >= max) {\r\n this.hide('down')\r\n this.show('up')\r\n } else if (current > min && current < max) {\r\n this.show('up')\r\n this.show('down')\r\n }\r\n\r\n return this\r\n }\r\n\r\n onToolbarUpdate({ top, min, max }) {\r\n this._updateToolbar({ top, min, max })\r\n return this\r\n }\r\n\r\n onAddButton(buttons) {\r\n this.attr({\r\n buttons\r\n })\r\n this.refresh(buttons)\r\n\r\n return this\r\n }\r\n\r\n onRemoveButton(name) {\r\n this.remove(name)\r\n return this\r\n }\r\n\r\n addListeners() {\r\n const buttons = this.attr('buttons') || []\r\n const $el = this.$el\r\n\r\n if (!buttons || buttons.length < 1) {\r\n return this\r\n }\r\n\r\n on($el, `.outline-toolbar__button`, 'click', this.onExecute, this, true)\r\n\r\n this.$on('toolbar:update', this.onToolbarUpdate)\r\n this.$on('toolbar:add:button', this.onAddButton)\r\n this.$on('toolbar:remove:button', this.onRemoveButton)\r\n this.$on('toolbar:toggle', this.toggle)\r\n\r\n return this\r\n }\r\n\r\n removeListeners() {\r\n const buttons = this.attr('buttons') || []\r\n const $el = this.$el\r\n\r\n if (!buttons || buttons.length < 1) {\r\n return this\r\n }\r\n\r\n off($el, '.outline-toolbar__button', this.onExecute)\r\n\r\n this.$off('toolbar:update')\r\n this.$off('toolbar:add:button')\r\n this.$off('toolbar:remove:button')\r\n this.$off('toolbar:toggle')\r\n\r\n return this\r\n }\r\n}\r\n\r\nToolbar.DEFAULTS = (() => {\r\n const OPTIONS = {\r\n placement: 'ltr',\r\n closed: false,\r\n disabled: false,\r\n rounded: true,\r\n buttons: [],\r\n created: null,\r\n mounted: null,\r\n afterClosed: null,\r\n afterOpened: null,\r\n afterDisabled: null,\r\n afterEnabled: null,\r\n beforeDestroy: null,\r\n afterDestroy: null\r\n }\r\n\r\n return cloneDeep(OPTIONS)\r\n})()\r\n\r\nexport default Toolbar\r\n","import publish from './utils/observer/emit'\r\n\r\nclass Speech {\r\n constructor(options) {\r\n this.utterance = new SpeechSynthesisUtterance()\r\n\r\n if (options) {\r\n this.initialize(options)\r\n }\r\n }\r\n\r\n _initialize(options) {\r\n if (options.lang) {\r\n this.setLang(options.lang)\r\n }\r\n\r\n if (options.pitch) {\r\n this.setPitch(options.pitch)\r\n }\r\n\r\n if (options.rate) {\r\n this.setRate(options.rate)\r\n }\r\n\r\n if (options.text) {\r\n this.setText(options.text)\r\n }\r\n\r\n if (options.voice) {\r\n this.setVoice(options.voice)\r\n }\r\n\r\n if (options.volume) {\r\n this.setVolume(options.volume)\r\n }\r\n\r\n return this\r\n }\r\n\r\n initialize(options) {\r\n this._initialize(options)._addListeners()\r\n return this\r\n }\r\n\r\n isSpeaking() {\r\n return speechSynthesis.speaking\r\n }\r\n\r\n isPending() {\r\n return speechSynthesis.pending\r\n }\r\n\r\n isPaused() {\r\n return speechSynthesis.paused\r\n }\r\n\r\n getVoices() {\r\n return speechSynthesis.getVoices()\r\n }\r\n\r\n setLang(lang) {\r\n this.utterance.lang = lang\r\n return this\r\n }\r\n\r\n setPitch(pitch) {\r\n this.utterance.pitch = pitch\r\n return this\r\n }\r\n\r\n setRate(rate) {\r\n this.utterance.rate = rate\r\n return this\r\n }\r\n\r\n setText(text) {\r\n this.utterance.text = text\r\n return this\r\n }\r\n\r\n setVoice(voice) {\r\n this.utterance.voice = voice\r\n return this\r\n }\r\n\r\n setVolume(volume) {\r\n this.utterance.volume = volume\r\n return this\r\n }\r\n\r\n speak(text) {\r\n if (text) {\r\n this.setText(text)\r\n }\r\n\r\n speechSynthesis.speak(this.utterance)\r\n\r\n return this\r\n }\r\n\r\n pause() {\r\n speechSynthesis.pause()\r\n return this\r\n }\r\n\r\n resume() {\r\n speechSynthesis.resume()\r\n return this\r\n }\r\n\r\n cancel() {\r\n speechSynthesis.cancel()\r\n this.setText('')\r\n return this\r\n }\r\n\r\n _addListeners() {\r\n const UTTERANCE_EVENTS = [\r\n 'boundary',\r\n 'end',\r\n 'error',\r\n 'start',\r\n 'mark',\r\n 'pause',\r\n 'resume'\r\n ]\r\n const utterance = this.utterance\r\n const speech = this\r\n\r\n UTTERANCE_EVENTS.forEach((name) => {\r\n utterance[`on${name}`] = (event) => {\r\n publish(name, {\r\n event,\r\n speech\r\n })\r\n }\r\n })\r\n\r\n speechSynthesis.onvoiceschanged = (event) => {\r\n publish('voiceschanged', {\r\n event,\r\n speech\r\n })\r\n }\r\n\r\n return this\r\n }\r\n}\r\n\r\nSpeech.isSupport = (() => {\r\n return 'speechSynthesis' in window\r\n})()\r\n\r\nexport default Speech\r\n","import addClass from '../../utils/dom/addClass'\r\n\r\nconst _updateSiblingElements = (siblingElement, isPrev) => {\r\n let tagName\r\n let $sibling = siblingElement\r\n\r\n while ($sibling) {\r\n tagName = $sibling.tagName.toLowerCase()\r\n\r\n if (tagName !== 'script' && tagName !== 'style') {\r\n addClass($sibling, 'outline-reader_sibling')\r\n }\r\n\r\n if (isPrev) {\r\n $sibling = $sibling.previousElementSibling\r\n } else {\r\n $sibling = $sibling.nextElementSibling\r\n }\r\n }\r\n}\r\n\r\nexport default _updateSiblingElements\r\n","import cloneDeep from '@/utils/lang/cloneDeep'\r\nimport later from '@/utils/lang/later'\r\nimport isString from '@/utils/types/isString'\r\nimport isElement from '@/utils/types/isElement'\r\nimport isFunction from '@/utils/types/isFunction'\r\nimport createElement from '@/utils/dom/createElement'\r\nimport addClass from '@/utils/dom/addClass'\r\nimport removeClass from '@/utils/dom/removeClass'\r\nimport isMobile from '@/utils/dom/isMobile'\r\n\r\nimport at from '@/utils/event/at'\r\nimport stop from '@/utils/event/stop'\r\nimport off from '@/utils/event/off'\r\n\r\nimport Message from '@/message/message'\r\nimport Toolbar from '@/toolbar/toolbar'\r\n\r\nimport Speech from '@/speech'\r\nimport Component from '@/component'\r\n\r\nimport _updateSiblingElements from './utils/_updateSiblingElements'\r\n\r\nimport './reader.less'\r\n\r\nconst ENTER_READING_TIP = '进入阅读模式,按 ESC 键可退出阅读模式'\r\n\r\nclass Reader extends Component {\r\n constructor(options) {\r\n super()\r\n\r\n this._default()\r\n\r\n if (options) {\r\n this.initialize(options)\r\n }\r\n }\r\n\r\n _default() {\r\n this.attrs = cloneDeep(Reader.DEFAULTS)\r\n this.reading = false\r\n\r\n this.$target = null\r\n this.$el = null\r\n this.$paper = null\r\n this.$title = null\r\n this.$article = null\r\n this.$progress = null\r\n\r\n this.toolbar = null\r\n this.speech = null\r\n\r\n return this\r\n }\r\n\r\n initialize(options) {\r\n let target\r\n\r\n this.attr(options)\r\n\r\n target = this.attr('target')\r\n\r\n if (isString(target)) {\r\n this.$target = document.querySelector(target)\r\n } else if (isElement(target)) {\r\n this.$target = target\r\n }\r\n\r\n if (!this.$target) {\r\n return this\r\n }\r\n\r\n if (Speech.isSupport) {\r\n this.speech = new Speech()\r\n }\r\n\r\n this.render().addListeners()\r\n\r\n return this\r\n }\r\n\r\n isSpeaking() {\r\n return this?.speech?.isSpeaking()\r\n }\r\n\r\n render() {\r\n this._renderEdge()._paint(this.$target)\r\n return this\r\n }\r\n\r\n erase() {\r\n this.$article.innerHTML = ''\r\n return this\r\n }\r\n\r\n _paint($content) {\r\n const $fragment = document.createDocumentFragment()\r\n const $children = [...$content.cloneNode(true).children]\r\n\r\n later(() => {\r\n $children.forEach(($child) => {\r\n $fragment.appendChild($child)\r\n })\r\n\r\n this.$article.appendChild($fragment)\r\n })\r\n\r\n return this\r\n }\r\n\r\n _remove() {\r\n const $el = this.$el\r\n const toolbar = this.toolbar\r\n\r\n if ($el) {\r\n document.body.removeChild($el)\r\n }\r\n\r\n if (toolbar) {\r\n toolbar.destroy()\r\n }\r\n\r\n return this\r\n }\r\n\r\n refresh() {\r\n this.erase()._paint(this.$target)\r\n return this\r\n }\r\n\r\n _animateTimeline() {\r\n // eslint-disable-next-line\r\n if (!window.ScrollTimeline || !isMobile()) {\r\n return this\r\n }\r\n\r\n this.$progress.animate(\r\n {\r\n // from\r\n scale: ['0 1', '1 1']\r\n },\r\n {\r\n // eslint-disable-next-line\r\n timeline: new ScrollTimeline({\r\n source: this.$article,\r\n axis: 'block'\r\n })\r\n }\r\n )\r\n\r\n return this\r\n }\r\n\r\n _renderEdge() {\r\n const $target = this.$target\r\n const mobile = isMobile()\r\n const size = mobile ? 26 : 20\r\n let title = this.attr('title')\r\n let $el\r\n let $paper\r\n let $title\r\n let $article\r\n let $progress\r\n let $sibling\r\n\r\n $progress = createElement('div', {\r\n className: 'outline-reader__progress'\r\n })\r\n this.$progress = $progress\r\n\r\n $title = $target.querySelector('h1')\r\n\r\n if (isElement(title)) {\r\n $title = title\r\n }\r\n\r\n if (isElement($title)) {\r\n title = $title.innerText\r\n }\r\n\r\n $title = createElement(\r\n 'h1',\r\n {\r\n className: 'outline-reader__title'\r\n },\r\n title\r\n )\r\n this.$title = $title\r\n\r\n $article = createElement(\r\n 'article',\r\n {\r\n id: 'outline-reader__article',\r\n className: 'outline-reader__article'\r\n },\r\n isMobile() ? [] : [$progress.cloneNode()]\r\n )\r\n this.$article = $article\r\n\r\n $paper = createElement(\r\n 'div',\r\n {\r\n id: 'outline-reader__paper',\r\n className: 'outline-reader__paper'\r\n },\r\n [$title, $article]\r\n )\r\n this.$paper = $paper\r\n\r\n const buttons = []\r\n\r\n buttons.push({\r\n name: 'print',\r\n icon: 'print',\r\n size,\r\n action: {\r\n context: this,\r\n handler: this.print\r\n }\r\n })\r\n\r\n if (Speech.isSupport && this.attr('allowSpeak')) {\r\n buttons.push({\r\n name: 'speak',\r\n icon: 'sound',\r\n size,\r\n action: {\r\n context: this,\r\n handler: this.speak\r\n }\r\n })\r\n }\r\n\r\n buttons.push({\r\n name: 'exit',\r\n icon: 'close',\r\n size,\r\n action: {\r\n context: this,\r\n handler: this.exit\r\n }\r\n })\r\n\r\n this.toolbar = new Toolbar({\r\n placement: 'rtl',\r\n buttons\r\n })\r\n\r\n $el = createElement(\r\n 'section',\r\n {\r\n id: 'outline-reader',\r\n className: 'outline-reader outline-reader_hidden'\r\n },\r\n [$progress, $paper, this.toolbar.$el]\r\n )\r\n this.$el = $el\r\n\r\n document.body.appendChild($el)\r\n\r\n this._animateTimeline()\r\n\r\n later(() => {\r\n // 设置邻居节点的打印样式\r\n $sibling = $el.previousElementSibling\r\n _updateSiblingElements($sibling, true)\r\n\r\n $sibling = $el.nextElementSibling\r\n _updateSiblingElements($sibling)\r\n })\r\n\r\n return this\r\n }\r\n\r\n enter() {\r\n const READER = 'outline-reader'\r\n const READING = `${READER}--reading`\r\n const HIDDEN = `${READER}_hidden`\r\n const $el = this.$el\r\n const $siblings = document.querySelectorAll('.outline-reader_sibling')\r\n const enterReadingTip = this.attr('enterReadingTip') || ENTER_READING_TIP\r\n\r\n if (this.reading || !$el) {\r\n return this\r\n }\r\n\r\n $siblings.forEach(($sibling) => {\r\n addClass($sibling, HIDDEN)\r\n })\r\n addClass($el, READING)\r\n removeClass($el, HIDDEN)\r\n this.toolbar.show()\r\n this.reading = true\r\n\r\n Message.info({\r\n round: true,\r\n message: enterReadingTip\r\n })\r\n\r\n this.$emit('reader:enter')\r\n\r\n return this\r\n }\r\n\r\n exit() {\r\n const SPEAK = 'speak'\r\n const READER = 'outline-reader'\r\n const READING = `${READER}--reading`\r\n const HIDDEN = `${READER}_hidden`\r\n const $el = this.$el\r\n const $siblings = document.querySelectorAll('.outline-reader_sibling')\r\n const speech = this.speech\r\n const toolbar = this.toolbar\r\n\r\n if (!this.reading || !$el) {\r\n return this\r\n }\r\n\r\n addClass($el, HIDDEN)\r\n removeClass($el, READING)\r\n $siblings.forEach(($sibling) => {\r\n removeClass($sibling, HIDDEN)\r\n })\r\n toolbar.hide()\r\n this.reading = false\r\n\r\n if (speech) {\r\n if (toolbar.isHighlight(SPEAK)) {\r\n toolbar.highlight(SPEAK)\r\n }\r\n\r\n speech.cancel()\r\n }\r\n\r\n this.$emit('reader:exit')\r\n\r\n return this\r\n }\r\n\r\n toggle() {\r\n if (this.reading) {\r\n this.exit()\r\n } else {\r\n this.enter()\r\n }\r\n\r\n return this\r\n }\r\n\r\n speak() {\r\n const text = this.$article.innerText\r\n const speech = this.speech\r\n\r\n if (!Speech.isSupport || !speech) {\r\n return this\r\n }\r\n\r\n this.toolbar.highlight('speak')\r\n\r\n if (this.isSpeaking()) {\r\n speech.cancel()\r\n } else {\r\n speech.speak(text)\r\n }\r\n\r\n return this\r\n }\r\n\r\n print() {\r\n if (!isFunction(print)) {\r\n return this\r\n }\r\n\r\n print()\r\n\r\n return this\r\n }\r\n\r\n destroy() {\r\n const $el = this.$el\r\n\r\n if (!$el) {\r\n return this\r\n }\r\n\r\n this.removeListeners()._remove()._default()\r\n\r\n return this\r\n }\r\n\r\n onPrint() {\r\n this.print()\r\n return this\r\n }\r\n\r\n onEnterReading() {\r\n this.toggle()\r\n return this\r\n }\r\n\r\n onExitReading(evt) {\r\n const keyCode = evt.keyCode\r\n\r\n if (keyCode === 27 && this.reading) {\r\n this.toggle()\r\n stop(evt)\r\n }\r\n\r\n return this\r\n }\r\n\r\n onRefresh() {\r\n this.refresh()\r\n\r\n return this\r\n }\r\n\r\n addListeners() {\r\n const $el = this.$el\r\n\r\n if (!$el) {\r\n return this\r\n }\r\n\r\n at(document, 'keyup', this.onExitReading, this, true)\r\n\r\n this.$on('toolbar:action:print', this.onPrint)\r\n this.$on('toolbar:action:reading', this.onEnterReading)\r\n this.$on('reader:print', this.onPrint)\r\n this.$on('reader:refresh', this.onRefresh)\r\n this.$on('reader:enter', this.enter)\r\n this.$on('reader:exit', this.exit)\r\n this.$on('reader:toggle', this.toggle)\r\n\r\n return this\r\n }\r\n\r\n removeListeners() {\r\n const $el = this.$el\r\n\r\n if (!$el) {\r\n return this\r\n }\r\n\r\n off(document, 'keyup', this.onExitReading)\r\n\r\n this.$off('toolbar:action:print')\r\n this.$off('toolbar:action:reading')\r\n this.$off('reader:refresh')\r\n this.$off('reader:toggle')\r\n\r\n return this\r\n }\r\n}\r\n\r\nReader.DEFAULTS = (() => {\r\n const OPTIONS = {\r\n target: '',\r\n title: '',\r\n enterReadingTip: ENTER_READING_TIP,\r\n allowSpeak: false\r\n }\r\n\r\n return cloneDeep(OPTIONS)\r\n})()\r\n\r\nexport default Reader\r\n","/**\r\n * 停止事件(阻止默认行为和阻止事件的捕获或冒泡)\r\n * ========================================================================\r\n * @method stop\r\n * @param {Event} evt - 事件对象\r\n *\r\n * @example\r\n *
\r\n * Service\r\n * Help\r\n *
\r\n *\r\n * const $nav = document.querySelector('#nav')\r\n * const $service = document.querySelector('.anchor')\r\n *\r\n * on($nav, 'click', function(evt) {\r\n * console.log('你点击了导航栏')\r\n * })\r\n *\r\n * on($anchor, 'click', function(evt) {\r\n * console.log('tagName', this.tagName)\r\n *\r\n * // 工作台输出:'a'\r\n * // 不会触发事件冒泡,输出:'你点击了导航栏'\r\n * // 也不会切换到 href 属性的页面,阻止了点击链接的默认行为\r\n * stopEvent(evt)\r\n * })\r\n */\r\nconst stop = function (evt) {\r\n evt.stopPropagation()\r\n evt.preventDefault()\r\n}\r\n\r\nexport default stop\r\n","import isFunction from '@/utils/types/isFunction'\r\nimport off from './off'\r\n\r\nimport { CAPTURE_EVENTS } from './enum'\r\n\r\n/**\r\n * 绑定事件\r\n * ========================================================================\r\n * @method at\r\n * @param {HTMLElement|String|Object} el - (必须)绑定代理事件的 DOM 节点\r\n * @param {String|Function} type - (必须)事件类型或者事件处理器回调函数\r\n * @param {Function|Object} fn - (必须) 事件处理器回调函数或者传递给事件处理器回调函数的数据对象\r\n * @param {Object|Boolean} [data] - (可选)传递给事件处理器回调函数的数据对象或者事件处理器回调函数的 this 上下文指向,\r\n * @param {Object|Boolean} [context] - (可选)事件处理器回调函数的 this 上下文指向,或者是否仅触发一次\r\n * 当设置为 true 时,则事件处理器回调函数的 this 上下文指向为 data 对象\r\n * @param {Boolean} once - (可选)是否仅触发一次\r\n */\r\nconst at = (el, type, fn, data, context, once = false) => {\r\n // CAPTURE_EVENTS 中的特殊事件,采用事件捕获模型\r\n const capture = CAPTURE_EVENTS.indexOf(type) > -1\r\n const listener = function (evt) {\r\n let overrideContext = context || el\r\n\r\n // 当设置为 true 时,则事件处理器回调函数的\r\n // this 上下文指向为 data 对象\r\n if (context === true) {\r\n overrideContext = data\r\n }\r\n\r\n // 仅触发一次\r\n /* istanbul ignore else */\r\n if (once === true) {\r\n off(el, type, listener)\r\n }\r\n\r\n fn.call(overrideContext, evt, data)\r\n }\r\n\r\n if (!isFunction(fn)) {\r\n return false\r\n }\r\n\r\n if (!el._listeners) {\r\n el._listeners = []\r\n }\r\n\r\n // 缓存 options 元素绑定的事件处理器\r\n el._listeners.push({\r\n el,\r\n type,\r\n fn: listener,\r\n data,\r\n context,\r\n capture\r\n })\r\n\r\n // 缓存包装后的事件处理器\r\n fn._delegateListener = listener\r\n\r\n el.addEventListener(type, listener, capture)\r\n}\r\n\r\nexport default at\r\n"],"names":["toString","val","Object","prototype","apply","isFunction","isObject","o","isArray","Array","cloneDeep","obj","clone","from","assign","keys","forEach","key","later","fn","delay","setTimeout","isString","str","isElement","nodeName","tagName","nodeType","isDOM","el","isHTMLCollection","fragment","isTextNode","hasOwn","prop","hasOwnProperty","call","hasClass","className","pattern","RegExp","allClass","classList","contains","exec","addClass","_classList","add","indexOf","split","name","length","setAttribute","attr","value","toLowerCase","style","cssText","innerHTML","innerText","setAttributes","attrs","createElement","children","$fragment","document","createDocumentFragment","$el","isValidChild","child","append","$child","createTextNode","appendChild","every","removeClass","remove","replace","isMobile","ua","navigator","userAgent","test","CAPTURE_EVENTS","_off","type","capture","_delegateListener","listeners","_listeners","index","listener","i","handler","splice","_delete","removeEventListener","purgeElement","recurse","$element","querySelector","$children","childNodes","getListeners","filter","arguments","off","isPlainObject","getPrototypeOf","proto","isObjectLike","extend","origin","source","stripScripts","encodeHTML","CHARTS","tag","guid","uuid","prefix","options","ICON","size","color","iconSet","width","height","defaultRules","cssRules","$icon","$svg","binds","svg","isSVG","xmlns","class","icon","SYMBOLS","_maybeArrayLike","_toConsumableArray","getSymbols","getSymbol","patternName","patternSet","find","symbol","fullName","paint","$body","body","$icons","symbols","push","join","insertBefore","firstChild","matches","selector","sel","msMatchesSelector","getParentOrHost","host","parentNode","on","data","context","once","evt","target","getTarget","delegateTarget","closest","ctx","includeCTX","startsWith","overrideContext","addEventListener","_subscribers","_hasDirectSubscribersFor","topic","has","isDirect","found","position","lastIndexOf","substring","_hasSubscribers","emit","async","execute","subscriber","message","callback","deliver","_removeSubscriber","token","subject","execution","j","_removeSubscriberByToken","Component","constructor","this","initialize","render","addListeners","refresh","destroy","removeListeners","reload","$emit","event","publish","$on","subscribe","$off","unsubscribe","instances","instance","Message","super","_default","DEFAULTS","id","closed","visible","offset","timer","destroyed","_objectSpread","open","isClosed","isDestroyed","_getClassName","effect","round","closable","customClass","dangerouslyUseHTMLString","$type","$message","$text","$close","iconSize","_refreshIcon","HIDDEN","iconName","$use","_refreshMessage","text","_refreshClose","_refreshEl","clearTimer","clearTimeout","startTimer","duration","close","top","destroyAfterClosed","beforeClose","removeChild","onMouseEnter","onMouseLeave","onClose","config","item","offsetHeight","len","dom","parseInt","clear","Command","action","Commands","commands","get","cmd","command","del","_createButton","button","rounded","$anchor","href","link","$button","disabled","DISABLED","ACTIVE","Toolbar","buttons","created","isHighlight","isDisabled","isExist","_getCommand","_self","bind","mounted","placement","_paint","hide","disable","erase","_remove","_add","_disable","_enable","enable","enabled","show","opened","toggle","highlight","beforeDestroy","afterDestroy","onExecute","getAttribute","_updateToolbar","min","max","current","Math","ceil","onToolbarUpdate","onAddButton","onRemoveButton","afterClosed","afterOpened","afterDisabled","afterEnabled","Speech","utterance","SpeechSynthesisUtterance","_initialize","lang","setLang","pitch","setPitch","rate","setRate","setText","voice","setVoice","volume","setVolume","_addListeners","isSpeaking","speechSynthesis","speaking","isPending","pending","isPaused","paused","getVoices","speak","pause","resume","cancel","speech","onvoiceschanged","isSupport","window","_updateSiblingElements","siblingElement","isPrev","$sibling","previousElementSibling","nextElementSibling","ENTER_READING_TIP","Reader","reading","$target","$paper","$title","$article","$progress","toolbar","_this$speech","_renderEdge","$content","cloneNode","_animateTimeline","ScrollTimeline","animate","scale","timeline","axis","title","print","exit","enter","READER","READING","$siblings","querySelectorAll","enterReadingTip","info","SPEAK","onPrint","onEnterReading","onExitReading","keyCode","stopPropagation","preventDefault","stop","onRefresh","at","allowSpeak"],"mappings":"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"} \ No newline at end of file diff --git a/_updateSiblingElements.js b/reader/utils/_updateSiblingElements.js similarity index 90% rename from _updateSiblingElements.js rename to reader/utils/_updateSiblingElements.js index d52fd791..c76f69ae 100644 --- a/_updateSiblingElements.js +++ b/reader/utils/_updateSiblingElements.js @@ -1,4 +1,4 @@ -import addClass from './utils/dom/addClass' +import addClass from '../../utils/dom/addClass' const _updateSiblingElements = (siblingElement, isPrev) => { let tagName diff --git a/theme/outline.less b/theme/outline.less index 7deee9ae..f6bab507 100644 --- a/theme/outline.less +++ b/theme/outline.less @@ -3,10 +3,10 @@ @import './ellipsis'; @import './shadow'; @import './icons'; -@import './anchors'; -@import './drawer'; -@import './navigator'; -@import './reader'; -@import './toolbar'; -@import './message'; @import './scrollbar'; + +@import '../anchors/anchors'; +@import '../drawer/drawer'; +@import '../navigator/navigator'; +@import '../reader/reader'; +@import '../toolbar/toolbar'; diff --git a/toolbar.css b/toolbar.css deleted file mode 100644 index 3c0f4b8f..00000000 --- a/toolbar.css +++ /dev/null @@ -1,160 +0,0 @@ -/* ========== buttons.theme - 按钮导航样式 ========== */ -/* ========== colors.theme - 基础颜色变量集合 ========== */ -/** - * shadow.less - 阴影样式设置 mixinx 函数 - * ============================================================= - * Created By: Yaohaixiao - * Update: 2022.3.20 - */ -/* ====== 阴影样式设置函数 ====== */ -.outline-toolbar { - position: fixed; - z-index: 99999; - margin: 0; - -webkit-transition-duration: 0.3s; - transition-duration: 0.3s; - overflow: hidden; -} -.outline-toolbar__button { - -webkit-box-shadow: 0 0 6px 1px #dcdfe6; - box-shadow: 0 0 6px 1px #dcdfe6; - position: relative; - z-index: 1; - margin: 10px; - width: 36px; - height: 36px; - border: 1px solid #dcdfe6; - border-radius: 3px; - -webkit-box-sizing: border-box; - box-sizing: border-box; - background-color: #fff; - cursor: pointer; - text-align: center; - color: #999; - -webkit-transition: all 0.3s 0.1s ease-in-out; - transition: all 0.3s 0.1s ease-in-out; - overflow: hidden; -} -.outline-toolbar__button:hover { - color: #058942; - border-color: #058942; - -webkit-transform: scale(1.35); - transform: scale(1.35); -} -.outline-toolbar__button.hide { - display: none; -} -.outline-toolbar__anchor:link, -.outline-toolbar__anchor:visited, -.outline-toolbar__anchor:hover { - color: #999; - text-decoration: none; -} -.outline-toolbar__anchor:hover { - color: #058942; -} -.outline-toolbar__icon { - position: absolute; - z-index: 2; - top: 50%; - left: 50%; - width: 20px; - height: 20px; - -webkit-transform: translate(-50%, -50%); - transform: translate(-50%, -50%); - fill: currentcolor; - overflow: hidden; -} -.outline-toolbar_active.outline-toolbar__button { - color: #fff; - background-color: #058942; - border-color: #058942; -} -.outline-toolbar_active.outline-toolbar__button:hover { - color: #fff; -} -.outline-toolbar_active .outline-toolbar__anchor:link, -.outline-toolbar_active .outline-toolbar__anchor:visited, -.outline-toolbar_active .outline-toolbar__anchor:hover { - color: #fff; -} -.outline-toolbar_rounded.outline-toolbar__button { - border-radius: 18px; -} -.outline-toolbar_disabled.outline-toolbar__anchor:link, -.outline-toolbar_disabled .outline-toolbar__anchor:link, -.outline-toolbar_disabled.outline-toolbar__anchor:visited, -.outline-toolbar_disabled .outline-toolbar__anchor:visited, -.outline-toolbar_disabled.outline-toolbar__anchor:hover, -.outline-toolbar_disabled .outline-toolbar__anchor:hover, -.outline-toolbar_disabled.outline-toolbar__button, -.outline-toolbar_disabled .outline-toolbar__button { - cursor: not-allowed; - color: #999; - border-color: #999; -} -.outline-toolbar_disabled.outline-toolbar__anchor:link:hover, -.outline-toolbar_disabled .outline-toolbar__anchor:link:hover, -.outline-toolbar_disabled.outline-toolbar__anchor:visited:hover, -.outline-toolbar_disabled .outline-toolbar__anchor:visited:hover, -.outline-toolbar_disabled.outline-toolbar__anchor:hover:hover, -.outline-toolbar_disabled .outline-toolbar__anchor:hover:hover, -.outline-toolbar_disabled.outline-toolbar__button:hover, -.outline-toolbar_disabled .outline-toolbar__button:hover { - color: #999; - border-color: #999; -} -.outline-toolbar_disabled.outline-toolbar__button, -.outline-toolbar_disabled .outline-toolbar__button { - background-color: #f5f5f5; -} -.outline-toolbar_ttb, -.outline-toolbar_btt { - left: 50%; - -webkit-transform: translateX(-50%); - transform: translateX(-50%); -} -.outline-toolbar_ttb .outline-toolbar__button, -.outline-toolbar_btt .outline-toolbar__button { - display: inline-block; -} -.outline-toolbar_ttb { - top: 12px; -} -.outline-toolbar_ttb.outline-toolbar_hidden { - top: -56px; -} -.outline-toolbar_btt { - bottom: 12px; -} -.outline-toolbar_btt.outline-toolbar_hidden { - bottom: -56px; -} -.outline-toolbar_rtl, -.outline-toolbar_ltr { - -webkit-transform: translateY(-50%); - transform: translateY(-50%); - width: 56px; -} -.outline-toolbar_rtl { - top: 50%; - right: 12px; -} -.outline-toolbar_rtl.outline-toolbar_hidden { - right: -86px; -} -.outline-toolbar_ltr { - top: 50%; - left: 12px; -} -.outline-toolbar_ltr.outline-toolbar_hidden { - left: -86px; -} -.outline-toolbar_ttb .outline-toolbar__button.outline-toolbar_hidden, -.outline-toolbar_rtl .outline-toolbar__button.outline-toolbar_hidden, -.outline-toolbar_btt .outline-toolbar__button.outline-toolbar_hidden, -.outline-toolbar_ltr .outline-toolbar__button.outline-toolbar_hidden { - display: none; -} - -/*# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLzxpbnB1dCBjc3MgND4iLCJ0b29sYmFyLmxlc3MiLCJzaGFkb3cubGVzcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxrREFBa0Q7QUFDbEQsbURBQW1EO0FBQ25EOzs7OztHQUtHO0FBQ0gsNEJBQTRCO0FDSjVCO0VBQ0UsZ0JBQUE7RUFDQSxlQUFBO0VBQ0EsVUFBQTtFQUNBLGtDQUFBO1VBQUEsMEJBQUE7RUFDQSxpQkFBQTtDRE1EO0FDSkM7RUNEQSx3Q0FBQTtVQUFBLGdDQUFBO0VER0UsbUJBQUE7RUFDQSxXQUFBO0VBQ0EsYUFBQTtFQUNBLFlBQUE7RUFDQSxhQUFBO0VBQ0EsMEJBQUE7RUFDQSxtQkFBQTtFQUNBLCtCQUFBO1VBQUEsdUJBQUE7RUFDQSx1QkFBQTtFQUNBLGdCQUFBO0VBQ0EsbUJBQUE7RUFDQSxZQUFBO0VBQ0EsOENBQUE7RUFBQSxzQ0FBQTtFQUNBLGlCQUFBO0NETUg7QUNKRztFQUNFLGVBQUE7RUFDQSxzQkFBQTtFQUNBLCtCQUFBO1VBQUEsdUJBQUE7Q0RNTDtBQ0hHO0VBQ0UsY0FBQTtDREtMO0FDQUc7OztFQUdFLFlBQUE7RUFDQSxzQkFBQTtDREVMO0FDQ0c7RUFDRSxlQUFBO0NEQ0w7QUNHQztFQUNFLG1CQUFBO0VBQ0EsV0FBQTtFQUNBLFNBQUE7RUFDQSxVQUFBO0VBQ0EsWUFBQTtFQUNBLGFBQUE7RUFDQSx5Q0FBQTtVQUFBLGlDQUFBO0VBQ0EsbUJBQUE7RUFDQSxpQkFBQTtDRERIO0FDTUs7RUFDRSxZQUFBO0VBQ0EsMEJBQUE7RUFDQSxzQkFBQTtDREpQO0FDTU87RUFDRSxZQUFBO0NESlQ7QUNVSzs7O0VBR0UsWUFBQTtDRFJQO0FDY0c7RUFDRSxvQkFBQTtDRFpMO0FDbUJLOzs7Ozs7OztFQUlFLG9CQUFBO0VBQ0EsWUFBQTtFQUNBLG1CQUFBO0NEYlA7QUNlTzs7Ozs7Ozs7RUFDRSxZQUFBO0VBQ0EsbUJBQUE7Q0ROVDtBQ1VLOztFQUNFLDBCQUFBO0NEUFA7QUNZQzs7RUFFRSxVQUFBO0VBQ0Esb0NBQUE7VUFBQSw0QkFBQTtDRFZIO0FDT0M7O0VBTUksc0JBQUE7Q0RUTDtBQ2FDO0VBQ0UsVUFBQTtDRFhIO0FDYUc7RUFDRSxXQUFBO0NEWEw7QUNlQztFQUNFLGFBQUE7Q0RiSDtBQ2VHO0VBQ0UsY0FBQTtDRGJMO0FDaUJDOztFQUVFLG9DQUFBO1VBQUEsNEJBQUE7RUFDQSxZQUFBO0NEZkg7QUNrQkM7RUFDRSxTQUFBO0VBQ0EsWUFBQTtDRGhCSDtBQ2tCRztFQUNFLGFBQUE7Q0RoQkw7QUNvQkM7RUFDRSxTQUFBO0VBQ0EsV0FBQTtDRGxCSDtBQ29CRztFQUNFLFlBQUE7Q0RsQkw7QUMyQks7Ozs7RUFDRSxjQUFBO0NEdEJQIiwiZmlsZSI6InRvb2xiYXIuY3NzIiwic291cmNlc0NvbnRlbnQiOlsiLyogPT09PT09PT09PSBidXR0b25zLnRoZW1lIC0g5oyJ6ZKu5a+86Iiq5qC35byPID09PT09PT09PT0gKi9cbi8qID09PT09PT09PT0gY29sb3JzLnRoZW1lIC0g5Z+656GA6aKc6Imy5Y+Y6YeP6ZuG5ZCIID09PT09PT09PT0gKi9cbi8qKlxuICogc2hhZG93Lmxlc3MgLSDpmLTlvbHmoLflvI/orr7nva4gbWl4aW54IOWHveaVsFxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogQ3JlYXRlZCBCeTogWWFvaGFpeGlhb1xuICogVXBkYXRlOiAyMDIyLjMuMjBcbiAqL1xuLyogPT09PT09IOmYtOW9seagt+W8j+iuvue9ruWHveaVsCA9PT09PT0gKi9cbi5vdXRsaW5lLXRvb2xiYXIge1xuICBwb3NpdGlvbjogZml4ZWQ7XG4gIHotaW5kZXg6IDk5OTk5O1xuICBtYXJnaW46IDA7XG4gIHRyYW5zaXRpb24tZHVyYXRpb246IDAuM3M7XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4ub3V0bGluZS10b29sYmFyX19idXR0b24ge1xuICBib3gtc2hhZG93OiAwIDAgNnB4IDFweCAjZGNkZmU2O1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIHotaW5kZXg6IDE7XG4gIG1hcmdpbjogMTBweDtcbiAgd2lkdGg6IDM2cHg7XG4gIGhlaWdodDogMzZweDtcbiAgYm9yZGVyOiAxcHggc29saWQgI2RjZGZlNjtcbiAgYm9yZGVyLXJhZGl1czogM3B4O1xuICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmO1xuICBjdXJzb3I6IHBvaW50ZXI7XG4gIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgY29sb3I6ICM5OTk7XG4gIHRyYW5zaXRpb246IGFsbCAwLjNzIDAuMXMgZWFzZS1pbi1vdXQ7XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4ub3V0bGluZS10b29sYmFyX19idXR0b246aG92ZXIge1xuICBjb2xvcjogIzA1ODk0MjtcbiAgYm9yZGVyLWNvbG9yOiAjMDU4OTQyO1xuICB0cmFuc2Zvcm06IHNjYWxlKDEuMzUpO1xufVxuLm91dGxpbmUtdG9vbGJhcl9fYnV0dG9uLmhpZGUge1xuICBkaXNwbGF5OiBub25lO1xufVxuLm91dGxpbmUtdG9vbGJhcl9fYW5jaG9yOmxpbmssXG4ub3V0bGluZS10b29sYmFyX19hbmNob3I6dmlzaXRlZCxcbi5vdXRsaW5lLXRvb2xiYXJfX2FuY2hvcjpob3ZlciB7XG4gIGNvbG9yOiAjOTk5O1xuICB0ZXh0LWRlY29yYXRpb246IG5vbmU7XG59XG4ub3V0bGluZS10b29sYmFyX19hbmNob3I6aG92ZXIge1xuICBjb2xvcjogIzA1ODk0Mjtcbn1cbi5vdXRsaW5lLXRvb2xiYXJfX2ljb24ge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHotaW5kZXg6IDI7XG4gIHRvcDogNTAlO1xuICBsZWZ0OiA1MCU7XG4gIHdpZHRoOiAyMHB4O1xuICBoZWlnaHQ6IDIwcHg7XG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIC01MCUpO1xuICBmaWxsOiBjdXJyZW50Y29sb3I7XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4ub3V0bGluZS10b29sYmFyX2FjdGl2ZS5vdXRsaW5lLXRvb2xiYXJfX2J1dHRvbiB7XG4gIGNvbG9yOiAjZmZmO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjMDU4OTQyO1xuICBib3JkZXItY29sb3I6ICMwNTg5NDI7XG59XG4ub3V0bGluZS10b29sYmFyX2FjdGl2ZS5vdXRsaW5lLXRvb2xiYXJfX2J1dHRvbjpob3ZlciB7XG4gIGNvbG9yOiAjZmZmO1xufVxuLm91dGxpbmUtdG9vbGJhcl9hY3RpdmUgLm91dGxpbmUtdG9vbGJhcl9fYW5jaG9yOmxpbmssXG4ub3V0bGluZS10b29sYmFyX2FjdGl2ZSAub3V0bGluZS10b29sYmFyX19hbmNob3I6dmlzaXRlZCxcbi5vdXRsaW5lLXRvb2xiYXJfYWN0aXZlIC5vdXRsaW5lLXRvb2xiYXJfX2FuY2hvcjpob3ZlciB7XG4gIGNvbG9yOiAjZmZmO1xufVxuLm91dGxpbmUtdG9vbGJhcl9yb3VuZGVkLm91dGxpbmUtdG9vbGJhcl9fYnV0dG9uIHtcbiAgYm9yZGVyLXJhZGl1czogMThweDtcbn1cbi5vdXRsaW5lLXRvb2xiYXJfZGlzYWJsZWQub3V0bGluZS10b29sYmFyX19hbmNob3I6bGluayxcbi5vdXRsaW5lLXRvb2xiYXJfZGlzYWJsZWQgLm91dGxpbmUtdG9vbGJhcl9fYW5jaG9yOmxpbmssXG4ub3V0bGluZS10b29sYmFyX2Rpc2FibGVkLm91dGxpbmUtdG9vbGJhcl9fYW5jaG9yOnZpc2l0ZWQsXG4ub3V0bGluZS10b29sYmFyX2Rpc2FibGVkIC5vdXRsaW5lLXRvb2xiYXJfX2FuY2hvcjp2aXNpdGVkLFxuLm91dGxpbmUtdG9vbGJhcl9kaXNhYmxlZC5vdXRsaW5lLXRvb2xiYXJfX2FuY2hvcjpob3Zlcixcbi5vdXRsaW5lLXRvb2xiYXJfZGlzYWJsZWQgLm91dGxpbmUtdG9vbGJhcl9fYW5jaG9yOmhvdmVyLFxuLm91dGxpbmUtdG9vbGJhcl9kaXNhYmxlZC5vdXRsaW5lLXRvb2xiYXJfX2J1dHRvbixcbi5vdXRsaW5lLXRvb2xiYXJfZGlzYWJsZWQgLm91dGxpbmUtdG9vbGJhcl9fYnV0dG9uIHtcbiAgY3Vyc29yOiBub3QtYWxsb3dlZDtcbiAgY29sb3I6ICM5OTk7XG4gIGJvcmRlci1jb2xvcjogIzk5OTtcbn1cbi5vdXRsaW5lLXRvb2xiYXJfZGlzYWJsZWQub3V0bGluZS10b29sYmFyX19hbmNob3I6bGluazpob3Zlcixcbi5vdXRsaW5lLXRvb2xiYXJfZGlzYWJsZWQgLm91dGxpbmUtdG9vbGJhcl9fYW5jaG9yOmxpbms6aG92ZXIsXG4ub3V0bGluZS10b29sYmFyX2Rpc2FibGVkLm91dGxpbmUtdG9vbGJhcl9fYW5jaG9yOnZpc2l0ZWQ6aG92ZXIsXG4ub3V0bGluZS10b29sYmFyX2Rpc2FibGVkIC5vdXRsaW5lLXRvb2xiYXJfX2FuY2hvcjp2aXNpdGVkOmhvdmVyLFxuLm91dGxpbmUtdG9vbGJhcl9kaXNhYmxlZC5vdXRsaW5lLXRvb2xiYXJfX2FuY2hvcjpob3Zlcjpob3Zlcixcbi5vdXRsaW5lLXRvb2xiYXJfZGlzYWJsZWQgLm91dGxpbmUtdG9vbGJhcl9fYW5jaG9yOmhvdmVyOmhvdmVyLFxuLm91dGxpbmUtdG9vbGJhcl9kaXNhYmxlZC5vdXRsaW5lLXRvb2xiYXJfX2J1dHRvbjpob3Zlcixcbi5vdXRsaW5lLXRvb2xiYXJfZGlzYWJsZWQgLm91dGxpbmUtdG9vbGJhcl9fYnV0dG9uOmhvdmVyIHtcbiAgY29sb3I6ICM5OTk7XG4gIGJvcmRlci1jb2xvcjogIzk5OTtcbn1cbi5vdXRsaW5lLXRvb2xiYXJfZGlzYWJsZWQub3V0bGluZS10b29sYmFyX19idXR0b24sXG4ub3V0bGluZS10b29sYmFyX2Rpc2FibGVkIC5vdXRsaW5lLXRvb2xiYXJfX2J1dHRvbiB7XG4gIGJhY2tncm91bmQtY29sb3I6ICNmNWY1ZjU7XG59XG4ub3V0bGluZS10b29sYmFyX3R0Yixcbi5vdXRsaW5lLXRvb2xiYXJfYnR0IHtcbiAgbGVmdDogNTAlO1xuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTUwJSk7XG59XG4ub3V0bGluZS10b29sYmFyX3R0YiAub3V0bGluZS10b29sYmFyX19idXR0b24sXG4ub3V0bGluZS10b29sYmFyX2J0dCAub3V0bGluZS10b29sYmFyX19idXR0b24ge1xuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG59XG4ub3V0bGluZS10b29sYmFyX3R0YiB7XG4gIHRvcDogMTJweDtcbn1cbi5vdXRsaW5lLXRvb2xiYXJfdHRiLm91dGxpbmUtdG9vbGJhcl9oaWRkZW4ge1xuICB0b3A6IC01NnB4O1xufVxuLm91dGxpbmUtdG9vbGJhcl9idHQge1xuICBib3R0b206IDEycHg7XG59XG4ub3V0bGluZS10b29sYmFyX2J0dC5vdXRsaW5lLXRvb2xiYXJfaGlkZGVuIHtcbiAgYm90dG9tOiAtNTZweDtcbn1cbi5vdXRsaW5lLXRvb2xiYXJfcnRsLFxuLm91dGxpbmUtdG9vbGJhcl9sdHIge1xuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTUwJSk7XG4gIHdpZHRoOiA1NnB4O1xufVxuLm91dGxpbmUtdG9vbGJhcl9ydGwge1xuICB0b3A6IDUwJTtcbiAgcmlnaHQ6IDEycHg7XG59XG4ub3V0bGluZS10b29sYmFyX3J0bC5vdXRsaW5lLXRvb2xiYXJfaGlkZGVuIHtcbiAgcmlnaHQ6IC04NnB4O1xufVxuLm91dGxpbmUtdG9vbGJhcl9sdHIge1xuICB0b3A6IDUwJTtcbiAgbGVmdDogMTJweDtcbn1cbi5vdXRsaW5lLXRvb2xiYXJfbHRyLm91dGxpbmUtdG9vbGJhcl9oaWRkZW4ge1xuICBsZWZ0OiAtODZweDtcbn1cbi5vdXRsaW5lLXRvb2xiYXJfdHRiIC5vdXRsaW5lLXRvb2xiYXJfX2J1dHRvbi5vdXRsaW5lLXRvb2xiYXJfaGlkZGVuLFxuLm91dGxpbmUtdG9vbGJhcl9ydGwgLm91dGxpbmUtdG9vbGJhcl9fYnV0dG9uLm91dGxpbmUtdG9vbGJhcl9oaWRkZW4sXG4ub3V0bGluZS10b29sYmFyX2J0dCAub3V0bGluZS10b29sYmFyX19idXR0b24ub3V0bGluZS10b29sYmFyX2hpZGRlbixcbi5vdXRsaW5lLXRvb2xiYXJfbHRyIC5vdXRsaW5lLXRvb2xiYXJfX2J1dHRvbi5vdXRsaW5lLXRvb2xiYXJfaGlkZGVuIHtcbiAgZGlzcGxheTogbm9uZTtcbn1cbiIsIi8qID09PT09PT09PT0gYnV0dG9ucy50aGVtZSAtIOaMiemSruWvvOiIquagt+W8jyA9PT09PT09PT09ICovXHJcbkBpbXBvcnQgJy4vY29sb3JzJztcclxuQGltcG9ydCAnLi9zaGFkb3cnO1xyXG5cclxuLm91dGxpbmUtdG9vbGJhciB7XHJcbiAgcG9zaXRpb246IGZpeGVkO1xyXG4gIHotaW5kZXg6IDk5OTk5O1xyXG4gIG1hcmdpbjogMDtcclxuICB0cmFuc2l0aW9uLWR1cmF0aW9uOiAwLjNzO1xyXG4gIG92ZXJmbG93OiBoaWRkZW47XHJcblxyXG4gICZfX2J1dHRvbiB7XHJcbiAgICAuc2hhZG93X2xpZ2h0X3JlZ3VsYXIoKTtcclxuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcclxuICAgIHotaW5kZXg6IDE7XHJcbiAgICBtYXJnaW46IDEwcHg7XHJcbiAgICB3aWR0aDogMzZweDtcclxuICAgIGhlaWdodDogMzZweDtcclxuICAgIGJvcmRlcjogMXB4IHNvbGlkIEBwcmltYXJ5X2JvcmRlcl9jb2xvcjtcclxuICAgIGJvcmRlci1yYWRpdXM6IDNweDtcclxuICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XHJcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAd2hpdGU7XHJcbiAgICBjdXJzb3I6IHBvaW50ZXI7XHJcbiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XHJcbiAgICBjb2xvcjogQGZvdXJ0aF90ZXh0X2NvbG9yO1xyXG4gICAgdHJhbnNpdGlvbjogYWxsIDAuM3MgMC4xcyBlYXNlLWluLW91dDtcclxuICAgIG92ZXJmbG93OiBoaWRkZW47XHJcblxyXG4gICAgJjpob3ZlciB7XHJcbiAgICAgIGNvbG9yOiBAc3VjY2Vzc19jb2xvcjtcclxuICAgICAgYm9yZGVyLWNvbG9yOiBAc3VjY2Vzc19jb2xvcjtcclxuICAgICAgdHJhbnNmb3JtOiBzY2FsZSgxLjM1KTtcclxuICAgIH1cclxuXHJcbiAgICAmLmhpZGUge1xyXG4gICAgICBkaXNwbGF5OiBub25lO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgJl9fYW5jaG9yIHtcclxuICAgICY6bGluayxcclxuICAgICY6dmlzaXRlZCxcclxuICAgICY6aG92ZXIge1xyXG4gICAgICBjb2xvcjogQGZvdXJ0aF90ZXh0X2NvbG9yO1xyXG4gICAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7XHJcbiAgICB9XHJcblxyXG4gICAgJjpob3ZlciB7XHJcbiAgICAgIGNvbG9yOiBAc3VjY2Vzc19jb2xvcjtcclxuICAgIH1cclxuICB9XHJcblxyXG4gICZfX2ljb24ge1xyXG4gICAgcG9zaXRpb246IGFic29sdXRlO1xyXG4gICAgei1pbmRleDogMjtcclxuICAgIHRvcDogNTAlO1xyXG4gICAgbGVmdDogNTAlO1xyXG4gICAgd2lkdGg6IDIwcHg7XHJcbiAgICBoZWlnaHQ6IDIwcHg7XHJcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCAtNTAlKTtcclxuICAgIGZpbGw6IGN1cnJlbnRjb2xvcjtcclxuICAgIG92ZXJmbG93OiBoaWRkZW47XHJcbiAgfVxyXG5cclxuICAmX2FjdGl2ZSB7XHJcbiAgICAmLm91dGxpbmUtdG9vbGJhciB7XHJcbiAgICAgICZfX2J1dHRvbiB7XHJcbiAgICAgICAgY29sb3I6IEB3aGl0ZTtcclxuICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAc3VjY2Vzc19jb2xvcjtcclxuICAgICAgICBib3JkZXItY29sb3I6IEBzdWNjZXNzX2NvbG9yO1xyXG5cclxuICAgICAgICAmOmhvdmVyIHtcclxuICAgICAgICAgIGNvbG9yOiBAd2hpdGU7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLm91dGxpbmUtdG9vbGJhcl9fYW5jaG9yIHtcclxuICAgICAgJjpsaW5rLFxyXG4gICAgICAmOnZpc2l0ZWQsXHJcbiAgICAgICY6aG92ZXIge1xyXG4gICAgICAgIGNvbG9yOiBAd2hpdGU7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gICZfcm91bmRlZCB7XHJcbiAgICAmLm91dGxpbmUtdG9vbGJhcl9fYnV0dG9uIHtcclxuICAgICAgYm9yZGVyLXJhZGl1czogMThweDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gICZfZGlzYWJsZWQge1xyXG4gICAgJi5vdXRsaW5lLXRvb2xiYXIsXHJcbiAgICAub3V0bGluZS10b29sYmFyIHtcclxuICAgICAgJl9fYW5jaG9yOmxpbmssXHJcbiAgICAgICZfX2FuY2hvcjp2aXNpdGVkLFxyXG4gICAgICAmX19hbmNob3I6aG92ZXIsXHJcbiAgICAgICZfX2J1dHRvbiB7XHJcbiAgICAgICAgY3Vyc29yOiBub3QtYWxsb3dlZDtcclxuICAgICAgICBjb2xvcjogQGZvdXJ0aF90ZXh0X2NvbG9yO1xyXG4gICAgICAgIGJvcmRlci1jb2xvcjogQGZvdXJ0aF90ZXh0X2NvbG9yO1xyXG5cclxuICAgICAgICAmOmhvdmVyIHtcclxuICAgICAgICAgIGNvbG9yOiBAZm91cnRoX3RleHRfY29sb3I7XHJcbiAgICAgICAgICBib3JkZXItY29sb3I6IEBmb3VydGhfdGV4dF9jb2xvcjtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgICZfX2J1dHRvbiB7XHJcbiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogQGRpc2FibGVkX2JnX2NvbG9yO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAmX3R0YixcclxuICAmX2J0dCB7XHJcbiAgICBsZWZ0OiA1MCU7XHJcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTUwJSk7XHJcblxyXG4gICAgLm91dGxpbmUtdG9vbGJhcl9fYnV0dG9uIHtcclxuICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgJl90dGIge1xyXG4gICAgdG9wOiAxMnB4O1xyXG5cclxuICAgICYub3V0bGluZS10b29sYmFyX2hpZGRlbiB7XHJcbiAgICAgIHRvcDogLTU2cHg7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAmX2J0dCB7XHJcbiAgICBib3R0b206IDEycHg7XHJcblxyXG4gICAgJi5vdXRsaW5lLXRvb2xiYXJfaGlkZGVuIHtcclxuICAgICAgYm90dG9tOiAtNTZweDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gICZfcnRsLFxyXG4gICZfbHRyIHtcclxuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtNTAlKTtcclxuICAgIHdpZHRoOiA1NnB4O1xyXG4gIH1cclxuXHJcbiAgJl9ydGwge1xyXG4gICAgdG9wOiA1MCU7XHJcbiAgICByaWdodDogMTJweDtcclxuXHJcbiAgICAmLm91dGxpbmUtdG9vbGJhcl9oaWRkZW4ge1xyXG4gICAgICByaWdodDogLTg2cHg7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAmX2x0ciB7XHJcbiAgICB0b3A6IDUwJTtcclxuICAgIGxlZnQ6IDEycHg7XHJcblxyXG4gICAgJi5vdXRsaW5lLXRvb2xiYXJfaGlkZGVuIHtcclxuICAgICAgbGVmdDogLTg2cHg7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAmX3R0YixcclxuICAmX3J0bCxcclxuICAmX2J0dCxcclxuICAmX2x0ciB7XHJcbiAgICAub3V0bGluZS10b29sYmFyX19idXR0b24ge1xyXG4gICAgICAmLm91dGxpbmUtdG9vbGJhcl9oaWRkZW4ge1xyXG4gICAgICAgIGRpc3BsYXk6IG5vbmU7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcbn1cclxuIiwiLyoqXHJcbiAqIHNoYWRvdy5sZXNzIC0g6Zi05b2x5qC35byP6K6+572uIG1peGlueCDlh73mlbBcclxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxyXG4gKiBDcmVhdGVkIEJ5OiBZYW9oYWl4aWFvXHJcbiAqIFVwZGF0ZTogMjAyMi4zLjIwXHJcbiAqL1xyXG5AaW1wb3J0ICcuL2NvbG9ycyc7XHJcblxyXG4vKiA9PT09PT0g6Zi05b2x5qC35byP6K6+572u5Ye95pWwID09PT09PSAqL1xyXG4uc2hhZG93KEBvZmZzZXQ6IDAgMCA2cHggMXB4LCBAY29sb3I6IEBwcmltYXJ5X2JvcmRlcl9jb2xvcikge1xyXG4gIGJveC1zaGFkb3c6IEBvZmZzZXQgQGNvbG9yO1xyXG59XHJcblxyXG4uc2hhZG93X3JlZ3VsYXIoQGNvbG9yOiBAcHJpbWFyeV9ib3JkZXJfY29sb3IpIHtcclxuICAuc2hhZG93KDAgMCA2cHggMXB4LCBAY29sb3IpO1xyXG59XHJcblxyXG4uc2hhZG93X2xhcmdlKEBjb2xvcjogQHByaW1hcnlfYm9yZGVyX2NvbG9yKSB7XHJcbiAgLnNoYWRvdygwIDAgMTJweCAxcHgsIEBjb2xvcik7XHJcbn1cclxuXHJcbi5zaGFkb3dfbGlnaHRfcmVndWxhcigpIHtcclxuICAuc2hhZG93X3JlZ3VsYXIoKTtcclxufVxyXG5cclxuLnNoYWRvd19saWdodF9sYXJnZSgpIHtcclxuICAuc2hhZG93X2xhcmdlKCk7XHJcbn1cclxuXHJcbi5zaGFkb3dfZGFya19yZWd1bGFyKCkge1xyXG4gIC5zaGFkb3dfcmVndWxhcihAc2Vjb25kYXJ5X2JvcmRlcl9jb2xvcik7XHJcbn1cclxuXHJcbi5zaGFkb3dfZGFya19sYXJnZSgpIHtcclxuICAuc2hhZG93X2xhcmdlKEBzZWNvbmRhcnlfYm9yZGVyX2NvbG9yKTtcclxufVxyXG4iXX0= */ diff --git a/toolbar.min.css b/toolbar.min.css deleted file mode 100644 index 7f3ccdbc..00000000 --- a/toolbar.min.css +++ /dev/null @@ -1,2 +0,0 @@ -.outline-toolbar{position:fixed;z-index:99999;margin:0;-webkit-transition-duration:.3s;transition-duration:.3s;overflow:hidden}.outline-toolbar__button{-webkit-box-shadow:0 0 6px 1px #dcdfe6;box-shadow:0 0 6px 1px #dcdfe6;position:relative;z-index:1;margin:10px;width:36px;height:36px;border:1px solid #dcdfe6;border-radius:3px;-webkit-box-sizing:border-box;box-sizing:border-box;background-color:#fff;cursor:pointer;text-align:center;color:#999;-webkit-transition:all .3s .1s ease-in-out;transition:all .3s .1s ease-in-out;overflow:hidden}.outline-toolbar__button:hover{color:#058942;border-color:#058942;-webkit-transform:scale(1.35);transform:scale(1.35)}.outline-toolbar__button.hide{display:none}.outline-toolbar__anchor:hover,.outline-toolbar__anchor:link,.outline-toolbar__anchor:visited{color:#999;text-decoration:none}.outline-toolbar__anchor:hover{color:#058942}.outline-toolbar__icon{position:absolute;z-index:2;top:50%;left:50%;width:20px;height:20px;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%);fill:currentcolor;overflow:hidden}.outline-toolbar_active.outline-toolbar__button{color:#fff;background-color:#058942;border-color:#058942}.outline-toolbar_active .outline-toolbar__anchor:hover,.outline-toolbar_active .outline-toolbar__anchor:link,.outline-toolbar_active .outline-toolbar__anchor:visited,.outline-toolbar_active.outline-toolbar__button:hover{color:#fff}.outline-toolbar_rounded.outline-toolbar__button{border-radius:18px}.outline-toolbar_disabled .outline-toolbar__anchor:hover,.outline-toolbar_disabled .outline-toolbar__anchor:link,.outline-toolbar_disabled .outline-toolbar__anchor:visited,.outline-toolbar_disabled .outline-toolbar__button,.outline-toolbar_disabled.outline-toolbar__anchor:hover,.outline-toolbar_disabled.outline-toolbar__anchor:link,.outline-toolbar_disabled.outline-toolbar__anchor:visited,.outline-toolbar_disabled.outline-toolbar__button{cursor:not-allowed;color:#999;border-color:#999}.outline-toolbar_disabled .outline-toolbar__anchor:hover:hover,.outline-toolbar_disabled .outline-toolbar__anchor:link:hover,.outline-toolbar_disabled .outline-toolbar__anchor:visited:hover,.outline-toolbar_disabled .outline-toolbar__button:hover,.outline-toolbar_disabled.outline-toolbar__anchor:hover:hover,.outline-toolbar_disabled.outline-toolbar__anchor:link:hover,.outline-toolbar_disabled.outline-toolbar__anchor:visited:hover,.outline-toolbar_disabled.outline-toolbar__button:hover{color:#999;border-color:#999}.outline-toolbar_disabled .outline-toolbar__button,.outline-toolbar_disabled.outline-toolbar__button{background-color:#f5f5f5}.outline-toolbar_btt,.outline-toolbar_ttb{left:50%;-webkit-transform:translateX(-50%);transform:translateX(-50%)}.outline-toolbar_btt .outline-toolbar__button,.outline-toolbar_ttb .outline-toolbar__button{display:inline-block}.outline-toolbar_ttb{top:12px}.outline-toolbar_ttb.outline-toolbar_hidden{top:-56px}.outline-toolbar_btt{bottom:12px}.outline-toolbar_btt.outline-toolbar_hidden{bottom:-56px}.outline-toolbar_ltr,.outline-toolbar_rtl{-webkit-transform:translateY(-50%);transform:translateY(-50%);width:56px}.outline-toolbar_rtl{top:50%;right:12px}.outline-toolbar_rtl.outline-toolbar_hidden{right:-86px}.outline-toolbar_ltr{top:50%;left:12px}.outline-toolbar_ltr.outline-toolbar_hidden{left:-86px}.outline-toolbar_btt .outline-toolbar__button.outline-toolbar_hidden,.outline-toolbar_ltr .outline-toolbar__button.outline-toolbar_hidden,.outline-toolbar_rtl .outline-toolbar__button.outline-toolbar_hidden,.outline-toolbar_ttb .outline-toolbar__button.outline-toolbar_hidden{display:none} -/*# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlcyI6WyJ0b29sYmFyLmNzcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiA9PT09PT09PT09IGJ1dHRvbnMudGhlbWUgLSDmjInpkq7lr7zoiKrmoLflvI8gPT09PT09PT09PSAqL1xuLyogPT09PT09PT09PSBjb2xvcnMudGhlbWUgLSDln7rnoYDpopzoibLlj5jph4/pm4blkIggPT09PT09PT09PSAqL1xuLyoqXG4gKiBzaGFkb3cubGVzcyAtIOmYtOW9seagt+W8j+iuvue9riBtaXhpbngg5Ye95pWwXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBDcmVhdGVkIEJ5OiBZYW9oYWl4aWFvXG4gKiBVcGRhdGU6IDIwMjIuMy4yMFxuICovXG4vKiA9PT09PT0g6Zi05b2x5qC35byP6K6+572u5Ye95pWwID09PT09PSAqL1xuLm91dGxpbmUtdG9vbGJhciB7XG4gIHBvc2l0aW9uOiBmaXhlZDtcbiAgei1pbmRleDogOTk5OTk7XG4gIG1hcmdpbjogMDtcbiAgLXdlYmtpdC10cmFuc2l0aW9uLWR1cmF0aW9uOiAwLjNzO1xuICAgICAgICAgIHRyYW5zaXRpb24tZHVyYXRpb246IDAuM3M7XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG4ub3V0bGluZS10b29sYmFyX19idXR0b24ge1xuICAtd2Via2l0LWJveC1zaGFkb3c6IDAgMCA2cHggMXB4ICNkY2RmZTY7XG4gICAgICAgICAgYm94LXNoYWRvdzogMCAwIDZweCAxcHggI2RjZGZlNjtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICB6LWluZGV4OiAxO1xuICBtYXJnaW46IDEwcHg7XG4gIHdpZHRoOiAzNnB4O1xuICBoZWlnaHQ6IDM2cHg7XG4gIGJvcmRlcjogMXB4IHNvbGlkICNkY2RmZTY7XG4gIGJvcmRlci1yYWRpdXM6IDNweDtcbiAgLXdlYmtpdC1ib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gIGJhY2tncm91bmQtY29sb3I6ICNmZmY7XG4gIGN1cnNvcjogcG9pbnRlcjtcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xuICBjb2xvcjogIzk5OTtcbiAgLXdlYmtpdC10cmFuc2l0aW9uOiBhbGwgMC4zcyAwLjFzIGVhc2UtaW4tb3V0O1xuICB0cmFuc2l0aW9uOiBhbGwgMC4zcyAwLjFzIGVhc2UtaW4tb3V0O1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLm91dGxpbmUtdG9vbGJhcl9fYnV0dG9uOmhvdmVyIHtcbiAgY29sb3I6ICMwNTg5NDI7XG4gIGJvcmRlci1jb2xvcjogIzA1ODk0MjtcbiAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlKDEuMzUpO1xuICAgICAgICAgIHRyYW5zZm9ybTogc2NhbGUoMS4zNSk7XG59XG4ub3V0bGluZS10b29sYmFyX19idXR0b24uaGlkZSB7XG4gIGRpc3BsYXk6IG5vbmU7XG59XG4ub3V0bGluZS10b29sYmFyX19hbmNob3I6bGluayxcbi5vdXRsaW5lLXRvb2xiYXJfX2FuY2hvcjp2aXNpdGVkLFxuLm91dGxpbmUtdG9vbGJhcl9fYW5jaG9yOmhvdmVyIHtcbiAgY29sb3I6ICM5OTk7XG4gIHRleHQtZGVjb3JhdGlvbjogbm9uZTtcbn1cbi5vdXRsaW5lLXRvb2xiYXJfX2FuY2hvcjpob3ZlciB7XG4gIGNvbG9yOiAjMDU4OTQyO1xufVxuLm91dGxpbmUtdG9vbGJhcl9faWNvbiB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgei1pbmRleDogMjtcbiAgdG9wOiA1MCU7XG4gIGxlZnQ6IDUwJTtcbiAgd2lkdGg6IDIwcHg7XG4gIGhlaWdodDogMjBweDtcbiAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCAtNTAlKTtcbiAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCAtNTAlKTtcbiAgZmlsbDogY3VycmVudGNvbG9yO1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLm91dGxpbmUtdG9vbGJhcl9hY3RpdmUub3V0bGluZS10b29sYmFyX19idXR0b24ge1xuICBjb2xvcjogI2ZmZjtcbiAgYmFja2dyb3VuZC1jb2xvcjogIzA1ODk0MjtcbiAgYm9yZGVyLWNvbG9yOiAjMDU4OTQyO1xufVxuLm91dGxpbmUtdG9vbGJhcl9hY3RpdmUub3V0bGluZS10b29sYmFyX19idXR0b246aG92ZXIge1xuICBjb2xvcjogI2ZmZjtcbn1cbi5vdXRsaW5lLXRvb2xiYXJfYWN0aXZlIC5vdXRsaW5lLXRvb2xiYXJfX2FuY2hvcjpsaW5rLFxuLm91dGxpbmUtdG9vbGJhcl9hY3RpdmUgLm91dGxpbmUtdG9vbGJhcl9fYW5jaG9yOnZpc2l0ZWQsXG4ub3V0bGluZS10b29sYmFyX2FjdGl2ZSAub3V0bGluZS10b29sYmFyX19hbmNob3I6aG92ZXIge1xuICBjb2xvcjogI2ZmZjtcbn1cbi5vdXRsaW5lLXRvb2xiYXJfcm91bmRlZC5vdXRsaW5lLXRvb2xiYXJfX2J1dHRvbiB7XG4gIGJvcmRlci1yYWRpdXM6IDE4cHg7XG59XG4ub3V0bGluZS10b29sYmFyX2Rpc2FibGVkLm91dGxpbmUtdG9vbGJhcl9fYW5jaG9yOmxpbmssXG4ub3V0bGluZS10b29sYmFyX2Rpc2FibGVkIC5vdXRsaW5lLXRvb2xiYXJfX2FuY2hvcjpsaW5rLFxuLm91dGxpbmUtdG9vbGJhcl9kaXNhYmxlZC5vdXRsaW5lLXRvb2xiYXJfX2FuY2hvcjp2aXNpdGVkLFxuLm91dGxpbmUtdG9vbGJhcl9kaXNhYmxlZCAub3V0bGluZS10b29sYmFyX19hbmNob3I6dmlzaXRlZCxcbi5vdXRsaW5lLXRvb2xiYXJfZGlzYWJsZWQub3V0bGluZS10b29sYmFyX19hbmNob3I6aG92ZXIsXG4ub3V0bGluZS10b29sYmFyX2Rpc2FibGVkIC5vdXRsaW5lLXRvb2xiYXJfX2FuY2hvcjpob3Zlcixcbi5vdXRsaW5lLXRvb2xiYXJfZGlzYWJsZWQub3V0bGluZS10b29sYmFyX19idXR0b24sXG4ub3V0bGluZS10b29sYmFyX2Rpc2FibGVkIC5vdXRsaW5lLXRvb2xiYXJfX2J1dHRvbiB7XG4gIGN1cnNvcjogbm90LWFsbG93ZWQ7XG4gIGNvbG9yOiAjOTk5O1xuICBib3JkZXItY29sb3I6ICM5OTk7XG59XG4ub3V0bGluZS10b29sYmFyX2Rpc2FibGVkLm91dGxpbmUtdG9vbGJhcl9fYW5jaG9yOmxpbms6aG92ZXIsXG4ub3V0bGluZS10b29sYmFyX2Rpc2FibGVkIC5vdXRsaW5lLXRvb2xiYXJfX2FuY2hvcjpsaW5rOmhvdmVyLFxuLm91dGxpbmUtdG9vbGJhcl9kaXNhYmxlZC5vdXRsaW5lLXRvb2xiYXJfX2FuY2hvcjp2aXNpdGVkOmhvdmVyLFxuLm91dGxpbmUtdG9vbGJhcl9kaXNhYmxlZCAub3V0bGluZS10b29sYmFyX19hbmNob3I6dmlzaXRlZDpob3Zlcixcbi5vdXRsaW5lLXRvb2xiYXJfZGlzYWJsZWQub3V0bGluZS10b29sYmFyX19hbmNob3I6aG92ZXI6aG92ZXIsXG4ub3V0bGluZS10b29sYmFyX2Rpc2FibGVkIC5vdXRsaW5lLXRvb2xiYXJfX2FuY2hvcjpob3Zlcjpob3Zlcixcbi5vdXRsaW5lLXRvb2xiYXJfZGlzYWJsZWQub3V0bGluZS10b29sYmFyX19idXR0b246aG92ZXIsXG4ub3V0bGluZS10b29sYmFyX2Rpc2FibGVkIC5vdXRsaW5lLXRvb2xiYXJfX2J1dHRvbjpob3ZlciB7XG4gIGNvbG9yOiAjOTk5O1xuICBib3JkZXItY29sb3I6ICM5OTk7XG59XG4ub3V0bGluZS10b29sYmFyX2Rpc2FibGVkLm91dGxpbmUtdG9vbGJhcl9fYnV0dG9uLFxuLm91dGxpbmUtdG9vbGJhcl9kaXNhYmxlZCAub3V0bGluZS10b29sYmFyX19idXR0b24ge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjVmNWY1O1xufVxuLm91dGxpbmUtdG9vbGJhcl90dGIsXG4ub3V0bGluZS10b29sYmFyX2J0dCB7XG4gIGxlZnQ6IDUwJTtcbiAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTUwJSk7XG4gICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC01MCUpO1xufVxuLm91dGxpbmUtdG9vbGJhcl90dGIgLm91dGxpbmUtdG9vbGJhcl9fYnV0dG9uLFxuLm91dGxpbmUtdG9vbGJhcl9idHQgLm91dGxpbmUtdG9vbGJhcl9fYnV0dG9uIHtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xufVxuLm91dGxpbmUtdG9vbGJhcl90dGIge1xuICB0b3A6IDEycHg7XG59XG4ub3V0bGluZS10b29sYmFyX3R0Yi5vdXRsaW5lLXRvb2xiYXJfaGlkZGVuIHtcbiAgdG9wOiAtNTZweDtcbn1cbi5vdXRsaW5lLXRvb2xiYXJfYnR0IHtcbiAgYm90dG9tOiAxMnB4O1xufVxuLm91dGxpbmUtdG9vbGJhcl9idHQub3V0bGluZS10b29sYmFyX2hpZGRlbiB7XG4gIGJvdHRvbTogLTU2cHg7XG59XG4ub3V0bGluZS10b29sYmFyX3J0bCxcbi5vdXRsaW5lLXRvb2xiYXJfbHRyIHtcbiAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTUwJSk7XG4gICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC01MCUpO1xuICB3aWR0aDogNTZweDtcbn1cbi5vdXRsaW5lLXRvb2xiYXJfcnRsIHtcbiAgdG9wOiA1MCU7XG4gIHJpZ2h0OiAxMnB4O1xufVxuLm91dGxpbmUtdG9vbGJhcl9ydGwub3V0bGluZS10b29sYmFyX2hpZGRlbiB7XG4gIHJpZ2h0OiAtODZweDtcbn1cbi5vdXRsaW5lLXRvb2xiYXJfbHRyIHtcbiAgdG9wOiA1MCU7XG4gIGxlZnQ6IDEycHg7XG59XG4ub3V0bGluZS10b29sYmFyX2x0ci5vdXRsaW5lLXRvb2xiYXJfaGlkZGVuIHtcbiAgbGVmdDogLTg2cHg7XG59XG4ub3V0bGluZS10b29sYmFyX3R0YiAub3V0bGluZS10b29sYmFyX19idXR0b24ub3V0bGluZS10b29sYmFyX2hpZGRlbixcbi5vdXRsaW5lLXRvb2xiYXJfcnRsIC5vdXRsaW5lLXRvb2xiYXJfX2J1dHRvbi5vdXRsaW5lLXRvb2xiYXJfaGlkZGVuLFxuLm91dGxpbmUtdG9vbGJhcl9idHQgLm91dGxpbmUtdG9vbGJhcl9fYnV0dG9uLm91dGxpbmUtdG9vbGJhcl9oaWRkZW4sXG4ub3V0bGluZS10b29sYmFyX2x0ciAub3V0bGluZS10b29sYmFyX19idXR0b24ub3V0bGluZS10b29sYmFyX2hpZGRlbiB7XG4gIGRpc3BsYXk6IG5vbmU7XG59XG5cbi8qIyBzb3VyY2VNYXBwaW5nVVJMPWRhdGE6YXBwbGljYXRpb24vanNvbjtjaGFyc2V0PXV0Zjg7YmFzZTY0LGV5SjJaWEp6YVc5dUlqb3pMQ0p6YjNWeVkyVnpJanBiSWk0dUx6eHBibkIxZENCamMzTWdORDRpTENKMGIyOXNZbUZ5TG14bGMzTWlMQ0p6YUdGa2IzY3ViR1Z6Y3lKZExDSnVZVzFsY3lJNlcxMHNJbTFoY0hCcGJtZHpJam9pUVVGQlFTeHJSRUZCYTBRN1FVRkRiRVFzYlVSQlFXMUVPMEZCUTI1RU96czdPenRIUVV0SE8wRkJRMGdzTkVKQlFUUkNPMEZEU2pWQ08wVkJRMFVzWjBKQlFVRTdSVUZEUVN4bFFVRkJPMFZCUTBFc1ZVRkJRVHRGUVVOQkxHdERRVUZCTzFWQlFVRXNNRUpCUVVFN1JVRkRRU3hwUWtGQlFUdERSRTFFTzBGRFNrTTdSVU5FUVN4M1EwRkJRVHRWUVVGQkxHZERRVUZCTzBWRVIwVXNiVUpCUVVFN1JVRkRRU3hYUVVGQk8wVkJRMEVzWVVGQlFUdEZRVU5CTEZsQlFVRTdSVUZEUVN4aFFVRkJPMFZCUTBFc01FSkJRVUU3UlVGRFFTeHRRa0ZCUVR0RlFVTkJMQ3RDUVVGQk8xVkJRVUVzZFVKQlFVRTdSVUZEUVN4MVFrRkJRVHRGUVVOQkxHZENRVUZCTzBWQlEwRXNiVUpCUVVFN1JVRkRRU3haUVVGQk8wVkJRMEVzT0VOQlFVRTdSVUZCUVN4elEwRkJRVHRGUVVOQkxHbENRVUZCTzBORVRVZzdRVU5LUnp0RlFVTkZMR1ZCUVVFN1JVRkRRU3h6UWtGQlFUdEZRVU5CTEN0Q1FVRkJPMVZCUVVFc2RVSkJRVUU3UTBSTlREdEJRMGhITzBWQlEwVXNZMEZCUVR0RFJFdE1PMEZEUVVjN096dEZRVWRGTEZsQlFVRTdSVUZEUVN4elFrRkJRVHREUkVWTU8wRkRRMGM3UlVGRFJTeGxRVUZCTzBORVEwdzdRVU5IUXp0RlFVTkZMRzFDUVVGQk8wVkJRMEVzVjBGQlFUdEZRVU5CTEZOQlFVRTdSVUZEUVN4VlFVRkJPMFZCUTBFc1dVRkJRVHRGUVVOQkxHRkJRVUU3UlVGRFFTeDVRMEZCUVR0VlFVRkJMR2xEUVVGQk8wVkJRMEVzYlVKQlFVRTdSVUZEUVN4cFFrRkJRVHREUkVSSU8wRkRUVXM3UlVGRFJTeFpRVUZCTzBWQlEwRXNNRUpCUVVFN1JVRkRRU3h6UWtGQlFUdERSRXBRTzBGRFRVODdSVUZEUlN4WlFVRkJPME5FU2xRN1FVTlZTenM3TzBWQlIwVXNXVUZCUVR0RFJGSlFPMEZEWTBjN1JVRkRSU3h2UWtGQlFUdERSRnBNTzBGRGJVSkxPenM3T3pzN096dEZRVWxGTEc5Q1FVRkJPMFZCUTBFc1dVRkJRVHRGUVVOQkxHMUNRVUZCTzBORVlsQTdRVU5sVHpzN096czdPenM3UlVGRFJTeFpRVUZCTzBWQlEwRXNiVUpCUVVFN1EwUk9WRHRCUTFWTE96dEZRVU5GTERCQ1FVRkJPME5FVUZBN1FVTlpRenM3UlVGRlJTeFZRVUZCTzBWQlEwRXNiME5CUVVFN1ZVRkJRU3cwUWtGQlFUdERSRlpJTzBGRFQwTTdPMFZCVFVrc2MwSkJRVUU3UTBSVVREdEJRMkZETzBWQlEwVXNWVUZCUVR0RFJGaElPMEZEWVVjN1JVRkRSU3hYUVVGQk8wTkVXRXc3UVVObFF6dEZRVU5GTEdGQlFVRTdRMFJpU0R0QlEyVkhPMFZCUTBVc1kwRkJRVHREUkdKTU8wRkRhVUpET3p0RlFVVkZMRzlEUVVGQk8xVkJRVUVzTkVKQlFVRTdSVUZEUVN4WlFVRkJPME5FWmtnN1FVTnJRa003UlVGRFJTeFRRVUZCTzBWQlEwRXNXVUZCUVR0RFJHaENTRHRCUTJ0Q1J6dEZRVU5GTEdGQlFVRTdRMFJvUWt3N1FVTnZRa003UlVGRFJTeFRRVUZCTzBWQlEwRXNWMEZCUVR0RFJHeENTRHRCUTI5Q1J6dEZRVU5GTEZsQlFVRTdRMFJzUWt3N1FVTXlRa3M3T3pzN1JVRkRSU3hqUVVGQk8wTkVkRUpRSWl3aVptbHNaU0k2SW5SdmIyeGlZWEl1WTNOeklpd2ljMjkxY21ObGMwTnZiblJsYm5RaU9sc2lMeW9nUFQwOVBUMDlQVDA5UFNCaWRYUjBiMjV6TG5Sb1pXMWxJQzBnNW95SjZaS3U1YSs4NklpcTVxQzM1YnlQSUQwOVBUMDlQVDA5UFQwZ0tpOWNiaThxSUQwOVBUMDlQVDA5UFQwZ1kyOXNiM0p6TG5Sb1pXMWxJQzBnNVorNjU2R0E2YUtjNklteTVZK1k2WWVQNlp1RzVaQ0lJRDA5UFQwOVBUMDlQVDBnS2k5Y2JpOHFLbHh1SUNvZ2MyaGhaRzkzTG14bGMzTWdMU0RwbUxUbHZiSG1vTGZsdkkvb3JyN252YTRnYldsNGFXNTRJT1dIdmVhVnNGeHVJQ29nUFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVnh1SUNvZ1EzSmxZWFJsWkNCQ2VUb2dXV0Z2YUdGcGVHbGhiMXh1SUNvZ1ZYQmtZWFJsT2lBeU1ESXlMak11TWpCY2JpQXFMMXh1THlvZ1BUMDlQVDA5SU9tWXRPVzlzZWFndCtXOGoraXV2dWU5cnVXSHZlYVZzQ0E5UFQwOVBUMGdLaTljYmk1dmRYUnNhVzVsTFhSdmIyeGlZWElnZTF4dUlDQndiM05wZEdsdmJqb2dabWw0WldRN1hHNGdJSG90YVc1a1pYZzZJRGs1T1RrNU8xeHVJQ0J0WVhKbmFXNDZJREE3WEc0Z0lIUnlZVzV6YVhScGIyNHRaSFZ5WVhScGIyNDZJREF1TTNNN1hHNGdJRzkyWlhKbWJHOTNPaUJvYVdSa1pXNDdYRzU5WEc0dWIzVjBiR2x1WlMxMGIyOXNZbUZ5WDE5aWRYUjBiMjRnZTF4dUlDQmliM2d0YzJoaFpHOTNPaUF3SURBZ05uQjRJREZ3ZUNBalpHTmtabVUyTzF4dUlDQndiM05wZEdsdmJqb2djbVZzWVhScGRtVTdYRzRnSUhvdGFXNWtaWGc2SURFN1hHNGdJRzFoY21kcGJqb2dNVEJ3ZUR0Y2JpQWdkMmxrZEdnNklETTJjSGc3WEc0Z0lHaGxhV2RvZERvZ016WndlRHRjYmlBZ1ltOXlaR1Z5T2lBeGNIZ2djMjlzYVdRZ0kyUmpaR1psTmp0Y2JpQWdZbTl5WkdWeUxYSmhaR2wxY3pvZ00zQjRPMXh1SUNCaWIzZ3RjMmw2YVc1bk9pQmliM0prWlhJdFltOTRPMXh1SUNCaVlXTnJaM0p2ZFc1a0xXTnZiRzl5T2lBalptWm1PMXh1SUNCamRYSnpiM0k2SUhCdmFXNTBaWEk3WEc0Z0lIUmxlSFF0WVd4cFoyNDZJR05sYm5SbGNqdGNiaUFnWTI5c2IzSTZJQ001T1RrN1hHNGdJSFJ5WVc1emFYUnBiMjQ2SUdGc2JDQXdMak56SURBdU1YTWdaV0Z6WlMxcGJpMXZkWFE3WEc0Z0lHOTJaWEptYkc5M09pQm9hV1JrWlc0N1hHNTlYRzR1YjNWMGJHbHVaUzEwYjI5c1ltRnlYMTlpZFhSMGIyNDZhRzkyWlhJZ2UxeHVJQ0JqYjJ4dmNqb2dJekExT0RrME1qdGNiaUFnWW05eVpHVnlMV052Ykc5eU9pQWpNRFU0T1RReU8xeHVJQ0IwY21GdWMyWnZjbTA2SUhOallXeGxLREV1TXpVcE8xeHVmVnh1TG05MWRHeHBibVV0ZEc5dmJHSmhjbDlmWW5WMGRHOXVMbWhwWkdVZ2UxeHVJQ0JrYVhOd2JHRjVPaUJ1YjI1bE8xeHVmVnh1TG05MWRHeHBibVV0ZEc5dmJHSmhjbDlmWVc1amFHOXlPbXhwYm1zc1hHNHViM1YwYkdsdVpTMTBiMjlzWW1GeVgxOWhibU5vYjNJNmRtbHphWFJsWkN4Y2JpNXZkWFJzYVc1bExYUnZiMnhpWVhKZlgyRnVZMmh2Y2pwb2IzWmxjaUI3WEc0Z0lHTnZiRzl5T2lBak9UazVPMXh1SUNCMFpYaDBMV1JsWTI5eVlYUnBiMjQ2SUc1dmJtVTdYRzU5WEc0dWIzVjBiR2x1WlMxMGIyOXNZbUZ5WDE5aGJtTm9iM0k2YUc5MlpYSWdlMXh1SUNCamIyeHZjam9nSXpBMU9EazBNanRjYm4xY2JpNXZkWFJzYVc1bExYUnZiMnhpWVhKZlgybGpiMjRnZTF4dUlDQndiM05wZEdsdmJqb2dZV0p6YjJ4MWRHVTdYRzRnSUhvdGFXNWtaWGc2SURJN1hHNGdJSFJ2Y0RvZ05UQWxPMXh1SUNCc1pXWjBPaUExTUNVN1hHNGdJSGRwWkhSb09pQXlNSEI0TzF4dUlDQm9aV2xuYUhRNklESXdjSGc3WEc0Z0lIUnlZVzV6Wm05eWJUb2dkSEpoYm5Oc1lYUmxLQzAxTUNVc0lDMDFNQ1VwTzF4dUlDQm1hV3hzT2lCamRYSnlaVzUwWTI5c2IzSTdYRzRnSUc5MlpYSm1iRzkzT2lCb2FXUmtaVzQ3WEc1OVhHNHViM1YwYkdsdVpTMTBiMjlzWW1GeVgyRmpkR2wyWlM1dmRYUnNhVzVsTFhSdmIyeGlZWEpmWDJKMWRIUnZiaUI3WEc0Z0lHTnZiRzl5T2lBalptWm1PMXh1SUNCaVlXTnJaM0p2ZFc1a0xXTnZiRzl5T2lBak1EVTRPVFF5TzF4dUlDQmliM0prWlhJdFkyOXNiM0k2SUNNd05UZzVOREk3WEc1OVhHNHViM1YwYkdsdVpTMTBiMjlzWW1GeVgyRmpkR2wyWlM1dmRYUnNhVzVsTFhSdmIyeGlZWEpmWDJKMWRIUnZianBvYjNabGNpQjdYRzRnSUdOdmJHOXlPaUFqWm1abU8xeHVmVnh1TG05MWRHeHBibVV0ZEc5dmJHSmhjbDloWTNScGRtVWdMbTkxZEd4cGJtVXRkRzl2YkdKaGNsOWZZVzVqYUc5eU9teHBibXNzWEc0dWIzVjBiR2x1WlMxMGIyOXNZbUZ5WDJGamRHbDJaU0F1YjNWMGJHbHVaUzEwYjI5c1ltRnlYMTloYm1Ob2IzSTZkbWx6YVhSbFpDeGNiaTV2ZFhSc2FXNWxMWFJ2YjJ4aVlYSmZZV04wYVhabElDNXZkWFJzYVc1bExYUnZiMnhpWVhKZlgyRnVZMmh2Y2pwb2IzWmxjaUI3WEc0Z0lHTnZiRzl5T2lBalptWm1PMXh1ZlZ4dUxtOTFkR3hwYm1VdGRHOXZiR0poY2w5eWIzVnVaR1ZrTG05MWRHeHBibVV0ZEc5dmJHSmhjbDlmWW5WMGRHOXVJSHRjYmlBZ1ltOXlaR1Z5TFhKaFpHbDFjem9nTVRod2VEdGNibjFjYmk1dmRYUnNhVzVsTFhSdmIyeGlZWEpmWkdsellXSnNaV1F1YjNWMGJHbHVaUzEwYjI5c1ltRnlYMTloYm1Ob2IzSTZiR2x1YXl4Y2JpNXZkWFJzYVc1bExYUnZiMnhpWVhKZlpHbHpZV0pzWldRZ0xtOTFkR3hwYm1VdGRHOXZiR0poY2w5ZllXNWphRzl5T214cGJtc3NYRzR1YjNWMGJHbHVaUzEwYjI5c1ltRnlYMlJwYzJGaWJHVmtMbTkxZEd4cGJtVXRkRzl2YkdKaGNsOWZZVzVqYUc5eU9uWnBjMmwwWldRc1hHNHViM1YwYkdsdVpTMTBiMjlzWW1GeVgyUnBjMkZpYkdWa0lDNXZkWFJzYVc1bExYUnZiMnhpWVhKZlgyRnVZMmh2Y2pwMmFYTnBkR1ZrTEZ4dUxtOTFkR3hwYm1VdGRHOXZiR0poY2w5a2FYTmhZbXhsWkM1dmRYUnNhVzVsTFhSdmIyeGlZWEpmWDJGdVkyaHZjanBvYjNabGNpeGNiaTV2ZFhSc2FXNWxMWFJ2YjJ4aVlYSmZaR2x6WVdKc1pXUWdMbTkxZEd4cGJtVXRkRzl2YkdKaGNsOWZZVzVqYUc5eU9taHZkbVZ5TEZ4dUxtOTFkR3hwYm1VdGRHOXZiR0poY2w5a2FYTmhZbXhsWkM1dmRYUnNhVzVsTFhSdmIyeGlZWEpmWDJKMWRIUnZiaXhjYmk1dmRYUnNhVzVsTFhSdmIyeGlZWEpmWkdsellXSnNaV1FnTG05MWRHeHBibVV0ZEc5dmJHSmhjbDlmWW5WMGRHOXVJSHRjYmlBZ1kzVnljMjl5T2lCdWIzUXRZV3hzYjNkbFpEdGNiaUFnWTI5c2IzSTZJQ001T1RrN1hHNGdJR0p2Y21SbGNpMWpiMnh2Y2pvZ0l6azVPVHRjYm4xY2JpNXZkWFJzYVc1bExYUnZiMnhpWVhKZlpHbHpZV0pzWldRdWIzVjBiR2x1WlMxMGIyOXNZbUZ5WDE5aGJtTm9iM0k2YkdsdWF6cG9iM1psY2l4Y2JpNXZkWFJzYVc1bExYUnZiMnhpWVhKZlpHbHpZV0pzWldRZ0xtOTFkR3hwYm1VdGRHOXZiR0poY2w5ZllXNWphRzl5T214cGJtczZhRzkyWlhJc1hHNHViM1YwYkdsdVpTMTBiMjlzWW1GeVgyUnBjMkZpYkdWa0xtOTFkR3hwYm1VdGRHOXZiR0poY2w5ZllXNWphRzl5T25acGMybDBaV1E2YUc5MlpYSXNYRzR1YjNWMGJHbHVaUzEwYjI5c1ltRnlYMlJwYzJGaWJHVmtJQzV2ZFhSc2FXNWxMWFJ2YjJ4aVlYSmZYMkZ1WTJodmNqcDJhWE5wZEdWa09taHZkbVZ5TEZ4dUxtOTFkR3hwYm1VdGRHOXZiR0poY2w5a2FYTmhZbXhsWkM1dmRYUnNhVzVsTFhSdmIyeGlZWEpmWDJGdVkyaHZjanBvYjNabGNqcG9iM1psY2l4Y2JpNXZkWFJzYVc1bExYUnZiMnhpWVhKZlpHbHpZV0pzWldRZ0xtOTFkR3hwYm1VdGRHOXZiR0poY2w5ZllXNWphRzl5T21odmRtVnlPbWh2ZG1WeUxGeHVMbTkxZEd4cGJtVXRkRzl2YkdKaGNsOWthWE5oWW14bFpDNXZkWFJzYVc1bExYUnZiMnhpWVhKZlgySjFkSFJ2Ympwb2IzWmxjaXhjYmk1dmRYUnNhVzVsTFhSdmIyeGlZWEpmWkdsellXSnNaV1FnTG05MWRHeHBibVV0ZEc5dmJHSmhjbDlmWW5WMGRHOXVPbWh2ZG1WeUlIdGNiaUFnWTI5c2IzSTZJQ001T1RrN1hHNGdJR0p2Y21SbGNpMWpiMnh2Y2pvZ0l6azVPVHRjYm4xY2JpNXZkWFJzYVc1bExYUnZiMnhpWVhKZlpHbHpZV0pzWldRdWIzVjBiR2x1WlMxMGIyOXNZbUZ5WDE5aWRYUjBiMjRzWEc0dWIzVjBiR2x1WlMxMGIyOXNZbUZ5WDJScGMyRmliR1ZrSUM1dmRYUnNhVzVsTFhSdmIyeGlZWEpmWDJKMWRIUnZiaUI3WEc0Z0lHSmhZMnRuY205MWJtUXRZMjlzYjNJNklDTm1OV1kxWmpVN1hHNTlYRzR1YjNWMGJHbHVaUzEwYjI5c1ltRnlYM1IwWWl4Y2JpNXZkWFJzYVc1bExYUnZiMnhpWVhKZlluUjBJSHRjYmlBZ2JHVm1kRG9nTlRBbE8xeHVJQ0IwY21GdWMyWnZjbTA2SUhSeVlXNXpiR0YwWlZnb0xUVXdKU2s3WEc1OVhHNHViM1YwYkdsdVpTMTBiMjlzWW1GeVgzUjBZaUF1YjNWMGJHbHVaUzEwYjI5c1ltRnlYMTlpZFhSMGIyNHNYRzR1YjNWMGJHbHVaUzEwYjI5c1ltRnlYMkowZENBdWIzVjBiR2x1WlMxMGIyOXNZbUZ5WDE5aWRYUjBiMjRnZTF4dUlDQmthWE53YkdGNU9pQnBibXhwYm1VdFlteHZZMnM3WEc1OVhHNHViM1YwYkdsdVpTMTBiMjlzWW1GeVgzUjBZaUI3WEc0Z0lIUnZjRG9nTVRKd2VEdGNibjFjYmk1dmRYUnNhVzVsTFhSdmIyeGlZWEpmZEhSaUxtOTFkR3hwYm1VdGRHOXZiR0poY2w5b2FXUmtaVzRnZTF4dUlDQjBiM0E2SUMwMU5uQjRPMXh1ZlZ4dUxtOTFkR3hwYm1VdGRHOXZiR0poY2w5aWRIUWdlMXh1SUNCaWIzUjBiMjA2SURFeWNIZzdYRzU5WEc0dWIzVjBiR2x1WlMxMGIyOXNZbUZ5WDJKMGRDNXZkWFJzYVc1bExYUnZiMnhpWVhKZmFHbGtaR1Z1SUh0Y2JpQWdZbTkwZEc5dE9pQXROVFp3ZUR0Y2JuMWNiaTV2ZFhSc2FXNWxMWFJ2YjJ4aVlYSmZjblJzTEZ4dUxtOTFkR3hwYm1VdGRHOXZiR0poY2w5c2RISWdlMXh1SUNCMGNtRnVjMlp2Y20wNklIUnlZVzV6YkdGMFpWa29MVFV3SlNrN1hHNGdJSGRwWkhSb09pQTFObkI0TzF4dWZWeHVMbTkxZEd4cGJtVXRkRzl2YkdKaGNsOXlkR3dnZTF4dUlDQjBiM0E2SURVd0pUdGNiaUFnY21sbmFIUTZJREV5Y0hnN1hHNTlYRzR1YjNWMGJHbHVaUzEwYjI5c1ltRnlYM0owYkM1dmRYUnNhVzVsTFhSdmIyeGlZWEpmYUdsa1pHVnVJSHRjYmlBZ2NtbG5hSFE2SUMwNE5uQjRPMXh1ZlZ4dUxtOTFkR3hwYm1VdGRHOXZiR0poY2w5c2RISWdlMXh1SUNCMGIzQTZJRFV3SlR0Y2JpQWdiR1ZtZERvZ01USndlRHRjYm4xY2JpNXZkWFJzYVc1bExYUnZiMnhpWVhKZmJIUnlMbTkxZEd4cGJtVXRkRzl2YkdKaGNsOW9hV1JrWlc0Z2UxeHVJQ0JzWldaME9pQXRPRFp3ZUR0Y2JuMWNiaTV2ZFhSc2FXNWxMWFJ2YjJ4aVlYSmZkSFJpSUM1dmRYUnNhVzVsTFhSdmIyeGlZWEpmWDJKMWRIUnZiaTV2ZFhSc2FXNWxMWFJ2YjJ4aVlYSmZhR2xrWkdWdUxGeHVMbTkxZEd4cGJtVXRkRzl2YkdKaGNsOXlkR3dnTG05MWRHeHBibVV0ZEc5dmJHSmhjbDlmWW5WMGRHOXVMbTkxZEd4cGJtVXRkRzl2YkdKaGNsOW9hV1JrWlc0c1hHNHViM1YwYkdsdVpTMTBiMjlzWW1GeVgySjBkQ0F1YjNWMGJHbHVaUzEwYjI5c1ltRnlYMTlpZFhSMGIyNHViM1YwYkdsdVpTMTBiMjlzWW1GeVgyaHBaR1JsYml4Y2JpNXZkWFJzYVc1bExYUnZiMnhpWVhKZmJIUnlJQzV2ZFhSc2FXNWxMWFJ2YjJ4aVlYSmZYMkoxZEhSdmJpNXZkWFJzYVc1bExYUnZiMnhpWVhKZmFHbGtaR1Z1SUh0Y2JpQWdaR2x6Y0d4aGVUb2dibTl1WlR0Y2JuMWNiaUlzSWk4cUlEMDlQVDA5UFQwOVBUMGdZblYwZEc5dWN5NTBhR1Z0WlNBdElPYU1pZW1TcnVXdnZPaUlxdWFndCtXOGp5QTlQVDA5UFQwOVBUMDlJQ292WEhKY2JrQnBiWEJ2Y25RZ0p5NHZZMjlzYjNKekp6dGNjbHh1UUdsdGNHOXlkQ0FuTGk5emFHRmtiM2NuTzF4eVhHNWNjbHh1TG05MWRHeHBibVV0ZEc5dmJHSmhjaUI3WEhKY2JpQWdjRzl6YVhScGIyNDZJR1pwZUdWa08xeHlYRzRnSUhvdGFXNWtaWGc2SURrNU9UazVPMXh5WEc0Z0lHMWhjbWRwYmpvZ01EdGNjbHh1SUNCMGNtRnVjMmwwYVc5dUxXUjFjbUYwYVc5dU9pQXdMak56TzF4eVhHNGdJRzkyWlhKbWJHOTNPaUJvYVdSa1pXNDdYSEpjYmx4eVhHNGdJQ1pmWDJKMWRIUnZiaUI3WEhKY2JpQWdJQ0F1YzJoaFpHOTNYMnhwWjJoMFgzSmxaM1ZzWVhJb0tUdGNjbHh1SUNBZ0lIQnZjMmwwYVc5dU9pQnlaV3hoZEdsMlpUdGNjbHh1SUNBZ0lIb3RhVzVrWlhnNklERTdYSEpjYmlBZ0lDQnRZWEpuYVc0NklERXdjSGc3WEhKY2JpQWdJQ0IzYVdSMGFEb2dNelp3ZUR0Y2NseHVJQ0FnSUdobGFXZG9kRG9nTXpad2VEdGNjbHh1SUNBZ0lHSnZjbVJsY2pvZ01YQjRJSE52Ykdsa0lFQndjbWx0WVhKNVgySnZjbVJsY2w5amIyeHZjanRjY2x4dUlDQWdJR0p2Y21SbGNpMXlZV1JwZFhNNklETndlRHRjY2x4dUlDQWdJR0p2ZUMxemFYcHBibWM2SUdKdmNtUmxjaTFpYjNnN1hISmNiaUFnSUNCaVlXTnJaM0p2ZFc1a0xXTnZiRzl5T2lCQWQyaHBkR1U3WEhKY2JpQWdJQ0JqZFhKemIzSTZJSEJ2YVc1MFpYSTdYSEpjYmlBZ0lDQjBaWGgwTFdGc2FXZHVPaUJqWlc1MFpYSTdYSEpjYmlBZ0lDQmpiMnh2Y2pvZ1FHWnZkWEowYUY5MFpYaDBYMk52Ykc5eU8xeHlYRzRnSUNBZ2RISmhibk5wZEdsdmJqb2dZV3hzSURBdU0zTWdNQzR4Y3lCbFlYTmxMV2x1TFc5MWREdGNjbHh1SUNBZ0lHOTJaWEptYkc5M09pQm9hV1JrWlc0N1hISmNibHh5WEc0Z0lDQWdKanBvYjNabGNpQjdYSEpjYmlBZ0lDQWdJR052Ykc5eU9pQkFjM1ZqWTJWemMxOWpiMnh2Y2p0Y2NseHVJQ0FnSUNBZ1ltOXlaR1Z5TFdOdmJHOXlPaUJBYzNWalkyVnpjMTlqYjJ4dmNqdGNjbHh1SUNBZ0lDQWdkSEpoYm5ObWIzSnRPaUJ6WTJGc1pTZ3hMak0xS1R0Y2NseHVJQ0FnSUgxY2NseHVYSEpjYmlBZ0lDQW1MbWhwWkdVZ2UxeHlYRzRnSUNBZ0lDQmthWE53YkdGNU9pQnViMjVsTzF4eVhHNGdJQ0FnZlZ4eVhHNGdJSDFjY2x4dVhISmNiaUFnSmw5ZllXNWphRzl5SUh0Y2NseHVJQ0FnSUNZNmJHbHVheXhjY2x4dUlDQWdJQ1k2ZG1semFYUmxaQ3hjY2x4dUlDQWdJQ1k2YUc5MlpYSWdlMXh5WEc0Z0lDQWdJQ0JqYjJ4dmNqb2dRR1p2ZFhKMGFGOTBaWGgwWDJOdmJHOXlPMXh5WEc0Z0lDQWdJQ0IwWlhoMExXUmxZMjl5WVhScGIyNDZJRzV2Ym1VN1hISmNiaUFnSUNCOVhISmNibHh5WEc0Z0lDQWdKanBvYjNabGNpQjdYSEpjYmlBZ0lDQWdJR052Ykc5eU9pQkFjM1ZqWTJWemMxOWpiMnh2Y2p0Y2NseHVJQ0FnSUgxY2NseHVJQ0I5WEhKY2JseHlYRzRnSUNaZlgybGpiMjRnZTF4eVhHNGdJQ0FnY0c5emFYUnBiMjQ2SUdGaWMyOXNkWFJsTzF4eVhHNGdJQ0FnZWkxcGJtUmxlRG9nTWp0Y2NseHVJQ0FnSUhSdmNEb2dOVEFsTzF4eVhHNGdJQ0FnYkdWbWREb2dOVEFsTzF4eVhHNGdJQ0FnZDJsa2RHZzZJREl3Y0hnN1hISmNiaUFnSUNCb1pXbG5hSFE2SURJd2NIZzdYSEpjYmlBZ0lDQjBjbUZ1YzJadmNtMDZJSFJ5WVc1emJHRjBaU2d0TlRBbExDQXROVEFsS1R0Y2NseHVJQ0FnSUdacGJHdzZJR04xY25KbGJuUmpiMnh2Y2p0Y2NseHVJQ0FnSUc5MlpYSm1iRzkzT2lCb2FXUmtaVzQ3WEhKY2JpQWdmVnh5WEc1Y2NseHVJQ0FtWDJGamRHbDJaU0I3WEhKY2JpQWdJQ0FtTG05MWRHeHBibVV0ZEc5dmJHSmhjaUI3WEhKY2JpQWdJQ0FnSUNaZlgySjFkSFJ2YmlCN1hISmNiaUFnSUNBZ0lDQWdZMjlzYjNJNklFQjNhR2wwWlR0Y2NseHVJQ0FnSUNBZ0lDQmlZV05yWjNKdmRXNWtMV052Ykc5eU9pQkFjM1ZqWTJWemMxOWpiMnh2Y2p0Y2NseHVJQ0FnSUNBZ0lDQmliM0prWlhJdFkyOXNiM0k2SUVCemRXTmpaWE56WDJOdmJHOXlPMXh5WEc1Y2NseHVJQ0FnSUNBZ0lDQW1PbWh2ZG1WeUlIdGNjbHh1SUNBZ0lDQWdJQ0FnSUdOdmJHOXlPaUJBZDJocGRHVTdYSEpjYmlBZ0lDQWdJQ0FnZlZ4eVhHNGdJQ0FnSUNCOVhISmNiaUFnSUNCOVhISmNibHh5WEc0Z0lDQWdMbTkxZEd4cGJtVXRkRzl2YkdKaGNsOWZZVzVqYUc5eUlIdGNjbHh1SUNBZ0lDQWdKanBzYVc1ckxGeHlYRzRnSUNBZ0lDQW1PblpwYzJsMFpXUXNYSEpjYmlBZ0lDQWdJQ1k2YUc5MlpYSWdlMXh5WEc0Z0lDQWdJQ0FnSUdOdmJHOXlPaUJBZDJocGRHVTdYSEpjYmlBZ0lDQWdJSDFjY2x4dUlDQWdJSDFjY2x4dUlDQjlYSEpjYmx4eVhHNGdJQ1pmY205MWJtUmxaQ0I3WEhKY2JpQWdJQ0FtTG05MWRHeHBibVV0ZEc5dmJHSmhjbDlmWW5WMGRHOXVJSHRjY2x4dUlDQWdJQ0FnWW05eVpHVnlMWEpoWkdsMWN6b2dNVGh3ZUR0Y2NseHVJQ0FnSUgxY2NseHVJQ0I5WEhKY2JseHlYRzRnSUNaZlpHbHpZV0pzWldRZ2UxeHlYRzRnSUNBZ0ppNXZkWFJzYVc1bExYUnZiMnhpWVhJc1hISmNiaUFnSUNBdWIzVjBiR2x1WlMxMGIyOXNZbUZ5SUh0Y2NseHVJQ0FnSUNBZ0psOWZZVzVqYUc5eU9teHBibXNzWEhKY2JpQWdJQ0FnSUNaZlgyRnVZMmh2Y2pwMmFYTnBkR1ZrTEZ4eVhHNGdJQ0FnSUNBbVgxOWhibU5vYjNJNmFHOTJaWElzWEhKY2JpQWdJQ0FnSUNaZlgySjFkSFJ2YmlCN1hISmNiaUFnSUNBZ0lDQWdZM1Z5YzI5eU9pQnViM1F0WVd4c2IzZGxaRHRjY2x4dUlDQWdJQ0FnSUNCamIyeHZjam9nUUdadmRYSjBhRjkwWlhoMFgyTnZiRzl5TzF4eVhHNGdJQ0FnSUNBZ0lHSnZjbVJsY2kxamIyeHZjam9nUUdadmRYSjBhRjkwWlhoMFgyTnZiRzl5TzF4eVhHNWNjbHh1SUNBZ0lDQWdJQ0FtT21odmRtVnlJSHRjY2x4dUlDQWdJQ0FnSUNBZ0lHTnZiRzl5T2lCQVptOTFjblJvWDNSbGVIUmZZMjlzYjNJN1hISmNiaUFnSUNBZ0lDQWdJQ0JpYjNKa1pYSXRZMjlzYjNJNklFQm1iM1Z5ZEdoZmRHVjRkRjlqYjJ4dmNqdGNjbHh1SUNBZ0lDQWdJQ0I5WEhKY2JpQWdJQ0FnSUgxY2NseHVYSEpjYmlBZ0lDQWdJQ1pmWDJKMWRIUnZiaUI3WEhKY2JpQWdJQ0FnSUNBZ1ltRmphMmR5YjNWdVpDMWpiMnh2Y2pvZ1FHUnBjMkZpYkdWa1gySm5YMk52Ykc5eU8xeHlYRzRnSUNBZ0lDQjlYSEpjYmlBZ0lDQjlYSEpjYmlBZ2ZWeHlYRzVjY2x4dUlDQW1YM1IwWWl4Y2NseHVJQ0FtWDJKMGRDQjdYSEpjYmlBZ0lDQnNaV1owT2lBMU1DVTdYSEpjYmlBZ0lDQjBjbUZ1YzJadmNtMDZJSFJ5WVc1emJHRjBaVmdvTFRVd0pTazdYSEpjYmx4eVhHNGdJQ0FnTG05MWRHeHBibVV0ZEc5dmJHSmhjbDlmWW5WMGRHOXVJSHRjY2x4dUlDQWdJQ0FnWkdsemNHeGhlVG9nYVc1c2FXNWxMV0pzYjJOck8xeHlYRzRnSUNBZ2ZWeHlYRzRnSUgxY2NseHVYSEpjYmlBZ0psOTBkR0lnZTF4eVhHNGdJQ0FnZEc5d09pQXhNbkI0TzF4eVhHNWNjbHh1SUNBZ0lDWXViM1YwYkdsdVpTMTBiMjlzWW1GeVgyaHBaR1JsYmlCN1hISmNiaUFnSUNBZ0lIUnZjRG9nTFRVMmNIZzdYSEpjYmlBZ0lDQjlYSEpjYmlBZ2ZWeHlYRzVjY2x4dUlDQW1YMkowZENCN1hISmNiaUFnSUNCaWIzUjBiMjA2SURFeWNIZzdYSEpjYmx4eVhHNGdJQ0FnSmk1dmRYUnNhVzVsTFhSdmIyeGlZWEpmYUdsa1pHVnVJSHRjY2x4dUlDQWdJQ0FnWW05MGRHOXRPaUF0TlRad2VEdGNjbHh1SUNBZ0lIMWNjbHh1SUNCOVhISmNibHh5WEc0Z0lDWmZjblJzTEZ4eVhHNGdJQ1pmYkhSeUlIdGNjbHh1SUNBZ0lIUnlZVzV6Wm05eWJUb2dkSEpoYm5Oc1lYUmxXU2d0TlRBbEtUdGNjbHh1SUNBZ0lIZHBaSFJvT2lBMU5uQjRPMXh5WEc0Z0lIMWNjbHh1WEhKY2JpQWdKbDl5ZEd3Z2UxeHlYRzRnSUNBZ2RHOXdPaUExTUNVN1hISmNiaUFnSUNCeWFXZG9kRG9nTVRKd2VEdGNjbHh1WEhKY2JpQWdJQ0FtTG05MWRHeHBibVV0ZEc5dmJHSmhjbDlvYVdSa1pXNGdlMXh5WEc0Z0lDQWdJQ0J5YVdkb2REb2dMVGcyY0hnN1hISmNiaUFnSUNCOVhISmNiaUFnZlZ4eVhHNWNjbHh1SUNBbVgyeDBjaUI3WEhKY2JpQWdJQ0IwYjNBNklEVXdKVHRjY2x4dUlDQWdJR3hsWm5RNklERXljSGc3WEhKY2JseHlYRzRnSUNBZ0ppNXZkWFJzYVc1bExYUnZiMnhpWVhKZmFHbGtaR1Z1SUh0Y2NseHVJQ0FnSUNBZ2JHVm1kRG9nTFRnMmNIZzdYSEpjYmlBZ0lDQjlYSEpjYmlBZ2ZWeHlYRzVjY2x4dUlDQW1YM1IwWWl4Y2NseHVJQ0FtWDNKMGJDeGNjbHh1SUNBbVgySjBkQ3hjY2x4dUlDQW1YMngwY2lCN1hISmNiaUFnSUNBdWIzVjBiR2x1WlMxMGIyOXNZbUZ5WDE5aWRYUjBiMjRnZTF4eVhHNGdJQ0FnSUNBbUxtOTFkR3hwYm1VdGRHOXZiR0poY2w5b2FXUmtaVzRnZTF4eVhHNGdJQ0FnSUNBZ0lHUnBjM0JzWVhrNklHNXZibVU3WEhKY2JpQWdJQ0FnSUgxY2NseHVJQ0FnSUgxY2NseHVJQ0I5WEhKY2JuMWNjbHh1SWl3aUx5b3FYSEpjYmlBcUlITm9ZV1J2ZHk1c1pYTnpJQzBnNlppMDViMng1cUMzNWJ5UDZLNis1NzJ1SUcxcGVHbHVlQ0RsaDczbWxiQmNjbHh1SUNvZ1BUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFQwOVBUMDlQVDA5UFZ4eVhHNGdLaUJEY21WaGRHVmtJRUo1T2lCWllXOW9ZV2w0YVdGdlhISmNiaUFxSUZWd1pHRjBaVG9nTWpBeU1pNHpMakl3WEhKY2JpQXFMMXh5WEc1QWFXMXdiM0owSUNjdUwyTnZiRzl5Y3ljN1hISmNibHh5WEc0dktpQTlQVDA5UFQwZzZaaTA1YjJ4NXFDMzVieVA2SzYrNTcydTVZZTk1cFd3SUQwOVBUMDlQU0FxTDF4eVhHNHVjMmhoWkc5M0tFQnZabVp6WlhRNklEQWdNQ0EyY0hnZ01YQjRMQ0JBWTI5c2IzSTZJRUJ3Y21sdFlYSjVYMkp2Y21SbGNsOWpiMnh2Y2lrZ2UxeHlYRzRnSUdKdmVDMXphR0ZrYjNjNklFQnZabVp6WlhRZ1FHTnZiRzl5TzF4eVhHNTlYSEpjYmx4eVhHNHVjMmhoWkc5M1gzSmxaM1ZzWVhJb1FHTnZiRzl5T2lCQWNISnBiV0Z5ZVY5aWIzSmtaWEpmWTI5c2IzSXBJSHRjY2x4dUlDQXVjMmhoWkc5M0tEQWdNQ0EyY0hnZ01YQjRMQ0JBWTI5c2IzSXBPMXh5WEc1OVhISmNibHh5WEc0dWMyaGhaRzkzWDJ4aGNtZGxLRUJqYjJ4dmNqb2dRSEJ5YVcxaGNubGZZbTl5WkdWeVgyTnZiRzl5S1NCN1hISmNiaUFnTG5Ob1lXUnZkeWd3SURBZ01USndlQ0F4Y0hnc0lFQmpiMnh2Y2lrN1hISmNibjFjY2x4dVhISmNiaTV6YUdGa2IzZGZiR2xuYUhSZmNtVm5kV3hoY2lncElIdGNjbHh1SUNBdWMyaGhaRzkzWDNKbFozVnNZWElvS1R0Y2NseHVmVnh5WEc1Y2NseHVMbk5vWVdSdmQxOXNhV2RvZEY5c1lYSm5aU2dwSUh0Y2NseHVJQ0F1YzJoaFpHOTNYMnhoY21kbEtDazdYSEpjYm4xY2NseHVYSEpjYmk1emFHRmtiM2RmWkdGeWExOXlaV2QxYkdGeUtDa2dlMXh5WEc0Z0lDNXphR0ZrYjNkZmNtVm5kV3hoY2loQWMyVmpiMjVrWVhKNVgySnZjbVJsY2w5amIyeHZjaWs3WEhKY2JuMWNjbHh1WEhKY2JpNXphR0ZrYjNkZlpHRnlhMTlzWVhKblpTZ3BJSHRjY2x4dUlDQXVjMmhoWkc5M1gyeGhjbWRsS0VCelpXTnZibVJoY25sZlltOXlaR1Z5WDJOdmJHOXlLVHRjY2x4dWZWeHlYRzRpWFgwPSAqL1xuIl0sImZpbGUiOiJ0b29sYmFyLm1pbi5jc3MifQ== */ diff --git a/toolbar.min.js.map b/toolbar.min.js.map deleted file mode 100644 index 7dcddf23..00000000 --- a/toolbar.min.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"toolbar.min.js","sources":["utils/types/isString.js","utils/lang/toString.js","utils/types/isFunction.js","utils/types/isObject.js","utils/types/isArray.js","utils/lang/later.js","utils/lang/guid.js","utils/lang/cloneDeep.js","utils/types/isElement.js","utils/types/isDOM.js","utils/types/isHTMLCollection.js","utils/types/isFragment.js","utils/types/isTextNode.js","utils/lang/hasOwn.js","utils/dom/hasClass.js","utils/dom/addClass.js","utils/dom/setAttributes.js","utils/dom/setAttribute.js","utils/dom/createElement.js","utils/dom/removeClass.js","utils/lang/trim.js","utils/dom/matches.js","utils/dom/getParentOrHost.js","utils/event/enum.js","utils/event/_off.js","utils/event/_delete.js","utils/event/purgeElement.js","utils/event/getListeners.js","utils/event/off.js","utils/event/on.js","utils/event/getTarget.js","utils/dom/resolveTextNode.js","utils/dom/closest.js","utils/icons/defaults.js","utils/icons/symbols.js","utils/icons/getSymbols.js","utils/icons/getSymbol.js","utils/icons/paint.js","utils/icons/add.js","utils/observer/_subscribers.js","utils/observer/_hasDirectSubscribersFor.js","utils/observer/has.js","utils/observer/_hasSubscribers.js","utils/observer/emit.js","utils/types/isTypedArray.js","utils/observer/_removeSubscriber.js","utils/observer/off.js","utils/observer/_removeSubscriberByToken.js","base.js","utils/lang/extend.js","utils/observer/on.js","command.js","commands.js","utils/types/isSVG.js","utils/icons/createElement.js","_createButton.js","utils/icons/icon.js","toolbar.js"],"sourcesContent":["/**\r\n * 检测数据是否为 String 类型\r\n * ========================================================================\r\n * @method isArray\r\n * @param {*} str\r\n * @returns {boolean}\r\n */\r\nconst isString = (str) => {\r\n return typeof str === 'string'\r\n}\r\n\r\nexport default isString\r\n","/**\r\n * Object 对象原型上的 toString 方法\r\n * ========================================================================\r\n * @method toString\r\n * @param {*} val\r\n * @returns {string}\r\n */\r\nconst toString = (val) => {\r\n return Object.prototype.toString.apply(val)\r\n}\r\n\r\nexport default toString\r\n","import toString from '../lang/toString'\r\n\r\n/**\r\n * 检测测试数据是否为 Function 类型\r\n * ========================================================================\r\n * @method isFunction\r\n * @param {*} val - (必须)待检测的数据\r\n * @returns {boolean} 'val' 是 Function 类型返回 true,否则返回 false\r\n */\r\nconst isFunction = (val) => {\r\n return typeof val === 'function' || toString(val) === '[object Function]'\r\n}\r\n\r\nexport default isFunction\r\n","import toString from '../lang/toString'\r\nimport isFunction from './isFunction'\r\n\r\n/**\r\n * 检测数据是否为 Object 类型\r\n * ========================================================================\r\n * @method isObject\r\n * @param {*} o\r\n * @returns {boolean}\r\n */\r\nconst isObject = (o) => {\r\n return (\r\n (toString(o) === '[object Object]' ||\r\n typeof o === 'object' ||\r\n isFunction(o)) &&\r\n o !== null\r\n )\r\n}\r\n\r\nexport default isObject\r\n","import toString from '../lang/toString'\r\n\r\n/**\r\n * 检测数据是否为 Array 类型\r\n * ========================================================================\r\n * @method isArray\r\n * @param {*} o\r\n * @returns {boolean}\r\n */\r\nconst isArray = (o) => {\r\n if (Array.isArray) {\r\n return Array.isArray(o)\r\n } else {\r\n return toString(o) === '[object Array]'\r\n }\r\n}\r\n\r\nexport default isArray\r\n","import isFunction from '../types/isFunction'\r\n\r\n/**\r\n * later - 延迟执行方法\r\n * ========================================================================\r\n * @method later\r\n * @param {Function} fn\r\n * @param {Number} [delay]\r\n * @returns {number|boolean}\r\n */\r\nconst later = (fn, delay = 300) => {\r\n if (!isFunction(fn)) {\r\n return false\r\n }\r\n\r\n return setTimeout(() => {\r\n fn()\r\n }, delay)\r\n}\r\n\r\nexport default later\r\n","/**\r\n * 生成唯一 id 字符串的函数\r\n * ========================================================================\r\n * @method guid\r\n * @param {String} [prefix] - 生成 id 的前缀字符串\r\n * @return {String} 返回一个表示唯一 id 的字符串\r\n */\r\nconst guid = (() => {\r\n let uuid = 0\r\n\r\n return (prefix) => {\r\n uuid += 1\r\n\r\n return prefix ? prefix + '-' + uuid : 'guid-' + uuid\r\n }\r\n})()\r\n\r\nexport default guid\r\n","import isObject from '../types/isObject'\r\nimport isArray from '../types/isArray'\r\n\r\n/**\r\n * 深拷贝对象函数\r\n * ========================================================================\r\n * @methods cloneDeep\r\n * @param {Object} obj - 深拷贝的对象\r\n * @returns {Array|Object|*}\r\n *\r\n * @example\r\n * const arr = cloneDeep([2,3,4,6])\r\n * => [2,3,4,6]\r\n */\r\nconst cloneDeep = (obj) => {\r\n let clone = {}\r\n\r\n if (obj === null) {\r\n return null\r\n }\r\n\r\n if (isArray(obj)) {\r\n clone = Array.from(obj)\r\n } else {\r\n clone = Object.assign({}, obj)\r\n Object.keys(clone).forEach((key) => {\r\n return (clone[key] = isObject(obj[key]) ? cloneDeep(obj[key]) : obj[key])\r\n })\r\n }\r\n\r\n return clone\r\n}\r\n\r\nexport default cloneDeep\r\n","import isObject from './isObject'\r\n\r\n/**\r\n * 检测数据是否为 HTMLElement DOM 节点\r\n * ========================================================================\r\n * @method isElement\r\n * @param {*} o\r\n * @returns {boolean}\r\n */\r\nconst isElement = (o) => {\r\n return !!(isObject(o) && o.nodeName && o.tagName && o.nodeType === 1)\r\n}\r\n\r\nexport default isElement\r\n","import isObject from './isObject'\r\nimport isElement from './isElement'\r\nimport isHTMLCollection from './isHTMLCollection'\r\nimport isFragment from './isFragment'\r\nimport isTextNode from './isTextNode'\r\n\r\nconst isDOM = (el) => {\r\n return !!(\r\n isObject(el) &&\r\n (isElement(el) || isHTMLCollection(el) || isFragment(el) || isTextNode(el))\r\n )\r\n}\r\n\r\nexport default isDOM\r\n","import toString from '../lang/toString'\r\nimport isObject from './isObject'\r\n\r\nconst isHTMLCollection = (el) => {\r\n return !!(isObject(el) && toString(el) === '[object NodeList]')\r\n}\r\n\r\nexport default isHTMLCollection\r\n","import toString from '../lang/toString'\r\nimport isObject from './isObject'\r\n\r\nconst isFragment = (fragment) => {\r\n return !!(\r\n isObject(fragment) && toString(fragment) === '[object DocumentFragment]'\r\n )\r\n}\r\n\r\nexport default isFragment\r\n","import toString from '../lang/toString'\r\nimport isObject from './isObject'\r\n\r\nconst isTextNode = (el) => {\r\n return !!(\r\n isObject(el) &&\r\n (toString(el) === '[object Text]' || (el.tagName && el.nodeType === 3))\r\n )\r\n}\r\n\r\nexport default isTextNode\r\n","/**\r\n * 检测对象自身属性中是否具有指定的属性。\r\n * ========================================================================\r\n * @method hasOwn\r\n * @param {Object} obj - (必须)检测的目标对象\r\n * @param {String} prop - (必须)属性名\r\n * @returns {Boolean}\r\n */\r\nconst hasOwn = (obj, prop) => {\r\n const hasOwnProperty = Object.prototype.hasOwnProperty\r\n return obj && hasOwnProperty.call(obj, prop)\r\n}\r\n\r\nexport default hasOwn\r\n","import isElement from '../types/isElement'\r\n/**\r\n * 检测 DOM 节点是否包含名为 className 的样式\r\n * ========================================================================\r\n * @method hasClass\r\n * @param {HTMLElement} el - DOM 节点\r\n * @param {String} className - 样式名称\r\n * @returns {Boolean}\r\n */\r\nconst hasClass = (el, className) => {\r\n const pattern = new RegExp('(\\\\s|^)' + className + '(\\\\s|$)')\r\n let allClass\r\n let classList\r\n\r\n if (!isElement(el)) {\r\n return false\r\n }\r\n\r\n allClass = el.className\r\n\r\n if (!allClass) {\r\n return false\r\n }\r\n\r\n classList = el.classList\r\n\r\n if (classList && classList.contains) {\r\n return el.classList.contains(className)\r\n }\r\n\r\n return !!pattern.exec(allClass)\r\n}\r\n\r\nexport default hasClass\r\n","import hasClass from './hasClass'\r\n\r\n/**\r\n * 给 DOM 节点添加名为 className 的样式\r\n * ========================================================================\r\n * @method addClass\r\n * @param {HTMLElement} el - DOM 节点\r\n * @param {String} className - 样式名称\r\n * @returns {Boolean}\r\n */\r\nconst addClass = (el, className) => {\r\n let classList\r\n let allClass\r\n\r\n if (hasClass(el, className)) {\r\n return false\r\n }\r\n\r\n classList = el.classList\r\n\r\n if (classList?.add) {\r\n if (className.indexOf(' ') > -1) {\r\n className.split(' ').forEach((name) => {\r\n classList.add(name)\r\n })\r\n } else {\r\n classList.add(className)\r\n }\r\n } else {\r\n allClass = el.className\r\n allClass += allClass.length > 0 ? ' ' + className : className\r\n el.className = allClass\r\n }\r\n}\r\n\r\nexport default addClass\r\n","import isObject from '../types/isObject'\r\nimport hasOwn from '../lang/hasOwn'\r\nimport setAttribute from './setAttribute'\r\n\r\nconst setAttributes = (el, attrs) => {\r\n if (!el || !isObject(attrs)) {\r\n return false\r\n }\r\n\r\n Object.keys(attrs).forEach((attr) => {\r\n const value = attrs[attr]\r\n if (hasOwn(attrs, attr)) {\r\n setAttribute(el, attr, value)\r\n }\r\n })\r\n}\r\n\r\nexport default setAttributes\r\n","import addClass from './addClass.js'\r\n\r\n/**\r\n * 给 DOM 节点设置属性/值\r\n * ========================================================================\r\n * @method setAttribute\r\n * @param {HTMLElement} el - DOM 节点\r\n * @param {String} attr - 属性名称\r\n * @param {String|Number|Boolean} value - 属性值\r\n */\r\nconst setAttribute = (el, attr, value) => {\r\n let tagName = el.tagName.toLowerCase()\r\n\r\n switch (attr) {\r\n case 'style':\r\n el.style.cssText = value\r\n break\r\n case 'value':\r\n if (tagName === 'input' || tagName === 'textarea') {\r\n el.value = value\r\n } else {\r\n el.setAttribute(attr, value)\r\n }\r\n break\r\n case 'htmlFor':\r\n el.setAttribute('for', value)\r\n break\r\n case 'className':\r\n addClass(el, value)\r\n break\r\n case 'innerHTML':\r\n el.innerHTML = value\r\n break\r\n case 'innerText':\r\n el.innerText = value\r\n break\r\n default:\r\n el.setAttribute(attr, value)\r\n break\r\n }\r\n}\r\n\r\nexport default setAttribute\r\n","import isObject from '../types/isObject'\r\nimport isString from '../types/isString'\r\nimport isArray from '../types/isArray'\r\nimport isDOM from '../types/isDOM'\r\nimport setAttributes from './setAttributes'\r\n\r\n/**\r\n * 创建 DOM 节点,并添加属性和子节点\r\n * ========================================================================\r\n * @method createElement\r\n * @param {String} tagName - 标签名称\r\n * @param {Object|Array|HTMLElement|DocumentFragment|String} attrs - 属性对象或者子节点\r\n * @param {Array|HTMLElement|DocumentFragment|String} [children] - 子节点数组\r\n * @returns {HTMLElement}\r\n */\r\nconst createElement = (tagName, attrs, children) => {\r\n const $fragment = document.createDocumentFragment()\r\n const $el = document.createElement(tagName)\r\n const isValidChild = (child) => {\r\n return isDOM(child) || isString(child)\r\n }\r\n const append = (child) => {\r\n let $child\r\n\r\n if (!isValidChild(child)) {\r\n return false\r\n }\r\n\r\n if (isDOM(child)) {\r\n $child = child\r\n } else if (isString(child)) {\r\n $child = document.createTextNode(child)\r\n }\r\n\r\n $fragment.appendChild($child)\r\n }\r\n\r\n if (isObject(attrs)) {\r\n setAttributes($el, attrs)\r\n } else if (isArray(attrs) && attrs.every((attr) => isValidChild(attr))) {\r\n attrs.forEach((child) => {\r\n append(child)\r\n })\r\n } else if (isDOM(attrs)) {\r\n append(attrs)\r\n } else if (isString(attrs)) {\r\n append(document.createTextNode(attrs))\r\n }\r\n\r\n if (isArray(children)) {\r\n children.forEach((child) => {\r\n append(child)\r\n })\r\n } else {\r\n append(children)\r\n }\r\n\r\n $el.appendChild($fragment)\r\n\r\n return $el\r\n}\r\n\r\nexport default createElement\r\n","import trim from '../lang/trim'\r\nimport hasClass from './hasClass'\r\n\r\n/**\r\n * 移除 DOM 节点的 className 样式\r\n * ========================================================================\r\n * @method removeClass\r\n * @param {HTMLElement} el - DOM 节点\r\n * @param {String} className - 样式名称\r\n * @returns {Boolean}\r\n */\r\nconst removeClass = (el, className) => {\r\n let allClass = el.className\r\n let classList\r\n\r\n if (!allClass || !hasClass(el, className)) {\r\n return false\r\n }\r\n\r\n classList = el.classList\r\n\r\n if (classList?.remove) {\r\n classList.remove(className)\r\n } else {\r\n allClass = trim(allClass.replace(className, ''))\r\n el.className = allClass\r\n }\r\n}\r\n\r\nexport default removeClass\r\n","import isString from '../types/isString'\r\n\r\n/**\r\n * 清楚字符串起始位置所有的空格\r\n * ========================================================================\r\n * @method trim\r\n * @param {string} str\r\n * @returns {string|Boolean}\r\n */\r\nconst trim = (str) => {\r\n if (!isString(str)) {\r\n return false\r\n }\r\n return str.replace(/(^\\s+)|(\\s+$)/g, '')\r\n}\r\n\r\nexport default trim\r\n","/**\r\n * 获取 options 节点下匹配 selector 选择器的 DOM 节点\r\n * ========================================================================\r\n * Element.matches() 方法可以用来判断 DOM 元素是否与给定的选择器匹配,事件代理判断是\r\n * 否触发绑定的代理事件回调函数,关键就是使用 Element.matches() 辨别当前事件触发的目\r\n * 标 DOM 元素是否为事件代理所期望触发的目标。\r\n * ========================================================================\r\n * @method matches\r\n * @see https://developer.mozilla.org/en-US/docs/web/api/element/matches\r\n * @param {HTMLElement} el - (必须)DOM 元素\r\n * @param {String} selector - (必须)匹配 DOM 元素的选择器\r\n * @returns {Boolean}\r\n */\r\nconst matches = (el, selector = '') => {\r\n const sel = selector.replace(/^>/i, '')\r\n\r\n if (!selector || !sel || !el) {\r\n return false\r\n }\r\n\r\n /* istanbul ignore else */\r\n if (el.matches) {\r\n return el.matches(sel)\r\n } else if (el.msMatchesSelector) {\r\n return el.msMatchesSelector(sel)\r\n } else {\r\n return false\r\n }\r\n}\r\n\r\nexport default matches\r\n","/**\r\n * 获取 DOM 元素的父节点\r\n * ========================================================================\r\n * @method getParentOrHost\r\n * @param {*|HTMLElement} el - (必须)要获取父节点的 DOM 元素\r\n * @returns {*|HTMLElement}\r\n */\r\nconst getParentOrHost = (el) => {\r\n return el.host && el !== document && el.host.nodeType\r\n ? el.host\r\n : el.parentNode\r\n}\r\n\r\nexport default getParentOrHost\r\n","export const CAPTURE_EVENTS = [\r\n 'focusout',\r\n 'blur',\r\n 'focusin',\r\n 'focus',\r\n 'load',\r\n 'unload',\r\n 'mouseenter',\r\n 'mouseleave'\r\n]\r\n","import { CAPTURE_EVENTS } from './enum'\r\nimport _delete from './_delete'\r\n\r\n/**\r\n * (私有方法)取消 type 类型的代理事件绑定\r\n * ========================================================================\r\n * 如果没有设置 handler,则销毁 this.$options 绑定的所有符合 type 事件类型的事件绑定\r\n * ========================================================================\r\n * @method _off\r\n * @param {HTMLElement} el - (必须)取消事件绑定的 DOM 元素\r\n * @param {String} type - (必须)事件类型\r\n * @param {Function} fn - (必须)事件处理器回调函数\r\n * @private\r\n */\r\nconst _off = (el, type, fn) => {\r\n const capture = CAPTURE_EVENTS.indexOf(type) > -1\r\n\r\n /* istanbul ignore else */\r\n if (fn._delegateListener) {\r\n fn = fn._delegateListener\r\n delete fn._delegateListener\r\n }\r\n\r\n // 移除缓存的 _listeners 数据\r\n _delete(el, type, fn)\r\n\r\n el.removeEventListener(type, fn, capture)\r\n}\r\n\r\nexport default _off\r\n","/**\r\n * 删除 DOM 元素缓存的 _listeners 数据\r\n * ========================================================================\r\n * @method _delete\r\n * @param {HTMLElement} el - 要删除 listener 的 DOM 元素\r\n * @param {String} type - 事件类型(名称)\r\n * @param {Function} [fn] - 事件处理器回调函数\r\n */\r\nconst _delete = function (el, type, fn) {\r\n const listeners = el._listeners\r\n let index = -1\r\n\r\n if (listeners.length < 1) {\r\n return false\r\n }\r\n\r\n // 移除缓存的 _listeners 数据\r\n listeners.forEach((listener, i) => {\r\n const handler = listener.fn\r\n\r\n if (type === listener.type) {\r\n index = i\r\n\r\n if (handler === fn) {\r\n index = i\r\n }\r\n }\r\n })\r\n\r\n /* istanbul ignore else */\r\n if (index > -1) {\r\n listeners.splice(index, 1)\r\n }\r\n}\r\n\r\nexport default _delete\r\n","import isString from '../types/isString'\r\nimport isElement from '../types/isElement'\r\nimport getListeners from './getListeners'\r\nimport _off from './_off'\r\n\r\n/**\r\n * 销毁(type 类型的)代理事件绑定\r\n * ========================================================================\r\n * 1. 设置了事件类型 type,则销毁指定类型的事件绑定,否则清除所有代理事件绑定\r\n * 2. recurse 设置为 true,递归销毁子节点全部事件绑定\r\n * ========================================================================\r\n * @method purgeElement\r\n * @param {HTMLElement|String} el - (必须)DOM 元素或者其选择器\r\n * @param {String|Boolean} type - (必须)事件类型\r\n * @param {Boolean} [recurse] - (可选)是否递归销毁子节点所有事件绑定\r\n */\r\nconst purgeElement = function (el, type, recurse = false) {\r\n const $element = isString(el) ? document.querySelector(el) : el\r\n const $children = $element.childNodes\r\n const listeners = getListeners($element, type)\r\n\r\n listeners.forEach((listener) => {\r\n _off($element, listener.type, listener.fn)\r\n })\r\n\r\n if (\r\n (recurse || type === true || arguments.length === 1) &&\r\n $element &&\r\n $children\r\n ) {\r\n $children.forEach(($child) => {\r\n if (isElement($child)) {\r\n purgeElement($child, type, recurse)\r\n }\r\n })\r\n }\r\n}\r\n\r\nexport default purgeElement\r\n","import isString from '../types/isString'\r\n\r\n/**\r\n * 获取 DOM 元素(type 事件类型)事件绑定信息\r\n * ========================================================================\r\n * 如果设置了事件类型 type, 则返回指定类型的事件绑定信息,否则返回所有事件绑定信息\r\n * ========================================================================\r\n * @methods getListeners\r\n * @param {HTMLElement} el - (必须)要获取事件绑定信息的 DOM 元素\r\n * @param {String} [type] - (可选)事件类型\r\n * @returns {Array} - 已绑定的事件信息\r\n */\r\nconst getListeners = (el, type) => {\r\n let listeners = el._listeners || []\r\n\r\n if (isString(type) && type) {\r\n listeners = listeners.filter((listener) => {\r\n return listener.type === type\r\n })\r\n }\r\n\r\n return listeners\r\n}\r\n\r\nexport default getListeners\r\n","import purgeElement from './purgeElement'\r\nimport isFunction from '../types/isFunction'\r\nimport _off from './_off'\r\n\r\n/**\r\n * 取消 type 类型的代理事件绑定\r\n * ========================================================================\r\n * 如果没有设置 handler,则销毁 this.$options 绑定的所有符合 type 事件类型的事件绑定\r\n * ========================================================================\r\n * @method off\r\n * @param {HTMLElement|Object} el - (必须)取消事件绑定的 DOM 元素\r\n * @param {String} type - (必须)事件类型\r\n * @param {Function} [fn] - (可选)事件处理器回调函数\r\n */\r\nconst off = (el, type, fn) => {\r\n // 如果不设置 fn 参数,默认清除 el 元素上绑定的所有事件处理器\r\n if (!isFunction(fn)) {\r\n purgeElement(el, type)\r\n return false\r\n }\r\n\r\n _off(el, type, fn)\r\n}\r\n\r\nexport default off\r\n","import closest from '../dom/closest'\r\nimport off from './off'\r\nimport getTarget from './getTarget'\r\n\r\nimport { CAPTURE_EVENTS } from './enum'\r\n\r\n/**\r\n * 绑定代理事件\r\n * ========================================================================\r\n * @method on\r\n * @param {HTMLElement|String|Object} el - (必须)绑定代理事件的 DOM 节点\r\n * @param {String} selector - (必须)事件代理目标 DOM 元素的选择器\r\n * @param {String|Function} type - (必须)事件类型或者事件处理器回调函数\r\n * @param {Function|Object} fn - (可选) 事件处理器回调函数或者传递给事件处理器回调函数的数据对象\r\n * @param {Object|Boolean} [data] - (可选)传递给事件处理器回调函数的数据对象或者事件处理器回调函数的 this 上下文指向,\r\n * @param {Object|Boolean} [context] - (可选)事件处理器回调函数的 this 上下文指向,或者是否仅触发一次\r\n * 当设置为 true 时,则事件处理器回调函数的 this 上下文指向为 data 对象\r\n * @param {Boolean} once - (可选)是否仅触发一次\r\n */\r\nconst on = (el, selector, type, fn, data, context, once = false) => {\r\n // CAPTURE_EVENTS 中的特殊事件,采用事件捕获模型\r\n const capture = CAPTURE_EVENTS.indexOf(type) > -1\r\n\r\n const listener = function (evt) {\r\n const target = getTarget(evt)\r\n // 通过 Element.matches 方法获得点击的目标元素\r\n const delegateTarget = closest(target, selector, el)\r\n let overrideContext = context || el\r\n\r\n evt.delegateTarget = delegateTarget\r\n\r\n // 当设置为 true 时,则事件处理器回调函数的\r\n // this 上下文指向为 data 对象\r\n if (context === true) {\r\n overrideContext = data\r\n }\r\n\r\n /* istanbul ignore else */\r\n if (delegateTarget) {\r\n // 仅触发一次\r\n /* istanbul ignore else */\r\n if (once === true) {\r\n off(el, type, listener)\r\n }\r\n\r\n fn.call(overrideContext, evt, data)\r\n }\r\n }\r\n\r\n if (!el) {\r\n return false\r\n }\r\n\r\n if (!el._listeners) {\r\n el._listeners = []\r\n }\r\n\r\n // 缓存 options 元素绑定的事件处理器\r\n el._listeners.push({\r\n el,\r\n selector,\r\n type,\r\n fn: listener,\r\n data,\r\n context,\r\n capture\r\n })\r\n\r\n // 缓存包装后的事件处理器\r\n fn._delegateListener = listener\r\n\r\n el.addEventListener(type, listener, capture)\r\n}\r\n\r\nexport default on\r\n","import resolveTextNode from '../dom/resolveTextNode'\r\n\r\n/**\r\n * 返回触发事件的 target DOM 元素\r\n * ========================================================================\r\n * @method getTarget\r\n * @param {Event} evt - Event 对象\r\n * @return {HTMLElement} - Event 对象的 target DOM 元素\r\n */\r\nconst getTarget = function (evt) {\r\n const target = evt.target\r\n\r\n return resolveTextNode(target)\r\n}\r\n\r\nexport default getTarget\r\n","/**\r\n * 在某些情况下,某些浏览器(例如:Safari 浏览器)会返回实际的目标元素内部的文本节点。\r\n * resolveTextNode() 方法则会返回实际的目标节点。\r\n * ========================================================================\r\n * @method resolveTextNode\r\n * @param {HTMLElement|Text} el - 要解析的节点\r\n * @return {*|HTMLElement} - 实际的目标 DOM 节点\r\n */\r\nconst resolveTextNode = function (el) {\r\n if (el && el.nodeType === 3) {\r\n return el.parentNode\r\n }\r\n\r\n return el\r\n}\r\n\r\nexport default resolveTextNode\r\n","import matches from './matches'\r\nimport getParentOrHost from './getParentOrHost'\r\n\r\n/**\r\n * 获取 options 元素父元素最近的包含 selector 选择器的元素\r\n * ========================================================================\r\n * @method closest\r\n * @param {HTMLElement} el - (必须)DOM 元素\r\n * @param {String} selector - (必须)DOM 元素的选择其\r\n * @param {HTMLElement} [ctx] - (必须)比对的 DOM 元素\r\n * @param {Boolean} [includeCTX] - (必须)是否包含 context DOM 元素\r\n * @returns {null|HTMLElement} - 返回最接近的 DOM 元素\r\n */\r\nconst closest = (el, selector, ctx, includeCTX) => {\r\n const context = ctx || document\r\n\r\n if (!el) {\r\n return null\r\n }\r\n\r\n do {\r\n /* istanbul ignore else */\r\n if (\r\n (selector != null &&\r\n (selector.startsWith('>')\r\n ? el.parentNode === context && matches(el, selector)\r\n : matches(el, selector))) ||\r\n (includeCTX && el === context)\r\n ) {\r\n return el\r\n }\r\n\r\n /* istanbul ignore else */\r\n if (el === context) {\r\n break\r\n }\r\n\r\n /* jshint boss:true */\r\n } while ((el = getParentOrHost(el)))\r\n}\r\n\r\nexport default closest\r\n","const DEFAULTS = [\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n ''\r\n]\r\n\r\nexport default DEFAULTS\r\n","import DEFAULTS from './defaults'\r\n\r\nconst SYMBOLS = [...DEFAULTS]\r\n\r\nexport default SYMBOLS\r\n","import isString from '../types/isString'\r\nimport getSymbol from './getSymbol'\r\nimport SYMBOLS from './symbols'\r\n\r\n/**\r\n *\r\n * @method getSymbols\r\n * @param {String} [name]\r\n * @param {String} [iconSet]\r\n * @returns {string[]|*}\r\n */\r\nconst getSymbols = (name, iconSet = 'icon') => {\r\n if (isString(name)) {\r\n return getSymbol(name, iconSet)\r\n }\r\n\r\n return [...SYMBOLS]\r\n}\r\n\r\nexport default getSymbols\r\n","import SYMBOLS from './symbols'\r\n\r\n/**\r\n * @method getSymbol\r\n * @param {String} name\r\n * @param {String} [iconSet]\r\n * @returns {String}\r\n */\r\nconst getSymbol = (name, iconSet = 'icon') => {\r\n const patternName = /id=\"(.*?)\"/\r\n const patternSet = /^(\\w+)-/\r\n const symbols = SYMBOLS\r\n\r\n return symbols.find((symbol) => {\r\n const names = patternName.exec(symbol)\r\n const fullName = names[1]\r\n const sets = patternSet.exec(fullName)\r\n const setName = sets[1]\r\n const iconName =\r\n iconSet === 'icon' ? `${iconSet}-${name}` : `${iconSet}-icon-${name}`\r\n\r\n return setName === iconSet && fullName === iconName\r\n })\r\n}\r\n\r\nexport default getSymbol\r\n","import add from './add'\r\nimport getSymbols from './getSymbols'\r\n\r\n/**\r\n * 绘制 SVG 图标集\r\n * ========================================================================\r\n * @method paint\r\n * @param {String|Array} symbol\r\n */\r\nconst paint = (symbol = '') => {\r\n const $body = document.body\r\n let $icons = document.querySelector('#outline-icons')\r\n let symbols = []\r\n\r\n add(symbol)\r\n symbols = getSymbols()\r\n\r\n if ($icons) {\r\n $icons.innerHTML = symbols.join('')\r\n } else {\r\n $icons = document.createElement('div')\r\n $icons.innerHTML =\r\n ``\r\n $body.insertBefore($icons.firstChild, $body.firstChild)\r\n }\r\n}\r\n\r\nexport default paint\r\n","import isArray from '../types/isArray'\r\nimport isString from '../types/isString'\r\nimport SYMBOLS from './symbols'\r\n\r\n/**\r\n * @method add\r\n * @param {Array|String} symbols\r\n * @return {Boolean}\r\n */\r\nconst add = (symbols) => {\r\n if (!symbols) {\r\n return false\r\n }\r\n\r\n if (isArray(symbols) && symbols.length > 0) {\r\n symbols.forEach((symbol) => {\r\n /* istanbul ignore else */\r\n if (SYMBOLS.indexOf(symbol) === -1 && isString(symbol)) {\r\n SYMBOLS.push(symbol)\r\n }\r\n })\r\n } else {\r\n /* istanbul ignore else */\r\n if (isString(symbols)) {\r\n SYMBOLS.push(symbols)\r\n }\r\n }\r\n}\r\n\r\nexport default add\r\n","/**\r\n * 存储订阅者(主题和处理器的)私有对象\r\n * ========================================================================\r\n * @type {{}}\r\n * @private\r\n */\r\nconst _subscribers = {}\r\n\r\nexport default _subscribers\r\n","import _subscribers from './_subscribers'\r\nimport hasOwn from '../lang/hasOwn'\r\n\r\n/**\r\n * 判断是否存在与给定 topic 完全匹配的订阅者信息\r\n * ========================================================================\r\n * @method _hasDirectSubscribersFor\r\n * @param {String} topic - (必须)订阅主题字符串\r\n * @returns {Boolean}\r\n */\r\nconst _hasDirectSubscribersFor = (topic) => {\r\n return hasOwn(_subscribers, topic) && _subscribers[topic].length > 0\r\n}\r\n\r\nexport default _hasDirectSubscribersFor\r\n","import _hasDirectSubscribersFor from './_hasDirectSubscribersFor'\r\nimport _hasSubscribers from './_hasSubscribers'\r\n\r\n/**\r\n * 判断是否存在包含 topic 指定的订阅者信息\r\n * ========================================================================\r\n * @method has\r\n * @param {String} topic - (必须)主题名称\r\n * @param {Boolean} [isDirect] - (可选)是否为直接的主题,默认值:true\r\n * @returns {Boolean}\r\n */\r\nconst has = (topic, isDirect = true) => {\r\n return isDirect ? _hasDirectSubscribersFor(topic) : _hasSubscribers(topic)\r\n}\r\n\r\nexport default has\r\n","import _hasDirectSubscribersFor from './_hasDirectSubscribersFor'\r\n\r\n/**\r\n * 判断是否存在包含给定 topic 相关的订阅者信息\r\n * ========================================================================\r\n * @method _hasSubscribers\r\n * @param {String} topic - (必须)订阅主题字符串\r\n * @returns {Boolean}\r\n */\r\nconst _hasSubscribers = (topic) => {\r\n let found = _hasDirectSubscribersFor(topic)\r\n let position = topic.lastIndexOf('.')\r\n\r\n while (!found && position !== -1) {\r\n topic = topic.substring(0, position)\r\n position = topic.lastIndexOf('.')\r\n found = _hasDirectSubscribersFor(topic)\r\n }\r\n\r\n return found\r\n}\r\n\r\nexport default _hasSubscribers\r\n","import isTypedArray from '../types/isTypedArray'\r\nimport _subscribers from './_subscribers'\r\nimport has from './has'\r\nimport _hasDirectSubscribersFor from './_hasDirectSubscribersFor'\r\n\r\n/**\r\n * (异步)发布订阅主题信息\r\n * ========================================================================\r\n * 主题默认是异步发布的。确保在消费者处理主题时,主题的发起者不会被阻止。\r\n * ========================================================================\r\n * @method emit\r\n * @param {String} topic - (必须)主题名称\r\n * @param {Object} [data] - (可选)数据对象\r\n * @param {Boolean} [async] - (可选) 是否异步发布\r\n */\r\nconst emit = (topic, data, async = true) => {\r\n const execute = (topic) => {\r\n if (!_hasDirectSubscribersFor(topic)) {\r\n return false\r\n }\r\n\r\n _subscribers[topic].forEach((subscriber) => {\r\n // 针对 mqtt 消息服务返回的 Uint8Array 类似的 typed arrays 格式的数据\r\n // 采用 toString() 方法转化为普通(JSON)字符串\r\n const message = isTypedArray(data) ? data.toString() : data\r\n\r\n subscriber.callback.call(subscriber.context || subscriber, message)\r\n })\r\n }\r\n const deliver = () => {\r\n let subscriber = topic\r\n let position = topic.lastIndexOf('.')\r\n\r\n while (position !== -1) {\r\n subscriber = subscriber.substring(0, position)\r\n position = subscriber.lastIndexOf('.')\r\n\r\n execute(subscriber)\r\n }\r\n\r\n // 执行 topic 对应的处理器\r\n execute(topic)\r\n // 执行特殊 topic:'*'(监听全部消息的发布)\r\n execute('*')\r\n }\r\n\r\n if (!has(topic)) {\r\n return false\r\n }\r\n\r\n if (async) {\r\n setTimeout(deliver, 10)\r\n } else {\r\n deliver()\r\n }\r\n}\r\n\r\nexport default emit\r\n","import toString from '../lang/toString'\r\n/**\r\n * 判断检测数据是否为 Typed Arrays 类型的数据\r\n * ========================================================================\r\n * @param {*} val\r\n * @returns {boolean}\r\n */\r\nconst isTypedArray = (val) => {\r\n const TYPES = [\r\n '[object Int8Array]',\r\n '[object Uint8Array]',\r\n '[object Uint8ClampedArray]',\r\n '[object Int16Array]',\r\n '[object Uint16Array]',\r\n '[object Int32Array]',\r\n '[object Uint32Array]',\r\n '[object Float32Array]',\r\n '[object Float64Array]',\r\n '[object BigInt64Array]',\r\n '[object BigUint64Array]'\r\n ]\r\n\r\n return TYPES.indexOf(toString(val)) > -1\r\n}\r\n\r\nexport default isTypedArray\r\n","import _subscribers from './_subscribers'\r\nimport hasOwn from '../lang/hasOwn'\r\n\r\n/**\r\n * 删除与给定 topic 相同的订阅者信息\r\n * ========================================================================\r\n * @method _removeSubscriber\r\n * @param {String} topic - (必须)订阅主题字符串\r\n * @returns {Boolean}\r\n */\r\nconst _removeSubscriber = (topic) => {\r\n if (!hasOwn(_subscribers, topic)) {\r\n return false\r\n }\r\n\r\n delete _subscribers[topic]\r\n}\r\n\r\nexport default _removeSubscriber\r\n","import has from './has'\r\nimport _removeSubscriber from './_removeSubscriber'\r\nimport _removeSubscriberByToken from './_removeSubscriberByToken'\r\n\r\n/**\r\n * 取消订阅主题\r\n * ========================================================================\r\n * @method off\r\n * @param {String} topic - (必须)订阅的主题\r\n * @param {Function|String} [token] - (可选)订阅主题的处理器函数或者唯一 Id 值\r\n */\r\nconst off = (topic, token) => {\r\n if (!has(topic)) {\r\n return false\r\n }\r\n\r\n if (token) {\r\n _removeSubscriberByToken(token)\r\n } else {\r\n _removeSubscriber(topic)\r\n }\r\n}\r\n\r\nexport default off\r\n","import _subscribers from './_subscribers'\r\nimport _removeSubscriber from './_removeSubscriber'\r\n\r\n/**\r\n * 通过订阅者 token 值删除订阅者信息\r\n * ========================================================================\r\n * @method _removeSubscriberByToken\r\n * @param {String} token - 订阅者 token 字符串\r\n * @returns {boolean}\r\n * @private\r\n */\r\nconst _removeSubscriberByToken = (token) => {\r\n const keys = Object.keys(_subscribers)\r\n let index = -1\r\n\r\n if (!token || keys.length < 1) {\r\n return false\r\n }\r\n\r\n keys.forEach((subject) => {\r\n const subscriber = _subscribers[subject]\r\n let topic\r\n\r\n subscriber.forEach((execution, j) => {\r\n if (execution.callback === token || execution.token === token) {\r\n topic = execution.topic\r\n subscriber.splice(index, j)\r\n }\r\n })\r\n\r\n /* istanbul ignore else */\r\n if (subscriber.length < 1) {\r\n _removeSubscriber(topic)\r\n }\r\n })\r\n}\r\n\r\nexport default _removeSubscriberByToken\r\n","import isString from './utils/types/isString'\r\nimport hasOwn from './utils/lang/hasOwn'\r\nimport isObject from './utils/types/isObject'\r\nimport extend from './utils/lang/extend'\r\nimport publish from './utils/observer/emit'\r\nimport subscribe from './utils/observer/on'\r\nimport unsubscribe from './utils/observer/off'\r\n\r\nclass Base {\r\n constructor(options) {\r\n this.attrs = {}\r\n\r\n if (options) {\r\n this.initialize(options)\r\n }\r\n }\r\n\r\n initialize(options) {\r\n this.attr(options).render().addListeners()\r\n return this\r\n }\r\n\r\n attr(prop, value) {\r\n const attrs = this.attrs\r\n\r\n if (isString(prop)) {\r\n // 只能扩展 attrs 中已有的属性\r\n if (value && hasOwn(attrs, prop)) {\r\n // 更新单个配置信息\r\n attrs[prop] = value\r\n return this\r\n }\r\n\r\n // 只传递 prop 参数,则返回对应的属性值\r\n return attrs[prop]\r\n } else if (isObject(prop)) {\r\n // 批量更新配置信息\r\n extend(attrs, prop)\r\n\r\n return this\r\n } else if (arguments.length === 0) {\r\n // 不传递参数,直接返回整个\r\n return attrs\r\n }\r\n\r\n return this\r\n }\r\n\r\n render() {\r\n return this\r\n }\r\n\r\n refresh() {\r\n return this\r\n }\r\n\r\n destroy() {\r\n this.removeListeners()\r\n return this\r\n }\r\n\r\n reload(options) {\r\n let attrs = this.attr()\r\n\r\n if (options) {\r\n attrs = this.attr(options)\r\n }\r\n\r\n this.destroy().initialize(attrs)\r\n\r\n return this\r\n }\r\n\r\n $emit(event, data) {\r\n publish(event, data)\r\n return this\r\n }\r\n\r\n $on(event, callback) {\r\n subscribe(event, callback, this)\r\n return this\r\n }\r\n\r\n $off(event, callback) {\r\n unsubscribe(event, callback)\r\n return this\r\n }\r\n\r\n addListeners() {\r\n return this\r\n }\r\n\r\n removeListeners() {\r\n return this\r\n }\r\n}\r\n\r\nexport default Base\r\n","import hasOwn from './hasOwn'\r\n\r\n/**\r\n * 扩展对象\r\n * ========================================================================\r\n * @method extend\r\n * @param {Object} origin\r\n * @param {Object} source\r\n */\r\nconst extend = (origin, source) => {\r\n const keys = Object.keys(source)\r\n\r\n keys.forEach((prop) => {\r\n if (hasOwn(source, prop)) {\r\n origin[prop] = source[prop]\r\n }\r\n })\r\n}\r\n\r\nexport default extend\r\n","import _subscribers from './_subscribers'\r\nimport isFunction from '../types/isFunction'\r\nimport guid from '../lang/guid'\r\n\r\n/**\r\n * 订阅主题,并给出处理器函数\r\n * ========================================================================\r\n * @method on\r\n * @param {String} topic - (必须)主题名称\r\n * @param {Function} handler - (必须)主题的处理器函数\r\n * @param {Object} [context] - (可选)指定 this 执行上下文\r\n * @return {String} - 唯一的 token 字符串,例如:'guid-1'。\r\n */\r\nconst on = (topic, handler, context = null) => {\r\n const token = guid()\r\n let subject = typeof topic === 'symbol' ? topic.toString() : topic\r\n\r\n if (!isFunction(handler)) {\r\n return ''\r\n }\r\n\r\n /* istanbul ignore else */\r\n if (!_subscribers[subject]) {\r\n _subscribers[subject] = []\r\n }\r\n\r\n _subscribers[subject].push({\r\n topic: subject,\r\n callback: handler,\r\n context,\r\n token\r\n })\r\n\r\n return token\r\n}\r\n\r\nexport default on\r\n","import isFunction from './utils/types/isFunction'\r\n\r\nclass Command {\r\n constructor(name, action) {\r\n this.name = name\r\n\r\n if (isFunction(action)) {\r\n this.action = action\r\n }\r\n }\r\n\r\n execute() {\r\n this.action()\r\n\r\n return this\r\n }\r\n}\r\n\r\nexport default Command\r\n","import isFunction from './utils/types/isFunction'\r\n\r\nclass Commands {\r\n constructor() {\r\n this.commands = []\r\n }\r\n\r\n get(name) {\r\n return this.commands.find((cmd) => cmd.name === name)\r\n }\r\n\r\n add(command) {\r\n this.commands.push(command)\r\n\r\n return this\r\n }\r\n\r\n del(name) {\r\n const commands = this.commands\r\n const command = commands.find((cmd) => cmd.name === name)\r\n const index = command ? commands.indexOf(command) : -1\r\n\r\n if (index > -1) {\r\n commands.splice(index, 1)\r\n }\r\n\r\n return this\r\n }\r\n\r\n clear() {\r\n this.commands = []\r\n\r\n return this\r\n }\r\n\r\n execute(name) {\r\n const command = this.commands.find((cmd) => cmd.name === name)\r\n\r\n if (isFunction(command?.execute)) {\r\n command.execute()\r\n }\r\n\r\n return this\r\n }\r\n}\r\n\r\nexport default Commands\r\n","import isString from './isString'\r\n\r\nconst isSVG = (str) => {\r\n const declaration = '(?:<\\\\?xml[^>]*>\\\\s*)?'\r\n const doctype =\r\n '(?:<\\\\!doctype svg[^>]*\\\\s*(?:\\\\[?(?:\\\\s*]*>\\\\s*)*\\\\]?)*[^>]*>\\\\s*)?'\r\n const content = ']*>[^]*<\\\\/svg>\\\\s*$'\r\n const svg = `^\\\\s*${declaration}${doctype}${content}\\\\s*$`\r\n const pattern = new RegExp(svg, 'i')\r\n\r\n return isString(str) && pattern.test(str)\r\n}\r\n\r\nexport default isSVG\r\n","import isArray from '../types/isArray'\r\nimport isString from '../types/isString'\r\nimport isSVG from '../types/isSVG'\r\nimport setAttributes from '../dom/setAttributes'\r\n\r\n/**\r\n * 创建 SVG 图标 DOM 元素\r\n * ========================================================================\r\n * @method createElement\r\n * @param {String} name\r\n * @param {Object} [options]\r\n * @param {Number|Array} [options.size]\r\n * @param {String} [options.color]\r\n * @param {String} [options.iconSet]\r\n * @param {Object} [options.attrs]\r\n * @returns {HTMLElement}\r\n */\r\nconst createElement = (name, options = {}) => {\r\n const ICON = 'outline-icon'\r\n const size = options.size || 0\r\n const color = options.color || ''\r\n const iconSet = options.iconSet || ''\r\n const width = isArray(size) ? size[0] : size\r\n const height = isArray(size) ? size[1] : size\r\n const defaultRules = size ? `width:${width}px;height:${height}px;` : ''\r\n const cssRules = color ? defaultRules + `color:${color}` : defaultRules\r\n const attrs = options.attrs || {}\r\n const $icon = document.createElement('i')\r\n let binds = ''\r\n let svg = ''\r\n let $svg\r\n\r\n if (!isString(name)) {\r\n return null\r\n }\r\n\r\n if (isSVG(name)) {\r\n svg = name\r\n } else {\r\n binds =\r\n iconSet && iconSet !== 'icon'\r\n ? `xlink:href=\"#${iconSet}-icon-${name}\"`\r\n : `xlink:href=\"#icon-${name}\"`\r\n svg = ``\r\n }\r\n\r\n $icon.innerHTML = svg\r\n\r\n if (attrs.className) {\r\n attrs.className = `${ICON} ${attrs.className}`\r\n } else {\r\n attrs.className = ICON\r\n }\r\n\r\n setAttributes($icon, attrs)\r\n\r\n $svg = $icon.querySelector('svg')\r\n setAttributes($svg, {\r\n 'aria-hidden': true,\r\n xmlns: 'http://www.w3.org/2000/svg',\r\n class: 'outline-icon__svg',\r\n width: 200,\r\n height: 200,\r\n style: cssRules\r\n })\r\n\r\n return $icon\r\n}\r\n\r\nexport default createElement\r\n","import icon from './utils/icons/icon'\r\nimport createElement from './utils/dom/createElement'\r\nimport addClass from './utils/dom/addClass'\r\n\r\nconst _createButton = (button, rounded = true) => {\r\n const $icon = icon(button.icon, {\r\n iconSet: button.iconSet || 'outline',\r\n color: button.color || '',\r\n size: button.size\r\n })\r\n const $anchor = createElement(\r\n 'a',\r\n {\r\n className: `outline-toolbar__anchor`,\r\n href: button.link\r\n },\r\n $icon\r\n )\r\n const $button = createElement(\r\n 'div',\r\n {\r\n className: `outline-toolbar__button ${button.name}`,\r\n 'data-cmd': button.name\r\n },\r\n [button.link ? $anchor : $icon]\r\n )\r\n\r\n addClass($icon, 'outline-toolbar__icon')\r\n\r\n if (rounded) {\r\n addClass($button, 'outline-toolbar_rounded')\r\n }\r\n\r\n if (button.disabled) {\r\n addClass($button, 'outline-toolbar_disabled')\r\n }\r\n\r\n return $button\r\n}\r\n\r\nexport default _createButton\r\n","import createElement from './createElement'\r\n\r\n/**\r\n * 创建 SVG 图标 DOM 元素\r\n * ========================================================================\r\n * @method icon\r\n * @alias createElement\r\n * @see createElement\r\n * @param {String} name\r\n * @param {Object} [options]\r\n * @param {Number|Array} [options.size]\r\n * @param {String} [options.color]\r\n * @param {String} [options.iconSet]\r\n * @returns {HTMLElement}\r\n */\r\nconst icon = (name, options = {}) => {\r\n return createElement(name, options)\r\n}\r\n\r\nexport default icon\r\n","import isString from './utils/types/isString'\r\nimport isFunction from './utils/types/isFunction'\r\nimport isObject from './utils/types/isObject'\r\nimport isArray from './utils/types/isArray'\r\nimport later from './utils/lang/later'\r\nimport guid from './utils/lang/guid'\r\nimport cloneDeep from './utils/lang/cloneDeep'\r\nimport createElement from './utils/dom/createElement'\r\nimport addClass from './utils/dom/addClass'\r\nimport hasClass from './utils/dom/hasClass'\r\nimport removeClass from './utils/dom/removeClass'\r\nimport on from './utils/event/on'\r\nimport off from './utils/event/off'\r\nimport paint from './utils/icons/paint'\r\n\r\nimport Base from './base'\r\nimport Command from './command'\r\nimport Commands from './commands'\r\n\r\nimport _createButton from './_createButton'\r\n\r\nconst DISABLED = 'outline-toolbar_disabled'\r\nconst HIDDEN = 'outline-toolbar_hidden'\r\nconst ACTIVE = 'outline-toolbar_active'\r\n\r\nclass Toolbar extends Base {\r\n constructor(options) {\r\n super()\r\n\r\n this._default()\r\n\r\n if (options) {\r\n this.initialize(options)\r\n }\r\n }\r\n\r\n _default() {\r\n this.attrs = cloneDeep(Toolbar.DEFAULTS)\r\n\r\n this.disabled = false\r\n this.closed = false\r\n\r\n this.$el = null\r\n this.buttons = []\r\n this.commands = null\r\n\r\n return this\r\n }\r\n\r\n initialize(options) {\r\n let created\r\n\r\n this.attr(options)\r\n\r\n this.disabled = this.attr('disabled')\r\n this.closed = this.attr('closed')\r\n this.commands = new Commands()\r\n\r\n created = this.attr('created')\r\n\r\n if (isFunction(created)) {\r\n created.call(this)\r\n }\r\n\r\n this.render().addListeners()\r\n\r\n return this\r\n }\r\n\r\n isHighlight(name) {\r\n const button = this.get(name)\r\n\r\n if (!button) {\r\n return false\r\n }\r\n\r\n return hasClass(button.$el, ACTIVE)\r\n }\r\n\r\n isDisabled(name) {\r\n let button\r\n\r\n if (name) {\r\n button = this.get(name)\r\n\r\n return button.disabled\r\n }\r\n\r\n return this.disabled\r\n }\r\n\r\n isExist(name) {\r\n const button = this.get(name)\r\n return !!button\r\n }\r\n\r\n isClosed() {\r\n return this.closed\r\n }\r\n\r\n _getCommand(button) {\r\n const _self = this\r\n const { action, name } = button\r\n let command = null\r\n let handler = null\r\n let context\r\n let listener\r\n\r\n if (!action) {\r\n return command\r\n }\r\n\r\n handler = action.handler\r\n context = action.context || this\r\n\r\n if (isFunction(handler)) {\r\n listener = handler\r\n } else if (isString(handler)) {\r\n listener = function () {\r\n _self.$emit(handler, name)\r\n }\r\n }\r\n\r\n if (isFunction(listener)) {\r\n command = new Command(name, listener.bind(context))\r\n }\r\n\r\n return command\r\n }\r\n\r\n get(name) {\r\n return this.buttons.find((button) => button.name === name)\r\n }\r\n\r\n render() {\r\n const mounted = this.attr('mounted')\r\n const buttons = this.attr('buttons') || []\r\n const placement = this.attr('placement')\r\n\r\n paint()\r\n\r\n this.$el = createElement('div', {\r\n id: guid('outline-toolbar'),\r\n className: `outline-toolbar outline-toolbar_${placement}`\r\n })\r\n this._paint(buttons)\r\n document.body.appendChild(this.$el)\r\n\r\n if (this.closed) {\r\n this.hide()\r\n }\r\n\r\n if (this.disabled) {\r\n this.disable()\r\n }\r\n\r\n if (isFunction(mounted)) {\r\n mounted.call(this)\r\n }\r\n\r\n return this\r\n }\r\n\r\n erase() {\r\n this.$el.innerHTML = ''\r\n return this\r\n }\r\n\r\n _paint(buttons) {\r\n const rounded = this.attr('rounded')\r\n const $fragment = document.createDocumentFragment()\r\n\r\n buttons.forEach((button) => {\r\n const $button = _createButton(button, rounded)\r\n const command = this._getCommand(button)\r\n const { name, disabled, context } = button\r\n\r\n $fragment.appendChild($button)\r\n\r\n if (!this.isExist(name)) {\r\n this.buttons.push({\r\n $el: $button,\r\n name,\r\n disabled: disabled || false,\r\n context: context || this\r\n })\r\n\r\n if (command) {\r\n this.commands.add(command)\r\n }\r\n }\r\n })\r\n\r\n this.$el.appendChild($fragment)\r\n\r\n return this\r\n }\r\n\r\n _remove() {\r\n document.body.removeChild(this.$el)\r\n return this\r\n }\r\n\r\n refresh(buttons) {\r\n this.attr({ buttons })\r\n this.erase()._paint(buttons)\r\n return this\r\n }\r\n\r\n add(button) {\r\n const $el = this.$el\r\n const $fragment = document.createDocumentFragment()\r\n const buttons = this.attr('buttons') || []\r\n const { name, disabled, context } = button\r\n const command = this._getCommand(button)\r\n const _add = (button) => {\r\n const $button = _createButton(button)\r\n\r\n $fragment.appendChild($button)\r\n\r\n buttons.push(button)\r\n this.buttons.push({\r\n $el: $button,\r\n name,\r\n disabled: disabled || false,\r\n context: context || this,\r\n command\r\n })\r\n\r\n if (command) {\r\n this.commands.add(command)\r\n }\r\n }\r\n\r\n if (isObject(button)) {\r\n _add(button)\r\n } else if (isArray(button)) {\r\n button.forEach((item) => {\r\n if (isObject(item)) {\r\n _add(item)\r\n }\r\n })\r\n }\r\n $el.appendChild($fragment)\r\n\r\n return this\r\n }\r\n\r\n remove(name) {\r\n const $el = this.$el\r\n const buttons = this.buttons\r\n const button = this.get(name)\r\n let index = -1\r\n\r\n if (!button) {\r\n return this\r\n }\r\n\r\n index = buttons.indexOf(button)\r\n\r\n if (index > -1) {\r\n buttons.splice(index, 1)\r\n this.attr('buttons').splice(index, 1)\r\n }\r\n\r\n this._disable(name)\r\n $el.removeChild(button.$el)\r\n\r\n return this\r\n }\r\n\r\n _disable(name) {\r\n const button = this.get(name)\r\n const command = this.commands.get(name)\r\n\r\n if (!button || button.disabled) {\r\n return this\r\n }\r\n\r\n button.disabled = true\r\n\r\n if (command) {\r\n this.commands.del(command)\r\n }\r\n\r\n addClass(button.$el, DISABLED)\r\n\r\n return this\r\n }\r\n\r\n _enable(name) {\r\n const button = this.get(name)\r\n const command = this.commands.get(name)\r\n\r\n if (!button || !button.disabled) {\r\n return this\r\n }\r\n\r\n button.disabled = false\r\n\r\n if (command) {\r\n this.commands.add(command)\r\n }\r\n\r\n removeClass(button.$el, DISABLED)\r\n\r\n return this\r\n }\r\n\r\n disable(name) {\r\n const disabled = this.attr('afterDisabled')\r\n\r\n if (name) {\r\n this._disable(name)\r\n } else {\r\n addClass(this.$el, DISABLED)\r\n this.removeListeners()\r\n this.disabled = true\r\n\r\n if (isFunction(disabled)) {\r\n disabled.call(this)\r\n }\r\n }\r\n\r\n return this\r\n }\r\n\r\n enable(name) {\r\n const enabled = this.attr('afterEnabled')\r\n\r\n if (name) {\r\n this._enable(name)\r\n } else {\r\n this.disabled = false\r\n removeClass(this.$el, DISABLED)\r\n this.addListeners()\r\n\r\n if (isFunction(enabled)) {\r\n enabled.call(this)\r\n }\r\n }\r\n\r\n return this\r\n }\r\n\r\n show(name) {\r\n const opened = this.attr('afterOpened')\r\n const button = this.get(name)\r\n const $el = this.$el\r\n\r\n if (name) {\r\n if (!button) {\r\n return this\r\n }\r\n\r\n removeClass(button.$el, HIDDEN)\r\n } else {\r\n removeClass($el, HIDDEN)\r\n this.closed = false\r\n\r\n if (isFunction(opened)) {\r\n later(() => {\r\n opened.call(this)\r\n }, 310)\r\n }\r\n }\r\n\r\n return this\r\n }\r\n\r\n hide(name) {\r\n const closed = this.attr('afterClosed')\r\n const button = this.get(name)\r\n const $el = this.$el\r\n\r\n if (name) {\r\n if (!button) {\r\n return this\r\n }\r\n\r\n addClass(button.$el, HIDDEN)\r\n } else {\r\n addClass($el, HIDDEN)\r\n this.closed = true\r\n\r\n if (isFunction(closed)) {\r\n later(() => {\r\n closed.call(this)\r\n }, 310)\r\n }\r\n }\r\n\r\n return this\r\n }\r\n\r\n toggle(name) {\r\n if (this.isClosed()) {\r\n this.show(name)\r\n } else {\r\n this.hide(name)\r\n }\r\n\r\n return this\r\n }\r\n\r\n highlight(name) {\r\n const button = this.get(name)\r\n let $button\r\n\r\n if (!button) {\r\n return this\r\n }\r\n\r\n $button = button.$el\r\n\r\n if (hasClass($button, ACTIVE)) {\r\n removeClass($button, ACTIVE)\r\n } else {\r\n addClass($button, ACTIVE)\r\n }\r\n\r\n return this\r\n }\r\n\r\n destroy() {\r\n const beforeDestroy = this.attr('beforeDestroy')\r\n const afterDestroy = this.attr('afterDestroy')\r\n\r\n if (isFunction(beforeDestroy)) {\r\n beforeDestroy.call(this)\r\n }\r\n\r\n this.commands.clear()\r\n this.removeListeners()._remove()._default()\r\n\r\n if (isFunction(afterDestroy)) {\r\n afterDestroy.call(this)\r\n }\r\n\r\n return this\r\n }\r\n\r\n execute(name) {\r\n if (this.isDisabled(name)) {\r\n return this\r\n }\r\n\r\n this.commands.execute(name)\r\n\r\n return this\r\n }\r\n\r\n onExecute(evt) {\r\n const $button = evt.delegateTarget\r\n let cmd = ''\r\n\r\n if ($button) {\r\n cmd = $button.getAttribute('data-cmd')\r\n\r\n if (cmd) {\r\n this.execute(cmd)\r\n }\r\n }\r\n\r\n return this\r\n }\r\n\r\n _updateToolbar({ top, min, max }) {\r\n const current = Math.ceil(top)\r\n\r\n if (current <= min) {\r\n this.hide('up')\r\n this.show('down')\r\n } else if (current >= max) {\r\n this.hide('down')\r\n this.show('up')\r\n } else if (current > min && current < max) {\r\n this.show('up')\r\n this.show('down')\r\n }\r\n\r\n return this\r\n }\r\n\r\n onToolbarUpdate({ top, min, max }) {\r\n this._updateToolbar({ top, min, max })\r\n return this\r\n }\r\n\r\n onAddButton(buttons) {\r\n this.attr({\r\n buttons\r\n })\r\n this.refresh(buttons)\r\n\r\n return this\r\n }\r\n\r\n onRemoveButton(name) {\r\n this.remove(name)\r\n return this\r\n }\r\n\r\n addListeners() {\r\n const buttons = this.attr('buttons') || []\r\n const $el = this.$el\r\n\r\n if (!buttons || buttons.length < 1) {\r\n return this\r\n }\r\n\r\n on($el, `.outline-toolbar__button`, 'click', this.onExecute, this, true)\r\n\r\n this.$on('toolbar:update', this.onToolbarUpdate)\r\n this.$on('toolbar:add:button', this.onAddButton)\r\n this.$on('toolbar:remove:button', this.onRemoveButton)\r\n this.$on('toolbar:toggle', this.toggle)\r\n\r\n return this\r\n }\r\n\r\n removeListeners() {\r\n const buttons = this.attr('buttons') || []\r\n const $el = this.$el\r\n\r\n if (!buttons || buttons.length < 1) {\r\n return this\r\n }\r\n\r\n off($el, '.outline-toolbar__button', this.onExecute)\r\n\r\n this.$off('toolbar:update')\r\n this.$off('toolbar:add:button')\r\n this.$off('toolbar:remove:button')\r\n this.$off('toolbar:toggle')\r\n\r\n return this\r\n }\r\n}\r\n\r\nToolbar.DEFAULTS = (() => {\r\n const OPTIONS = {\r\n placement: 'ltr',\r\n closed: false,\r\n disabled: false,\r\n rounded: true,\r\n buttons: [],\r\n created: null,\r\n mounted: null,\r\n afterClosed: null,\r\n afterOpened: null,\r\n afterDisabled: null,\r\n afterEnabled: null,\r\n beforeDestroy: null,\r\n afterDestroy: null\r\n }\r\n\r\n return cloneDeep(OPTIONS)\r\n})()\r\n\r\nexport default Toolbar\r\n"],"names":["isString","str","toString","val","Object","prototype","apply","isFunction","isObject","o","isArray","Array","later","fn","delay","setTimeout","guid","uuid","prefix","cloneDeep","obj","clone","from","assign","keys","forEach","key","isElement","nodeName","tagName","nodeType","isDOM","el","isHTMLCollection","fragment","isTextNode","hasOwn","prop","hasOwnProperty","call","hasClass","className","pattern","RegExp","allClass","classList","contains","exec","addClass","_classList","add","indexOf","split","name","length","setAttributes","attrs","attr","value","setAttribute","toLowerCase","style","cssText","innerHTML","innerText","createElement","children","$fragment","document","createDocumentFragment","$el","isValidChild","child","append","$child","createTextNode","appendChild","every","removeClass","remove","replace","matches","selector","sel","msMatchesSelector","getParentOrHost","host","parentNode","CAPTURE_EVENTS","_off","type","capture","_delegateListener","listeners","_listeners","index","listener","i","handler","splice","_delete","removeEventListener","purgeElement","recurse","$element","querySelector","$children","childNodes","getListeners","filter","arguments","off","on","data","context","once","evt","target","getTarget","delegateTarget","closest","ctx","includeCTX","startsWith","overrideContext","push","addEventListener","SYMBOLS","_maybeArrayLike","_toConsumableArray","getSymbols","iconSet","getSymbol","patternName","patternSet","find","symbol","fullName","paint","$body","body","$icons","symbols","join","insertBefore","firstChild","_subscribers","_hasDirectSubscribersFor","topic","has","isDirect","found","position","lastIndexOf","substring","_hasSubscribers","emit","async","execute","subscriber","message","callback","deliver","_removeSubscriber","token","subject","execution","j","_removeSubscriberByToken","Base","constructor","options","this","initialize","render","addListeners","origin","source","extend","refresh","destroy","removeListeners","reload","$emit","event","publish","$on","subscribe","$off","unsubscribe","Command","action","Commands","commands","get","cmd","command","del","clear","ICON","size","color","width","height","defaultRules","cssRules","$icon","$svg","binds","svg","test","isSVG","xmlns","class","_createButton","button","rounded","icon","$anchor","href","link","$button","disabled","DISABLED","HIDDEN","ACTIVE","Toolbar","super","_default","DEFAULTS","closed","buttons","created","isHighlight","isDisabled","isExist","isClosed","_getCommand","_self","bind","mounted","placement","id","_paint","hide","disable","erase","_remove","removeChild","_add","item","_disable","_enable","enable","enabled","show","opened","toggle","highlight","beforeDestroy","afterDestroy","onExecute","getAttribute","_updateToolbar","top","min","max","current","Math","ceil","onToolbarUpdate","onAddButton","onRemoveButton","afterClosed","afterOpened","afterDisabled","afterEnabled"],"mappings":"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"} \ No newline at end of file diff --git a/toolbar/toolbar.css b/toolbar/toolbar.css new file mode 100644 index 00000000..ae0c1e6e --- /dev/null +++ b/toolbar/toolbar.css @@ -0,0 +1 @@ +.outline-toolbar{margin:0;overflow:hidden;position:fixed;transition-duration:.3s;z-index:99999}.outline-toolbar__button{background-color:#fff;border:1px solid #dcdfe6;border-radius:3px;box-shadow:0 0 6px 1px #dcdfe6;box-sizing:border-box;color:#999;cursor:pointer;height:36px;margin:10px;overflow:hidden;position:relative;text-align:center;transition:all .3s ease-in-out .1s;width:36px;z-index:1}.outline-toolbar__button:hover{border-color:#058942;color:#058942;transform:scale(1.35)}.outline-toolbar__button.hide{display:none}.outline-toolbar__anchor:hover,.outline-toolbar__anchor:link,.outline-toolbar__anchor:visited{color:#999;text-decoration:none}.outline-toolbar__anchor:hover{color:#058942}.outline-toolbar__icon{height:20px;left:50%;position:absolute;top:50%;transform:translate(-50%,-50%);width:20px;z-index:2;fill:currentcolor;overflow:hidden}.outline-toolbar_active.outline-toolbar__button{background-color:#058942;border-color:#058942;color:#fff}.outline-toolbar_active.outline-toolbar__button:hover{color:#fff}.outline-toolbar_active .outline-toolbar__anchor:hover,.outline-toolbar_active .outline-toolbar__anchor:link,.outline-toolbar_active .outline-toolbar__anchor:visited{color:#fff}.outline-toolbar_rounded.outline-toolbar__button{border-radius:18px}.outline-toolbar_disabled .outline-toolbar__anchor:hover,.outline-toolbar_disabled .outline-toolbar__anchor:link,.outline-toolbar_disabled .outline-toolbar__anchor:visited,.outline-toolbar_disabled .outline-toolbar__button,.outline-toolbar_disabled.outline-toolbar__anchor:hover,.outline-toolbar_disabled.outline-toolbar__anchor:link,.outline-toolbar_disabled.outline-toolbar__anchor:visited,.outline-toolbar_disabled.outline-toolbar__button{border-color:#999;color:#999;cursor:not-allowed}.outline-toolbar_disabled .outline-toolbar__anchor:hover:hover,.outline-toolbar_disabled .outline-toolbar__anchor:link:hover,.outline-toolbar_disabled .outline-toolbar__anchor:visited:hover,.outline-toolbar_disabled .outline-toolbar__button:hover,.outline-toolbar_disabled.outline-toolbar__anchor:hover:hover,.outline-toolbar_disabled.outline-toolbar__anchor:link:hover,.outline-toolbar_disabled.outline-toolbar__anchor:visited:hover,.outline-toolbar_disabled.outline-toolbar__button:hover{border-color:#999;color:#999}.outline-toolbar_disabled .outline-toolbar__button,.outline-toolbar_disabled.outline-toolbar__button{background-color:#f5f5f5}.outline-toolbar_btt,.outline-toolbar_ttb{left:50%;transform:translateX(-50%)}.outline-toolbar_btt .outline-toolbar__button,.outline-toolbar_ttb .outline-toolbar__button{display:inline-block}.outline-toolbar_ttb{top:12px}.outline-toolbar_ttb.outline-toolbar_hidden{top:-56px}.outline-toolbar_btt{bottom:12px}.outline-toolbar_btt.outline-toolbar_hidden{bottom:-56px}.outline-toolbar_ltr,.outline-toolbar_rtl{transform:translateY(-50%);width:56px}.outline-toolbar_rtl{right:12px;top:50%}.outline-toolbar_rtl.outline-toolbar_hidden{right:-86px}.outline-toolbar_ltr{left:12px;top:50%}.outline-toolbar_ltr.outline-toolbar_hidden{left:-86px}.outline-toolbar_btt .outline-toolbar__button.outline-toolbar_hidden,.outline-toolbar_ltr .outline-toolbar__button.outline-toolbar_hidden,.outline-toolbar_rtl .outline-toolbar__button.outline-toolbar_hidden,.outline-toolbar_ttb .outline-toolbar__button.outline-toolbar_hidden{display:none} \ No newline at end of file diff --git a/toolbar.js b/toolbar/toolbar.js similarity index 92% rename from toolbar.js rename to toolbar/toolbar.js index b6ecbb3f..29750635 100644 --- a/toolbar.js +++ b/toolbar/toolbar.js @@ -1,29 +1,35 @@ -import isString from './utils/types/isString' -import isFunction from './utils/types/isFunction' -import isObject from './utils/types/isObject' -import isArray from './utils/types/isArray' -import later from './utils/lang/later' -import guid from './utils/lang/guid' -import cloneDeep from './utils/lang/cloneDeep' -import createElement from './utils/dom/createElement' -import addClass from './utils/dom/addClass' -import hasClass from './utils/dom/hasClass' -import removeClass from './utils/dom/removeClass' -import on from './utils/event/on' -import off from './utils/event/off' -import paint from './utils/icons/paint' - -import Base from './base' -import Command from './command' -import Commands from './commands' - -import _createButton from './_createButton' +import isString from '@/utils/types/isString' +import isFunction from '@/utils/types/isFunction' +import isObject from '@/utils/types/isObject' +import isArray from '@/utils/types/isArray' + +import later from '@/utils/lang/later' +import guid from '@/utils/lang/guid' +import cloneDeep from '@/utils/lang/cloneDeep' + +import createElement from '@/utils/dom/createElement' +import addClass from '@/utils/dom/addClass' +import hasClass from '@/utils/dom/hasClass' +import removeClass from '@/utils/dom/removeClass' + +import on from '@/utils/event/on' +import off from '@/utils/event/off' + +import paint from '@/utils/icons/paint' + +import Command from '@/command' +import Commands from '@/commands' +import Component from '@/component' + +import _createButton from './utils/_createButton' + +import './toolbar.less' const DISABLED = 'outline-toolbar_disabled' const HIDDEN = 'outline-toolbar_hidden' const ACTIVE = 'outline-toolbar_active' -class Toolbar extends Base { +class Toolbar extends Component { constructor(options) { super() diff --git a/toolbar/toolbar.less b/toolbar/toolbar.less new file mode 100644 index 00000000..f8953620 --- /dev/null +++ b/toolbar/toolbar.less @@ -0,0 +1,175 @@ +@import '../theme/colors'; +@import '../theme/shadow'; + +.outline-toolbar { + position: fixed; + z-index: 99999; + margin: 0; + transition-duration: 0.3s; + overflow: hidden; + + &__button { + .shadow_light_regular(); + position: relative; + z-index: 1; + margin: 10px; + width: 36px; + height: 36px; + border: 1px solid @primary_border_color; + border-radius: 3px; + box-sizing: border-box; + background-color: @white; + cursor: pointer; + text-align: center; + color: @fourth_text_color; + transition: all 0.3s 0.1s ease-in-out; + overflow: hidden; + + &:hover { + color: @success_color; + border-color: @success_color; + transform: scale(1.35); + } + + &.hide { + display: none; + } + } + + &__anchor { + &:link, + &:visited, + &:hover { + color: @fourth_text_color; + text-decoration: none; + } + + &:hover { + color: @success_color; + } + } + + &__icon { + position: absolute; + z-index: 2; + top: 50%; + left: 50%; + width: 20px; + height: 20px; + transform: translate(-50%, -50%); + fill: currentcolor; + overflow: hidden; + } + + &_active { + &.outline-toolbar { + &__button { + color: @white; + background-color: @success_color; + border-color: @success_color; + + &:hover { + color: @white; + } + } + } + + .outline-toolbar__anchor { + &:link, + &:visited, + &:hover { + color: @white; + } + } + } + + &_rounded { + &.outline-toolbar__button { + border-radius: 18px; + } + } + + &_disabled { + &.outline-toolbar, + .outline-toolbar { + &__anchor:link, + &__anchor:visited, + &__anchor:hover, + &__button { + cursor: not-allowed; + color: @fourth_text_color; + border-color: @fourth_text_color; + + &:hover { + color: @fourth_text_color; + border-color: @fourth_text_color; + } + } + + &__button { + background-color: @disabled_bg_color; + } + } + } + + &_ttb, + &_btt { + left: 50%; + transform: translateX(-50%); + + .outline-toolbar__button { + display: inline-block; + } + } + + &_ttb { + top: 12px; + + &.outline-toolbar_hidden { + top: -56px; + } + } + + &_btt { + bottom: 12px; + + &.outline-toolbar_hidden { + bottom: -56px; + } + } + + &_rtl, + &_ltr { + transform: translateY(-50%); + width: 56px; + } + + &_rtl { + top: 50%; + right: 12px; + + &.outline-toolbar_hidden { + right: -86px; + } + } + + &_ltr { + top: 50%; + left: 12px; + + &.outline-toolbar_hidden { + left: -86px; + } + } + + &_ttb, + &_rtl, + &_btt, + &_ltr { + .outline-toolbar__button { + &.outline-toolbar_hidden { + display: none; + } + } + } +} diff --git a/toolbar/toolbar.min.css b/toolbar/toolbar.min.css new file mode 100644 index 00000000..e0f32edd --- /dev/null +++ b/toolbar/toolbar.min.css @@ -0,0 +1,6 @@ +.outline-heading{overflow:hidden;position:relative;z-index:1}.outline-heading__anchor{display:none}.outline-heading__anchor:hover,.outline-heading__anchor:link,.outline-heading__anchor:visited{color:#999;text-decoration:none}.outline-heading__anchor:hover{color:#507afe}.outline-heading:hover .outline-heading__anchor{display:inline-block}.outline-heading_start:hover{overflow:visible}.outline-heading_start .outline-heading__anchor{left:-1em;position:absolute;top:50%;transform:translateY(-50%);z-index:2} +:root{--outline-zIndex:2000;--outline-sticky-height:100%;--outline-navigator-width:100%}.outline-navigator{margin:0;overflow:auto;position:relative;width:var(--outline-navigator-width);z-index:1}.outline-navigator-parent{transition:.3s ease-in-out}.outline-navigator__title{border-bottom:1px solid #dcdfe6;font-size:16px;font-weight:400;height:40px;line-height:40px;margin:0 16px;overflow:hidden;padding:0 16px}.outline-navigator__main{margin:0;overflow:hidden;position:relative;z-index:1}.outline-navigator__item,.outline-navigator__list,.outline-navigator__subject{list-style-type:none;margin:0;overflow:hidden;padding:0;position:relative;z-index:2}.outline-navigator__list{padding:.5em 0}.outline-navigator__subject{padding-left:1em}.outline-navigator__item{font-size:13px;line-height:30px;margin:0;overflow:hidden}.outline-navigator__placeholder{background-color:#f7f8f9;border-left:2px solid #058942;box-sizing:border-box;height:30px;left:0;overflow:hidden;position:absolute;top:0;transition-duration:.2s;width:100%;z-index:1}.outline-navigator__anchor{display:block;overflow:hidden;padding:0 1.5em;text-overflow:ellipsis;white-space:nowrap}.outline-navigator__anchor:hover,.outline-navigator__anchor:link,.outline-navigator__anchor:visited{color:#555;text-decoration:none}.outline-navigator__anchor:hover{color:#058942}.outline-navigator__code{padding-right:.5em}.outline-navigator_highlight.outline-navigator__anchor:hover,.outline-navigator_highlight.outline-navigator__anchor:link,.outline-navigator_highlight.outline-navigator__anchor:visited{color:#058942;font-weight:700}.outline-navigator_fixed,.outline-navigator_sticky{display:flex;flex-direction:column;flex-wrap:nowrap;overflow:hidden;top:0;z-index:var(--outline-zIndex)}.outline-navigator_fixed .outline-navigator__main,.outline-navigator_fixed .outline-navigator__title,.outline-navigator_sticky .outline-navigator__main,.outline-navigator_sticky .outline-navigator__title{box-sizing:border-box}.outline-navigator_fixed .outline-navigator__title,.outline-navigator_sticky .outline-navigator__title{flex-shrink:0}.outline-navigator_fixed .outline-navigator__main,.outline-navigator_sticky .outline-navigator__main{flex:1;overflow:auto}.outline-navigator_sticky{max-height:var(--outline-sticky-height);position:sticky}.outline-navigator_fixed{max-height:100%;position:fixed}.outline-navigator_hidden{display:none}.outline-navigator_folded{overflow:hidden;width:0} +:root{--outline-zIndex:2000;--outline-sticky-height:100%;--outline-navigator-width:100%}.outline-drawer{box-sizing:border-box;height:100%;left:0;margin:0;overflow:hidden;position:relative;top:0;visibility:hidden;width:100%;z-index:-1}.outline-drawer__modal{background-color:#fff;box-shadow:0 0 6px 1px #dcdfe6;display:flex;flex-direction:column;flex-wrap:nowrap;height:100%;overflow:hidden;position:absolute;transition-duration:.4s;z-index:21}.outline-drawer__footer,.outline-drawer__header,.outline-drawer__main{box-sizing:border-box;width:100%}.outline-drawer__footer,.outline-drawer__header{flex-shrink:0}.outline-drawer__footer,.outline-drawer__main,.outline-drawer__title{padding:0 16px}.outline-drawer__header,.outline-drawer__title{height:52px;line-height:52px;margin:0 auto;overflow:hidden;position:relative;z-index:1}.outline-drawer__title{border-bottom:1px solid #dcdfe6;box-sizing:border-box;font-size:16px;font-weight:400;margin:0 16px}.outline-drawer__close{color:#999;cursor:pointer;font-size:20px;height:20px;line-height:20px;overflow:hidden;position:absolute;right:12px;text-align:center;top:50%;transform:translateY(-50%);width:20px;z-index:2}.outline-drawer__close .outline-icon{left:0;position:absolute;top:0;z-index:2}.outline-drawer__close:hover{color:#666}.outline-drawer__main{flex:1;overflow:auto}.outline-drawer__main.overflow-hidden{overflow:hidden}.outline-drawer__footer{margin:0 auto;overflow:hidden;text-align:right}.outline-drawer__overlay{background-color:#fff;content:"";height:100%;left:0;opacity:.1;overflow:hidden;position:relative;top:0;width:100%;z-index:1}.outline-drawer_ltr.outline-drawer_tiny,.outline-drawer_rtl.outline-drawer_tiny{width:280px}.outline-drawer_ltr.outline-drawer_mini,.outline-drawer_rtl.outline-drawer_mini{width:480px}.outline-drawer_ltr.outline-drawer_small,.outline-drawer_rtl.outline-drawer_small{width:540px}.outline-drawer_ltr.outline-drawer_regular,.outline-drawer_rtl.outline-drawer_regular{width:680px}.outline-drawer_ltr.outline-drawer_medium,.outline-drawer_rtl.outline-drawer_medium{width:720px}.outline-drawer_ltr.outline-drawer_large,.outline-drawer_rtl.outline-drawer_large{width:960px}.outline-drawer_rtl{border-left:1px solid #dcdfe6}.outline-drawer_rtl.outline-drawer_tiny.outline-drawer_closed{right:-290px}.outline-drawer_rtl.outline-drawer_mini.outline-drawer_closed{right:-490px}.outline-drawer_rtl.outline-drawer_small.outline-drawer_closed{right:-550px}.outline-drawer_rtl.outline-drawer_regular.outline-drawer_closed{right:-690px}.outline-drawer_rtl.outline-drawer_medium.outline-drawer_closed{right:-730px}.outline-drawer_rtl.outline-drawer_large.outline-drawer_closed{right:-970px}.outline-drawer_ltr{border-right:1px solid #dcdfe6}.outline-drawer_ltr.outline-drawer_tiny.outline-drawer_closed{left:-290px}.outline-drawer_ltr.outline-drawer_mini.outline-drawer_closed{left:-490px}.outline-drawer_ltr.outline-drawer_small.outline-drawer_closed{left:-550px}.outline-drawer_ltr.outline-drawer_regular.outline-drawer_closed{left:-690px}.outline-drawer_ltr.outline-drawer_medium.outline-drawer_closed{left:-730px}.outline-drawer_ltr.outline-drawer_large.outline-drawer_closed{left:-970px}.outline-drawer_btt,.outline-drawer_ttb{left:0;width:100%}.outline-drawer_btt.outline-drawer_tiny,.outline-drawer_ttb.outline-drawer_tiny{height:240px}.outline-drawer_btt.outline-drawer_mini,.outline-drawer_ttb.outline-drawer_mini{height:320px}.outline-drawer_btt.outline-drawer_small,.outline-drawer_ttb.outline-drawer_small{height:360px}.outline-drawer_btt.outline-drawer_regular,.outline-drawer_ttb.outline-drawer_regular{height:400px}.outline-drawer_btt.outline-drawer_medium,.outline-drawer_ttb.outline-drawer_medium{height:440px}.outline-drawer_btt.outline-drawer_large,.outline-drawer_ttb.outline-drawer_large{height:480px}.outline-drawer_ttb{border-bottom:1px solid #dcdfe6}.outline-drawer_ttb.outline-drawer_tiny.outline-drawer_closed{top:-250px}.outline-drawer_ttb.outline-drawer_mini.outline-drawer_closed{top:-330px}.outline-drawer_ttb.outline-drawer_small.outline-drawer_closed{top:-370px}.outline-drawer_ttb.outline-drawer_regular.outline-drawer_closed{top:-410px}.outline-drawer_ttb.outline-drawer_medium.outline-drawer_closed{top:-450px}.outline-drawer_ttb.outline-drawer_large.outline-drawer_closed{top:-490px}.outline-drawer_btt{border-top:1px solid #dcdfe6;top:auto}.outline-drawer_btt.outline-drawer_tiny.outline-drawer_closed{bottom:-250px}.outline-drawer_btt.outline-drawer_mini.outline-drawer_closed{bottom:-330px}.outline-drawer_btt.outline-drawer_small.outline-drawer_closed{bottom:-370px}.outline-drawer_btt.outline-drawer_regular.outline-drawer_closed{bottom:-410px}.outline-drawer_btt.outline-drawer_medium.outline-drawer_closed{bottom:-450px}.outline-drawer_btt.outline-drawer_large.outline-drawer_closed{bottom:-490px}.outline-drawer_opened{visibility:visible;z-index:var(--outline-zIndex)}.outline-drawer_opened.outline-drawer{position:fixed}.outline-drawer_opened.outline-drawer_rtl{right:0}.outline-drawer_opened.outline-drawer_ltr{left:0}.outline-drawer_opened.outline-drawer_ttb{top:0}.outline-drawer_opened.outline-drawer_btt{bottom:0}.outline-drawer_offset.outline-drawer_ltr,.outline-drawer_offset.outline-drawer_rtl{height:calc(100% - 4em);top:50%;transform:translateY(-50%)}.outline-drawer_offset.outline-drawer_btt,.outline-drawer_offset.outline-drawer_ttb{left:50%;transform:translateX(-50%);width:calc(100% - 4em)}.outline-drawer_offset.outline-drawer_opened.outline-drawer_rtl{right:2em}.outline-drawer_offset.outline-drawer_opened.outline-drawer_ltr{left:2em}.outline-drawer_offset.outline-drawer_opened.outline-drawer_ttb{top:2em}.outline-drawer_offset.outline-drawer_opened.outline-drawer_btt{bottom:2em}.outline-drawer_auto.outline-drawer_ltr,.outline-drawer_auto.outline-drawer_rtl{height:auto;max-height:calc(100% - 4em)}.outline-drawer_full{padding:0} +.outline-reader__progress{animation:outline-reader-progress linear;background-color:#507afe;height:4px;left:0;position:fixed;scale:0 1;top:0;transform-origin:left;width:100%;z-index:3;animation-timeline:--ProgressTimeline}.outline-reader__paper{background-color:#fff;box-shadow:0 0 6px 1px #ddd;box-sizing:border-box;margin:2em auto;max-width:1200px;overflow:hidden;padding:3.2em}.outline-reader__title{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Helvetica Neue,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Helvetica,Arial,sans-serif;font-size:4.2em;font-weight:400;line-height:1.3em;margin:.67em 0;overflow:hidden;text-align:center}.outline-reader__article .outline-reader__progress,.outline-reader_hidden{display:none}.outline-reader_hidden.outline-reader_sibling{display:none!important}.outline-reader_hidden.outline-reader_sibling.wrapper.post{display:none}.outline-reader--reading{background-color:#fafafa;box-sizing:border-box;display:block;height:100%;left:0;margin:0;padding:3em 4em;position:fixed;top:0;width:100%;z-index:2;scroll-timeline-name:--ProgressTimeline;overflow:scroll}@keyframes outline-reader-progress{to{scale:1 1}}@media (max-width:500px){.outline-reader{overflow:hidden}.outline-reader .outline-toolbar{align-items:center;align-self:auto;background-color:#fff;border-top:1px solid #ddd;box-sizing:border-box;display:flex;flex-direction:row;flex-wrap:nowrap;height:48px;padding:0 16px;right:0;top:100%;transform:translateY(-48px);width:100%}.outline-reader .outline-toolbar__button{border:none;border-radius:0;box-shadow:none;flex:1}.outline-reader--reading{background-color:#fff;box-sizing:border-box;padding:0}.outline-reader__paper{box-shadow:none;height:100%;margin:0;overflow:hidden;padding:0;position:relative;z-index:1}.outline-reader__title{background-color:#fff;border-bottom:1px solid #ddd;font-size:1.8em;font-weight:400;height:48px;left:0;line-height:48px;margin:0;overflow:hidden;position:absolute;text-overflow:ellipsis;top:0;white-space:nowrap;width:100%;z-index:3}.outline-reader__article{height:calc(100% - 96px);margin:48px 0;padding:0 1.25em;scroll-timeline-name:--MobileProgressTimeline;overflow-x:hidden;overflow-y:scroll}.outline-reader__article .outline-reader__progress{animation:outline-reader-progress linear;z-index:4;animation-timeline:--MobileProgressTimeline;display:block}}@media print{body,html{background-color:#fff;color:#333;font-size:12pt;height:auto!important}a:hover,a:link,a:visited{color:#507afe;text-decoration:underline!important}audio,video{display:none!important}table{border-collapse:collapse;width:100%}td,th{border:1px solid #dcdfe6;padding:8px 20px}.outline-message,.outline-toolbar{display:none!important}.outline-reader{display:block!important;overflow:hidden}.outline-reader__title{font-size:32pt!important;margin:13.4pt 0 28pt!important;text-align:center!important}.outline-reader--reading{background-color:#fff;height:auto!important;overflow:hidden!important;padding:0!important;position:relative!important}.outline-reader__progress{display:none!important}.outline-reader__paper{box-shadow:none}.outline-reader pre{border:1px solid #ddd!important;border-radius:4px!important;padding:1em!important}.outline-reader code,.outline-reader pre{background-color:#fff!important}.outline-reader img,.outline-reader svg,.outline-reader table{break-inside:avoid}.outline-reader_sibling{display:none!important}} +.outline-icon{display:inline-block;position:relative;vertical-align:middle;z-index:1}.outline-icon,.outline-icon__svg{height:1em;overflow:hidden;width:1em}.outline-icon__svg{left:50%;position:absolute;top:50%;z-index:2;fill:currentcolor;transform:translate(-50%,-50%)}.outline-icon_hidden{display:none}.outline-message{background-color:#fff;border-radius:3px;box-shadow:0 0 6px 1px #dcdfe6;left:50%;opacity:.1;padding:0 50px;position:fixed;top:-50px;transform:translateX(-50%);transition:all .5s ease-in-out;z-index:9999}.outline-message,.outline-message__content{color:#666;font-size:13px;height:40px;line-height:40px;margin:0;overflow:hidden}.outline-message__content{max-width:700px;text-overflow:ellipsis;white-space:nowrap}.outline-message__close,.outline-message__icon{height:40px;line-height:40px;overflow:hidden;position:absolute;text-align:center;top:0;width:40px;z-index:2}.outline-message__icon{color:#fff;left:0}.outline-message__icon .outline-icon{left:50%;position:absolute;top:50%;transform:translate(-50%,-50%);z-index:2}.outline-message__close{color:#999;cursor:pointer;right:0}.outline-message__close .outline-icon{left:50%;position:absolute;top:50%;transform:translate(-50%,-50%);z-index:2}.outline-message__close:hover{color:#666}.outline-message_info .outline-message__icon{background-color:#507afe}.outline-message_warning .outline-message__icon{background-color:#ff9901}.outline-message_success .outline-message__icon{background-color:#058942}.outline-message_error .outline-message__icon{background-color:#ff5d5d}.outline-message_plain{min-width:190px;padding:0 50px 0 15px}.outline-message_plain.outline-message_info{background-color:#ecf8ff;border-left:5px solid #507afe}.outline-message_plain.outline-message_warning{background-color:#fffbe6;border-left:5px solid #ff9901}.outline-message_plain.outline-message_success{background-color:#e1f6eb;border-left:5px solid #058942}.outline-message_plain.outline-message_error{background-color:#fff1f0;border-left:5px solid #ff5d5d}.outline-message_plain .outline-message__icon{display:none;width:0}.outline-message_plain .outline-message__icon .outline-icon{display:none}.outline-message_light{min-width:180px;padding:0 40px}.outline-message_light.outline-message_info .outline-message__icon{color:#507afe}.outline-message_light.outline-message_warning .outline-message__icon{color:#ff9901}.outline-message_light.outline-message_success .outline-message__icon{color:#058942}.outline-message_light.outline-message_error .outline-message__icon{color:#ff5d5d}.outline-message_light .outline-message__icon{background-color:#fff}.outline-message_round{border-radius:20px}.outline-message_round.outline-message_default{min-width:180px;padding:0 40px}.outline-message_round.outline-message_default .outline-message__icon{border-radius:10px;height:20px;left:10px;line-height:20px;top:10px;width:20px}.outline-message_round.outline-message_default.outline-message_full-width{min-width:200px;padding:0 20px 0 40px}.outline-message_round.outline-message_plain{min-width:195px;padding:0 40px 0 20px}.outline-message_round.outline-message_plain.outline-message_full-width{min-width:215px;padding:0 20px}.outline-message_full-width{min-width:200px;padding:0 10px 0 50px}.outline-message_full-width.outline-message_plain{min-width:230px;padding:0 10px 0 15px}.outline-message_full-width.outline-message_light{min-width:210px;padding:0 10px 0 40px}.outline-message_visible{opacity:1}.outline-message_hidden{display:none} +.outline-toolbar{margin:0;overflow:hidden;position:fixed;transition-duration:.3s;z-index:99999}.outline-toolbar__button{background-color:#fff;border:1px solid #dcdfe6;border-radius:3px;box-shadow:0 0 6px 1px #dcdfe6;box-sizing:border-box;color:#999;cursor:pointer;height:36px;margin:10px;overflow:hidden;position:relative;text-align:center;transition:all .3s ease-in-out .1s;width:36px;z-index:1}.outline-toolbar__button:hover{border-color:#058942;color:#058942;transform:scale(1.35)}.outline-toolbar__button.hide{display:none}.outline-toolbar__anchor:hover,.outline-toolbar__anchor:link,.outline-toolbar__anchor:visited{color:#999;text-decoration:none}.outline-toolbar__anchor:hover{color:#058942}.outline-toolbar__icon{height:20px;left:50%;position:absolute;top:50%;transform:translate(-50%,-50%);width:20px;z-index:2;fill:currentcolor;overflow:hidden}.outline-toolbar_active.outline-toolbar__button{background-color:#058942;border-color:#058942;color:#fff}.outline-toolbar_active.outline-toolbar__button:hover{color:#fff}.outline-toolbar_active .outline-toolbar__anchor:hover,.outline-toolbar_active .outline-toolbar__anchor:link,.outline-toolbar_active .outline-toolbar__anchor:visited{color:#fff}.outline-toolbar_rounded.outline-toolbar__button{border-radius:18px}.outline-toolbar_disabled .outline-toolbar__anchor:hover,.outline-toolbar_disabled .outline-toolbar__anchor:link,.outline-toolbar_disabled .outline-toolbar__anchor:visited,.outline-toolbar_disabled .outline-toolbar__button,.outline-toolbar_disabled.outline-toolbar__anchor:hover,.outline-toolbar_disabled.outline-toolbar__anchor:link,.outline-toolbar_disabled.outline-toolbar__anchor:visited,.outline-toolbar_disabled.outline-toolbar__button{border-color:#999;color:#999;cursor:not-allowed}.outline-toolbar_disabled .outline-toolbar__anchor:hover:hover,.outline-toolbar_disabled .outline-toolbar__anchor:link:hover,.outline-toolbar_disabled .outline-toolbar__anchor:visited:hover,.outline-toolbar_disabled .outline-toolbar__button:hover,.outline-toolbar_disabled.outline-toolbar__anchor:hover:hover,.outline-toolbar_disabled.outline-toolbar__anchor:link:hover,.outline-toolbar_disabled.outline-toolbar__anchor:visited:hover,.outline-toolbar_disabled.outline-toolbar__button:hover{border-color:#999;color:#999}.outline-toolbar_disabled .outline-toolbar__button,.outline-toolbar_disabled.outline-toolbar__button{background-color:#f5f5f5}.outline-toolbar_btt,.outline-toolbar_ttb{left:50%;transform:translateX(-50%)}.outline-toolbar_btt .outline-toolbar__button,.outline-toolbar_ttb .outline-toolbar__button{display:inline-block}.outline-toolbar_ttb{top:12px}.outline-toolbar_ttb.outline-toolbar_hidden{top:-56px}.outline-toolbar_btt{bottom:12px}.outline-toolbar_btt.outline-toolbar_hidden{bottom:-56px}.outline-toolbar_ltr,.outline-toolbar_rtl{transform:translateY(-50%);width:56px}.outline-toolbar_rtl{right:12px;top:50%}.outline-toolbar_rtl.outline-toolbar_hidden{right:-86px}.outline-toolbar_ltr{left:12px;top:50%}.outline-toolbar_ltr.outline-toolbar_hidden{left:-86px}.outline-toolbar_btt .outline-toolbar__button.outline-toolbar_hidden,.outline-toolbar_ltr .outline-toolbar__button.outline-toolbar_hidden,.outline-toolbar_rtl .outline-toolbar__button.outline-toolbar_hidden,.outline-toolbar_ttb .outline-toolbar__button.outline-toolbar_hidden{display:none} \ No newline at end of file diff --git a/toolbar.min.js b/toolbar/toolbar.min.js similarity index 66% rename from toolbar.min.js rename to toolbar/toolbar.min.js index 6c339686..176e475f 100644 --- a/toolbar.min.js +++ b/toolbar/toolbar.min.js @@ -1,2 +1,2 @@ -!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(t="undefined"!=typeof globalThis?globalThis:t||self).Toolbar=e()}(this,(function(){"use strict";const t=t=>"string"==typeof t,e=t=>Object.prototype.toString.apply(t),s=t=>"function"==typeof t||"[object Function]"===e(t),i=t=>("[object Object]"===e(t)||"object"==typeof t||s(t))&&null!==t,n=t=>Array.isArray?Array.isArray(t):"[object Array]"===e(t),o=(t,e=300)=>!!s(t)&&setTimeout((()=>{t()}),e),r=(()=>{let t=0;return e=>(t+=1,e?e+"-"+t:"guid-"+t)})(),l=t=>{let e={};return null===t?null:(n(t)?e=Array.from(t):(e=Object.assign({},t),Object.keys(e).forEach((s=>e[s]=i(t[s])?l(t[s]):t[s]))),e)},a=t=>!!(i(t)&&t.nodeName&&t.tagName&&1===t.nodeType),c=t=>{return!(!i(t)||!(a(t)||(t=>!(!i(t)||"[object NodeList]"!==e(t)))(t)||(s=t,i(s)&&"[object DocumentFragment]"===e(s))||(t=>!(!i(t)||!("[object Text]"===e(t)||t.tagName&&3===t.nodeType)))(t)));var s},h=(t,e)=>{const s=Object.prototype.hasOwnProperty;return t&&s.call(t,e)},d=(t,e)=>{const s=new RegExp("(\\s|^)"+e+"(\\s|$)");let i,n;return!!a(t)&&(i=t.className,!!i&&(n=t.classList,n&&n.contains?t.classList.contains(e):!!s.exec(i)))},u=(t,e)=>{var s;let i,n;if(d(t,e))return!1;i=t.classList,null!==(s=i)&&void 0!==s&&s.add?e.indexOf(" ")>-1?e.split(" ").forEach((t=>{i.add(t)})):i.add(e):(n=t.className,n+=n.length>0?" "+e:e,t.className=n)},m=(t,e)=>{if(!t||!i(e))return!1;Object.keys(e).forEach((s=>{const i=e[s];h(e,s)&&((t,e,s)=>{let i=t.tagName.toLowerCase();switch(e){case"style":t.style.cssText=s;break;case"value":"input"===i||"textarea"===i?t.value=s:t.setAttribute(e,s);break;case"htmlFor":t.setAttribute("for",s);break;case"className":u(t,s);break;case"innerHTML":t.innerHTML=s;break;case"innerText":t.innerText=s;break;default:t.setAttribute(e,s)}})(t,s,i)}))},b=(e,s,o)=>{const r=document.createDocumentFragment(),l=document.createElement(e),a=e=>c(e)||t(e),h=e=>{let s;if(!a(e))return!1;c(e)?s=e:t(e)&&(s=document.createTextNode(e)),r.appendChild(s)};return i(s)?m(l,s):n(s)&&s.every((t=>a(t)))?s.forEach((t=>{h(t)})):c(s)?h(s):t(s)&&h(document.createTextNode(s)),n(o)?o.forEach((t=>{h(t)})):h(o),l.appendChild(r),l},p=(e,s)=>{var i;let n,o=e.className;if(!o||!d(e,s))return!1;var r;n=e.classList,null!==(i=n)&&void 0!==i&&i.remove?n.remove(s):(r=o.replace(s,""),o=!!t(r)&&r.replace(/(^\s+)|(\s+$)/g,""),e.className=o)},f=(t,e="")=>{const s=e.replace(/^>/i,"");return!!(e&&s&&t)&&(t.matches?t.matches(s):!!t.msMatchesSelector&&t.msMatchesSelector(s))},y=t=>t.host&&t!==document&&t.host.nodeType?t.host:t.parentNode,v=["focusout","blur","focusin","focus","load","unload","mouseenter","mouseleave"],g=(t,e,s)=>{const i=v.indexOf(e)>-1;s._delegateListener&&delete(s=s._delegateListener)._delegateListener,function(t,e,s){const i=t._listeners;let n=-1;if(i.length<1)return!1;i.forEach(((t,i)=>{const o=t.fn;e===t.type&&(n=i,o===s&&(n=i))})),n>-1&&i.splice(n,1)}(t,e,s),t.removeEventListener(e,s,i)},x=function(e,s,i=!1){const n=t(e)?document.querySelector(e):e,o=n.childNodes,r=((e,s)=>{let i=e._listeners||[];return t(s)&&s&&(i=i.filter((t=>t.type===s))),i})(n,s);r.forEach((t=>{g(n,t.type,t.fn)})),(i||!0===s||1===arguments.length)&&n&&o&&o.forEach((t=>{a(t)&&x(t,s,i)}))},z=(t,e,i)=>{if(!s(i))return x(t,e),!1;g(t,e,i)},M=(t,e,s,i,n,o,r=!1)=>{const l=v.indexOf(s)>-1,a=function(l){const c=function(t){const e=t.target;return(s=e)&&3===s.nodeType?s.parentNode:s;var s}(l),h=((t,e,s,i)=>{const n=s||document;if(!t)return null;do{if(null!=e&&(e.startsWith(">")?t.parentNode===n&&f(t,e):f(t,e))||i&&t===n)return t;if(t===n)break}while(t=y(t))})(c,e,t);let d=o||t;l.delegateTarget=h,!0===o&&(d=n),h&&(!0===r&&z(t,s,a),i.call(d,l,n))};if(!t)return!1;t._listeners||(t._listeners=[]),t._listeners.push({el:t,selector:e,type:s,fn:a,data:n,context:o,capture:l}),i._delegateListener=a,t.addEventListener(s,a,l)};function $(t,e){(null==e||e>t.length)&&(e=t.length);for(var s=0,i=Array(e);s','','','','','','','','','','','','','','','','','','','']),A=(e,s="icon")=>t(e)?((t,e="icon")=>{const s=/id="(.*?)"/,i=/^(\w+)-/;return L.find((n=>{const o=s.exec(n)[1];return i.exec(o)[1]===e&&o===("icon"===e?`${e}-${t}`:`${e}-icon-${t}`)}))})(e,s):w(_,L),E=(e="")=>{const s=document.body;let i=document.querySelector("#outline-icons"),o=[];(e=>{if(!e)return!1;n(e)&&e.length>0?e.forEach((e=>{-1===L.indexOf(e)&&t(e)&&L.push(e)})):t(e)&&L.push(e)})(e),o=A(),i?i.innerHTML=o.join(""):(i=document.createElement("div"),i.innerHTML=``,s.insertBefore(i.firstChild,s.firstChild))},j={},C=t=>h(j,t)&&j[t].length>0,T=(t,e=!0)=>e?C(t):(t=>{let e=C(t),s=t.lastIndexOf(".");for(;!e&&-1!==s;)s=(t=t.substring(0,s)).lastIndexOf("."),e=C(t);return e})(t),B=(t,s,i=!0)=>{const n=t=>{if(!C(t))return!1;j[t].forEach((t=>{const i=["[object Int8Array]","[object Uint8Array]","[object Uint8ClampedArray]","[object Int16Array]","[object Uint16Array]","[object Int32Array]","[object Uint32Array]","[object Float32Array]","[object Float64Array]","[object BigInt64Array]","[object BigUint64Array]"].indexOf(e(s))>-1?s.toString():s;t.callback.call(t.context||t,i)}))},o=()=>{let e=t,s=t.lastIndexOf(".");for(;-1!==s;)e=e.substring(0,s),s=e.lastIndexOf("."),n(e);n(t),n("*")};if(!T(t))return!1;i?setTimeout(o,10):o()},N=t=>{if(!h(j,t))return!1;delete j[t]},O=(t,e)=>{if(!T(t))return!1;e?(t=>{const e=Object.keys(j);if(!t||e.length<1)return!1;e.forEach((e=>{const s=j[e];let i;s.forEach(((e,n)=>{e.callback!==t&&e.token!==t||(i=e.topic,s.splice(-1,n))})),s.length<1&&N(i)}))})(e):N(t)};class S{constructor(t){this.attrs={},t&&this.initialize(t)}initialize(t){return this.attr(t).render().addListeners(),this}attr(e,s){const n=this.attrs;return t(e)?s&&h(n,e)?(n[e]=s,this):n[e]:i(e)?(o=n,r=e,Object.keys(r).forEach((t=>{h(r,t)&&(o[t]=r[t])})),this):0===arguments.length?n:this;var o,r}render(){return this}refresh(){return this}destroy(){return this.removeListeners(),this}reload(t){let e=this.attr();return t&&(e=this.attr(t)),this.destroy().initialize(e),this}$emit(t,e){return B(t,e),this}$on(t,e){return((t,e,i=null)=>{const n=r();let o="symbol"==typeof t?t.toString():t;s(e)&&(j[o]||(j[o]=[]),j[o].push({topic:o,callback:e,context:i,token:n}))})(t,e,this),this}$off(t,e){return O(t,e),this}addListeners(){return this}removeListeners(){return this}}class k{constructor(t,e){this.name=t,s(e)&&(this.action=e)}execute(){return this.action(),this}}class H{constructor(){this.commands=[]}get(t){return this.commands.find((e=>e.name===t))}add(t){return this.commands.push(t),this}del(t){const e=this.commands,s=e.find((e=>e.name===t)),i=s?e.indexOf(s):-1;return i>-1&&e.splice(i,1),this}clear(){return this.commands=[],this}execute(t){const e=this.commands.find((e=>e.name===t));return s(null==e?void 0:e.execute)&&e.execute(),this}}const D=(e,s={})=>{const i="outline-icon",o=s.size||0,r=s.color||"",l=s.iconSet||"",a=n(o)?o[0]:o,c=n(o)?o[1]:o,h=o?`width:${a}px;height:${c}px;`:"",d=r?h+`color:${r}`:h,u=s.attrs||{},b=document.createElement("i");let p,f="",y="";return t(e)?((e=>{const s=new RegExp("^\\s*(?:<\\?xml[^>]*>\\s*)?(?:<\\!doctype svg[^>]*\\s*(?:\\[?(?:\\s*]*>\\s*)*\\]?)*[^>]*>\\s*)?]*>[^]*<\\/svg>\\s*$\\s*$","i");return t(e)&&s.test(e)})(e)?y=e:(f=l&&"icon"!==l?`xlink:href="#${l}-icon-${e}"`:`xlink:href="#icon-${e}"`,y=``),b.innerHTML=y,u.className?u.className=`${i} ${u.className}`:u.className=i,m(b,u),p=b.querySelector("svg"),m(p,{"aria-hidden":!0,xmlns:"http://www.w3.org/2000/svg",class:"outline-icon__svg",width:200,height:200,style:d}),b):null},I=(t,e=!0)=>{const s=((t,e={})=>D(t,e))(t.icon,{iconSet:t.iconSet||"outline",color:t.color||"",size:t.size}),i=b("a",{className:"outline-toolbar__anchor",href:t.link},s),n=b("div",{className:`outline-toolbar__button ${t.name}`,"data-cmd":t.name},[t.link?i:s]);return u(s,"outline-toolbar__icon"),e&&u(n,"outline-toolbar_rounded"),t.disabled&&u(n,"outline-toolbar_disabled"),n},V="outline-toolbar_disabled",F="outline-toolbar_hidden",U="outline-toolbar_active";class q extends S{constructor(t){super(),this._default(),t&&this.initialize(t)}_default(){return this.attrs=l(q.DEFAULTS),this.disabled=!1,this.closed=!1,this.$el=null,this.buttons=[],this.commands=null,this}initialize(t){let e;return this.attr(t),this.disabled=this.attr("disabled"),this.closed=this.attr("closed"),this.commands=new H,e=this.attr("created"),s(e)&&e.call(this),this.render().addListeners(),this}isHighlight(t){const e=this.get(t);return!!e&&d(e.$el,U)}isDisabled(t){let e;return t?(e=this.get(t),e.disabled):this.disabled}isExist(t){return!!this.get(t)}isClosed(){return this.closed}_getCommand(e){const i=this,{action:n,name:o}=e;let r,l,a=null,c=null;return n?(c=n.handler,r=n.context||this,s(c)?l=c:t(c)&&(l=function(){i.$emit(c,o)}),s(l)&&(a=new k(o,l.bind(r))),a):a}get(t){return this.buttons.find((e=>e.name===t))}render(){const t=this.attr("mounted"),e=this.attr("buttons")||[],i=this.attr("placement");return E(),this.$el=b("div",{id:r("outline-toolbar"),className:`outline-toolbar outline-toolbar_${i}`}),this._paint(e),document.body.appendChild(this.$el),this.closed&&this.hide(),this.disabled&&this.disable(),s(t)&&t.call(this),this}erase(){return this.$el.innerHTML="",this}_paint(t){const e=this.attr("rounded"),s=document.createDocumentFragment();return t.forEach((t=>{const i=I(t,e),n=this._getCommand(t),{name:o,disabled:r,context:l}=t;s.appendChild(i),this.isExist(o)||(this.buttons.push({$el:i,name:o,disabled:r||!1,context:l||this}),n&&this.commands.add(n))})),this.$el.appendChild(s),this}_remove(){return document.body.removeChild(this.$el),this}refresh(t){return this.attr({buttons:t}),this.erase()._paint(t),this}add(t){const e=this.$el,s=document.createDocumentFragment(),o=this.attr("buttons")||[],{name:r,disabled:l,context:a}=t,c=this._getCommand(t),h=t=>{const e=I(t);s.appendChild(e),o.push(t),this.buttons.push({$el:e,name:r,disabled:l||!1,context:a||this,command:c}),c&&this.commands.add(c)};return i(t)?h(t):n(t)&&t.forEach((t=>{i(t)&&h(t)})),e.appendChild(s),this}remove(t){const e=this.$el,s=this.buttons,i=this.get(t);let n=-1;return i?(n=s.indexOf(i),n>-1&&(s.splice(n,1),this.attr("buttons").splice(n,1)),this._disable(t),e.removeChild(i.$el),this):this}_disable(t){const e=this.get(t),s=this.commands.get(t);return!e||e.disabled||(e.disabled=!0,s&&this.commands.del(s),u(e.$el,V)),this}_enable(t){const e=this.get(t),s=this.commands.get(t);return e&&e.disabled?(e.disabled=!1,s&&this.commands.add(s),p(e.$el,V),this):this}disable(t){const e=this.attr("afterDisabled");return t?this._disable(t):(u(this.$el,V),this.removeListeners(),this.disabled=!0,s(e)&&e.call(this)),this}enable(t){const e=this.attr("afterEnabled");return t?this._enable(t):(this.disabled=!1,p(this.$el,V),this.addListeners(),s(e)&&e.call(this)),this}show(t){const e=this.attr("afterOpened"),i=this.get(t),n=this.$el;if(t){if(!i)return this;p(i.$el,F)}else p(n,F),this.closed=!1,s(e)&&o((()=>{e.call(this)}),310);return this}hide(t){const e=this.attr("afterClosed"),i=this.get(t),n=this.$el;if(t){if(!i)return this;u(i.$el,F)}else u(n,F),this.closed=!0,s(e)&&o((()=>{e.call(this)}),310);return this}toggle(t){return this.isClosed()?this.show(t):this.hide(t),this}highlight(t){const e=this.get(t);let s;return e?(s=e.$el,d(s,U)?p(s,U):u(s,U),this):this}destroy(){const t=this.attr("beforeDestroy"),e=this.attr("afterDestroy");return s(t)&&t.call(this),this.commands.clear(),this.removeListeners()._remove()._default(),s(e)&&e.call(this),this}execute(t){return this.isDisabled(t)||this.commands.execute(t),this}onExecute(t){const e=t.delegateTarget;let s="";return e&&(s=e.getAttribute("data-cmd"),s&&this.execute(s)),this}_updateToolbar({top:t,min:e,max:s}){const i=Math.ceil(t);return i<=e?(this.hide("up"),this.show("down")):i>=s?(this.hide("down"),this.show("up")):i>e&&i"string"==typeof t,e=t=>Object.prototype.toString.apply(t),s=t=>"function"==typeof t||"[object Function]"===e(t),i=t=>("[object Object]"===e(t)||"object"==typeof t||s(t))&&null!==t,n=t=>Array.isArray?Array.isArray(t):"[object Array]"===e(t),o=(t,e=300)=>!!s(t)&&setTimeout((()=>{t()}),e),r=(()=>{let t=0;return e=>(t+=1,e?e+"-"+t:"guid-"+t)})(),l=t=>{let e={};return null===t?null:(n(t)?e=Array.from(t):(e=Object.assign({},t),Object.keys(e).forEach((s=>e[s]=i(t[s])?l(t[s]):t[s]))),e)},a=t=>!!(i(t)&&t.nodeName&&t.tagName&&1===t.nodeType),c=t=>{return!(!i(t)||!(a(t)||(t=>!(!i(t)||"[object NodeList]"!==e(t)))(t)||(s=t,i(s)&&"[object DocumentFragment]"===e(s))||(t=>!(!i(t)||!("[object Text]"===e(t)||t.tagName&&3===t.nodeType)))(t)));var s},h=(t,e)=>{const s=Object.prototype.hasOwnProperty;return t&&s.call(t,e)},d=(t,e)=>{const s=new RegExp("(\\s|^)"+e+"(\\s|$)");let i,n;return!!a(t)&&(i=t.className,!!i&&(n=t.classList,n&&n.contains?t.classList.contains(e):!!s.exec(i)))},u=(t,e)=>{var s;let i,n;if(d(t,e))return!1;i=t.classList,null!==(s=i)&&void 0!==s&&s.add?e.indexOf(" ")>-1?e.split(" ").forEach((t=>{i.add(t)})):i.add(e):(n=t.className,n+=n.length>0?" "+e:e,t.className=n)},m=(t,e)=>{if(!t||!i(e))return!1;Object.keys(e).forEach((s=>{const i=e[s];h(e,s)&&((t,e,s)=>{let i=t.tagName.toLowerCase();switch(e){case"style":t.style.cssText=s;break;case"value":"input"===i||"textarea"===i?t.value=s:t.setAttribute(e,s);break;case"htmlFor":t.setAttribute("for",s);break;case"className":u(t,s);break;case"innerHTML":t.innerHTML=s;break;case"innerText":t.innerText=s;break;default:t.setAttribute(e,s)}})(t,s,i)}))},b=(e,s,o)=>{const r=document.createDocumentFragment(),l=document.createElement(e),a=e=>c(e)||t(e),h=e=>{let s;if(!a(e))return!1;c(e)?s=e:t(e)&&(s=document.createTextNode(e)),r.appendChild(s)};return i(s)?m(l,s):n(s)&&s.every((t=>a(t)))?s.forEach((t=>{h(t)})):c(s)?h(s):t(s)&&h(document.createTextNode(s)),n(o)?o.forEach((t=>{h(t)})):h(o),l.appendChild(r),l},p=(e,s)=>{var i;let n,o=e.className;if(!o||!d(e,s))return!1;var r;n=e.classList,null!==(i=n)&&void 0!==i&&i.remove?n.remove(s):(r=o.replace(s,""),o=!!t(r)&&r.replace(/(^\s+)|(\s+$)/g,""),e.className=o)},f=(t,e="")=>{const s=e.replace(/^>/i,"");return!!(e&&s&&t)&&(t.matches?t.matches(s):!!t.msMatchesSelector&&t.msMatchesSelector(s))},y=t=>t.host&&t!==document&&t.host.nodeType?t.host:t.parentNode,v=["focusout","blur","focusin","focus","load","unload","mouseenter","mouseleave"],g=(t,e,s)=>{const i=v.indexOf(e)>-1;s._delegateListener&&delete(s=s._delegateListener)._delegateListener,function(t,e,s){const i=t._listeners;let n=-1;if(i.length<1)return!1;i.forEach(((t,i)=>{const o=t.fn;e===t.type&&(n=i,o===s&&(n=i))})),n>-1&&i.splice(n,1)}(t,e,s),t.removeEventListener(e,s,i)},x=function(e,s,i=!1){const n=t(e)?document.querySelector(e):e,o=n.childNodes,r=((e,s)=>{let i=e._listeners||[];return t(s)&&s&&(i=i.filter((t=>t.type===s))),i})(n,s);r.forEach((t=>{g(n,t.type,t.fn)})),(i||!0===s||1===arguments.length)&&n&&o&&o.forEach((t=>{a(t)&&x(t,s,i)}))},z=(t,e,i)=>{if(!s(i))return x(t,e),!1;g(t,e,i)},M=(t,e,s,i,n,o,r=!1)=>{const l=v.indexOf(s)>-1,a=function(l){const c=function(t){const e=t.target;return(s=e)&&3===s.nodeType?s.parentNode:s;var s}(l),h=((t,e,s,i)=>{const n=s||document;if(!t)return null;do{if(null!=e&&(e.startsWith(">")?t.parentNode===n&&f(t,e):f(t,e))||i&&t===n)return t;if(t===n)break}while(t=y(t))})(c,e,t);let d=o||t;l.delegateTarget=h,!0===o&&(d=n),h&&(!0===r&&z(t,s,a),i.call(d,l,n))};if(!t)return!1;t._listeners||(t._listeners=[]),t._listeners.push({el:t,selector:e,type:s,fn:a,data:n,context:o,capture:l}),i._delegateListener=a,t.addEventListener(s,a,l)};function $(t,e){(null==e||e>t.length)&&(e=t.length);for(var s=0,i=Array(e);s','','','','','','','','','','','','','','','','','','','']),A=(e,s="icon")=>t(e)?((t,e="icon")=>{const s=/id="(.*?)"/,i=/^(\w+)-/;return L.find((n=>{const o=s.exec(n)[1];return i.exec(o)[1]===e&&o===("icon"===e?`${e}-${t}`:`${e}-icon-${t}`)}))})(e,s):w(_,L),E=(e="")=>{const s=document.body;let i=document.querySelector("#outline-icons"),o=[];(e=>{if(!e)return!1;n(e)&&e.length>0?e.forEach((e=>{-1===L.indexOf(e)&&t(e)&&L.push(e)})):t(e)&&L.push(e)})(e),o=A(),i?i.innerHTML=o.join(""):(i=document.createElement("div"),i.innerHTML=``,s.insertBefore(i.firstChild,s.firstChild))};class j{constructor(t,e){this.name=t,s(e)&&(this.action=e)}execute(){return this.action(),this}}class C{constructor(){this.commands=[]}get(t){return this.commands.find((e=>e.name===t))}add(t){return this.commands.push(t),this}del(t){const e=this.commands,s=e.find((e=>e.name===t)),i=s?e.indexOf(s):-1;return i>-1&&e.splice(i,1),this}clear(){return this.commands=[],this}execute(t){const e=this.commands.find((e=>e.name===t));return s(null==e?void 0:e.execute)&&e.execute(),this}}const T={},B=t=>h(T,t)&&T[t].length>0,N=(t,e=!0)=>e?B(t):(t=>{let e=B(t),s=t.lastIndexOf(".");for(;!e&&-1!==s;)s=(t=t.substring(0,s)).lastIndexOf("."),e=B(t);return e})(t),O=(t,s,i=!0)=>{const n=t=>{if(!B(t))return!1;T[t].forEach((t=>{const i=["[object Int8Array]","[object Uint8Array]","[object Uint8ClampedArray]","[object Int16Array]","[object Uint16Array]","[object Int32Array]","[object Uint32Array]","[object Float32Array]","[object Float64Array]","[object BigInt64Array]","[object BigUint64Array]"].indexOf(e(s))>-1?s.toString():s;t.callback.call(t.context||t,i)}))},o=()=>{let e=t,s=t.lastIndexOf(".");for(;-1!==s;)e=e.substring(0,s),s=e.lastIndexOf("."),n(e);n(t),n("*")};if(!N(t))return!1;i?setTimeout(o,10):o()},S=t=>{if(!h(T,t))return!1;delete T[t]},k=(t,e)=>{if(!N(t))return!1;e?(t=>{const e=Object.keys(T);if(!t||e.length<1)return!1;e.forEach((e=>{const s=T[e];let i;s.forEach(((e,n)=>{e.callback!==t&&e.token!==t||(i=e.topic,s.splice(-1,n))})),s.length<1&&S(i)}))})(e):S(t)};class H{constructor(t){this.attrs={},this.name="component",t&&this.initialize(t)}initialize(t){return this.attr(t).render().addListeners(),this}attr(e,s){const n=this.attrs;return t(e)?s&&h(n,e)?(n[e]=s,this):n[e]:i(e)?(o=n,r=e,Object.keys(r).forEach((t=>{h(r,t)&&(o[t]=r[t])})),this):0===arguments.length?n:this;var o,r}render(){return this}refresh(){return this}destroy(){return this.removeListeners(),this}reload(t){let e=this.attr();return t&&(e=this.attr(t)),this.destroy().initialize(e),this}$emit(t,e){return O(t,e),this}$on(t,e){return((t,e,i=null)=>{const n=r();let o="symbol"==typeof t?t.toString():t;s(e)&&(T[o]||(T[o]=[]),T[o].push({topic:o,callback:e,context:i,token:n}))})(t,e,this),this}$off(t,e){return k(t,e),this}addListeners(){return this}removeListeners(){return this}}const D=(e,s={})=>{const i="outline-icon",o=s.size||0,r=s.color||"",l=s.iconSet||"",a=n(o)?o[0]:o,c=n(o)?o[1]:o,h=o?`width:${a}px;height:${c}px;`:"",d=r?h+`color:${r}`:h,u=s.attrs||{},b=document.createElement("i");let p,f="",y="";return t(e)?((e=>{const s=new RegExp("^\\s*(?:<\\?xml[^>]*>\\s*)?(?:<\\!doctype svg[^>]*\\s*(?:\\[?(?:\\s*]*>\\s*)*\\]?)*[^>]*>\\s*)?]*>[^]*<\\/svg>\\s*$\\s*$","i");return t(e)&&s.test(e)})(e)?y=e:(f=l&&"icon"!==l?`xlink:href="#${l}-icon-${e}"`:`xlink:href="#icon-${e}"`,y=``),b.innerHTML=y,u.className?u.className=`${i} ${u.className}`:u.className=i,m(b,u),p=b.querySelector("svg"),m(p,{"aria-hidden":!0,xmlns:"http://www.w3.org/2000/svg",class:"outline-icon__svg",width:200,height:200,style:d}),b):null},I=(t,e=!0)=>{const s=((t,e={})=>D(t,e))(t.icon,{iconSet:t.iconSet||"outline",color:t.color||"",size:t.size}),i=b("a",{className:"outline-toolbar__anchor",href:t.link},s),n=b("div",{className:`outline-toolbar__button ${t.name}`,"data-cmd":t.name},[t.link?i:s]);return u(s,"outline-toolbar__icon"),e&&u(n,"outline-toolbar_rounded"),t.disabled&&u(n,"outline-toolbar_disabled"),n},V="outline-toolbar_disabled",F="outline-toolbar_hidden",U="outline-toolbar_active";class q extends H{constructor(t){super(),this._default(),t&&this.initialize(t)}_default(){return this.attrs=l(q.DEFAULTS),this.disabled=!1,this.closed=!1,this.$el=null,this.buttons=[],this.commands=null,this}initialize(t){let e;return this.attr(t),this.disabled=this.attr("disabled"),this.closed=this.attr("closed"),this.commands=new C,e=this.attr("created"),s(e)&&e.call(this),this.render().addListeners(),this}isHighlight(t){const e=this.get(t);return!!e&&d(e.$el,U)}isDisabled(t){let e;return t?(e=this.get(t),e.disabled):this.disabled}isExist(t){return!!this.get(t)}isClosed(){return this.closed}_getCommand(e){const i=this,{action:n,name:o}=e;let r,l,a=null,c=null;return n?(c=n.handler,r=n.context||this,s(c)?l=c:t(c)&&(l=function(){i.$emit(c,o)}),s(l)&&(a=new j(o,l.bind(r))),a):a}get(t){return this.buttons.find((e=>e.name===t))}render(){const t=this.attr("mounted"),e=this.attr("buttons")||[],i=this.attr("placement");return E(),this.$el=b("div",{id:r("outline-toolbar"),className:`outline-toolbar outline-toolbar_${i}`}),this._paint(e),document.body.appendChild(this.$el),this.closed&&this.hide(),this.disabled&&this.disable(),s(t)&&t.call(this),this}erase(){return this.$el.innerHTML="",this}_paint(t){const e=this.attr("rounded"),s=document.createDocumentFragment();return t.forEach((t=>{const i=I(t,e),n=this._getCommand(t),{name:o,disabled:r,context:l}=t;s.appendChild(i),this.isExist(o)||(this.buttons.push({$el:i,name:o,disabled:r||!1,context:l||this}),n&&this.commands.add(n))})),this.$el.appendChild(s),this}_remove(){return document.body.removeChild(this.$el),this}refresh(t){return this.attr({buttons:t}),this.erase()._paint(t),this}add(t){const e=this.$el,s=document.createDocumentFragment(),o=this.attr("buttons")||[],{name:r,disabled:l,context:a}=t,c=this._getCommand(t),h=t=>{const e=I(t);s.appendChild(e),o.push(t),this.buttons.push({$el:e,name:r,disabled:l||!1,context:a||this,command:c}),c&&this.commands.add(c)};return i(t)?h(t):n(t)&&t.forEach((t=>{i(t)&&h(t)})),e.appendChild(s),this}remove(t){const e=this.$el,s=this.buttons,i=this.get(t);let n=-1;return i?(n=s.indexOf(i),n>-1&&(s.splice(n,1),this.attr("buttons").splice(n,1)),this._disable(t),e.removeChild(i.$el),this):this}_disable(t){const e=this.get(t),s=this.commands.get(t);return!e||e.disabled||(e.disabled=!0,s&&this.commands.del(s),u(e.$el,V)),this}_enable(t){const e=this.get(t),s=this.commands.get(t);return e&&e.disabled?(e.disabled=!1,s&&this.commands.add(s),p(e.$el,V),this):this}disable(t){const e=this.attr("afterDisabled");return t?this._disable(t):(u(this.$el,V),this.removeListeners(),this.disabled=!0,s(e)&&e.call(this)),this}enable(t){const e=this.attr("afterEnabled");return t?this._enable(t):(this.disabled=!1,p(this.$el,V),this.addListeners(),s(e)&&e.call(this)),this}show(t){const e=this.attr("afterOpened"),i=this.get(t),n=this.$el;if(t){if(!i)return this;p(i.$el,F)}else p(n,F),this.closed=!1,s(e)&&o((()=>{e.call(this)}),310);return this}hide(t){const e=this.attr("afterClosed"),i=this.get(t),n=this.$el;if(t){if(!i)return this;u(i.$el,F)}else u(n,F),this.closed=!0,s(e)&&o((()=>{e.call(this)}),310);return this}toggle(t){return this.isClosed()?this.show(t):this.hide(t),this}highlight(t){const e=this.get(t);let s;return e?(s=e.$el,d(s,U)?p(s,U):u(s,U),this):this}destroy(){const t=this.attr("beforeDestroy"),e=this.attr("afterDestroy");return s(t)&&t.call(this),this.commands.clear(),this.removeListeners()._remove()._default(),s(e)&&e.call(this),this}execute(t){return this.isDisabled(t)||this.commands.execute(t),this}onExecute(t){const e=t.delegateTarget;let s="";return e&&(s=e.getAttribute("data-cmd"),s&&this.execute(s)),this}_updateToolbar({top:t,min:e,max:s}){const i=Math.ceil(t);return i<=e?(this.hide("up"),this.show("down")):i>=s?(this.hide("down"),this.show("up")):i>e&&i {\r\n return typeof str === 'string'\r\n}\r\n\r\nexport default isString\r\n","/**\r\n * Object 对象原型上的 toString 方法\r\n * ========================================================================\r\n * @method toString\r\n * @param {*} val\r\n * @returns {string}\r\n */\r\nconst toString = (val) => {\r\n return Object.prototype.toString.apply(val)\r\n}\r\n\r\nexport default toString\r\n","import toString from '@/utils/lang/toString'\r\n\r\n/**\r\n * 检测测试数据是否为 Function 类型\r\n * ========================================================================\r\n * @method isFunction\r\n * @param {*} val - (必须)待检测的数据\r\n * @returns {boolean} 'val' 是 Function 类型返回 true,否则返回 false\r\n */\r\nconst isFunction = (val) => {\r\n return typeof val === 'function' || toString(val) === '[object Function]'\r\n}\r\n\r\nexport default isFunction\r\n","import toString from '../lang/toString'\r\nimport isFunction from './isFunction'\r\n\r\n/**\r\n * 检测数据是否为 Object 类型\r\n * ========================================================================\r\n * @method isObject\r\n * @param {*} o\r\n * @returns {boolean}\r\n */\r\nconst isObject = (o) => {\r\n return (\r\n (toString(o) === '[object Object]' ||\r\n typeof o === 'object' ||\r\n isFunction(o)) &&\r\n o !== null\r\n )\r\n}\r\n\r\nexport default isObject\r\n","import toString from '@/utils/lang/toString'\r\n\r\n/**\r\n * 检测数据是否为 Array 类型\r\n * ========================================================================\r\n * @method isArray\r\n * @param {*} o\r\n * @returns {boolean}\r\n */\r\nconst isArray = (o) => {\r\n if (Array.isArray) {\r\n return Array.isArray(o)\r\n } else {\r\n return toString(o) === '[object Array]'\r\n }\r\n}\r\n\r\nexport default isArray\r\n","import isFunction from '@/utils/types/isFunction'\r\n\r\n/**\r\n * later - 延迟执行方法\r\n * ========================================================================\r\n * @method later\r\n * @param {Function} fn\r\n * @param {Number} [delay]\r\n * @returns {number|boolean}\r\n */\r\nconst later = (fn, delay = 300) => {\r\n if (!isFunction(fn)) {\r\n return false\r\n }\r\n\r\n return setTimeout(() => {\r\n fn()\r\n }, delay)\r\n}\r\n\r\nexport default later\r\n","/**\r\n * 生成唯一 id 字符串的函数\r\n * ========================================================================\r\n * @method guid\r\n * @param {String} [prefix] - 生成 id 的前缀字符串\r\n * @return {String} 返回一个表示唯一 id 的字符串\r\n */\r\nconst guid = (() => {\r\n let uuid = 0\r\n\r\n return (prefix) => {\r\n uuid += 1\r\n\r\n return prefix ? prefix + '-' + uuid : 'guid-' + uuid\r\n }\r\n})()\r\n\r\nexport default guid\r\n","import isObject from '@/utils/types/isObject'\r\nimport isArray from '@/utils/types/isArray'\r\n\r\n/**\r\n * 深拷贝对象函数\r\n * ========================================================================\r\n * @methods cloneDeep\r\n * @param {Object} obj - 深拷贝的对象\r\n * @returns {Array|Object|*}\r\n *\r\n * @example\r\n * const arr = cloneDeep([2,3,4,6])\r\n * => [2,3,4,6]\r\n */\r\nconst cloneDeep = (obj) => {\r\n let clone = {}\r\n\r\n if (obj === null) {\r\n return null\r\n }\r\n\r\n if (isArray(obj)) {\r\n clone = Array.from(obj)\r\n } else {\r\n clone = Object.assign({}, obj)\r\n Object.keys(clone).forEach((key) => {\r\n return (clone[key] = isObject(obj[key]) ? cloneDeep(obj[key]) : obj[key])\r\n })\r\n }\r\n\r\n return clone\r\n}\r\n\r\nexport default cloneDeep\r\n","import isObject from './isObject'\r\n\r\n/**\r\n * 检测数据是否为 HTMLElement DOM 节点\r\n * ========================================================================\r\n * @method isElement\r\n * @param {*} o\r\n * @returns {boolean}\r\n */\r\nconst isElement = (o) => {\r\n return !!(isObject(o) && o.nodeName && o.tagName && o.nodeType === 1)\r\n}\r\n\r\nexport default isElement\r\n","import isObject from './isObject'\r\nimport isElement from './isElement'\r\nimport isHTMLCollection from './isHTMLCollection'\r\nimport isFragment from './isFragment'\r\nimport isTextNode from './isTextNode'\r\n\r\nconst isDOM = (el) => {\r\n return !!(\r\n isObject(el) &&\r\n (isElement(el) || isHTMLCollection(el) || isFragment(el) || isTextNode(el))\r\n )\r\n}\r\n\r\nexport default isDOM\r\n","import toString from '@/utils/lang/toString'\r\nimport isObject from './isObject'\r\n\r\nconst isHTMLCollection = (el) => {\r\n return !!(isObject(el) && toString(el) === '[object NodeList]')\r\n}\r\n\r\nexport default isHTMLCollection\r\n","import toString from '@/utils/lang/toString'\r\nimport isObject from './isObject'\r\n\r\nconst isFragment = (fragment) => {\r\n return !!(\r\n isObject(fragment) && toString(fragment) === '[object DocumentFragment]'\r\n )\r\n}\r\n\r\nexport default isFragment\r\n","import toString from '@/utils/lang/toString'\r\nimport isObject from './isObject'\r\n\r\nconst isTextNode = (el) => {\r\n return !!(\r\n isObject(el) &&\r\n (toString(el) === '[object Text]' || (el.tagName && el.nodeType === 3))\r\n )\r\n}\r\n\r\nexport default isTextNode\r\n","/**\r\n * 检测对象自身属性中是否具有指定的属性。\r\n * ========================================================================\r\n * @method hasOwn\r\n * @param {Object} obj - (必须)检测的目标对象\r\n * @param {String} prop - (必须)属性名\r\n * @returns {Boolean}\r\n */\r\nconst hasOwn = (obj, prop) => {\r\n const hasOwnProperty = Object.prototype.hasOwnProperty\r\n return obj && hasOwnProperty.call(obj, prop)\r\n}\r\n\r\nexport default hasOwn\r\n","import isElement from '../types/isElement'\r\n/**\r\n * 检测 DOM 节点是否包含名为 className 的样式\r\n * ========================================================================\r\n * @method hasClass\r\n * @param {HTMLElement} el - DOM 节点\r\n * @param {String} className - 样式名称\r\n * @returns {Boolean}\r\n */\r\nconst hasClass = (el, className) => {\r\n const pattern = new RegExp('(\\\\s|^)' + className + '(\\\\s|$)')\r\n let allClass\r\n let classList\r\n\r\n if (!isElement(el)) {\r\n return false\r\n }\r\n\r\n allClass = el.className\r\n\r\n if (!allClass) {\r\n return false\r\n }\r\n\r\n classList = el.classList\r\n\r\n if (classList && classList.contains) {\r\n return el.classList.contains(className)\r\n }\r\n\r\n return !!pattern.exec(allClass)\r\n}\r\n\r\nexport default hasClass\r\n","import hasClass from './hasClass'\r\n\r\n/**\r\n * 给 DOM 节点添加名为 className 的样式\r\n * ========================================================================\r\n * @method addClass\r\n * @param {HTMLElement} el - DOM 节点\r\n * @param {String} className - 样式名称\r\n * @returns {Boolean}\r\n */\r\nconst addClass = (el, className) => {\r\n let classList\r\n let allClass\r\n\r\n if (hasClass(el, className)) {\r\n return false\r\n }\r\n\r\n classList = el.classList\r\n\r\n if (classList?.add) {\r\n if (className.indexOf(' ') > -1) {\r\n className.split(' ').forEach((name) => {\r\n classList.add(name)\r\n })\r\n } else {\r\n classList.add(className)\r\n }\r\n } else {\r\n allClass = el.className\r\n allClass += allClass.length > 0 ? ' ' + className : className\r\n el.className = allClass\r\n }\r\n}\r\n\r\nexport default addClass\r\n","import isObject from '../types/isObject'\r\nimport hasOwn from '../lang/hasOwn'\r\nimport setAttribute from './setAttribute'\r\n\r\nconst setAttributes = (el, attrs) => {\r\n if (!el || !isObject(attrs)) {\r\n return false\r\n }\r\n\r\n Object.keys(attrs).forEach((attr) => {\r\n const value = attrs[attr]\r\n if (hasOwn(attrs, attr)) {\r\n setAttribute(el, attr, value)\r\n }\r\n })\r\n}\r\n\r\nexport default setAttributes\r\n","import addClass from './addClass.js'\r\n\r\n/**\r\n * 给 DOM 节点设置属性/值\r\n * ========================================================================\r\n * @method setAttribute\r\n * @param {HTMLElement} el - DOM 节点\r\n * @param {String} attr - 属性名称\r\n * @param {String|Number|Boolean} value - 属性值\r\n */\r\nconst setAttribute = (el, attr, value) => {\r\n let tagName = el.tagName.toLowerCase()\r\n\r\n switch (attr) {\r\n case 'style':\r\n el.style.cssText = value\r\n break\r\n case 'value':\r\n if (tagName === 'input' || tagName === 'textarea') {\r\n el.value = value\r\n } else {\r\n el.setAttribute(attr, value)\r\n }\r\n break\r\n case 'htmlFor':\r\n el.setAttribute('for', value)\r\n break\r\n case 'className':\r\n addClass(el, value)\r\n break\r\n case 'innerHTML':\r\n el.innerHTML = value\r\n break\r\n case 'innerText':\r\n el.innerText = value\r\n break\r\n default:\r\n el.setAttribute(attr, value)\r\n break\r\n }\r\n}\r\n\r\nexport default setAttribute\r\n","import isObject from '../types/isObject'\r\nimport isString from '../types/isString'\r\nimport isArray from '../types/isArray'\r\nimport isDOM from '../types/isDOM'\r\nimport setAttributes from './setAttributes'\r\n\r\n/**\r\n * 创建 DOM 节点,并添加属性和子节点\r\n * ========================================================================\r\n * @method createElement\r\n * @param {String} tagName - 标签名称\r\n * @param {Object|Array|HTMLElement|DocumentFragment|String} attrs - 属性对象或者子节点\r\n * @param {Array|HTMLElement|DocumentFragment|String} [children] - 子节点数组\r\n * @returns {HTMLElement}\r\n */\r\nconst createElement = (tagName, attrs, children) => {\r\n const $fragment = document.createDocumentFragment()\r\n const $el = document.createElement(tagName)\r\n const isValidChild = (child) => {\r\n return isDOM(child) || isString(child)\r\n }\r\n const append = (child) => {\r\n let $child\r\n\r\n if (!isValidChild(child)) {\r\n return false\r\n }\r\n\r\n if (isDOM(child)) {\r\n $child = child\r\n } else if (isString(child)) {\r\n $child = document.createTextNode(child)\r\n }\r\n\r\n $fragment.appendChild($child)\r\n }\r\n\r\n if (isObject(attrs)) {\r\n setAttributes($el, attrs)\r\n } else if (isArray(attrs) && attrs.every((attr) => isValidChild(attr))) {\r\n attrs.forEach((child) => {\r\n append(child)\r\n })\r\n } else if (isDOM(attrs)) {\r\n append(attrs)\r\n } else if (isString(attrs)) {\r\n append(document.createTextNode(attrs))\r\n }\r\n\r\n if (isArray(children)) {\r\n children.forEach((child) => {\r\n append(child)\r\n })\r\n } else {\r\n append(children)\r\n }\r\n\r\n $el.appendChild($fragment)\r\n\r\n return $el\r\n}\r\n\r\nexport default createElement\r\n","import trim from '../lang/trim'\r\nimport hasClass from './hasClass'\r\n\r\n/**\r\n * 移除 DOM 节点的 className 样式\r\n * ========================================================================\r\n * @method removeClass\r\n * @param {HTMLElement} el - DOM 节点\r\n * @param {String} className - 样式名称\r\n * @returns {Boolean}\r\n */\r\nconst removeClass = (el, className) => {\r\n let allClass = el.className\r\n let classList\r\n\r\n if (!allClass || !hasClass(el, className)) {\r\n return false\r\n }\r\n\r\n classList = el.classList\r\n\r\n if (classList?.remove) {\r\n classList.remove(className)\r\n } else {\r\n allClass = trim(allClass.replace(className, ''))\r\n el.className = allClass\r\n }\r\n}\r\n\r\nexport default removeClass\r\n","import isString from '@/utils/types/isString'\r\n\r\n/**\r\n * 清楚字符串起始位置所有的空格\r\n * ========================================================================\r\n * @method trim\r\n * @param {string} str\r\n * @returns {string|Boolean}\r\n */\r\nconst trim = (str) => {\r\n if (!isString(str)) {\r\n return false\r\n }\r\n return str.replace(/(^\\s+)|(\\s+$)/g, '')\r\n}\r\n\r\nexport default trim\r\n","/**\r\n * 获取 options 节点下匹配 selector 选择器的 DOM 节点\r\n * ========================================================================\r\n * Element.matches() 方法可以用来判断 DOM 元素是否与给定的选择器匹配,事件代理判断是\r\n * 否触发绑定的代理事件回调函数,关键就是使用 Element.matches() 辨别当前事件触发的目\r\n * 标 DOM 元素是否为事件代理所期望触发的目标。\r\n * ========================================================================\r\n * @method matches\r\n * @see https://developer.mozilla.org/en-US/docs/web/api/element/matches\r\n * @param {HTMLElement} el - (必须)DOM 元素\r\n * @param {String} selector - (必须)匹配 DOM 元素的选择器\r\n * @returns {Boolean}\r\n */\r\nconst matches = (el, selector = '') => {\r\n const sel = selector.replace(/^>/i, '')\r\n\r\n if (!selector || !sel || !el) {\r\n return false\r\n }\r\n\r\n /* istanbul ignore else */\r\n if (el.matches) {\r\n return el.matches(sel)\r\n } else if (el.msMatchesSelector) {\r\n return el.msMatchesSelector(sel)\r\n } else {\r\n return false\r\n }\r\n}\r\n\r\nexport default matches\r\n","/**\r\n * 获取 DOM 元素的父节点\r\n * ========================================================================\r\n * @method getParentOrHost\r\n * @param {*|HTMLElement} el - (必须)要获取父节点的 DOM 元素\r\n * @returns {*|HTMLElement}\r\n */\r\nconst getParentOrHost = (el) => {\r\n return el.host && el !== document && el.host.nodeType\r\n ? el.host\r\n : el.parentNode\r\n}\r\n\r\nexport default getParentOrHost\r\n","export const CAPTURE_EVENTS = [\r\n 'focusout',\r\n 'blur',\r\n 'focusin',\r\n 'focus',\r\n 'load',\r\n 'unload',\r\n 'mouseenter',\r\n 'mouseleave'\r\n]\r\n","import { CAPTURE_EVENTS } from './enum'\r\nimport _delete from './_delete'\r\n\r\n/**\r\n * (私有方法)取消 type 类型的代理事件绑定\r\n * ========================================================================\r\n * 如果没有设置 handler,则销毁 this.$options 绑定的所有符合 type 事件类型的事件绑定\r\n * ========================================================================\r\n * @method _off\r\n * @param {HTMLElement} el - (必须)取消事件绑定的 DOM 元素\r\n * @param {String} type - (必须)事件类型\r\n * @param {Function} fn - (必须)事件处理器回调函数\r\n * @private\r\n */\r\nconst _off = (el, type, fn) => {\r\n const capture = CAPTURE_EVENTS.indexOf(type) > -1\r\n\r\n /* istanbul ignore else */\r\n if (fn._delegateListener) {\r\n fn = fn._delegateListener\r\n delete fn._delegateListener\r\n }\r\n\r\n // 移除缓存的 _listeners 数据\r\n _delete(el, type, fn)\r\n\r\n el.removeEventListener(type, fn, capture)\r\n}\r\n\r\nexport default _off\r\n","/**\r\n * 删除 DOM 元素缓存的 _listeners 数据\r\n * ========================================================================\r\n * @method _delete\r\n * @param {HTMLElement} el - 要删除 listener 的 DOM 元素\r\n * @param {String} type - 事件类型(名称)\r\n * @param {Function} [fn] - 事件处理器回调函数\r\n */\r\nconst _delete = function (el, type, fn) {\r\n const listeners = el._listeners\r\n let index = -1\r\n\r\n if (listeners.length < 1) {\r\n return false\r\n }\r\n\r\n // 移除缓存的 _listeners 数据\r\n listeners.forEach((listener, i) => {\r\n const handler = listener.fn\r\n\r\n if (type === listener.type) {\r\n index = i\r\n\r\n if (handler === fn) {\r\n index = i\r\n }\r\n }\r\n })\r\n\r\n /* istanbul ignore else */\r\n if (index > -1) {\r\n listeners.splice(index, 1)\r\n }\r\n}\r\n\r\nexport default _delete\r\n","import isString from '@/utils/types/isString'\r\nimport isElement from '@/utils/types/isElement'\r\nimport getListeners from './getListeners'\r\nimport _off from './_off'\r\n\r\n/**\r\n * 销毁(type 类型的)代理事件绑定\r\n * ========================================================================\r\n * 1. 设置了事件类型 type,则销毁指定类型的事件绑定,否则清除所有代理事件绑定\r\n * 2. recurse 设置为 true,递归销毁子节点全部事件绑定\r\n * ========================================================================\r\n * @method purgeElement\r\n * @param {HTMLElement|String} el - (必须)DOM 元素或者其选择器\r\n * @param {String|Boolean} type - (必须)事件类型\r\n * @param {Boolean} [recurse] - (可选)是否递归销毁子节点所有事件绑定\r\n */\r\nconst purgeElement = function (el, type, recurse = false) {\r\n const $element = isString(el) ? document.querySelector(el) : el\r\n const $children = $element.childNodes\r\n const listeners = getListeners($element, type)\r\n\r\n listeners.forEach((listener) => {\r\n _off($element, listener.type, listener.fn)\r\n })\r\n\r\n if (\r\n (recurse || type === true || arguments.length === 1) &&\r\n $element &&\r\n $children\r\n ) {\r\n $children.forEach(($child) => {\r\n if (isElement($child)) {\r\n purgeElement($child, type, recurse)\r\n }\r\n })\r\n }\r\n}\r\n\r\nexport default purgeElement\r\n","import isString from '@/utils/types/isString'\r\n\r\n/**\r\n * 获取 DOM 元素(type 事件类型)事件绑定信息\r\n * ========================================================================\r\n * 如果设置了事件类型 type, 则返回指定类型的事件绑定信息,否则返回所有事件绑定信息\r\n * ========================================================================\r\n * @methods getListeners\r\n * @param {HTMLElement} el - (必须)要获取事件绑定信息的 DOM 元素\r\n * @param {String} [type] - (可选)事件类型\r\n * @returns {Array} - 已绑定的事件信息\r\n */\r\nconst getListeners = (el, type) => {\r\n let listeners = el._listeners || []\r\n\r\n if (isString(type) && type) {\r\n listeners = listeners.filter((listener) => {\r\n return listener.type === type\r\n })\r\n }\r\n\r\n return listeners\r\n}\r\n\r\nexport default getListeners\r\n","import purgeElement from './purgeElement'\r\nimport isFunction from '../types/isFunction'\r\nimport _off from './_off'\r\n\r\n/**\r\n * 取消 type 类型的代理事件绑定\r\n * ========================================================================\r\n * 如果没有设置 handler,则销毁 this.$options 绑定的所有符合 type 事件类型的事件绑定\r\n * ========================================================================\r\n * @method off\r\n * @param {HTMLElement|Object} el - (必须)取消事件绑定的 DOM 元素\r\n * @param {String} type - (必须)事件类型\r\n * @param {Function} [fn] - (可选)事件处理器回调函数\r\n */\r\nconst off = (el, type, fn) => {\r\n // 如果不设置 fn 参数,默认清除 el 元素上绑定的所有事件处理器\r\n if (!isFunction(fn)) {\r\n purgeElement(el, type)\r\n return false\r\n }\r\n\r\n _off(el, type, fn)\r\n}\r\n\r\nexport default off\r\n","import closest from '@/utils/dom/closest'\r\nimport off from './off'\r\nimport getTarget from './getTarget'\r\n\r\nimport { CAPTURE_EVENTS } from './enum'\r\n\r\n/**\r\n * 绑定代理事件\r\n * ========================================================================\r\n * @method on\r\n * @param {HTMLElement|String|Object} el - (必须)绑定代理事件的 DOM 节点\r\n * @param {String} selector - (必须)事件代理目标 DOM 元素的选择器\r\n * @param {String|Function} type - (必须)事件类型或者事件处理器回调函数\r\n * @param {Function|Object} fn - (可选) 事件处理器回调函数或者传递给事件处理器回调函数的数据对象\r\n * @param {Object|Boolean} [data] - (可选)传递给事件处理器回调函数的数据对象或者事件处理器回调函数的 this 上下文指向,\r\n * @param {Object|Boolean} [context] - (可选)事件处理器回调函数的 this 上下文指向,或者是否仅触发一次\r\n * 当设置为 true 时,则事件处理器回调函数的 this 上下文指向为 data 对象\r\n * @param {Boolean} once - (可选)是否仅触发一次\r\n */\r\nconst on = (el, selector, type, fn, data, context, once = false) => {\r\n // CAPTURE_EVENTS 中的特殊事件,采用事件捕获模型\r\n const capture = CAPTURE_EVENTS.indexOf(type) > -1\r\n\r\n const listener = function (evt) {\r\n const target = getTarget(evt)\r\n // 通过 Element.matches 方法获得点击的目标元素\r\n const delegateTarget = closest(target, selector, el)\r\n let overrideContext = context || el\r\n\r\n evt.delegateTarget = delegateTarget\r\n\r\n // 当设置为 true 时,则事件处理器回调函数的\r\n // this 上下文指向为 data 对象\r\n if (context === true) {\r\n overrideContext = data\r\n }\r\n\r\n /* istanbul ignore else */\r\n if (delegateTarget) {\r\n // 仅触发一次\r\n /* istanbul ignore else */\r\n if (once === true) {\r\n off(el, type, listener)\r\n }\r\n\r\n fn.call(overrideContext, evt, data)\r\n }\r\n }\r\n\r\n if (!el) {\r\n return false\r\n }\r\n\r\n if (!el._listeners) {\r\n el._listeners = []\r\n }\r\n\r\n // 缓存 options 元素绑定的事件处理器\r\n el._listeners.push({\r\n el,\r\n selector,\r\n type,\r\n fn: listener,\r\n data,\r\n context,\r\n capture\r\n })\r\n\r\n // 缓存包装后的事件处理器\r\n fn._delegateListener = listener\r\n\r\n el.addEventListener(type, listener, capture)\r\n}\r\n\r\nexport default on\r\n","import resolveTextNode from '@/utils/dom/resolveTextNode'\r\n\r\n/**\r\n * 返回触发事件的 target DOM 元素\r\n * ========================================================================\r\n * @method getTarget\r\n * @param {Event} evt - Event 对象\r\n * @return {HTMLElement} - Event 对象的 target DOM 元素\r\n */\r\nconst getTarget = function (evt) {\r\n const target = evt.target\r\n\r\n return resolveTextNode(target)\r\n}\r\n\r\nexport default getTarget\r\n","/**\r\n * 在某些情况下,某些浏览器(例如:Safari 浏览器)会返回实际的目标元素内部的文本节点。\r\n * resolveTextNode() 方法则会返回实际的目标节点。\r\n * ========================================================================\r\n * @method resolveTextNode\r\n * @param {HTMLElement|Text} el - 要解析的节点\r\n * @return {*|HTMLElement} - 实际的目标 DOM 节点\r\n */\r\nconst resolveTextNode = function (el) {\r\n if (el && el.nodeType === 3) {\r\n return el.parentNode\r\n }\r\n\r\n return el\r\n}\r\n\r\nexport default resolveTextNode\r\n","import matches from './matches'\r\nimport getParentOrHost from './getParentOrHost'\r\n\r\n/**\r\n * 获取 options 元素父元素最近的包含 selector 选择器的元素\r\n * ========================================================================\r\n * @method closest\r\n * @param {HTMLElement} el - (必须)DOM 元素\r\n * @param {String} selector - (必须)DOM 元素的选择其\r\n * @param {HTMLElement} [ctx] - (必须)比对的 DOM 元素\r\n * @param {Boolean} [includeCTX] - (必须)是否包含 context DOM 元素\r\n * @returns {null|HTMLElement} - 返回最接近的 DOM 元素\r\n */\r\nconst closest = (el, selector, ctx, includeCTX) => {\r\n const context = ctx || document\r\n\r\n if (!el) {\r\n return null\r\n }\r\n\r\n do {\r\n /* istanbul ignore else */\r\n if (\r\n (selector != null &&\r\n (selector.startsWith('>')\r\n ? el.parentNode === context && matches(el, selector)\r\n : matches(el, selector))) ||\r\n (includeCTX && el === context)\r\n ) {\r\n return el\r\n }\r\n\r\n /* istanbul ignore else */\r\n if (el === context) {\r\n break\r\n }\r\n\r\n /* jshint boss:true */\r\n } while ((el = getParentOrHost(el)))\r\n}\r\n\r\nexport default closest\r\n","const DEFAULTS = [\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n ''\r\n]\r\n\r\nexport default DEFAULTS\r\n","import DEFAULTS from './defaults'\r\n\r\nconst SYMBOLS = [...DEFAULTS]\r\n\r\nexport default SYMBOLS\r\n","import isString from '@/utils/types/isString'\r\nimport getSymbol from './getSymbol'\r\nimport SYMBOLS from './symbols'\r\n\r\n/**\r\n *\r\n * @method getSymbols\r\n * @param {String} [name]\r\n * @param {String} [iconSet]\r\n * @returns {string[]|*}\r\n */\r\nconst getSymbols = (name, iconSet = 'icon') => {\r\n if (isString(name)) {\r\n return getSymbol(name, iconSet)\r\n }\r\n\r\n return [...SYMBOLS]\r\n}\r\n\r\nexport default getSymbols\r\n","import SYMBOLS from './symbols'\r\n\r\n/**\r\n * @method getSymbol\r\n * @param {String} name\r\n * @param {String} [iconSet]\r\n * @returns {String}\r\n */\r\nconst getSymbol = (name, iconSet = 'icon') => {\r\n const patternName = /id=\"(.*?)\"/\r\n const patternSet = /^(\\w+)-/\r\n const symbols = SYMBOLS\r\n\r\n return symbols.find((symbol) => {\r\n const names = patternName.exec(symbol)\r\n const fullName = names[1]\r\n const sets = patternSet.exec(fullName)\r\n const setName = sets[1]\r\n const iconName =\r\n iconSet === 'icon' ? `${iconSet}-${name}` : `${iconSet}-icon-${name}`\r\n\r\n return setName === iconSet && fullName === iconName\r\n })\r\n}\r\n\r\nexport default getSymbol\r\n","import add from './add'\r\nimport getSymbols from './getSymbols'\r\n\r\n/**\r\n * 绘制 SVG 图标集\r\n * ========================================================================\r\n * @method paint\r\n * @param {String|Array} symbol\r\n */\r\nconst paint = (symbol = '') => {\r\n const $body = document.body\r\n let $icons = document.querySelector('#outline-icons')\r\n let symbols = []\r\n\r\n add(symbol)\r\n symbols = getSymbols()\r\n\r\n if ($icons) {\r\n $icons.innerHTML = symbols.join('')\r\n } else {\r\n $icons = document.createElement('div')\r\n $icons.innerHTML =\r\n ``\r\n $body.insertBefore($icons.firstChild, $body.firstChild)\r\n }\r\n}\r\n\r\nexport default paint\r\n","import isArray from '@/utils/types/isArray'\r\nimport isString from '@/utils/types/isString'\r\nimport SYMBOLS from './symbols'\r\n\r\n/**\r\n * @method add\r\n * @param {Array|String} symbols\r\n * @return {Boolean}\r\n */\r\nconst add = (symbols) => {\r\n if (!symbols) {\r\n return false\r\n }\r\n\r\n if (isArray(symbols) && symbols.length > 0) {\r\n symbols.forEach((symbol) => {\r\n /* istanbul ignore else */\r\n if (SYMBOLS.indexOf(symbol) === -1 && isString(symbol)) {\r\n SYMBOLS.push(symbol)\r\n }\r\n })\r\n } else {\r\n /* istanbul ignore else */\r\n if (isString(symbols)) {\r\n SYMBOLS.push(symbols)\r\n }\r\n }\r\n}\r\n\r\nexport default add\r\n","import isFunction from './utils/types/isFunction'\r\n\r\nclass Command {\r\n constructor(name, action) {\r\n this.name = name\r\n\r\n if (isFunction(action)) {\r\n this.action = action\r\n }\r\n }\r\n\r\n execute() {\r\n this.action()\r\n\r\n return this\r\n }\r\n}\r\n\r\nexport default Command\r\n","import isFunction from './utils/types/isFunction'\r\n\r\nclass Commands {\r\n constructor() {\r\n this.commands = []\r\n }\r\n\r\n get(name) {\r\n return this.commands.find((cmd) => cmd.name === name)\r\n }\r\n\r\n add(command) {\r\n this.commands.push(command)\r\n\r\n return this\r\n }\r\n\r\n del(name) {\r\n const commands = this.commands\r\n const command = commands.find((cmd) => cmd.name === name)\r\n const index = command ? commands.indexOf(command) : -1\r\n\r\n if (index > -1) {\r\n commands.splice(index, 1)\r\n }\r\n\r\n return this\r\n }\r\n\r\n clear() {\r\n this.commands = []\r\n\r\n return this\r\n }\r\n\r\n execute(name) {\r\n const command = this.commands.find((cmd) => cmd.name === name)\r\n\r\n if (isFunction(command?.execute)) {\r\n command.execute()\r\n }\r\n\r\n return this\r\n }\r\n}\r\n\r\nexport default Commands\r\n","import hasOwn from './hasOwn'\r\n\r\n/**\r\n * 扩展对象\r\n * ========================================================================\r\n * @method extend\r\n * @param {Object} origin\r\n * @param {Object} source\r\n */\r\nconst extend = (origin, source) => {\r\n const keys = Object.keys(source)\r\n\r\n keys.forEach((prop) => {\r\n if (hasOwn(source, prop)) {\r\n origin[prop] = source[prop]\r\n }\r\n })\r\n}\r\n\r\nexport default extend\r\n","/**\r\n * 存储订阅者(主题和处理器的)私有对象\r\n * ========================================================================\r\n * @type {{}}\r\n * @private\r\n */\r\nconst _subscribers = {}\r\n\r\nexport default _subscribers\r\n","import hasOwn from '@/utils/lang/hasOwn'\r\nimport _subscribers from './_subscribers'\r\n\r\n/**\r\n * 判断是否存在与给定 topic 完全匹配的订阅者信息\r\n * ========================================================================\r\n * @method _hasDirectSubscribersFor\r\n * @param {String} topic - (必须)订阅主题字符串\r\n * @returns {Boolean}\r\n */\r\nconst _hasDirectSubscribersFor = (topic) => {\r\n return hasOwn(_subscribers, topic) && _subscribers[topic].length > 0\r\n}\r\n\r\nexport default _hasDirectSubscribersFor\r\n","import _hasDirectSubscribersFor from './_hasDirectSubscribersFor'\r\nimport _hasSubscribers from './_hasSubscribers'\r\n\r\n/**\r\n * 判断是否存在包含 topic 指定的订阅者信息\r\n * ========================================================================\r\n * @method has\r\n * @param {String} topic - (必须)主题名称\r\n * @param {Boolean} [isDirect] - (可选)是否为直接的主题,默认值:true\r\n * @returns {Boolean}\r\n */\r\nconst has = (topic, isDirect = true) => {\r\n return isDirect ? _hasDirectSubscribersFor(topic) : _hasSubscribers(topic)\r\n}\r\n\r\nexport default has\r\n","import _hasDirectSubscribersFor from './_hasDirectSubscribersFor'\r\n\r\n/**\r\n * 判断是否存在包含给定 topic 相关的订阅者信息\r\n * ========================================================================\r\n * @method _hasSubscribers\r\n * @param {String} topic - (必须)订阅主题字符串\r\n * @returns {Boolean}\r\n */\r\nconst _hasSubscribers = (topic) => {\r\n let found = _hasDirectSubscribersFor(topic)\r\n let position = topic.lastIndexOf('.')\r\n\r\n while (!found && position !== -1) {\r\n topic = topic.substring(0, position)\r\n position = topic.lastIndexOf('.')\r\n found = _hasDirectSubscribersFor(topic)\r\n }\r\n\r\n return found\r\n}\r\n\r\nexport default _hasSubscribers\r\n","import isTypedArray from '@/utils/types/isTypedArray'\r\nimport has from './has'\r\nimport _hasDirectSubscribersFor from './_hasDirectSubscribersFor'\r\nimport _subscribers from './_subscribers'\r\n\r\n/**\r\n * (异步)发布订阅主题信息\r\n * ========================================================================\r\n * 主题默认是异步发布的。确保在消费者处理主题时,主题的发起者不会被阻止。\r\n * ========================================================================\r\n * @method emit\r\n * @param {String} topic - (必须)主题名称\r\n * @param {Object} [data] - (可选)数据对象\r\n * @param {Boolean} [async] - (可选) 是否异步发布\r\n */\r\nconst emit = (topic, data, async = true) => {\r\n const execute = (topic) => {\r\n if (!_hasDirectSubscribersFor(topic)) {\r\n return false\r\n }\r\n\r\n _subscribers[topic].forEach((subscriber) => {\r\n // 针对 mqtt 消息服务返回的 Uint8Array 类似的 typed arrays 格式的数据\r\n // 采用 toString() 方法转化为普通(JSON)字符串\r\n const message = isTypedArray(data) ? data.toString() : data\r\n\r\n subscriber.callback.call(subscriber.context || subscriber, message)\r\n })\r\n }\r\n const deliver = () => {\r\n let subscriber = topic\r\n let position = topic.lastIndexOf('.')\r\n\r\n while (position !== -1) {\r\n subscriber = subscriber.substring(0, position)\r\n position = subscriber.lastIndexOf('.')\r\n\r\n execute(subscriber)\r\n }\r\n\r\n // 执行 topic 对应的处理器\r\n execute(topic)\r\n // 执行特殊 topic:'*'(监听全部消息的发布)\r\n execute('*')\r\n }\r\n\r\n if (!has(topic)) {\r\n return false\r\n }\r\n\r\n if (async) {\r\n setTimeout(deliver, 10)\r\n } else {\r\n deliver()\r\n }\r\n}\r\n\r\nexport default emit\r\n","import toString from '@/utils/lang/toString'\r\n/**\r\n * 判断检测数据是否为 Typed Arrays 类型的数据\r\n * ========================================================================\r\n * @param {*} val\r\n * @returns {boolean}\r\n */\r\nconst isTypedArray = (val) => {\r\n const TYPES = [\r\n '[object Int8Array]',\r\n '[object Uint8Array]',\r\n '[object Uint8ClampedArray]',\r\n '[object Int16Array]',\r\n '[object Uint16Array]',\r\n '[object Int32Array]',\r\n '[object Uint32Array]',\r\n '[object Float32Array]',\r\n '[object Float64Array]',\r\n '[object BigInt64Array]',\r\n '[object BigUint64Array]'\r\n ]\r\n\r\n return TYPES.indexOf(toString(val)) > -1\r\n}\r\n\r\nexport default isTypedArray\r\n","import hasOwn from '@/utils/lang/hasOwn'\r\nimport _subscribers from './_subscribers'\r\n\r\n/**\r\n * 删除与给定 topic 相同的订阅者信息\r\n * ========================================================================\r\n * @method _removeSubscriber\r\n * @param {String} topic - (必须)订阅主题字符串\r\n * @returns {Boolean}\r\n */\r\nconst _removeSubscriber = (topic) => {\r\n if (!hasOwn(_subscribers, topic)) {\r\n return false\r\n }\r\n\r\n delete _subscribers[topic]\r\n}\r\n\r\nexport default _removeSubscriber\r\n","import has from './has'\r\nimport _removeSubscriber from './_removeSubscriber'\r\nimport _removeSubscriberByToken from './_removeSubscriberByToken'\r\n\r\n/**\r\n * 取消订阅主题\r\n * ========================================================================\r\n * @method off\r\n * @param {String} topic - (必须)订阅的主题\r\n * @param {Function|String} [token] - (可选)订阅主题的处理器函数或者唯一 Id 值\r\n */\r\nconst off = (topic, token) => {\r\n if (!has(topic)) {\r\n return false\r\n }\r\n\r\n if (token) {\r\n _removeSubscriberByToken(token)\r\n } else {\r\n _removeSubscriber(topic)\r\n }\r\n}\r\n\r\nexport default off\r\n","import _subscribers from './_subscribers'\r\nimport _removeSubscriber from './_removeSubscriber'\r\n\r\n/**\r\n * 通过订阅者 token 值删除订阅者信息\r\n * ========================================================================\r\n * @method _removeSubscriberByToken\r\n * @param {String} token - 订阅者 token 字符串\r\n * @returns {boolean}\r\n * @private\r\n */\r\nconst _removeSubscriberByToken = (token) => {\r\n const keys = Object.keys(_subscribers)\r\n let index = -1\r\n\r\n if (!token || keys.length < 1) {\r\n return false\r\n }\r\n\r\n keys.forEach((subject) => {\r\n const subscriber = _subscribers[subject]\r\n let topic\r\n\r\n subscriber.forEach((execution, j) => {\r\n if (execution.callback === token || execution.token === token) {\r\n topic = execution.topic\r\n subscriber.splice(index, j)\r\n }\r\n })\r\n\r\n /* istanbul ignore else */\r\n if (subscriber.length < 1) {\r\n _removeSubscriber(topic)\r\n }\r\n })\r\n}\r\n\r\nexport default _removeSubscriberByToken\r\n","import isString from './utils/types/isString'\r\n\r\nimport extend from './utils/lang/extend'\r\nimport hasOwn from './utils/lang/hasOwn'\r\n\r\nimport isObject from './utils/types/isObject'\r\n\r\nimport publish from './utils/observer/emit'\r\nimport subscribe from './utils/observer/on'\r\nimport unsubscribe from './utils/observer/off'\r\n\r\nclass Component {\r\n constructor(options) {\r\n this.attrs = {}\r\n this.name = 'component'\r\n\r\n if (options) {\r\n this.initialize(options)\r\n }\r\n }\r\n\r\n initialize(options) {\r\n this.attr(options).render().addListeners()\r\n return this\r\n }\r\n\r\n attr(prop, value) {\r\n const attrs = this.attrs\r\n\r\n if (isString(prop)) {\r\n // 只能扩展 attrs 中已有的属性\r\n if (value && hasOwn(attrs, prop)) {\r\n // 更新单个配置信息\r\n attrs[prop] = value\r\n return this\r\n }\r\n\r\n // 只传递 prop 参数,则返回对应的属性值\r\n return attrs[prop]\r\n } else if (isObject(prop)) {\r\n // 批量更新配置信息\r\n extend(attrs, prop)\r\n\r\n return this\r\n } else if (arguments.length === 0) {\r\n // 不传递参数,直接返回整个\r\n return attrs\r\n }\r\n\r\n return this\r\n }\r\n\r\n render() {\r\n return this\r\n }\r\n\r\n refresh() {\r\n return this\r\n }\r\n\r\n destroy() {\r\n this.removeListeners()\r\n return this\r\n }\r\n\r\n reload(options) {\r\n let attrs = this.attr()\r\n\r\n if (options) {\r\n attrs = this.attr(options)\r\n }\r\n\r\n this.destroy().initialize(attrs)\r\n\r\n return this\r\n }\r\n\r\n $emit(event, data) {\r\n publish(event, data)\r\n return this\r\n }\r\n\r\n $on(event, callback) {\r\n subscribe(event, callback, this)\r\n return this\r\n }\r\n\r\n $off(event, callback) {\r\n unsubscribe(event, callback)\r\n return this\r\n }\r\n\r\n addListeners() {\r\n return this\r\n }\r\n\r\n removeListeners() {\r\n return this\r\n }\r\n}\r\n\r\nexport default Component\r\n","import isFunction from '@/utils/types/isFunction'\r\nimport guid from '@/utils/lang/guid'\r\n\r\nimport _subscribers from './_subscribers'\r\n\r\n/**\r\n * 订阅主题,并给出处理器函数\r\n * ========================================================================\r\n * @method on\r\n * @param {String} topic - (必须)主题名称\r\n * @param {Function} handler - (必须)主题的处理器函数\r\n * @param {Object} [context] - (可选)指定 this 执行上下文\r\n * @return {String} - 唯一的 token 字符串,例如:'guid-1'。\r\n */\r\nconst on = (topic, handler, context = null) => {\r\n const token = guid()\r\n let subject = typeof topic === 'symbol' ? topic.toString() : topic\r\n\r\n if (!isFunction(handler)) {\r\n return ''\r\n }\r\n\r\n /* istanbul ignore else */\r\n if (!_subscribers[subject]) {\r\n _subscribers[subject] = []\r\n }\r\n\r\n _subscribers[subject].push({\r\n topic: subject,\r\n callback: handler,\r\n context,\r\n token\r\n })\r\n\r\n return token\r\n}\r\n\r\nexport default on\r\n","import isString from './isString'\r\n\r\nconst isSVG = (str) => {\r\n const declaration = '(?:<\\\\?xml[^>]*>\\\\s*)?'\r\n const doctype =\r\n '(?:<\\\\!doctype svg[^>]*\\\\s*(?:\\\\[?(?:\\\\s*]*>\\\\s*)*\\\\]?)*[^>]*>\\\\s*)?'\r\n const content = ']*>[^]*<\\\\/svg>\\\\s*$'\r\n const svg = `^\\\\s*${declaration}${doctype}${content}\\\\s*$`\r\n const pattern = new RegExp(svg, 'i')\r\n\r\n return isString(str) && pattern.test(str)\r\n}\r\n\r\nexport default isSVG\r\n","import isArray from '@/utils/types/isArray'\r\nimport isString from '@/utils/types/isString'\r\nimport isSVG from '@/utils/types/isSVG'\r\nimport setAttributes from '@/utils/dom/setAttributes'\r\n\r\n/**\r\n * 创建 SVG 图标 DOM 元素\r\n * ========================================================================\r\n * @method createElement\r\n * @param {String} name\r\n * @param {Object} [options]\r\n * @param {Number|Array} [options.size]\r\n * @param {String} [options.color]\r\n * @param {String} [options.iconSet]\r\n * @param {Object} [options.attrs]\r\n * @returns {HTMLElement}\r\n */\r\nconst createElement = (name, options = {}) => {\r\n const ICON = 'outline-icon'\r\n const size = options.size || 0\r\n const color = options.color || ''\r\n const iconSet = options.iconSet || ''\r\n const width = isArray(size) ? size[0] : size\r\n const height = isArray(size) ? size[1] : size\r\n const defaultRules = size ? `width:${width}px;height:${height}px;` : ''\r\n const cssRules = color ? defaultRules + `color:${color}` : defaultRules\r\n const attrs = options.attrs || {}\r\n const $icon = document.createElement('i')\r\n let binds = ''\r\n let svg = ''\r\n let $svg\r\n\r\n if (!isString(name)) {\r\n return null\r\n }\r\n\r\n if (isSVG(name)) {\r\n svg = name\r\n } else {\r\n binds =\r\n iconSet && iconSet !== 'icon'\r\n ? `xlink:href=\"#${iconSet}-icon-${name}\"`\r\n : `xlink:href=\"#icon-${name}\"`\r\n svg = ``\r\n }\r\n\r\n $icon.innerHTML = svg\r\n\r\n if (attrs.className) {\r\n attrs.className = `${ICON} ${attrs.className}`\r\n } else {\r\n attrs.className = ICON\r\n }\r\n\r\n setAttributes($icon, attrs)\r\n\r\n $svg = $icon.querySelector('svg')\r\n setAttributes($svg, {\r\n 'aria-hidden': true,\r\n xmlns: 'http://www.w3.org/2000/svg',\r\n class: 'outline-icon__svg',\r\n width: 200,\r\n height: 200,\r\n style: cssRules\r\n })\r\n\r\n return $icon\r\n}\r\n\r\nexport default createElement\r\n","import icon from '../../utils/icons/icon'\r\nimport createElement from '../../utils/dom/createElement'\r\nimport addClass from '../../utils/dom/addClass'\r\n\r\nconst _createButton = (button, rounded = true) => {\r\n const $icon = icon(button.icon, {\r\n iconSet: button.iconSet || 'outline',\r\n color: button.color || '',\r\n size: button.size\r\n })\r\n const $anchor = createElement(\r\n 'a',\r\n {\r\n className: `outline-toolbar__anchor`,\r\n href: button.link\r\n },\r\n $icon\r\n )\r\n const $button = createElement(\r\n 'div',\r\n {\r\n className: `outline-toolbar__button ${button.name}`,\r\n 'data-cmd': button.name\r\n },\r\n [button.link ? $anchor : $icon]\r\n )\r\n\r\n addClass($icon, 'outline-toolbar__icon')\r\n\r\n if (rounded) {\r\n addClass($button, 'outline-toolbar_rounded')\r\n }\r\n\r\n if (button.disabled) {\r\n addClass($button, 'outline-toolbar_disabled')\r\n }\r\n\r\n return $button\r\n}\r\n\r\nexport default _createButton\r\n","import createElement from './createElement'\r\n\r\n/**\r\n * 创建 SVG 图标 DOM 元素\r\n * ========================================================================\r\n * @method icon\r\n * @alias createElement\r\n * @see createElement\r\n * @param {String} name\r\n * @param {Object} [options]\r\n * @param {Number|Array} [options.size]\r\n * @param {String} [options.color]\r\n * @param {String} [options.iconSet]\r\n * @returns {HTMLElement}\r\n */\r\nconst icon = (name, options = {}) => {\r\n return createElement(name, options)\r\n}\r\n\r\nexport default icon\r\n","import isString from '@/utils/types/isString'\r\nimport isFunction from '@/utils/types/isFunction'\r\nimport isObject from '@/utils/types/isObject'\r\nimport isArray from '@/utils/types/isArray'\r\n\r\nimport later from '@/utils/lang/later'\r\nimport guid from '@/utils/lang/guid'\r\nimport cloneDeep from '@/utils/lang/cloneDeep'\r\n\r\nimport createElement from '@/utils/dom/createElement'\r\nimport addClass from '@/utils/dom/addClass'\r\nimport hasClass from '@/utils/dom/hasClass'\r\nimport removeClass from '@/utils/dom/removeClass'\r\n\r\nimport on from '@/utils/event/on'\r\nimport off from '@/utils/event/off'\r\n\r\nimport paint from '@/utils/icons/paint'\r\n\r\nimport Command from '@/command'\r\nimport Commands from '@/commands'\r\nimport Component from '@/component'\r\n\r\nimport _createButton from './utils/_createButton'\r\n\r\nimport './toolbar.less'\r\n\r\nconst DISABLED = 'outline-toolbar_disabled'\r\nconst HIDDEN = 'outline-toolbar_hidden'\r\nconst ACTIVE = 'outline-toolbar_active'\r\n\r\nclass Toolbar extends Component {\r\n constructor(options) {\r\n super()\r\n\r\n this._default()\r\n\r\n if (options) {\r\n this.initialize(options)\r\n }\r\n }\r\n\r\n _default() {\r\n this.attrs = cloneDeep(Toolbar.DEFAULTS)\r\n\r\n this.disabled = false\r\n this.closed = false\r\n\r\n this.$el = null\r\n this.buttons = []\r\n this.commands = null\r\n\r\n return this\r\n }\r\n\r\n initialize(options) {\r\n let created\r\n\r\n this.attr(options)\r\n\r\n this.disabled = this.attr('disabled')\r\n this.closed = this.attr('closed')\r\n this.commands = new Commands()\r\n\r\n created = this.attr('created')\r\n\r\n if (isFunction(created)) {\r\n created.call(this)\r\n }\r\n\r\n this.render().addListeners()\r\n\r\n return this\r\n }\r\n\r\n isHighlight(name) {\r\n const button = this.get(name)\r\n\r\n if (!button) {\r\n return false\r\n }\r\n\r\n return hasClass(button.$el, ACTIVE)\r\n }\r\n\r\n isDisabled(name) {\r\n let button\r\n\r\n if (name) {\r\n button = this.get(name)\r\n\r\n return button.disabled\r\n }\r\n\r\n return this.disabled\r\n }\r\n\r\n isExist(name) {\r\n const button = this.get(name)\r\n return !!button\r\n }\r\n\r\n isClosed() {\r\n return this.closed\r\n }\r\n\r\n _getCommand(button) {\r\n const _self = this\r\n const { action, name } = button\r\n let command = null\r\n let handler = null\r\n let context\r\n let listener\r\n\r\n if (!action) {\r\n return command\r\n }\r\n\r\n handler = action.handler\r\n context = action.context || this\r\n\r\n if (isFunction(handler)) {\r\n listener = handler\r\n } else if (isString(handler)) {\r\n listener = function () {\r\n _self.$emit(handler, name)\r\n }\r\n }\r\n\r\n if (isFunction(listener)) {\r\n command = new Command(name, listener.bind(context))\r\n }\r\n\r\n return command\r\n }\r\n\r\n get(name) {\r\n return this.buttons.find((button) => button.name === name)\r\n }\r\n\r\n render() {\r\n const mounted = this.attr('mounted')\r\n const buttons = this.attr('buttons') || []\r\n const placement = this.attr('placement')\r\n\r\n paint()\r\n\r\n this.$el = createElement('div', {\r\n id: guid('outline-toolbar'),\r\n className: `outline-toolbar outline-toolbar_${placement}`\r\n })\r\n this._paint(buttons)\r\n document.body.appendChild(this.$el)\r\n\r\n if (this.closed) {\r\n this.hide()\r\n }\r\n\r\n if (this.disabled) {\r\n this.disable()\r\n }\r\n\r\n if (isFunction(mounted)) {\r\n mounted.call(this)\r\n }\r\n\r\n return this\r\n }\r\n\r\n erase() {\r\n this.$el.innerHTML = ''\r\n return this\r\n }\r\n\r\n _paint(buttons) {\r\n const rounded = this.attr('rounded')\r\n const $fragment = document.createDocumentFragment()\r\n\r\n buttons.forEach((button) => {\r\n const $button = _createButton(button, rounded)\r\n const command = this._getCommand(button)\r\n const { name, disabled, context } = button\r\n\r\n $fragment.appendChild($button)\r\n\r\n if (!this.isExist(name)) {\r\n this.buttons.push({\r\n $el: $button,\r\n name,\r\n disabled: disabled || false,\r\n context: context || this\r\n })\r\n\r\n if (command) {\r\n this.commands.add(command)\r\n }\r\n }\r\n })\r\n\r\n this.$el.appendChild($fragment)\r\n\r\n return this\r\n }\r\n\r\n _remove() {\r\n document.body.removeChild(this.$el)\r\n return this\r\n }\r\n\r\n refresh(buttons) {\r\n this.attr({ buttons })\r\n this.erase()._paint(buttons)\r\n return this\r\n }\r\n\r\n add(button) {\r\n const $el = this.$el\r\n const $fragment = document.createDocumentFragment()\r\n const buttons = this.attr('buttons') || []\r\n const { name, disabled, context } = button\r\n const command = this._getCommand(button)\r\n const _add = (button) => {\r\n const $button = _createButton(button)\r\n\r\n $fragment.appendChild($button)\r\n\r\n buttons.push(button)\r\n this.buttons.push({\r\n $el: $button,\r\n name,\r\n disabled: disabled || false,\r\n context: context || this,\r\n command\r\n })\r\n\r\n if (command) {\r\n this.commands.add(command)\r\n }\r\n }\r\n\r\n if (isObject(button)) {\r\n _add(button)\r\n } else if (isArray(button)) {\r\n button.forEach((item) => {\r\n if (isObject(item)) {\r\n _add(item)\r\n }\r\n })\r\n }\r\n $el.appendChild($fragment)\r\n\r\n return this\r\n }\r\n\r\n remove(name) {\r\n const $el = this.$el\r\n const buttons = this.buttons\r\n const button = this.get(name)\r\n let index = -1\r\n\r\n if (!button) {\r\n return this\r\n }\r\n\r\n index = buttons.indexOf(button)\r\n\r\n if (index > -1) {\r\n buttons.splice(index, 1)\r\n this.attr('buttons').splice(index, 1)\r\n }\r\n\r\n this._disable(name)\r\n $el.removeChild(button.$el)\r\n\r\n return this\r\n }\r\n\r\n _disable(name) {\r\n const button = this.get(name)\r\n const command = this.commands.get(name)\r\n\r\n if (!button || button.disabled) {\r\n return this\r\n }\r\n\r\n button.disabled = true\r\n\r\n if (command) {\r\n this.commands.del(command)\r\n }\r\n\r\n addClass(button.$el, DISABLED)\r\n\r\n return this\r\n }\r\n\r\n _enable(name) {\r\n const button = this.get(name)\r\n const command = this.commands.get(name)\r\n\r\n if (!button || !button.disabled) {\r\n return this\r\n }\r\n\r\n button.disabled = false\r\n\r\n if (command) {\r\n this.commands.add(command)\r\n }\r\n\r\n removeClass(button.$el, DISABLED)\r\n\r\n return this\r\n }\r\n\r\n disable(name) {\r\n const disabled = this.attr('afterDisabled')\r\n\r\n if (name) {\r\n this._disable(name)\r\n } else {\r\n addClass(this.$el, DISABLED)\r\n this.removeListeners()\r\n this.disabled = true\r\n\r\n if (isFunction(disabled)) {\r\n disabled.call(this)\r\n }\r\n }\r\n\r\n return this\r\n }\r\n\r\n enable(name) {\r\n const enabled = this.attr('afterEnabled')\r\n\r\n if (name) {\r\n this._enable(name)\r\n } else {\r\n this.disabled = false\r\n removeClass(this.$el, DISABLED)\r\n this.addListeners()\r\n\r\n if (isFunction(enabled)) {\r\n enabled.call(this)\r\n }\r\n }\r\n\r\n return this\r\n }\r\n\r\n show(name) {\r\n const opened = this.attr('afterOpened')\r\n const button = this.get(name)\r\n const $el = this.$el\r\n\r\n if (name) {\r\n if (!button) {\r\n return this\r\n }\r\n\r\n removeClass(button.$el, HIDDEN)\r\n } else {\r\n removeClass($el, HIDDEN)\r\n this.closed = false\r\n\r\n if (isFunction(opened)) {\r\n later(() => {\r\n opened.call(this)\r\n }, 310)\r\n }\r\n }\r\n\r\n return this\r\n }\r\n\r\n hide(name) {\r\n const closed = this.attr('afterClosed')\r\n const button = this.get(name)\r\n const $el = this.$el\r\n\r\n if (name) {\r\n if (!button) {\r\n return this\r\n }\r\n\r\n addClass(button.$el, HIDDEN)\r\n } else {\r\n addClass($el, HIDDEN)\r\n this.closed = true\r\n\r\n if (isFunction(closed)) {\r\n later(() => {\r\n closed.call(this)\r\n }, 310)\r\n }\r\n }\r\n\r\n return this\r\n }\r\n\r\n toggle(name) {\r\n if (this.isClosed()) {\r\n this.show(name)\r\n } else {\r\n this.hide(name)\r\n }\r\n\r\n return this\r\n }\r\n\r\n highlight(name) {\r\n const button = this.get(name)\r\n let $button\r\n\r\n if (!button) {\r\n return this\r\n }\r\n\r\n $button = button.$el\r\n\r\n if (hasClass($button, ACTIVE)) {\r\n removeClass($button, ACTIVE)\r\n } else {\r\n addClass($button, ACTIVE)\r\n }\r\n\r\n return this\r\n }\r\n\r\n destroy() {\r\n const beforeDestroy = this.attr('beforeDestroy')\r\n const afterDestroy = this.attr('afterDestroy')\r\n\r\n if (isFunction(beforeDestroy)) {\r\n beforeDestroy.call(this)\r\n }\r\n\r\n this.commands.clear()\r\n this.removeListeners()._remove()._default()\r\n\r\n if (isFunction(afterDestroy)) {\r\n afterDestroy.call(this)\r\n }\r\n\r\n return this\r\n }\r\n\r\n execute(name) {\r\n if (this.isDisabled(name)) {\r\n return this\r\n }\r\n\r\n this.commands.execute(name)\r\n\r\n return this\r\n }\r\n\r\n onExecute(evt) {\r\n const $button = evt.delegateTarget\r\n let cmd = ''\r\n\r\n if ($button) {\r\n cmd = $button.getAttribute('data-cmd')\r\n\r\n if (cmd) {\r\n this.execute(cmd)\r\n }\r\n }\r\n\r\n return this\r\n }\r\n\r\n _updateToolbar({ top, min, max }) {\r\n const current = Math.ceil(top)\r\n\r\n if (current <= min) {\r\n this.hide('up')\r\n this.show('down')\r\n } else if (current >= max) {\r\n this.hide('down')\r\n this.show('up')\r\n } else if (current > min && current < max) {\r\n this.show('up')\r\n this.show('down')\r\n }\r\n\r\n return this\r\n }\r\n\r\n onToolbarUpdate({ top, min, max }) {\r\n this._updateToolbar({ top, min, max })\r\n return this\r\n }\r\n\r\n onAddButton(buttons) {\r\n this.attr({\r\n buttons\r\n })\r\n this.refresh(buttons)\r\n\r\n return this\r\n }\r\n\r\n onRemoveButton(name) {\r\n this.remove(name)\r\n return this\r\n }\r\n\r\n addListeners() {\r\n const buttons = this.attr('buttons') || []\r\n const $el = this.$el\r\n\r\n if (!buttons || buttons.length < 1) {\r\n return this\r\n }\r\n\r\n on($el, `.outline-toolbar__button`, 'click', this.onExecute, this, true)\r\n\r\n this.$on('toolbar:update', this.onToolbarUpdate)\r\n this.$on('toolbar:add:button', this.onAddButton)\r\n this.$on('toolbar:remove:button', this.onRemoveButton)\r\n this.$on('toolbar:toggle', this.toggle)\r\n\r\n return this\r\n }\r\n\r\n removeListeners() {\r\n const buttons = this.attr('buttons') || []\r\n const $el = this.$el\r\n\r\n if (!buttons || buttons.length < 1) {\r\n return this\r\n }\r\n\r\n off($el, '.outline-toolbar__button', this.onExecute)\r\n\r\n this.$off('toolbar:update')\r\n this.$off('toolbar:add:button')\r\n this.$off('toolbar:remove:button')\r\n this.$off('toolbar:toggle')\r\n\r\n return this\r\n }\r\n}\r\n\r\nToolbar.DEFAULTS = (() => {\r\n const OPTIONS = {\r\n placement: 'ltr',\r\n closed: false,\r\n disabled: false,\r\n rounded: true,\r\n buttons: [],\r\n created: null,\r\n mounted: null,\r\n afterClosed: null,\r\n afterOpened: null,\r\n afterDisabled: null,\r\n afterEnabled: null,\r\n beforeDestroy: null,\r\n afterDestroy: null\r\n }\r\n\r\n return cloneDeep(OPTIONS)\r\n})()\r\n\r\nexport default Toolbar\r\n"],"names":["isString","str","toString","val","Object","prototype","apply","isFunction","isObject","o","isArray","Array","later","fn","delay","setTimeout","guid","uuid","prefix","cloneDeep","obj","clone","from","assign","keys","forEach","key","isElement","nodeName","tagName","nodeType","isDOM","el","isHTMLCollection","fragment","isTextNode","hasOwn","prop","hasOwnProperty","call","hasClass","className","pattern","RegExp","allClass","classList","contains","exec","addClass","_classList","add","indexOf","split","name","length","setAttributes","attrs","attr","value","setAttribute","toLowerCase","style","cssText","innerHTML","innerText","createElement","children","$fragment","document","createDocumentFragment","$el","isValidChild","child","append","$child","createTextNode","appendChild","every","removeClass","remove","replace","matches","selector","sel","msMatchesSelector","getParentOrHost","host","parentNode","CAPTURE_EVENTS","_off","type","capture","_delegateListener","listeners","_listeners","index","listener","i","handler","splice","_delete","removeEventListener","purgeElement","recurse","$element","querySelector","$children","childNodes","getListeners","filter","arguments","off","on","data","context","once","evt","target","getTarget","delegateTarget","closest","ctx","includeCTX","startsWith","overrideContext","push","addEventListener","SYMBOLS","_maybeArrayLike","_toConsumableArray","getSymbols","iconSet","getSymbol","patternName","patternSet","find","symbol","fullName","paint","$body","body","$icons","symbols","join","insertBefore","firstChild","Command","constructor","action","this","execute","Commands","commands","get","cmd","command","del","clear","_subscribers","_hasDirectSubscribersFor","topic","has","isDirect","found","position","lastIndexOf","substring","_hasSubscribers","emit","async","subscriber","message","callback","deliver","_removeSubscriber","token","subject","execution","j","_removeSubscriberByToken","Component","options","initialize","render","addListeners","origin","source","extend","refresh","destroy","removeListeners","reload","$emit","event","publish","$on","subscribe","$off","unsubscribe","ICON","size","color","width","height","defaultRules","cssRules","$icon","$svg","binds","svg","test","isSVG","xmlns","class","_createButton","button","rounded","icon","$anchor","href","link","$button","disabled","DISABLED","HIDDEN","ACTIVE","Toolbar","super","_default","DEFAULTS","closed","buttons","created","isHighlight","isDisabled","isExist","isClosed","_getCommand","_self","bind","mounted","placement","id","_paint","hide","disable","erase","_remove","removeChild","_add","item","_disable","_enable","enable","enabled","show","opened","toggle","highlight","beforeDestroy","afterDestroy","onExecute","getAttribute","_updateToolbar","top","min","max","current","Math","ceil","onToolbarUpdate","onAddButton","onRemoveButton","afterClosed","afterOpened","afterDisabled","afterEnabled"],"mappings":"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"} \ No newline at end of file diff --git a/_createButton.js b/toolbar/utils/_createButton.js similarity index 83% rename from _createButton.js rename to toolbar/utils/_createButton.js index 167149ab..ea09346e 100644 --- a/_createButton.js +++ b/toolbar/utils/_createButton.js @@ -1,6 +1,6 @@ -import icon from './utils/icons/icon' -import createElement from './utils/dom/createElement' -import addClass from './utils/dom/addClass' +import icon from '../../utils/icons/icon' +import createElement from '../../utils/dom/createElement' +import addClass from '../../utils/dom/addClass' const _createButton = (button, rounded = true) => { const $icon = icon(button.icon, { diff --git a/utils/dom/getScrollElement.js b/utils/dom/getScrollElement.js new file mode 100644 index 00000000..c8d35c14 --- /dev/null +++ b/utils/dom/getScrollElement.js @@ -0,0 +1,33 @@ +import isString from '../types/isString' +import isElement from '../types/isElement' + +/** + * 通过给的 scrollElement 参数,获取滚动 DOM 元素 + * ======================================================================== + * @method getScrollElement + * @param {String|HTMLElement} scrollElement + * @returns {Element} + * @private + */ +const getScrollElement = (scrollElement = null) => { + let $rootElements + let $scrollElement + + if (!scrollElement) { + $rootElements = document.querySelectorAll('html,body') + $scrollElement = + $rootElements[0].scrollTop - $rootElements[1].scrollTop >= 0 + ? $rootElements[0] + : $rootElements[1] + } else { + if (isString(scrollElement)) { + $scrollElement = document.querySelector(scrollElement) + } else if (isElement(scrollElement)) { + $scrollElement = scrollElement + } + } + + return $scrollElement +} + +export default getScrollElement diff --git a/utils/dom/scrollTo.js b/utils/dom/scrollTo.js index b576027b..d4a31102 100644 --- a/utils/dom/scrollTo.js +++ b/utils/dom/scrollTo.js @@ -1,6 +1,6 @@ import easeInQuad from '../lang/easeInQuad' import isFunction from '../types/isFunction' -import _getScrollElement from './_getScrollElement' +import _getScrollElement from '../../navigator/utils/_getScrollElement' /** * 指定 rootElement DOM 节点滚动到指定 top 位置 @@ -32,14 +32,6 @@ const scrollTo = (scrollElement, top, afterStop) => { scrollTop -= easeInQuad(step) $scrollElement.scrollTop = scrollTop - console.log( - '$scrollElement up', - scrollElement, - $scrollElement, - scrollTop, - $scrollElement.scrollTop - ) - if (scrollTop <= top) { $scrollElement.scrollTop = top return stop(top) @@ -48,14 +40,6 @@ const scrollTo = (scrollElement, top, afterStop) => { scrollTop += easeInQuad(step) $scrollElement.scrollTop = scrollTop - console.log( - '$scrollElement down', - scrollElement, - $scrollElement, - scrollTop, - $scrollElement.scrollTop - ) - if (scrollTop >= MAX_TOP) { $scrollElement.scrollTop = MAX_TOP return stop(MAX_TOP) diff --git a/zIndex.js b/utils/dom/zIndex.js similarity index 79% rename from zIndex.js rename to utils/dom/zIndex.js index 19a9b2f2..351c600f 100644 --- a/zIndex.js +++ b/utils/dom/zIndex.js @@ -1,4 +1,4 @@ -import setProperty from './utils/dom/setProperty' +import setProperty from './setProperty' let index = 2000 diff --git a/utils/event/at.js b/utils/event/at.js index 9ed58fe6..2b2f9d35 100644 --- a/utils/event/at.js +++ b/utils/event/at.js @@ -1,4 +1,4 @@ -import isFunction from '../types/isFunction' +import isFunction from '@/utils/types/isFunction' import off from './off' import { CAPTURE_EVENTS } from './enum' diff --git a/utils/event/getListeners.js b/utils/event/getListeners.js index db3092f6..26327c96 100644 --- a/utils/event/getListeners.js +++ b/utils/event/getListeners.js @@ -1,4 +1,4 @@ -import isString from '../types/isString' +import isString from '@/utils/types/isString' /** * 获取 DOM 元素(type 事件类型)事件绑定信息 diff --git a/utils/event/getTarget.js b/utils/event/getTarget.js index b5d856b7..a5b244e0 100644 --- a/utils/event/getTarget.js +++ b/utils/event/getTarget.js @@ -1,4 +1,4 @@ -import resolveTextNode from '../dom/resolveTextNode' +import resolveTextNode from '@/utils/dom/resolveTextNode' /** * 返回触发事件的 target DOM 元素 diff --git a/utils/event/on.js b/utils/event/on.js index 01b6b208..5e22f920 100644 --- a/utils/event/on.js +++ b/utils/event/on.js @@ -1,4 +1,4 @@ -import closest from '../dom/closest' +import closest from '@/utils/dom/closest' import off from './off' import getTarget from './getTarget' diff --git a/utils/event/purgeElement.js b/utils/event/purgeElement.js index 68f28956..4d91ebd2 100644 --- a/utils/event/purgeElement.js +++ b/utils/event/purgeElement.js @@ -1,5 +1,5 @@ -import isString from '../types/isString' -import isElement from '../types/isElement' +import isString from '@/utils/types/isString' +import isElement from '@/utils/types/isElement' import getListeners from './getListeners' import _off from './_off' diff --git a/utils/icons/add.js b/utils/icons/add.js index dd760e8e..a57bc4e5 100644 --- a/utils/icons/add.js +++ b/utils/icons/add.js @@ -1,5 +1,5 @@ -import isArray from '../types/isArray' -import isString from '../types/isString' +import isArray from '@/utils/types/isArray' +import isString from '@/utils/types/isString' import SYMBOLS from './symbols' /** diff --git a/utils/icons/createElement.js b/utils/icons/createElement.js index 485978eb..25e12ee0 100644 --- a/utils/icons/createElement.js +++ b/utils/icons/createElement.js @@ -1,7 +1,7 @@ -import isArray from '../types/isArray' -import isString from '../types/isString' -import isSVG from '../types/isSVG' -import setAttributes from '../dom/setAttributes' +import isArray from '@/utils/types/isArray' +import isString from '@/utils/types/isString' +import isSVG from '@/utils/types/isSVG' +import setAttributes from '@/utils/dom/setAttributes' /** * 创建 SVG 图标 DOM 元素 diff --git a/utils/icons/getSymbols.js b/utils/icons/getSymbols.js index b2b81dde..bcf2eefa 100644 --- a/utils/icons/getSymbols.js +++ b/utils/icons/getSymbols.js @@ -1,4 +1,4 @@ -import isString from '../types/isString' +import isString from '@/utils/types/isString' import getSymbol from './getSymbol' import SYMBOLS from './symbols' diff --git a/utils/icons/remove.js b/utils/icons/remove.js index 75061dfe..2c90011b 100644 --- a/utils/icons/remove.js +++ b/utils/icons/remove.js @@ -1,4 +1,4 @@ -import isString from '../types/isString' +import isString from '@/utils/types/isString' import getSymbol from './getSymbol' import getSymbols from './getSymbols' import SYMBOLS from './symbols' diff --git a/utils/lang/cloneDeep.js b/utils/lang/cloneDeep.js index 150fcbdc..46c61484 100644 --- a/utils/lang/cloneDeep.js +++ b/utils/lang/cloneDeep.js @@ -1,5 +1,5 @@ -import isObject from '../types/isObject' -import isArray from '../types/isArray' +import isObject from '@/utils/types/isObject' +import isArray from '@/utils/types/isArray' /** * 深拷贝对象函数 diff --git a/utils/lang/later.js b/utils/lang/later.js index 373f3740..6dc54ac2 100644 --- a/utils/lang/later.js +++ b/utils/lang/later.js @@ -1,4 +1,4 @@ -import isFunction from '../types/isFunction' +import isFunction from '@/utils/types/isFunction' /** * later - 延迟执行方法 diff --git a/utils/lang/stripTags.js b/utils/lang/stripTags.js index e751a9aa..9095c3be 100644 --- a/utils/lang/stripTags.js +++ b/utils/lang/stripTags.js @@ -1,4 +1,4 @@ -import isString from '../types/isString' +import isString from '@/utils/types/isString' /** * 过滤所有 HTML 标签 diff --git a/utils/lang/timeSlice.js b/utils/lang/timeSlice.js index 2c4dbabd..3ca156e5 100644 --- a/utils/lang/timeSlice.js +++ b/utils/lang/timeSlice.js @@ -4,7 +4,7 @@ * Created By: Yaohaixiao * Update: 2023.09.04 */ -import isFunction from '../types/isFunction' +import isFunction from '@/utils/types/isFunction' import later from './later' const queue = [] diff --git a/utils/lang/trim.js b/utils/lang/trim.js index d679c79d..4a57a1d7 100644 --- a/utils/lang/trim.js +++ b/utils/lang/trim.js @@ -1,4 +1,4 @@ -import isString from '../types/isString' +import isString from '@/utils/types/isString' /** * 清楚字符串起始位置所有的空格 diff --git a/utils/observer/_hasDirectSubscribersFor.js b/utils/observer/_hasDirectSubscribersFor.js index 2fddaf68..fdd8e722 100644 --- a/utils/observer/_hasDirectSubscribersFor.js +++ b/utils/observer/_hasDirectSubscribersFor.js @@ -1,5 +1,5 @@ +import hasOwn from '@/utils/lang/hasOwn' import _subscribers from './_subscribers' -import hasOwn from '../lang/hasOwn' /** * 判断是否存在与给定 topic 完全匹配的订阅者信息 diff --git a/utils/observer/_removeSubscriber.js b/utils/observer/_removeSubscriber.js index 9f3b0b99..45df8ee8 100644 --- a/utils/observer/_removeSubscriber.js +++ b/utils/observer/_removeSubscriber.js @@ -1,5 +1,5 @@ +import hasOwn from '@/utils/lang/hasOwn' import _subscribers from './_subscribers' -import hasOwn from '../lang/hasOwn' /** * 删除与给定 topic 相同的订阅者信息 diff --git a/utils/observer/emit.js b/utils/observer/emit.js index e2bbd043..138be3c6 100644 --- a/utils/observer/emit.js +++ b/utils/observer/emit.js @@ -1,7 +1,7 @@ -import isTypedArray from '../types/isTypedArray' -import _subscribers from './_subscribers' +import isTypedArray from '@/utils/types/isTypedArray' import has from './has' import _hasDirectSubscribersFor from './_hasDirectSubscribersFor' +import _subscribers from './_subscribers' /** * (异步)发布订阅主题信息 diff --git a/utils/observer/on.js b/utils/observer/on.js index b9d46757..9c972940 100644 --- a/utils/observer/on.js +++ b/utils/observer/on.js @@ -1,6 +1,7 @@ +import isFunction from '@/utils/types/isFunction' +import guid from '@/utils/lang/guid' + import _subscribers from './_subscribers' -import isFunction from '../types/isFunction' -import guid from '../lang/guid' /** * 订阅主题,并给出处理器函数 diff --git a/utils/types/isArray.js b/utils/types/isArray.js index 9f2a4937..7ffd6614 100644 --- a/utils/types/isArray.js +++ b/utils/types/isArray.js @@ -1,4 +1,4 @@ -import toString from '../lang/toString' +import toString from '@/utils/lang/toString' /** * 检测数据是否为 Array 类型 diff --git a/utils/types/isFragment.js b/utils/types/isFragment.js index dc69c650..8044c896 100644 --- a/utils/types/isFragment.js +++ b/utils/types/isFragment.js @@ -1,4 +1,4 @@ -import toString from '../lang/toString' +import toString from '@/utils/lang/toString' import isObject from './isObject' const isFragment = (fragment) => { diff --git a/utils/types/isFunction.js b/utils/types/isFunction.js index 3bc8d9d5..81f6484d 100644 --- a/utils/types/isFunction.js +++ b/utils/types/isFunction.js @@ -1,4 +1,4 @@ -import toString from '../lang/toString' +import toString from '@/utils/lang/toString' /** * 检测测试数据是否为 Function 类型 diff --git a/utils/types/isHTML.js b/utils/types/isHTML.js index 0726d789..5be07638 100644 --- a/utils/types/isHTML.js +++ b/utils/types/isHTML.js @@ -1,5 +1,5 @@ +import trim from '@/utils/lang/trim' import isString from './isString' -import trim from '../lang/trim' import TAGS from './tags' /** diff --git a/utils/types/isHTMLCollection.js b/utils/types/isHTMLCollection.js index 0edd7031..d3ef64e1 100644 --- a/utils/types/isHTMLCollection.js +++ b/utils/types/isHTMLCollection.js @@ -1,4 +1,4 @@ -import toString from '../lang/toString' +import toString from '@/utils/lang/toString' import isObject from './isObject' const isHTMLCollection = (el) => { diff --git a/utils/types/isTextNode.js b/utils/types/isTextNode.js index 0188b5e8..bcdfb594 100644 --- a/utils/types/isTextNode.js +++ b/utils/types/isTextNode.js @@ -1,4 +1,4 @@ -import toString from '../lang/toString' +import toString from '@/utils/lang/toString' import isObject from './isObject' const isTextNode = (el) => { diff --git a/utils/types/isTypedArray.js b/utils/types/isTypedArray.js index 2bda3af3..d721c3df 100644 --- a/utils/types/isTypedArray.js +++ b/utils/types/isTypedArray.js @@ -1,4 +1,4 @@ -import toString from '../lang/toString' +import toString from '@/utils/lang/toString' /** * 判断检测数据是否为 Typed Arrays 类型的数据 * ========================================================================